diff --git a/DATABASE_DESIGN.md b/DATABASE_DESIGN.md new file mode 100644 index 0000000..8c23921 --- /dev/null +++ b/DATABASE_DESIGN.md @@ -0,0 +1,280 @@ +# iShare (AiShare) 数据库设计文档 + +> 模块: `as-app-server` — iShare 项目新增的核心业务模块(pigx-5.2 原版中不存在) +> +> 生成日期: 2026-02-16 + +--- + +## 一、数据库表清单 + +### 1. 核心业务表(as_* — iShare 新增) + +| 表名 | 用途 | +|------|------| +| `as_platform` | 流媒体平台(Netflix、Spotify 等) | +| `as_platform_type` | 平台分类(视频、音乐等) | +| `as_sub_plan` | 订阅计划(如 Netflix 标准版、高级版) | +| `as_sub_payroll` | 付费方案(月付/季付/年付 + 价格) | +| `as_sub_account` | 订阅账号(实际的平台登录凭据) | +| `as_sub_product` | 订阅产品(面向用户的合租商品) | +| `as_sub_product_comment` | 产品评价 | +| `as_user_sub` | 用户订阅关系(用户参与的合租) | + +### 2. App 基础表(app_* — 来自 pigx-app 模板,SQL 中有建表语句) + +| 表名 | 用途 | +|------|------| +| `app_user` | App 用户 | +| `app_role` | App 角色 | +| `app_user_role` | 用户-角色关联 | +| `app_social_details` | 社交登录配置(微信小程序等) | +| `app_article` | 文章资讯 | +| `app_article_category` | 文章分类 | +| `app_article_collect` | 文章收藏 | +| `app_page` | 页面装修(首页/个人中心 JSON 配置) | +| `app_tabbar` | 底部导航栏 | + +--- + +## 二、核心业务表详细结构 + +### 2.1 `as_platform` — 流媒体平台 + +| 字段 | 类型 | 说明 | +|------|------|------| +| `id` | bigint (PK, ASSIGN_ID) | 主键 | +| `platform_name` | varchar | 平台名称 | +| `platform_type` | int | 平台类型(关联 as_platform_type),0=全部 | +| `icon` | varchar | 应用图标 URL | +| `company` | varchar | 所属公司 | +| `website` | varchar | 平台官网 | +| `sort_order` | varchar | 排序 | +| `product_code` | varchar | 产品编码(格式: 类型_名称_id) | + +### 2.2 `as_platform_type` — 平台类型 + +| 字段 | 类型 | 说明 | +|------|------|------| +| `id` | bigint (PK, ASSIGN_ID) | 主键 | +| `name` | varchar | 类型名称(如:视频、音乐、AI) | +| `platform_type` | int | 类型编号,0=全部 | +| `sort_order` | varchar | 排序 | + +### 2.3 `as_sub_plan` — 订阅计划 + +| 字段 | 类型 | 说明 | +|------|------|------| +| `id` | bigint (PK, ASSIGN_ID) | 计划 ID | +| `name` | varchar | 计划名称(如:标准版、高级版) | +| `platform_id` | varchar | 所属平台 ID | +| `capacity` | varchar | 用户容量(可共享席位数) | +| `remark` | varchar | 备注 | +| `sort_order` | varchar | 排序 | + +### 2.4 `as_sub_payroll` — 付费方案 + +| 字段 | 类型 | 说明 | +|------|------|------| +| `id` | bigint (PK, ASSIGN_ID) | 主键 | +| `sub_plans` | bigint | 关联的订阅计划 ID | +| `platform_id` | int | 平台 ID | +| `payroll` | int | 付费周期:1=月付, 2=季付, 3=年付 | +| `price` | decimal | 价格 | +| `currency` | varchar | 货币(CNY/USD 等) | +| `region` | varchar | 地区 | +| `product_code` | varchar | 产品编码 | + +### 2.5 `as_sub_account` — 订阅账号 + +| 字段 | 类型 | 说明 | +|------|------|------| +| `id` | bigint (PK, ASSIGN_ID) | 主键 | +| `product_id` | bigint | 关联产品 ID | +| `sub_plan_id` | int | 订阅计划 ID | +| `user_id` | int | 账号持有者(主用户) | +| `sub_payroll_id` | int | 付费方案 ID | +| `region` | varchar | 地区 | +| `share_type` | int | 分享类型 | +| `account_type` | int | 账号类型 | +| `renew_date` | datetime | 续费日期 | +| `platform_id` | int | 平台 ID | +| `account_name` | varchar | 平台登录用户名 | +| `account_passwd` | varchar | 平台登录密码 | +| `passwd_salt` | int | 密码盐值 | + +### 2.6 `as_sub_product` — 订阅产品(合租商品) + +| 字段 | 类型 | 说明 | +|------|------|------| +| `id` | bigint (PK, ASSIGN_ID) | 主键 | +| `star` | int | 综合评分 | +| `title` | varchar | 产品标题 | +| `description` | varchar | 描述 | +| `tags` | varchar | 标签(逗号分隔) | +| `sub_plan_ids` | varchar | 关联的订阅计划 ID 列表 | +| `amount` | decimal | 总价 | +| `user_id` | bigint | 发布者用户 ID | +| `product_type` | bigint | 产品类型:1=自营, 2=个人 | +| `create_time` | datetime | 创建时间 | +| `update_time` | datetime | 更新时间 | +| `product_code` | varchar | 产品编码(类型_名称_id) | +| `sub_type` | bigint | 订阅类型:1=单品, 2=多品(组合) | + +### 2.7 `as_sub_product_comment` — 产品评价 + +> 注: 实体类 `@TableName` 误标为 `as_sub_product`,实际应为 `as_sub_product_comment` + +| 字段 | 类型 | 说明 | +|------|------|------| +| `id` | bigint (PK, ASSIGN_ID) | 主键 | +| `star` | int | 评分 | +| `comment` | varchar | 评价内容 | +| `user_id` | bigint | 评价用户 | +| `product_id` | bigint | 关联产品 ID | +| `create_time` | datetime | 创建时间 | +| `update_time` | datetime | 更新时间 | + +### 2.8 `as_user_sub` — 用户订阅关系 + +| 字段 | 类型 | 说明 | +|------|------|------| +| `id` | bigint (PK, ASSIGN_ID) | 主键 | +| `platform_id` | int | 平台 ID | +| `capacity` | int | 总容量(席位数) | +| `capacity_loaded` | int | 已占用容量 | +| `plan_id` | int | 订阅计划 ID | +| `user_id` | int | 用户 ID | +| `main_account` | int | 主账号 ID(关联 as_sub_account) | +| `region` | varchar | 地区 | +| `target_ip` | varchar | 目标 IP(用于区域限制) | +| `remark` | int | 备注 | + +--- + +## 三、App 基础表详细结构 + +### 3.1 `app_user` — App 用户 + +| 字段 | 类型 | 约束 | 说明 | +|------|------|------|------| +| `user_id` | bigint | PK | 用户 ID | +| `username` | varchar(255) | | 用户名 | +| `password` | varchar(255) | | 密码(BCrypt) | +| `salt` | varchar(255) | | 盐值 | +| `phone` | varchar(20) | | 手机号 | +| `avatar` | varchar(255) | | 头像 | +| `nickname` | varchar(64) | | 昵称 | +| `name` | varchar(64) | | 姓名 | +| `email` | varchar(128) | | 邮箱 | +| `wx_openid` | varchar(32) | | 微信 OpenID | +| `lock_flag` | char(1) | 默认 '0' | 锁定状态 | +| `del_flag` | char(1) | 默认 '0' | 删除标志 | +| `tenant_id` | bigint | NOT NULL | 租户 ID | +| `create_by/update_by` | varchar(64) | | 操作人 | +| `create_time/update_time` | datetime | | 时间戳 | +| `last_modified_time` | datetime | | 最后密码修改时间 | + +### 3.2 `app_role` — 角色表 + +| 字段 | 类型 | 说明 | +|------|------|------| +| `role_id` | bigint (PK) | 角色 ID | +| `role_name` | varchar(64) | 角色名 | +| `role_code` | varchar(64) | 角色编码(如 APP_USER) | +| `role_desc` | varchar(255) | 描述 | +| `tenant_id` | bigint | 租户 ID | + +### 3.3 `app_user_role` — 用户角色关联 + +| 字段 | 类型 | 说明 | +|------|------|------| +| `user_id` | bigint (PK) | 用户 ID | +| `role_id` | bigint (PK) | 角色 ID | + +### 3.4 其他 App 表 + +- **`app_social_details`**: 社交登录配置(type/app_id/app_secret/redirect_url) +- **`app_article`**: 文章(title/intro/content/author/visit/sort/cid→分类) +- **`app_article_category`**: 文章分类(name/sort/is_show) +- **`app_article_collect`**: 文章收藏(user_id/article_id) +- **`app_page`**: 页面装修(page_type/page_name/page_data JSON) +- **`app_tabbar`**: 底部导航(name/selected/unselected 图标/link JSON) + +所有 app_* 表均包含 `del_flag`, `create_by`, `update_by`, `create_time`, `update_time`, `tenant_id` 公共字段。 + +--- + +## 四、ER 关系 + +``` +as_platform_type (1) ──< (N) as_platform [platform_type] +as_platform (1) ──< (N) as_sub_plan [platform_id] +as_sub_plan (1) ──< (N) as_sub_payroll [sub_plans] +as_sub_plan (N) >──< (N) as_sub_product [sub_plan_ids, 逗号分隔] +as_sub_product (1) ──< (N) as_sub_product_comment [product_id] +as_sub_product (1) ──< (N) as_sub_account [product_id] +as_sub_plan (1) ──< (N) as_sub_account [sub_plan_id] +as_sub_payroll (1) ──< (N) as_sub_account [sub_payroll_id] +as_sub_plan (1) ──< (N) as_user_sub [plan_id] +as_sub_account (1) ──< (N) as_user_sub [main_account] + +app_user (1) ──< (N) as_sub_product [user_id — 产品发布者] +app_user (1) ──< (N) as_sub_account [user_id — 账号持有者] +app_user (1) ──< (N) as_user_sub [user_id — 订阅参与者] +app_user (1) ──< (N) as_sub_product_comment [user_id] + +app_user (N) >──< (N) app_role [通过 app_user_role] +app_article_category (1) ──< (N) app_article [cid] +app_user (1) ──< (N) app_article_collect [user_id] +app_article (1) ──< (N) app_article_collect [article_id] +``` + +--- + +## 五、核心业务模型总结 + +iShare 是一个 **流媒体账号合租平台**,核心业务流程: + +``` +平台类型 (as_platform_type) + └── 平台 (as_platform): Netflix, Spotify, ChatGPT... + └── 订阅计划 (as_sub_plan): 标准版、高级版(含容量/席位数) + └── 付费方案 (as_sub_payroll): 月/季/年付 + 价格 + └── 订阅账号 (as_sub_account): 实际登录凭据 + +订阅产品 (as_sub_product): 面向用户的合租商品 + ├── 关联多个订阅计划 (sub_plan_ids) + ├── 产品类型: 自营(1) / 个人(2) + ├── 订阅类型: 单品(1) / 多品组合(2) + └── 产品评价 (as_sub_product_comment) + +用户订阅 (as_user_sub): 用户参与合租 + ├── 关联平台、计划、主账号 + └── 容量管理 (capacity / capacity_loaded) +``` + +### 关键业务概念 + +1. **平台 (Platform)**: 流媒体服务商,按类型分类 +2. **订阅计划 (SubPlan)**: 平台的会员等级,定义席位容量 +3. **付费方案 (SubPayroll)**: 计划的定价策略(支持多地区多货币) +4. **订阅账号 (SubAccount)**: 实际的平台账号密码,由主用户持有 +5. **订阅产品 (SubProduct)**: 合租商品,可组合多个计划,支持自营/个人发布 +6. **用户订阅 (UserSub)**: 用户加入合租的记录,跟踪席位占用 +7. **产品评价 (SubProductComment)**: 用户对合租产品的评分和评论 + +### 代码注意事项 + +⚠️ `AsSubProductComment` 实体类的 `@TableName("as_sub_product")` 可能是 bug,应为 `as_sub_product_comment`。 + +--- + +## 六、SQL 建表语句 + +核心业务表(as_*)**没有在 SQL 脚本中找到建表语句**,仅在 Java 实体类中定义。这些表可能通过以下方式创建: +- MyBatis-Plus 自动建表 +- 手动在数据库中创建 +- 尚未提交的 migration 脚本 + +App 基础表的完整建表语句见: `db/999pigxx_app.sql` diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..2bee4c1 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ + Copyright (c) 2018-2025, lengleng All rights reserved. + +协议和授权 +pigX并非一个开源软件,作者保留全部的权利。 +擅自窃用,即属严重侵权行为,与盗窃无异。产生的一切任何后果责任由侵权者自负。 + + + +🌹权益 +个人学习、毕设 + + +🚫禁止 +将本项目的部分或全部代码和资源进行任何形式的再发行(尤其上传GitHub、Gitee ) +利用本项目的部分或全部代码和资源进行任何商业行为 + +免责声明 + +PigX 未对任何组织、团队,书面授权商业使用。如若出现任何商业后果、纠纷和本人无关,特此声明 + + Author: lengleng (wangiegie@gmail.com) diff --git a/as-app-server/as-app-server-api/pom.xml b/as-app-server/as-app-server-api/pom.xml new file mode 100644 index 0000000..2df6273 --- /dev/null +++ b/as-app-server/as-app-server-api/pom.xml @@ -0,0 +1,37 @@ + + + 4.0.0 + + com.pig4cloud + as-app-server + 5.2.0 + + + as-app-server-api + + + + + com.pig4cloud + pigx-common-core + + + + com.baomidou + mybatis-plus-extension + + + + com.pig4cloud + pigx-common-feign + + + + com.pig4cloud + pigx-common-excel + + + diff --git a/as-app-server/as-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/dto/AppUserDTO.java b/as-app-server/as-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/dto/AppUserDTO.java new file mode 100644 index 0000000..7e6c413 --- /dev/null +++ b/as-app-server/as-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/dto/AppUserDTO.java @@ -0,0 +1,30 @@ +package com.pig4cloud.pigx.app.api.dto; + +import com.pig4cloud.pigx.app.api.entity.AppUser; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.List; + +@Data +@Schema(description = "APP用户传输对象") +@EqualsAndHashCode(callSuper = true) +public class AppUserDTO extends AppUser { + + /** + * 角色ID + */ + @Schema(description = "角色id集合") + private List role; + + /** + * 新密码 + */ + @Schema(description = "新密码") + private String newpassword1; + + @Schema(description = "验证码") + private String mobileCode; + +} diff --git a/as-app-server/as-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/dto/AppUserInfo.java b/as-app-server/as-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/dto/AppUserInfo.java new file mode 100644 index 0000000..f98a732 --- /dev/null +++ b/as-app-server/as-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/dto/AppUserInfo.java @@ -0,0 +1,54 @@ +/* + * + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + * + */ + +package com.pig4cloud.pigx.app.api.dto; + +import com.pig4cloud.pigx.app.api.entity.AppUser; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serializable; + +/** + * @author lengleng + * @date 2017/11/11 + */ +@Data +@Schema(description = "用户信息") +public class AppUserInfo implements Serializable { + + /** + * 用户基本信息 + */ + @Schema(description = "用户基本信息") + private AppUser appUser; + + /** + * 权限标识集合 + */ + @Schema(description = "权限标识集合") + private String[] permissions; + + /** + * 角色集合 + */ + @Schema(description = "角色标识集合") + private Long[] roles; + +} diff --git a/as-app-server/as-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/dto/AppUserInfoDto.java b/as-app-server/as-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/dto/AppUserInfoDto.java new file mode 100644 index 0000000..5f297fd --- /dev/null +++ b/as-app-server/as-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/dto/AppUserInfoDto.java @@ -0,0 +1,62 @@ +package com.pig4cloud.pigx.app.api.dto; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serializable; + +/** + * @author ami + * @date 2023/10 + */ +@Data +public class AppUserInfoDto implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 用户id + */ + @TableId(type = IdType.ASSIGN_ID) + @Schema(description = "userId") + private Long userId; + + /** + * 用户名 + */ + @Schema(description = "用户名") + private String username; + + /** + * 手机号 -> 加密&模糊梳理 + */ +// @Schema(description = "手机号") +// private String phone; + + /** + * 头像 + */ + @Schema(description = "头像") + private String avatar; + + /** + * 昵称 + */ + @Schema(description = "拓展字段:昵称") + private String nickname; + + /** + * 邮箱 -> 加密&模糊梳理 + */ + @Schema(description = "拓展字段:邮箱") + private String email; + + /** + * 所属租户 + */ +// @Schema(description = "所属租户", hidden = true) +// private Long tenantId; + +} diff --git a/as-app-server/as-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/dto/AsInitDTO.java b/as-app-server/as-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/dto/AsInitDTO.java new file mode 100644 index 0000000..19d8013 --- /dev/null +++ b/as-app-server/as-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/dto/AsInitDTO.java @@ -0,0 +1,31 @@ +package com.pig4cloud.pigx.app.api.dto; + +import com.pig4cloud.pigx.app.api.entity.as.AsSubProduct; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.List; + +@Data +@Schema(description = "网站首页数据传输对象") +public class AsInitDTO { + private static final long serialVersionUID = 1L; + + + + //合租产品信息 + //title price desc icon orderType/自营/个人 + + private List products; + private List orders; + + + //合租订单展示 + //title desc price + //用户评价 + //用户名 头像 使用时常(上车时间) 评论时间 评分? + + //最近订单?ws推送 + + +} diff --git a/as-app-server/as-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/dto/AsUserSubDTO.java b/as-app-server/as-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/dto/AsUserSubDTO.java new file mode 100644 index 0000000..d8566ea --- /dev/null +++ b/as-app-server/as-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/dto/AsUserSubDTO.java @@ -0,0 +1,33 @@ +package com.pig4cloud.pigx.app.api.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +@Data +@Schema(description = "订阅统计数据传输对象") +public class AsUserSubDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 订阅数量 + */ + private Integer subCount; + /** + * 平台id + */ + private Integer platformId; + /** + * 平台名称 + */ + private String platformName; + private String subPrice; + private String title; + private List comments;//object + private List realTimeOrders;//object + private String remark; + +} diff --git a/as-app-server/as-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/dto/RealTimeOrder.java b/as-app-server/as-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/dto/RealTimeOrder.java new file mode 100644 index 0000000..3da1831 --- /dev/null +++ b/as-app-server/as-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/dto/RealTimeOrder.java @@ -0,0 +1,18 @@ +package com.pig4cloud.pigx.app.api.dto; + +/** + * 首页实时订单 + */ +public class RealTimeOrder { + + //order time + + //platform id + + //subtype id + + //user id + + //avatar + +} diff --git a/as-app-server/as-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/dto/SubComment.java b/as-app-server/as-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/dto/SubComment.java new file mode 100644 index 0000000..fb101a9 --- /dev/null +++ b/as-app-server/as-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/dto/SubComment.java @@ -0,0 +1,18 @@ +package com.pig4cloud.pigx.app.api.dto; + +/** + * 订阅评价 + */ +public class SubComment { + + //comment time + + //comment + + //id + + //avatar + + //name + +} diff --git a/as-app-server/as-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/dto/SubOrderDTO.java b/as-app-server/as-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/dto/SubOrderDTO.java new file mode 100644 index 0000000..5de68cd --- /dev/null +++ b/as-app-server/as-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/dto/SubOrderDTO.java @@ -0,0 +1,21 @@ +package com.pig4cloud.pigx.app.api.dto; + +/** + * 订阅订单DTO + */ +public class SubOrderDTO { + + //order time + + //platform id + + //subtype id + + //user id + + //avatar + + //comment + + //star +} diff --git a/as-app-server/as-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/dto/SubProductDTO.java b/as-app-server/as-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/dto/SubProductDTO.java new file mode 100644 index 0000000..fd28073 --- /dev/null +++ b/as-app-server/as-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/dto/SubProductDTO.java @@ -0,0 +1,8 @@ +package com.pig4cloud.pigx.app.api.dto; + +/** + * 订阅产品DTO + */ +public class SubProductDTO { + +} diff --git a/as-app-server/as-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/entity/AppArticleCategoryEntity.java b/as-app-server/as-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/entity/AppArticleCategoryEntity.java new file mode 100644 index 0000000..6e7d4ac --- /dev/null +++ b/as-app-server/as-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/entity/AppArticleCategoryEntity.java @@ -0,0 +1,84 @@ +package com.pig4cloud.pigx.app.api.entity; + +import com.baomidou.mybatisplus.annotation.*; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.time.LocalDateTime; + +/** + * 文章分类表 + * + * @author pig + * @date 2023-06-07 16:28:03 + */ +@Data +@TableName("app_article_category") +@EqualsAndHashCode(callSuper = true) +@Schema(description = "文章分类表") +public class AppArticleCategoryEntity extends Model { + + /** + * 主键 + */ + @TableId(type = IdType.ASSIGN_ID) + @Schema(description = "主键") + private Long id; + + /** + * 名称 + */ + @Schema(description = "名称") + private String name; + + /** + * 排序 + */ + @Schema(description = "排序") + private Integer sort; + + /** + * 是否显示: 0=否, 1=是 + */ + @Schema(description = "是否显示: 0=否, 1=是") + private Integer isShow; + + /** + * 创建人 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description = "创建人") + private String createBy; + + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description = "创建时间") + private LocalDateTime createTime; + + /** + * 更新人 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + @Schema(description = "更新人") + private String updateBy; + + /** + * 更新时间 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + @Schema(description = "更新时间") + private LocalDateTime updateTime; + + /** + * 是否删除: 0=否, 1=是 + */ + @TableLogic + @TableField(fill = FieldFill.INSERT) + @Schema(description = "是否删除: 0=否, 1=是") + private String delFlag; + +} diff --git a/as-app-server/as-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/entity/AppArticleCollectEntity.java b/as-app-server/as-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/entity/AppArticleCollectEntity.java new file mode 100644 index 0000000..d801f5b --- /dev/null +++ b/as-app-server/as-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/entity/AppArticleCollectEntity.java @@ -0,0 +1,84 @@ +package com.pig4cloud.pigx.app.api.entity; + +import com.baomidou.mybatisplus.annotation.*; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.time.LocalDateTime; + +/** + * 文章收藏表 + * + * @author pig + * @date 2023-06-16 14:33:41 + */ +@Data +@TableName("app_article_collect") +@EqualsAndHashCode(callSuper = true) +@Schema(description = "文章收藏表") +public class AppArticleCollectEntity extends Model { + + /** + * 主键 + */ + @TableId(type = IdType.ASSIGN_ID) + @Schema(description = "主键") + private Long id; + + /** + * 用户ID + */ + @Schema(description = "用户ID") + private Long userId; + + /** + * 文章ID + */ + @Schema(description = "文章ID") + private Long articleId; + + /** + * 文章标题 + */ + @TableField(exist = false) + private String title; + + /** + * 创建人 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description = "创建人") + private String createBy; + + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description = "创建时间") + private LocalDateTime createTime; + + /** + * 更新人 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + @Schema(description = "更新人") + private String updateBy; + + /** + * 更新时间 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + @Schema(description = "更新时间") + private LocalDateTime updateTime; + + /** + * 是否删除 + */ + @TableLogic + @TableField(fill = FieldFill.INSERT) + @Schema(description = "是否删除") + private String delFlag; + +} diff --git a/as-app-server/as-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/entity/AppArticleEntity.java b/as-app-server/as-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/entity/AppArticleEntity.java new file mode 100644 index 0000000..8c42294 --- /dev/null +++ b/as-app-server/as-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/entity/AppArticleEntity.java @@ -0,0 +1,134 @@ +package com.pig4cloud.pigx.app.api.entity; + +import com.baomidou.mybatisplus.annotation.*; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.FieldNameConstants; + +import java.time.LocalDateTime; + +/** + * 文章资讯 + * + * @author pig + * @date 2023-06-07 16:32:35 + */ +@Data +@FieldNameConstants +@TableName("app_article") +@EqualsAndHashCode(callSuper = true) +@Schema(description = "文章资讯") +public class AppArticleEntity extends Model { + + /** + * 主键 + */ + @TableId(type = IdType.ASSIGN_ID) + @Schema(description = "主键") + private Long id; + + /** + * 分类 + */ + @Schema(description = "分类") + private Long cid; + + /** + * 标题 + */ + @Schema(description = "标题") + private String title; + + /** + * 简介 + */ + @Schema(description = "简介") + private String intro; + + /** + * 摘要 + */ + @Schema(description = "摘要") + private String summary; + + /** + * 封面 + */ + @Schema(description = "封面") + private String image; + + /** + * 内容 + */ + @Schema(description = "内容") + private String content; + + /** + * 作者 + */ + @Schema(description = "作者") + private String author; + + /** + * 浏览 + */ + @Schema(description = "浏览") + private Integer visit; + + /** + * 排序 + */ + @Schema(description = "排序") + private Integer sort; + + /** + * 创建人 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description = "创建人") + private String createBy; + + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description = "创建时间") + private LocalDateTime createTime; + + /** + * 更新人 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + @Schema(description = "更新人") + private String updateBy; + + /** + * 更新时间 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + @Schema(description = "更新时间") + private LocalDateTime updateTime; + + /** + * 删除时间 + */ + @TableLogic + @TableField(fill = FieldFill.INSERT) + @Schema(description = "删除标志") + private String delFlag; + + /** + * 当前用户是否已收藏 + */ + @TableField(exist = false) + private boolean collect; + + /** + * 分类名称 + */ + @TableField(exist = false) + private String cname; + +} diff --git a/as-app-server/as-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/entity/AppPageEntity.java b/as-app-server/as-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/entity/AppPageEntity.java new file mode 100644 index 0000000..2cdd024 --- /dev/null +++ b/as-app-server/as-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/entity/AppPageEntity.java @@ -0,0 +1,83 @@ +package com.pig4cloud.pigx.app.api.entity; + +import com.baomidou.mybatisplus.annotation.*; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.time.LocalDateTime; + +/** + * 页面 + * + * @author lengleng + * @date 2023-06-08 11:19:23 + */ +@Data +@TableName("app_page") +@EqualsAndHashCode(callSuper = true) +@Schema(description = "页面") +public class AppPageEntity extends Model { + + /** + * 主键 + */ + @TableId(type = IdType.ASSIGN_ID) + @Schema(description = "主键") + private Long id; + + /** + * 页面类型 + */ + @Schema(description = "页面类型") + private Integer pageType; + + /** + * 页面名称 + */ + @Schema(description = "页面名称") + private String pageName; + + /** + * 页面数据 + */ + @Schema(description = "页面数据") + private String pageData; + + /** + * 创建人 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description = "创建人") + private String createBy; + + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description = "创建时间") + private LocalDateTime createTime; + + /** + * 修改人 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + @Schema(description = "修改人") + private String updateBy; + + /** + * 修改时间 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + @Schema(description = "修改时间") + private LocalDateTime updateTime; + + /** + * 删除标记 + */ + @TableLogic + @TableField(fill = FieldFill.INSERT) + @Schema(description = "删除标记") + private String delFlag; + +} diff --git a/as-app-server/as-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/entity/AppRole.java b/as-app-server/as-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/entity/AppRole.java new file mode 100644 index 0000000..c5c1b0d --- /dev/null +++ b/as-app-server/as-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/entity/AppRole.java @@ -0,0 +1,105 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.app.api.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.time.LocalDateTime; + +/** + * app角色表 + * + * @author aeizzz + * @date 2022-12-07 09:52:03 + */ +@Data +@TableName("app_role") +@EqualsAndHashCode(callSuper = true) +@Schema(description = "app角色表") +public class AppRole extends Model { + + private static final long serialVersionUID = 1L; + + /** + * roleId + */ + @TableId(type = IdType.ASSIGN_ID) + @Schema(description = "roleId") + private Long roleId; + + /** + * roleName + */ + @Schema(description = "roleName") + private String roleName; + + /** + * roleCode + */ + @Schema(description = "roleCode") + private String roleCode; + + /** + * roleDesc + */ + @Schema(description = "roleDesc") + private String roleDesc; + + /** + * 创建人 + */ + @Schema(description = "创建人") + private String createBy; + + /** + * 修改人 + */ + @Schema(description = "修改人") + private String updateBy; + + /** + * createTime + */ + @Schema(description = "createTime") + private LocalDateTime createTime; + + /** + * updateTime + */ + @Schema(description = "updateTime") + private LocalDateTime updateTime; + + /** + * delFlag + */ + @Schema(description = "delFlag") + private String delFlag; + + /** + * tenantId + */ + @Schema(description = "tenantId", hidden = true) + private Long tenantId; + +} diff --git a/as-app-server/as-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/entity/AppSocialDetails.java b/as-app-server/as-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/entity/AppSocialDetails.java new file mode 100644 index 0000000..1ac242b --- /dev/null +++ b/as-app-server/as-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/entity/AppSocialDetails.java @@ -0,0 +1,125 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.app.api.entity; + +import com.baomidou.mybatisplus.annotation.*; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import com.pig4cloud.pigx.common.core.sensitive.Sensitive; +import com.pig4cloud.pigx.common.core.util.ValidGroup; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotBlank; +import java.time.LocalDateTime; + +/** + * app 社交账号登录 + */ +@Data +@Schema(description = "第三方账号信息") +@EqualsAndHashCode(callSuper = true) +public class AppSocialDetails extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主鍵 + */ + @TableId(type = IdType.ASSIGN_ID) + @Schema(description = "主键") + private Long id; + + /** + * 类型 + */ + @NotBlank(message = "类型不能为空") + @Schema(description = "账号类型") + private String type; + + /** + * 描述 + */ + @Schema(description = "描述") + private String remark; + + /** + * appid + */ + @Sensitive(prefixNoMaskLen = 4, suffixNoMaskLen = 4) + @NotBlank(message = "账号不能为空") + @Schema(description = "appId") + private String appId; + + /** + * app_secret + */ + @Sensitive(prefixNoMaskLen = 4, suffixNoMaskLen = 4) + @NotBlank(message = "密钥不能为空", groups = { ValidGroup.Insert.class }) + @Schema(description = "app secret") + private String appSecret; + + /** + * 回调地址 + */ + @Schema(description = "回调地址") + private String redirectUrl; + + /** + * 拓展字段 + */ + @Schema(description = "拓展字段") + private String ext; + + /** + * 创建人 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description = "创建人") + private String createBy; + + /** + * 修改人 + */ + @TableField(fill = FieldFill.UPDATE) + @Schema(description = "修改人") + private String updateBy; + + /** + * 创建时间 + */ + @Schema(description = "创建时间") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** + * 更新时间 + */ + @Schema(description = "更新时间") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** + * 删除标记 + */ + @TableLogic + @TableField(fill = FieldFill.INSERT) + @Schema(description = "删除标记,1:已删除,0:正常") + private String delFlag; + +} diff --git a/as-app-server/as-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/entity/AppTabbarEntity.java b/as-app-server/as-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/entity/AppTabbarEntity.java new file mode 100644 index 0000000..c6ef966 --- /dev/null +++ b/as-app-server/as-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/entity/AppTabbarEntity.java @@ -0,0 +1,94 @@ +package com.pig4cloud.pigx.app.api.entity; + +import com.baomidou.mybatisplus.annotation.*; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import com.fasterxml.jackson.annotation.JsonRawValue; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.time.LocalDateTime; + +/** + * 导航栏 + * + * @author lengleng + * @date 2023-06-08 11:18:46 + */ +@Data +@TableName("app_tabbar") +@EqualsAndHashCode(callSuper = true) +@Schema(description = "导航栏") +public class AppTabbarEntity extends Model { + + /** + * 主键 + */ + @TableId(type = IdType.ASSIGN_ID) + @Schema(description = "主键") + private Long id; + + /** + * 导航名称 + */ + @Schema(description = "导航名称") + private String name; + + /** + * 未选图标 + */ + @Schema(description = "未选图标") + private String selected; + + /** + * 已选图标 + */ + @Schema(description = "已选图标") + private String unselected; + + /** + * 链接地址 + */ + @Schema(description = "链接地址") + @JsonRawValue + @JsonDeserialize() + private String link; + + /** + * 创建人 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description = "创建人") + private String createBy; + + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description = "创建时间") + private LocalDateTime createTime; + + /** + * 更新人 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + @Schema(description = "更新人") + private String updateBy; + + /** + * 更新时间 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + @Schema(description = "更新时间") + private LocalDateTime updateTime; + + /** + * 删除标记 + */ + @TableLogic + @TableField(fill = FieldFill.INSERT) + @Schema(description = "删除标记") + private String delFlag; + +} diff --git a/as-app-server/as-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/entity/AppUser.java b/as-app-server/as-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/entity/AppUser.java new file mode 100644 index 0000000..51d8fc5 --- /dev/null +++ b/as-app-server/as-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/entity/AppUser.java @@ -0,0 +1,159 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.app.api.entity; + +import com.baomidou.mybatisplus.annotation.*; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import com.fasterxml.jackson.annotation.JsonIgnore; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.time.LocalDateTime; + +/** + * app用户表 + * + * @author aeizzz + * @date 2022-12-07 09:52:03 + */ +@Data +@TableName("app_user") +@EqualsAndHashCode(callSuper = true) +@Schema(description = "app用户表") +public class AppUser extends Model { + + private static final long serialVersionUID = 1L; + + /** + * userId + */ + @TableId(type = IdType.ASSIGN_ID) + @Schema(description = "userId") + private Long userId; + + /** + * 用户名 + */ + @Schema(description = "用户名") + private String username; + + /** + * 密码 + */ + @Schema(description = "密码") + private String password; + + /** + * 随机盐 + */ + @JsonIgnore + @Schema(description = "随机盐") + private String salt; + + /** + * 手机号 + */ + @Schema(description = "手机号") + private String phone; + + /** + * 头像 + */ + @Schema(description = "头像") + private String avatar; + + /** + * 昵称 + */ + @Schema(description = "拓展字段:昵称") + private String nickname; + + /** + * 姓名 + */ + @Schema(description = "拓展字段:姓名") + private String name; + + /** + * 邮箱 + */ + @Schema(description = "拓展字段:邮箱") + private String email; + + /** + * 创建人 + */ + @Schema(description = "创建人") + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** + * 修改人 + */ + @Schema(description = "修改人") + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** + * 创建时间 + */ + @Schema(description = "创建时间") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** + * 修改时间 + */ + @Schema(description = "修改时间") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** + * 删除标记 + */ + @Schema(description = "删除标记,1:已删除,0:正常") + @TableField(fill = FieldFill.INSERT) + @TableLogic + private String delFlag; + + /** + * 所属租户 + */ + @Schema(description = "所属租户", hidden = true) + private Long tenantId; + + /** + * 最后一次密码修改时间 + */ + @Schema(description = "最后一次密码修改时间") + private LocalDateTime lastModifiedTime; + + /** + * 锁定标记 + */ + @Schema(description = "锁定标记") + private String lockFlag; + + /** + * 微信小程序登录openId + */ + @Schema(description = "微信小程序登录openId") + private String wxOpenid; + +} diff --git a/as-app-server/as-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/entity/AppUserRole.java b/as-app-server/as-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/entity/AppUserRole.java new file mode 100644 index 0000000..28eb397 --- /dev/null +++ b/as-app-server/as-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/entity/AppUserRole.java @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.app.api.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 用户角色表 + * + * @author aeizzz + * @date 2022-12-07 09:52:03 + */ +@Data +@TableName("app_user_role") +@EqualsAndHashCode(callSuper = true) +@Schema(description = "用户角色表") +public class AppUserRole extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 用户ID + */ + @TableId(type = IdType.ASSIGN_ID) + @Schema(description = "用户ID") + private Long userId; + + /** + * 角色ID + */ + @Schema(description = "角色ID") + private Long roleId; + +} diff --git a/as-app-server/as-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/entity/as/AsPlatform.java b/as-app-server/as-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/entity/as/AsPlatform.java new file mode 100644 index 0000000..bab2816 --- /dev/null +++ b/as-app-server/as-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/entity/as/AsPlatform.java @@ -0,0 +1,47 @@ +package com.pig4cloud.pigx.app.api.entity.as; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 媒体平台 + * + * @author amigo + * @date 2023-07 + */ +@Data +@TableName("as_platform") +@EqualsAndHashCode(callSuper = true) +@Schema(description = "媒体平台表") +public class AsPlatform extends Model { + private static final long serialVersionUID = 1L; + + /** + * 主键ID + */ + @TableId(type = IdType.ASSIGN_ID) + @Schema(description = "ID") + private Long id; + + @Schema(description = "平台名称") + private String platformName; + @Schema(description = "平台类型 0:全部") + private Integer platformType; + @Schema(description = "应用图标") + private String icon; + @Schema(description = "公司") + private String company; + @Schema(description = "平台网站") + private String website; + @Schema(description = "sort") + private String sortOrder; + + @Schema(description = "产品code: 类型_名称_id") + private String productCode; + +} diff --git a/as-app-server/as-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/entity/as/AsPlatformType.java b/as-app-server/as-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/entity/as/AsPlatformType.java new file mode 100644 index 0000000..adfcac9 --- /dev/null +++ b/as-app-server/as-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/entity/as/AsPlatformType.java @@ -0,0 +1,38 @@ +package com.pig4cloud.pigx.app.api.entity.as; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 平台类型表 + * + * @author amigo + * @date 2023-07 + */ +@Data +@TableName("as_platform_type") +@EqualsAndHashCode(callSuper = true) +@Schema(description = "平台类型表") +public class AsPlatformType extends Model { + private static final long serialVersionUID = 1L; + + /** + * 主键ID + */ + @TableId(type = IdType.ASSIGN_ID) + @Schema(description = "ID") + private Long id; + + @Schema(description = "名称") + private String name; + @Schema(description = "平台类型 0:全部") + private Integer platformType; + @Schema(description = "平台类型") + private String sortOrder; + +} diff --git a/as-app-server/as-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/entity/as/AsSubAccount.java b/as-app-server/as-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/entity/as/AsSubAccount.java new file mode 100644 index 0000000..fe290a0 --- /dev/null +++ b/as-app-server/as-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/entity/as/AsSubAccount.java @@ -0,0 +1,101 @@ +package com.pig4cloud.pigx.app.api.entity.as; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.time.LocalDateTime; + +/** + * 流媒体订阅账号 + * + * @author amigo + * @date 2023-08 + */ +@Data +@TableName("as_sub_account") +@EqualsAndHashCode(callSuper = true) +@Schema(description = "as流媒体订阅账号") +public class AsSubAccount extends Model { + private static final long serialVersionUID = 1L; + + /** + * 产品id + */ + @Schema(description = "product_id") + private Long productId; + + @TableId(type = IdType.ASSIGN_ID) + @Schema(description = "ID") + private Long id; + + /** + * 订阅计划id + */ + @Schema(description = "sub_plan_id") + private Integer subPlanId; + + /** + * main user + */ + @Schema(description = "user_id") + private Integer userId; + + /** + * 付费计划id + */ + @Schema(description = "sub_payroll_id") + private Integer subPayrollId; + + /** + * 地区 + */ + @Schema(description = "region") + private String region; + + /** + * 分享类型 + */ + @Schema(description = "share_type") + private Integer shareType; + + /** + * 账号类型 + */ + @Schema(description = "account_type") + private Integer accountType; + + /** + * 续费日期 + */ + @Schema(description = "renew_date") + private LocalDateTime renewDate; + + /** + * 平台id + */ + @Schema(description = "platform_id") + private Integer platformId; + + /** + * 用户名 + */ + @Schema(description = "account_name") + private String accountName; + + /** + * 用户密码 + */ + @Schema(description = "account_passwd") + private String accountPasswd; + + /** + * 密码salt + */ + @Schema(description = "passwd_salt") + private Integer passwdSalt; +} diff --git a/as-app-server/as-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/entity/as/AsSubPayroll.java b/as-app-server/as-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/entity/as/AsSubPayroll.java new file mode 100644 index 0000000..66fb5c4 --- /dev/null +++ b/as-app-server/as-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/entity/as/AsSubPayroll.java @@ -0,0 +1,53 @@ +package com.pig4cloud.pigx.app.api.entity.as; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.math.BigDecimal; + +/** + * 付费计划表 + * + * @author amigo + * @date 2023-07 + */ +@Data +@TableName("as_sub_payroll") +@EqualsAndHashCode(callSuper = true) +@Schema(description = "as付费计划") +public class AsSubPayroll extends Model { + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @TableId(type = IdType.ASSIGN_ID) + @Schema(description = "ID") + private Long id; + /** + * 订阅计划id +=, + */ + @Schema(description = "sub_plans") + private Long subPlans; + @Schema(description = "platform_id") + private Integer platformId; + /** + * 付费方式 月/季/年 - 1/2/3 + */ + @Schema(description = "payroll") + private Integer payroll; + + @Schema(description = "price") + private BigDecimal price; + @Schema(description = "currency") + private String currency; + @Schema(description = "region") + private String region; + @Schema(description = "产品code") + private String productCode; +} diff --git a/as-app-server/as-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/entity/as/AsSubPlan.java b/as-app-server/as-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/entity/as/AsSubPlan.java new file mode 100644 index 0000000..92f2c0f --- /dev/null +++ b/as-app-server/as-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/entity/as/AsSubPlan.java @@ -0,0 +1,37 @@ +package com.pig4cloud.pigx.app.api.entity.as; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 流媒体订阅计划表 + * + * @author amigo + * @date 2023-07 + */ +@Data +@TableName("as_sub_plan") +@EqualsAndHashCode(callSuper = true) +@Schema(description = "as订阅计划") +public class AsSubPlan extends Model { + private static final long serialVersionUID = 1L; + + @TableId(type = IdType.ASSIGN_ID) + @Schema(description = "订阅计划ID") + private Long id; + @Schema(description = "订阅名称") + private String name; + @Schema(description = "平台id") + private String platformId; + @Schema(description = "用户容量") + private String capacity; + @Schema(description = "备注") + private String remark; + @Schema(description = "排序") + private String sortOrder; +} diff --git a/as-app-server/as-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/entity/as/AsSubProduct.java b/as-app-server/as-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/entity/as/AsSubProduct.java new file mode 100644 index 0000000..e3cf77e --- /dev/null +++ b/as-app-server/as-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/entity/as/AsSubProduct.java @@ -0,0 +1,45 @@ +package com.pig4cloud.pigx.app.api.entity.as; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +@Data +@TableName("as_sub_product") +@Schema(description = "订阅产品") +public class AsSubProduct { + @TableId(type = IdType.ASSIGN_ID) + @Schema(description = "id") + private Long id; + + @Schema(description = "综合评分") + private Integer star; + @Schema(description = "标题") + private String title; + @Schema(description = "描述") + private String description; + @Schema(description = "标签s") + private String Tags; + @Schema(description = "订阅ids") + private String subPlanIds; + @Schema(description = "总价") + private BigDecimal amount; + @Schema(description = "用户id") + private Long userId; + @Schema(description = "产品类型 1自营 2个人") + private Long productType; + @Schema(description = "创建时间") + private LocalDateTime createTime; + @Schema(description = "更新时间") + private LocalDateTime updateTime; + + @Schema(description = "产品code: 类型_名称_id") + private String productCode; + @Schema(description = "订阅类型 1单品 2多品") + private Long subType; +} diff --git a/as-app-server/as-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/entity/as/AsSubProductComment.java b/as-app-server/as-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/entity/as/AsSubProductComment.java new file mode 100644 index 0000000..5b65c2a --- /dev/null +++ b/as-app-server/as-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/entity/as/AsSubProductComment.java @@ -0,0 +1,30 @@ +package com.pig4cloud.pigx.app.api.entity.as; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; + +@Data +@TableName("as_sub_product_comment") +@Schema(description = "订阅产品评价") +public class AsSubProductComment { + @TableId(type = IdType.ASSIGN_ID) + @Schema(description = "id") + private Long id; + @Schema(description = "评分") + private Integer star; + @Schema(description = "评价") + private String comment; + @Schema(description = "用户id") + private Long userId; + @Schema(description = "产品id") + private Long productId; + @Schema(description = "创建时间") + private LocalDateTime createTime; + @Schema(description = "更新时间") + private LocalDateTime updateTime; +} diff --git a/as-app-server/as-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/entity/as/AsUserSub.java b/as-app-server/as-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/entity/as/AsUserSub.java new file mode 100644 index 0000000..42f88c1 --- /dev/null +++ b/as-app-server/as-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/entity/as/AsUserSub.java @@ -0,0 +1,52 @@ +package com.pig4cloud.pigx.app.api.entity.as; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 流媒体订阅计划表 + * + * @author amigo + * @date 2023-07 + */ +@Data +@TableName("as_user_sub") +@EqualsAndHashCode(callSuper = true) +@Schema(description = "账号订阅表") +public class AsUserSub extends Model { + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @TableId(type = IdType.ASSIGN_ID) + @Schema(description = "ID") + private Long id; + + @Schema(description = "platformId") + private Integer platformId; + + @Schema(description = "capacity") + private Integer capacity; + + @Schema(description = "capacity_loaded") + private Integer capacityLoaded; + + @Schema(description = "plan_id") + private Integer planId; + @Schema(description = "user_id") + private Integer userId; + @Schema(description = "main_account") + private Integer mainAccount; + @Schema(description = "region") + private String region; + @Schema(description = "target_ip") + private String targetIp; + @Schema(description = "remark") + private Integer remark; +} diff --git a/as-app-server/as-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/feign/RemoteAppUserService.java b/as-app-server/as-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/feign/RemoteAppUserService.java new file mode 100644 index 0000000..deb1102 --- /dev/null +++ b/as-app-server/as-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/feign/RemoteAppUserService.java @@ -0,0 +1,66 @@ +/* + * + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + * + */ + +package com.pig4cloud.pigx.app.api.feign; + +import com.pig4cloud.pigx.app.api.dto.AppUserInfo; +import com.pig4cloud.pigx.common.core.constant.SecurityConstants; +import com.pig4cloud.pigx.common.core.constant.ServiceNameConstants; +import com.pig4cloud.pigx.common.core.util.R; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestHeader; + +/** + * @author lengleng + * @date 2018/6/22 + */ +@FeignClient(contextId = "remoteAppUserService", value = ServiceNameConstants.APP_SERVER) +public interface RemoteAppUserService { + + /** + * 通过用户名查询用户、角色信息 + * @param username 用户名 + * @param from 调用标志 + * @return R + */ + @GetMapping("/appuser/info/{username}") + R info(@PathVariable("username") String username, @RequestHeader(SecurityConstants.FROM) String from); + + /** + * 通过社交账号或手机号查询用户、角色信息 + * @param inStr appid@code + * @param from 调用标志 + * @return + */ + @GetMapping("/appsocial/info/{inStr}") + R social(@PathVariable("inStr") String inStr, @RequestHeader(SecurityConstants.FROM) String from); + + /** + * 锁定用户 + * @param username 用户名 + * @param from 调用标识 + * @return + */ + @PutMapping("/appuser/lock/{username}") + R lockUser(@PathVariable("username") String username, @RequestHeader(SecurityConstants.FROM) String from); + +} diff --git a/as-app-server/as-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/vo/AppRoleExcelVO.java b/as-app-server/as-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/vo/AppRoleExcelVO.java new file mode 100644 index 0000000..71dcdfb --- /dev/null +++ b/as-app-server/as-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/vo/AppRoleExcelVO.java @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.app.api.vo; + +import com.alibaba.excel.annotation.ExcelIgnore; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.pig4cloud.pigx.common.excel.annotation.ExcelLine; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** + * @author lengleng + * @date 2020/2/10 + */ +@Data +@Schema(description = "前端角色展示对象") +@ColumnWidth(30) +public class AppRoleExcelVO { + + /** + * 导入时候回显行号 + */ + @ExcelLine + @ExcelIgnore + private Long lineNum; + + /** + * roleName + */ + @ExcelProperty("角色名称") + private String roleName; + + /** + * roleCode + */ + @ExcelProperty("角色标识") + private String roleCode; + + /** + * roleDesc + */ + @ExcelProperty("角色描述") + private String roleDesc; + +} diff --git a/as-app-server/as-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/vo/AppRoleVO.java b/as-app-server/as-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/vo/AppRoleVO.java new file mode 100644 index 0000000..55b02b6 --- /dev/null +++ b/as-app-server/as-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/vo/AppRoleVO.java @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.app.api.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** + * @author lengleng + * @date 2020/2/10 + */ +@Data +@Schema(description = "前端角色展示对象") +public class AppRoleVO { + + /** + * 角色id + */ + private Long roleId; + + /** + * 菜单列表 + */ + private String menuIds; + +} diff --git a/as-app-server/as-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/vo/AppUserExcelVO.java b/as-app-server/as-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/vo/AppUserExcelVO.java new file mode 100644 index 0000000..3906f19 --- /dev/null +++ b/as-app-server/as-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/vo/AppUserExcelVO.java @@ -0,0 +1,83 @@ +package com.pig4cloud.pigx.app.api.vo; + +import com.alibaba.excel.annotation.ExcelIgnore; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.pig4cloud.pigx.common.excel.annotation.ExcelLine; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.time.LocalDateTime; + +@Data +@ColumnWidth(30) +public class AppUserExcelVO { + + /** + * 导入时候回显行号 + */ + @ExcelLine + @ExcelIgnore + private Long lineNum; + + /** + * 主键ID + */ + @ExcelProperty("用户编号") + private Long userId; + + /** + * 用户名 + */ + @NotBlank(message = "用户名不能为空") + @ExcelProperty("用户名") + private String username; + + /** + * 手机号 + */ + @NotBlank(message = "手机号不能为空") + @ExcelProperty("手机号") + private String phone; + + /** + * 手机号 + */ + @NotBlank(message = "昵称不能为空") + @ExcelProperty("昵称") + private String nickname; + + /** + * 手机号 + */ + @NotBlank(message = "姓名不能为空") + @ExcelProperty("姓名") + private String name; + + /** + * 手机号 + */ + @NotBlank(message = "邮箱不能为空") + @ExcelProperty("邮箱") + private String email; + + /** + * 角色列表 + */ + @NotBlank(message = "角色不能为空") + @ExcelProperty("角色") + private String roleNameList; + + /** + * 锁定标记 + */ + @ExcelProperty("锁定标记,0:正常,9:已锁定") + private String lockFlag; + + /** + * 创建时间 + */ + @ExcelProperty(value = "创建时间") + private LocalDateTime createTime; + +} diff --git a/as-app-server/as-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/vo/AppUserVO.java b/as-app-server/as-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/vo/AppUserVO.java new file mode 100644 index 0000000..1de8f4f --- /dev/null +++ b/as-app-server/as-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/vo/AppUserVO.java @@ -0,0 +1,101 @@ +package com.pig4cloud.pigx.app.api.vo; + +import com.pig4cloud.pigx.app.api.entity.AppRole; +import com.pig4cloud.pigx.common.core.sensitive.Sensitive; +import com.pig4cloud.pigx.common.core.sensitive.SensitiveTypeEnum; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.List; + +@Data +public class AppUserVO implements Serializable { + + /** + * 主键 + */ + @Schema(description = "主键") + private Long userId; + + /** + * 用户名 + */ + @Schema(description = "用户名") + private String username; + + /** + * 密码 + */ + @Schema(description = "密码") + private String password; + + /** + * 手机号 + */ + @Schema(description = "手机号") + @Sensitive(type = SensitiveTypeEnum.MOBILE_PHONE) + private String phone; + + /** + * 头像 + */ + @Schema(description = "头像") + private String avatar; + + /** + * 昵称 + */ + @Schema(description = "拓展字段:昵称") + private String nickname; + + /** + * 姓名 + */ + @Schema(description = "拓展字段:姓名") + private String name; + + /** + * 邮箱 + */ + @Schema(description = "拓展字段:邮箱") + private String email; + + /** + * 创建时间 + */ + @Schema(description = "创建时间") + private LocalDateTime createTime; + + /** + * 删除标记 + */ + @Schema(description = "删除标记,1:已删除,0:正常") + private String delFlag; + + /** + * 所属租户 + */ + @Schema(description = "所属租户") + private Long tenantId; + + /** + * 最后一次密码修改时间 + */ + @Schema(description = "最后一次密码修改时间") + private LocalDateTime lastModifiedTime; + + /** + * 锁定标记 + */ + @Schema(description = "锁定标记") + private String lockFlag; + + /** + * 角色列表 + */ + @Schema(description = "拥有的角色列表") + private List roleList; + +} diff --git a/as-app-server/as-app-server-api/src/main/resources/META-INF/spring.factories b/as-app-server/as-app-server-api/src/main/resources/META-INF/spring.factories new file mode 100644 index 0000000..b14af4d --- /dev/null +++ b/as-app-server/as-app-server-api/src/main/resources/META-INF/spring.factories @@ -0,0 +1,2 @@ +com.pig4cloud.pigx.common.feign.PigxFeignAutoConfiguration=\ + com.pig4cloud.pigx.app.api.feign.RemoteAppUserService diff --git a/as-app-server/as-app-server-biz/Dockerfile b/as-app-server/as-app-server-biz/Dockerfile new file mode 100644 index 0000000..b0735cf --- /dev/null +++ b/as-app-server/as-app-server-biz/Dockerfile @@ -0,0 +1,18 @@ +FROM pig4cloud/java:8-jre + +MAINTAINER wangiegie@gmail.com + +ENV TZ=Asia/Shanghai +ENV JAVA_OPTS="-Xms512m -Xmx1024m -Djava.security.egd=file:/dev/./urandom" + +RUN ln -sf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone + +RUN mkdir -p /as-app-server + +WORKDIR /as-app-server + +EXPOSE 7060 + +ADD ./target/as-app-server-biz.jar ./ + +CMD sleep 60;java $JAVA_OPTS -jar as-app-server-biz.jar diff --git a/as-app-server/as-app-server-biz/pom.xml b/as-app-server/as-app-server-biz/pom.xml new file mode 100644 index 0000000..08c6ced --- /dev/null +++ b/as-app-server/as-app-server-biz/pom.xml @@ -0,0 +1,105 @@ + + + 4.0.0 + + com.pig4cloud + as-app-server + 5.2.0 + + + as-app-server-biz + + + + + org.springframework.boot + spring-boot-starter-undertow + + + + org.springframework.boot + spring-boot-starter-web + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-config + + + + com.pig4cloud + pigx-common-data + + + + com.pig4cloud + pigx-common-security + + + + com.pig4cloud + pigx-common-xss + + + + com.pig4cloud + pigx-common-sentinel + + + + com.pig4cloud + pigx-common-feign + + + + com.pig4cloud + as-app-server-api + 5.2.0 + + + + com.pig4cloud + pigx-common-log + + + + com.baomidou + mybatis-plus-boot-starter + + + + com.alibaba + druid-spring-boot-starter + + + + com.mysql + mysql-connector-j + + + + com.pig4cloud + pigx-common-swagger + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + io.fabric8 + docker-maven-plugin + + + + diff --git a/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/AsAppApplication.java b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/AsAppApplication.java new file mode 100644 index 0000000..80208b6 --- /dev/null +++ b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/AsAppApplication.java @@ -0,0 +1,26 @@ +package com.pig4cloud.pigx.app; + +import com.pig4cloud.pigx.common.feign.annotation.EnablePigxFeignClients; +import com.pig4cloud.pigx.common.security.annotation.EnablePigxResourceServer; +import com.pig4cloud.pigx.common.swagger.annotation.EnableOpenApi; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.client.discovery.EnableDiscoveryClient; + +/** + * @author pigx archetype + *

+ * 项目启动类 + */ +@EnableOpenApi("app") +@EnablePigxFeignClients +@EnableDiscoveryClient +@EnablePigxResourceServer +@SpringBootApplication +public class AsAppApplication { + + public static void main(String[] args) { + SpringApplication.run(AsAppApplication.class, args); + } + +} diff --git a/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/controller/AppArticleCategoryController.java b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/controller/AppArticleCategoryController.java new file mode 100644 index 0000000..e23b9a5 --- /dev/null +++ b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/controller/AppArticleCategoryController.java @@ -0,0 +1,131 @@ +package com.pig4cloud.pigx.app.controller; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.pig4cloud.pigx.app.api.entity.AppArticleCategoryEntity; +import com.pig4cloud.pigx.app.service.AppArticleCategoryService; +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.common.excel.annotation.ResponseExcel; +import com.pig4cloud.pigx.common.log.annotation.SysLog; +import com.pig4cloud.pigx.common.security.annotation.Inner; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.springdoc.api.annotations.ParameterObject; +import org.springframework.http.HttpHeaders; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 文章分类表 + * + * @author pig + * @date 2023-06-07 16:28:03 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/appArticleCategory") +@Tag(description = "appArticleCategory", name = "文章分类表管理") +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class AppArticleCategoryController { + + private final AppArticleCategoryService appArticleCategoryService; + + /** + * 分页查询 + * @param page 分页对象 + * @param appArticleCategory 文章分类表 + * @return + */ + @Operation(summary = "分页查询", description = "分页查询") + @GetMapping("/page") + @PreAuthorize("@pms.hasPermission('app_appArticleCategory_view')") + public R getAppArticleCategoryPage(@ParameterObject Page page, + @ParameterObject AppArticleCategoryEntity appArticleCategory) { + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + wrapper.like(StrUtil.isNotBlank(appArticleCategory.getName()), AppArticleCategoryEntity::getName, + appArticleCategory.getName()); + return R.ok(appArticleCategoryService.page(page, wrapper)); + } + + /** + * 通过id查询文章分类表 + * @param id id + * @return R + */ + @Operation(summary = "通过id查询", description = "通过id查询") + @GetMapping("/{id}") + @PreAuthorize("@pms.hasPermission('app_appArticleCategory_view')") + public R getById(@PathVariable("id") Long id) { + return R.ok(appArticleCategoryService.getById(id)); + } + + /** + * 通过查询文章分类 + * @return R + */ + @Operation(summary = "查询文章分类", description = "查询文章分类") + @Inner(value = false) + @GetMapping("/list") + public R list() { + return R.ok(appArticleCategoryService.list()); + } + + /** + * 新增文章分类表 + * @param appArticleCategory 文章分类表 + * @return R + */ + @Operation(summary = "新增文章分类表", description = "新增文章分类表") + @SysLog("新增文章分类表") + @PostMapping + @PreAuthorize("@pms.hasPermission('app_appArticleCategory_add')") + public R save(@RequestBody AppArticleCategoryEntity appArticleCategory) { + return R.ok(appArticleCategoryService.save(appArticleCategory)); + } + + /** + * 修改文章分类表 + * @param appArticleCategory 文章分类表 + * @return R + */ + @Operation(summary = "修改文章分类表", description = "修改文章分类表") + @SysLog("修改文章分类表") + @PutMapping + @PreAuthorize("@pms.hasPermission('app_appArticleCategory_edit')") + public R updateById(@RequestBody AppArticleCategoryEntity appArticleCategory) { + return R.ok(appArticleCategoryService.updateById(appArticleCategory)); + } + + /** + * 通过id删除文章分类表 + * @param ids id列表 + * @return R + */ + @Operation(summary = "通过id删除文章分类表", description = "通过id删除文章分类表") + @SysLog("通过id删除文章分类表") + @DeleteMapping + @PreAuthorize("@pms.hasPermission('app_appArticleCategory_del')") + public R removeById(@RequestBody Long[] ids) { + return R.ok(appArticleCategoryService.removeBatchByIds(CollUtil.toList(ids))); + } + + /** + * 导出excel 表格 + * @param appArticleCategory 查询条件 + * @return excel 文件流 + */ + @ResponseExcel + @GetMapping("/export") + @PreAuthorize("@pms.hasPermission('app_appArticleCategory_export')") + public List export(AppArticleCategoryEntity appArticleCategory) { + return appArticleCategoryService.list(Wrappers.query(appArticleCategory)); + } + +} diff --git a/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/controller/AppArticleCollectController.java b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/controller/AppArticleCollectController.java new file mode 100644 index 0000000..d747f6f --- /dev/null +++ b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/controller/AppArticleCollectController.java @@ -0,0 +1,124 @@ +package com.pig4cloud.pigx.app.controller; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.github.yulichang.wrapper.MPJLambdaWrapper; +import com.pig4cloud.pigx.app.api.entity.AppArticleCollectEntity; +import com.pig4cloud.pigx.app.api.entity.AppArticleEntity; +import com.pig4cloud.pigx.app.service.AppArticleCollectService; +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.common.excel.annotation.ResponseExcel; +import com.pig4cloud.pigx.common.log.annotation.SysLog; +import com.pig4cloud.pigx.common.security.util.SecurityUtils; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.springdoc.api.annotations.ParameterObject; +import org.springframework.http.HttpHeaders; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 文章收藏表 + * + * @author pig + * @date 2023-06-16 14:33:41 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/collect") +@Tag(description = "collect", name = "文章收藏表管理") +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class AppArticleCollectController { + + private final AppArticleCollectService appArticleCollectService; + + /** + * 分页查询 + * @param page 分页对象 + * @param appArticleCollect 文章收藏表 + * @return + */ + @Operation(summary = "分页查询", description = "分页查询") + @GetMapping("/page") + public R getAppArticleCollectPage(@ParameterObject Page page) { + MPJLambdaWrapper wrapper = new MPJLambdaWrapper() + .selectAll(AppArticleCollectEntity.class).select(AppArticleEntity::getTitle) + .leftJoin(AppArticleEntity.class, AppArticleEntity::getId, AppArticleCollectEntity::getArticleId) + .eq(AppArticleCollectEntity::getUserId, SecurityUtils.getUser().getId()); + return R.ok(appArticleCollectService.selectJoinListPage(page, AppArticleCollectEntity.class, wrapper)); + } + + /** + * 通过id查询文章收藏表 + * @param id id + * @return R + */ + @Operation(summary = "通过id查询", description = "通过id查询") + @GetMapping("/{id}") + public R getById(@PathVariable("id") Long id) { + return R.ok(appArticleCollectService.getById(id)); + } + + /** + * 新增文章收藏表 + * @param appArticleCollect 文章收藏表 + * @return R + */ + @Operation(summary = "新增文章收藏表", description = "新增文章收藏表") + @SysLog("新增文章收藏表") + @PostMapping + public R save(@RequestBody AppArticleCollectEntity appArticleCollect) { + return R.ok(appArticleCollectService.saveArticleCollect(appArticleCollect)); + } + + /** + * 修改文章收藏表 + * @param appArticleCollect 文章收藏表 + * @return R + */ + @Operation(summary = "修改文章收藏表", description = "修改文章收藏表") + @SysLog("修改文章收藏表") + @PutMapping + public R updateById(@RequestBody AppArticleCollectEntity appArticleCollect) { + return R.ok(appArticleCollectService.updateById(appArticleCollect)); + } + + /** + * 通过id删除文章收藏表 + * @param ids id列表 + * @return R + */ + @Operation(summary = "通过id删除文章收藏表", description = "通过id删除文章收藏表") + @SysLog("通过id删除文章收藏表") + @DeleteMapping + public R removeById(@RequestBody Long[] ids) { + return R.ok(appArticleCollectService.removeBatchByIds(CollUtil.toList(ids))); + } + + @Operation(summary = "通过文章id删除文章收藏表", description = "通过文章id删除文章收藏表") + @SysLog("通过文章id删除文章收藏表") + @DeleteMapping("/{articleId}") + public R removeByArticleId(@PathVariable String articleId) { + Long id = SecurityUtils.getUser().getId(); + return R.ok(appArticleCollectService.remove(Wrappers.lambdaQuery() + .eq(AppArticleCollectEntity::getUserId, id).eq(AppArticleCollectEntity::getArticleId, articleId))); + } + + /** + * 导出excel 表格 + * @param appArticleCollect 查询条件 + * @return excel 文件流 + */ + @ResponseExcel + @GetMapping("/export") + @PreAuthorize("@pms.hasPermission('app_collect_export')") + public List export(AppArticleCollectEntity appArticleCollect) { + return appArticleCollectService.list(Wrappers.query(appArticleCollect)); + } + +} diff --git a/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/controller/AppArticleController.java b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/controller/AppArticleController.java new file mode 100644 index 0000000..6cc03a5 --- /dev/null +++ b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/controller/AppArticleController.java @@ -0,0 +1,114 @@ +package com.pig4cloud.pigx.app.controller; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.pig4cloud.pigx.app.api.entity.AppArticleEntity; +import com.pig4cloud.pigx.app.service.AppArticleService; +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.common.excel.annotation.ResponseExcel; +import com.pig4cloud.pigx.common.log.annotation.SysLog; +import com.pig4cloud.pigx.common.security.annotation.Inner; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.springdoc.api.annotations.ParameterObject; +import org.springframework.http.HttpHeaders; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 文章资讯 + * + * @author pig + * @date 2023-06-07 16:32:35 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/appArticle") +@Tag(description = "appArticle", name = "文章资讯管理") +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class AppArticleController { + + private final AppArticleService appArticleService; + + /** + * 分页查询 + * @param page 分页对象 + * @param appArticle 文章资讯 + * @return + */ + @Operation(summary = "分页查询", description = "分页查询") + @Inner(value = false) + @GetMapping("/page") + public R getAppArticlePage(@ParameterObject Page page, @ParameterObject AppArticleEntity appArticle) { + return R.ok(appArticleService.pageAndCname(page, appArticle)); + } + + /** + * 通过id查询文章资讯 + * @param id id + * @return R + */ + @Inner(value = false) + @Operation(summary = "通过id查询", description = "通过id查询") + @GetMapping("/details/{id}/{userId}") + public R getById(@PathVariable("id") Long id, @PathVariable(required = false) Long userId) { + return R.ok(appArticleService.getArticleAndIncrById(id, userId)); + } + + /** + * 新增文章资讯 + * @param appArticle 文章资讯 + * @return R + */ + @Operation(summary = "新增文章资讯", description = "新增文章资讯") + @SysLog("新增文章资讯") + @PostMapping + @PreAuthorize("@pms.hasPermission('app_appArticle_add')") + public R save(@RequestBody AppArticleEntity appArticle) { + return R.ok(appArticleService.save(appArticle)); + } + + /** + * 修改文章资讯 + * @param appArticle 文章资讯 + * @return R + */ + @Operation(summary = "修改文章资讯", description = "修改文章资讯") + @SysLog("修改文章资讯") + @PutMapping + @PreAuthorize("@pms.hasPermission('app_appArticle_edit')") + public R updateById(@RequestBody AppArticleEntity appArticle) { + return R.ok(appArticleService.updateById(appArticle)); + } + + /** + * 通过id删除文章资讯 + * @param ids id列表 + * @return R + */ + @Operation(summary = "通过id删除文章资讯", description = "通过id删除文章资讯") + @SysLog("通过id删除文章资讯") + @DeleteMapping + @PreAuthorize("@pms.hasPermission('app_appArticle_del')") + public R removeById(@RequestBody Long[] ids) { + return R.ok(appArticleService.removeBatchByIds(CollUtil.toList(ids))); + } + + /** + * 导出excel 表格 + * @param appArticle 查询条件 + * @return excel 文件流 + */ + @ResponseExcel + @GetMapping("/export") + @PreAuthorize("@pms.hasPermission('app_appArticle_export')") + public List export(AppArticleEntity appArticle) { + return appArticleService.list(Wrappers.query(appArticle)); + } + +} diff --git a/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/controller/AppIndexController.java b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/controller/AppIndexController.java new file mode 100644 index 0000000..5fef3bd --- /dev/null +++ b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/controller/AppIndexController.java @@ -0,0 +1,59 @@ +package com.pig4cloud.pigx.app.controller; + +import com.pig4cloud.pigx.app.api.entity.AppPageEntity; +import com.pig4cloud.pigx.app.service.AppIndexService; +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.common.security.annotation.Inner; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpHeaders; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Map; + +/** + * app 首页控制 + * + * @author lengleng + * @date 2023/6/8 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/index") +@Tag(description = "App 页面控制", name = "app index") +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class AppIndexController { + + private final AppIndexService indexService; + + /** + * 首页 + * @return Object + */ + @Inner(value = false) + @GetMapping("/index") + public R index() { + Map detail = indexService.index(); + return R.ok(detail); + } + + @Inner(value = false) + @GetMapping("/config") + public R config() { + Map map = indexService.config(); + return R.ok(map); + } + + @Inner(value = false) + @GetMapping("/decorate") + public R decorate(@Validated @RequestParam("id") Integer id) { + AppPageEntity detail = indexService.decorate(id); + return R.ok(detail); + } + +} diff --git a/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/controller/AppMobileController.java b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/controller/AppMobileController.java new file mode 100644 index 0000000..dd3dbe3 --- /dev/null +++ b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/controller/AppMobileController.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.app.controller; + +import com.pig4cloud.pigx.app.service.AppMobileService; +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.common.security.annotation.Inner; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.AllArgsConstructor; +import org.springframework.http.HttpHeaders; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * @author lengleng + * @date 2018/11/14 + *

+ * 手机验证码 + */ +@RestController +@AllArgsConstructor +@RequestMapping("/appmobile") +@Tag(description = "mobile", name = "手机管理模块") +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class AppMobileController { + + private final AppMobileService appMobileService; + + @Inner(value = false) + @GetMapping("/{mobile}") + public R sendSmsCode(@PathVariable String mobile) { + return appMobileService.sendSmsCode(mobile); + } + +} diff --git a/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/controller/AppPageController.java b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/controller/AppPageController.java new file mode 100644 index 0000000..44bdad3 --- /dev/null +++ b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/controller/AppPageController.java @@ -0,0 +1,45 @@ +package com.pig4cloud.pigx.app.controller; + +import com.pig4cloud.pigx.app.api.entity.AppPageEntity; +import com.pig4cloud.pigx.app.service.AppPageService; +import com.pig4cloud.pigx.common.core.util.R; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpHeaders; +import org.springframework.web.bind.annotation.*; + +/** + * 页面管理 + * + * @author pig + * @date 2023-06-07 16:32:35 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/appPage") +@Tag(description = "appPage", name = "页面管理") +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class AppPageController { + + private final AppPageService pageService; + + /** + * 通过id查询文章资讯 + * @param id id + * @return R + */ + @Operation(summary = "通过id查询", description = "通过id查询") + @GetMapping("/{id}") + public R getById(@PathVariable("id") Long id) { + return R.ok(pageService.getById(id)); + } + + @Operation(summary = "更新页面", description = "更新页面") + @PutMapping + public R update(@RequestBody AppPageEntity page) { + return R.ok(pageService.updateById(page)); + } + +} diff --git a/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/controller/AppRoleController.java b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/controller/AppRoleController.java new file mode 100644 index 0000000..dbeb7ea --- /dev/null +++ b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/controller/AppRoleController.java @@ -0,0 +1,175 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.app.controller; + +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.pig4cloud.pigx.app.api.entity.AppRole; +import com.pig4cloud.pigx.app.api.vo.AppRoleExcelVO; +import com.pig4cloud.pigx.app.service.AppRoleService; +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.common.excel.annotation.RequestExcel; +import com.pig4cloud.pigx.common.excel.annotation.ResponseExcel; +import com.pig4cloud.pigx.common.log.annotation.SysLog; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpHeaders; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * app角色表 + * + * @author aeizzz + * @date 2022-12-07 09:52:03 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/approle") +@Tag(description = "approle", name = "app角色表管理") +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class AppRoleController { + + private final AppRoleService appRoleService; + + /** + * 分页查询 + * @param page 分页对象 + * @param appRole app角色表 + * @return + */ + @Operation(summary = "分页查询", description = "分页查询") + @GetMapping("/page") + public R getAppRolePage(Page page, AppRole appRole) { + return R.ok(appRoleService.page(page, Wrappers.lambdaQuery() + .like(StrUtil.isNotBlank(appRole.getRoleName()), AppRole::getRoleName, appRole.getRoleName()))); + } + + /** + * 查询全部角色 + * @return + */ + @Operation(summary = "查询全部", description = "查询全部") + @GetMapping("/list") + public R list() { + return R.ok(appRoleService.list(Wrappers.emptyWrapper())); + } + + /** + * 通过id查询app角色表 + * @param roleId id + * @return R + */ + @Operation(summary = "通过id查询", description = "通过id查询") + @GetMapping("/{roleId}") + public R getById(@PathVariable("roleId") Long roleId) { + return R.ok(appRoleService.getById(roleId)); + } + + /** + * 通过roleName查询app角色表 + * @param roleName roleName + * @return R + */ + @Operation(summary = "通过id查询", description = "通过id查询") + @GetMapping("/details/{roleName}") + public R getByUserName(@PathVariable("roleName") String roleName) { + return R.ok(appRoleService.getOne(Wrappers.lambdaQuery().eq(AppRole::getRoleName, roleName))); + } + + /** + * 通过roleCode查询app角色表 + * @param roleCode roleCode + * @return R + */ + @Operation(summary = "通过roleCode查询", description = "通过roleCode查询") + @GetMapping("/detailsByCode/{roleCode}") + public R getByPhone(@PathVariable("roleCode") String roleCode) { + return R.ok(appRoleService.getOne(Wrappers.lambdaQuery().eq(AppRole::getRoleCode, roleCode))); + } + + /** + * 新增app角色表 + * @param appRole app角色表 + * @return R + */ + @Operation(summary = "新增app角色表", description = "新增app角色表") + @SysLog("新增app角色表") + @PostMapping + @PreAuthorize("@pms.hasPermission('app_approle_add')") + public R save(@RequestBody AppRole appRole) { + return R.ok(appRoleService.save(appRole)); + } + + /** + * 修改app角色表 + * @param appRole app角色表 + * @return R + */ + @Operation(summary = "修改app角色表", description = "修改app角色表") + @SysLog("修改app角色表") + @PutMapping + @PreAuthorize("@pms.hasPermission('app_approle_edit')") + public R updateById(@RequestBody AppRole appRole) { + return R.ok(appRoleService.updateById(appRole)); + } + + /** + * 通过ids批量删除app角色表 + * @param ids roleIds + * @return R + */ + @Operation(summary = "通过ids批量删除app角色表", description = "通过ids批量删除app角色表") + @SysLog("通过ids批量删除app角色表") + @DeleteMapping + @PreAuthorize("@pms.hasPermission('app_approle_del')") + public R removeById(@RequestBody Long[] ids) { + return R.ok(appRoleService.deleteRoleByIds(ids)); + } + + /** + * 导出excel 表格 + * @param appRole 查询条件 + * @return excel 文件流 + */ + @ResponseExcel + @GetMapping("/export") + @PreAuthorize("@pms.hasPermission('app_approle_export')") + public List export(AppRole appRole) { + return appRoleService.list(Wrappers.query(appRole)); + } + + /** + * 导入角色 + * @param excelVOList 角色列表 + * @param bindingResult 错误信息列表 + * @return ok fail + */ + @PostMapping("/import") + @PreAuthorize("@pms.hasPermission('app_approle_export')") + public R importRole(@RequestExcel List excelVOList, BindingResult bindingResult) { + return appRoleService.importRole(excelVOList, bindingResult); + } + +} diff --git a/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/controller/AppSocialDetailsController.java b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/controller/AppSocialDetailsController.java new file mode 100644 index 0000000..c139c38 --- /dev/null +++ b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/controller/AppSocialDetailsController.java @@ -0,0 +1,139 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.app.controller; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.pig4cloud.pigx.app.api.entity.AppSocialDetails; +import com.pig4cloud.pigx.app.service.AppSocialDetailsService; +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.common.core.util.ValidGroup; +import com.pig4cloud.pigx.common.excel.annotation.ResponseExcel; +import com.pig4cloud.pigx.common.log.annotation.SysLog; +import com.pig4cloud.pigx.common.security.annotation.Inner; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.AllArgsConstructor; +import org.springframework.http.HttpHeaders; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.util.List; + +@RestController +@RequestMapping("/appsocial") +@AllArgsConstructor +@Tag(description = "social", name = "三方账号管理模块") +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class AppSocialDetailsController { + + private final AppSocialDetailsService appSocialDetailsService; + + /** + * 社交登录账户简单分页查询 + * @param page 分页对象 + * @param appSocialDetails 社交登录 + * @return + */ + @GetMapping("/page") + public R getSocialDetailsPage(Page page, AppSocialDetails appSocialDetails) { + return R.ok(appSocialDetailsService.page(page, Wrappers.query(appSocialDetails))); + } + + /** + * 信息 + * @param id id + * @return R + */ + @GetMapping("/{id}") + public R getinfo(@PathVariable("id") Long id) { + return R.ok(appSocialDetailsService.getById(id)); + } + + /** + * 保存 + * @param appSocialDetails + * @return R + */ + @SysLog("保存三方信息") + @PostMapping + @PreAuthorize("@pms.hasPermission('app_social_details_add')") + public R save(@Valid @RequestBody AppSocialDetails appSocialDetails) { + return R.ok(appSocialDetailsService.save(appSocialDetails)); + } + + /** + * 修改 + * @param appSocialDetails + * @return R + */ + @SysLog("修改三方信息") + @PutMapping + @PreAuthorize("@pms.hasPermission('app_social_details_edit')") + public R updateById(@Validated({ ValidGroup.Update.class }) @RequestBody AppSocialDetails appSocialDetails) { + appSocialDetailsService.updateById(appSocialDetails); + return R.ok(Boolean.TRUE); + } + + /** + * 删除 + * @param ids + * @return R + */ + @SysLog("删除三方信息") + @DeleteMapping + @PreAuthorize("@pms.hasPermission('app_social_details_del')") + public R removeById(@RequestBody Long[] ids) { + return R.ok(appSocialDetailsService.removeBatchByIds(CollUtil.toList(ids))); + } + + /** + * 通过社交账号、手机号查询用户、角色信息 + * @param inStr appid@code + * @return + */ + @Inner + @GetMapping("/info/{inStr}") + public R getUserInfo(@PathVariable String inStr) { + return R.ok(appSocialDetailsService.getUserInfo(inStr)); + } + + /** + * 绑定社交账号 + * @param state 类型 + * @param code code + * @return + */ + @PostMapping("/bind") + public R bindSocial(String state, String code) { + return R.ok(appSocialDetailsService.bindSocial(state, code)); + } + + /** + * 导出 + */ + @GetMapping("/export") + @ResponseExcel + public List export(AppSocialDetails appSocialDetails) { + return appSocialDetailsService.list(Wrappers.query(appSocialDetails)); + } + +} diff --git a/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/controller/AppTabbarController.java b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/controller/AppTabbarController.java new file mode 100644 index 0000000..5c751f7 --- /dev/null +++ b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/controller/AppTabbarController.java @@ -0,0 +1,52 @@ +package com.pig4cloud.pigx.app.controller; + +import cn.hutool.core.collection.CollUtil; +import com.pig4cloud.pigx.app.api.entity.AppTabbarEntity; +import com.pig4cloud.pigx.app.service.AppTabbarService; +import com.pig4cloud.pigx.common.core.util.R; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpHeaders; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * 底部导航 + * + * @author pig + * @date 2023-06-07 16:32:35 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/appTabbar") +@Tag(description = "appTabbar", name = "底部导航") +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class AppTabbarController { + + private final AppTabbarService tabbarService; + + /** + * 查询导航列表 + * @return R + */ + @Operation(summary = "查询导航列表", description = "查询导航列表") + @GetMapping("/list") + public R list() { + return R.ok(tabbarService.list()); + } + + @Operation(summary = "更新导航", description = "更新导航") + @PutMapping + public R update(@RequestBody List tabbarEntityList) { + // 删除不在新增范围的导航菜单 + List idList = tabbarService.list().stream().map(AppTabbarEntity::getId).collect(Collectors.toList()); + List newIdList = tabbarEntityList.stream().map(AppTabbarEntity::getId).collect(Collectors.toList()); + tabbarService.removeBatchByIds(CollUtil.subtractToList(idList, newIdList)); + return R.ok(tabbarService.saveOrUpdateBatch(tabbarEntityList)); + } + +} diff --git a/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/controller/AppUserController.java b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/controller/AppUserController.java new file mode 100644 index 0000000..43f1e3e --- /dev/null +++ b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/controller/AppUserController.java @@ -0,0 +1,208 @@ +package com.pig4cloud.pigx.app.controller; + +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.pig4cloud.pigx.app.api.dto.AppUserDTO; +import com.pig4cloud.pigx.app.api.entity.AppUser; +import com.pig4cloud.pigx.app.api.vo.AppUserExcelVO; +import com.pig4cloud.pigx.app.service.AppUserService; +import com.pig4cloud.pigx.common.core.constant.CommonConstants; +import com.pig4cloud.pigx.common.core.constant.enums.UserTypeEnum; +import com.pig4cloud.pigx.common.core.exception.ErrorCodes; +import com.pig4cloud.pigx.common.core.util.MsgUtils; +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.common.excel.annotation.RequestExcel; +import com.pig4cloud.pigx.common.excel.annotation.ResponseExcel; +import com.pig4cloud.pigx.common.log.annotation.SysLog; +import com.pig4cloud.pigx.common.security.annotation.Inner; +import com.pig4cloud.pigx.common.security.util.SecurityUtils; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpHeaders; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.util.List; + +/** + * app用户表 + * + * @author aeizzz + * @date 2022-12-07 09:52:03 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/appuser") +@Tag(description = "appuser", name = "app用户表管理") +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class AppUserController { + + private final AppUserService appUserService; + + + /** + * 注册用户 + * @param userDto 用户信息 + * @return success/false + */ + @Operation(summary = "注册用户", description = "注册用户") + @Inner(value = false) + @SysLog("注册用户") + @PostMapping("/regUser") + public R registerUser(@RequestBody AppUserDTO userDto) { + // 判断用户名是否存在 + AppUser user = appUserService.getOne(Wrappers.query() + .lambda().eq(AppUser::getUsername, userDto.getUsername())); + if (user != null) { + String message = MsgUtils.getMessage(ErrorCodes.SYS_USER_USERNAME_EXISTING, userDto.getUsername()); + return R.failed(message); + } + return R.ok(appUserService.regUser(userDto)); + } + + @Inner + @GetMapping("/info/{username}") + public R info(@PathVariable String username) { + AppUser user = appUserService.getOne(Wrappers.query().lambda().eq(AppUser::getUsername, username).or() + .eq(AppUser::getPhone, username)); + if (user == null) { + return R.failed(MsgUtils.getMessage(ErrorCodes.APP_USER_USERINFO_EMPTY, username)); + } + return R.ok(appUserService.findUserInfo(user)); + } + + /** + * 获取当前用户全部信息 + * @return 用户信息 + */ + @GetMapping(value = { "/info" }) + public R info() { + String username = SecurityUtils.getUser().getUsername(); + AppUser user = appUserService.getOne(Wrappers.query().lambda().eq(AppUser::getUsername, username)); + if (user == null) { + return R.failed(MsgUtils.getMessage(ErrorCodes.SYS_USER_QUERY_ERROR)); + } + return R.ok(appUserService.findUserInfo(user)); + } + + /** + * 分页查询 + * @param page 分页对象 + * @param appUserDTO app用户表 + * @return + */ + @Operation(summary = "分页查询", description = "分页查询") + @GetMapping("/page") + public R getAppUserPage(Page page, AppUserDTO appUserDTO) { + return R.ok(appUserService.getUsersWithRolePage(page, appUserDTO)); + } + + /** + * 通过id查询app用户表 + * @param userId id + * @return R + */ + @Operation(summary = "通过id查询", description = "通过id查询") + @GetMapping("/details/{userId}") + public R getById(@PathVariable("userId") Long userId) { + return R.ok(appUserService.selectUserVoById(userId)); + } + + /** + * @return R + */ + @Operation(summary = "通过userName查询", description = "通过userName查询") + @GetMapping("/details") + public R getByUserName(AppUser user) { + AppUser one = appUserService.getOne(Wrappers.query(user), false); + return R.ok(one == null ? null : CommonConstants.SUCCESS); + } + + /** + * 新增app用户表 + * @param appUser app用户表 + * @return R + */ + @Operation(summary = "新增app用户表", description = "新增app用户表") + @SysLog("新增app用户表") + @PostMapping + @PreAuthorize("@pms.hasPermission('app_appuser_add')") + public R save(@RequestBody AppUserDTO appUser) { + appUserService.saveUser(appUser); + return R.ok(); + } + + /** + * 修改app用户表 + * @param appUser app用户表 + * @return R + */ + @Operation(summary = "修改app用户表", description = "修改app用户表") + @SysLog("修改app用户表") + @PutMapping + @PreAuthorize("@pms.hasPermission('app_appuser_edit')") + public R updateById(@RequestBody AppUserDTO appUser) { + return R.ok(appUserService.updateUser(appUser)); + } + + /** + * 通过id删除app用户表 + * @param ids userIds + * @return R + */ + @Operation(summary = "通过ids删除app用户表", description = "通过ids删除app用户表") + @SysLog("通过id删除app用户表") + @DeleteMapping + @PreAuthorize("@pms.hasPermission('app_appuser_del')") + public R removeById(@RequestBody Long[] ids) { + return R.ok(appUserService.deleteAppUserByIds(ids)); + } + + /** + * 导出excel 表格 + * @param appUser 查询条件 + * @return excel 文件流 + */ + @ResponseExcel + @GetMapping("/export") + @PreAuthorize("@pms.hasPermission('app_appuser_export')") + public List export(AppUserDTO appUser) { + return appUserService.listUser(appUser); + } + + @SysLog("修改个人信息") + @PutMapping("/edit") + public R updateUserInfo(@Valid @RequestBody AppUserDTO userDto) { + if (UserTypeEnum.TOC.getStatus().equals(SecurityUtils.getUser().getUserType())) { + userDto.setUserId(SecurityUtils.getUser().getId()); + // TOC 以手机号为key + userDto.setUsername(SecurityUtils.getUser().getUsername()); + } + return appUserService.updateUserInfo(userDto); + } + + /** + * 导入用户 + * @param excelVOList 用户列表 + * @param bindingResult 错误信息列表 + * @return R + */ + @PostMapping("/import") + @PreAuthorize("@pms.hasPermission('app_appuser_export')") + public R importUser(@RequestExcel List excelVOList, BindingResult bindingResult) { + return appUserService.importUser(excelVOList, bindingResult); + } + + @Operation(summary = "注册app用户表", description = "注册app用户表") + @SysLog("注册app用户表") + @Inner(value = false) + @PostMapping("/register") + public R register(@RequestBody AppUserDTO appUser) { + return appUserService.registerAppUser(appUser); + } + +} diff --git a/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/controller/AppUserRoleController.java b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/controller/AppUserRoleController.java new file mode 100644 index 0000000..af0df8f --- /dev/null +++ b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/controller/AppUserRoleController.java @@ -0,0 +1,128 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.app.controller; + +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.pig4cloud.pigx.app.api.entity.AppUserRole; +import com.pig4cloud.pigx.app.service.AppUserRoleService; +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.common.excel.annotation.ResponseExcel; +import com.pig4cloud.pigx.common.log.annotation.SysLog; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpHeaders; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 用户角色表 + * + * @author aeizzz + * @date 2022-12-07 09:52:03 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/appuserrole") +@Tag(description = "appuserrole", name = "用户角色表管理") +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class AppUserRoleController { + + private final AppUserRoleService appUserRoleService; + + /** + * 分页查询 + * @param page 分页对象 + * @param appUserRole 用户角色表 + * @return + */ + @Operation(summary = "分页查询", description = "分页查询") + @GetMapping("/page") + @PreAuthorize("@pms.hasPermission('app_appuserrole_view')") + public R getAppUserRolePage(Page page, AppUserRole appUserRole) { + return R.ok(appUserRoleService.page(page, Wrappers.query(appUserRole))); + } + + /** + * 通过id查询用户角色表 + * @param userId id + * @return R + */ + @Operation(summary = "通过id查询", description = "通过id查询") + @GetMapping("/{userId}") + @PreAuthorize("@pms.hasPermission('app_appuserrole_view')") + public R getById(@PathVariable("userId") Long userId) { + return R.ok(appUserRoleService.getById(userId)); + } + + /** + * 新增用户角色表 + * @param appUserRole 用户角色表 + * @return R + */ + @Operation(summary = "新增用户角色表", description = "新增用户角色表") + @SysLog("新增用户角色表") + @PostMapping + @PreAuthorize("@pms.hasPermission('app_appuserrole_add')") + public R save(@RequestBody AppUserRole appUserRole) { + return R.ok(appUserRoleService.save(appUserRole)); + } + + /** + * 修改用户角色表 + * @param appUserRole 用户角色表 + * @return R + */ + @Operation(summary = "修改用户角色表", description = "修改用户角色表") + @SysLog("修改用户角色表") + @PutMapping + @PreAuthorize("@pms.hasPermission('app_appuserrole_edit')") + public R updateById(@RequestBody AppUserRole appUserRole) { + return R.ok(appUserRoleService.updateById(appUserRole)); + } + + /** + * 通过id删除用户角色表 + * @param userId id + * @return R + */ + @Operation(summary = "通过id删除用户角色表", description = "通过id删除用户角色表") + @SysLog("通过id删除用户角色表") + @DeleteMapping("/{userId}") + @PreAuthorize("@pms.hasPermission('app_appuserrole_del')") + public R removeById(@PathVariable Long userId) { + return R.ok(appUserRoleService.removeById(userId)); + } + + /** + * 导出excel 表格 + * @param appUserRole 查询条件 + * @return excel 文件流 + */ + @ResponseExcel + @GetMapping("/export") + @PreAuthorize("@pms.hasPermission('app_appuserrole_export')") + public List export(AppUserRole appUserRole) { + return appUserRoleService.list(Wrappers.query(appUserRole)); + } + +} diff --git a/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/controller/as/AsApi.java b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/controller/as/AsApi.java new file mode 100644 index 0000000..aea0e43 --- /dev/null +++ b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/controller/as/AsApi.java @@ -0,0 +1,51 @@ +package com.pig4cloud.pigx.app.controller.as; + +import com.pig4cloud.pigx.app.service.as.AsPlatformService; +import com.pig4cloud.pigx.app.service.as.AsSubPayrollService; +import com.pig4cloud.pigx.common.core.util.R; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * AS 公用API + * 注:不需要访问权限 + * 注2:限制请求频次 + * + * @author amigo + * @date 2023-8 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/asApi") +@Tag(description = "AS-public-api", name = "AS-公用API") +//@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class AsApi { + + //传参二进制加密? + + private final AsPlatformService asPlatformService; + private final AsSubPayrollService asSubPayrollService; + + /** + * 获取首页产品、用户订单、评价等 展示信息 + * todo 静态缓存,限流 + * @return + */ + @Operation(summary = "首页产品、订单信息", description = "首页产品、订单信息") + @GetMapping("/indexInfo") + public R indexInfo(){ + +// asPlatformService.getById(); +// AsSubPayroll byId = asSubPayrollService.getById(); + + + return null; + } + + //首页信息 + +} diff --git a/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/controller/as/AsPlatformController.java b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/controller/as/AsPlatformController.java new file mode 100644 index 0000000..aa6dc9c --- /dev/null +++ b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/controller/as/AsPlatformController.java @@ -0,0 +1,69 @@ +package com.pig4cloud.pigx.app.controller.as; + +import com.pig4cloud.pigx.app.api.entity.as.AsPlatform; +import com.pig4cloud.pigx.app.service.as.AsPlatformService; +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.common.log.annotation.SysLog; +import com.pig4cloud.pigx.common.security.annotation.Inner; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpHeaders; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; + +/** + * as 媒体平台 + * + * @author amigo + * @date 2023-7 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/asPlatform") +@Tag(description = "AS platform manage", name = "AS-流媒体平台") +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class AsPlatformController { + + private final AsPlatformService asPlatformService; + + /** + * 新增媒体平台 + * @param asPlatform 媒体平台 + * @return success/false + */ + @Operation(summary = "新增媒体平台", description = "新增媒体平台") + @PostMapping("/save") + public R save(@Valid @RequestBody AsPlatform asPlatform) { + asPlatformService.save(asPlatform); + return R.ok(); + } + + /** + * 返回媒体平台集合 + * @param platType 媒体平台 + * @return 媒体平台集合 + * get -> post + */ + @Inner(value = false) + @Operation(summary = "查询媒体平台", description = "查询媒体平台 0:全部") + @GetMapping("/getPlatform") + public R getPlatform(Integer platType) { + return R.ok(asPlatformService.listAsPlatformByType(platType)); + } + + /** + * 更新媒体平台 + * @param asPlatform + * @return + */ + @SysLog("更新媒体平台") + @Operation(summary = "更新媒体平台", description = "更新媒体平台") + @PutMapping("/update") + public R update(@Valid @RequestBody AsPlatform asPlatform) { + return R.ok(asPlatformService.updateById(asPlatform)); + } + +} diff --git a/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/controller/as/AsPlatformTypeController.java b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/controller/as/AsPlatformTypeController.java new file mode 100644 index 0000000..5760724 --- /dev/null +++ b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/controller/as/AsPlatformTypeController.java @@ -0,0 +1,71 @@ +package com.pig4cloud.pigx.app.controller.as; + +import com.pig4cloud.pigx.app.api.entity.as.AsPlatformType; +import com.pig4cloud.pigx.app.service.as.AsPlatformTypeService; +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.common.log.annotation.SysLog; +import com.pig4cloud.pigx.common.security.annotation.Inner; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpHeaders; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; + +/** + * as 平台类型 + * + * @author amigo + * @date 2023-7 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/asPlatformType") +@Tag(description = "AS-platformType-manage", name = "AS-平台类型") +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class AsPlatformTypeController { + + private final AsPlatformTypeService asPlatformTypeService; + + /** + * 新增订阅计划 + * @param asPlatformType 订阅计划 + * @return success/false + */ + @SysLog("新增平台类型") + @Operation(summary = "新增平台类型", description = "新增平台类型") + @PostMapping("/save") +// @PreAuthorize("@pms.hasPermission('as_subplan_add')") + public R save(@Valid @RequestBody AsPlatformType asPlatformType) { + asPlatformTypeService.save(asPlatformType); + return R.ok(); + } + + /** + * 返回平台类型集合 + * @param platType 平台类型 + * @return 平台类型集合 + * get -> post + */ + @Inner(value = false) + @Operation(summary = "查询平台类型", description = "查询平台类型 0:全部") + @GetMapping("/getPlatformType") + public R getPlatformType(Integer platType) { + return R.ok(asPlatformTypeService.listAsPlatformTypeByType(platType)); + } + + /** + * 更新平台类型 + * @param asPlatformType + * @return + */ + @SysLog("更新平台类型") + @Operation(summary = "更新平台类型", description = "更新平台类型") + @PutMapping("/update") + public R update(@Valid @RequestBody AsPlatformType asPlatformType) { + return R.ok(asPlatformTypeService.updateById(asPlatformType)); + } + +} diff --git a/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/controller/as/AsSubAccountController.java b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/controller/as/AsSubAccountController.java new file mode 100644 index 0000000..e092ad3 --- /dev/null +++ b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/controller/as/AsSubAccountController.java @@ -0,0 +1,42 @@ +package com.pig4cloud.pigx.app.controller.as; + +import com.pig4cloud.pigx.app.service.as.AsSubAccountService; +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.common.security.annotation.Inner; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpHeaders; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * as 订阅账号表 + * + * @author amigo + * @date 2023-8 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/asSubAccount") +@Tag(description = "AS-subAccount-manage", name = "AS-流媒体账号") +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class AsSubAccountController { + + private final AsSubAccountService asSubAccountService; + + //get by userid (前台) 其他条件 平台、订阅付费计划、 时间、 + + @Inner(value = false) + @Operation(summary = "获取订阅账号", description = "获取订阅账号") + @GetMapping("/getSubAccountBy") + public R getSubAccountBy() { +// return R.ok(asSubAccountService.getOne()); +// return R.ok(asSubAccountService.listByMap()); + return null; + } + + +} diff --git a/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/controller/as/AsSubPayrollController.java b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/controller/as/AsSubPayrollController.java new file mode 100644 index 0000000..094f526 --- /dev/null +++ b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/controller/as/AsSubPayrollController.java @@ -0,0 +1,41 @@ +package com.pig4cloud.pigx.app.controller.as; + +import com.pig4cloud.pigx.app.service.as.AsSubPayrollService; +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.common.security.annotation.Inner; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpHeaders; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * as 订阅付费计划 + * + * @author amigo + * @date 2023-8 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/asSubPayroll") +@Tag(description = "AS-subPayroll-manage", name = "AS-订阅付费计划") +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class AsSubPayrollController { + + private final AsSubPayrollService asSubPayrollService; + + /** + * 返回订阅计划集合 + * @param platId 平台id + * @return 订阅计划集合 + */ + @Inner(value = false) + @Operation(summary = "获取订阅计划", description = "获取订阅计划") + @GetMapping("/getSubPayrollBy") + public R getSubPayrollBy(Long platId,String region) { + return R.ok(asSubPayrollService.listByPlatId(platId,region)); + } +} diff --git a/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/controller/as/AsSubPlanController.java b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/controller/as/AsSubPlanController.java new file mode 100644 index 0000000..1359c3c --- /dev/null +++ b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/controller/as/AsSubPlanController.java @@ -0,0 +1,65 @@ +package com.pig4cloud.pigx.app.controller.as; + +import com.pig4cloud.pigx.app.api.entity.as.AsSubPlan; +import com.pig4cloud.pigx.app.service.as.AsSubPlanService; +import com.pig4cloud.pigx.common.core.util.R; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpHeaders; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; + +/** + * as 订阅计划表 + * + * @author amigo + * @date 2023-7 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/asSubPlan") +@Tag(description = "AS-subPlan-manage", name = "AS-流媒体订阅计划") +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class AsSubPlanController { + + private final AsSubPlanService asSubPlanService; + + /** + * 新增订阅计划 + * @param subPlan 订阅计划 + * @return success/false + */ + @Operation(summary = "新增订阅计划", description = "新增订阅计划") + @PostMapping("/save") +// @PreAuthorize("@pms.hasPermission('as_subplan_add')") + public R save(@Valid @RequestBody AsSubPlan subPlan) { + asSubPlanService.save(subPlan); + return R.ok(); + } + + /** + * 返回订阅计划集合 + * @param platId 平台id + * @return 订阅计划集合 + */ + @Operation(summary = "获取订阅计划", description = "获取订阅计划") + @GetMapping("/getSubPlan") + public R getSubPlan(Long platId) { + return R.ok(asSubPlanService.listSubPlanByPlatId(platId)); + } + + /** + * 更新订阅计划 + * @param subPlan + * @return + */ + @Operation(summary = "更新订阅计划", description = "更新订阅计划") + @PutMapping("/update") + public R update(@Valid @RequestBody AsSubPlan subPlan) { + return R.ok(asSubPlanService.updateById(subPlan)); + } + +} diff --git a/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/controller/as/AsSubProductCmtController.java b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/controller/as/AsSubProductCmtController.java new file mode 100644 index 0000000..824ef56 --- /dev/null +++ b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/controller/as/AsSubProductCmtController.java @@ -0,0 +1,26 @@ +package com.pig4cloud.pigx.app.controller.as; + +import com.pig4cloud.pigx.app.service.as.AsSubProductCmtService; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpHeaders; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * as 订阅产品评价 + * + * @author amigo + * @date 2023-9 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/asSubProductCmt") +@Tag(description = "AS-sub-product-comment", name = "AS-订阅产品评价") +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class AsSubProductCmtController { + + private final AsSubProductCmtService asSubProductCmtService; + +} diff --git a/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/controller/as/AsSubProductController.java b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/controller/as/AsSubProductController.java new file mode 100644 index 0000000..59ea3e1 --- /dev/null +++ b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/controller/as/AsSubProductController.java @@ -0,0 +1,26 @@ +package com.pig4cloud.pigx.app.controller.as; + +import com.pig4cloud.pigx.app.service.as.AsSubProductService; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpHeaders; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * as 订阅产品 + * + * @author amigo + * @date 2023-9 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/asSubProduct") +@Tag(description = "AS-sub-product", name = "AS-订阅产品") +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class AsSubProductController { + + private final AsSubProductService asSubProductService; + +} diff --git a/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/controller/as/AsUserSubController.java b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/controller/as/AsUserSubController.java new file mode 100644 index 0000000..97dc9b1 --- /dev/null +++ b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/controller/as/AsUserSubController.java @@ -0,0 +1,45 @@ +package com.pig4cloud.pigx.app.controller.as; + +import com.pig4cloud.pigx.app.service.as.AsUserSubService; +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.common.security.annotation.Inner; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpHeaders; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * as 用户订阅 + * + * @author amigo + * @date 2023-7 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/asUserSub") +@Tag(description = "AS-sub-manage", name = "AS-订阅") +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class AsUserSubController { + + //init first page ? + + private final AsUserSubService asUserSubService; + + /** + * 获取订阅人数 + * 根据平台类型查询总订阅人数 、 新增至redis + */ + @Inner(value = false) + @Operation(summary = "获取订阅人数", description = "获取订阅人数") + @GetMapping("/getSubCount") + public R getSubCount(){ + return R.ok(); + } + + + +} diff --git a/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/handler/AbstractLoginHandler.java b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/handler/AbstractLoginHandler.java new file mode 100644 index 0000000..0fb00dc --- /dev/null +++ b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/handler/AbstractLoginHandler.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.app.handler; + +import com.pig4cloud.pigx.app.api.dto.AppUserInfo; + +/** + * @author lengleng + * @date 2018/11/18 + */ +public abstract class AbstractLoginHandler implements LoginHandler { + + /*** + * 数据合法性校验 + * @param loginStr 通过用户传入获取唯一标识 + * @return 默认不校验 + */ + @Override + public Boolean check(String loginStr) { + return true; + } + + /** + * 处理方法 + * @param loginStr 登录参数 + * @return + */ + @Override + public AppUserInfo handle(String loginStr) { + if (!check(loginStr)) { + return null; + } + + String identify = identify(loginStr); + return info(identify); + } + +} diff --git a/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/handler/LoginHandler.java b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/handler/LoginHandler.java new file mode 100644 index 0000000..68e00b9 --- /dev/null +++ b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/handler/LoginHandler.java @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.app.handler; + +import com.pig4cloud.pigx.app.api.dto.AppUserInfo; +import com.pig4cloud.pigx.app.api.entity.AppUser; + +/** + * @author lengleng + * @date 2018/11/18 + *

+ * 登录处理器 + */ +public interface LoginHandler { + + /*** + * 数据合法性校验 + * @param loginStr 通过用户传入获取唯一标识 + * @return + */ + Boolean check(String loginStr); + + /** + * 通过用户传入获取唯一标识 + * @param loginStr + * @return + */ + String identify(String loginStr); + + /** + * 通过openId 获取用户信息 + * @param identify + * @return + */ + AppUserInfo info(String identify); + + /** + * 处理方法 + * @param loginStr 登录参数 + * @return + */ + AppUserInfo handle(String loginStr); + + /** + * 绑定逻辑 + * @param user 用户实体 + * @param identify 渠道返回唯一标识 + * @return + */ + default Boolean bind(AppUser user, String identify) { + return false; + } + +} diff --git a/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/handler/MiniAppLoginHandler.java b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/handler/MiniAppLoginHandler.java new file mode 100644 index 0000000..460b51b --- /dev/null +++ b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/handler/MiniAppLoginHandler.java @@ -0,0 +1,112 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.app.handler; + +import cn.hutool.http.HttpUtil; +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.pig4cloud.pigx.app.api.dto.AppUserInfo; +import com.pig4cloud.pigx.app.api.entity.AppSocialDetails; +import com.pig4cloud.pigx.app.api.entity.AppUser; +import com.pig4cloud.pigx.app.mapper.AppSocialDetailsMapper; +import com.pig4cloud.pigx.app.service.AppUserService; +import com.pig4cloud.pigx.common.core.constant.SecurityConstants; +import com.pig4cloud.pigx.common.core.constant.enums.LoginTypeEnum; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +/** + * @author lengleng + * @date 2019年11月02日 + *

+ * 微信小程序 + */ +@Slf4j +@Component("APP-MINI") +@AllArgsConstructor +public class MiniAppLoginHandler extends AbstractLoginHandler { + + private final AppUserService appUserService; + + private final AppSocialDetailsMapper appSocialDetailsMapper; + + /** + * 小程序登录传入code + *

+ * 通过code 调用qq 获取唯一标识 + * @param code + * @return + */ + @Override + public String identify(String code) { + AppSocialDetails condition = new AppSocialDetails(); + condition.setType(LoginTypeEnum.MINI_APP.getType()); + AppSocialDetails socialDetails = appSocialDetailsMapper.selectOne(new QueryWrapper<>(condition)); + + String url = String.format(SecurityConstants.MINI_APP_AUTHORIZATION_CODE_URL, socialDetails.getAppId(), + socialDetails.getAppSecret(), code); + String result = HttpUtil.get(url); + log.debug("微信小程序响应报文:{}", result); + + Object obj = JSONUtil.parseObj(result).get("openid"); + return obj.toString(); + } + + /** + * openId 获取用户信息 + * @param openId + * @return + */ + @Override + public AppUserInfo info(String openId) { + AppUser user = appUserService.getOne(Wrappers.query().lambda().eq(AppUser::getWxOpenid, openId)); + + if (user == null) { + log.info("微信小程序未绑定:{},创建新的用户", openId); + return createAndSaveAppUserInfo(openId); + } + return appUserService.findUserInfo(user); + } + + /** + * 绑定逻辑 + * @param user 用户实体 + * @param identify 渠道返回唯一标识 + * @return + */ + @Override + public Boolean bind(AppUser user, String identify) { + user.setWxOpenid(identify); + appUserService.updateById(user); + return true; + } + + private AppUserInfo createAndSaveAppUserInfo(String openId) { + AppUser appUser = new AppUser(); + appUser.setWxOpenid(openId); + appUser.setUsername(openId); + appUserService.saveOrUpdate(appUser, Wrappers.lambdaQuery().eq(AppUser::getUsername, openId)); + + AppUserInfo appUserDTO = new AppUserInfo(); + appUserDTO.setAppUser(appUser); + return appUserDTO; + } + +} diff --git a/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/handler/SmsLoginHandler.java b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/handler/SmsLoginHandler.java new file mode 100644 index 0000000..30722a6 --- /dev/null +++ b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/handler/SmsLoginHandler.java @@ -0,0 +1,94 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.app.handler; + +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.pig4cloud.pigx.app.api.dto.AppUserInfo; +import com.pig4cloud.pigx.app.api.entity.AppUser; +import com.pig4cloud.pigx.app.service.AppUserService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +/** + * @author lengleng + * @date 2018/11/18 + */ +@Slf4j +@Component("APP-SMS") +@AllArgsConstructor +public class SmsLoginHandler extends AbstractLoginHandler { + + private final AppUserService appUserService; + + /** + * 验证码登录传入为手机号 不用不处理 + * @param mobile + * @return + */ + @Override + public String identify(String mobile) { + return mobile; + } + + /** + * 通过mobile 获取用户信息 + * @param identify + * @return + */ + @Override + public AppUserInfo info(String identify) { + AppUser user = appUserService.getOne(Wrappers.query().lambda().eq(AppUser::getPhone, identify)); + + if (user == null) { + log.info("手机号未注册:{}", identify); + return createAndSaveAppUserInfo(identify); + } + return appUserService.findUserInfo(user); + } + + /** + * 创建并插入用户 + * @param identify + * @return + */ + private AppUserInfo createAndSaveAppUserInfo(String phone) { + AppUser appUser = new AppUser(); + appUser.setUsername(phone); + appUser.setPhone(phone); + appUserService.saveOrUpdate(appUser, Wrappers.lambdaQuery().eq(AppUser::getPhone, phone)); + + AppUserInfo appUserDTO = new AppUserInfo(); + appUserDTO.setAppUser(appUser); + return appUserDTO; + } + + /** + * 绑定逻辑 + * @param user 用户实体 + * @param identify 渠道返回唯一标识 + * @return + */ + @Override + public Boolean bind(AppUser user, String identify) { + user.setPhone(identify); + appUserService.updateById(user); + return true; + } + +} diff --git a/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/mapper/AppArticleCategoryMapper.java b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/mapper/AppArticleCategoryMapper.java new file mode 100644 index 0000000..75bb6af --- /dev/null +++ b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/mapper/AppArticleCategoryMapper.java @@ -0,0 +1,10 @@ +package com.pig4cloud.pigx.app.mapper; + +import com.pig4cloud.pigx.app.api.entity.AppArticleCategoryEntity; +import com.pig4cloud.pigx.common.data.datascope.PigxBaseMapper; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface AppArticleCategoryMapper extends PigxBaseMapper { + +} diff --git a/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/mapper/AppArticleCollectMapper.java b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/mapper/AppArticleCollectMapper.java new file mode 100644 index 0000000..0307bc4 --- /dev/null +++ b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/mapper/AppArticleCollectMapper.java @@ -0,0 +1,10 @@ +package com.pig4cloud.pigx.app.mapper; + +import com.pig4cloud.pigx.app.api.entity.AppArticleCollectEntity; +import com.pig4cloud.pigx.common.data.datascope.PigxBaseMapper; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface AppArticleCollectMapper extends PigxBaseMapper { + +} diff --git a/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/mapper/AppArticleMapper.java b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/mapper/AppArticleMapper.java new file mode 100644 index 0000000..5e89b15 --- /dev/null +++ b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/mapper/AppArticleMapper.java @@ -0,0 +1,10 @@ +package com.pig4cloud.pigx.app.mapper; + +import com.pig4cloud.pigx.app.api.entity.AppArticleEntity; +import com.pig4cloud.pigx.common.data.datascope.PigxBaseMapper; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface AppArticleMapper extends PigxBaseMapper { + +} diff --git a/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/mapper/AppPageMapper.java b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/mapper/AppPageMapper.java new file mode 100644 index 0000000..cae9560 --- /dev/null +++ b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/mapper/AppPageMapper.java @@ -0,0 +1,10 @@ +package com.pig4cloud.pigx.app.mapper; + +import com.pig4cloud.pigx.app.api.entity.AppPageEntity; +import com.pig4cloud.pigx.common.data.datascope.PigxBaseMapper; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface AppPageMapper extends PigxBaseMapper { + +} diff --git a/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/mapper/AppRoleMapper.java b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/mapper/AppRoleMapper.java new file mode 100644 index 0000000..27b9903 --- /dev/null +++ b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/mapper/AppRoleMapper.java @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.app.mapper; + +import com.pig4cloud.pigx.app.api.entity.AppRole; +import com.pig4cloud.pigx.common.data.datascope.PigxBaseMapper; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * app角色表 + * + * @author aeizzz + * @date 2022-12-07 09:52:03 + */ +@Mapper +public interface AppRoleMapper extends PigxBaseMapper { + + List listRolesByUserId(Long userId); + +} diff --git a/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/mapper/AppSocialDetailsMapper.java b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/mapper/AppSocialDetailsMapper.java new file mode 100644 index 0000000..90371e0 --- /dev/null +++ b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/mapper/AppSocialDetailsMapper.java @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.app.mapper; + +import com.pig4cloud.pigx.app.api.entity.AppSocialDetails; +import com.pig4cloud.pigx.common.data.datascope.PigxBaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + * 系统社交登录账号表 + * + * @author lengleng + * @date 2018-08-16 21:30:41 + */ +@Mapper +public interface AppSocialDetailsMapper extends PigxBaseMapper { + +} diff --git a/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/mapper/AppTabbarMapper.java b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/mapper/AppTabbarMapper.java new file mode 100644 index 0000000..a116fd6 --- /dev/null +++ b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/mapper/AppTabbarMapper.java @@ -0,0 +1,10 @@ +package com.pig4cloud.pigx.app.mapper; + +import com.pig4cloud.pigx.app.api.entity.AppTabbarEntity; +import com.pig4cloud.pigx.common.data.datascope.PigxBaseMapper; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface AppTabbarMapper extends PigxBaseMapper { + +} diff --git a/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/mapper/AppUserMapper.java b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/mapper/AppUserMapper.java new file mode 100644 index 0000000..9587f14 --- /dev/null +++ b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/mapper/AppUserMapper.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.app.mapper; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.pig4cloud.pigx.app.api.dto.AppUserDTO; +import com.pig4cloud.pigx.app.api.entity.AppUser; +import com.pig4cloud.pigx.app.api.vo.AppUserVO; +import com.pig4cloud.pigx.common.data.datascope.PigxBaseMapper; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +/** + * app用户表 + * + * @author aeizzz + * @date 2022-12-07 09:52:03 + */ +@Mapper +public interface AppUserMapper extends PigxBaseMapper { + + IPage getUserVosPage(Page page, @Param("query") AppUserDTO appUserDTO); + + AppUserVO getUserVoById(Long userId); + +} diff --git a/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/mapper/AppUserRoleMapper.java b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/mapper/AppUserRoleMapper.java new file mode 100644 index 0000000..b4493b9 --- /dev/null +++ b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/mapper/AppUserRoleMapper.java @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.app.mapper; + +import com.pig4cloud.pigx.app.api.entity.AppUserRole; +import com.pig4cloud.pigx.common.data.datascope.PigxBaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + * 用户角色表 + * + * @author aeizzz + * @date 2022-12-07 09:52:03 + */ +@Mapper +public interface AppUserRoleMapper extends PigxBaseMapper { + +} diff --git a/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/mapper/as/AsPlatformMapper.java b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/mapper/as/AsPlatformMapper.java new file mode 100644 index 0000000..2614c11 --- /dev/null +++ b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/mapper/as/AsPlatformMapper.java @@ -0,0 +1,18 @@ +package com.pig4cloud.pigx.app.mapper.as; + +import com.pig4cloud.pigx.app.api.entity.as.AsPlatform; +import com.pig4cloud.pigx.common.data.datascope.PigxBaseMapper; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * 媒体平台 + * + * @author amigo + * @date 2023-07 + */ +@Mapper +public interface AsPlatformMapper extends PigxBaseMapper { + List listAsPlatformByType(Integer platformType); +} diff --git a/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/mapper/as/AsPlatformTypeMapper.java b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/mapper/as/AsPlatformTypeMapper.java new file mode 100644 index 0000000..44eb178 --- /dev/null +++ b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/mapper/as/AsPlatformTypeMapper.java @@ -0,0 +1,18 @@ +package com.pig4cloud.pigx.app.mapper.as; + +import com.pig4cloud.pigx.app.api.entity.as.AsPlatformType; +import com.pig4cloud.pigx.common.data.datascope.PigxBaseMapper; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * 平台类型 + * + * @author amigo + * @date 2023-07 + */ +@Mapper +public interface AsPlatformTypeMapper extends PigxBaseMapper { + List listAsPlatformTypeByType(Integer platformType); +} diff --git a/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/mapper/as/AsSubAccountMapper.java b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/mapper/as/AsSubAccountMapper.java new file mode 100644 index 0000000..c1ecd29 --- /dev/null +++ b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/mapper/as/AsSubAccountMapper.java @@ -0,0 +1,15 @@ +package com.pig4cloud.pigx.app.mapper.as; + +import com.pig4cloud.pigx.app.api.entity.as.AsSubAccount; +import com.pig4cloud.pigx.common.data.datascope.PigxBaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + * 订阅计划 + * + * @author amigo + * @date 2023-08 + */ +@Mapper +public interface AsSubAccountMapper extends PigxBaseMapper { +} diff --git a/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/mapper/as/AsSubPayrollMapper.java b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/mapper/as/AsSubPayrollMapper.java new file mode 100644 index 0000000..401fd22 --- /dev/null +++ b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/mapper/as/AsSubPayrollMapper.java @@ -0,0 +1,19 @@ +package com.pig4cloud.pigx.app.mapper.as; + +import com.pig4cloud.pigx.app.api.entity.as.AsSubPayroll; +import com.pig4cloud.pigx.common.data.datascope.PigxBaseMapper; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 订阅付费计划 + * + * @author amigo + * @date 2023-08 + */ +@Mapper +public interface AsSubPayrollMapper extends PigxBaseMapper { + List listByPlatId(@Param("platId")Long platId, @Param("region")String region); +} diff --git a/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/mapper/as/AsSubPlanMapper.java b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/mapper/as/AsSubPlanMapper.java new file mode 100644 index 0000000..a74f458 --- /dev/null +++ b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/mapper/as/AsSubPlanMapper.java @@ -0,0 +1,18 @@ +package com.pig4cloud.pigx.app.mapper.as; + +import com.pig4cloud.pigx.app.api.entity.as.AsSubPlan; +import com.pig4cloud.pigx.common.data.datascope.PigxBaseMapper; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * 订阅计划 + * + * @author amigo + * @date 2023-07 + */ +@Mapper +public interface AsSubPlanMapper extends PigxBaseMapper { + List listSubPlanByPlatId(Long platId); +} diff --git a/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/mapper/as/AsSubProductCommentMapper.java b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/mapper/as/AsSubProductCommentMapper.java new file mode 100644 index 0000000..98bc247 --- /dev/null +++ b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/mapper/as/AsSubProductCommentMapper.java @@ -0,0 +1,16 @@ +package com.pig4cloud.pigx.app.mapper.as; + +import com.pig4cloud.pigx.app.api.entity.as.AsSubProductComment; +import com.pig4cloud.pigx.common.data.datascope.PigxBaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + * 媒体平台 + * + * @author amigo + * @date 2023-09 + */ +@Mapper +public interface AsSubProductCommentMapper extends PigxBaseMapper { + +} diff --git a/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/mapper/as/AsSubProductMapper.java b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/mapper/as/AsSubProductMapper.java new file mode 100644 index 0000000..69bb77c --- /dev/null +++ b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/mapper/as/AsSubProductMapper.java @@ -0,0 +1,15 @@ +package com.pig4cloud.pigx.app.mapper.as; + +import com.pig4cloud.pigx.app.api.entity.as.AsSubProduct; +import com.pig4cloud.pigx.common.data.datascope.PigxBaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + * 媒体平台 + * + * @author amigo + * @date 2023-09 + */ +@Mapper +public interface AsSubProductMapper extends PigxBaseMapper { +} diff --git a/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/mapper/as/AsUserSubMapper.java b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/mapper/as/AsUserSubMapper.java new file mode 100644 index 0000000..1473a70 --- /dev/null +++ b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/mapper/as/AsUserSubMapper.java @@ -0,0 +1,18 @@ +package com.pig4cloud.pigx.app.mapper.as; + +import com.pig4cloud.pigx.app.api.entity.as.AsUserSub; +import com.pig4cloud.pigx.common.data.datascope.PigxBaseMapper; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * 用户订阅 + * + * @author amigo + * @date 2023-07 + */ +@Mapper +public interface AsUserSubMapper extends PigxBaseMapper { + List listSubPlanById(Long id); +} diff --git a/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/AppArticleCategoryService.java b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/AppArticleCategoryService.java new file mode 100644 index 0000000..09b9e03 --- /dev/null +++ b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/AppArticleCategoryService.java @@ -0,0 +1,8 @@ +package com.pig4cloud.pigx.app.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.pig4cloud.pigx.app.api.entity.AppArticleCategoryEntity; + +public interface AppArticleCategoryService extends IService { + +} diff --git a/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/AppArticleCollectService.java b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/AppArticleCollectService.java new file mode 100644 index 0000000..1a77313 --- /dev/null +++ b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/AppArticleCollectService.java @@ -0,0 +1,10 @@ +package com.pig4cloud.pigx.app.service; + +import com.github.yulichang.base.MPJBaseService; +import com.pig4cloud.pigx.app.api.entity.AppArticleCollectEntity; + +public interface AppArticleCollectService extends MPJBaseService { + + Boolean saveArticleCollect(AppArticleCollectEntity appArticleCollect); + +} diff --git a/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/AppArticleService.java b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/AppArticleService.java new file mode 100644 index 0000000..cb42716 --- /dev/null +++ b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/AppArticleService.java @@ -0,0 +1,24 @@ +package com.pig4cloud.pigx.app.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.pig4cloud.pigx.app.api.entity.AppArticleEntity; + +public interface AppArticleService extends IService { + + /** + * 获取文章并使阅读数+1 + * @param id id + * @return + */ + AppArticleEntity getArticleAndIncrById(Long id, Long userId); + + /** + * 分页查询文章列表 包含分类名称 + * @param page 分页参数 + * @param appArticle 文章查询条件 + * @return + */ + Page pageAndCname(Page page, AppArticleEntity appArticle); + +} diff --git a/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/AppIndexService.java b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/AppIndexService.java new file mode 100644 index 0000000..29a9430 --- /dev/null +++ b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/AppIndexService.java @@ -0,0 +1,33 @@ +package com.pig4cloud.pigx.app.service; + +import com.pig4cloud.pigx.app.api.entity.AppPageEntity; + +import java.util.Map; + +/** + * app 页面控制 + * + * @author lengleng + * @date 2023/6/8 + */ +public interface AppIndexService { + + /** + * 首页 + */ + Map index(); + + /** + * 配置 + * @return Map + */ + Map config(); + + /** + * 装修 + * @param id 装修ID + * @return Map + */ + AppPageEntity decorate(Integer id); + +} diff --git a/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/AppMobileService.java b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/AppMobileService.java new file mode 100644 index 0000000..4b588d1 --- /dev/null +++ b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/AppMobileService.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.app.service; + +import com.pig4cloud.pigx.common.core.util.R; + +/** + * @author lengleng + * @date 2018/11/14 + */ +public interface AppMobileService { + + /** + * 发送手机验证码 + * @param mobile mobile + * @return code + */ + R sendSmsCode(String mobile); + +} diff --git a/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/AppPageService.java b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/AppPageService.java new file mode 100644 index 0000000..33f5e19 --- /dev/null +++ b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/AppPageService.java @@ -0,0 +1,8 @@ +package com.pig4cloud.pigx.app.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.pig4cloud.pigx.app.api.entity.AppPageEntity; + +public interface AppPageService extends IService { + +} diff --git a/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/AppRoleService.java b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/AppRoleService.java new file mode 100644 index 0000000..21fa4c4 --- /dev/null +++ b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/AppRoleService.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.app.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.pig4cloud.pigx.app.api.entity.AppRole; +import com.pig4cloud.pigx.app.api.vo.AppRoleExcelVO; +import com.pig4cloud.pigx.common.core.util.R; +import org.springframework.validation.BindingResult; + +import java.util.List; + +/** + * app角色表 + * + * @author aeizzz + * @date 2022-12-07 09:52:03 + */ +public interface AppRoleService extends IService { + + List findRolesByUserId(Long userId); + + /** + * 删除用户的同时,把role_menu关系删除 + * @param ids RoleIds + */ + Boolean deleteRoleByIds(Long[] ids); + + R importRole(List excelVOList, BindingResult bindingResult); + +} diff --git a/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/AppSocialDetailsService.java b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/AppSocialDetailsService.java new file mode 100644 index 0000000..11b788f --- /dev/null +++ b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/AppSocialDetailsService.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.app.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.pig4cloud.pigx.app.api.dto.AppUserInfo; +import com.pig4cloud.pigx.app.api.entity.AppSocialDetails; + +/** + * 系统社交登录账号表 + * + * @author lengleng + * @date 2018-08-16 21:30:41 + */ +public interface AppSocialDetailsService extends IService { + + /** + * 绑定社交账号 + * @param state 类型 + * @param code code + * @return + */ + Boolean bindSocial(String state, String code); + + /** + * 根据入参查询用户信息 + * @param inStr + * @return + */ + AppUserInfo getUserInfo(String inStr); + +} diff --git a/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/AppTabbarService.java b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/AppTabbarService.java new file mode 100644 index 0000000..5c62cc9 --- /dev/null +++ b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/AppTabbarService.java @@ -0,0 +1,8 @@ +package com.pig4cloud.pigx.app.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.pig4cloud.pigx.app.api.entity.AppTabbarEntity; + +public interface AppTabbarService extends IService { + +} diff --git a/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/AppUserRoleService.java b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/AppUserRoleService.java new file mode 100644 index 0000000..7d16792 --- /dev/null +++ b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/AppUserRoleService.java @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.app.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.pig4cloud.pigx.app.api.entity.AppUserRole; + +/** + * 用户角色表 + * + * @author aeizzz + * @date 2022-12-07 09:52:03 + */ +public interface AppUserRoleService extends IService { + +} diff --git a/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/AppUserService.java b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/AppUserService.java new file mode 100644 index 0000000..54fd025 --- /dev/null +++ b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/AppUserService.java @@ -0,0 +1,46 @@ +package com.pig4cloud.pigx.app.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.pig4cloud.pigx.app.api.dto.AppUserDTO; +import com.pig4cloud.pigx.app.api.dto.AppUserInfo; +import com.pig4cloud.pigx.app.api.entity.AppUser; +import com.pig4cloud.pigx.app.api.vo.AppUserExcelVO; +import com.pig4cloud.pigx.app.api.vo.AppUserVO; +import com.pig4cloud.pigx.common.core.util.R; +import org.springframework.validation.BindingResult; + +import java.util.List; + +/** + * app用户表 + * + * @author aeizzz + * @date 2022-12-07 09:52:03 + */ +public interface AppUserService extends IService { + + Boolean regUser(AppUserDTO appUser); + + Boolean updateUser(AppUserDTO appUser); + + Boolean saveUser(AppUserDTO appUser); + + List listUser(AppUserDTO appUser); + + IPage getUsersWithRolePage(Page page, AppUserDTO appUserDTO); + + AppUserInfo findUserInfo(AppUser user); + + R updateUserInfo(AppUserDTO userDto); + + AppUserVO selectUserVoById(Long userId); + + Boolean deleteAppUserByIds(Long[] ids); + + R importUser(List excelVOList, BindingResult bindingResult); + + R registerAppUser(AppUserDTO appUser); + +} diff --git a/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/as/AsPlatformService.java b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/as/AsPlatformService.java new file mode 100644 index 0000000..0b1f798 --- /dev/null +++ b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/as/AsPlatformService.java @@ -0,0 +1,18 @@ +package com.pig4cloud.pigx.app.service.as; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.pig4cloud.pigx.app.api.entity.as.AsPlatform; + +import java.util.List; + +/** + * As 媒体平台 + * + * @author amigo + * @date 2023-07 + */ +public interface AsPlatformService extends IService { + + List listAsPlatformByType(Integer platformType); + +} diff --git a/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/as/AsPlatformTypeService.java b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/as/AsPlatformTypeService.java new file mode 100644 index 0000000..820f6a2 --- /dev/null +++ b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/as/AsPlatformTypeService.java @@ -0,0 +1,22 @@ +package com.pig4cloud.pigx.app.service.as; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.pig4cloud.pigx.app.api.entity.as.AsPlatformType; + +import java.util.List; + +/** + * As 媒体平台 + * + * @author amigo + * @date 2023-07 + */ +public interface AsPlatformTypeService extends IService { + + List listAsPlatformTypeByType(Integer platformType); + +// R removePlatformTypeById(Long id); + +// Boolean updatePlatformTypeById(AsPlatformType asPlatformType); + +} diff --git a/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/as/AsSubAccountService.java b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/as/AsSubAccountService.java new file mode 100644 index 0000000..da20022 --- /dev/null +++ b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/as/AsSubAccountService.java @@ -0,0 +1,14 @@ +package com.pig4cloud.pigx.app.service.as; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.pig4cloud.pigx.app.api.entity.as.AsSubAccount; + +/** + * 订阅账号表 + * + * @author amigo + * @date 2023-08 + */ +public interface AsSubAccountService extends IService { + +} diff --git a/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/as/AsSubPayrollService.java b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/as/AsSubPayrollService.java new file mode 100644 index 0000000..812b45e --- /dev/null +++ b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/as/AsSubPayrollService.java @@ -0,0 +1,23 @@ +package com.pig4cloud.pigx.app.service.as; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.pig4cloud.pigx.app.api.entity.as.AsSubPayroll; + +import java.util.List; + +/** + * 订阅付费计划 + * + * @author amigo + * @date 2023-08 + */ +public interface AsSubPayrollService extends IService { + + /** + * 通过平台Id查询订阅列表 + * @param platId 平台ID + * @return 订阅列表 + */ + List listByPlatId(Long platId, String region); + +} diff --git a/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/as/AsSubPlanService.java b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/as/AsSubPlanService.java new file mode 100644 index 0000000..b62cf91 --- /dev/null +++ b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/as/AsSubPlanService.java @@ -0,0 +1,53 @@ +package com.pig4cloud.pigx.app.service.as; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.pig4cloud.pigx.app.api.entity.as.AsSubPlan; + +import java.util.List; + +/** + * AsSubPlan + * + * @author amigo + * @date 2023-07 + */ +public interface AsSubPlanService extends IService { + + /** + * 通过平台Id查询订阅列表 + * @param platId 平台ID + * @return 订阅列表 + */ + List listSubPlanByPlatId(Long platId); + + /** + * 级联删除订阅 + * @param id 订阅ID + * @return 成功、失败 + */ +// R removeSubPlanById(Long id); + + /** + * 更新订阅信息 + * @param subPlan 订阅信息 + * @return 成功、失败 + */ +// Boolean updateSubPlanById(AsSubPlan subPlan); + + /** + * 构建树 + * @param parentId 父节点ID + * @param subPlanName 订阅名称 + * @return + */ +// List> treeSubPlan(Long parentId, String subPlanName); + + /** + * 查询订阅 + * @param voSet + * @param parentId + * @return + */ +// List> filterSubPlan(Set voSet, String type, Long parentId); + +} diff --git a/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/as/AsSubProductCmtService.java b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/as/AsSubProductCmtService.java new file mode 100644 index 0000000..9e85884 --- /dev/null +++ b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/as/AsSubProductCmtService.java @@ -0,0 +1,12 @@ +package com.pig4cloud.pigx.app.service.as; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.pig4cloud.pigx.app.api.entity.as.AsSubProductComment; + +/** + * @author amigo + * @date 2023-09 + */ +public interface AsSubProductCmtService extends IService { + +} diff --git a/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/as/AsSubProductService.java b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/as/AsSubProductService.java new file mode 100644 index 0000000..8c67f97 --- /dev/null +++ b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/as/AsSubProductService.java @@ -0,0 +1,12 @@ +package com.pig4cloud.pigx.app.service.as; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.pig4cloud.pigx.app.api.entity.as.AsSubProduct; + +/** + * @author amigo + * @date 2023-09 + */ +public interface AsSubProductService extends IService { + +} diff --git a/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/as/AsUserSubService.java b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/as/AsUserSubService.java new file mode 100644 index 0000000..16e773d --- /dev/null +++ b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/as/AsUserSubService.java @@ -0,0 +1,53 @@ +package com.pig4cloud.pigx.app.service.as; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.pig4cloud.pigx.app.api.entity.as.AsUserSub; + +import java.util.List; + +/** + * AsSubPlan + * + * @author amigo + * @date 2023-07 + */ +public interface AsUserSubService extends IService { + + /** + * 通过平台Id查询订阅列表 + * @param id 平台ID + * @return 订阅列表 + */ + List listSubPlanById(Long id); + + /** + * 级联删除订阅 + * @param id 订阅ID + * @return 成功、失败 + */ +// R removeSubPlanById(Long id); + + /** + * 更新订阅信息 + * @param subPlan 订阅信息 + * @return 成功、失败 + */ +// Boolean updateSubPlanById(AsSubPlan subPlan); + + /** + * 构建树 + * @param parentId 父节点ID + * @param subPlanName 订阅名称 + * @return + */ +// List> treeSubPlan(Long parentId, String subPlanName); + + /** + * 查询订阅 + * @param voSet + * @param parentId + * @return + */ +// List> filterSubPlan(Set voSet, String type, Long parentId); + +} diff --git a/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/as/impl/AsPlatformServiceImpl.java b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/as/impl/AsPlatformServiceImpl.java new file mode 100644 index 0000000..323343a --- /dev/null +++ b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/as/impl/AsPlatformServiceImpl.java @@ -0,0 +1,29 @@ +package com.pig4cloud.pigx.app.service.as.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.pig4cloud.pigx.app.api.entity.as.AsPlatform; +import com.pig4cloud.pigx.app.mapper.as.AsPlatformMapper; +import com.pig4cloud.pigx.app.service.as.AsPlatformService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * as 媒体平台 + * + * @author amigo + * @date 2023-07 + */ +@Service +@AllArgsConstructor +@Slf4j +public class AsPlatformServiceImpl extends ServiceImpl implements AsPlatformService { + + @Override + public List listAsPlatformByType(Integer platformType) { + return baseMapper.listAsPlatformByType(platformType); + } + +} diff --git a/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/as/impl/AsPlatformTypeServiceImpl.java b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/as/impl/AsPlatformTypeServiceImpl.java new file mode 100644 index 0000000..23e2a07 --- /dev/null +++ b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/as/impl/AsPlatformTypeServiceImpl.java @@ -0,0 +1,33 @@ +package com.pig4cloud.pigx.app.service.as.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.pig4cloud.pigx.app.api.entity.as.AsPlatformType; +import com.pig4cloud.pigx.app.mapper.as.AsPlatformTypeMapper; +import com.pig4cloud.pigx.app.service.as.AsPlatformTypeService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * as 平台类型 + * + * @author amigo + * @date 2023-07 + */ +@Service +@AllArgsConstructor +@Slf4j +public class AsPlatformTypeServiceImpl extends ServiceImpl implements AsPlatformTypeService { + + @Override + public List listAsPlatformTypeByType(Integer platformType) { + return baseMapper.listAsPlatformTypeByType(platformType); + } + +// R removePlatformTypeById(Long id); + +// Boolean updatePlatformTypeById(AsPlatformType asPlatformType); + +} diff --git a/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/as/impl/AsSubAccountServiceImpl.java b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/as/impl/AsSubAccountServiceImpl.java new file mode 100644 index 0000000..f7464ca --- /dev/null +++ b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/as/impl/AsSubAccountServiceImpl.java @@ -0,0 +1,22 @@ +package com.pig4cloud.pigx.app.service.as.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.pig4cloud.pigx.app.api.entity.as.AsSubAccount; +import com.pig4cloud.pigx.app.mapper.as.AsSubAccountMapper; +import com.pig4cloud.pigx.app.service.as.AsSubAccountService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +/** + * as 订阅账号表 + * + * @author amigo + * @date 2023-08 + */ +@Service +@AllArgsConstructor +@Slf4j +public class AsSubAccountServiceImpl extends ServiceImpl implements AsSubAccountService { + +} diff --git a/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/as/impl/AsSubPayrollServiceImpl.java b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/as/impl/AsSubPayrollServiceImpl.java new file mode 100644 index 0000000..5ede8c7 --- /dev/null +++ b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/as/impl/AsSubPayrollServiceImpl.java @@ -0,0 +1,28 @@ +package com.pig4cloud.pigx.app.service.as.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.pig4cloud.pigx.app.api.entity.as.AsSubPayroll; +import com.pig4cloud.pigx.app.mapper.as.AsSubPayrollMapper; +import com.pig4cloud.pigx.app.service.as.AsSubPayrollService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * as 订阅付费计划表 + * + * @author amigo + * @date 2023-08 + */ +@Service +@AllArgsConstructor +@Slf4j +public class AsSubPayrollServiceImpl extends ServiceImpl implements AsSubPayrollService { + + @Override + public List listByPlatId(Long platId,String region) { + return baseMapper.listByPlatId(platId,region); + } +} diff --git a/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/as/impl/AsSubPlanServiceImpl.java b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/as/impl/AsSubPlanServiceImpl.java new file mode 100644 index 0000000..df32743 --- /dev/null +++ b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/as/impl/AsSubPlanServiceImpl.java @@ -0,0 +1,30 @@ +package com.pig4cloud.pigx.app.service.as.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.pig4cloud.pigx.app.api.entity.as.AsSubPlan; +import com.pig4cloud.pigx.app.mapper.as.AsSubPlanMapper; +import com.pig4cloud.pigx.app.service.as.AsSubPlanService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * as 订阅计划表 + * + * @author amigo + * @date 2023-07 + */ +@Service +@AllArgsConstructor +@Slf4j +public class AsSubPlanServiceImpl extends ServiceImpl implements AsSubPlanService { + +// private final AsSubPlanMapper asSubPlanMapper; + + @Override + public List listSubPlanByPlatId(Long platId) { + return baseMapper.listSubPlanByPlatId(platId); + } +} diff --git a/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/as/impl/AsSubProductCmtServiceImpl.java b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/as/impl/AsSubProductCmtServiceImpl.java new file mode 100644 index 0000000..087bdad --- /dev/null +++ b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/as/impl/AsSubProductCmtServiceImpl.java @@ -0,0 +1,20 @@ +package com.pig4cloud.pigx.app.service.as.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.pig4cloud.pigx.app.api.entity.as.AsSubProductComment; +import com.pig4cloud.pigx.app.mapper.as.AsSubProductCommentMapper; +import com.pig4cloud.pigx.app.service.as.AsSubProductCmtService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +/** + * @author amigo + * @date 2023-09 + */ +@Service +@AllArgsConstructor +@Slf4j +public class AsSubProductCmtServiceImpl extends ServiceImpl implements AsSubProductCmtService { + +} diff --git a/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/as/impl/AsSubProductServiceImpl.java b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/as/impl/AsSubProductServiceImpl.java new file mode 100644 index 0000000..3952011 --- /dev/null +++ b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/as/impl/AsSubProductServiceImpl.java @@ -0,0 +1,20 @@ +package com.pig4cloud.pigx.app.service.as.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.pig4cloud.pigx.app.api.entity.as.AsSubProduct; +import com.pig4cloud.pigx.app.mapper.as.AsSubProductMapper; +import com.pig4cloud.pigx.app.service.as.AsSubProductService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +/** + * @author amigo + * @date 2023-09 + */ +@Service +@AllArgsConstructor +@Slf4j +public class AsSubProductServiceImpl extends ServiceImpl implements AsSubProductService { + +} diff --git a/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/as/impl/AsUserSubServiceImpl.java b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/as/impl/AsUserSubServiceImpl.java new file mode 100644 index 0000000..cd87393 --- /dev/null +++ b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/as/impl/AsUserSubServiceImpl.java @@ -0,0 +1,34 @@ +package com.pig4cloud.pigx.app.service.as.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.pig4cloud.pigx.app.api.entity.as.AsUserSub; +import com.pig4cloud.pigx.app.mapper.as.AsUserSubMapper; +import com.pig4cloud.pigx.app.service.as.AsUserSubService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * as 用户订阅 + * + * @author amigo + * @date 2023-07 + */ +@Service +@AllArgsConstructor +@Slf4j +public class AsUserSubServiceImpl extends ServiceImpl implements AsUserSubService { + + @Override + public List listSubPlanById(Long id) { + return baseMapper.listSubPlanById(id); + } + +// @Override + public List xxx(Long id) { + return baseMapper.listSubPlanById(id); +// return baseMapper.countSub(id); + } +} diff --git a/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/impl/AppArticleCategoryServiceImpl.java b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/impl/AppArticleCategoryServiceImpl.java new file mode 100644 index 0000000..74d98fb --- /dev/null +++ b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/impl/AppArticleCategoryServiceImpl.java @@ -0,0 +1,19 @@ +package com.pig4cloud.pigx.app.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.pig4cloud.pigx.app.api.entity.AppArticleCategoryEntity; +import com.pig4cloud.pigx.app.mapper.AppArticleCategoryMapper; +import com.pig4cloud.pigx.app.service.AppArticleCategoryService; +import org.springframework.stereotype.Service; + +/** + * 文章分类表 + * + * @author pig + * @date 2023-06-07 16:28:03 + */ +@Service +public class AppArticleCategoryServiceImpl extends ServiceImpl + implements AppArticleCategoryService { + +} diff --git a/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/impl/AppArticleCollectServiceImpl.java b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/impl/AppArticleCollectServiceImpl.java new file mode 100644 index 0000000..c2b2cfe --- /dev/null +++ b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/impl/AppArticleCollectServiceImpl.java @@ -0,0 +1,33 @@ +package com.pig4cloud.pigx.app.service.impl; + +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.pig4cloud.pigx.app.api.entity.AppArticleCollectEntity; +import com.pig4cloud.pigx.app.mapper.AppArticleCollectMapper; +import com.pig4cloud.pigx.app.service.AppArticleCollectService; +import com.pig4cloud.pigx.common.security.util.SecurityUtils; +import org.springframework.stereotype.Service; + +/** + * 文章收藏表 + * + * @author pig + * @date 2023-06-16 14:33:41 + */ +@Service +public class AppArticleCollectServiceImpl extends ServiceImpl + implements AppArticleCollectService { + + @Override + public Boolean saveArticleCollect(AppArticleCollectEntity appArticleCollect) { + Long id = SecurityUtils.getUser().getId(); + appArticleCollect.setUserId(id); + + this.saveOrUpdate(appArticleCollect, + Wrappers.lambdaQuery().eq(AppArticleCollectEntity::getUserId, id) + .eq(AppArticleCollectEntity::getArticleId, appArticleCollect.getArticleId())); + + return Boolean.TRUE; + } + +} diff --git a/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/impl/AppArticleServiceImpl.java b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/impl/AppArticleServiceImpl.java new file mode 100644 index 0000000..eb1aa1d --- /dev/null +++ b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/impl/AppArticleServiceImpl.java @@ -0,0 +1,75 @@ +package com.pig4cloud.pigx.app.service.impl; + +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.github.yulichang.wrapper.MPJLambdaWrapper; +import com.pig4cloud.pigx.app.api.entity.AppArticleCategoryEntity; +import com.pig4cloud.pigx.app.api.entity.AppArticleCollectEntity; +import com.pig4cloud.pigx.app.api.entity.AppArticleEntity; +import com.pig4cloud.pigx.app.mapper.AppArticleCollectMapper; +import com.pig4cloud.pigx.app.mapper.AppArticleMapper; +import com.pig4cloud.pigx.app.service.AppArticleService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.Objects; + +/** + * 文章资讯 + * + * @author pig + * @date 2023-06-07 16:32:35 + */ +@Service +@RequiredArgsConstructor +public class AppArticleServiceImpl extends ServiceImpl + implements AppArticleService { + + private final AppArticleCollectMapper collectMapper; + + /** + * 获取文章并使阅读数+1 + * @param id id + * @return + */ + @Override + public AppArticleEntity getArticleAndIncrById(Long id, Long userId) { + AppArticleEntity appArticleEntity = baseMapper.selectById(id); + // 查询是否收藏了 + if (Objects.nonNull(userId)) { + boolean exists = collectMapper.exists(Wrappers.lambdaQuery()// + .eq(AppArticleCollectEntity::getArticleId, appArticleEntity.getId())// + .eq(AppArticleCollectEntity::getUserId, userId)); + appArticleEntity.setCollect(exists); + } + + // TODO 更新条件需要根据其他指数限制 + Integer nowVisit = appArticleEntity.getVisit(); + appArticleEntity.setVisit(nowVisit + 1); + // 乐观锁 + baseMapper.update(appArticleEntity, Wrappers.lambdaQuery().eq(AppArticleEntity::getId, id) + .eq(AppArticleEntity::getVisit, nowVisit)); + return appArticleEntity; + } + + /** + * 分页查询文章列表 包含分类名称 + * @param page 分页参数 + * @param appArticle 文章查询条件 + * @return + */ + @Override + public Page pageAndCname(Page page, AppArticleEntity appArticle) { + MPJLambdaWrapper wrapper = new MPJLambdaWrapper<>(); + wrapper.selectAll(AppArticleEntity.class) + .selectAs(AppArticleCategoryEntity::getName, AppArticleEntity.Fields.cname) + .leftJoin(AppArticleCategoryEntity.class, AppArticleCategoryEntity::getId, AppArticleEntity::getCid) + .like(StrUtil.isNotBlank(appArticle.getAuthor()), AppArticleEntity::getAuthor, appArticle.getAuthor()) + .like(StrUtil.isNotBlank(appArticle.getTitle()), AppArticleEntity::getTitle, appArticle.getTitle()) + .eq(Objects.nonNull(appArticle.getCid()), AppArticleEntity::getCid, appArticle.getCid()); + return this.page(page, wrapper); + } + +} diff --git a/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/impl/AppIndexServiceImpl.java b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/impl/AppIndexServiceImpl.java new file mode 100644 index 0000000..62a4c9f --- /dev/null +++ b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/impl/AppIndexServiceImpl.java @@ -0,0 +1,73 @@ +package com.pig4cloud.pigx.app.service.impl; + +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.pig4cloud.pigx.app.api.entity.AppArticleEntity; +import com.pig4cloud.pigx.app.api.entity.AppPageEntity; +import com.pig4cloud.pigx.app.api.entity.AppTabbarEntity; +import com.pig4cloud.pigx.app.mapper.AppArticleMapper; +import com.pig4cloud.pigx.app.mapper.AppPageMapper; +import com.pig4cloud.pigx.app.mapper.AppTabbarMapper; +import com.pig4cloud.pigx.app.service.AppIndexService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +/** + * app 页面控制 + * + * @author lengleng + * @date 2023/6/8 + */ + +@Service +@RequiredArgsConstructor +public class AppIndexServiceImpl implements AppIndexService { + + private final AppArticleMapper appArticleMapper; + + private final AppTabbarMapper appTabbarMapper; + + private final AppPageMapper appPageMapper; + + /** + * 商城首页 首页数据 + */ + @Override + public Map index() { + Map response = new LinkedHashMap<>(); + AppPageEntity appPageEntity = appPageMapper.selectById(1); + List articleList = appArticleMapper + .selectList(Wrappers.lambdaQuery().orderByDesc(AppArticleEntity::getSort)); + response.put("pages", appPageEntity); + response.put("article", articleList); + return response; + } + + /** + * 配置 + * @return Map + */ + @Override + public Map config() { + Map response = new LinkedHashMap<>(); + List tabbarEntityList = appTabbarMapper.selectList(Wrappers.emptyWrapper()); + response.put("tabbar", tabbarEntityList); + return response; + } + + /** + * 装修 + * + * @author fzr + * @param id 主键 + * @return Map + */ + @Override + public AppPageEntity decorate(Integer id) { + return appPageMapper.selectById(id); + } + +} diff --git a/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/impl/AppMobileServiceImpl.java b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/impl/AppMobileServiceImpl.java new file mode 100644 index 0000000..21b5ee6 --- /dev/null +++ b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/impl/AppMobileServiceImpl.java @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.app.service.impl; + +import cn.hutool.core.util.RandomUtil; +import com.baomidou.mybatisplus.core.toolkit.StringPool; +import com.pig4cloud.pigx.app.service.AppMobileService; +import com.pig4cloud.pigx.common.core.constant.CacheConstants; +import com.pig4cloud.pigx.common.core.constant.SecurityConstants; +import com.pig4cloud.pigx.common.core.constant.enums.LoginTypeEnum; +import com.pig4cloud.pigx.common.core.exception.ErrorCodes; +import com.pig4cloud.pigx.common.core.util.MsgUtils; +import com.pig4cloud.pigx.common.core.util.R; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Service; + +import java.util.concurrent.TimeUnit; + +/** + * @author lengleng + * @date 2018/11/14 + *

+ * 手机登录相关业务实现 + */ +@Slf4j +@Service +@AllArgsConstructor +public class AppMobileServiceImpl implements AppMobileService { + + private final RedisTemplate redisTemplate; + + /** + * 发送手机验证码 TODO: 调用短信网关发送验证码,测试返回前端 + * @param mobile mobile + * @return code + */ + @Override + public R sendSmsCode(String mobile) { + Object codeObj = redisTemplate.opsForValue() + .get(CacheConstants.DEFAULT_CODE_KEY + LoginTypeEnum.APPSMS.getType() + StringPool.AT + mobile); + + if (codeObj != null) { + log.info("手机号验证码未过期:{},{}", mobile, codeObj); + return R.ok(Boolean.FALSE, MsgUtils.getMessage(ErrorCodes.SYS_APP_SMS_OFTEN)); + } + + String code = RandomUtil.randomNumbers(Integer.parseInt(SecurityConstants.CODE_SIZE)); + log.debug("手机号生成验证码成功:{},{}", mobile, code); + redisTemplate.opsForValue().set( + CacheConstants.DEFAULT_CODE_KEY + LoginTypeEnum.APPSMS.getType() + StringPool.AT + mobile, code, + SecurityConstants.CODE_TIME, TimeUnit.SECONDS); + return R.ok(Boolean.TRUE, code); + } + +} diff --git a/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/impl/AppPageServiceImpl.java b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/impl/AppPageServiceImpl.java new file mode 100644 index 0000000..1bf1a18 --- /dev/null +++ b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/impl/AppPageServiceImpl.java @@ -0,0 +1,18 @@ +package com.pig4cloud.pigx.app.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.pig4cloud.pigx.app.api.entity.AppPageEntity; +import com.pig4cloud.pigx.app.mapper.AppPageMapper; +import com.pig4cloud.pigx.app.service.AppPageService; +import org.springframework.stereotype.Service; + +/** + * 页面 + * + * @author lengleng + * @date 2023-06-08 11:19:23 + */ +@Service +public class AppPageServiceImpl extends ServiceImpl implements AppPageService { + +} diff --git a/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/impl/AppRoleServiceImpl.java b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/impl/AppRoleServiceImpl.java new file mode 100644 index 0000000..963b8bf --- /dev/null +++ b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/impl/AppRoleServiceImpl.java @@ -0,0 +1,112 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ +package com.pig4cloud.pigx.app.service.impl; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.pig4cloud.pigx.app.api.entity.AppRole; +import com.pig4cloud.pigx.app.api.vo.AppRoleExcelVO; +import com.pig4cloud.pigx.app.mapper.AppRoleMapper; +import com.pig4cloud.pigx.app.service.AppRoleService; +import com.pig4cloud.pigx.common.core.exception.ErrorCodes; +import com.pig4cloud.pigx.common.core.util.MsgUtils; +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.common.excel.vo.ErrorMessage; +import lombok.AllArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.validation.BindingResult; + +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +/** + * app角色表 + * + * @author aeizzz + * @date 2022-12-07 09:52:03 + */ +@Service +@AllArgsConstructor +public class AppRoleServiceImpl extends ServiceImpl implements AppRoleService { + + @Override + public List findRolesByUserId(Long userId) { + return baseMapper.listRolesByUserId(userId); + } + + /** + * 删除用户的同时,把role_menu关系删除 + * @param ids roleIds + */ + @Override + public Boolean deleteRoleByIds(Long[] ids) { + this.removeBatchByIds(CollUtil.toList(ids)); + return Boolean.TRUE; + } + + /** + * 导入角色 + * @param excelVOList + * @param bindingResult + * @return + */ + @Override + public R importRole(List excelVOList, BindingResult bindingResult) { + // 通用校验获取失败的数据 + List errorMessageList = (List) bindingResult.getTarget(); + + // 个性化校验逻辑 + List roleList = this.list(); + + // 执行数据插入操作 组装 RoleDto + for (AppRoleExcelVO excel : excelVOList) { + Set errorMsg = new HashSet<>(); + // 检验角色名称或者角色编码是否存在 + boolean existRole = roleList.stream().anyMatch(appRole -> excel.getRoleName().equals(appRole.getRoleName()) + || excel.getRoleCode().equals(appRole.getRoleCode())); + + if (existRole) { + errorMsg.add(MsgUtils.getMessage(ErrorCodes.SYS_ROLE_NAMEORCODE_EXISTING, excel.getRoleName(), + excel.getRoleCode())); + } + + // 数据合法情况 + if (CollUtil.isEmpty(errorMsg)) { + insertExcelRole(excel); + } + else { + // 数据不合法情况 + errorMessageList.add(new ErrorMessage(excel.getLineNum(), errorMsg)); + } + } + if (CollUtil.isNotEmpty(errorMessageList)) { + return R.failed(errorMessageList); + } + return R.ok(); + + } + + private void insertExcelRole(AppRoleExcelVO excel) { + AppRole appRole = new AppRole(); + appRole.setRoleName(excel.getRoleName()); + appRole.setRoleDesc(excel.getRoleDesc()); + appRole.setRoleCode(excel.getRoleCode()); + this.save(appRole); + } + +} diff --git a/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/impl/AppSocialDetailsServiceImpl.java b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/impl/AppSocialDetailsServiceImpl.java new file mode 100644 index 0000000..5afdeab --- /dev/null +++ b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/impl/AppSocialDetailsServiceImpl.java @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.app.service.impl; + +import com.baomidou.mybatisplus.core.toolkit.StringPool; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.pig4cloud.pigx.app.api.dto.AppUserInfo; +import com.pig4cloud.pigx.app.api.entity.AppSocialDetails; +import com.pig4cloud.pigx.app.api.entity.AppUser; +import com.pig4cloud.pigx.app.handler.LoginHandler; +import com.pig4cloud.pigx.app.mapper.AppSocialDetailsMapper; +import com.pig4cloud.pigx.app.mapper.AppUserMapper; +import com.pig4cloud.pigx.app.service.AppSocialDetailsService; +import com.pig4cloud.pigx.common.core.constant.CacheConstants; +import com.pig4cloud.pigx.common.security.util.SecurityUtils; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.cache.CacheManager; +import org.springframework.stereotype.Service; + +import java.util.Map; + +/** + * @author lengleng + * @date 2018年08月16日 + */ +@Slf4j +@AllArgsConstructor +@Service("appSocialDetailsService") +public class AppSocialDetailsServiceImpl extends ServiceImpl + implements AppSocialDetailsService { + + private final Map loginHandlerMap; + + private final CacheManager cacheManager; + + private final AppUserMapper appUserMapper; + + /** + * 绑定社交账号 + * @param type type + * @param code code + * @return + */ + @Override + public Boolean bindSocial(String type, String code) { + LoginHandler loginHandler = loginHandlerMap.get(type); + // 绑定逻辑 + String identify = loginHandler.identify(code); + AppUser user = appUserMapper.selectById(SecurityUtils.getUser().getId()); + loginHandler.bind(user, identify); + + // 更新緩存 + cacheManager.getCache(CacheConstants.USER_DETAILS_MINI).evict(user.getUsername()); + return Boolean.TRUE; + } + + /** + * 根据入参查询用户信息 + * @param inStr TYPE@code + * @return + */ + @Override + public AppUserInfo getUserInfo(String inStr) { + String[] inStrs = inStr.split(StringPool.AT); + String type = inStrs[0]; + String loginStr = inStr.substring(type.length() + 1); + return loginHandlerMap.get(type).handle(loginStr); + } + +} diff --git a/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/impl/AppTabbarServiceImpl.java b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/impl/AppTabbarServiceImpl.java new file mode 100644 index 0000000..93a7010 --- /dev/null +++ b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/impl/AppTabbarServiceImpl.java @@ -0,0 +1,18 @@ +package com.pig4cloud.pigx.app.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.pig4cloud.pigx.app.api.entity.AppTabbarEntity; +import com.pig4cloud.pigx.app.mapper.AppTabbarMapper; +import com.pig4cloud.pigx.app.service.AppTabbarService; +import org.springframework.stereotype.Service; + +/** + * 导航栏 + * + * @author lengleng + * @date 2023-06-08 11:18:46 + */ +@Service +public class AppTabbarServiceImpl extends ServiceImpl implements AppTabbarService { + +} diff --git a/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/impl/AppUserRoleServiceImpl.java b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/impl/AppUserRoleServiceImpl.java new file mode 100644 index 0000000..f1daddb --- /dev/null +++ b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/impl/AppUserRoleServiceImpl.java @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ +package com.pig4cloud.pigx.app.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.pig4cloud.pigx.app.api.entity.AppUserRole; +import com.pig4cloud.pigx.app.mapper.AppUserRoleMapper; +import com.pig4cloud.pigx.app.service.AppUserRoleService; +import org.springframework.stereotype.Service; + +/** + * 用户角色表 + * + * @author aeizzz + * @date 2022-12-07 09:52:03 + */ +@Service +public class AppUserRoleServiceImpl extends ServiceImpl implements AppUserRoleService { + +} diff --git a/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/impl/AppUserServiceImpl.java b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/impl/AppUserServiceImpl.java new file mode 100644 index 0000000..5cfbe1d --- /dev/null +++ b/as-app-server/as-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/impl/AppUserServiceImpl.java @@ -0,0 +1,325 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ +package com.pig4cloud.pigx.app.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.StringPool; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.pig4cloud.pigx.app.api.dto.AppUserDTO; +import com.pig4cloud.pigx.app.api.dto.AppUserInfo; +import com.pig4cloud.pigx.app.api.entity.AppRole; +import com.pig4cloud.pigx.app.api.entity.AppUser; +import com.pig4cloud.pigx.app.api.entity.AppUserRole; +import com.pig4cloud.pigx.app.api.vo.AppUserExcelVO; +import com.pig4cloud.pigx.app.api.vo.AppUserVO; +import com.pig4cloud.pigx.app.mapper.AppUserMapper; +import com.pig4cloud.pigx.app.service.AppRoleService; +import com.pig4cloud.pigx.app.service.AppUserRoleService; +import com.pig4cloud.pigx.app.service.AppUserService; +import com.pig4cloud.pigx.common.core.constant.CacheConstants; +import com.pig4cloud.pigx.common.core.constant.CommonConstants; +import com.pig4cloud.pigx.common.core.constant.enums.LoginTypeEnum; +import com.pig4cloud.pigx.common.core.constant.enums.UserTypeEnum; +import com.pig4cloud.pigx.common.core.exception.ErrorCodes; +import com.pig4cloud.pigx.common.core.util.MsgUtils; +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.common.excel.vo.ErrorMessage; +import com.pig4cloud.pigx.common.security.service.PigxUser; +import com.pig4cloud.pigx.common.security.util.SecurityUtils; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; +import org.springframework.cache.Cache; +import org.springframework.cache.CacheManager; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.stereotype.Service; +import org.springframework.validation.BindingResult; + +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * app用户表 + * + * @author aeizzz + * @date 2022-12-07 09:52:03 + */ +@Service +@AllArgsConstructor +@Slf4j +public class AppUserServiceImpl extends ServiceImpl implements AppUserService { + + /** + * 注册用户 赋予用户默认角色 + * @param userDto 用户信息 + * @return success/false + */ + @Override + public Boolean regUser(AppUserDTO userDto) { + return this.saveUser(userDto); + } + private static final PasswordEncoder ENCODER = new BCryptPasswordEncoder(); + + private final AppUserRoleService appUserRoleService; + + private final RedisTemplate redisTemplate; + + private final AppRoleService appRoleService; + + private final CacheManager cacheManager; + + /** + * 更新用户 + * @param userDTO + * @return + */ + @Override + @CacheEvict(value = CacheConstants.USER_DETAILS_MINI, key = "#userDTO.username") + public Boolean updateUser(AppUserDTO userDTO) { + AppUser appUser = new AppUser(); + BeanUtils.copyProperties(userDTO, appUser); + if (StrUtil.isNotBlank(userDTO.getPassword())) { + appUser.setPassword(ENCODER.encode(userDTO.getPassword())); + } + this.updateById(appUser); + + appUserRoleService.remove(Wrappers.lambdaQuery().eq(AppUserRole::getUserId, appUser.getUserId())); + userDTO.getRole().forEach(roleId -> { + AppUserRole appUserRole = new AppUserRole(); + appUserRole.setRoleId(roleId); + appUserRole.setUserId(userDTO.getUserId()); + appUserRole.insert(); + }); + return Boolean.TRUE; + } + + /** + * 新增用户 + * @param userDTO + * @return + */ + @Override + public Boolean saveUser(AppUserDTO userDTO) { + AppUser appUser = new AppUser(); + BeanUtils.copyProperties(userDTO, appUser); + appUser.setDelFlag(CommonConstants.STATUS_NORMAL); + appUser.setPassword(ENCODER.encode(userDTO.getPassword())); + baseMapper.insert(appUser); + // 如果角色为空,赋默认角色 + if (CollUtil.isNotEmpty(userDTO.getRole())) { + List userRoleList = userDTO.getRole().stream().map(roleId -> { + AppUserRole userRole = new AppUserRole(); + userRole.setUserId(appUser.getUserId()); + userRole.setRoleId(roleId); + return userRole; + }).collect(Collectors.toList()); + appUserRoleService.saveBatch(userRoleList); + } + return Boolean.TRUE; + } + + /** + * 查询全部的用户 + * @param appUser + * @return + */ + @Override + public List listUser(AppUserDTO appUser) { + List appUsers = baseMapper.selectList(null); + List appUserExcelVOS = appUsers.stream().map(item -> { + AppUserExcelVO appUserExcelVO = new AppUserExcelVO(); + BeanUtils.copyProperties(item, appUserExcelVO); + return appUserExcelVO; + }).collect(Collectors.toList()); + return appUserExcelVOS; + } + + @Override + public IPage getUsersWithRolePage(Page page, AppUserDTO appUserDTO) { + return baseMapper.getUserVosPage(page, appUserDTO); + } + + @Override + public AppUserInfo findUserInfo(AppUser user) { + AppUserInfo info = new AppUserInfo(); + info.setAppUser(user); + // 设置角色列表 (ID) + List roleIds = appRoleService.findRolesByUserId(user.getUserId()).stream().map(AppRole::getRoleId) + .collect(Collectors.toList()); + info.setRoles(ArrayUtil.toArray(roleIds, Long.class)); + + // 设置权限列表(menu.permission) + Set permissions = new HashSet<>(); + info.setPermissions(ArrayUtil.toArray(permissions, String.class)); + return info; + } + + @Override + @CacheEvict(value = CacheConstants.USER_DETAILS_MINI, key = "#userDto.username") + public R updateUserInfo(AppUserDTO userDto) { + // C端客户修改手机号需要判断验证码是否正确 + PigxUser user = SecurityUtils.getUser(); + if (UserTypeEnum.TOC.getStatus().equals(user.getUserType()) && StrUtil.isNotBlank(userDto.getPhone())) { + String key = CacheConstants.DEFAULT_CODE_KEY + LoginTypeEnum.APPSMS.getType() + StringPool.AT + + userDto.getPhone(); + String codeObj = redisTemplate.opsForValue().get(key); + + if (!userDto.getMobileCode().equals(codeObj)) { + return R.failed("验证码错误"); + } + } + + // 更新密码 + if (StrUtil.isNotBlank(userDto.getPassword())) { + userDto.setPassword(ENCODER.encode(userDto.getPassword())); + } + + AppUser appUser = baseMapper.selectById(userDto.getUserId()); + BeanUtils.copyProperties(userDto, appUser); + return R.ok(this.updateById(appUser)); + } + + @Override + public AppUserVO selectUserVoById(Long userId) { + return baseMapper.getUserVoById(userId); + } + + /** + * 删除user用户同时删除user-role关系表 + * @param ids userIds + */ + @Override + public Boolean deleteAppUserByIds(Long[] ids) { + Cache cache = cacheManager.getCache(CacheConstants.USER_DETAILS_MINI); + for (AppUser appUser : baseMapper.selectBatchIds(CollUtil.toList(ids))) { + cache.evict(appUser.getUsername()); + } + // 删除用户关联表 + this.appUserRoleService + .remove(Wrappers.lambdaQuery().in(AppUserRole::getUserId, CollUtil.toList(ids))); + + this.removeBatchByIds(CollUtil.toList(ids)); + + return Boolean.TRUE; + + } + + @Override + public R registerAppUser(AppUserDTO appUser) { + List appUserList = baseMapper + .selectList(Wrappers.lambdaQuery().eq(AppUser::getPhone, appUser.getPhone())); + + if (CollUtil.isNotEmpty(appUserList)) { + return R.failed("手机号已注册,请使用验证码直接登录"); + } + + String key = CacheConstants.DEFAULT_CODE_KEY + LoginTypeEnum.APPSMS.getType() + StringPool.AT + + appUser.getPhone(); + String codeObj = redisTemplate.opsForValue().get(key); + + if (!appUser.getMobileCode().equals(codeObj)) { + return R.failed("验证码错误"); + } + + AppUser app = new AppUser(); + BeanUtils.copyProperties(appUser, app); + appUser.setUsername(app.getPhone()); + appUser.setDelFlag(CommonConstants.STATUS_NORMAL); + appUser.setPassword(ENCODER.encode(appUser.getPassword())); + baseMapper.insert(appUser); + return null; + } + + /** + * @param excelVOList + * @param bindingResult + * @return + */ + @Override + public R importUser(List excelVOList, BindingResult bindingResult) { + // 通用校验获取失败的数据 + List errorMessageList = (List) bindingResult.getTarget(); + + // 执行数据插入操作 组装 UserDto + for (AppUserExcelVO excel : excelVOList) { + // 个性化校验逻辑 + List userList = this.list(); + List roleList = appRoleService.list(); + + Set errorMsg = new HashSet<>(); + // 校验用户名是否存在 + boolean exsitUserName = userList.stream() + .anyMatch(sysUser -> excel.getUsername().equals(sysUser.getUsername())); + + if (exsitUserName) { + errorMsg.add(MsgUtils.getMessage(ErrorCodes.SYS_USER_USERNAME_EXISTING, excel.getUsername())); + } + + // 判断输入的角色名称列表是否合法 + List roleNameList = StrUtil.split(excel.getRoleNameList(), StrUtil.COMMA); + List roleCollList = roleList.stream() + .filter(role -> roleNameList.stream().anyMatch(name -> role.getRoleName().equals(name))) + .collect(Collectors.toList()); + + if (roleCollList.size() != roleNameList.size()) { + errorMsg.add(MsgUtils.getMessage(ErrorCodes.SYS_ROLE_ROLENAME_INEXISTENCE, excel.getRoleNameList())); + } + // 数据合法情况 + if (CollUtil.isEmpty(errorMsg)) { + insertExcelUser(excel, roleCollList); + } + else { + // 数据不合法情况 + errorMessageList.add(new ErrorMessage(excel.getLineNum(), errorMsg)); + } + + } + + if (CollUtil.isNotEmpty(errorMessageList)) { + return R.failed(errorMessageList); + } + return R.ok(null, MsgUtils.getMessage(ErrorCodes.SYS_USER_IMPORT_SUCCEED)); + + } + + private void insertExcelUser(AppUserExcelVO excel, List roleCollList) { + AppUserDTO userDTO = new AppUserDTO(); + userDTO.setUsername(excel.getUsername()); + userDTO.setPhone(excel.getPhone()); + userDTO.setNickname(excel.getNickname()); + userDTO.setName(excel.getName()); + userDTO.setEmail(excel.getEmail()); + // 批量导入初始密码为手机号 + userDTO.setPassword(userDTO.getPhone()); + // 根据角色名称查询角色ID + List roleIdList = roleCollList.stream().map(AppRole::getRoleId).collect(Collectors.toList()); + userDTO.setRole(roleIdList); + // 插入用户 + this.saveUser(userDTO); + } + +} diff --git a/as-app-server/as-app-server-biz/src/main/resources/application.yml b/as-app-server/as-app-server-biz/src/main/resources/application.yml new file mode 100644 index 0000000..f70fba8 --- /dev/null +++ b/as-app-server/as-app-server-biz/src/main/resources/application.yml @@ -0,0 +1,18 @@ +server: + port: 7060 + +spring: + application: + name: @artifactId@ + cloud: + nacos: + username: @nacos.username@ + password: @nacos.password@ + discovery: + server-addr: ${NACOS_HOST:pigx-register}:${NACOS_PORT:8848} + config: + server-addr: ${spring.cloud.nacos.discovery.server-addr} + config: + import: + - optional:nacos:application-@profiles.active@.yml + - optional:nacos:${spring.application.name}-@profiles.active@.yml diff --git a/as-app-server/as-app-server-biz/src/main/resources/logback-spring.xml b/as-app-server/as-app-server-biz/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..5de3e27 --- /dev/null +++ b/as-app-server/as-app-server-biz/src/main/resources/logback-spring.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + + + + + + ${log.path}/debug.log + + ${log.path}/%d{yyyy-MM, aux}/debug.%d{yyyy-MM-dd}.%i.log.gz + 50MB + 30 + + + %date [%thread] %-5level [%logger{50}] %file:%line - %msg%n + + + + + + ${log.path}/error.log + + ${log.path}/%d{yyyy-MM}/error.%d{yyyy-MM-dd}.%i.log.gz + 50MB + 30 + + + %date [%thread] %-5level [%logger{50}] %file:%line - %msg%n + + + ERROR + + + + + + + + + + + + + + + + + diff --git a/as-app-server/as-app-server-biz/src/main/resources/mapper/AppArticleCategoryMapper.xml b/as-app-server/as-app-server-biz/src/main/resources/mapper/AppArticleCategoryMapper.xml new file mode 100644 index 0000000..4e72070 --- /dev/null +++ b/as-app-server/as-app-server-biz/src/main/resources/mapper/AppArticleCategoryMapper.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/as-app-server/as-app-server-biz/src/main/resources/mapper/AppArticleCollectMapper.xml b/as-app-server/as-app-server-biz/src/main/resources/mapper/AppArticleCollectMapper.xml new file mode 100644 index 0000000..6f6b681 --- /dev/null +++ b/as-app-server/as-app-server-biz/src/main/resources/mapper/AppArticleCollectMapper.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/as-app-server/as-app-server-biz/src/main/resources/mapper/AppArticleMapper.xml b/as-app-server/as-app-server-biz/src/main/resources/mapper/AppArticleMapper.xml new file mode 100644 index 0000000..707c968 --- /dev/null +++ b/as-app-server/as-app-server-biz/src/main/resources/mapper/AppArticleMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/as-app-server/as-app-server-biz/src/main/resources/mapper/AppPageMapper.xml b/as-app-server/as-app-server-biz/src/main/resources/mapper/AppPageMapper.xml new file mode 100644 index 0000000..64da53f --- /dev/null +++ b/as-app-server/as-app-server-biz/src/main/resources/mapper/AppPageMapper.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/as-app-server/as-app-server-biz/src/main/resources/mapper/AppRoleMapper.xml b/as-app-server/as-app-server-biz/src/main/resources/mapper/AppRoleMapper.xml new file mode 100644 index 0000000..0123f01 --- /dev/null +++ b/as-app-server/as-app-server-biz/src/main/resources/mapper/AppRoleMapper.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/as-app-server/as-app-server-biz/src/main/resources/mapper/AppTabbarMapper.xml b/as-app-server/as-app-server-biz/src/main/resources/mapper/AppTabbarMapper.xml new file mode 100644 index 0000000..36e850e --- /dev/null +++ b/as-app-server/as-app-server-biz/src/main/resources/mapper/AppTabbarMapper.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/as-app-server/as-app-server-biz/src/main/resources/mapper/AppUserMapper.xml b/as-app-server/as-app-server-biz/src/main/resources/mapper/AppUserMapper.xml new file mode 100644 index 0000000..b2ef3fc --- /dev/null +++ b/as-app-server/as-app-server-biz/src/main/resources/mapper/AppUserMapper.xml @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + u.user_id, + u.username, + u.password, + u.salt, + u.phone, + u.avatar, + u.wx_openid, + u.del_flag, + u.lock_flag, + u.tenant_id, + u.nickname, + u.name, + u.email, + u.create_by, + u.create_time ucreate_time, + u.update_time uupdate_time, + r.role_id + + + + diff --git a/as-app-server/as-app-server-biz/src/main/resources/mapper/AppUserRoleMapper.xml b/as-app-server/as-app-server-biz/src/main/resources/mapper/AppUserRoleMapper.xml new file mode 100644 index 0000000..aa34c22 --- /dev/null +++ b/as-app-server/as-app-server-biz/src/main/resources/mapper/AppUserRoleMapper.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/as-app-server/pom.xml b/as-app-server/pom.xml new file mode 100644 index 0000000..a6db1a4 --- /dev/null +++ b/as-app-server/pom.xml @@ -0,0 +1,21 @@ + + + + 4.0.0 + + + com.pig4cloud + pigx + 5.2.0 + + + as-app-server + pom + + + + as-app-server-api + as-app-server-biz + + diff --git a/as-gateway/Dockerfile b/as-gateway/Dockerfile new file mode 100644 index 0000000..ccea833 --- /dev/null +++ b/as-gateway/Dockerfile @@ -0,0 +1,18 @@ +FROM pig4cloud/java:8-jre + +MAINTAINER wangiegie@gmail.com + +ENV TZ=Asia/Shanghai +ENV JAVA_OPTS="-Xms128m -Xmx256m -Djava.security.egd=file:/dev/./urandom" + +RUN ln -sf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone + +RUN mkdir -p /as-gateway + +WORKDIR /as-gateway + +EXPOSE 9999 + +ADD ./target/as-gateway.jar ./ + +CMD sleep 180;java $JAVA_OPTS -jar as-gateway.jar diff --git a/as-gateway/pom.xml b/as-gateway/pom.xml new file mode 100644 index 0000000..5f86434 --- /dev/null +++ b/as-gateway/pom.xml @@ -0,0 +1,111 @@ + + + 4.0.0 + + com.pig4cloud + pigx + 5.2.0 + + + as-gateway + jar + + pigx 服务网关,基于 spring cloud gateway + + + + + org.springframework.cloud + spring-cloud-starter-gateway + + + org.springframework.boot + spring-boot-starter-data-redis-reactive + + + + com.pig4cloud + pigx-common-gateway + + + + cn.hutool + hutool-crypto + + + cn.hutool + hutool-http + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-config + + + + com.github.anji-plus + captcha-spring-boot-starter + ${captcha.version} + + + + org.springframework.boot + spring-boot-starter-data-redis + + + + com.alibaba.cloud + spring-cloud-alibaba-sentinel-gateway + + + + com.pig4cloud + pigx-common-sentinel + + + + com.github.ben-manes.caffeine + caffeine + + + + org.springdoc + springdoc-openapi-webflux-ui + + + + io.springboot + knife4j-openapi3-ui + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + org.apache.maven.plugins + maven-deploy-plugin + + true + + + + io.fabric8 + docker-maven-plugin + + false + + + + + + diff --git a/as-gateway/src/main/java/com/pig4cloud/pigx/gateway/AsGatewayApplication.java b/as-gateway/src/main/java/com/pig4cloud/pigx/gateway/AsGatewayApplication.java new file mode 100644 index 0000000..e80231f --- /dev/null +++ b/as-gateway/src/main/java/com/pig4cloud/pigx/gateway/AsGatewayApplication.java @@ -0,0 +1,40 @@ +/* + * + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + * + */ + +package com.pig4cloud.pigx.gateway; + +import com.pig4cloud.pigx.common.gateway.annotation.EnablePigxDynamicRoute; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.client.discovery.EnableDiscoveryClient; + +/** + * @author lengleng + * @date 2018年06月21日 网关应用 + */ +@EnablePigxDynamicRoute +@EnableDiscoveryClient +@SpringBootApplication +public class AsGatewayApplication { + + public static void main(String[] args) { + SpringApplication.run(AsGatewayApplication.class, args); + } + +} diff --git a/as-gateway/src/main/java/com/pig4cloud/pigx/gateway/config/CaptchaCacheServiceProvider.java b/as-gateway/src/main/java/com/pig4cloud/pigx/gateway/config/CaptchaCacheServiceProvider.java new file mode 100644 index 0000000..3fbde3b --- /dev/null +++ b/as-gateway/src/main/java/com/pig4cloud/pigx/gateway/config/CaptchaCacheServiceProvider.java @@ -0,0 +1,47 @@ +package com.pig4cloud.pigx.gateway.config; + +import com.anji.captcha.service.CaptchaCacheService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.StringRedisTemplate; + +import java.util.concurrent.TimeUnit; + +/** + * @author lengleng + * @date 2020/8/27 + *

+ * 验证码 缓存提供支持集群,需要通过SPI + */ +public class CaptchaCacheServiceProvider implements CaptchaCacheService { + + private static final String REDIS = "redis"; + + @Autowired + private StringRedisTemplate stringRedisTemplate; + + @Override + public void set(String key, String value, long expiresInSeconds) { + stringRedisTemplate.opsForValue().set(key, value, expiresInSeconds, TimeUnit.SECONDS); + } + + @Override + public boolean exists(String key) { + return stringRedisTemplate.hasKey(key); + } + + @Override + public void delete(String key) { + stringRedisTemplate.delete(key); + } + + @Override + public String get(String key) { + return stringRedisTemplate.opsForValue().get(key); + } + + @Override + public String type() { + return REDIS; + } + +} diff --git a/as-gateway/src/main/java/com/pig4cloud/pigx/gateway/config/GatewayConfigProperties.java b/as-gateway/src/main/java/com/pig4cloud/pigx/gateway/config/GatewayConfigProperties.java new file mode 100644 index 0000000..e45c916 --- /dev/null +++ b/as-gateway/src/main/java/com/pig4cloud/pigx/gateway/config/GatewayConfigProperties.java @@ -0,0 +1,25 @@ +package com.pig4cloud.pigx.gateway.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.stereotype.Component; + +/** + * @author lengleng + * @date 2020/10/2 + *

+ * 网关通用配置文件 + */ +@Data +@Component +@RefreshScope +@ConfigurationProperties("gateway") +public class GatewayConfigProperties { + + /** + * 网关解密登录前端密码 秘钥 {@link com.pig4cloud.pigx.gateway.filter.PasswordDecoderFilter} + */ + public String encodeKey; + +} diff --git a/as-gateway/src/main/java/com/pig4cloud/pigx/gateway/config/RateLimiterConfiguration.java b/as-gateway/src/main/java/com/pig4cloud/pigx/gateway/config/RateLimiterConfiguration.java new file mode 100644 index 0000000..9c912a0 --- /dev/null +++ b/as-gateway/src/main/java/com/pig4cloud/pigx/gateway/config/RateLimiterConfiguration.java @@ -0,0 +1,39 @@ +/* + * + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + * + */ + +package com.pig4cloud.pigx.gateway.config; + +import org.springframework.cloud.gateway.filter.ratelimit.KeyResolver; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import reactor.core.publisher.Mono; + +/** + * @author lengleng + * @date 2018/7/1 路由限流配置 + */ +@Configuration +public class RateLimiterConfiguration { + + @Bean(value = "remoteAddrKeyResolver") + public KeyResolver remoteAddrKeyResolver() { + return exchange -> Mono.just(exchange.getRequest().getRemoteAddress().getAddress().getHostAddress()); + } + +} diff --git a/as-gateway/src/main/java/com/pig4cloud/pigx/gateway/config/RouterFunctionConfiguration.java b/as-gateway/src/main/java/com/pig4cloud/pigx/gateway/config/RouterFunctionConfiguration.java new file mode 100644 index 0000000..0ae4dc2 --- /dev/null +++ b/as-gateway/src/main/java/com/pig4cloud/pigx/gateway/config/RouterFunctionConfiguration.java @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.gateway.config; + +import com.pig4cloud.pigx.gateway.handler.ImageCodeCheckHandler; +import com.pig4cloud.pigx.gateway.handler.ImageCodeCreateHandler; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.MediaType; +import org.springframework.web.reactive.function.server.RequestPredicates; +import org.springframework.web.reactive.function.server.RouterFunction; +import org.springframework.web.reactive.function.server.RouterFunctions; + +/** + * @author lengleng + * @date 2018/7/5 路由配置信息 + */ +@Slf4j +@Configuration +@AllArgsConstructor +public class RouterFunctionConfiguration { + + private final ImageCodeCheckHandler imageCodeCheckHandler; + + private final ImageCodeCreateHandler imageCodeCreateHandler; + + @Bean + public RouterFunction routerFunction() { + return RouterFunctions + .route(RequestPredicates.path("/code/create").and(RequestPredicates.accept(MediaType.TEXT_PLAIN)), + imageCodeCreateHandler) + .andRoute(RequestPredicates.POST("/code/check").and(RequestPredicates.accept(MediaType.ALL)), + imageCodeCheckHandler); + + } + +} diff --git a/as-gateway/src/main/java/com/pig4cloud/pigx/gateway/config/SpringDocConfiguration.java b/as-gateway/src/main/java/com/pig4cloud/pigx/gateway/config/SpringDocConfiguration.java new file mode 100644 index 0000000..48a9f22 --- /dev/null +++ b/as-gateway/src/main/java/com/pig4cloud/pigx/gateway/config/SpringDocConfiguration.java @@ -0,0 +1,84 @@ +package com.pig4cloud.pigx.gateway.config; + +import com.alibaba.nacos.client.naming.event.InstancesChangeEvent; +import com.alibaba.nacos.common.notify.Event; +import com.alibaba.nacos.common.notify.NotifyCenter; +import com.alibaba.nacos.common.notify.listener.Subscriber; +import com.alibaba.nacos.common.utils.StringUtils; +import lombok.RequiredArgsConstructor; +import org.springdoc.core.AbstractSwaggerUiConfigProperties; +import org.springdoc.core.SwaggerUiConfigProperties; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.cloud.client.discovery.DiscoveryClient; +import org.springframework.context.annotation.Configuration; + +import java.util.Set; +import java.util.stream.Collectors; + +/** + * @author lengleng + * @date 2022/3/26 + *

+ * swagger 3.0 展示 + */ +@Configuration(proxyBeanMethods = false) +@RequiredArgsConstructor +@ConditionalOnProperty(name = "springdoc.api-docs.enabled", matchIfMissing = true) +public class SpringDocConfiguration implements InitializingBean { + + private final SwaggerUiConfigProperties swaggerUiConfigProperties; + + private final DiscoveryClient discoveryClient; + + /** + * 在初始化后调用的方法,用于注册SwaggerDocRegister订阅器 + */ + @Override + public void afterPropertiesSet() { + SwaggerDocRegister swaggerDocRegister = new SwaggerDocRegister(swaggerUiConfigProperties, discoveryClient); + // 手动调用一次,避免监听事件掉线问题 + swaggerDocRegister.onEvent(null); + NotifyCenter.registerSubscriber(swaggerDocRegister); + } + +} + +/** + * Swagger文档注册器,继承自Subscriber + */ +@RequiredArgsConstructor +class SwaggerDocRegister extends Subscriber { + + private final SwaggerUiConfigProperties swaggerUiConfigProperties; + + private final DiscoveryClient discoveryClient; + + /** + * 事件回调方法,处理InstancesChangeEvent事件 + * @param event 事件对象 + */ + @Override + public void onEvent(InstancesChangeEvent event) { + Set swaggerUrlSet = discoveryClient.getServices().stream() + .flatMap(serviceId -> discoveryClient.getInstances(serviceId).stream()) + .filter(instance -> StringUtils.isNotBlank(instance.getMetadata().get("spring-doc"))).map(instance -> { + AbstractSwaggerUiConfigProperties.SwaggerUrl swaggerUrl = new AbstractSwaggerUiConfigProperties.SwaggerUrl(); + swaggerUrl.setName(instance.getServiceId()); + swaggerUrl.setUrl(String.format("/%s/v3/api-docs", instance.getMetadata().get("spring-doc"))); + return swaggerUrl; + }).collect(Collectors.toSet()); + + swaggerUiConfigProperties.setUrls(swaggerUrlSet); + } + + /** + * 订阅类型方法,返回订阅的事件类型 + * @return 订阅的事件类型 + */ + @Override + public Class subscribeType() { + return InstancesChangeEvent.class; + } + +} diff --git a/as-gateway/src/main/java/com/pig4cloud/pigx/gateway/filter/HttpBasicGatewayFilter.java b/as-gateway/src/main/java/com/pig4cloud/pigx/gateway/filter/HttpBasicGatewayFilter.java new file mode 100644 index 0000000..9e50d7e --- /dev/null +++ b/as-gateway/src/main/java/com/pig4cloud/pigx/gateway/filter/HttpBasicGatewayFilter.java @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.gateway.filter; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.cloud.gateway.filter.GatewayFilter; +import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.server.reactive.ServerHttpRequest; +import org.springframework.http.server.reactive.ServerHttpResponse; +import org.springframework.stereotype.Component; +import org.springframework.web.server.ServerWebExchange; + +/** + * @author lengleng + * @date 2018/10/30 + *

+ * 自定义basic认证,针对特殊场景使用 + */ +@Slf4j +@Component +public class HttpBasicGatewayFilter extends AbstractGatewayFilterFactory { + + @Override + public GatewayFilter apply(Object config) { + return (exchange, chain) -> { + if (hasAuth(exchange)) { + return chain.filter(exchange); + } + else { + ServerHttpResponse response = exchange.getResponse(); + response.setStatusCode(HttpStatus.UNAUTHORIZED); + response.getHeaders().add(HttpHeaders.WWW_AUTHENTICATE, "Basic Realm=\"pigx\""); + return response.setComplete(); + } + }; + } + + /** + * 简单的basic认证 + * @param exchange 上下文 + * @return 是否有权限 + */ + private boolean hasAuth(ServerWebExchange exchange) { + ServerHttpRequest request = exchange.getRequest(); + String auth = request.getHeaders().getFirst(HttpHeaders.AUTHORIZATION); + log.info("Basic认证信息为:{}", auth); + return true; + } + +} diff --git a/as-gateway/src/main/java/com/pig4cloud/pigx/gateway/filter/PasswordDecoderFilter.java b/as-gateway/src/main/java/com/pig4cloud/pigx/gateway/filter/PasswordDecoderFilter.java new file mode 100644 index 0000000..73bfc4e --- /dev/null +++ b/as-gateway/src/main/java/com/pig4cloud/pigx/gateway/filter/PasswordDecoderFilter.java @@ -0,0 +1,211 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.gateway.filter; + +import cn.hutool.core.util.CharsetUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.crypto.Mode; +import cn.hutool.crypto.Padding; +import cn.hutool.crypto.symmetric.AES; +import cn.hutool.http.HttpUtil; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.pig4cloud.pigx.common.core.constant.CacheConstants; +import com.pig4cloud.pigx.common.core.constant.CommonConstants; +import com.pig4cloud.pigx.common.core.constant.SecurityConstants; +import com.pig4cloud.pigx.common.core.constant.enums.EncFlagTypeEnum; +import com.pig4cloud.pigx.common.core.util.WebUtils; +import com.pig4cloud.pigx.gateway.config.GatewayConfigProperties; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.cloud.gateway.filter.GatewayFilter; +import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory; +import org.springframework.cloud.gateway.filter.factory.rewrite.CachedBodyOutputMessage; +import org.springframework.cloud.gateway.support.BodyInserterContext; +import org.springframework.core.io.buffer.DataBuffer; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.serializer.StringRedisSerializer; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.http.codec.HttpMessageReader; +import org.springframework.http.server.reactive.ServerHttpRequest; +import org.springframework.http.server.reactive.ServerHttpRequestDecorator; +import org.springframework.stereotype.Component; +import org.springframework.web.reactive.function.BodyInserter; +import org.springframework.web.reactive.function.BodyInserters; +import org.springframework.web.reactive.function.server.HandlerStrategies; +import org.springframework.web.reactive.function.server.ServerRequest; +import org.springframework.web.server.ServerWebExchange; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; +import java.nio.charset.Charset; +import java.util.List; +import java.util.Map; +import java.util.function.Function; + +/** + * @author lengleng + * @date 2020/1/8 密码解密工具类 + *

+ * 参考 ModifyRequestBodyGatewayFilterFactory 实现 + */ +@Slf4j +@Component +@RequiredArgsConstructor +@SuppressWarnings("all") +public class PasswordDecoderFilter extends AbstractGatewayFilterFactory { + + private final List> messageReaders = HandlerStrategies.withDefaults().messageReaders(); + + private static final String PASSWORD = "password"; + + private static final String KEY_ALGORITHM = "AES"; + + private final RedisTemplate redisTemplate; + + private final GatewayConfigProperties gatewayConfig; + + @Override + public GatewayFilter apply(Object config) { + return (exchange, chain) -> { + ServerHttpRequest request = exchange.getRequest(); + // 1. 不是登录请求,直接向下执行 + if (!StrUtil.containsAnyIgnoreCase(request.getURI().getPath(), SecurityConstants.OAUTH_TOKEN_URL)) { + return chain.filter(exchange); + } + + // 2. 刷新token类型,直接向下执行 + String grantType = request.getQueryParams().getFirst("grant_type"); + if (StrUtil.equals(SecurityConstants.REFRESH_TOKEN, grantType)) { + return chain.filter(exchange); + } + + // 3. 判断客户端是否需要解密,明文传输直接向下执行 + if (!isEncClient(request)) { + return chain.filter(exchange); + } + + // 4. 前端加密密文解密逻辑 + Class inClass = String.class; + Class outClass = String.class; + ServerRequest serverRequest = ServerRequest.create(exchange, messageReaders); + + // 解密生成新的报文 + Mono modifiedBody = serverRequest.bodyToMono(inClass).flatMap(decryptAES()); + + BodyInserter bodyInserter = BodyInserters.fromPublisher(modifiedBody, outClass); + HttpHeaders headers = new HttpHeaders(); + headers.putAll(exchange.getRequest().getHeaders()); + headers.remove(HttpHeaders.CONTENT_LENGTH); + + headers.set(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_FORM_URLENCODED_VALUE); + CachedBodyOutputMessage outputMessage = new CachedBodyOutputMessage(exchange, headers); + return bodyInserter.insert(outputMessage, new BodyInserterContext()).then(Mono.defer(() -> { + ServerHttpRequest decorator = decorate(exchange, headers, outputMessage); + return chain.filter(exchange.mutate().request(decorator).build()); + })); + }; + } + + /** + * 根据请求的clientId 查询客户端配置是否是加密传输 + * @param request 请求上下文 + * @return true 加密传输 、 false 原文传输 + */ + private boolean isEncClient(ServerHttpRequest request) { + String header = request.getHeaders().getFirst(HttpHeaders.AUTHORIZATION); + String clientId = WebUtils.extractClientId(header).orElse(null); + // 获取租户拼接区分租户的key + String tenantId = request.getHeaders().getFirst(CommonConstants.TENANT_ID); + String key = String.format("%s:%s:%s", StrUtil.isBlank(tenantId) ? CommonConstants.TENANT_ID_1 : tenantId, + CacheConstants.CLIENT_FLAG, clientId); + + redisTemplate.setKeySerializer(new StringRedisSerializer()); + Object val = redisTemplate.opsForValue().get(key); + + // 当配置不存在时,默认需要解密 + if (val == null) { + return true; + } + + JSONObject information = JSONUtil.parseObj(val.toString()); + if (StrUtil.equals(EncFlagTypeEnum.NO.getType(), information.getStr(CommonConstants.ENC_FLAG))) { + return false; + } + return true; + } + + /** + * 原文解密 + * @return + */ + private Function decryptAES() { + return s -> { + // 构建前端对应解密AES 因子 + AES aes = new AES(Mode.CFB, Padding.NoPadding, + new SecretKeySpec(gatewayConfig.getEncodeKey().getBytes(), KEY_ALGORITHM), + new IvParameterSpec(gatewayConfig.getEncodeKey().getBytes())); + + // 获取请求密码并解密 + Map inParamsMap = HttpUtil.decodeParamMap((String) s, CharsetUtil.CHARSET_UTF_8); + if (inParamsMap.containsKey(PASSWORD)) { + String password = aes.decryptStr(inParamsMap.get(PASSWORD)); + // 返回修改后报文字符 + inParamsMap.put(PASSWORD, password); + } + else { + log.error("非法请求数据:{}", s); + } + + // 使用 + return Mono.just(HttpUtil.toParams(inParamsMap, Charset.defaultCharset(), true)); + }; + } + + /** + * 报文转换 + * @return + */ + private ServerHttpRequestDecorator decorate(ServerWebExchange exchange, HttpHeaders headers, + CachedBodyOutputMessage outputMessage) { + return new ServerHttpRequestDecorator(exchange.getRequest()) { + @Override + public HttpHeaders getHeaders() { + long contentLength = headers.getContentLength(); + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.putAll(super.getHeaders()); + if (contentLength > 0) { + httpHeaders.setContentLength(contentLength); + } + else { + httpHeaders.set(HttpHeaders.TRANSFER_ENCODING, "chunked"); + } + return httpHeaders; + } + + @Override + public Flux getBody() { + return outputMessage.getBody(); + } + }; + } + +} diff --git a/as-gateway/src/main/java/com/pig4cloud/pigx/gateway/filter/PigxRequestGlobalFilter.java b/as-gateway/src/main/java/com/pig4cloud/pigx/gateway/filter/PigxRequestGlobalFilter.java new file mode 100644 index 0000000..386954b --- /dev/null +++ b/as-gateway/src/main/java/com/pig4cloud/pigx/gateway/filter/PigxRequestGlobalFilter.java @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.gateway.filter; + +import com.pig4cloud.pigx.common.core.constant.CommonConstants; +import com.pig4cloud.pigx.common.core.constant.SecurityConstants; +import org.springframework.cloud.gateway.filter.GatewayFilterChain; +import org.springframework.cloud.gateway.filter.GlobalFilter; +import org.springframework.core.Ordered; +import org.springframework.http.server.reactive.ServerHttpRequest; +import org.springframework.stereotype.Component; +import org.springframework.util.StringUtils; +import org.springframework.web.server.ServerWebExchange; +import reactor.core.publisher.Mono; + +import java.util.Arrays; +import java.util.Collections; +import java.util.stream.Collectors; + +import static org.springframework.cloud.gateway.support.ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR; +import static org.springframework.cloud.gateway.support.ServerWebExchangeUtils.addOriginalRequestUrl; + +/** + * @author lengleng + * @date 2018/10/8 + *

+ * 全局拦截器,作用所有的微服务 + *

+ * 1. 对请求头中参数进行处理 from 参数进行清洗 2. 重写StripPrefix = 1,支持全局 + *

+ * 支持swagger添加X-Forwarded-Prefix header (F SR2 已经支持,不需要自己维护) + */ +@Component +public class PigxRequestGlobalFilter implements GlobalFilter, Ordered { + + /** + * Process the Web request and (optionally) delegate to the next {@code WebFilter} + * through the given {@link GatewayFilterChain}. + * @param exchange the current server exchange + * @param chain provides a way to delegate to the next filter + * @return {@code Mono} to indicate when request processing is complete + */ + @Override + public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) { + // 1. 清洗请求头中from 参数 + ServerHttpRequest request = exchange.getRequest().mutate().headers(httpHeaders -> { + httpHeaders.remove(SecurityConstants.FROM); + // 设置请求时间 + httpHeaders.put(CommonConstants.REQUEST_START_TIME, + Collections.singletonList(String.valueOf(System.currentTimeMillis()))); + }).build(); + + // 2. 重写StripPrefix + addOriginalRequestUrl(exchange, request.getURI()); + String rawPath = request.getURI().getRawPath(); + String newPath = "/" + Arrays.stream(StringUtils.tokenizeToStringArray(rawPath, "/")).skip(1L) + .collect(Collectors.joining("/")); + ServerHttpRequest newRequest = request.mutate().path(newPath).build(); + exchange.getAttributes().put(GATEWAY_REQUEST_URL_ATTR, newRequest.getURI()); + + return chain.filter(exchange.mutate().request(newRequest.mutate().build()).build()); + } + + @Override + public int getOrder() { + return 10; + } + +} diff --git a/as-gateway/src/main/java/com/pig4cloud/pigx/gateway/filter/PreviewGatewayFilter.java b/as-gateway/src/main/java/com/pig4cloud/pigx/gateway/filter/PreviewGatewayFilter.java new file mode 100644 index 0000000..c8451c5 --- /dev/null +++ b/as-gateway/src/main/java/com/pig4cloud/pigx/gateway/filter/PreviewGatewayFilter.java @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.gateway.filter; + +import cn.hutool.core.util.StrUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.cloud.gateway.filter.GatewayFilter; +import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; +import org.springframework.http.server.reactive.ServerHttpRequest; +import org.springframework.http.server.reactive.ServerHttpResponse; +import org.springframework.stereotype.Component; + +/** + * @author lengleng + * @date 2018/8/21 演示环境过滤处理 + */ +@Slf4j +@Component +public class PreviewGatewayFilter extends AbstractGatewayFilterFactory { + + private static final String TOKEN = "token"; + + @Override + public GatewayFilter apply(Object config) { + return (exchange, chain) -> { + ServerHttpRequest request = exchange.getRequest(); + + // GET,直接向下执行 + if (StrUtil.equalsIgnoreCase(request.getMethodValue(), HttpMethod.GET.name()) + || StrUtil.containsIgnoreCase(request.getURI().getPath(), TOKEN)) { + return chain.filter(exchange); + } + + log.warn("演示环境不能操作-> {},{}", request.getMethodValue(), request.getURI().getPath()); + ServerHttpResponse response = exchange.getResponse(); + response.setStatusCode(HttpStatus.LOCKED); + return response.setComplete(); + }; + } + +} diff --git a/as-gateway/src/main/java/com/pig4cloud/pigx/gateway/filter/ValidateCodeGatewayFilter.java b/as-gateway/src/main/java/com/pig4cloud/pigx/gateway/filter/ValidateCodeGatewayFilter.java new file mode 100644 index 0000000..cb75ab3 --- /dev/null +++ b/as-gateway/src/main/java/com/pig4cloud/pigx/gateway/filter/ValidateCodeGatewayFilter.java @@ -0,0 +1,204 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.gateway.filter; + +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.anji.captcha.model.vo.CaptchaVO; +import com.anji.captcha.service.CaptchaService; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.pig4cloud.pigx.common.core.constant.CacheConstants; +import com.pig4cloud.pigx.common.core.constant.CommonConstants; +import com.pig4cloud.pigx.common.core.constant.SecurityConstants; +import com.pig4cloud.pigx.common.core.constant.enums.CaptchaFlagTypeEnum; +import com.pig4cloud.pigx.common.core.exception.ValidateCodeException; +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.common.core.util.SpringContextHolder; +import com.pig4cloud.pigx.common.core.util.WebUtils; +import lombok.AllArgsConstructor; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.springframework.cloud.gateway.filter.GatewayFilter; +import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.serializer.StringRedisSerializer; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.server.reactive.ServerHttpRequest; +import org.springframework.http.server.reactive.ServerHttpResponse; +import org.springframework.stereotype.Component; +import reactor.core.publisher.Mono; + +/** + * @author lengleng + * @date 2020/5/19 登录逻辑验证码处理 + */ +@Slf4j +@Component +@AllArgsConstructor +@SuppressWarnings("all") +public class ValidateCodeGatewayFilter extends AbstractGatewayFilterFactory { + + private final ObjectMapper objectMapper; + + private final RedisTemplate redisTemplate; + + @Override + public GatewayFilter apply(Object config) { + return (exchange, chain) -> { + ServerHttpRequest request = exchange.getRequest(); + + // 不是登录请求直接向下执行 + if (!StrUtil.containsAnyIgnoreCase(request.getURI().getPath(), SecurityConstants.OAUTH_TOKEN_URL)) { + return chain.filter(exchange); + } + + // 刷新token,直接向下执行 + String grantType = request.getQueryParams().getFirst("grant_type"); + if (StrUtil.equals(SecurityConstants.REFRESH_TOKEN, grantType)) { + return chain.filter(exchange); + } + + // mobile模式, 如果请求不包含mobile 参数直接 + String mobile = request.getQueryParams().getFirst(SecurityConstants.GRANT_MOBILE); + if (StrUtil.equals(SecurityConstants.GRANT_MOBILE, grantType) && StrUtil.isBlank(mobile)) { + throw new ValidateCodeException(); + } + + // mobile模式, 社交登录模式不校验验证码直接跳过 + if (StrUtil.equals(SecurityConstants.GRANT_MOBILE, grantType) && !StrUtil.contains(mobile, "SMS")) { + return chain.filter(exchange); + } + + // 判断客户端是否跳过检验 + if (!isCheckCaptchaClient(request)) { + return chain.filter(exchange); + } + + try { + // 校验验证码 + checkCode(request); + } + catch (Exception e) { + ServerHttpResponse response = exchange.getResponse(); + response.getHeaders().setContentType(MediaType.APPLICATION_JSON); + response.setStatusCode(HttpStatus.PRECONDITION_REQUIRED); + try { + return response.writeWith(Mono.just( + response.bufferFactory().wrap(objectMapper.writeValueAsBytes(R.failed(e.getMessage()))))); + } + catch (JsonProcessingException e1) { + log.error("对象输出异常", e1); + } + } + + return chain.filter(exchange); + }; + } + + /** + * 是否需要校验客户端,根据client 查询客户端配置 + * @param request 请求 + * @return true 需要校验, false 不需要校验 + */ + private boolean isCheckCaptchaClient(ServerHttpRequest request) { + String header = request.getHeaders().getFirst(HttpHeaders.AUTHORIZATION); + String clientId = WebUtils.extractClientId(header).orElse(null); + // 获取租户拼接区分租户的key + String tenantId = request.getHeaders().getFirst(CommonConstants.TENANT_ID); + String key = String.format("%s:%s:%s", StrUtil.isBlank(tenantId) ? CommonConstants.TENANT_ID_1 : tenantId, + CacheConstants.CLIENT_FLAG, clientId); + + redisTemplate.setKeySerializer(new StringRedisSerializer()); + Object val = redisTemplate.opsForValue().get(key); + + // 当配置不存在时,不用校验 + if (val == null) { + return false; + } + + JSONObject information = JSONUtil.parseObj(val.toString()); + if (StrUtil.equals(CaptchaFlagTypeEnum.OFF.getType(), information.getStr(CommonConstants.CAPTCHA_FLAG))) { + return false; + } + return true; + } + + /** + * 检查code + * @param request + */ + @SneakyThrows + private void checkCode(ServerHttpRequest request) { + String code = request.getQueryParams().getFirst("code"); + + if (StrUtil.isBlank(code)) { + throw new ValidateCodeException("验证码不能为空"); + } + + String randomStr = request.getQueryParams().getFirst("randomStr"); + + // 若是滑块登录 + if (CommonConstants.IMAGE_CODE_TYPE.equalsIgnoreCase(randomStr)) { + CaptchaService captchaService = SpringContextHolder.getBean(CaptchaService.class); + CaptchaVO vo = new CaptchaVO(); + vo.setCaptchaVerification(code); + vo.setCaptchaType(CommonConstants.IMAGE_CODE_TYPE); + if (!captchaService.verification(vo).isSuccess()) { + throw new ValidateCodeException("验证码不能为空"); + } + return; + } + + // https://gitee.com/log4j/pig/issues/IWA0D + String mobile = request.getQueryParams().getFirst("mobile"); + if (StrUtil.isNotBlank(mobile)) { + randomStr = mobile; + } + + String key = CacheConstants.DEFAULT_CODE_KEY + randomStr; + redisTemplate.setKeySerializer(new StringRedisSerializer()); + + if (!redisTemplate.hasKey(key)) { + throw new ValidateCodeException("验证码不合法"); + } + + Object codeObj = redisTemplate.opsForValue().get(key); + + if (codeObj == null) { + throw new ValidateCodeException("验证码不合法"); + } + + String saveCode = codeObj.toString(); + if (StrUtil.isBlank(saveCode)) { + redisTemplate.delete(key); + throw new ValidateCodeException("验证码不合法"); + } + + if (!StrUtil.equals(saveCode, code)) { + redisTemplate.delete(key); + throw new ValidateCodeException("验证码不合法"); + } + + redisTemplate.delete(key); + } + +} diff --git a/as-gateway/src/main/java/com/pig4cloud/pigx/gateway/handler/ImageCodeCheckHandler.java b/as-gateway/src/main/java/com/pig4cloud/pigx/gateway/handler/ImageCodeCheckHandler.java new file mode 100644 index 0000000..638e390 --- /dev/null +++ b/as-gateway/src/main/java/com/pig4cloud/pigx/gateway/handler/ImageCodeCheckHandler.java @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.gateway.handler; + +import com.anji.captcha.model.common.ResponseModel; +import com.anji.captcha.model.vo.CaptchaVO; +import com.anji.captcha.service.CaptchaService; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.pig4cloud.pigx.common.core.constant.CommonConstants; +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.common.core.util.SpringContextHolder; +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.stereotype.Component; +import org.springframework.web.reactive.function.BodyInserters; +import org.springframework.web.reactive.function.server.HandlerFunction; +import org.springframework.web.reactive.function.server.ServerRequest; +import org.springframework.web.reactive.function.server.ServerResponse; +import reactor.core.publisher.Mono; + +/** + * @author lengleng + * @date 2020/5/19 验证码生成逻辑处理类 + */ +@Slf4j +@Component +@RequiredArgsConstructor +public class ImageCodeCheckHandler implements HandlerFunction { + + private final ObjectMapper objectMapper; + + @Override + @SneakyThrows + public Mono handle(ServerRequest request) { + CaptchaVO vo = new CaptchaVO(); + vo.setPointJson(request.queryParam("pointJson").get()); + vo.setToken(request.queryParam("token").get()); + vo.setCaptchaType(CommonConstants.IMAGE_CODE_TYPE); + + CaptchaService captchaService = SpringContextHolder.getBean(CaptchaService.class); + ResponseModel responseModel = captchaService.check(vo); + + return ServerResponse.status(HttpStatus.OK).contentType(MediaType.APPLICATION_JSON) + .body(BodyInserters.fromValue(objectMapper.writeValueAsString(R.ok(responseModel)))); + } + +} diff --git a/as-gateway/src/main/java/com/pig4cloud/pigx/gateway/handler/ImageCodeCreateHandler.java b/as-gateway/src/main/java/com/pig4cloud/pigx/gateway/handler/ImageCodeCreateHandler.java new file mode 100644 index 0000000..0822794 --- /dev/null +++ b/as-gateway/src/main/java/com/pig4cloud/pigx/gateway/handler/ImageCodeCreateHandler.java @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.gateway.handler; + +import com.anji.captcha.model.common.ResponseModel; +import com.anji.captcha.model.vo.CaptchaVO; +import com.anji.captcha.service.CaptchaService; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.pig4cloud.pigx.common.core.constant.CommonConstants; +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.common.core.util.SpringContextHolder; +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.stereotype.Component; +import org.springframework.web.reactive.function.BodyInserters; +import org.springframework.web.reactive.function.server.HandlerFunction; +import org.springframework.web.reactive.function.server.ServerRequest; +import org.springframework.web.reactive.function.server.ServerResponse; +import reactor.core.publisher.Mono; + +/** + * @author lengleng + * @date 2020/5/19 验证码生成逻辑处理类 + */ +@Slf4j +@Component +@RequiredArgsConstructor +public class ImageCodeCreateHandler implements HandlerFunction { + + private final ObjectMapper objectMapper; + + @Override + @SneakyThrows + public Mono handle(ServerRequest serverRequest) { + CaptchaVO vo = new CaptchaVO(); + vo.setCaptchaType(CommonConstants.IMAGE_CODE_TYPE); + CaptchaService captchaService = SpringContextHolder.getBean(CaptchaService.class); + ResponseModel responseModel = captchaService.get(vo); + + return ServerResponse.status(HttpStatus.OK).contentType(MediaType.APPLICATION_JSON) + .body(BodyInserters.fromValue(objectMapper.writeValueAsString(R.ok(responseModel)))); + } + +} diff --git a/as-gateway/src/main/resources/META-INF/services/com.anji.captcha.service.CaptchaCacheService b/as-gateway/src/main/resources/META-INF/services/com.anji.captcha.service.CaptchaCacheService new file mode 100644 index 0000000..e5d35c6 --- /dev/null +++ b/as-gateway/src/main/resources/META-INF/services/com.anji.captcha.service.CaptchaCacheService @@ -0,0 +1 @@ +com.pig4cloud.pigx.gateway.config.CaptchaCacheServiceProvider diff --git a/as-gateway/src/main/resources/application.yml b/as-gateway/src/main/resources/application.yml new file mode 100644 index 0000000..40ad297 --- /dev/null +++ b/as-gateway/src/main/resources/application.yml @@ -0,0 +1,18 @@ +server: + port: 9999 + +spring: + application: + name: @artifactId@ + cloud: + nacos: + username: @nacos.username@ + password: @nacos.password@ + discovery: + server-addr: ${NACOS_HOST:pigx-register}:${NACOS_PORT:8848} + config: + server-addr: ${spring.cloud.nacos.discovery.server-addr} + config: + import: + - optional:nacos:application-@profiles.active@.yml + - optional:nacos:${spring.application.name}-@profiles.active@.yml diff --git a/as-gateway/src/main/resources/logback-spring.xml b/as-gateway/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..7171e6f --- /dev/null +++ b/as-gateway/src/main/resources/logback-spring.xml @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + + + + + + ${log.path}/debug.log + + ${log.path}/%d{yyyy-MM, aux}/debug.%d{yyyy-MM-dd}.%i.log.gz + 50MB + 30 + + + %date [%thread] %-5level [%logger{50}] %file:%line - %msg%n + + + + + + ${log.path}/error.log + + ${log.path}/%d{yyyy-MM}/error.%d{yyyy-MM-dd}.%i.log.gz + 50MB + 30 + + + %date [%thread] %-5level [%logger{50}] %file:%line - %msg%n + + + ERROR + + + + + + + + + + + + + + + + + + + + diff --git a/as-upms/as-upms-api/pom.xml b/as-upms/as-upms-api/pom.xml new file mode 100644 index 0000000..3ad1f32 --- /dev/null +++ b/as-upms/as-upms-api/pom.xml @@ -0,0 +1,49 @@ + + + 4.0.0 + + com.pig4cloud + as-upms + 5.2.0 + + + as-upms-api + jar + + pigx 通用用户权限管理系统公共api模块 + + + + + + com.github.yulichang + mybatis-plus-join-annotation + + + + com.pig4cloud + pigx-common-core + + + + com.baomidou + mybatis-plus-extension + + + + com.pig4cloud + pigx-common-feign + + + + com.pig4cloud + pigx-common-excel + + + + org.javers + javers-core + + + diff --git a/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/dto/SysFileGroupDTO.java b/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/dto/SysFileGroupDTO.java new file mode 100644 index 0000000..15d129d --- /dev/null +++ b/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/dto/SysFileGroupDTO.java @@ -0,0 +1,24 @@ +package com.pig4cloud.pigx.admin.api.dto; + +import lombok.Data; + +/** + * 文件传输DTO + * + * @author lengleng + * @date 2023/7/26 + */ +@Data +public class SysFileGroupDTO { + + /** + * 文件组 + */ + private Long groupId; + + /** + * 文件id + */ + private Long[] ids; + +} diff --git a/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/dto/SysLogDTO.java b/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/dto/SysLogDTO.java new file mode 100644 index 0000000..5b0d75e --- /dev/null +++ b/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/dto/SysLogDTO.java @@ -0,0 +1,101 @@ +package com.pig4cloud.pigx.admin.api.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.time.LocalDateTime; + +/** + * @author lengleng + * @date 2020/10/9 + *

+ * 日志查询传输对象 + */ +@Data +@Schema(description = "日志查询对象") +public class SysLogDTO { + + /** + * 编号 + */ + private Long id; + + /** + * 日志类型 + */ + @NotBlank(message = "日志类型不能为空") + private String logType; + + /** + * 日志标题 + */ + @NotBlank(message = "日志标题不能为空") + private String title; + + /** + * 创建者 + */ + private String createBy; + + /** + * 更新时间 + */ + private LocalDateTime updateTime; + + /** + * 操作IP地址 + */ + private String remoteAddr; + + /** + * 用户代理 + */ + private String userAgent; + + /** + * 请求URI + */ + private String requestUri; + + /** + * 操作方式 + */ + private String method; + + /** + * 操作提交的数据 + */ + private String params; + + /** + * 参数重写成object + */ + private Object body; + + /** + * 执行时间 + */ + private Long time; + + /** + * 异常信息 + */ + private String exception; + + /** + * 服务ID + */ + private String serviceId; + + /** + * 创建时间区间 [开始时间,结束时间] + */ + private LocalDateTime[] createTime; + + /** + * 租户编号 + */ + private Long tenantId; + +} diff --git a/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/dto/SysOauthClientDetailsDTO.java b/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/dto/SysOauthClientDetailsDTO.java new file mode 100644 index 0000000..e00bde3 --- /dev/null +++ b/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/dto/SysOauthClientDetailsDTO.java @@ -0,0 +1,30 @@ +package com.pig4cloud.pigx.admin.api.dto; + +import com.pig4cloud.pigx.admin.api.entity.SysOauthClientDetails; +import lombok.Data; + +/** + * @author lengleng + * @date 2020/11/18 + *

+ * 终端管理传输对象 + */ +@Data +public class SysOauthClientDetailsDTO extends SysOauthClientDetails { + + /** + * 验证码开关 + */ + private String captchaFlag; + + /** + * 前端密码传输是否加密 + */ + private String encFlag; + + /** + * 客户端允许同时在线数量 + */ + private String onlineQuantity; + +} diff --git a/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/dto/UserDTO.java b/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/dto/UserDTO.java new file mode 100644 index 0000000..ceb16b0 --- /dev/null +++ b/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/dto/UserDTO.java @@ -0,0 +1,61 @@ +/* + * + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + * + */ + +package com.pig4cloud.pigx.admin.api.dto; + +import com.pig4cloud.pigx.admin.api.entity.SysUser; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.List; + +/** + * @author lengleng + * @date 2017/11/5 + */ +@Data +@Schema(description = "系统用户传输对象") +@EqualsAndHashCode(callSuper = true) +public class UserDTO extends SysUser { + + /** + * 角色ID + */ + @Schema(description = "角色id集合") + private List role; + + /** + * 部门id + */ + @Schema(description = "部门id") + private Long deptId; + + /** + * 岗位ID + */ + private List post; + + /** + * 新密码 + */ + @Schema(description = "新密码") + private String newpassword1; + +} diff --git a/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/dto/UserInfo.java b/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/dto/UserInfo.java new file mode 100644 index 0000000..b592e78 --- /dev/null +++ b/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/dto/UserInfo.java @@ -0,0 +1,54 @@ +/* + * + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + * + */ + +package com.pig4cloud.pigx.admin.api.dto; + +import com.pig4cloud.pigx.admin.api.entity.SysUser; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serializable; + +/** + * @author lengleng + * @date 2017/11/11 + */ +@Data +@Schema(description = "用户信息") +public class UserInfo implements Serializable { + + /** + * 用户基本信息 + */ + @Schema(description = "用户基本信息") + private SysUser sysUser; + + /** + * 权限标识集合 + */ + @Schema(description = "权限标识集合") + private String[] permissions; + + /** + * 角色集合 + */ + @Schema(description = "角色标识集合") + private Long[] roles; + +} diff --git a/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/entity/SysAuditLog.java b/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/entity/SysAuditLog.java new file mode 100644 index 0000000..d7ad25f --- /dev/null +++ b/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/entity/SysAuditLog.java @@ -0,0 +1,99 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.admin.api.entity; + +import com.baomidou.mybatisplus.annotation.*; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.time.LocalDateTime; + +/** + * 审计记录表 + * + * @author PIG + * @date 2023-02-28 20:12:23 + */ +@Data +@TableName("sys_audit_log") +@EqualsAndHashCode(callSuper = true) +@Schema(description = "审计记录表") +public class SysAuditLog extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(type = IdType.ASSIGN_ID) + @Schema(description = "主键") + private Long id; + + /** + * 审计名称 + */ + @Schema(description = "审计名称") + private String auditName; + + /** + * 字段名称 + */ + @Schema(description = "字段名称") + private String auditField; + + /** + * 变更前值 + */ + @Schema(description = "变更前值") + private String beforeVal; + + /** + * 变更后值 + */ + @Schema(description = "变更后值") + private String afterVal; + + /** + * 操作人 + */ + @Schema(description = "操作人") + private String createBy; + + /** + * 操作时间 + */ + @Schema(description = "操作时间") + private LocalDateTime createTime; + + /** + * 删除标记 + */ + @Schema(description = "删除标记") + @TableLogic + @TableField(fill = FieldFill.INSERT) + private String delFlag; + + /** + * 租户ID + */ + @Schema(description = "租户ID") + private Long tenantId; + +} diff --git a/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/entity/SysDept.java b/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/entity/SysDept.java new file mode 100644 index 0000000..9ff2671 --- /dev/null +++ b/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/entity/SysDept.java @@ -0,0 +1,107 @@ +/* + * + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + * + */ + +package com.pig4cloud.pigx.admin.api.entity; + +import com.baomidou.mybatisplus.annotation.*; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.time.LocalDateTime; + +/** + *

+ * 部门管理 + *

+ * + * @author lengleng + * @since 2018-01-22 + */ +@Data +@Schema(description = "部门") +@EqualsAndHashCode(callSuper = true) +public class SysDept extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "dept_id", type = IdType.ASSIGN_ID) + @Schema(description = "部门id") + private Long deptId; + + /** + * 部门名称 + */ + @NotBlank(message = "部门名称不能为空") + @Schema(description = "部门名称") + private String name; + + /** + * 排序 + */ + @NotNull(message = "排序值不能为空") + @Schema(description = "排序值") + private Integer sortOrder; + + /** + * 创建人 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description = "创建人") + private String createBy; + + /** + * 修改人 + */ + @TableField(fill = FieldFill.UPDATE) + @Schema(description = "修改人") + private String updateBy; + + /** + * 创建时间 + */ + @Schema(description = "创建时间") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** + * 修改时间 + */ + @Schema(description = "修改时间") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** + * 父级部门id + */ + @Schema(description = "父级部门id") + private Long parentId; + + /** + * 是否删除 1:已删除 0:正常 + */ + @TableLogic + @Schema(description = "删除标记,1:已删除,0:正常") + @TableField(fill = FieldFill.INSERT) + private String delFlag; + +} diff --git a/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/entity/SysDeptRelation.java b/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/entity/SysDeptRelation.java new file mode 100644 index 0000000..b66683e --- /dev/null +++ b/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/entity/SysDeptRelation.java @@ -0,0 +1,54 @@ +/* + * + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + * + */ + +package com.pig4cloud.pigx.admin.api.entity; + +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + *

+ * 部门关系表 + *

+ * + * @author lengleng + * @since 2018-01-22 + */ +@Data +@Schema(description = "部门关系") +@EqualsAndHashCode(callSuper = true) +public class SysDeptRelation extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 祖先节点 + */ + @Schema(description = "祖先节点") + private Long ancestor; + + /** + * 后代节点 + */ + @Schema(description = "后代节点") + private Long descendant; + +} diff --git a/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/entity/SysDict.java b/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/entity/SysDict.java new file mode 100644 index 0000000..22420f5 --- /dev/null +++ b/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/entity/SysDict.java @@ -0,0 +1,107 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ +package com.pig4cloud.pigx.admin.api.entity; + +import com.baomidou.mybatisplus.annotation.*; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.time.LocalDateTime; + +/** + * 字典表 + * + * @author lengleng + * @date 2019/03/19 + */ +@Data +@Schema(description = "字典类型") +@EqualsAndHashCode(callSuper = true) +public class SysDict extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 编号 + */ + @TableId(type = IdType.ASSIGN_ID) + @Schema(description = "字典编号") + private Long id; + + /** + * 类型 + */ + @Schema(description = "字典类型") + private String dictType; + + /** + * 描述 + */ + @Schema(description = "字典描述") + private String description; + + /** + * 创建时间 + */ + @Schema(description = "创建时间") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** + * 更新时间 + */ + @Schema(description = "更新时间") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** + * 是否是系统内置 + */ + @Schema(description = "是否系统内置") + private String systemFlag; + + /** + * 备注信息 + */ + @Schema(description = "备注信息") + private String remarks; + + /** + * 创建人 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description = "创建人") + private String createBy; + + /** + * 修改人 + */ + @TableField(fill = FieldFill.UPDATE) + @Schema(description = "修改人") + private String updateBy; + + /** + * 删除标记 + */ + @TableLogic + @TableField(fill = FieldFill.INSERT) + @Schema(description = "删除标记,1:已删除,0:正常") + private String delFlag; + +} diff --git a/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/entity/SysDictItem.java b/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/entity/SysDictItem.java new file mode 100644 index 0000000..ca331b3 --- /dev/null +++ b/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/entity/SysDictItem.java @@ -0,0 +1,127 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ +package com.pig4cloud.pigx.admin.api.entity; + +import com.baomidou.mybatisplus.annotation.*; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import com.fasterxml.jackson.annotation.JsonProperty; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.time.LocalDateTime; + +/** + * 字典项 + * + * @author lengleng + * @date 2019/03/19 + */ +@Data +@Schema(description = "字典项") +@EqualsAndHashCode(callSuper = true) +public class SysDictItem extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 编号 + */ + @TableId(type = IdType.ASSIGN_ID) + @Schema(description = "字典项id") + private Long id; + + /** + * 所属字典类id + */ + @Schema(description = "所属字典类id") + private Long dictId; + + /** + * 数据值 + */ + @Schema(description = "数据值") + @JsonProperty(value = "value") + private String itemValue; + + /** + * 标签名 + */ + @Schema(description = "标签名") + private String label; + + /** + * 类型 + */ + @Schema(description = "类型") + private String dictType; + + /** + * 描述 + */ + @Schema(description = "描述") + private String description; + + /** + * 排序(升序) + */ + @Schema(description = "排序值,默认升序") + private Integer sortOrder; + + /** + * 创建人 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description = "创建人") + private String createBy; + + /** + * 修改人 + */ + @TableField(fill = FieldFill.UPDATE) + @Schema(description = "修改人") + private String updateBy; + + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description = "创建时间") + private LocalDateTime createTime; + + /** + * 更新时间 + */ + @TableField(fill = FieldFill.UPDATE) + @Schema(description = "更新时间") + private LocalDateTime updateTime; + + /** + * 备注信息 + */ + @Schema(description = "备注信息") + private String remarks; + + /** + * 删除标记 + */ + @TableLogic + @TableField(fill = FieldFill.INSERT) + @Schema(description = "删除标记,1:已删除,0:正常") + private String delFlag; + +} diff --git a/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/entity/SysFile.java b/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/entity/SysFile.java new file mode 100644 index 0000000..4e1cfa6 --- /dev/null +++ b/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/entity/SysFile.java @@ -0,0 +1,120 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.admin.api.entity; + +import com.baomidou.mybatisplus.annotation.*; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.time.LocalDateTime; + +/** + * 文件管理 + * + * @author Luckly + * @date 2019-06-18 17:18:42 + */ +@Data +@Schema(description = "文件") +@EqualsAndHashCode(callSuper = true) +public class SysFile extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 编号 + */ + @TableId(type = IdType.ASSIGN_ID) + @Schema(description = "文件编号") + private Long id; + + /** + * 文件名 + */ + @Schema(description = "文件名") + private String fileName; + + /** + * 原文件名 + */ + @Schema(description = "原始文件名") + private String original; + + /** + * 容器名称 + */ + @Schema(description = "存储桶名称") + private String bucketName; + + /** + * 文件类型 + */ + @Schema(description = "文件类型") + private String type; + + /** + * 文件组 + */ + @Schema(description = "文件组") + private Long groupId; + + /** + * 文件大小 + */ + @Schema(description = "文件大小") + private Long fileSize; + + /** + * 上传人 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description = "创建者") + private String createBy; + + /** + * 上传时间 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description = "创建时间") + private LocalDateTime createTime; + + /** + * 更新人 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description = "更新者") + private String updateBy; + + /** + * 更新时间 + */ + @TableField(fill = FieldFill.UPDATE) + @Schema(description = "更新时间") + private LocalDateTime updateTime; + + /** + * 删除标识:1-删除,0-正常 + */ + @TableLogic + @TableField(fill = FieldFill.INSERT) + @Schema(description = "删除标记,1:已删除,0:正常") + private String delFlag; + +} diff --git a/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/entity/SysFileGroup.java b/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/entity/SysFileGroup.java new file mode 100644 index 0000000..0c9c22a --- /dev/null +++ b/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/entity/SysFileGroup.java @@ -0,0 +1,73 @@ +package com.pig4cloud.pigx.admin.api.entity; + +import com.baomidou.mybatisplus.annotation.*; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.time.LocalDateTime; + +/** + * 文件类型 + * + * @author lengleng + * @date 2023/7/25 + */ +@Data +@Schema(description = "文件") +@EqualsAndHashCode(callSuper = true) +public class SysFileGroup extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(type = IdType.ASSIGN_ID) + @Schema(description = "主键ID") + private Long id; + + @Schema(description = "父级ID") + private Long pid; + + @Schema(description = "分类类型: [10=图片,20=视频]") + private Long type; + + @Schema(description = "分类名称") + private String name; + + /** + * 上传人 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description = "创建者") + private String createBy; + + /** + * 上传时间 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description = "创建时间") + private LocalDateTime createTime; + + /** + * 更新人 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description = "更新者") + private String updateBy; + + /** + * 更新时间 + */ + @TableField(fill = FieldFill.UPDATE) + @Schema(description = "更新时间") + private LocalDateTime updateTime; + + /** + * 删除标识:1-删除,0-正常 + */ + @TableLogic + @TableField(fill = FieldFill.INSERT) + @Schema(description = "删除标记,1:已删除,0:正常") + private String delFlag; + +} diff --git a/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/entity/SysI18nEntity.java b/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/entity/SysI18nEntity.java new file mode 100644 index 0000000..6bb87b8 --- /dev/null +++ b/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/entity/SysI18nEntity.java @@ -0,0 +1,102 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.admin.api.entity; + +import com.baomidou.mybatisplus.annotation.*; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.time.LocalDateTime; + +/** + * 系统表-国际化 + * + * @author PIG + * @date 2023-02-14 09:07:01 + */ +@Data +@TableName("sys_i18n") +@EqualsAndHashCode(callSuper = true) +@Schema(description = "系统表-国际化") +public class SysI18nEntity extends Model { + + private static final long serialVersionUID = 1L; + + /** + * id + */ + @TableId(type = IdType.ASSIGN_ID) + @Schema(description = "id") + private Long id; + + /** + * key + */ + @Schema(description = "name") + private String name; + + /** + * 中文 + */ + @Schema(description = "中文") + private String zhCn; + + /** + * 英文 + */ + @Schema(description = "英文") + private String en; + + /** + * 创建人 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description = "创建人") + private String createBy; + + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description = "创建时间") + private LocalDateTime createTime; + + /** + * 修改人 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + @Schema(description = "修改人") + private String updateBy; + + /** + * 更新时间 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + @Schema(description = "更新时间") + private LocalDateTime updateTime; + + /** + * 删除标记 + */ + @TableLogic + @Schema(description = "删除标记") + private String delFlag; + +} diff --git a/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/entity/SysLog.java b/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/entity/SysLog.java new file mode 100644 index 0000000..212a851 --- /dev/null +++ b/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/entity/SysLog.java @@ -0,0 +1,158 @@ +/* + * + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + * + */ + +package com.pig4cloud.pigx.admin.api.entity; + +import com.alibaba.excel.annotation.ExcelIgnore; +import com.alibaba.excel.annotation.ExcelProperty; +import com.baomidou.mybatisplus.annotation.*; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + *

+ * 日志表 + *

+ * + * @author lengleng + * @since 2017-11-20 + */ +@Data +@Schema(description = "日志") +public class SysLog implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 编号 + */ + @TableId(type = IdType.ASSIGN_ID) + @ExcelProperty("日志编号") + @Schema(description = "日志编号") + private Long id; + + /** + * 日志类型 + */ + @NotBlank(message = "日志类型不能为空") + @ExcelProperty("日志类型(0-正常 9-错误)") + @Schema(description = "日志类型") + private String logType; + + /** + * 日志标题 + */ + @NotBlank(message = "日志标题不能为空") + @ExcelProperty("日志标题") + @Schema(description = "日志标题") + private String title; + + /** + * 创建者 + */ + @ExcelProperty("创建人") + @TableField(fill = FieldFill.INSERT) + @Schema(description = "创建人") + private String createBy; + + /** + * 创建时间 + */ + @ExcelProperty("创建时间") + @TableField(fill = FieldFill.INSERT) + @Schema(description = "创建时间") + private LocalDateTime createTime; + + /** + * 更新时间 + */ + @ExcelIgnore + @TableField(fill = FieldFill.UPDATE) + @Schema(description = "更新时间") + private LocalDateTime updateTime; + + /** + * 操作IP地址 + */ + @ExcelProperty("操作ip地址") + @Schema(description = "操作ip地址") + private String remoteAddr; + + /** + * 用户代理 + */ + @Schema(description = "用户代理") + private String userAgent; + + /** + * 请求URI + */ + @ExcelProperty("浏览器") + @Schema(description = "请求uri") + private String requestUri; + + /** + * 操作方式 + */ + @ExcelProperty("操作方式") + @Schema(description = "操作方式") + private String method; + + /** + * 操作提交的数据 + */ + @ExcelProperty("提交数据") + @Schema(description = "提交数据") + private String params; + + /** + * 执行时间 + */ + @ExcelProperty("执行时间") + @Schema(description = "方法执行时间") + private Long time; + + /** + * 异常信息 + */ + @ExcelProperty("异常信息") + @Schema(description = "异常信息") + private String exception; + + /** + * 服务ID + */ + @ExcelProperty("应用标识") + @Schema(description = "应用标识") + private String serviceId; + + /** + * 删除标记 + */ + @TableLogic + @ExcelIgnore + @TableField(fill = FieldFill.INSERT) + @Schema(description = "删除标记,1:已删除,0:正常") + private String delFlag; + +} diff --git a/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/entity/SysMenu.java b/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/entity/SysMenu.java new file mode 100644 index 0000000..9773910 --- /dev/null +++ b/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/entity/SysMenu.java @@ -0,0 +1,150 @@ +/* + * + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + * + */ + +package com.pig4cloud.pigx.admin.api.entity; + +import com.baomidou.mybatisplus.annotation.*; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.time.LocalDateTime; + +/** + *

+ * 菜单权限表 + *

+ * + * @author lengleng + * @since 2017-11-08 + */ +@Data +@Schema(description = "菜单") +@EqualsAndHashCode(callSuper = true) +public class SysMenu extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 菜单ID + */ + @TableId(value = "menu_id", type = IdType.ASSIGN_ID) + @Schema(description = "菜单id") + private Long menuId; + + /** + * 菜单名称 + */ + @NotBlank(message = "菜单名称不能为空") + @Schema(description = "菜单名称") + private String name; + + /** + * 菜单权限标识 + */ + @Schema(description = "菜单权限标识") + private String permission; + + /** + * 父菜单ID + */ + @NotNull(message = "菜单父ID不能为空") + @Schema(description = "菜单父id") + private Long parentId; + + /** + * 图标 + */ + @Schema(description = "菜单图标") + private String icon; + + /** + * 前端路由标识路径,默认和 comment 保持一致 过期 + */ + @Schema(description = "前端路由标识路径") + private String path; + + /** + * 菜单显示隐藏控制 + */ + @Schema(description = "菜单是否显示") + private String visible; + + /** + * 排序值 + */ + @Schema(description = "排序值") + private Integer sortOrder; + + /** + * 菜单类型 (0菜单 1按钮) + */ + @NotNull(message = "菜单类型不能为空") + @Schema(description = "菜单类型,0:菜单 1:按钮") + private String menuType; + + /** + * 路由缓冲 + */ + @Schema(description = "路由缓冲") + private String keepAlive; + + @Schema(description = "菜单是否内嵌") + private String embedded; + + /** + * 创建人 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description = "创建人") + private String createBy; + + /** + * 修改人 + */ + @TableField(fill = FieldFill.UPDATE) + @Schema(description = "修改人") + private String updateBy; + + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description = "创建时间") + private LocalDateTime createTime; + + /** + * 更新时间 + */ + @TableField(fill = FieldFill.UPDATE) + @Schema(description = "更新时间") + private LocalDateTime updateTime; + + /** + * 0--正常 1--删除 + */ + @TableLogic + @TableField(fill = FieldFill.INSERT) + @Schema(description = "删除标记,1:已删除,0:正常") + private String delFlag; + +} diff --git a/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/entity/SysOauthClientDetails.java b/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/entity/SysOauthClientDetails.java new file mode 100644 index 0000000..a3790ac --- /dev/null +++ b/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/entity/SysOauthClientDetails.java @@ -0,0 +1,155 @@ +/* + * + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + * + */ + +package com.pig4cloud.pigx.admin.api.entity; + +import com.baomidou.mybatisplus.annotation.*; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotBlank; +import java.time.LocalDateTime; + +/** + *

+ * 客户端信息 + *

+ * + * @author lengleng + * @since 2018-05-15 + */ +@Data +@Schema(description = "客户端信息") +@EqualsAndHashCode(callSuper = true) +public class SysOauthClientDetails extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.ASSIGN_ID) + @Schema(description = "id") + private Long id; + + /** + * 客户端ID + */ + @NotBlank(message = "client_id 不能为空") + @Schema(description = "客户端id") + private String clientId; + + /** + * 客户端密钥 + */ + @NotBlank(message = "client_secret 不能为空") + @Schema(description = "客户端密钥") + private String clientSecret; + + /** + * 资源ID + */ + @Schema(description = "资源id列表") + private String resourceIds; + + /** + * 作用域 + */ + @NotBlank(message = "scope 不能为空") + @Schema(description = "作用域") + private String scope; + + /** + * 授权方式[A,B,C] + */ + @Schema(description = "授权方式") + private String[] authorizedGrantTypes; + + /** + * 回调地址 + */ + @Schema(description = "回调地址") + private String webServerRedirectUri; + + /** + * 权限 + */ + @Schema(description = "权限列表") + private String authorities; + + /** + * 请求令牌有效时间 + */ + @Schema(description = "请求令牌有效时间") + private Integer accessTokenValidity; + + /** + * 刷新令牌有效时间 + */ + @Schema(description = "刷新令牌有效时间") + private Integer refreshTokenValidity; + + /** + * 扩展信息 + */ + @Schema(description = "扩展信息") + private String additionalInformation; + + /** + * 是否自动放行 + */ + @Schema(description = "是否自动放行") + private String autoapprove; + + /** + * 删除标记 + */ + @TableLogic + @TableField(fill = FieldFill.INSERT) + @Schema(description = "删除标记,1:已删除,0:正常") + private String delFlag; + + /** + * 创建人 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description = "创建人") + private String createBy; + + /** + * 修改人 + */ + @TableField(fill = FieldFill.UPDATE) + @Schema(description = "修改人") + private String updateBy; + + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description = "创建时间") + private LocalDateTime createTime; + + /** + * 更新时间 + */ + @TableField(fill = FieldFill.UPDATE) + @Schema(description = "更新时间") + private LocalDateTime updateTime; + +} diff --git a/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/entity/SysPost.java b/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/entity/SysPost.java new file mode 100644 index 0000000..5e87ee7 --- /dev/null +++ b/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/entity/SysPost.java @@ -0,0 +1,114 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.admin.api.entity; + +import com.baomidou.mybatisplus.annotation.*; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.time.LocalDateTime; + +/** + * 岗位信息表 + * + * @author fxz + * @date 2022-03-26 12:50:43 + */ +@Data +@TableName("sys_post") +@EqualsAndHashCode(callSuper = true) +@Schema(description = "岗位信息表") +public class SysPost extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 岗位ID + */ + @TableId(value = "post_id", type = IdType.ASSIGN_ID) + @Schema(description = "岗位ID") + private Long postId; + + /** + * 岗位编码 + */ + @NotBlank(message = "岗位编码不能为空") + @Schema(description = "岗位编码") + private String postCode; + + /** + * 岗位名称 + */ + @NotBlank(message = "岗位名称不能为空") + @Schema(description = "岗位名称") + private String postName; + + /** + * 岗位排序 + */ + @NotNull(message = "排序值不能为空") + @Schema(description = "岗位排序") + private Integer postSort; + + /** + * 岗位描述 + */ + @Schema(description = "岗位描述") + private String remark; + + /** + * 创建人 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description = "创建人") + private String createBy; + + /** + * 修改人 + */ + @TableField(fill = FieldFill.UPDATE) + @Schema(description = "修改人") + private String updateBy; + + /** + * 是否删除 -1:已删除 0:正常 + */ + @TableLogic + @TableField(fill = FieldFill.INSERT) + @Schema(description = "是否删除 -1:已删除 0:正常") + private String delFlag; + + /** + * 创建时间 + */ + @Schema(description = "创建时间") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** + * 更新时间 + */ + @Schema(description = "更新时间") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + +} diff --git a/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/entity/SysPublicParam.java b/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/entity/SysPublicParam.java new file mode 100644 index 0000000..1f74953 --- /dev/null +++ b/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/entity/SysPublicParam.java @@ -0,0 +1,126 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.admin.api.entity; + +import com.baomidou.mybatisplus.annotation.*; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.time.LocalDateTime; + +/** + * 公共参数配置 + * + * @author Lucky + * @date 2019-04-29 + */ +@Data +@Schema(description = "公共参数") +@EqualsAndHashCode(callSuper = true) +public class SysPublicParam extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 编号 + */ + @TableId(type = IdType.ASSIGN_ID) + @Schema(description = "公共参数编号") + private Long publicId; + + /** + * 公共参数名称 + */ + @Schema(description = "公共参数名称", required = true, example = "公共参数名称") + private String publicName; + + /** + * 公共参数地址值,英文大写+下划线 + */ + @Schema(description = "键[英文大写+下划线]", required = true, example = "PIGX_PUBLIC_KEY") + private String publicKey; + + /** + * 值 + */ + @Schema(description = "值", required = true, example = "999") + private String publicValue; + + /** + * 状态(1有效;2无效;) + */ + @Schema(description = "标识[1有效;2无效]", example = "1") + private String status; + + /** + * 公共参数编码 + */ + @Schema(description = "编码", example = "^(PIG|PIGX)$") + private String validateCode; + + /** + * 是否是系统内置 + */ + @Schema(description = "是否是系统内置") + private String systemFlag; + + /** + * 配置类型:0-默认;1-检索;2-原文;3-报表;4-安全;5-文档;6-消息;9-其他 + */ + @Schema(description = "类型[1-检索;2-原文...]", example = "1") + private String publicType; + + /** + * 创建人 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description = "创建人") + private String createBy; + + /** + * 修改人 + */ + @TableField(fill = FieldFill.UPDATE) + @Schema(description = "修改人") + private String updateBy; + + /** + * 删除标记 + */ + @TableLogic + @TableField(fill = FieldFill.INSERT) + @Schema(description = "删除标记,1:已删除,0:正常") + private String delFlag; + + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description = "创建时间") + private LocalDateTime createTime; + + /** + * 更新时间 + */ + @TableField(fill = FieldFill.UPDATE) + @Schema(description = "更新时间") + private LocalDateTime updateTime; + +} diff --git a/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/entity/SysRole.java b/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/entity/SysRole.java new file mode 100644 index 0000000..d319f74 --- /dev/null +++ b/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/entity/SysRole.java @@ -0,0 +1,113 @@ +/* + * + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + * + */ + +package com.pig4cloud.pigx.admin.api.entity; + +import com.baomidou.mybatisplus.annotation.*; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.time.LocalDateTime; + +/** + *

+ * 角色表 + *

+ * + * @author lengleng + * @since 2017-10-29 + */ +@Data +@Schema(description = "角色") +@EqualsAndHashCode(callSuper = true) +public class SysRole extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "role_id", type = IdType.ASSIGN_ID) + @Schema(description = "角色编号") + private Long roleId; + + @NotBlank(message = "角色名称不能为空") + @Schema(description = "角色名称") + private String roleName; + + @NotBlank(message = "角色标识不能为空") + @Schema(description = "角色标识") + private String roleCode; + + @Schema(description = "角色描述") + private String roleDesc; + + @NotNull(message = "数据权限类型不能为空") + @Schema(description = "数据权限类型") + private Integer dsType; + + /** + * 数据权限作用范围 + */ + @Schema(description = "数据权限作用范围") + private String dsScope; + + /** + * 创建人 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description = "创建人") + private String createBy; + + /** + * 修改人 + */ + @TableField(fill = FieldFill.UPDATE) + @Schema(description = "修改人") + private String updateBy; + + /** + * 创建时间 + */ + @Schema(description = "创建时间") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** + * 修改时间 + */ + @Schema(description = "修改时间") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** + * 删除标识(0-正常,1-删除) + */ + @TableLogic + @TableField(fill = FieldFill.INSERT) + @Schema(description = "删除标记,1:已删除,0:正常") + private String delFlag; + + /** + * 租户ID fix pigX 功能bug -> 默认角色为空报错 (字段未添加) + */ + @Schema(description = "用户所属租户id") + private Long tenantId; +} diff --git a/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/entity/SysRoleMenu.java b/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/entity/SysRoleMenu.java new file mode 100644 index 0000000..c1a5cb4 --- /dev/null +++ b/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/entity/SysRoleMenu.java @@ -0,0 +1,54 @@ +/* + * + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + * + */ + +package com.pig4cloud.pigx.admin.api.entity; + +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + *

+ * 角色菜单表 + *

+ * + * @author lengleng + * @since 2017-10-29 + */ +@Data +@Schema(description = "角色菜单") +@EqualsAndHashCode(callSuper = true) +public class SysRoleMenu extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 角色ID + */ + @Schema(description = "角色id") + private Long roleId; + + /** + * 菜单ID + */ + @Schema(description = "菜单id") + private Long menuId; + +} diff --git a/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/entity/SysRouteConf.java b/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/entity/SysRouteConf.java new file mode 100644 index 0000000..376486e --- /dev/null +++ b/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/entity/SysRouteConf.java @@ -0,0 +1,107 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.admin.api.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import com.fasterxml.jackson.annotation.JsonIgnore; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.time.LocalDateTime; + +/** + * 路由 + * + * @author lengleng + * @date 2018-11-06 10:17:18 + */ +@Data +@Schema(description = "网关路由信息") +@EqualsAndHashCode(callSuper = true) +public class SysRouteConf extends Model { + + private static final long serialVersionUID = 1L; + + @JsonIgnore + @TableId(type = IdType.ASSIGN_ID) + @Schema(description = "主键") + private Long id; + + /** + * 路由ID + */ + @Schema(description = "路由id") + private String routeId; + + /** + * 路由名称 + */ + @Schema(description = "路由名称") + private String routeName; + + /** + * 断言 + */ + @Schema(description = "断言") + private String predicates; + + /** + * 过滤器 + */ + @Schema(description = "过滤器") + private String filters; + + /** + * uri + */ + @Schema(description = "请求uri") + private String uri; + + /** + * 排序 + */ + @Schema(description = "排序值") + private Integer sortOrder; + + @Schema(description = "元数据") + private String metadata; + + /** + * 创建时间 + */ + @Schema(description = "创建时间") + private LocalDateTime createTime; + + /** + * 修改时间 + */ + @Schema(description = "修改时间") + private LocalDateTime updateTime; + + /** + * 删除标识(0-正常,1-删除) + */ + @TableLogic + @Schema(description = "删除标记,1:已删除,0:正常") + private String delFlag; + +} diff --git a/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/entity/SysScheduleEntity.java b/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/entity/SysScheduleEntity.java new file mode 100644 index 0000000..b66efcb --- /dev/null +++ b/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/entity/SysScheduleEntity.java @@ -0,0 +1,123 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.admin.api.entity; + +import com.baomidou.mybatisplus.annotation.*; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; + +/** + * 日程 + * + * @author aeizzz + * @date 2023-03-06 14:26:23 + */ +@Data +@TableName("sys_schedule") +@EqualsAndHashCode(callSuper = true) +@Schema(description = "日程") +public class SysScheduleEntity extends Model { + + private static final long serialVersionUID = 1L; + + /** + * id + */ + @TableId(type = IdType.ASSIGN_ID) + @Schema(description = "id") + private Long id; + + /** + * 标题 + */ + @Schema(description = "标题") + private String title; + + /** + * 日程类型 + */ + @Schema(description = "日程类型") + private String type; + + /** + * 状态 + */ + @Schema(description = "状态") + private String state; + + /** + * 内容 + */ + @Schema(description = "内容") + private String content; + + /** + * 时间 + */ + @Schema(description = "时间") + private LocalTime time; + + /** + * 日期 + */ + @Schema(description = "日期") + private LocalDate date; + + /** + * 创建人 + */ + @Schema(description = "创建人") + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** + * 创建时间 + */ + @Schema(description = "创建时间") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** + * 修改人 + */ + @Schema(description = "修改人") + @TableField(fill = FieldFill.INSERT_UPDATE) + private String updateBy; + + /** + * 更新时间 + */ + @Schema(description = "更新时间") + @TableField(fill = FieldFill.INSERT_UPDATE) + private LocalDateTime updateTime; + + /** + * 删除标记 + */ + @TableLogic + @Schema(description = "删除标记") + @TableField(fill = FieldFill.INSERT) + private String delFlag; + +} diff --git a/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/entity/SysSocialDetails.java b/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/entity/SysSocialDetails.java new file mode 100644 index 0000000..361e590 --- /dev/null +++ b/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/entity/SysSocialDetails.java @@ -0,0 +1,128 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.admin.api.entity; + +import com.baomidou.mybatisplus.annotation.*; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import com.pig4cloud.pigx.common.core.sensitive.Sensitive; +import com.pig4cloud.pigx.common.core.util.ValidGroup; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotBlank; +import java.time.LocalDateTime; + +/** + * 系统社交登录账号表 + * + * @author lengleng + * @date 2018-08-16 21:30:41 + */ +@Data +@Schema(description = "第三方账号信息") +@EqualsAndHashCode(callSuper = true) +public class SysSocialDetails extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主鍵 + */ + @TableId(type = IdType.ASSIGN_ID) + @Schema(description = "主键") + private Long id; + + /** + * 类型 + */ + @NotBlank(message = "类型不能为空") + @Schema(description = "账号类型") + private String type; + + /** + * 描述 + */ + @Schema(description = "描述") + private String remark; + + /** + * appid + */ + @Sensitive(prefixNoMaskLen = 4, suffixNoMaskLen = 4) + @NotBlank(message = "账号不能为空") + @Schema(description = "appId") + private String appId; + + /** + * app_secret + */ + @Sensitive(prefixNoMaskLen = 9, suffixNoMaskLen = 9) + @NotBlank(message = "密钥不能为空", groups = { ValidGroup.Insert.class }) + @Schema(description = "app secret") + private String appSecret; + + /** + * 回调地址 + */ + @Schema(description = "回调地址") + private String redirectUrl; + + /** + * 拓展字段 + */ + @Schema(description = "拓展字段") + private String ext; + + /** + * 创建人 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description = "创建人") + private String createBy; + + /** + * 修改人 + */ + @TableField(fill = FieldFill.UPDATE) + @Schema(description = "修改人") + private String updateBy; + + /** + * 创建时间 + */ + @Schema(description = "创建时间") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** + * 更新时间 + */ + @Schema(description = "更新时间") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** + * 删除标记 + */ + @TableLogic + @TableField(fill = FieldFill.INSERT) + @Schema(description = "删除标记,1:已删除,0:正常") + private String delFlag; + +} diff --git a/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/entity/SysTenant.java b/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/entity/SysTenant.java new file mode 100644 index 0000000..72fc2fc --- /dev/null +++ b/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/entity/SysTenant.java @@ -0,0 +1,167 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.admin.api.entity; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.baomidou.mybatisplus.annotation.*; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.time.LocalDateTime; + +/** + * 租户 + * + * @author lengleng + * @date 2019-05-15 15:55:41 + */ +@Data +@Schema(description = "租户信息") +@EqualsAndHashCode(callSuper = true) +public class SysTenant extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 租户id + */ + @TableId(type = IdType.ASSIGN_ID) + @Schema(description = "租户id") + @ExcelProperty("租户id") + private Long id; + + /** + * 租户名称 + */ + @Schema(description = "租户名称") + @ExcelProperty("租户名称") + private String name; + + /** + * 租户编号 + */ + @Schema(description = "租户编号") + @ExcelProperty("租户编号") + private String code; + + /** + * 租户域名 + */ + @Schema(description = "租户域名") + @ExcelProperty("租户域名") + private String tenantDomain; + + /** + * 网站名称 + */ + @Schema(description = "网站名称") + @ExcelProperty("网站名称") + private String websiteName; + + /** + * logo + */ + @Schema(description = "logo") + @ExcelProperty("logo") + private String logo; + + /** + * footer + */ + @Schema(description = "footer") + @ExcelProperty("footer") + private String footer; + + /** + * 移动端二维码 + */ + @Schema(description = "移动端二维码") + @ExcelProperty("移动端二维码") + private String miniQr; + + /** + * 登录页图片 + */ + @Schema(description = "登录页图片") + @ExcelProperty("登录页图片") + private String background; + + /** + * 开始时间 + */ + @Schema(description = "开始时间") + @ExcelProperty("开始时间") + private LocalDateTime startTime; + + /** + * 结束时间 + */ + @Schema(description = "结束时间") + @ExcelProperty("结束时间") + private LocalDateTime endTime; + + /** + * 0正常 9-冻结 + */ + @Schema(description = "租户冻结标记,9:冻结,0:正常") + @ExcelProperty("租户冻结") + private String status; + + @Schema(description = "租户菜单ID") + @ExcelProperty("租户菜单ID") + private String menuId; + + /** + * 创建人 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description = "创建人") + private String createBy; + + /** + * 修改人 + */ + @TableField(fill = FieldFill.UPDATE) + @Schema(description = "修改人") + private String updateBy; + + /** + * 删除标记 + */ + @TableLogic + @TableField(fill = FieldFill.INSERT) + @Schema(description = "删除标记,1:已删除,0:正常") + private String delFlag; + + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description = "创建时间") + private LocalDateTime createTime; + + /** + * 更新时间 + */ + @TableField(fill = FieldFill.UPDATE) + @Schema(description = "更新时间") + private LocalDateTime updateTime; + +} diff --git a/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/entity/SysUser.java b/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/entity/SysUser.java new file mode 100644 index 0000000..3c61069 --- /dev/null +++ b/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/entity/SysUser.java @@ -0,0 +1,190 @@ +/* + * + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + * + */ + +package com.pig4cloud.pigx.admin.api.entity; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonIgnore; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.javers.core.metamodel.annotation.DiffInclude; +import org.javers.core.metamodel.annotation.PropertyName; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + *

+ * 用户表 + *

+ * + * @author lengleng + * @since 2017-10-29 + */ +@Data +@Schema(description = "用户") +public class SysUser implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键ID + */ + @TableId(value = "user_id", type = IdType.ASSIGN_ID) + @Schema(description = "主键id") + private Long userId; + + /** + * 用户名 + */ + @Schema(description = "用户名") + private String username; + + /** + * 密码 + */ + @Schema(description = "密码") + private String password; + + /** + * 随机盐 + */ + @JsonIgnore + @Schema(description = "随机盐") + private String salt; + + /** + * 创建人 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description = "创建人") + private String createBy; + + /** + * 修改人 + */ + @TableField(fill = FieldFill.UPDATE) + @Schema(description = "修改人") + private String updateBy; + + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description = "创建时间") + private LocalDateTime createTime; + + /** + * 修改时间 + */ + @TableField(fill = FieldFill.UPDATE) + @Schema(description = "修改时间") + private LocalDateTime updateTime; + + /** + * 0-正常,1-删除 + */ + @TableLogic + @TableField(fill = FieldFill.INSERT) + @Schema(description = "删除标记,1:已删除,0:正常") + private String delFlag; + + /** + * 锁定标记 + */ + @Schema(description = "锁定标记") + private String lockFlag; + + /** + * 手机号 + */ + @DiffInclude + @PropertyName("手机号") + @Schema(description = "手机号") + private String phone; + + /** + * 头像 + */ + @Schema(description = "头像地址") + private String avatar; + + /** + * 部门ID + */ + @Schema(description = "用户所属部门id") + private Long deptId; + + /** + * 租户ID + */ + @Schema(description = "用户所属租户id") + private Long tenantId; + + /** + * 微信openid + */ + @Schema(description = "微信openid") + private String wxOpenid; + + /** + * 微信小程序openId + */ + @Schema(description = "微信小程序openid") + private String miniOpenid; + + /** + * QQ openid + */ + @Schema(description = "QQ openid") + private String qqOpenid; + + /** + * 码云唯一标识 + */ + @Schema(description = "码云唯一标识") + private String giteeLogin; + + /** + * 开源中国唯一标识 + */ + @Schema(description = "开源中国唯一标识") + private String oscId; + + /** + * 昵称 + */ + @Schema(description = "昵称") + private String nickname; + + /** + * 姓名 + */ + @Schema(description = "姓名") + private String name; + + /** + * 邮箱 + */ + @DiffInclude + @PropertyName("邮箱") + @Schema(description = "邮箱") + private String email; + +} diff --git a/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/entity/SysUserPost.java b/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/entity/SysUserPost.java new file mode 100644 index 0000000..40e9a23 --- /dev/null +++ b/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/entity/SysUserPost.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.pig4cloud.pigx.admin.api.entity; + +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + *

+ * 用户岗位表 + *

+ * + * @author fxz + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class SysUserPost extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 用户ID + */ + @Schema(description = "用户id") + private Long userId; + + /** + * 岗位ID + */ + @Schema(description = "岗位id") + private Long postId; + +} diff --git a/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/entity/SysUserRole.java b/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/entity/SysUserRole.java new file mode 100644 index 0000000..093c2c8 --- /dev/null +++ b/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/entity/SysUserRole.java @@ -0,0 +1,54 @@ +/* + * + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + * + */ + +package com.pig4cloud.pigx.admin.api.entity; + +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + *

+ * 用户角色表 + *

+ * + * @author lengleng + * @since 2017-10-29 + */ +@Data +@Schema(description = "用户角色") +@EqualsAndHashCode(callSuper = true) +public class SysUserRole extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 用户ID + */ + @Schema(description = "用户id") + private Long userId; + + /** + * 角色ID + */ + @Schema(description = "角色id") + private Long roleId; + +} diff --git a/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/feign/RemoteAuditLogService.java b/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/feign/RemoteAuditLogService.java new file mode 100644 index 0000000..210a29f --- /dev/null +++ b/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/feign/RemoteAuditLogService.java @@ -0,0 +1,49 @@ +/* + * + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + * + */ + +package com.pig4cloud.pigx.admin.api.feign; + +import com.pig4cloud.pigx.admin.api.entity.SysAuditLog; +import com.pig4cloud.pigx.common.core.constant.SecurityConstants; +import com.pig4cloud.pigx.common.core.constant.ServiceNameConstants; +import com.pig4cloud.pigx.common.core.util.R; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestHeader; + +import java.util.List; + +/** + * @author lengleng + * @date 2023-02-27 + */ +@FeignClient(contextId = "remoteAuditLogService", value = ServiceNameConstants.UPMS_SERVICE) +public interface RemoteAuditLogService { + + /** + * 保存日志 + * @param auditLogList 日志实体 列表 + * @param from 是否内部调用 + * @return succes、false + */ + @PostMapping("/audit") + R saveLog(@RequestBody List auditLogList, @RequestHeader(SecurityConstants.FROM) String from); + +} diff --git a/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/feign/RemoteClientDetailsService.java b/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/feign/RemoteClientDetailsService.java new file mode 100644 index 0000000..a973a0f --- /dev/null +++ b/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/feign/RemoteClientDetailsService.java @@ -0,0 +1,58 @@ +/* + * + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + * + */ + +package com.pig4cloud.pigx.admin.api.feign; + +import com.pig4cloud.pigx.admin.api.entity.SysOauthClientDetails; +import com.pig4cloud.pigx.common.core.constant.SecurityConstants; +import com.pig4cloud.pigx.common.core.constant.ServiceNameConstants; +import com.pig4cloud.pigx.common.core.util.R; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestHeader; + +import java.util.List; + +/** + * @author lengleng + * @date 2020/12/05 + */ +@FeignClient(contextId = "remoteClientDetailsService", value = ServiceNameConstants.UPMS_SERVICE) +public interface RemoteClientDetailsService { + + /** + * 通过clientId 查询客户端信息 + * @param clientId 用户名 + * @param from 调用标志 + * @return R + */ + @GetMapping("/client/getClientDetailsById/{clientId}") + R getClientDetailsById(@PathVariable("clientId") String clientId, + @RequestHeader(SecurityConstants.FROM) String from); + + /** + * 查询全部客户端 + * @param from 调用标识 + * @return R + */ + @GetMapping("/client/list") + R> listClientDetails(@RequestHeader(SecurityConstants.FROM) String from); + +} diff --git a/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/feign/RemoteDataScopeService.java b/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/feign/RemoteDataScopeService.java new file mode 100644 index 0000000..5c7c04c --- /dev/null +++ b/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/feign/RemoteDataScopeService.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.admin.api.feign; + +import com.pig4cloud.pigx.admin.api.entity.SysDept; +import com.pig4cloud.pigx.admin.api.entity.SysRole; +import com.pig4cloud.pigx.common.core.constant.ServiceNameConstants; +import com.pig4cloud.pigx.common.core.util.R; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; + +import java.util.List; + +/** + * @author lengleng + * @date 2019-09-07 + *

+ * 远程数据权限调用接口 + */ +@FeignClient(contextId = "remoteDataScopeService", value = ServiceNameConstants.UPMS_SERVICE) +public interface RemoteDataScopeService { + + /** + * 通过角色ID 查询角色列表 + * @param roleIdList 角色ID + * @return + */ + @PostMapping("/role/getRoleList") + R> getRoleList(@RequestBody List roleIdList); + + /** + * 获取子级部门 + * @param deptId 部门ID + * @return + */ + @GetMapping("/dept/getDescendantList/{deptId}") + R> getDescendantList(@PathVariable("deptId") Long deptId); + +} diff --git a/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/feign/RemoteDeptService.java b/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/feign/RemoteDeptService.java new file mode 100644 index 0000000..4a5e3e5 --- /dev/null +++ b/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/feign/RemoteDeptService.java @@ -0,0 +1,53 @@ +/* + * + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + * + */ + +package com.pig4cloud.pigx.admin.api.feign; + +import com.pig4cloud.pigx.admin.api.entity.SysDept; +import com.pig4cloud.pigx.common.core.constant.ServiceNameConstants; +import com.pig4cloud.pigx.common.core.util.R; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; + +import java.util.List; + +/** + * @author lengleng + * @date 2018/6/22 + */ +@FeignClient(contextId = "remoteDeptService", value = ServiceNameConstants.UPMS_SERVICE) +public interface RemoteDeptService { + + /** + * 获取所有部门接口 + * @return R 返回结果对象,包含所有部门信息列表 + */ + @GetMapping("/dept/list") + R> getAllDept(); + + /** + * 通过部门ID获取负责人列表 + * @param deptId 部门ID + * @return 负责人ID列表 + */ + @GetMapping("/dept/leader/{deptId}") + R> getAllDeptLeader(@PathVariable("deptId") Long deptId); + +} diff --git a/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/feign/RemoteDictService.java b/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/feign/RemoteDictService.java new file mode 100644 index 0000000..6da5294 --- /dev/null +++ b/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/feign/RemoteDictService.java @@ -0,0 +1,29 @@ +package com.pig4cloud.pigx.admin.api.feign; + +import com.pig4cloud.pigx.admin.api.entity.SysDictItem; +import com.pig4cloud.pigx.common.core.constant.ServiceNameConstants; +import com.pig4cloud.pigx.common.core.util.R; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; + +import java.util.List; + +/** + * @author lengleng + * @date 2020/5/12 + *

+ * 查询参数相关 + */ +@FeignClient(contextId = "remoteDictService", value = ServiceNameConstants.UPMS_SERVICE) +public interface RemoteDictService { + + /** + * 通过字典类型查找字典 + * @param type 字典类型 + * @return 同类型字典 + */ + @GetMapping("/dict/type/{type}") + R> getDictByType(@PathVariable("type") String type); + +} diff --git a/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/feign/RemoteLogService.java b/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/feign/RemoteLogService.java new file mode 100644 index 0000000..fc3f1a6 --- /dev/null +++ b/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/feign/RemoteLogService.java @@ -0,0 +1,47 @@ +/* + * + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + * + */ + +package com.pig4cloud.pigx.admin.api.feign; + +import com.pig4cloud.pigx.admin.api.dto.SysLogDTO; +import com.pig4cloud.pigx.common.core.constant.SecurityConstants; +import com.pig4cloud.pigx.common.core.constant.ServiceNameConstants; +import com.pig4cloud.pigx.common.core.util.R; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestHeader; + +/** + * @author lengleng + * @date 2018/6/28 + */ +@FeignClient(contextId = "remoteLogService", value = ServiceNameConstants.UPMS_SERVICE) +public interface RemoteLogService { + + /** + * 保存日志 + * @param sysLog 日志实体 + * @param from 是否内部调用 + * @return succes、false + */ + @PostMapping("/log/save") + R saveLog(@RequestBody SysLogDTO sysLog, @RequestHeader(SecurityConstants.FROM) String from); + +} diff --git a/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/feign/RemoteParamService.java b/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/feign/RemoteParamService.java new file mode 100644 index 0000000..6eb543f --- /dev/null +++ b/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/feign/RemoteParamService.java @@ -0,0 +1,42 @@ +package com.pig4cloud.pigx.admin.api.feign; + +import com.pig4cloud.pigx.common.core.constant.SecurityConstants; +import com.pig4cloud.pigx.common.core.constant.ServiceNameConstants; +import com.pig4cloud.pigx.common.core.util.R; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestParam; + +import java.util.Map; + +/** + * @author lengleng + * @date 2020/5/12 + *

+ * 查询参数相关 + */ +@FeignClient(contextId = "remoteParamService", value = ServiceNameConstants.UPMS_SERVICE) +public interface RemoteParamService { + + /** + * 通过key 查询参数配置 + * @param key key + * @param from 声明成内部调用,避免MQ 等无法调用 + * @return + */ + @GetMapping("/param/publicValue/{key}") + R getByKey(@PathVariable("key") String key, @RequestHeader(SecurityConstants.FROM) String from); + + /** + * 通过keys 查询参数配置 + * @param keys keys + * @param from 声明成内部调用,避免MQ 等无法调用 + * @return map + */ + @GetMapping("/param/publicValues") + R> getByKeys(@RequestParam("keys") String[] keys, + @RequestHeader(SecurityConstants.FROM) String from); + +} diff --git a/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/feign/RemoteRoleService.java b/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/feign/RemoteRoleService.java new file mode 100644 index 0000000..f4c5da6 --- /dev/null +++ b/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/feign/RemoteRoleService.java @@ -0,0 +1,44 @@ +/* + * + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + * + */ + +package com.pig4cloud.pigx.admin.api.feign; + +import com.pig4cloud.pigx.admin.api.entity.SysRole; +import com.pig4cloud.pigx.common.core.constant.ServiceNameConstants; +import com.pig4cloud.pigx.common.core.util.R; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; + +import java.util.List; + +/** + * @author lengleng + * @date 2018/6/22 + */ +@FeignClient(contextId = "remoteRoleService", value = ServiceNameConstants.UPMS_SERVICE) +public interface RemoteRoleService { + + /** + * 获取所有部门接口 + * @return R 返回结果对象,包含所有部门信息列表 + */ + @GetMapping("/role/list") + R> getAllRole(); + +} diff --git a/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/feign/RemoteTenantService.java b/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/feign/RemoteTenantService.java new file mode 100644 index 0000000..20cd9c6 --- /dev/null +++ b/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/feign/RemoteTenantService.java @@ -0,0 +1,49 @@ +/* + * + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + * + */ + +package com.pig4cloud.pigx.admin.api.feign; + +import com.pig4cloud.pigx.admin.api.entity.SysTenant; +import com.pig4cloud.pigx.common.core.constant.SecurityConstants; +import com.pig4cloud.pigx.common.core.constant.ServiceNameConstants; +import com.pig4cloud.pigx.common.core.util.R; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestHeader; + +import java.util.List; + +/** + * @author lengleng + * @date 2019/6/19 + *

+ * 租户接口 + */ +@FeignClient(contextId = "remoteTenantService", value = ServiceNameConstants.UPMS_SERVICE) +public interface RemoteTenantService { + + /** + * 查询全部有效租户 + * @param from 内部标志 + * @return + */ + @GetMapping("/tenant/list") + R> list(@RequestHeader(SecurityConstants.FROM) String from); + +} diff --git a/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/feign/RemoteTokenService.java b/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/feign/RemoteTokenService.java new file mode 100644 index 0000000..07aa22b --- /dev/null +++ b/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/feign/RemoteTokenService.java @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.admin.api.feign; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.pig4cloud.pigx.common.core.constant.CommonConstants; +import com.pig4cloud.pigx.common.core.constant.SecurityConstants; +import com.pig4cloud.pigx.common.core.constant.ServiceNameConstants; +import com.pig4cloud.pigx.common.core.util.R; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.*; + +import java.util.Map; + +/** + * @author lengleng + * @date 2018/9/4 + */ +@FeignClient(contextId = "remoteTokenService", value = ServiceNameConstants.AUTH_SERVICE) +public interface RemoteTokenService { + + /** + * 分页查询token 信息 + * @param from 内部调用标志 + * @param params 分页参数 + * @param from 内部调用标志 + * @return page + */ + @PostMapping("/token/page") + R getTokenPage(@RequestBody Map params, @RequestHeader(SecurityConstants.FROM) String from); + + /** + * 删除token + * @param from 内部调用标志 + * @param token token + * @param from 内部调用标志 + * @return + */ + @DeleteMapping("/token/{token}") + R removeTokenById(@PathVariable("token") String token, @RequestHeader(SecurityConstants.FROM) String from); + + /** + * 校验令牌获取用户信息 + * @param token + * @param from + * @return + */ + @GetMapping("/token/query-token") + R> queryToken(@RequestParam("token") String token, + @RequestParam(CommonConstants.TENANT_ID) String tenantId, + @RequestHeader(SecurityConstants.FROM) String from); + +} diff --git a/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/feign/RemoteUserService.java b/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/feign/RemoteUserService.java new file mode 100644 index 0000000..383ab83 --- /dev/null +++ b/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/feign/RemoteUserService.java @@ -0,0 +1,106 @@ +/* + * + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + * + */ + +package com.pig4cloud.pigx.admin.api.feign; + +import com.pig4cloud.pigx.admin.api.dto.UserInfo; +import com.pig4cloud.pigx.admin.api.entity.SysUser; +import com.pig4cloud.pigx.common.core.constant.SecurityConstants; +import com.pig4cloud.pigx.common.core.constant.ServiceNameConstants; +import com.pig4cloud.pigx.common.core.util.R; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * @author lengleng + * @date 2018/6/22 + */ +@FeignClient(contextId = "remoteUserService", value = ServiceNameConstants.UPMS_SERVICE) +public interface RemoteUserService { + + /** + * 通过用户名查询用户、角色信息 + * @param username 用户名 + * @param from 调用标志 + * @return R + */ + @GetMapping("/user/info/{username}") + R info(@PathVariable("username") String username, @RequestHeader(SecurityConstants.FROM) String from); + + /** + * 根据用户ID获取用户 + * @param userId ID + * @return SysUser + */ + @GetMapping("/user/details/{userId}") + R getUserById(@PathVariable("userId") Long userId); + + /** + * 通过社交账号或手机号查询用户、角色信息 + * @param inStr appid@code + * @param from 调用标志 + * @return + */ + @GetMapping("/social/info/{inStr}") + R social(@PathVariable("inStr") String inStr, @RequestHeader(SecurityConstants.FROM) String from); + + /** + * 查询上级部门的用户信息 + * @param username 用户名 + * @return R + */ + @GetMapping("/user/ancestor/{username}") + R> ancestorUsers(@PathVariable("username") String username); + + /** + * 锁定用户 + * @param username 用户名 + * @param from 调用标识 + * @return + */ + @PutMapping("/user/lock/{username}") + R lockUser(@PathVariable("username") String username, @RequestHeader(SecurityConstants.FROM) String from); + + /** + * 根据角色ID查询用户列表 + * @param roleIdList 角色ID列表 + * @return 用户ID列表 + */ + @GetMapping("/user/getUserIdListByRoleIdList") + R> getUserIdListByRoleIdList(@RequestParam("roleIdList") List roleIdList); + + /** + * 根据部门ID列表获取用户ID列表接口 + * @param deptIdList 部门ID列表 + * @return 用户ID列表 + */ + @GetMapping("/user/getUserIdListByDeptIdList") + R> getUserIdListByDeptIdList(@RequestParam("deptIdList") List deptIdList); + + /** + * 通过用户名查询用户列表 + * @param userName 用户名 + * @return 用户列表 + */ + @GetMapping("/user/getUserListByUserName") + R> getUserListByUserName(@RequestParam("username") String userName); + +} diff --git a/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/vo/CpUserExcelVo.java b/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/vo/CpUserExcelVo.java new file mode 100644 index 0000000..d28c493 --- /dev/null +++ b/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/vo/CpUserExcelVo.java @@ -0,0 +1,64 @@ +package com.pig4cloud.pigx.admin.api.vo; + +import com.alibaba.excel.annotation.ExcelIgnore; +import com.alibaba.excel.annotation.ExcelProperty; +import com.pig4cloud.pigx.common.excel.annotation.ExcelLine; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; + +/** + * 企业微信用户导入 + */ +@Data +public class CpUserExcelVo implements Serializable { + + /** + * 导入时候回显行号 + */ + @ExcelLine + @ExcelIgnore + private Long lineNum; + + @NotBlank(message = "帐号不能为空") + @ExcelProperty("帐号") + private String username; + + /** + * 手机号 + */ + @NotBlank(message = "手机号不能为空") + @ExcelProperty("手机") + private String phone; + + /** + * 姓名 + */ + @NotBlank(message = "姓名不能为空") + @ExcelProperty("姓名") + private String name; + + /** + * 别名 + */ + @ExcelProperty("别名") + private String nickname; + + /** + * 部门名称 + */ + @NotBlank(message = "部门不能为空") + @ExcelProperty("部门") + private String deptName; + + @ExcelProperty("企业邮箱") + private String email; + + /** + * 锁定标记 + */ + @ExcelProperty("激活状态,0:已激活,9:未激活") + private String lockFlag; + +} diff --git a/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/vo/DeptExcelVo.java b/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/vo/DeptExcelVo.java new file mode 100644 index 0000000..9456c7a --- /dev/null +++ b/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/vo/DeptExcelVo.java @@ -0,0 +1,44 @@ +package com.pig4cloud.pigx.admin.api.vo; + +import com.alibaba.excel.annotation.ExcelIgnore; +import com.alibaba.excel.annotation.ExcelProperty; +import com.pig4cloud.pigx.common.excel.annotation.ExcelLine; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; + +/** + * 部门导入导出 + */ +@Data +public class DeptExcelVo implements Serializable { + + /** + * 导入时候回显行号 + */ + @ExcelLine + @ExcelIgnore + private Long lineNum; + + /** + * 上级部门 + */ + @NotBlank(message = "上级部门不能为空") + @ExcelProperty("上级部门") + private String parentName; + + /** + * 部门名称 + */ + @NotBlank(message = "部门名称不能为空") + @ExcelProperty("部门名称") + private String name; + + /** + * 排序 + */ + @ExcelProperty(value = "排序值") + private Integer sortOrder; + +} diff --git a/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/vo/DingUserExcelVo.java b/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/vo/DingUserExcelVo.java new file mode 100644 index 0000000..df8e4f4 --- /dev/null +++ b/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/vo/DingUserExcelVo.java @@ -0,0 +1,51 @@ +package com.pig4cloud.pigx.admin.api.vo; + +import com.alibaba.excel.annotation.ExcelIgnore; +import com.alibaba.excel.annotation.ExcelProperty; +import com.pig4cloud.pigx.common.excel.annotation.ExcelLine; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; + +@Data +public class DingUserExcelVo implements Serializable { + + /** + * 导入时候回显行号 + */ + @ExcelLine + @ExcelIgnore + private Long lineNum; + + /** + * 手机号 + */ + @NotBlank(message = "手机号不能为空") + @ExcelProperty("手机号") + private String phone; + + /** + * 姓名 + */ + @NotBlank(message = "姓名不能为空") + @ExcelProperty("姓名") + private String name; + + /** + * 部门名称 + */ + @NotBlank(message = "部门不能为空") + @ExcelProperty("部门") + private String deptName; + + @ExcelProperty("邮箱") + private String email; + + /** + * 锁定标记 + */ + @ExcelProperty("激活状态,0:是,9:否") + private String lockFlag; + +} diff --git a/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/vo/PostExcelVO.java b/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/vo/PostExcelVO.java new file mode 100644 index 0000000..9e5a575 --- /dev/null +++ b/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/vo/PostExcelVO.java @@ -0,0 +1,73 @@ +package com.pig4cloud.pigx.admin.api.vo; + +import com.alibaba.excel.annotation.ExcelIgnore; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.pig4cloud.pigx.common.excel.annotation.ExcelLine; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * 岗位excel 对应的实体 + * + * @author fxz + * @date 2022/3/21 + */ +@Data +@ColumnWidth(30) +public class PostExcelVO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 导入时候回显行号 + */ + @ExcelLine + @ExcelIgnore + private Long lineNum; + + /** + * 主键ID + */ + @ExcelProperty("岗位编号") + private Long postId; + + /** + * 岗位名称 + */ + @NotBlank(message = "岗位名称不能为空") + @ExcelProperty("岗位名称") + private String postName; + + /** + * 岗位标识 + */ + @NotBlank(message = "岗位标识不能为空") + @ExcelProperty("岗位标识") + private String postCode; + + /** + * 岗位排序 + */ + @NotNull(message = "岗位排序不能为空") + @ExcelProperty("岗位排序") + private Integer postSort; + + /** + * 岗位描述 + */ + @NotBlank(message = "岗位描述不能为空") + @ExcelProperty(value = "岗位描述") + private String remark; + + /** + * 创建时间 + */ + @ExcelProperty(value = "创建时间") + private LocalDateTime createTime; + +} diff --git a/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/vo/PreLogVO.java b/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/vo/PreLogVO.java new file mode 100644 index 0000000..03a3c68 --- /dev/null +++ b/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/vo/PreLogVO.java @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.admin.api.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** + * @author lengleng + * @date 2018/8/27 前端日志vo + */ +@Data +@Schema(description = "前端日志展示对象") +public class PreLogVO { + + /** + * 请求url + */ + @Schema(description = "请求url") + private String url; + + /** + * 请求耗时 + */ + @Schema(description = "请求耗时") + private String time; + + /** + * 请求用户 + */ + @Schema(description = "请求用户") + private String user; + + /** + * 请求结果 + */ + @Schema(description = "请求结果0:成功9:失败") + private String type; + + /** + * 请求传递参数 + */ + @Schema(description = "请求传递参数") + private String message; + + /** + * 异常信息 + */ + @Schema(description = "异常信息") + private String stack; + + /** + * 日志标题 + */ + @Schema(description = "日志标题") + private String info; + +} diff --git a/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/vo/RoleExcelVO.java b/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/vo/RoleExcelVO.java new file mode 100644 index 0000000..4c8c1d2 --- /dev/null +++ b/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/vo/RoleExcelVO.java @@ -0,0 +1,65 @@ +package com.pig4cloud.pigx.admin.api.vo; + +import com.alibaba.excel.annotation.ExcelIgnore; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.pig4cloud.pigx.common.excel.annotation.ExcelLine; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * 角色excel 对应的实体 + * + * @author fxz + * @date 2022/3/21 + */ +@Data +@ColumnWidth(30) +public class RoleExcelVO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 导入时候回显行号 + */ + @ExcelLine + @ExcelIgnore + private Long lineNum; + + /** + * 主键ID + */ + @ExcelProperty("角色编号") + private Long roleId; + + /** + * 角色名称 + */ + @NotBlank(message = "角色名称不能为空") + @ExcelProperty("角色名称") + private String roleName; + + /** + * 角色标识 + */ + @NotBlank(message = "角色标识不能为空") + @ExcelProperty("角色标识") + private String roleCode; + + /** + * 角色描述 + */ + @NotBlank(message = "角色描述不能为空") + @ExcelProperty("角色描述") + private String roleDesc; + + /** + * 创建时间 + */ + @ExcelProperty(value = "创建时间") + private LocalDateTime createTime; + +} diff --git a/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/vo/RoleVO.java b/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/vo/RoleVO.java new file mode 100644 index 0000000..a083372 --- /dev/null +++ b/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/vo/RoleVO.java @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.admin.api.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** + * @author lengleng + * @date 2020/2/10 + */ +@Data +@Schema(description = "前端角色展示对象") +public class RoleVO { + + /** + * 角色id + */ + private Long roleId; + + /** + * 菜单列表 + */ + private String menuIds; + +} diff --git a/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/vo/TokenVo.java b/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/vo/TokenVo.java new file mode 100644 index 0000000..f3a3186 --- /dev/null +++ b/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/vo/TokenVo.java @@ -0,0 +1,28 @@ +package com.pig4cloud.pigx.admin.api.vo; + +import lombok.Data; + +/** + * 前端展示令牌管理 + * + * @author lengleng + * @date 2022/6/2 + */ +@Data +public class TokenVo { + + private String id; + + private Long userId; + + private String clientId; + + private String username; + + private String accessToken; + + private String issuedAt; + + private String expiresAt; + +} diff --git a/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/vo/UserExcelVO.java b/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/vo/UserExcelVO.java new file mode 100644 index 0000000..7df79e9 --- /dev/null +++ b/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/vo/UserExcelVO.java @@ -0,0 +1,106 @@ +package com.pig4cloud.pigx.admin.api.vo; + +import com.alibaba.excel.annotation.ExcelIgnore; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.pig4cloud.pigx.common.excel.annotation.ExcelLine; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * 用户excel 对应的实体 + * + * @author lengleng + * @date 2021/8/4 + */ +@Data +@ColumnWidth(30) +public class UserExcelVO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 导入时候回显行号 + */ + @ExcelLine + @ExcelIgnore + private Long lineNum; + + /** + * 主键ID + */ + @ExcelProperty("用户编号") + private Long userId; + + /** + * 用户名 + */ + @NotBlank(message = "用户名不能为空") + @ExcelProperty("用户名") + private String username; + + /** + * 手机号 + */ + @NotBlank(message = "手机号不能为空") + @ExcelProperty("手机号") + private String phone; + + /** + * 手机号 + */ + @NotBlank(message = "昵称不能为空") + @ExcelProperty("昵称") + private String nickname; + + /** + * 手机号 + */ + @NotBlank(message = "姓名不能为空") + @ExcelProperty("姓名") + private String name; + + /** + * 手机号 + */ + @NotBlank(message = "邮箱不能为空") + @ExcelProperty("邮箱") + private String email; + + /** + * 部门名称 + */ + @NotBlank(message = "部门名称不能为空") + @ExcelProperty("部门名称") + private String deptName; + + /** + * 角色列表 + */ + @NotBlank(message = "角色不能为空") + @ExcelProperty("角色") + private String roleNameList; + + /** + * 角色列表 + */ + @NotBlank(message = "岗位不能为空") + @ExcelProperty("岗位名称") + private String postNameList; + + /** + * 锁定标记 + */ + @ExcelProperty("锁定标记,0:正常,9:已锁定") + private String lockFlag; + + /** + * 创建时间 + */ + @ExcelProperty(value = "创建时间") + private LocalDateTime createTime; + +} diff --git a/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/vo/UserVO.java b/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/vo/UserVO.java new file mode 100644 index 0000000..d412609 --- /dev/null +++ b/as-upms/as-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/vo/UserVO.java @@ -0,0 +1,175 @@ +/* + * + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + * + */ + +package com.pig4cloud.pigx.admin.api.vo; + +import com.pig4cloud.pigx.admin.api.entity.SysPost; +import com.pig4cloud.pigx.admin.api.entity.SysRole; +import com.pig4cloud.pigx.common.core.sensitive.Sensitive; +import com.pig4cloud.pigx.common.core.sensitive.SensitiveTypeEnum; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.List; + +/** + * @author lengleng + * @date 2017/10/29 + */ +@Data +@Schema(description = "前端用户展示对象") +public class UserVO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键ID + */ + @Schema(description = "主键") + private Long userId; + + /** + * 用户名 + */ + @Schema(description = "用户名") + private String username; + + /** + * 密码 + */ + @Schema(description = "密码") + private String password; + + /** + * 随机盐 + */ + @Schema(description = "随机盐") + private String salt; + + /** + * 微信openid + */ + @Schema(description = "微信open id") + private String wxOpenid; + + /** + * QQ openid + */ + @Schema(description = "qq open id") + private String qqOpenid; + + /** + * gitee openid + */ + @Schema(description = "gitee open id") + private String giteeOpenId; + + /** + * 开源中国 openid + */ + @Schema(description = "开源中国 open id") + private String oscOpenId; + + /** + * 创建时间 + */ + @Schema(description = "创建时间") + private LocalDateTime createTime; + + /** + * 修改时间 + */ + @Schema(description = "修改时间") + private LocalDateTime updateTime; + + /** + * 0-正常,1-删除 + */ + @Schema(description = "删除标记,1:已删除,0:正常") + private String delFlag; + + /** + * 锁定标记 + */ + @Schema(description = "锁定标记,0:正常,9:已锁定") + private String lockFlag; + + /** + * 手机号 + */ + @Sensitive(type = SensitiveTypeEnum.MOBILE_PHONE) + @Schema(description = "手机号") + private String phone; + + /** + * 头像 + */ + @Schema(description = "头像") + private String avatar; + + /** + * 部门ID + */ + @Schema(description = "所属部门") + private Long deptId; + + /** + * 租户ID + */ + @Schema(description = "所属租户") + private Long tenantId; + + /** + * 部门名称 + */ + @Schema(description = "所属部门名称") + private String deptName; + + /** + * 角色列表 + */ + @Schema(description = "拥有的角色列表") + private List roleList; + + /** + * 岗位列表 + */ + private List postList; + + /** + * 昵称 + */ + @Schema(description = "昵称") + private String nickname; + + /** + * 姓名 + */ + @Schema(description = "姓名") + private String name; + + /** + * 邮箱 + */ + @Schema(description = "邮箱") + private String email; + +} diff --git a/as-upms/as-upms-api/src/main/resources/META-INF/spring/org.springframework.cloud.openfeign.FeignClient.imports b/as-upms/as-upms-api/src/main/resources/META-INF/spring/org.springframework.cloud.openfeign.FeignClient.imports new file mode 100644 index 0000000..a09b90a --- /dev/null +++ b/as-upms/as-upms-api/src/main/resources/META-INF/spring/org.springframework.cloud.openfeign.FeignClient.imports @@ -0,0 +1,11 @@ +com.pig4cloud.pigx.admin.api.feign.RemoteDataScopeService +com.pig4cloud.pigx.admin.api.feign.RemoteClientDetailsService +com.pig4cloud.pigx.admin.api.feign.RemoteLogService +com.pig4cloud.pigx.admin.api.feign.RemoteParamService +com.pig4cloud.pigx.admin.api.feign.RemoteTenantService +com.pig4cloud.pigx.admin.api.feign.RemoteTokenService +com.pig4cloud.pigx.admin.api.feign.RemoteUserService +com.pig4cloud.pigx.admin.api.feign.RemoteRoleService +com.pig4cloud.pigx.admin.api.feign.RemoteDeptService +com.pig4cloud.pigx.admin.api.feign.RemoteDictService +com.pig4cloud.pigx.admin.api.feign.RemoteAuditLogService diff --git a/as-upms/as-upms-biz/Dockerfile b/as-upms/as-upms-biz/Dockerfile new file mode 100644 index 0000000..a8f9e1f --- /dev/null +++ b/as-upms/as-upms-biz/Dockerfile @@ -0,0 +1,18 @@ +FROM pig4cloud/java:8-jre + +MAINTAINER wangiegie@gmail.com + +ENV TZ=Asia/Shanghai +ENV JAVA_OPTS="-Xms512m -Xmx1024m -Djava.security.egd=file:/dev/./urandom" + +RUN ln -sf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone + +RUN mkdir -p /pigx-upms + +WORKDIR /as-upms + +EXPOSE 4000 + +ADD ./target/as-upms-biz.jar ./ + +CMD sleep 60;java $JAVA_OPTS -jar as-upms-biz.jar diff --git a/as-upms/as-upms-biz/pom.xml b/as-upms/as-upms-biz/pom.xml new file mode 100644 index 0000000..40069fc --- /dev/null +++ b/as-upms/as-upms-biz/pom.xml @@ -0,0 +1,186 @@ + + + 4.0.0 + + com.pig4cloud + as-upms + 5.2.0 + + + as-upms-biz + jar + + pigx 通用用户权限管理系统业务处理模块 + + + + + com.mysql + mysql-connector-j + + + + com.oracle.database.jdbc + ojdbc8 + + + + org.postgresql + postgresql + + + + com.microsoft.sqlserver + mssql-jdbc + + + + com.dameng + DmJdbcDriver18 + + + + com.pig4cloud + as-upms-api + + + + com.pig4cloud + pigx-common-log + + + com.pig4cloud + pigx-common-data + + + + com.pig4cloud + pigx-common-swagger + + + + com.pig4cloud + pigx-common-oss + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-config + + + + com.pig4cloud + pigx-common-security + + + + com.pig4cloud + pigx-common-xss + + + + com.pig4cloud + pigx-common-audit + + + + com.pig4cloud + pigx-common-gateway + + + + com.pig4cloud + pigx-common-sentinel + + + + com.pig4cloud + pigx-common-gray + + + + com.baomidou + mybatis-plus-boot-starter + + + + com.alibaba + druid-spring-boot-starter + + + + org.jasig.cas.client + cas-client-core + ${cas.sdk.version} + + + + com.aliyun + alibaba-dingtalk-service-sdk + ${dingtalk.old.version} + + + + com.github.binarywang + weixin-java-cp + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-undertow + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + org.apache.maven.plugins + maven-deploy-plugin + + true + + + + io.fabric8 + docker-maven-plugin + + false + + + + + + src/main/resources + true + + **/*.xlsx + **/*.xls + + + + src/main/resources + false + + **/*.xlsx + **/*.xls + + + + + + diff --git a/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/AsAdminApplication.java b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/AsAdminApplication.java new file mode 100644 index 0000000..8978e9f --- /dev/null +++ b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/AsAdminApplication.java @@ -0,0 +1,46 @@ +/* + * + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + * + */ + +package com.pig4cloud.pigx.admin; + +import com.pig4cloud.pigx.common.feign.annotation.EnablePigxFeignClients; +import com.pig4cloud.pigx.common.security.annotation.EnablePigxResourceServer; +import com.pig4cloud.pigx.common.swagger.annotation.EnableOpenApi; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.client.discovery.EnableDiscoveryClient; + +/** + * @author lengleng + * @date 2018年06月21日 + *

+ * 用户统一管理系统 + */ +@EnableOpenApi("admin") +@EnablePigxFeignClients +@EnablePigxResourceServer +@EnableDiscoveryClient +@SpringBootApplication +public class AsAdminApplication { + + public static void main(String[] args) { + SpringApplication.run(AsAdminApplication.class, args); + } + +} diff --git a/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/config/ClientDetailsInitRunner.java b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/config/ClientDetailsInitRunner.java new file mode 100644 index 0000000..6d25aca --- /dev/null +++ b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/config/ClientDetailsInitRunner.java @@ -0,0 +1,98 @@ +package com.pig4cloud.pigx.admin.config; + +import cn.hutool.core.util.StrUtil; +import com.pig4cloud.pigx.admin.service.SysOauthClientDetailsService; +import com.pig4cloud.pigx.admin.service.SysTenantService; +import com.pig4cloud.pigx.common.core.constant.CacheConstants; +import com.pig4cloud.pigx.common.data.tenant.TenantBroker; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.boot.web.context.WebServerInitializedEvent; +import org.springframework.context.ApplicationEvent; +import org.springframework.context.event.EventListener; +import org.springframework.core.annotation.Order; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.listener.ChannelTopic; +import org.springframework.data.redis.listener.RedisMessageListenerContainer; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; +import org.springframework.transaction.event.TransactionalEventListener; + +/** + * @author lengleng + * @date 2020/11/18 + *

+ * oauth 客户端认证参数初始化 + */ +@Slf4j +@Service +@RequiredArgsConstructor +@SuppressWarnings("all") +public class ClientDetailsInitRunner implements InitializingBean { + + private final SysOauthClientDetailsService clientDetailsService; + + private final RedisMessageListenerContainer listenerContainer; + + private final SysTenantService tenantService; + + private final RedisTemplate redisTemplate; + + /** + * WebServerInitializedEvent 使用 TransactionalEventListener 时启动时无法获取到事件 + */ + @Async + @Order + @EventListener({ WebServerInitializedEvent.class }) + public void webServerInit() { + this.initClientDetails(); + } + + @Async + @Order + @TransactionalEventListener({ ClientDetailsInitEvent.class }) + public void initClientDetails() { + log.debug("初始化客户端信息开始 "); + + // 1. 查询全部租户循环遍历 + tenantService.list().forEach(tenant -> { + TenantBroker.runAs(tenant.getId(), tenantId -> { + // 2. 查询当前租户的所有客户端信息 (排除客户端扩展信息为空) + clientDetailsService.list().stream().filter(client -> { + return StrUtil.isNotBlank(client.getAdditionalInformation()); + }).forEach(client -> { + // 3. 拼接key 1:client_config_flag:clinetId + String key = String.format("%s:%s:%s", tenantId, CacheConstants.CLIENT_FLAG, client.getClientId()); + // 4. hashkey clientId 保存客户端信息 + redisTemplate.opsForValue().set(key, client.getAdditionalInformation()); + }); + }); + }); + + log.debug("初始化客户端信息结束 "); + } + + /** + * 客户端刷新事件 + */ + public static class ClientDetailsInitEvent extends ApplicationEvent { + + public ClientDetailsInitEvent(Object source) { + super(source); + } + + } + + /** + * redis 监听配置,监听 upms_redis_client_reload_topic,重新加载Redis + */ + @Override + public void afterPropertiesSet() throws Exception { + listenerContainer.addMessageListener((message, bytes) -> { + log.warn("接收到重新Redis 重新加载客户端配置事件"); + initClientDetails(); + }, new ChannelTopic(CacheConstants.CLIENT_REDIS_RELOAD_TOPIC)); + } + +} diff --git a/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/config/DynamicRouteInitRunner.java b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/config/DynamicRouteInitRunner.java new file mode 100644 index 0000000..21c3a35 --- /dev/null +++ b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/config/DynamicRouteInitRunner.java @@ -0,0 +1,112 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.admin.config; + +import cn.hutool.json.JSONArray; +import cn.hutool.json.JSONUtil; +import com.pig4cloud.pigx.admin.service.SysRouteConfService; +import com.pig4cloud.pigx.common.core.constant.CacheConstants; +import com.pig4cloud.pigx.common.gateway.support.DynamicRouteInitEvent; +import com.pig4cloud.pigx.common.gateway.vo.RouteDefinitionVo; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.boot.web.context.WebServerInitializedEvent; +import org.springframework.cloud.gateway.filter.FilterDefinition; +import org.springframework.cloud.gateway.handler.predicate.PredicateDefinition; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.event.EventListener; +import org.springframework.core.annotation.Order; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.listener.ChannelTopic; +import org.springframework.data.redis.listener.RedisMessageListenerContainer; +import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; +import org.springframework.scheduling.annotation.Async; +import org.springframework.transaction.event.TransactionalEventListener; + +import java.net.URI; +import java.util.Map; + +/** + * @author lengleng + * @date 2018/10/31 + *

+ * 容器启动后保存配置文件里面的路由信息到Redis + */ +@Slf4j +@Configuration +@RequiredArgsConstructor +public class DynamicRouteInitRunner implements InitializingBean { + + private final RedisTemplate redisTemplate; + + private final SysRouteConfService routeConfService; + + private final RedisMessageListenerContainer listenerContainer; + + /** + * WebServerInitializedEvent 使用 TransactionalEventListener 时启动时无法获取到事件 + */ + @Async + @Order + @EventListener({ WebServerInitializedEvent.class }) + public void WebServerInit() { + this.initRoute(); + } + + @Async + @Order + @TransactionalEventListener({ DynamicRouteInitEvent.class }) + public void initRoute() { + redisTemplate.delete(CacheConstants.ROUTE_KEY); + log.info("开始初始化网关路由"); + + routeConfService.list().forEach(route -> { + RouteDefinitionVo vo = new RouteDefinitionVo(); + vo.setRouteName(route.getRouteName()); + vo.setId(route.getRouteId()); + vo.setUri(URI.create(route.getUri())); + vo.setOrder(route.getSortOrder()); + + JSONArray filterObj = JSONUtil.parseArray(route.getFilters()); + vo.setFilters(filterObj.toList(FilterDefinition.class)); + JSONArray predicateObj = JSONUtil.parseArray(route.getPredicates()); + vo.setPredicates(predicateObj.toList(PredicateDefinition.class)); + vo.setMetadata(JSONUtil.toBean(route.getMetadata(), Map.class)); + log.info("加载路由ID:{},{}", route.getRouteId(), vo); + redisTemplate.setHashValueSerializer(new Jackson2JsonRedisSerializer<>(RouteDefinitionVo.class)); + redisTemplate.opsForHash().put(CacheConstants.ROUTE_KEY, route.getRouteId(), vo); + }); + + // 通知网关重置路由 + redisTemplate.convertAndSend(CacheConstants.ROUTE_JVM_RELOAD_TOPIC, "路由信息,网关缓存更新"); + log.debug("初始化网关路由结束 "); + } + + /** + * redis 监听配置,监听 upms_redis_route_reload_topic,重新加载Redis + */ + @Override + public void afterPropertiesSet() { + listenerContainer.addMessageListener((message, bytes) -> { + log.warn("接收到重新Redis 重新加载路由事件"); + initRoute(); + }, new ChannelTopic(CacheConstants.ROUTE_REDIS_RELOAD_TOPIC)); + } + +} diff --git a/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/ConnectController.java b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/ConnectController.java new file mode 100644 index 0000000..9db00a1 --- /dev/null +++ b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/ConnectController.java @@ -0,0 +1,76 @@ +package com.pig4cloud.pigx.admin.controller; + +import com.pig4cloud.pigx.admin.api.entity.SysDept; +import com.pig4cloud.pigx.admin.service.ConnectService; +import com.pig4cloud.pigx.admin.service.SysDeptService; +import com.pig4cloud.pigx.common.core.util.R; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpHeaders; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 钉钉、微信 互联 + * + * @author lengleng + * @date 2022/4/22 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/connect") +@Tag(description = "connect", name = "开放互联") +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class ConnectController { + + private final ConnectService connectService; + + private final SysDeptService deptService; + + /** + * 同步钉钉用户 + * @return + */ + @PostMapping("/sync/ding/user") + @PreAuthorize("@pms.hasPermission('sys_connect_sync')") + public R syncUser() { + for (SysDept sysDept : deptService.list()) { + connectService.syncDingUser(sysDept.getDeptId()); + } + return R.ok(); + } + + /** + * 同步钉钉部门 + * @return + */ + @PostMapping("/sync/ding/dept") + @PreAuthorize("@pms.hasPermission('sys_connect_sync')") + public R syncDept() { + return R.ok(connectService.syncDingDept()); + } + + /** + * 同步企微用户 + * @return + */ + @PostMapping("/sync/cp/user") + @PreAuthorize("@pms.hasPermission('sys_connect_sync')") + public R syncCpUser() { + return connectService.syncCpUser(); + } + + /** + * 同步企微部门 + * @return + */ + @PostMapping("/sync/cp/dept") + @PreAuthorize("@pms.hasPermission('sys_connect_sync')") + public R syncCpDept() { + return connectService.syncCpDept(); + } + +} diff --git a/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/MobileController.java b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/MobileController.java new file mode 100644 index 0000000..42137cc --- /dev/null +++ b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/MobileController.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.admin.controller; + +import com.pig4cloud.pigx.admin.service.MobileService; +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.common.security.annotation.Inner; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.AllArgsConstructor; +import org.springframework.http.HttpHeaders; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * @author lengleng + * @date 2018/11/14 + *

+ * 手机验证码 + */ +@RestController +@AllArgsConstructor +@RequestMapping("/mobile") +@Tag(description = "mobile", name = "手机管理模块") +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class MobileController { + + private final MobileService mobileService; + + @Inner(value = false) + @GetMapping("/{mobile}") + public R sendSmsCode(@PathVariable String mobile) { + return mobileService.sendSmsCode(mobile); + } + +} diff --git a/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/RegisterController.java b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/RegisterController.java new file mode 100644 index 0000000..ffabfda --- /dev/null +++ b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/RegisterController.java @@ -0,0 +1,41 @@ +package com.pig4cloud.pigx.admin.controller; + +import com.pig4cloud.pigx.admin.api.dto.UserDTO; +import com.pig4cloud.pigx.admin.service.SysUserService; +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.common.log.annotation.SysLog; +import com.pig4cloud.pigx.common.security.annotation.Inner; +import lombok.RequiredArgsConstructor; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * @author lengleng + * @date 2022/3/30 + *

+ * 客户端注册功能 register.user = false + */ +@RestController +@RequestMapping("/register") +@RequiredArgsConstructor +@ConditionalOnProperty(name = "register.user", matchIfMissing = true) +public class RegisterController { + + private final SysUserService userService; + + /** + * 注册用户 + * @param userDto 用户信息 + * @return success/false + */ + @Inner(value = false) + @SysLog("注册用户") + @PostMapping("/user") + public R registerUser(@RequestBody UserDTO userDto) { + return userService.registerUser(userDto); + } + +} diff --git a/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysAuditLogController.java b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysAuditLogController.java new file mode 100644 index 0000000..5e0290c --- /dev/null +++ b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysAuditLogController.java @@ -0,0 +1,117 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.admin.controller; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ArrayUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.pig4cloud.pigx.admin.api.entity.SysAuditLog; +import com.pig4cloud.pigx.admin.service.SysAuditLogService; +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.common.excel.annotation.ResponseExcel; +import com.pig4cloud.pigx.common.log.annotation.SysLog; +import com.pig4cloud.pigx.common.security.annotation.Inner; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.springdoc.api.annotations.ParameterObject; +import org.springframework.http.HttpHeaders; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 审计记录表 + * + * @author PIG + * @date 2023-02-28 20:12:23 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/audit") +@Tag(description = "audit", name = "审计记录表管理") +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class SysAuditLogController { + + private final SysAuditLogService sysAuditLogService; + + /** + * 分页查询 + * @param page 分页对象 + * @param sysAuditLog 审计记录表 + * @return + */ + @Operation(summary = "分页查询", description = "分页查询") + @GetMapping("/page") + public R getsysAuditLogPage(@ParameterObject Page page, @ParameterObject SysAuditLog sysAuditLog) { + return R.ok(sysAuditLogService.getAuditsByScope(page, sysAuditLog)); + } + + /** + * 通过id查询审计记录表 + * @param id id + * @return R + */ + @Operation(summary = "通过id查询", description = "通过id查询") + @GetMapping("/{id}") + public R getById(@PathVariable("id") Long id) { + return R.ok(sysAuditLogService.getById(id)); + } + + /** + * 新增审计记录表 (异步插入) + * @param auditLogList 审计记录 + * @return R + */ + @Inner + @PostMapping + @Operation(summary = "新增审计记录表", description = "新增审计记录表") + public R save(@RequestBody List auditLogList) { + return R.ok(sysAuditLogService.saveBatch(auditLogList)); + } + + /** + * 通过id删除审计记录表 + * @param ids id列表 + * @return R + */ + @Operation(summary = "通过id删除审计记录表", description = "通过id删除审计记录表") + @SysLog("通过id删除审计记录表") + @DeleteMapping("/delete") + @PreAuthorize("@pms.hasPermission('sys_audit_del')") + public R removeById(@RequestBody Long[] ids) { + return R.ok(sysAuditLogService.removeBatchByIds(CollUtil.toList(ids))); + } + + /** + * 导出excel 表格 + * @param sysAuditLog 查询条件 + * @return excel 文件流 + */ + @ResponseExcel + @GetMapping("/export") + @PreAuthorize("@pms.hasPermission('sys_audit_export')") + public List export(SysAuditLog sysAuditLog, Long[] ids) { + return sysAuditLogService + .list(Wrappers.lambdaQuery(sysAuditLog).in(ArrayUtil.isNotEmpty(ids), SysAuditLog::getId, ids)); + } + +} diff --git a/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysClientController.java b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysClientController.java new file mode 100644 index 0000000..8f9ea95 --- /dev/null +++ b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysClientController.java @@ -0,0 +1,181 @@ +/* + * + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + * + */ + +package com.pig4cloud.pigx.admin.controller; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.pig4cloud.pigx.admin.api.dto.SysOauthClientDetailsDTO; +import com.pig4cloud.pigx.admin.api.entity.SysOauthClientDetails; +import com.pig4cloud.pigx.admin.config.ClientDetailsInitRunner; +import com.pig4cloud.pigx.admin.service.SysOauthClientDetailsService; +import com.pig4cloud.pigx.common.core.constant.CommonConstants; +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.common.core.util.SpringContextHolder; +import com.pig4cloud.pigx.common.excel.annotation.ResponseExcel; +import com.pig4cloud.pigx.common.log.annotation.SysLog; +import com.pig4cloud.pigx.common.security.annotation.Inner; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.AllArgsConstructor; +import org.springdoc.api.annotations.ParameterObject; +import org.springframework.beans.BeanUtils; +import org.springframework.http.HttpHeaders; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.util.List; + +/** + *

+ * 前端控制器 + *

+ * + * @author lengleng + * @since 2018-05-15 + */ +@RestController +@AllArgsConstructor +@RequestMapping("/client") +@Tag(description = "client", name = "客户端管理模块") +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class SysClientController { + + private final SysOauthClientDetailsService clientDetailsService; + + /** + * 通过ID查询 + * @param clientId clientId + * @return SysOauthClientDetails + */ + @GetMapping("/{clientId}") + public R getByClientId(@PathVariable String clientId) { + SysOauthClientDetails details = clientDetailsService + .getOne(Wrappers.lambdaQuery().eq(SysOauthClientDetails::getClientId, clientId)); + String information = details.getAdditionalInformation(); + String captchaFlag = JSONUtil.parseObj(information).getStr(CommonConstants.CAPTCHA_FLAG); + String encFlag = JSONUtil.parseObj(information).getStr(CommonConstants.ENC_FLAG); + String onlineQuantity = JSONUtil.parseObj(information).getStr(CommonConstants.ONLINE_QUANTITY); + SysOauthClientDetailsDTO dto = new SysOauthClientDetailsDTO(); + BeanUtils.copyProperties(details, dto); + dto.setCaptchaFlag(captchaFlag); + dto.setEncFlag(encFlag); + dto.setOnlineQuantity(onlineQuantity); + return R.ok(dto); + } + + /** + * 简单分页查询 + * @param page 分页对象 + * @param sysOauthClientDetails 系统终端 + * @return + */ + @GetMapping("/page") + public R getOauthClientDetailsPage(@ParameterObject Page page, + @ParameterObject SysOauthClientDetails sysOauthClientDetails) { + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery() + .like(StrUtil.isNotBlank(sysOauthClientDetails.getClientId()), SysOauthClientDetails::getClientId, + sysOauthClientDetails.getClientId()) + .like(StrUtil.isNotBlank(sysOauthClientDetails.getClientSecret()), + SysOauthClientDetails::getClientSecret, sysOauthClientDetails.getClientSecret()); + return R.ok(clientDetailsService.page(page, wrapper)); + } + + /** + * 添加 + * @param clientDetailsDTO 实体 + * @return success/false + */ + @SysLog("添加终端") + @PostMapping + @PreAuthorize("@pms.hasPermission('sys_client_add')") + public R add(@Valid @RequestBody SysOauthClientDetailsDTO clientDetailsDTO) { + return R.ok(clientDetailsService.saveClient(clientDetailsDTO)); + } + + /** + * 删除 + * @param ids ID 列表 + * @return success/false + */ + @SysLog("删除终端") + @DeleteMapping + @PreAuthorize("@pms.hasPermission('sys_client_del')") + public R removeById(@RequestBody Long[] ids) { + clientDetailsService.removeBatchByIds(CollUtil.toList(ids)); + SpringContextHolder.publishEvent(new ClientDetailsInitRunner.ClientDetailsInitEvent(ids)); + return R.ok(); + } + + /** + * 编辑 + * @param clientDetailsDTO 实体 + * @return success/false + */ + @SysLog("编辑终端") + @PutMapping + @PreAuthorize("@pms.hasPermission('sys_client_edit')") + public R update(@Valid @RequestBody SysOauthClientDetailsDTO clientDetailsDTO) { + return R.ok(clientDetailsService.updateClientById(clientDetailsDTO)); + } + + @Inner(false) + @GetMapping("/getClientDetailsById/{clientId}") + public R getClientDetailsById(@PathVariable String clientId) { + return R.ok(clientDetailsService.getOne( + Wrappers.lambdaQuery().eq(SysOauthClientDetails::getClientId, clientId), false)); + } + + /** + * 查询全部客户端 + * @return + */ + @Inner(false) + @GetMapping("/list") + public R listClients() { + return R.ok(clientDetailsService.list()); + } + + /** + * 同步缓存字典 + * @return R + */ + @SysLog("同步终端") + @PutMapping("/sync") + public R sync() { + return clientDetailsService.syncClientCache(); + } + + /** + * 导出所有客户端 + * @return excel + */ + @ResponseExcel + @SysLog("导出excel") + @GetMapping("/export") + public List export(SysOauthClientDetails sysOauthClientDetails) { + return clientDetailsService.list(Wrappers.query(sysOauthClientDetails)); + } + +} diff --git a/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysDeptController.java b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysDeptController.java new file mode 100644 index 0000000..f9514ed --- /dev/null +++ b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysDeptController.java @@ -0,0 +1,158 @@ +/* + * + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + * + */ + +package com.pig4cloud.pigx.admin.controller; + +import com.pig4cloud.pigx.admin.api.entity.SysDept; +import com.pig4cloud.pigx.admin.api.vo.DeptExcelVo; +import com.pig4cloud.pigx.admin.service.SysDeptService; +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.common.excel.annotation.RequestExcel; +import com.pig4cloud.pigx.common.excel.annotation.ResponseExcel; +import com.pig4cloud.pigx.common.log.annotation.SysLog; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.AllArgsConstructor; +import org.springframework.http.HttpHeaders; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.time.LocalDateTime; +import java.util.List; + +/** + *

+ * 部门管理 前端控制器 + *

+ * + * @author lengleng + * @since 2018-01-20 + */ +@RestController +@AllArgsConstructor +@RequestMapping("/dept") +@Tag(description = "dept", name = "部门管理模块") +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class SysDeptController { + + private final SysDeptService sysDeptService; + + /** + * 通过ID查询 + * @param id ID + * @return SysDept + */ + @GetMapping("/{id}") + public R getById(@PathVariable Long id) { + return R.ok(sysDeptService.getById(id)); + } + + /** + * 查询全部部门 + */ + @GetMapping("/list") + public R list() { + return R.ok(sysDeptService.list()); + } + + /** + * 返回树形菜单集合 + * @param deptName 部门名称 + * @return 树形菜单 + */ + @GetMapping(value = "/tree") + public R getTree(String deptName, Long parentId) { + return R.ok(sysDeptService.selectTree(deptName, parentId)); + } + + /** + * 添加 + * @param sysDept 实体 + * @return success/false + */ + @SysLog("添加部门") + @PostMapping + @PreAuthorize("@pms.hasPermission('sys_dept_add')") + public R save(@Valid @RequestBody SysDept sysDept) { + return R.ok(sysDeptService.save(sysDept)); + } + + /** + * 删除 + * @param id ID + * @return success/false + */ + @SysLog("删除部门") + @DeleteMapping("/{id}") + @PreAuthorize("@pms.hasPermission('sys_dept_del')") + public R removeById(@PathVariable Long id) { + return R.ok(sysDeptService.removeDeptById(id)); + } + + /** + * 编辑 + * @param sysDept 实体 + * @return success/false + */ + @SysLog("编辑部门") + @PutMapping + @PreAuthorize("@pms.hasPermission('sys_dept_edit')") + public R update(@Valid @RequestBody SysDept sysDept) { + sysDept.setUpdateTime(LocalDateTime.now()); + return R.ok(sysDeptService.updateById(sysDept)); + } + + /** + * 查收子级列表 + * @return 返回子级 + */ + @GetMapping(value = "/getDescendantList/{deptId}") + public R getDescendantList(@PathVariable Long deptId) { + return R.ok(sysDeptService.listDescendant(deptId)); + } + + @GetMapping(value = "/leader/{deptId}") + public R getAllDeptLeader(@PathVariable Long deptId) { + return R.ok(sysDeptService.listDeptLeader(deptId)); + } + + /** + * 导出部门 + * @return + */ + @ResponseExcel + @GetMapping("/export") + public List export() { + return sysDeptService.listExcelVo(); + } + + /** + * 导入部门 + * @param excelVOList + * @param bindingResult + * @return + */ + @PostMapping("import") + public R importDept(@RequestExcel List excelVOList, BindingResult bindingResult) { + return sysDeptService.importDept(excelVOList, bindingResult); + } + +} diff --git a/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysDictController.java b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysDictController.java new file mode 100644 index 0000000..fe0e0dd --- /dev/null +++ b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysDictController.java @@ -0,0 +1,242 @@ +/* + * + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + * + */ + +package com.pig4cloud.pigx.admin.controller; + +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.pig4cloud.pigx.admin.api.entity.SysDict; +import com.pig4cloud.pigx.admin.api.entity.SysDictItem; +import com.pig4cloud.pigx.admin.service.SysDictItemService; +import com.pig4cloud.pigx.admin.service.SysDictService; +import com.pig4cloud.pigx.common.core.constant.CacheConstants; +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.common.excel.annotation.ResponseExcel; +import com.pig4cloud.pigx.common.log.annotation.SysLog; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.AllArgsConstructor; +import org.springdoc.api.annotations.ParameterObject; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.http.HttpHeaders; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.util.List; + +/** + *

+ * 字典表 前端控制器 + *

+ * + * @author lengleng + * @since 2019-03-19 + */ +@RestController +@AllArgsConstructor +@RequestMapping("/dict") +@Tag(description = "dict", name = "字典管理模块") +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class SysDictController { + + private final SysDictService sysDictService; + + private final SysDictItemService sysDictItemService; + + /** + * 通过ID查询字典信息 + * @param id ID + * @return 字典信息 + */ + @GetMapping("/details/{id}") + public R getById(@PathVariable Long id) { + return R.ok(sysDictService.getById(id)); + } + + /** + * 查询字典信息 + * @param query 查询信息 + * @return 字典信息 + */ + @GetMapping("/details") + public R getDetails(@ParameterObject SysDict query) { + return R.ok(sysDictService.getOne(Wrappers.query(query), false)); + } + + /** + * 分页查询字典信息 + * @param page 分页对象 + * @return 分页对象 + */ + @GetMapping("/page") + public R getDictPage(@ParameterObject Page page, @ParameterObject SysDict sysDict) { + return R.ok(sysDictService.page(page, + Wrappers.lambdaQuery() + .eq(StrUtil.isNotBlank(sysDict.getSystemFlag()), SysDict::getSystemFlag, + sysDict.getSystemFlag()) + .like(StrUtil.isNotBlank(sysDict.getDictType()), SysDict::getDictType, sysDict.getDictType()))); + } + + /** + * 通过字典类型查找字典 + * @param type 类型 + * @return 同类型字典 + */ + @GetMapping("/type/{type}") + @Cacheable(value = CacheConstants.DICT_DETAILS, key = "#type", unless = "#result.data.isEmpty()") + public R> getDictByType(@PathVariable String type) { + return R.ok(sysDictItemService.list(Wrappers.query().lambda().eq(SysDictItem::getDictType, type))); + } + + /** + * 添加字典 + * @param sysDict 字典信息 + * @return success、false + */ + @SysLog("添加字典") + @PostMapping + @PreAuthorize("@pms.hasPermission('sys_dict_add')") + public R save(@Valid @RequestBody SysDict sysDict) { + sysDictService.save(sysDict); + return R.ok(sysDict); + } + + /** + * 删除字典,并且清除字典缓存 + * @param ids ID + * @return R + */ + @SysLog("删除字典") + @DeleteMapping + @PreAuthorize("@pms.hasPermission('sys_dict_del')") + @CacheEvict(value = CacheConstants.DICT_DETAILS, allEntries = true) + public R removeById(@RequestBody Long[] ids) { + return R.ok(sysDictService.removeDictByIds(ids)); + } + + /** + * 修改字典 + * @param sysDict 字典信息 + * @return success/false + */ + @PutMapping + @SysLog("修改字典") + @PreAuthorize("@pms.hasPermission('sys_dict_edit')") + public R updateById(@Valid @RequestBody SysDict sysDict) { + return sysDictService.updateDict(sysDict); + } + + /** + * 分页查询 + * @param name 名称或者字典项 + * @return + */ + @GetMapping("/list") + public R getDictList(String name) { + return R.ok(sysDictService + .list(Wrappers.lambdaQuery().like(StrUtil.isNotBlank(name), SysDict::getDictType, name).or() + .like(StrUtil.isNotBlank(name), SysDict::getDescription, name))); + } + + /** + * 分页查询 + * @param page 分页对象 + * @param sysDictItem 字典项 + * @return + */ + @GetMapping("/item/page") + public R getSysDictItemPage(Page page, SysDictItem sysDictItem) { + return R.ok(sysDictItemService.page(page, Wrappers.query(sysDictItem))); + } + + /** + * 通过id查询字典项 + * @param id id + * @return R + */ + @GetMapping("/item/details/{id}") + public R getDictItemById(@PathVariable("id") Long id) { + return R.ok(sysDictItemService.getById(id)); + } + + /** + * 查询字典项详情 + * @param query 查询条件 + * @return R + */ + @GetMapping("/item/details") + public R getDictItemDetails(SysDictItem query) { + return R.ok(sysDictItemService.getOne(Wrappers.query(query), false)); + } + + /** + * 新增字典项 + * @param sysDictItem 字典项 + * @return R + */ + @SysLog("新增字典项") + @PostMapping("/item") + @CacheEvict(value = CacheConstants.DICT_DETAILS, allEntries = true) + public R save(@RequestBody SysDictItem sysDictItem) { + return R.ok(sysDictItemService.save(sysDictItem)); + } + + /** + * 修改字典项 + * @param sysDictItem 字典项 + * @return R + */ + @SysLog("修改字典项") + @PutMapping("/item") + public R updateById(@RequestBody SysDictItem sysDictItem) { + return sysDictItemService.updateDictItem(sysDictItem); + } + + /** + * 通过id删除字典项 + * @param id id + * @return R + */ + @SysLog("删除字典项") + @DeleteMapping("/item/{id}") + public R removeDictItemById(@PathVariable Long id) { + return sysDictItemService.removeDictItem(id); + } + + /** + * 同步缓存字典 + * @return R + */ + @SysLog("同步字典") + @PutMapping("/sync") + public R sync() { + return sysDictService.syncDictCache(); + } + + @ResponseExcel + @GetMapping("/export") + public List export(SysDictItem sysDictItem) { + return sysDictItemService.list(Wrappers.query(sysDictItem)); + } + +} diff --git a/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysFileController.java b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysFileController.java new file mode 100644 index 0000000..142fece --- /dev/null +++ b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysFileController.java @@ -0,0 +1,187 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.admin.controller; + +import cn.hutool.core.io.IoUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.pig4cloud.pigx.admin.api.dto.SysFileGroupDTO; +import com.pig4cloud.pigx.admin.api.entity.SysFile; +import com.pig4cloud.pigx.admin.api.entity.SysFileGroup; +import com.pig4cloud.pigx.admin.service.SysFileService; +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.common.log.annotation.SysLog; +import com.pig4cloud.pigx.common.security.annotation.Inner; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.AllArgsConstructor; +import lombok.SneakyThrows; +import org.springdoc.api.annotations.ParameterObject; +import org.springframework.core.io.ClassPathResource; +import org.springframework.http.HttpHeaders; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.Objects; + +/** + * 文件管理 + * + * @author Luckly + * @date 2019-06-18 17:18:42 + */ +@RestController +@AllArgsConstructor +@RequestMapping("/sys-file") +@Tag(description = "sys-file", name = "文件管理") +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class SysFileController { + + private final SysFileService sysFileService; + + /** + * 分页查询 + * @param page 分页对象 + * @param sysFile 文件管理 + * @return + */ + @Operation(summary = "分页查询", description = "分页查询") + @GetMapping("/page") + public R getSysFilePage(@ParameterObject Page page, @ParameterObject SysFile sysFile) { + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery() + .eq(StrUtil.isNotBlank(sysFile.getType()), SysFile::getType, sysFile.getType()) + .eq(Objects.nonNull(sysFile.getGroupId()), SysFile::getGroupId, sysFile.getGroupId()) + .like(StrUtil.isNotBlank(sysFile.getOriginal()), SysFile::getOriginal, sysFile.getOriginal()); + return R.ok(sysFileService.page(page, wrapper)); + } + + /** + * 通过id删除文件管理 + * @param ids id 列表 + * @return R + */ + @Operation(summary = "通过id删除文件管理", description = "通过id删除文件管理") + @SysLog("删除文件管理") + @DeleteMapping + @PreAuthorize("@pms.hasPermission('sys_file_del')") + public R removeById(@RequestBody Long[] ids) { + for (Long id : ids) { + sysFileService.deleteFile(id); + } + return R.ok(); + } + + @PutMapping("/rename") + public R rename(@RequestBody SysFile sysFile) { + return R.ok(sysFileService.updateById(sysFile)); + } + + /** + * 上传文件 文件名采用uuid,避免原始文件名中带"-"符号导致下载的时候解析出现异常 + * @param file 资源 + * @return R(/ admin / bucketName / filename) + */ + @PostMapping(value = "/upload") + public R upload(@RequestPart("file") MultipartFile file, + @RequestParam(value = "groupId", required = false) Long groupId, + @RequestParam(value = "type", required = false) String type) { + return sysFileService.uploadFile(file, groupId, type); + } + + /** + * 获取文件 + * @param bucket 桶名称 + * @param fileName 文件空间/名称 + * @param response + * @return + */ + @Inner(false) + @GetMapping("/{bucket}/{fileName}") + public void file(@PathVariable String bucket, @PathVariable String fileName, HttpServletResponse response) { + sysFileService.getFile(bucket, fileName, response); + } + + /** + * 获取本地(resources)文件 + * @param fileName 文件名称 + * @param response 本地文件 + */ + @SneakyThrows + @GetMapping("/local/file/{fileName}") + public void localFile(@PathVariable String fileName, HttpServletResponse response) { + ClassPathResource resource = new ClassPathResource("file/" + fileName); + response.setContentType("application/octet-stream; charset=UTF-8"); + IoUtil.copy(resource.getInputStream(), response.getOutputStream()); + } + + /** + * 查询文件组列表 + * @param fileGroup SysFileGroup对象,用于筛选条件 + * @return 包含文件组列表的R对象 + */ + @GetMapping("/group/list") + public R listGroup(SysFileGroup fileGroup) { + return R.ok(sysFileService.listFileGroup(fileGroup)); + } + + /** + * 添加文件组 + * @param fileGroup SysFileGroup对象,要添加的文件组信息 + * @return 包含添加结果的R对象 + */ + @PostMapping("/group/add") + public R addGroup(@RequestBody SysFileGroup fileGroup) { + return R.ok(sysFileService.saveOrUpdateGroup(fileGroup)); + } + + /** + * 更新文件组 + * @param fileGroup SysFileGroup对象,要更新的文件组信息 + * @return 包含更新结果的R对象 + */ + @PutMapping("/group/update") + public R updateGroup(@RequestBody SysFileGroup fileGroup) { + return R.ok(sysFileService.saveOrUpdateGroup(fileGroup)); + } + + /** + * 删除文件组 + * @param id 待删除文件组的ID + * @return 包含删除结果的R对象 + */ + @DeleteMapping("/group/delete/{id}") + public R updateGroup(@PathVariable Long id) { + return R.ok(sysFileService.deleteGroup(id)); + } + + /** + * 移动文件组 + * @param fileGroupDTO SysFileGroupDTO对象,要移动的文件组信息 + * @return 包含移动结果的R对象 + */ + @PutMapping("/group/move") + public R moveFileGroup(@RequestBody SysFileGroupDTO fileGroupDTO) { + return R.ok(sysFileService.moveFileGroup(fileGroupDTO)); + } + +} diff --git a/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysI18nController.java b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysI18nController.java new file mode 100644 index 0000000..467bf73 --- /dev/null +++ b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysI18nController.java @@ -0,0 +1,169 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.admin.controller; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.pig4cloud.pigx.admin.api.entity.SysI18nEntity; +import com.pig4cloud.pigx.admin.service.SysI18nService; +import com.pig4cloud.pigx.common.core.constant.CacheConstants; +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.common.excel.annotation.ResponseExcel; +import com.pig4cloud.pigx.common.log.annotation.SysLog; +import com.pig4cloud.pigx.common.security.annotation.Inner; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.springdoc.api.annotations.ParameterObject; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.http.HttpHeaders; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 系统表-国际化 + * + * @author PIG + * @date 2023-02-14 09:07:01 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/i18n") +@Tag(description = "i18n", name = "系统表-国际化管理") +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class SysI18nController { + + private final SysI18nService sysI18nService; + + /** + * 分页查询 + * @param page 分页对象 + * @param sysI18n 系统表-国际化 + * @return + */ + @Operation(summary = "分页查询", description = "分页查询") + @GetMapping("/page") + @PreAuthorize("@pms.hasPermission('sys_i18n_view')") + public R getsysI18nPage(@ParameterObject Page page, @ParameterObject SysI18nEntity sysI18n) { + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + wrapper.like(StrUtil.isNotBlank(sysI18n.getName()), SysI18nEntity::getName, sysI18n.getName()); + wrapper.like(StrUtil.isNotBlank(sysI18n.getZhCn()), SysI18nEntity::getZhCn, sysI18n.getZhCn()); + wrapper.like(StrUtil.isNotBlank(sysI18n.getEn()), SysI18nEntity::getEn, sysI18n.getEn()); + return R.ok(sysI18nService.page(page, wrapper)); + } + + /** + * 通过id查询系统表-国际化 + * @param id id + * @return R + */ + @Operation(summary = "通过id查询", description = "通过id查询") + @GetMapping("/details/{id}") + public R getById(@PathVariable("id") Long id) { + return R.ok(sysI18nService.getById(id)); + } + + @GetMapping("/details") + public R getDetails(@ParameterObject SysI18nEntity entity) { + return R.ok(sysI18nService.getOne(Wrappers.query(entity))); + } + + /** + * 新增系统表-国际化 + * @param sysI18n 系统表-国际化 + * @return R + */ + @Operation(summary = "新增系统表-国际化", description = "新增系统表-国际化") + @SysLog("新增系统表-国际化") + @PostMapping + @CacheEvict(value = CacheConstants.I18N_DETAILS, allEntries = true) + @PreAuthorize("@pms.hasPermission('sys_i18n_add')") + public R save(@RequestBody SysI18nEntity sysI18n) { + return R.ok(sysI18nService.save(sysI18n)); + } + + /** + * 修改系统表-国际化 + * @param sysI18n 系统表-国际化 + * @return R + */ + @Operation(summary = "修改系统表-国际化", description = "修改系统表-国际化") + @SysLog("修改系统表-国际化") + @PutMapping + @CacheEvict(value = CacheConstants.I18N_DETAILS, allEntries = true) + @PreAuthorize("@pms.hasPermission('sys_i18n_edit')") + public R updateById(@RequestBody SysI18nEntity sysI18n) { + return R.ok(sysI18nService.updateById(sysI18n)); + } + + /** + * 通过id删除系统表-国际化 + * @param ids id 列表 + * @return R + */ + @Operation(summary = "通过id删除系统表-国际化", description = "通过id删除系统表-国际化") + @SysLog("通过id删除系统表-国际化") + @DeleteMapping + @CacheEvict(value = CacheConstants.I18N_DETAILS, allEntries = true) + @PreAuthorize("@pms.hasPermission('sys_i18n_del')") + public R removeById(@RequestBody Long[] ids) { + return R.ok(sysI18nService.removeBatchByIds(CollUtil.toList(ids))); + } + + /** + * 导出excel 表格 + * @param sysI18n 查询条件 + * @return excel 文件流 + */ + @ResponseExcel + @GetMapping("/export") + @PreAuthorize("@pms.hasPermission('sys_i18n_export')") + public List export(SysI18nEntity sysI18n, Long[] ids) { + return sysI18nService + .list(Wrappers.lambdaQuery(sysI18n).in(ArrayUtil.isNotEmpty(ids), SysI18nEntity::getId, ids)); + } + + /** + * 获取系统I18N配置 + * @return I18N 配置 + */ + @Operation(summary = "获取系统配置-国际化", description = "获取系统配置-国际化") + @Inner(false) + @GetMapping("/info") + public R list() { + return R.ok(sysI18nService.listMap()); + } + + /** + * 同步数据 + * @return R + */ + @SysLog("同步数据") + @PutMapping("/sync") + public R sync() { + return sysI18nService.syncI18nCache(); + } + +} diff --git a/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysLogController.java b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysLogController.java new file mode 100644 index 0000000..ecf8796 --- /dev/null +++ b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysLogController.java @@ -0,0 +1,116 @@ +/* + * + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + * + */ + +package com.pig4cloud.pigx.admin.controller; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.pig4cloud.pigx.admin.api.dto.SysLogDTO; +import com.pig4cloud.pigx.admin.api.entity.SysLog; +import com.pig4cloud.pigx.admin.api.vo.PreLogVO; +import com.pig4cloud.pigx.admin.service.SysLogService; +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.common.excel.annotation.ResponseExcel; +import com.pig4cloud.pigx.common.security.annotation.Inner; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.AllArgsConstructor; +import org.springdoc.api.annotations.ParameterObject; +import org.springframework.http.HttpHeaders; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.util.List; +import java.util.Objects; + +/** + *

+ * 日志表 前端控制器 + *

+ * + * @author lengleng + * @since 2017-11-20 + */ +@RestController +@AllArgsConstructor +@RequestMapping("/log") +@Tag(description = "log", name = "日志管理模块") +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class SysLogController { + + private final SysLogService sysLogService; + + /** + * 简单分页查询 + * @param page 分页对象 + * @param sysLog 系统日志 + * @return + */ + @GetMapping("/page") + public R getLogPage(@ParameterObject Page page, @ParameterObject SysLogDTO sysLog) { + return R.ok(sysLogService.getLogByPage(page, sysLog)); + } + + /** + * 批量删除日志 + * @param ids ID + * @return success/false + */ + @DeleteMapping + @PreAuthorize("@pms.hasPermission('sys_log_del')") + public R removeByIds(@RequestBody Long[] ids) { + return R.ok(sysLogService.removeBatchByIds(CollUtil.toList(ids))); + } + + /** + * 插入日志 + * @param sysLog 日志实体 + * @return success/false + */ + @Inner + @PostMapping("/save") + public R save(@Valid @RequestBody SysLogDTO sysLog) { + return R.ok(sysLogService.saveLog(sysLog)); + } + + /** + * 批量插入前端异常日志 + * @param preLogVoList 日志实体 + * @return success/false + */ + @PostMapping("/logs") + public R saveBatchLogs(@RequestBody List preLogVoList) { + return R.ok(sysLogService.saveBatchLogs(preLogVoList)); + } + + /** + * 导出excel 表格 + * @param sysLog 查询条件 + * @return + */ + @ResponseExcel + @GetMapping("/export") + @PreAuthorize("@pms.hasPermission('sys_log_export')") + public List export(SysLog sysLog, Long[] ids) { + return sysLogService.list(Wrappers.lambdaQuery(sysLog).in(Objects.nonNull(ids), SysLog::getId, ids)); + } + +} diff --git a/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysMenuController.java b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysMenuController.java new file mode 100644 index 0000000..9e77476 --- /dev/null +++ b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysMenuController.java @@ -0,0 +1,135 @@ +/* + * + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + * + */ + +package com.pig4cloud.pigx.admin.controller; + +import com.pig4cloud.pigx.admin.api.entity.SysMenu; +import com.pig4cloud.pigx.admin.service.SysMenuService; +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.common.log.annotation.SysLog; +import com.pig4cloud.pigx.common.security.util.SecurityUtils; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.AllArgsConstructor; +import org.springframework.http.HttpHeaders; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.util.HashSet; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * @author lengleng + * @date 2017/10/31 + */ +@RestController +@AllArgsConstructor +@RequestMapping("/menu") +@Tag(description = "menu", name = "菜单管理模块") +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class SysMenuController { + + private final SysMenuService sysMenuService; + + /** + * 返回当前用户的树形菜单集合 + * @param type 类型 + * @param parentId 父节点ID + * @return 当前用户的树形菜单 + */ + @GetMapping + public R getUserMenu(String type, Long parentId) { + // 获取符合条件的菜单 + Set all = new HashSet<>(); + SecurityUtils.getRoles().forEach(roleId -> all.addAll(sysMenuService.findMenuByRoleId(roleId))); + return R.ok(sysMenuService.filterMenu(all, type, parentId)); + } + + /** + * 返回树形菜单集合 + * @param parentId 父节点ID + * @param menuName 菜单名称 + * @return 树形菜单 + */ + @GetMapping(value = "/tree") + public R getTree(Long parentId, String menuName, String type) { + return R.ok(sysMenuService.treeMenu(parentId, menuName, type)); + } + + /** + * 返回角色的菜单集合 + * @param roleId 角色ID + * @return 属性集合 + */ + @GetMapping("/tree/{roleId}") + public R getRoleTree(@PathVariable Long roleId) { + return R.ok( + sysMenuService.findMenuByRoleId(roleId).stream().map(SysMenu::getMenuId).collect(Collectors.toList())); + } + + /** + * 通过ID查询菜单的详细信息 + * @param id 菜单ID + * @return 菜单详细信息 + */ + @GetMapping("/{id}") + public R getById(@PathVariable Long id) { + return R.ok(sysMenuService.getById(id)); + } + + /** + * 新增菜单 + * @param sysMenu 菜单信息 + * @return success/false + */ + @SysLog("新增菜单") + @PostMapping + @PreAuthorize("@pms.hasPermission('sys_menu_add')") + public R save(@Valid @RequestBody SysMenu sysMenu) { + sysMenuService.save(sysMenu); + return R.ok(sysMenu); + } + + /** + * 删除菜单 + * @param id 菜单ID + * @return success/false + */ + @SysLog("删除菜单") + @DeleteMapping("/{id}") + @PreAuthorize("@pms.hasPermission('sys_menu_del')") + public R removeById(@PathVariable Long id) { + return sysMenuService.removeMenuById(id); + } + + /** + * 更新菜单 + * @param sysMenu + * @return + */ + @SysLog("更新菜单") + @PutMapping + @PreAuthorize("@pms.hasPermission('sys_menu_edit')") + public R update(@Valid @RequestBody SysMenu sysMenu) { + return R.ok(sysMenuService.updateMenuById(sysMenu)); + } + +} diff --git a/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysPostController.java b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysPostController.java new file mode 100644 index 0000000..5f982e1 --- /dev/null +++ b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysPostController.java @@ -0,0 +1,167 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.admin.controller; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.pig4cloud.pigx.admin.api.entity.SysPost; +import com.pig4cloud.pigx.admin.api.vo.PostExcelVO; +import com.pig4cloud.pigx.admin.service.SysPostService; +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.common.excel.annotation.RequestExcel; +import com.pig4cloud.pigx.common.excel.annotation.ResponseExcel; +import com.pig4cloud.pigx.common.log.annotation.SysLog; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.springdoc.api.annotations.ParameterObject; +import org.springframework.http.HttpHeaders; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 岗位信息表 + * + * @author fxz + * @date 2022-03-26 12:50:43 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/post") +@Tag(description = "post", name = "岗位信息表管理") +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class SysPostController { + + private final SysPostService sysPostService; + + /** + * 获取岗位列表 + * @return 岗位列表 + */ + @GetMapping("/list") + public R> listPosts() { + return R.ok(sysPostService.list(Wrappers.emptyWrapper())); + } + + /** + * 分页查询 + * @param page 分页对象 + * @param sysPost 岗位信息表 + * @return + */ + @Operation(description = "分页查询", summary = "分页查询") + @GetMapping("/page") + @PreAuthorize("@pms.hasPermission('sys_post_view')") + public R getSysPostPage(@ParameterObject Page page, @ParameterObject SysPost sysPost) { + return R.ok(sysPostService.page(page, Wrappers.lambdaQuery() + .like(StrUtil.isNotBlank(sysPost.getPostName()), SysPost::getPostName, sysPost.getPostName()))); + } + + /** + * 通过id查询岗位信息表 + * @param postId id + * @return R + */ + @Operation(description = "通过id查询", summary = "通过id查询") + @GetMapping("/details/{postId}") + @PreAuthorize("@pms.hasPermission('sys_post_view')") + public R getById(@PathVariable("postId") Long postId) { + return R.ok(sysPostService.getById(postId)); + } + + /** + * 查询岗位信息信息 + * @param query 查询条件 + * @return R + */ + @Operation(description = "查询角色信息", summary = "查询角色信息") + @GetMapping("/details") + @PreAuthorize("@pms.hasPermission('sys_post_view')") + public R getDetails(@ParameterObject SysPost query) { + return R.ok(sysPostService.getOne(Wrappers.query(query), false)); + } + + /** + * 新增岗位信息表 + * @param sysPost 岗位信息表 + * @return R + */ + @Operation(description = "新增岗位信息表", summary = "新增岗位信息表") + @SysLog("新增岗位信息表") + @PostMapping + @PreAuthorize("@pms.hasPermission('sys_post_add')") + public R save(@RequestBody SysPost sysPost) { + return R.ok(sysPostService.save(sysPost)); + } + + /** + * 修改岗位信息表 + * @param sysPost 岗位信息表 + * @return R + */ + @Operation(description = "修改岗位信息表", summary = "修改岗位信息表") + @SysLog("修改岗位信息表") + @PutMapping + @PreAuthorize("@pms.hasPermission('sys_post_edit')") + public R updateById(@RequestBody SysPost sysPost) { + return R.ok(sysPostService.updateById(sysPost)); + } + + /** + * 通过id删除岗位信息表 + * @param ids id 列表 + * @return R + */ + @Operation(description = "通过id删除岗位信息表", summary = "通过id删除岗位信息表") + @SysLog("通过id删除岗位信息表") + @DeleteMapping + @PreAuthorize("@pms.hasPermission('sys_post_del')") + public R removeById(@RequestBody Long[] ids) { + return R.ok(sysPostService.removeBatchByIds(CollUtil.toList(ids))); + } + + /** + * 导出excel 表格 + * @return excel 文件流 + */ + @ResponseExcel + @GetMapping("/export") + @PreAuthorize("@pms.hasPermission('sys_post_export')") + public List export(SysPost post, Long[] ids) { + return sysPostService.listPost(post, ids); + } + + /** + * 导入岗位 + * @param excelVOList 岗位列表 + * @param bindingResult 错误信息列表 + * @return ok fail + */ + @PostMapping("/import") + @PreAuthorize("@pms.hasPermission('sys_post_export')") + public R importRole(@RequestExcel List excelVOList, BindingResult bindingResult) { + return sysPostService.importPost(excelVOList, bindingResult); + } + +} diff --git a/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysPublicParamController.java b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysPublicParamController.java new file mode 100644 index 0000000..1c7bfb7 --- /dev/null +++ b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysPublicParamController.java @@ -0,0 +1,179 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.admin.controller; + +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.pig4cloud.pigx.admin.api.entity.SysPublicParam; +import com.pig4cloud.pigx.admin.service.SysPublicParamService; +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.common.excel.annotation.ResponseExcel; +import com.pig4cloud.pigx.common.log.annotation.SysLog; +import com.pig4cloud.pigx.common.security.annotation.Inner; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.AllArgsConstructor; +import org.springdoc.api.annotations.ParameterObject; +import org.springframework.http.HttpHeaders; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 公共参数 + * + * @author Lucky + * @date 2019-04-29 + */ +@RestController +@AllArgsConstructor +@RequestMapping("/param") +@Tag(description = "param", name = "公共参数配置") +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class SysPublicParamController { + + private final SysPublicParamService sysPublicParamService; + + /** + * 通过key查询公共参数值 + * @param publicKey + * @return + */ + @Inner(value = false) + @Operation(description = "查询公共参数值", summary = "根据key查询公共参数值") + @GetMapping("/publicValue/{publicKey}") + public R publicKey(@PathVariable("publicKey") String publicKey) { + return R.ok(sysPublicParamService.getSysPublicParamKeyToValue(publicKey)); + } + + /** + * 通过key查询公共参数值 + * @param keys + * @return + */ + @Inner(value = false) + @Operation(description = "查询公共参数值", summary = "根据key查询公共参数值") + @GetMapping("/publicValues") + public R publicKeys(String[] keys) { + return R.ok(sysPublicParamService.getSysPublicParamsKeyToValue(keys)); + } + + /** + * 分页查询 + * @param page 分页对象 + * @param sysPublicParam 公共参数 + * @return + */ + @Operation(description = "分页查询", summary = "分页查询") + @GetMapping("/page") + public R getSysPublicParamPage(@ParameterObject Page page, @ParameterObject SysPublicParam sysPublicParam) { + LambdaUpdateWrapper wrapper = Wrappers.lambdaUpdate() + .like(StrUtil.isNotBlank(sysPublicParam.getPublicName()), SysPublicParam::getPublicName, + sysPublicParam.getPublicName()) + .like(StrUtil.isNotBlank(sysPublicParam.getPublicKey()), SysPublicParam::getPublicKey, + sysPublicParam.getPublicKey()) + .eq(StrUtil.isNotBlank(sysPublicParam.getSystemFlag()), SysPublicParam::getSystemFlag, + sysPublicParam.getSystemFlag()); + + return R.ok(sysPublicParamService.page(page, wrapper)); + } + + /** + * 通过id查询公共参数 + * @param publicId id + * @return R + */ + @Operation(description = "通过id查询公共参数", summary = "通过id查询公共参数") + @GetMapping("/details/{publicId}") + public R getById(@PathVariable("publicId") Long publicId) { + return R.ok(sysPublicParamService.getById(publicId)); + } + + @GetMapping("/details") + public R getDetail(@ParameterObject SysPublicParam param) { + return R.ok(sysPublicParamService.getOne(Wrappers.query(param), false)); + } + + /** + * 新增公共参数 + * @param sysPublicParam 公共参数 + * @return R + */ + @Operation(description = "新增公共参数", summary = "新增公共参数") + @SysLog("新增公共参数") + @PostMapping + @PreAuthorize("@pms.hasPermission('sys_syspublicparam_add')") + public R save(@RequestBody SysPublicParam sysPublicParam) { + return R.ok(sysPublicParamService.save(sysPublicParam)); + } + + /** + * 修改公共参数 + * @param sysPublicParam 公共参数 + * @return R + */ + @Operation(description = "修改公共参数", summary = "修改公共参数") + @SysLog("修改公共参数") + @PutMapping + @PreAuthorize("@pms.hasPermission('sys_syspublicparam_edit')") + public R updateById(@RequestBody SysPublicParam sysPublicParam) { + return sysPublicParamService.updateParam(sysPublicParam); + } + + /** + * 通过id删除公共参数 + * @param publicId id + * @return R + */ + @Operation(description = "删除公共参数", summary = "删除公共参数") + @SysLog("删除公共参数") + @DeleteMapping + @PreAuthorize("@pms.hasPermission('sys_syspublicparam_del')") + public R removeById(@RequestBody Long[] ids) { + return R.ok(sysPublicParamService.removeParamByIds(ids)); + } + + /** + * 导出excel 表格 + * @return + */ + @ResponseExcel + @GetMapping("/export") + @PreAuthorize("@pms.hasPermission('sys_syspublicparam_edit')") + public List export(SysPublicParam param, Long[] ids) { + return sysPublicParamService + .list(Wrappers.lambdaQuery(param).in(ArrayUtil.isNotEmpty(ids), SysPublicParam::getPublicId, ids)); + } + + /** + * 同步参数 + * @return R + */ + @SysLog("同步参数") + @PutMapping("/sync") + @PreAuthorize("@pms.hasPermission('sys_syspublicparam_edit')") + public R sync() { + return sysPublicParamService.syncParamCache(); + } + +} diff --git a/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysRoleController.java b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysRoleController.java new file mode 100644 index 0000000..723d08b --- /dev/null +++ b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysRoleController.java @@ -0,0 +1,188 @@ +/* + * + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + * + */ + +package com.pig4cloud.pigx.admin.controller; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.pig4cloud.pigx.admin.api.entity.SysRole; +import com.pig4cloud.pigx.admin.api.vo.RoleExcelVO; +import com.pig4cloud.pigx.admin.api.vo.RoleVO; +import com.pig4cloud.pigx.admin.service.SysRoleService; +import com.pig4cloud.pigx.common.core.constant.CacheConstants; +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.common.excel.annotation.RequestExcel; +import com.pig4cloud.pigx.common.excel.annotation.ResponseExcel; +import com.pig4cloud.pigx.common.log.annotation.SysLog; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.AllArgsConstructor; +import org.springdoc.api.annotations.ParameterObject; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.http.HttpHeaders; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.util.List; + +/** + * @author lengleng + * @date 2020-02-10 + */ +@RestController +@AllArgsConstructor +@RequestMapping("/role") +@Tag(description = "role", name = "角色管理模块") +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class SysRoleController { + + private final SysRoleService sysRoleService; + + /** + * 通过ID查询角色信息 + * @param id ID + * @return 角色信息 + */ + @GetMapping("/details/{id}") + public R getById(@PathVariable Long id) { + return R.ok(sysRoleService.getById(id)); + } + + /** + * 查询角色信息 + * @param query 查询条件 + * @return 角色信息 + */ + @GetMapping("/details") + public R getDetails(@ParameterObject SysRole query) { + return R.ok(sysRoleService.getOne(Wrappers.query(query), false)); + } + + /** + * 添加角色 + * @param sysRole 角色信息 + * @return success、false + */ + @SysLog("添加角色") + @PostMapping + @PreAuthorize("@pms.hasPermission('sys_role_add')") + @CacheEvict(value = CacheConstants.ROLE_DETAILS, allEntries = true) + public R save(@Valid @RequestBody SysRole sysRole) { + return R.ok(sysRoleService.save(sysRole)); + } + + /** + * 修改角色 + * @param sysRole 角色信息 + * @return success/false + */ + @SysLog("修改角色") + @PutMapping + @PreAuthorize("@pms.hasPermission('sys_role_edit')") + @CacheEvict(value = CacheConstants.ROLE_DETAILS, allEntries = true) + public R update(@Valid @RequestBody SysRole sysRole) { + return R.ok(sysRoleService.updateById(sysRole)); + } + + /** + * 删除角色 + * @param ids + * @return + */ + @SysLog("删除角色") + @DeleteMapping + @PreAuthorize("@pms.hasPermission('sys_role_del')") + @CacheEvict(value = CacheConstants.ROLE_DETAILS, allEntries = true) + public R removeById(@RequestBody Long[] ids) { + return R.ok(sysRoleService.removeRoleByIds(ids)); + } + + /** + * 获取角色列表 + * @return 角色列表 + */ + @GetMapping("/list") + public R listRoles() { + return R.ok(sysRoleService.list(Wrappers.emptyWrapper())); + } + + /** + * 分页查询角色信息 + * @param page 分页对象 + * @param role 查询条件 + * @return 分页对象 + */ + @GetMapping("/page") + public R getRolePage(Page page, SysRole role) { + return R.ok(sysRoleService.page(page, Wrappers.lambdaQuery() + .like(StrUtil.isNotBlank(role.getRoleName()), SysRole::getRoleName, role.getRoleName()))); + } + + /** + * 更新角色菜单 + * @param roleVo 角色对象 + * @return success、false + */ + @SysLog("更新角色菜单") + @PutMapping("/menu") + @PreAuthorize("@pms.hasPermission('sys_role_perm')") + public R saveRoleMenus(@RequestBody RoleVO roleVo) { + return R.ok(sysRoleService.updateRoleMenus(roleVo)); + } + + /** + * 通过角色ID 查询角色列表 + * @param roleIdList 角色ID + * @return + */ + @PostMapping("/getRoleList") + public R getRoleList(@RequestBody List roleIdList) { + return R.ok(sysRoleService.findRolesByRoleIds(roleIdList, CollUtil.join(roleIdList, StrUtil.UNDERLINE))); + } + + /** + * 导出excel 表格 + * @param sysRole 查询条件 + * @param ids 导出ids + * @return + */ + @ResponseExcel + @GetMapping("/export") + @PreAuthorize("@pms.hasPermission('sys_role_export')") + public List export(SysRole sysRole, Long[] ids) { + return sysRoleService.listRole(sysRole, ids); + } + + /** + * 导入角色 + * @param excelVOList 角色列表 + * @param bindingResult 错误信息列表 + * @return ok fail + */ + @PostMapping("/import") + @PreAuthorize("@pms.hasPermission('sys_role_export')") + public R importRole(@RequestExcel List excelVOList, BindingResult bindingResult) { + return sysRoleService.importRole(excelVOList, bindingResult); + } + +} diff --git a/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysRouteConfController.java b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysRouteConfController.java new file mode 100644 index 0000000..2a28d9a --- /dev/null +++ b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysRouteConfController.java @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.admin.controller; + +import cn.hutool.json.JSONArray; +import com.pig4cloud.pigx.admin.service.SysRouteConfService; +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.common.log.annotation.SysLog; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.AllArgsConstructor; +import org.springframework.http.HttpHeaders; +import org.springframework.web.bind.annotation.*; + +/** + * 路由 + * + * @author lengleng + * @date 2018-11-06 10:17:18 + */ +@RestController +@AllArgsConstructor +@RequestMapping("/route") +@Tag(description = "route", name = "动态路由管理模块") +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class SysRouteConfController { + + private final SysRouteConfService sysRouteConfService; + + /** + * 获取当前定义的路由信息 + * @return + */ + @GetMapping + public R listRoutes() { + return R.ok(sysRouteConfService.list()); + } + + /** + * 修改路由 + * @param routes 路由定义 + * @return + */ + @SysLog("修改路由") + @PutMapping + public R updateRoutes(@RequestBody JSONArray routes) { + return R.ok(sysRouteConfService.updateRoutes(routes)); + } + +} diff --git a/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysScheduleController.java b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysScheduleController.java new file mode 100644 index 0000000..62e936e --- /dev/null +++ b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysScheduleController.java @@ -0,0 +1,130 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.admin.controller; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.pig4cloud.pigx.admin.api.entity.SysScheduleEntity; +import com.pig4cloud.pigx.admin.service.SysScheduleService; +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.common.excel.annotation.ResponseExcel; +import com.pig4cloud.pigx.common.log.annotation.SysLog; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.springdoc.api.annotations.ParameterObject; +import org.springframework.http.HttpHeaders; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 日程 + * + * @author aeizzz + * @date 2023-03-06 14:26:23 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/schedule") +@Tag(description = "schedule", name = "日程管理") +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class SysScheduleController { + + private final SysScheduleService sysScheduleService; + + /** + * 分页查询 + * @param page 分页对象 + * @param sysSchedule 日程 + * @return + */ + @Operation(summary = "分页查询", description = "分页查询") + @GetMapping("/page") + public R getSchedulePage(@ParameterObject Page page, @ParameterObject SysScheduleEntity sysSchedule) { + return R.ok(sysScheduleService.getScheduleByScope(page, sysSchedule)); + } + + /** + * 通过id查询日程 + * @param id id + * @return R + */ + @Operation(summary = "通过id查询", description = "通过id查询") + @GetMapping("/{id}") + public R getById(@PathVariable("id") Long id) { + return R.ok(sysScheduleService.getById(id)); + } + + /** + * 新增日程 + * @param sysSchedule 日程 + * @return R + */ + @Operation(summary = "新增日程", description = "新增日程") + @SysLog("新增日程") + @PostMapping + public R save(@RequestBody SysScheduleEntity sysSchedule) { + return R.ok(sysScheduleService.save(sysSchedule)); + } + + /** + * 修改日程 + * @param sysSchedule 日程 + * @return R + */ + @Operation(summary = "修改日程", description = "修改日程") + @SysLog("修改日程") + @PutMapping + public R updateById(@RequestBody SysScheduleEntity sysSchedule) { + return R.ok(sysScheduleService.updateById(sysSchedule)); + } + + /** + * 通过id删除日程 + * @param ids id列表 + * @return R + */ + @Operation(summary = "通过id删除日程", description = "通过id删除日程") + @SysLog("通过id删除日程") + @DeleteMapping + public R removeById(@RequestBody Long[] ids) { + return R.ok(sysScheduleService.removeBatchByIds(CollUtil.toList(ids))); + } + + /** + * 导出excel 表格 + * @param sysSchedule 查询条件 + * @return excel 文件流 + */ + @ResponseExcel + @GetMapping("/export") + public List export(SysScheduleEntity sysSchedule) { + return sysScheduleService.list(Wrappers.query(sysSchedule)); + } + + @Operation(summary = "列表查询", description = "列表查询") + @GetMapping("/list") + public R list(String month) { + List list = sysScheduleService.selectListByScope(month); + return R.ok(list); + } + +} diff --git a/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysSocialDetailsController.java b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysSocialDetailsController.java new file mode 100644 index 0000000..dbd758f --- /dev/null +++ b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysSocialDetailsController.java @@ -0,0 +1,152 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.admin.controller; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ArrayUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.pig4cloud.pigx.admin.api.entity.SysSocialDetails; +import com.pig4cloud.pigx.admin.service.SysSocialDetailsService; +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.common.core.util.ValidGroup; +import com.pig4cloud.pigx.common.log.annotation.SysLog; +import com.pig4cloud.pigx.common.security.annotation.Inner; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.AllArgsConstructor; +import org.springdoc.api.annotations.ParameterObject; +import org.springframework.http.HttpHeaders; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.util.List; + +/** + * 系统社交登录账号表 + * + * @author lengleng + * @date 2018-08-16 21:30:41 + */ +@RestController +@RequestMapping("/social") +@AllArgsConstructor +@Tag(description = "social", name = "三方账号管理模块") +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class SysSocialDetailsController { + + private final SysSocialDetailsService sysSocialDetailsService; + + /** + * 社交登录账户简单分页查询 + * @param page 分页对象 + * @param sysSocialDetails 社交登录 + * @return + */ + @GetMapping("/page") + public R getSocialDetailsPage(@ParameterObject Page page, @ParameterObject SysSocialDetails sysSocialDetails) { + return R.ok(sysSocialDetailsService.page(page, Wrappers.query(sysSocialDetails))); + } + + /** + * 信息 + * @param type 类型 + * @return R + */ + @GetMapping("/{type}") + public R getByType(@PathVariable("type") String type) { + return R.ok(sysSocialDetailsService + .list(Wrappers.lambdaQuery().eq(SysSocialDetails::getType, type))); + } + + @GetMapping("/getById/{id}") + public R info(@PathVariable("id") Long id) { + return R.ok(sysSocialDetailsService.getById(id)); + } + + /** + * 保存 + * @param sysSocialDetails + * @return R + */ + @SysLog("保存三方信息") + @PostMapping + @PreAuthorize("@pms.hasPermission('sys_social_details_add')") + public R save(@Valid @RequestBody SysSocialDetails sysSocialDetails) { + return R.ok(sysSocialDetailsService.save(sysSocialDetails)); + } + + /** + * 修改 + * @param sysSocialDetails + * @return R + */ + @SysLog("修改三方信息") + @PutMapping + @PreAuthorize("@pms.hasPermission('sys_social_details_edit')") + public R updateById(@Validated({ ValidGroup.Update.class }) @RequestBody SysSocialDetails sysSocialDetails) { + sysSocialDetailsService.updateById(sysSocialDetails); + return R.ok(Boolean.TRUE); + } + + /** + * 删除 + * @param ids id 列表 + * @return R + */ + @SysLog("删除三方信息") + @DeleteMapping + @PreAuthorize("@pms.hasPermission('sys_social_details_del')") + public R removeById(@RequestBody Long[] ids) { + return R.ok(sysSocialDetailsService.removeBatchByIds(CollUtil.toList(ids))); + } + + /** + * 通过社交账号、手机号查询用户、角色信息 + * @param inStr appid@code + * @return + */ + @Inner + @GetMapping("/info/{inStr}") + public R getUserInfo(@PathVariable String inStr) { + return R.ok(sysSocialDetailsService.getUserInfo(inStr)); + } + + /** + * 绑定社交账号 + * @param state 类型 + * @param code code + * @return + */ + @PostMapping("/bind") + public R bindSocial(String state, String code) { + return R.ok(sysSocialDetailsService.bindSocial(state, code)); + } + + /** + * 导出 + */ + @GetMapping("/export") + public List export(SysSocialDetails sysSocialDetails, Long[] ids) { + return sysSocialDetailsService.list( + Wrappers.lambdaQuery(sysSocialDetails).in(ArrayUtil.isNotEmpty(ids), SysSocialDetails::getId, ids)); + } + +} diff --git a/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysSystemInfoController.java b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysSystemInfoController.java new file mode 100644 index 0000000..eefd0b2 --- /dev/null +++ b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysSystemInfoController.java @@ -0,0 +1,59 @@ +package com.pig4cloud.pigx.admin.controller; + +import com.pig4cloud.pigx.common.core.util.R; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.apache.commons.lang3.StringUtils; +import org.springframework.data.redis.connection.RedisServerCommands; +import org.springframework.data.redis.core.RedisCallback; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.http.HttpHeaders; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.*; + +@RestController +@RequestMapping("/system") +@RequiredArgsConstructor +@Tag(description = "system", name = "系统监控") +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class SysSystemInfoController { + + private final RedisTemplate redisTemplate; + + /** + * 缓存监控 + * @return R + */ + @GetMapping("/cache") + public R cache() { + Properties info = (Properties) redisTemplate.execute((RedisCallback) RedisServerCommands::info); + Properties commandStats = (Properties) redisTemplate + .execute((RedisCallback) connection -> connection.info("commandstats")); + Object dbSize = redisTemplate.execute((RedisCallback) RedisServerCommands::dbSize); + + if (commandStats == null) { + return R.failed("获取异常"); + } + + Map result = new HashMap<>(3); + result.put("info", info); + result.put("dbSize", dbSize); + + List> pieList = new ArrayList<>(); + commandStats.stringPropertyNames().forEach(key -> { + Map data = new HashMap<>(2); + String property = commandStats.getProperty(key); + data.put("name", StringUtils.removeStart(key, "cmdstat_")); + data.put("value", StringUtils.substringBetween(property, "calls=", ",usec")); + pieList.add(data); + }); + + result.put("commandStats", pieList); + return R.ok(result); + } + +} diff --git a/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysTenantController.java b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysTenantController.java new file mode 100644 index 0000000..ad4fbcc --- /dev/null +++ b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysTenantController.java @@ -0,0 +1,175 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.admin.controller; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.lang.tree.Tree; +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.pig4cloud.pigx.admin.api.entity.SysTenant; +import com.pig4cloud.pigx.admin.service.SysMenuService; +import com.pig4cloud.pigx.admin.service.SysTenantService; +import com.pig4cloud.pigx.common.core.constant.CacheConstants; +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.common.data.resolver.ParamResolver; +import com.pig4cloud.pigx.common.data.tenant.TenantBroker; +import com.pig4cloud.pigx.common.excel.annotation.ResponseExcel; +import com.pig4cloud.pigx.common.log.annotation.SysLog; +import com.pig4cloud.pigx.common.security.annotation.Inner; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.springdoc.api.annotations.ParameterObject; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.http.HttpHeaders; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 租户管理 + * + * @author lengleng + * @date 2019-05-15 15:55:41 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/tenant") +@Tag(description = "tenant", name = "租户管理") +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class SysTenantController { + + private final SysTenantService sysTenantService; + + private final SysMenuService sysMenuService; + + /** + * 分页查询 + * @param page 分页对象 + * @param sysTenant 租户 + * @return + */ + @GetMapping("/page") + public R getSysTenantPage(@ParameterObject Page page, @ParameterObject SysTenant sysTenant) { + return R.ok(sysTenantService.page(page, Wrappers.lambdaQuery() + .like(StrUtil.isNotBlank(sysTenant.getName()), SysTenant::getName, sysTenant.getName()))); + } + + /** + * 通过ID 查询租户信息 + * @param id ID + * @return R + */ + @GetMapping("/details/{id}") + public R getById(@PathVariable Long id) { + return R.ok(sysTenantService.getById(id)); + } + + /** + * 查询租户信息 + * @param query 查询条件 + * @return 租户信息 + */ + @GetMapping("/details") + public R getDetails(@ParameterObject SysTenant query) { + return R.ok(sysTenantService.getOne(Wrappers.query(query), false)); + } + + /** + * 新增租户 + * @param sysTenant 租户 + * @return R + */ + @SysLog("新增租户") + @PostMapping + @PreAuthorize("@pms.hasPermission('sys_systenant_add')") + @CacheEvict(value = CacheConstants.TENANT_DETAILS, allEntries = true) + public R save(@RequestBody SysTenant sysTenant) { + return R.ok(sysTenantService.saveTenant(sysTenant)); + } + + /** + * 修改租户 + * @param sysTenant 租户 + * @return R + */ + @SysLog("修改租户") + @PutMapping + @PreAuthorize("@pms.hasPermission('sys_systenant_edit')") + public R updateById(@RequestBody SysTenant sysTenant) { + return R.ok(sysTenantService.updateTenant(sysTenant)); + } + + /** + * 通过id删除租户 + *

+ * 为了保证安全,这里只删除租户表的数据,不删除基础表中的租户初始化数据。 + * @param ids id 列表 + * @return R + */ + @SysLog("删除租户") + @DeleteMapping + @PreAuthorize("@pms.hasPermission('sys_systenant_del')") + @CacheEvict(value = CacheConstants.TENANT_DETAILS, allEntries = true) + public R removeById(@RequestBody Long[] ids) { + return R.ok(sysTenantService.removeBatchByIds(CollUtil.toList(ids))); + } + + /** + * 查询全部有效的租户 + * @return + */ + @Inner(value = false) + @GetMapping("/list") + public R list() { + List tenants = sysTenantService.getNormalTenant().stream() + .filter(tenant -> tenant.getStartTime().isBefore(LocalDateTime.now())) + .filter(tenant -> tenant.getEndTime().isAfter(LocalDateTime.now())).collect(Collectors.toList()); + return R.ok(tenants); + } + + /** + * 导出excel 表格 + * @return + */ + @ResponseExcel + @GetMapping("/export") + @PreAuthorize("@pms.hasPermission('sys_systenant_export')") + public List export(SysTenant sysTenant, Long[] ids) { + return sysTenantService + .list(Wrappers.lambdaQuery(sysTenant).in(ArrayUtil.isNotEmpty(ids), SysTenant::getId, ids)); + } + + @GetMapping(value = "/tree/menu") + public R getTree() { + Long defaultId = ParamResolver.getLong("TENANT_DEFAULT_ID", 1L); + List> trees = new ArrayList<>(); + TenantBroker.runAs(defaultId, (id) -> { + trees.addAll(sysMenuService.treeMenu(null, null, null)); + }); + + return R.ok(trees); + } + +} diff --git a/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysTokenController.java b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysTokenController.java new file mode 100644 index 0000000..764840b --- /dev/null +++ b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysTokenController.java @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.admin.controller; + +import com.pig4cloud.pigx.admin.api.feign.RemoteTokenService; +import com.pig4cloud.pigx.common.core.constant.SecurityConstants; +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.common.log.annotation.SysLog; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.AllArgsConstructor; +import org.springframework.http.HttpHeaders; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Map; + +/** + * @author lengleng + * @date 2018/9/4 getTokenPage 管理 + */ +@RestController +@AllArgsConstructor +@RequestMapping("/token") +@Tag(description = "token", name = "令牌管理模块") +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class SysTokenController { + + private final RemoteTokenService remoteTokenService; + + /** + * 分页token 信息 + * @param params 参数集 + * @return token集合 + */ + @RequestMapping("/page") + public R getTokenPage(@RequestBody Map params) { + return remoteTokenService.getTokenPage(params, SecurityConstants.FROM_IN); + } + + /** + * 删除 + * @param token getTokenPage + * @return success/false + */ + @SysLog("删除用户token") + @DeleteMapping("/delete") + @PreAuthorize("@pms.hasPermission('sys_token_del')") + public R removeById(@RequestBody String[] tokens) { + for (String token : tokens) { + remoteTokenService.removeTokenById(token, SecurityConstants.FROM_IN); + } + return R.ok(); + } + +} diff --git a/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysUserController.java b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysUserController.java new file mode 100644 index 0000000..b44a8f9 --- /dev/null +++ b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysUserController.java @@ -0,0 +1,279 @@ +/* + * + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + * + */ + +package com.pig4cloud.pigx.admin.controller; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.pig4cloud.pigx.admin.api.dto.UserDTO; +import com.pig4cloud.pigx.admin.api.entity.SysUser; +import com.pig4cloud.pigx.admin.api.vo.UserExcelVO; +import com.pig4cloud.pigx.admin.service.SysUserService; +import com.pig4cloud.pigx.common.core.constant.CommonConstants; +import com.pig4cloud.pigx.common.core.exception.ErrorCodes; +import com.pig4cloud.pigx.common.core.util.MsgUtils; +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.common.excel.annotation.RequestExcel; +import com.pig4cloud.pigx.common.excel.annotation.ResponseExcel; +import com.pig4cloud.pigx.common.log.annotation.SysLog; +import com.pig4cloud.pigx.common.security.annotation.Inner; +import com.pig4cloud.pigx.common.security.util.SecurityUtils; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.AllArgsConstructor; +import org.springdoc.api.annotations.ParameterObject; +import org.springframework.http.HttpHeaders; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.util.List; + +/** + * @author lengleng + * @date 2018/12/16 + */ +@RestController +@AllArgsConstructor +@RequestMapping("/user") +@Tag(description = "user", name = "用户管理模块") +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class SysUserController { + + private final SysUserService userService; + + /** + * 获取指定用户全部信息 + * @return 用户信息 + */ + @Inner + @GetMapping("/info/{username}") + public R info(@PathVariable String username) { + SysUser user = userService.getOne(Wrappers.query().lambda().eq(SysUser::getUsername, username)); + if (user == null) { + return R.failed(MsgUtils.getMessage(ErrorCodes.SYS_USER_USERINFO_EMPTY, username)); + } + return R.ok(userService.findUserInfo(user)); + } + + /** + * 获取当前用户全部信息 + * @return 用户信息 + */ + @GetMapping(value = { "/info" }) + public R info() { + String username = SecurityUtils.getUser().getUsername(); + SysUser user = userService.getOne(Wrappers.query().lambda().eq(SysUser::getUsername, username)); + if (user == null) { + return R.failed(MsgUtils.getMessage(ErrorCodes.SYS_USER_QUERY_ERROR)); + } + return R.ok(userService.findUserInfo(user)); + } + + /** + * 通过ID查询用户信息 + * @param id ID + * @return 用户信息 + */ + @GetMapping("/details/{id}") + public R user(@PathVariable Long id) { + return R.ok(userService.selectUserVoById(id)); + } + + /** + * 查询用户信息 + * @param query 查询条件 + * @return 不为空返回用户名 + */ + @Inner(value = false) + @GetMapping("/details") + public R getDetails(@ParameterObject SysUser query) { + SysUser sysUser = userService.getOne(Wrappers.query(query), false); + return R.ok(sysUser == null ? null : CommonConstants.SUCCESS); + } + + /** + * 删除用户信息 + * @param ids ID + * @return R + */ + @SysLog("删除用户信息") + @DeleteMapping + @PreAuthorize("@pms.hasPermission('sys_user_del')") + @Operation(summary = "删除用户", description = "根据ID删除用户") + public R userDel(@RequestBody Long[] ids) { + return R.ok(userService.deleteUserByIds(ids)); + } + + /** + * 添加用户 + * @param userDto 用户信息 + * @return success/false + */ + @SysLog("添加用户") + @PostMapping + @PreAuthorize("@pms.hasPermission('sys_user_add')") + public R user(@RequestBody UserDTO userDto) { + return R.ok(userService.saveUser(userDto)); + } + + /** + * 分页查询用户 + * @param page 参数集 + * @param userDTO 查询参数列表 + * @return 用户集合 + */ + @GetMapping("/page") + public R getUserPage(@ParameterObject Page page, @ParameterObject UserDTO userDTO) { + return R.ok(userService.getUsersWithRolePage(page, userDTO)); + } + + /** + * 管理员更新用户信息 + * @param userDto 用户信息 + * @return R + */ + @SysLog("更新用户信息") + @PutMapping + @PreAuthorize("@pms.hasPermission('sys_user_edit')") + public R updateUser(@Valid @RequestBody UserDTO userDto) { + return R.ok(userService.updateUser(userDto)); + } + + /** + * 修改个人信息 (当前用户) + * @param userDto userDto + * @return success/false + */ + @SysLog("修改个人信息") + @PutMapping("/personal/edit") + public R updateUserInfo(@Valid @RequestBody UserDTO userDto) { + return userService.updateUserInfo(userDto); + } + + /** + * 修改个人密码 (当前用户) + * @param userDto 用户DTO对象,包含需要修改密码的用户信息 + * @return R 返回结果对象,包含修改密码操作的结果信息 + */ + @PutMapping("/personal/password") + public R updatePassword(@RequestBody UserDTO userDto) { + String username = SecurityUtils.getUser().getUsername(); + userDto.setUsername(username); + return userService.changePassword(userDto); + } + + /** + * @param username 用户名称 + * @return 上级部门用户列表 + */ + @GetMapping("/ancestor/{username}") + public R listAncestorUsers(@PathVariable String username) { + return R.ok(userService.listAncestorUsers(username)); + } + + /** + * 导出excel 表格 + * @param userDTO 查询条件 + * @return + */ + @ResponseExcel + @GetMapping("/export") + @PreAuthorize("@pms.hasPermission('sys_user_export')") + public List export(UserDTO userDTO, Long[] ids) { + return userService.listUser(userDTO, ids); + } + + /** + * 导入用户 + * @param excelVOList 用户列表 + * @param bindingResult 错误信息列表 + * @return R + */ + @PostMapping("/import") + @PreAuthorize("@pms.hasPermission('sys_user_export')") + public R importUser(@RequestExcel List excelVOList, BindingResult bindingResult) { + return userService.importUser(excelVOList, bindingResult); + } + + /** + * 锁定指定用户 + * @param username 用户名 + * @return R + */ + @Inner + @PutMapping("/lock/{username}") + public R lockUser(@PathVariable String username) { + return userService.lockUser(username); + } + + /** + * 解绑定接口 + * @param type 需要解绑定的类型 + * @return R 返回结果对象,包含解绑定操作的结果信息 + */ + @PostMapping("/unbinding") + public R unbinding(String type) { + return userService.unbinding(type); + } + + /** + * 校验密码接口 + * @param password 需要校验的密码 + * @return R 返回结果对象,包含校验密码操作的结果信息 + */ + @PostMapping("/check") + public R check(String password) { + return userService.checkPassword(password); + } + + /** + * 根据角色ID列表获取用户ID列表接口 + * @param roleIdList 角色ID列表 + * @return R 返回结果对象,包含根据角色ID列表获取到的用户ID列表信息 + */ + @GetMapping("/getUserIdListByRoleIdList") + public R> getUserIdListByRoleIdList(Long[] roleIdList) { + return R.ok(userService.listUserIdByRoleIds(CollUtil.toList(roleIdList))); + } + + /** + * 根据部门ID列表获取用户ID列表接口 + * @param deptIdList 部门ID列表 + * @return R 返回结果对象,包含根据部门ID列表获取到的用户ID列表信息 + */ + @GetMapping("/getUserIdListByDeptIdList") + public R> getUserIdListByDeptIdList(Long[] deptIdList) { + return R.ok(userService.listUserIdByDeptIds(CollUtil.toList(deptIdList))); + } + + /** + * 根据用户名获取用户列表 + * @param username 用户名 + * @return 用户列表 + */ + @GetMapping("/getUserListByUserName") + public R> getUserListByUserName(String username) { + return R.ok(userService.list(Wrappers.lambdaQuery().like(SysUser::getUsername, username))); + } + +} diff --git a/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/handler/AbstractLoginHandler.java b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/handler/AbstractLoginHandler.java new file mode 100644 index 0000000..e122eed --- /dev/null +++ b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/handler/AbstractLoginHandler.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.admin.handler; + +import com.pig4cloud.pigx.admin.api.dto.UserInfo; + +/** + * @author lengleng + * @date 2018/11/18 + */ +public abstract class AbstractLoginHandler implements LoginHandler { + + /*** + * 数据合法性校验 + * @param loginStr 通过用户传入获取唯一标识 + * @return 默认不校验 + */ + @Override + public Boolean check(String loginStr) { + return true; + } + + /** + * 处理方法 + * @param loginStr 登录参数 + * @return + */ + @Override + public UserInfo handle(String loginStr) { + if (!check(loginStr)) { + return null; + } + + String identify = identify(loginStr); + return info(identify); + } + +} diff --git a/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/handler/CasLoginHandler.java b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/handler/CasLoginHandler.java new file mode 100644 index 0000000..a67c20e --- /dev/null +++ b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/handler/CasLoginHandler.java @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.admin.handler; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.pig4cloud.pigx.admin.api.dto.UserInfo; +import com.pig4cloud.pigx.admin.api.entity.SysSocialDetails; +import com.pig4cloud.pigx.admin.api.entity.SysUser; +import com.pig4cloud.pigx.admin.mapper.SysSocialDetailsMapper; +import com.pig4cloud.pigx.admin.service.SysUserService; +import com.pig4cloud.pigx.common.core.constant.enums.LoginTypeEnum; +import lombok.AllArgsConstructor; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.jasig.cas.client.validation.Assertion; +import org.jasig.cas.client.validation.Cas30ProxyTicketValidator; +import org.springframework.stereotype.Component; + +/** + * @author lengleng + * @date 2018/11/18 + */ +@Slf4j +@Component("CAS") +@AllArgsConstructor +public class CasLoginHandler extends AbstractLoginHandler { + + private final SysSocialDetailsMapper sysSocialDetailsMapper; + + private final SysUserService sysUserService; + + /** + * cas 回到的ticket + *

+ * 通过ticket 调用CAS获取唯一标识 + * @param ticket + * @return + */ + @Override + @SneakyThrows + public String identify(String ticket) { + SysSocialDetails condition = new SysSocialDetails(); + condition.setType(LoginTypeEnum.CAS.getType()); + SysSocialDetails socialDetails = sysSocialDetailsMapper.selectOne(new QueryWrapper<>(condition)); + // remark 字段填写 CAS 服务器的URL + Cas30ProxyTicketValidator cas30ProxyTicketValidator = new Cas30ProxyTicketValidator(socialDetails.getRemark()); + Assertion validate = cas30ProxyTicketValidator.validate(ticket, socialDetails.getRedirectUrl()); + return validate.getPrincipal().getName(); + } + + /** + * username 获取用户信息 + * @param username + * @return + */ + @Override + public UserInfo info(String username) { + SysUser user = sysUserService.getOne(Wrappers.query().lambda().eq(SysUser::getUsername, username)); + + if (user == null) { + log.info("CAS 不存在用户:{}", username); + return null; + } + return sysUserService.findUserInfo(user); + } + +} diff --git a/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/handler/GiteeLoginHandler.java b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/handler/GiteeLoginHandler.java new file mode 100644 index 0000000..76b1a94 --- /dev/null +++ b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/handler/GiteeLoginHandler.java @@ -0,0 +1,112 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.admin.handler; + +import cn.hutool.core.util.URLUtil; +import cn.hutool.http.HttpUtil; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.pig4cloud.pigx.admin.api.dto.UserInfo; +import com.pig4cloud.pigx.admin.api.entity.SysSocialDetails; +import com.pig4cloud.pigx.admin.api.entity.SysUser; +import com.pig4cloud.pigx.admin.mapper.SysSocialDetailsMapper; +import com.pig4cloud.pigx.admin.service.SysUserService; +import com.pig4cloud.pigx.common.core.constant.SecurityConstants; +import com.pig4cloud.pigx.common.core.constant.enums.LoginTypeEnum; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.HashMap; + +/** + * @author lengleng + * @date 2019/4/8 + *

+ * 码云登录 + */ +@Slf4j +@Component("GITEE") +@AllArgsConstructor +public class GiteeLoginHandler extends AbstractLoginHandler { + + private final SysSocialDetailsMapper sysSocialDetailsMapper; + + private final SysUserService sysUserService; + + /** + * 码云登录传入code + *

+ * 通过code 调用qq 获取唯一标识 + * @param code + * @return + */ + @Override + public String identify(String code) { + SysSocialDetails condition = new SysSocialDetails(); + condition.setType(LoginTypeEnum.GITEE.getType()); + SysSocialDetails socialDetails = sysSocialDetailsMapper.selectOne(new QueryWrapper<>(condition)); + + String url = String.format(SecurityConstants.GITEE_AUTHORIZATION_CODE_URL, code, socialDetails.getAppId(), + URLUtil.encode(socialDetails.getRedirectUrl()), socialDetails.getAppSecret()); + String result = HttpUtil.post(url, new HashMap<>(0)); + log.debug("码云响应报文:{}", result); + + String accessToken = JSONUtil.parseObj(result).getStr("access_token"); + String userUrl = String.format(SecurityConstants.GITEE_USER_INFO_URL, accessToken); + String resp = HttpUtil.get(userUrl); + log.debug("码云获取个人信息返回报文{}", resp); + + JSONObject userInfo = JSONUtil.parseObj(resp); + // 码云唯一标识 + return userInfo.getStr("login"); + } + + /** + * identify 获取用户信息 + * @param identify identify + * @return + */ + @Override + public UserInfo info(String identify) { + + SysUser user = sysUserService.getOne(Wrappers.query().lambda().eq(SysUser::getGiteeLogin, identify)); + + if (user == null) { + log.info("码云未绑定:{}", identify); + return null; + } + return sysUserService.findUserInfo(user); + } + + /** + * 绑定逻辑 + * @param user 用户实体 + * @param identify 渠道返回唯一标识 + * @return + */ + @Override + public Boolean bind(SysUser user, String identify) { + user.setGiteeLogin(identify); + sysUserService.updateById(user); + return true; + } + +} diff --git a/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/handler/LoginHandler.java b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/handler/LoginHandler.java new file mode 100644 index 0000000..eea4e8d --- /dev/null +++ b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/handler/LoginHandler.java @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.admin.handler; + +import com.pig4cloud.pigx.admin.api.dto.UserInfo; +import com.pig4cloud.pigx.admin.api.entity.SysUser; + +/** + * @author lengleng + * @date 2018/11/18 + *

+ * 登录处理器 + */ +public interface LoginHandler { + + /*** + * 数据合法性校验 + * @param loginStr 通过用户传入获取唯一标识 + * @return + */ + Boolean check(String loginStr); + + /** + * 通过用户传入获取唯一标识 + * @param loginStr + * @return + */ + String identify(String loginStr); + + /** + * 通过openId 获取用户信息 + * @param identify + * @return + */ + UserInfo info(String identify); + + /** + * 处理方法 + * @param loginStr 登录参数 + * @return + */ + UserInfo handle(String loginStr); + + /** + * 绑定逻辑 + * @param user 用户实体 + * @param identify 渠道返回唯一标识 + * @return + */ + default Boolean bind(SysUser user, String identify) { + return false; + } + +} diff --git a/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/handler/MiniAppLoginHandler.java b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/handler/MiniAppLoginHandler.java new file mode 100644 index 0000000..085bb1b --- /dev/null +++ b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/handler/MiniAppLoginHandler.java @@ -0,0 +1,101 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.admin.handler; + +import cn.hutool.http.HttpUtil; +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.pig4cloud.pigx.admin.api.dto.UserInfo; +import com.pig4cloud.pigx.admin.api.entity.SysSocialDetails; +import com.pig4cloud.pigx.admin.api.entity.SysUser; +import com.pig4cloud.pigx.admin.mapper.SysSocialDetailsMapper; +import com.pig4cloud.pigx.admin.service.SysUserService; +import com.pig4cloud.pigx.common.core.constant.SecurityConstants; +import com.pig4cloud.pigx.common.core.constant.enums.LoginTypeEnum; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +/** + * @author lengleng + * @date 2019年11月02日 + *

+ * 微信小程序 + */ +@Slf4j +@Component("MINI") +@AllArgsConstructor +public class MiniAppLoginHandler extends AbstractLoginHandler { + + private final SysUserService sysUserService; + + private final SysSocialDetailsMapper sysSocialDetailsMapper; + + /** + * 小程序登录传入code + *

+ * 通过code 调用qq 获取唯一标识 + * @param code + * @return + */ + @Override + public String identify(String code) { + SysSocialDetails condition = new SysSocialDetails(); + condition.setType(LoginTypeEnum.MINI_APP.getType()); + SysSocialDetails socialDetails = sysSocialDetailsMapper.selectOne(new QueryWrapper<>(condition)); + + String url = String.format(SecurityConstants.MINI_APP_AUTHORIZATION_CODE_URL, socialDetails.getAppId(), + socialDetails.getAppSecret(), code); + String result = HttpUtil.get(url); + log.debug("微信小程序响应报文:{}", result); + + Object obj = JSONUtil.parseObj(result).get("openid"); + return obj.toString(); + } + + /** + * openId 获取用户信息 + * @param openId + * @return + */ + @Override + public UserInfo info(String openId) { + SysUser user = sysUserService.getOne(Wrappers.query().lambda().eq(SysUser::getMiniOpenid, openId)); + + if (user == null) { + log.info("微信小程序未绑定:{}", openId); + return null; + } + return sysUserService.findUserInfo(user); + } + + /** + * 绑定逻辑 + * @param user 用户实体 + * @param identify 渠道返回唯一标识 + * @return + */ + @Override + public Boolean bind(SysUser user, String identify) { + user.setMiniOpenid(identify); + sysUserService.updateById(user); + return true; + } + +} diff --git a/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/handler/OscChinaLoginHandler.java b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/handler/OscChinaLoginHandler.java new file mode 100644 index 0000000..d31bc0c --- /dev/null +++ b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/handler/OscChinaLoginHandler.java @@ -0,0 +1,121 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.admin.handler; + +import cn.hutool.http.HttpUtil; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.pig4cloud.pigx.admin.api.dto.UserInfo; +import com.pig4cloud.pigx.admin.api.entity.SysSocialDetails; +import com.pig4cloud.pigx.admin.api.entity.SysUser; +import com.pig4cloud.pigx.admin.mapper.SysSocialDetailsMapper; +import com.pig4cloud.pigx.admin.service.SysUserService; +import com.pig4cloud.pigx.common.core.constant.SecurityConstants; +import com.pig4cloud.pigx.common.core.constant.enums.LoginTypeEnum; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author lengleng + * @date 2019/4/8 + *

+ * 开源中国登录 + */ +@Slf4j +@Component("OSC") +@AllArgsConstructor +public class OscChinaLoginHandler extends AbstractLoginHandler { + + private final SysSocialDetailsMapper sysSocialDetailsMapper; + + private final SysUserService sysUserService; + + /** + * 开源中国传入code + *

+ * 通过code 调用qq 获取唯一标识 + * @param code + * @return + */ + @Override + public String identify(String code) { + SysSocialDetails condition = new SysSocialDetails(); + condition.setType(LoginTypeEnum.OSC.getType()); + SysSocialDetails socialDetails = sysSocialDetailsMapper.selectOne(new QueryWrapper<>(condition)); + + Map params = new HashMap<>(8); + + params.put("client_id", socialDetails.getAppId()); + params.put("client_secret", socialDetails.getAppSecret()); + params.put("grant_type", "authorization_code"); + params.put("redirect_uri", socialDetails.getRedirectUrl()); + params.put("code", code); + params.put("dataType", "json"); + + String result = HttpUtil.post(SecurityConstants.OSC_AUTHORIZATION_CODE_URL, params); + log.debug("开源中国响应报文:{}", result); + + String accessToken = JSONUtil.parseObj(result).getStr("access_token"); + + String url = String.format(SecurityConstants.OSC_USER_INFO_URL, accessToken); + String resp = HttpUtil.get(url); + log.debug("开源中国获取个人信息返回报文{}", resp); + + JSONObject userInfo = JSONUtil.parseObj(resp); + // 开源中国唯一标识 + String id = userInfo.getStr("id"); + return id; + } + + /** + * identify 获取用户信息 + * @param identify 开源中国表示 + * @return + */ + @Override + public UserInfo info(String identify) { + + SysUser user = sysUserService.getOne(Wrappers.query().lambda().eq(SysUser::getOscId, identify)); + + if (user == null) { + log.info("开源中国未绑定:{}", identify); + return null; + } + return sysUserService.findUserInfo(user); + } + + /** + * 绑定逻辑 + * @param user 用户实体 + * @param identify 渠道返回唯一标识 + * @return + */ + @Override + public Boolean bind(SysUser user, String identify) { + user.setOscId(identify); + sysUserService.updateById(user); + return true; + } + +} diff --git a/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/handler/SmsLoginHandler.java b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/handler/SmsLoginHandler.java new file mode 100644 index 0000000..75a499c --- /dev/null +++ b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/handler/SmsLoginHandler.java @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.admin.handler; + +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.pig4cloud.pigx.admin.api.dto.UserInfo; +import com.pig4cloud.pigx.admin.api.entity.SysUser; +import com.pig4cloud.pigx.admin.service.SysUserService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +/** + * @author lengleng + * @date 2018/11/18 + */ +@Slf4j +@Component("SMS") +@AllArgsConstructor +public class SmsLoginHandler extends AbstractLoginHandler { + + private final SysUserService sysUserService; + + /** + * 验证码登录传入为手机号 不用不处理 + * @param mobile + * @return + */ + @Override + public String identify(String mobile) { + return mobile; + } + + /** + * 通过mobile 获取用户信息 + * @param identify + * @return + */ + @Override + public UserInfo info(String identify) { + SysUser user = sysUserService.getOne(Wrappers.query().lambda().eq(SysUser::getPhone, identify)); + + if (user == null) { + log.info("手机号未注册:{}", identify); + return null; + } + return sysUserService.findUserInfo(user); + } + + /** + * 绑定逻辑 + * @param user 用户实体 + * @param identify 渠道返回唯一标识 + * @return + */ + @Override + public Boolean bind(SysUser user, String identify) { + user.setPhone(identify); + sysUserService.updateById(user); + return true; + } + +} diff --git a/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/handler/TencentLoginHandler.java b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/handler/TencentLoginHandler.java new file mode 100644 index 0000000..6ed5bf6 --- /dev/null +++ b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/handler/TencentLoginHandler.java @@ -0,0 +1,107 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.admin.handler; + +import cn.hutool.http.HttpUtil; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.pig4cloud.pigx.admin.api.dto.UserInfo; +import com.pig4cloud.pigx.admin.api.entity.SysSocialDetails; +import com.pig4cloud.pigx.admin.api.entity.SysUser; +import com.pig4cloud.pigx.admin.mapper.SysSocialDetailsMapper; +import com.pig4cloud.pigx.admin.service.SysUserService; +import com.pig4cloud.pigx.common.core.constant.SecurityConstants; +import com.pig4cloud.pigx.common.core.constant.enums.LoginTypeEnum; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +/** + * @author lengleng + * @date 2018/11/18 + */ +@Slf4j +@Component("QQ") +@AllArgsConstructor +public class TencentLoginHandler extends AbstractLoginHandler { + + private final SysUserService sysUserService; + + private final SysSocialDetailsMapper sysSocialDetailsMapper; + + /** + * QQ登录传入code + *

+ * 通过code 调用qq 获取唯一标识 + * @param code + * @return + */ + @Override + public String identify(String code) { + SysSocialDetails condition = new SysSocialDetails(); + condition.setType(LoginTypeEnum.QQ.getType()); + SysSocialDetails socialDetails = sysSocialDetailsMapper.selectOne(new QueryWrapper<>(condition)); + + String url = String.format(SecurityConstants.QQ_AUTHORIZATION_CODE_URL, socialDetails.getAppId(), + socialDetails.getAppSecret(), code); + String result = HttpUtil.get(url); + log.debug("QQ响应报文:{}", result); + + String accessToken = JSONUtil.parseObj(result).getStr("access_token"); + String userUrl = String.format(SecurityConstants.QQ_USER_INFO_URL, accessToken); + String resp = HttpUtil.get(userUrl); + log.debug("QQ获取个人信息返回报文{}", resp); + + JSONObject userInfo = JSONUtil.parseObj(resp); + // QQ唯一标识 + String openid = userInfo.getStr("openid"); + return openid; + } + + /** + * openId 获取用户信息 + * @param openId + * @return + */ + @Override + public UserInfo info(String openId) { + SysUser user = sysUserService.getOne(Wrappers.query().lambda().eq(SysUser::getQqOpenid, openId)); + + if (user == null) { + log.info("QQ未绑定:{}", openId); + return null; + } + return sysUserService.findUserInfo(user); + } + + /** + * 绑定逻辑 + * @param user 用户实体 + * @param identify 渠道返回唯一标识 + * @return + */ + @Override + public Boolean bind(SysUser user, String identify) { + user.setQqOpenid(identify); + sysUserService.updateById(user); + return true; + } + +} diff --git a/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/handler/WeChatLoginHandler.java b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/handler/WeChatLoginHandler.java new file mode 100644 index 0000000..6b4ea46 --- /dev/null +++ b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/handler/WeChatLoginHandler.java @@ -0,0 +1,99 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.admin.handler; + +import cn.hutool.http.HttpUtil; +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.pig4cloud.pigx.admin.api.dto.UserInfo; +import com.pig4cloud.pigx.admin.api.entity.SysSocialDetails; +import com.pig4cloud.pigx.admin.api.entity.SysUser; +import com.pig4cloud.pigx.admin.mapper.SysSocialDetailsMapper; +import com.pig4cloud.pigx.admin.service.SysUserService; +import com.pig4cloud.pigx.common.core.constant.SecurityConstants; +import com.pig4cloud.pigx.common.core.constant.enums.LoginTypeEnum; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +/** + * @author lengleng + * @date 2018/11/18 + */ +@Slf4j +@Component("WX") +@AllArgsConstructor +public class WeChatLoginHandler extends AbstractLoginHandler { + + private final SysUserService sysUserService; + + private final SysSocialDetailsMapper sysSocialDetailsMapper; + + /** + * 微信登录传入code + *

+ * 通过code 调用qq 获取唯一标识 + * @param code + * @return + */ + @Override + public String identify(String code) { + SysSocialDetails condition = new SysSocialDetails(); + condition.setType(LoginTypeEnum.WECHAT.getType()); + SysSocialDetails socialDetails = sysSocialDetailsMapper.selectOne(new QueryWrapper<>(condition)); + + String url = String.format(SecurityConstants.WX_AUTHORIZATION_CODE_URL, socialDetails.getAppId(), + socialDetails.getAppSecret(), code); + String result = HttpUtil.get(url); + log.debug("微信响应报文:{}", result); + + Object obj = JSONUtil.parseObj(result).get("openid"); + return obj.toString(); + } + + /** + * openId 获取用户信息 + * @param openId + * @return + */ + @Override + public UserInfo info(String openId) { + SysUser user = sysUserService.getOne(Wrappers.query().lambda().eq(SysUser::getWxOpenid, openId)); + + if (user == null) { + log.info("微信未绑定:{}", openId); + return null; + } + return sysUserService.findUserInfo(user); + } + + /** + * 绑定逻辑 + * @param user 用户实体 + * @param identify 渠道返回唯一标识 + * @return + */ + @Override + public Boolean bind(SysUser user, String identify) { + user.setWxOpenid(identify); + sysUserService.updateById(user); + return true; + } + +} diff --git a/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/handler/WxCpLoginHandler.java b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/handler/WxCpLoginHandler.java new file mode 100644 index 0000000..f317997 --- /dev/null +++ b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/handler/WxCpLoginHandler.java @@ -0,0 +1,95 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.admin.handler; + +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.pig4cloud.pigx.admin.api.dto.UserInfo; +import com.pig4cloud.pigx.admin.api.entity.SysUser; +import com.pig4cloud.pigx.admin.service.ConnectService; +import com.pig4cloud.pigx.admin.service.SysUserService; +import lombok.AllArgsConstructor; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import me.chanjar.weixin.cp.api.WxCpService; +import me.chanjar.weixin.cp.api.impl.WxCpServiceImpl; +import me.chanjar.weixin.cp.bean.WxCpOauth2UserInfo; +import org.springframework.stereotype.Component; + +/** + * @author lengleng + * @date 2022/7/19 + * + * 企业微信免密登录 + */ +@Slf4j +@Component("WEIXIN_CP") +@AllArgsConstructor +public class WxCpLoginHandler extends AbstractLoginHandler { + + private ConnectService connectService; + + private final SysUserService sysUserService; + + /** + * 微信登录传入code + *

+ * 通过code 调用qq 获取唯一标识 + * @param code + * @return + */ + @Override + @SneakyThrows + public String identify(String code) { + WxCpService wxCpService = new WxCpServiceImpl(); + wxCpService.setWxCpConfigStorage(connectService.getCpConfig()); + + WxCpOauth2UserInfo userInfo = wxCpService.getOauth2Service().getUserInfo(code); + log.info("企业微信返回报文:{}", userInfo); + return userInfo.getUserId(); + } + + /** + * openId 获取用户信息 + * @param openId + * @return + */ + @Override + public UserInfo info(String openId) { + SysUser user = sysUserService.getOne(Wrappers.query().lambda().eq(SysUser::getWxOpenid, openId)); + + if (user == null) { + log.info("企业微信未绑定:{}", openId); + return null; + } + return sysUserService.findUserInfo(user); + } + + /** + * 绑定逻辑 + * @param user 用户实体 + * @param identify 渠道返回唯一标识 + * @return + */ + @Override + public Boolean bind(SysUser user, String identify) { + user.setWxOpenid(identify); + sysUserService.updateById(user); + return true; + } + +} diff --git a/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/mapper/SysAuditLogMapper.java b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/mapper/SysAuditLogMapper.java new file mode 100644 index 0000000..128401c --- /dev/null +++ b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/mapper/SysAuditLogMapper.java @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.admin.mapper; + +import com.pig4cloud.pigx.admin.api.entity.SysAuditLog; +import com.pig4cloud.pigx.common.data.datascope.PigxBaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + * 审计记录表 + * + * @author PIG + * @date 2023-02-28 20:12:23 + */ +@Mapper +public interface SysAuditLogMapper extends PigxBaseMapper { + +} diff --git a/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/mapper/SysDeptMapper.java b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/mapper/SysDeptMapper.java new file mode 100644 index 0000000..13d4b85 --- /dev/null +++ b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/mapper/SysDeptMapper.java @@ -0,0 +1,37 @@ +/* + * + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + * + */ + +package com.pig4cloud.pigx.admin.mapper; + +import com.pig4cloud.pigx.admin.api.entity.SysDept; +import com.pig4cloud.pigx.common.data.datascope.PigxBaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + *

+ * 部门管理 Mapper 接口 + *

+ * + * @author lengleng + * @since 2018-01-20 + */ +@Mapper +public interface SysDeptMapper extends PigxBaseMapper { + +} diff --git a/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/mapper/SysDictItemMapper.java b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/mapper/SysDictItemMapper.java new file mode 100644 index 0000000..471e93e --- /dev/null +++ b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/mapper/SysDictItemMapper.java @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ +package com.pig4cloud.pigx.admin.mapper; + +import com.pig4cloud.pigx.admin.api.entity.SysDictItem; +import com.pig4cloud.pigx.common.data.datascope.PigxBaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + * 字典项 + * + * @author lengleng + * @date 2019/03/19 + */ +@Mapper +public interface SysDictItemMapper extends PigxBaseMapper { + +} diff --git a/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/mapper/SysDictMapper.java b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/mapper/SysDictMapper.java new file mode 100644 index 0000000..ae61717 --- /dev/null +++ b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/mapper/SysDictMapper.java @@ -0,0 +1,37 @@ +/* + * + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + * + */ + +package com.pig4cloud.pigx.admin.mapper; + +import com.pig4cloud.pigx.admin.api.entity.SysDict; +import com.pig4cloud.pigx.common.data.datascope.PigxBaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + *

+ * 字典表 Mapper 接口 + *

+ * + * @author lengleng + * @since 2017-11-19 + */ +@Mapper +public interface SysDictMapper extends PigxBaseMapper { + +} diff --git a/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/mapper/SysFileGroupMapper.java b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/mapper/SysFileGroupMapper.java new file mode 100644 index 0000000..5f0e332 --- /dev/null +++ b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/mapper/SysFileGroupMapper.java @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.admin.mapper; + +import com.pig4cloud.pigx.admin.api.entity.SysFileGroup; +import com.pig4cloud.pigx.common.data.datascope.PigxBaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + * 文件分组管理 + * + * @author lbw + * @date 2023年07月25日21:31:48 + */ +@Mapper +public interface SysFileGroupMapper extends PigxBaseMapper { + +} diff --git a/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/mapper/SysFileMapper.java b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/mapper/SysFileMapper.java new file mode 100644 index 0000000..5f63cac --- /dev/null +++ b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/mapper/SysFileMapper.java @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.admin.mapper; + +import com.pig4cloud.pigx.admin.api.entity.SysFile; +import com.pig4cloud.pigx.common.data.datascope.PigxBaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + * 文件管理 + * + * @author Luckly + * @date 2019-06-18 17:18:42 + */ +@Mapper +public interface SysFileMapper extends PigxBaseMapper { + +} diff --git a/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/mapper/SysI18nMapper.java b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/mapper/SysI18nMapper.java new file mode 100644 index 0000000..fec691e --- /dev/null +++ b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/mapper/SysI18nMapper.java @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.admin.mapper; + +import com.pig4cloud.pigx.admin.api.entity.SysI18nEntity; +import com.pig4cloud.pigx.common.data.datascope.PigxBaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + * 系统表-国际化 + * + * @author PIG + * @date 2023-02-14 09:07:01 + */ +@Mapper +public interface SysI18nMapper extends PigxBaseMapper { + +} diff --git a/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/mapper/SysLogMapper.java b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/mapper/SysLogMapper.java new file mode 100644 index 0000000..b8daf97 --- /dev/null +++ b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/mapper/SysLogMapper.java @@ -0,0 +1,37 @@ +/* + * + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + * + */ + +package com.pig4cloud.pigx.admin.mapper; + +import com.pig4cloud.pigx.admin.api.entity.SysLog; +import com.pig4cloud.pigx.common.data.datascope.PigxBaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + *

+ * 日志表 Mapper 接口 + *

+ * + * @author lengleng + * @since 2017-11-20 + */ +@Mapper +public interface SysLogMapper extends PigxBaseMapper { + +} diff --git a/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/mapper/SysMenuMapper.java b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/mapper/SysMenuMapper.java new file mode 100644 index 0000000..f43ffa0 --- /dev/null +++ b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/mapper/SysMenuMapper.java @@ -0,0 +1,53 @@ +/* + * + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + * + */ + +package com.pig4cloud.pigx.admin.mapper; + +import com.pig4cloud.pigx.admin.api.entity.SysMenu; +import com.pig4cloud.pigx.common.data.datascope.PigxBaseMapper; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + *

+ * 菜单权限表 Mapper 接口 + *

+ * + * @author lengleng + * @since 2017-10-29 + */ +@Mapper +public interface SysMenuMapper extends PigxBaseMapper { + + /** + * 通过角色编号查询菜单 + * @param roleId 角色ID + * @return + */ + List listMenusByRoleId(Long roleId); + + /** + * 通过角色ID查询权限 + * @param roleIds Ids + * @return + */ + List listPermissionsByRoleIds(String roleIds); + +} diff --git a/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/mapper/SysOauthClientDetailsMapper.java b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/mapper/SysOauthClientDetailsMapper.java new file mode 100644 index 0000000..4ae5415 --- /dev/null +++ b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/mapper/SysOauthClientDetailsMapper.java @@ -0,0 +1,37 @@ +/* + * + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + * + */ + +package com.pig4cloud.pigx.admin.mapper; + +import com.pig4cloud.pigx.admin.api.entity.SysOauthClientDetails; +import com.pig4cloud.pigx.common.data.datascope.PigxBaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + *

+ * Mapper 接口 + *

+ * + * @author lengleng + * @since 2018-05-15 + */ +@Mapper +public interface SysOauthClientDetailsMapper extends PigxBaseMapper { + +} diff --git a/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/mapper/SysPostMapper.java b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/mapper/SysPostMapper.java new file mode 100644 index 0000000..da06556 --- /dev/null +++ b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/mapper/SysPostMapper.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.admin.mapper; + +import com.pig4cloud.pigx.admin.api.entity.SysPost; +import com.pig4cloud.pigx.common.data.datascope.PigxBaseMapper; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * 岗位信息表 + * + * @author fxz + * @date 2022-03-26 12:50:43 + */ +@Mapper +public interface SysPostMapper extends PigxBaseMapper { + + /** + * 通过用户ID,查询岗位信息 + * @param userId 用户id + * @return 岗位信息 + */ + List listPostsByUserId(Long userId); + +} diff --git a/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/mapper/SysPublicParamMapper.java b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/mapper/SysPublicParamMapper.java new file mode 100644 index 0000000..61f3f3e --- /dev/null +++ b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/mapper/SysPublicParamMapper.java @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ +package com.pig4cloud.pigx.admin.mapper; + +import com.pig4cloud.pigx.admin.api.entity.SysPublicParam; +import com.pig4cloud.pigx.common.data.datascope.PigxBaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + * 公共参数配置 + * + * @author Lucky + * @date 2019-04-29 + */ +@Mapper +public interface SysPublicParamMapper extends PigxBaseMapper { + +} diff --git a/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/mapper/SysRoleMapper.java b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/mapper/SysRoleMapper.java new file mode 100644 index 0000000..9da6111 --- /dev/null +++ b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/mapper/SysRoleMapper.java @@ -0,0 +1,46 @@ +/* + * + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + * + */ + +package com.pig4cloud.pigx.admin.mapper; + +import com.pig4cloud.pigx.admin.api.entity.SysRole; +import com.pig4cloud.pigx.common.data.datascope.PigxBaseMapper; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + *

+ * Mapper 接口 + *

+ * + * @author lengleng + * @since 2017-10-29 + */ +@Mapper +public interface SysRoleMapper extends PigxBaseMapper { + + /** + * 通过用户ID,查询角色信息 + * @param userId + * @return + */ + List listRolesByUserId(Long userId); + +} diff --git a/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/mapper/SysRoleMenuMapper.java b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/mapper/SysRoleMenuMapper.java new file mode 100644 index 0000000..60f7a8a --- /dev/null +++ b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/mapper/SysRoleMenuMapper.java @@ -0,0 +1,37 @@ +/* + * + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + * + */ + +package com.pig4cloud.pigx.admin.mapper; + +import com.pig4cloud.pigx.admin.api.entity.SysRoleMenu; +import com.pig4cloud.pigx.common.data.datascope.PigxBaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + *

+ * 角色菜单表 Mapper 接口 + *

+ * + * @author lengleng + * @since 2017-10-29 + */ +@Mapper +public interface SysRoleMenuMapper extends PigxBaseMapper { + +} diff --git a/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/mapper/SysRouteConfMapper.java b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/mapper/SysRouteConfMapper.java new file mode 100644 index 0000000..ac6fd93 --- /dev/null +++ b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/mapper/SysRouteConfMapper.java @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.admin.mapper; + +import com.pig4cloud.pigx.admin.api.entity.SysRouteConf; +import com.pig4cloud.pigx.common.data.datascope.PigxBaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + * 路由 + * + * @author lengleng + * @date 2018-11-06 10:17:18 + */ +@Mapper +public interface SysRouteConfMapper extends PigxBaseMapper { + +} diff --git a/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/mapper/SysScheduleMapper.java b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/mapper/SysScheduleMapper.java new file mode 100644 index 0000000..d9f4e94 --- /dev/null +++ b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/mapper/SysScheduleMapper.java @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.admin.mapper; + +import com.pig4cloud.pigx.admin.api.entity.SysScheduleEntity; +import com.pig4cloud.pigx.common.data.datascope.PigxBaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + * 日程 + * + * @author aeizzz + * @date 2023-03-06 14:26:23 + */ +@Mapper +public interface SysScheduleMapper extends PigxBaseMapper { + +} \ No newline at end of file diff --git a/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/mapper/SysSocialDetailsMapper.java b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/mapper/SysSocialDetailsMapper.java new file mode 100644 index 0000000..adccc1b --- /dev/null +++ b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/mapper/SysSocialDetailsMapper.java @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.admin.mapper; + +import com.pig4cloud.pigx.admin.api.entity.SysSocialDetails; +import com.pig4cloud.pigx.common.data.datascope.PigxBaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + * 系统社交登录账号表 + * + * @author lengleng + * @date 2018-08-16 21:30:41 + */ +@Mapper +public interface SysSocialDetailsMapper extends PigxBaseMapper { + +} diff --git a/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/mapper/SysTenantMapper.java b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/mapper/SysTenantMapper.java new file mode 100644 index 0000000..7502096 --- /dev/null +++ b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/mapper/SysTenantMapper.java @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.admin.mapper; + +import com.pig4cloud.pigx.admin.api.entity.SysTenant; +import com.pig4cloud.pigx.common.data.datascope.PigxBaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + * 租户 + * + * @author lengleng + * @date 2019-05-15 15:55:41 + */ +@Mapper +public interface SysTenantMapper extends PigxBaseMapper { + +} diff --git a/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/mapper/SysUserMapper.java b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/mapper/SysUserMapper.java new file mode 100644 index 0000000..07dc0a1 --- /dev/null +++ b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/mapper/SysUserMapper.java @@ -0,0 +1,76 @@ +/* + * + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + * + */ + +package com.pig4cloud.pigx.admin.mapper; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.pig4cloud.pigx.admin.api.dto.UserDTO; +import com.pig4cloud.pigx.admin.api.entity.SysUser; +import com.pig4cloud.pigx.admin.api.vo.UserVO; +import com.pig4cloud.pigx.common.data.datascope.DataScope; +import com.pig4cloud.pigx.common.data.datascope.PigxBaseMapper; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 用户表 Mapper 接口 + *

+ * + * @author lengleng + * @since 2017-10-29 + */ +@Mapper +public interface SysUserMapper extends PigxBaseMapper { + + /** + * 通过用户名查询用户信息(含有角色信息) + * @param username 用户名 + * @return userVo + */ + UserVO getUserVoByUsername(String username); + + /** + * 分页查询用户信息(含角色) + * @param page 分页 + * @param userDTO 查询参数 + * @param dataScope + * @return list + */ + IPage getUserVosPage(Page page, @Param("query") UserDTO userDTO, DataScope dataScope); + + /** + * 通过ID查询用户信息 + * @param id 用户ID + * @return userVo + */ + UserVO getUserVoById(Long id); + + /** + * 查询用户列表 + * @param userDTO 查询条件 + * @param dataScope 数据权限声明 + * @return + */ + List selectVoListByScope(@Param("query") UserDTO userDTO, @Param("ids") Long[] ids, DataScope dataScope); + +} diff --git a/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/mapper/SysUserPostMapper.java b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/mapper/SysUserPostMapper.java new file mode 100644 index 0000000..427c767 --- /dev/null +++ b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/mapper/SysUserPostMapper.java @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.pig4cloud.pigx.admin.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.pig4cloud.pigx.admin.api.entity.SysUserPost; +import org.apache.ibatis.annotations.Mapper; + +/** + *

+ * 用户岗位 Mapper 接口 + *

+ * + * @author fxz + * @since 2022/3/19 + */ +@Mapper +public interface SysUserPostMapper extends BaseMapper { + +} diff --git a/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/mapper/SysUserRoleMapper.java b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/mapper/SysUserRoleMapper.java new file mode 100644 index 0000000..55828a9 --- /dev/null +++ b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/mapper/SysUserRoleMapper.java @@ -0,0 +1,37 @@ +/* + * + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + * + */ + +package com.pig4cloud.pigx.admin.mapper; + +import com.pig4cloud.pigx.admin.api.entity.SysUserRole; +import com.pig4cloud.pigx.common.data.datascope.PigxBaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + *

+ * 用户角色表 Mapper 接口 + *

+ * + * @author lengleng + * @since 2017-10-29 + */ +@Mapper +public interface SysUserRoleMapper extends PigxBaseMapper { + +} diff --git a/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/ConnectService.java b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/ConnectService.java new file mode 100644 index 0000000..7b095ef --- /dev/null +++ b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/ConnectService.java @@ -0,0 +1,38 @@ +package com.pig4cloud.pigx.admin.service; + +import com.pig4cloud.pigx.common.core.util.R; +import me.chanjar.weixin.cp.config.impl.WxCpDefaultConfigImpl; + +/** + * @author lengleng + * @date 2022/4/22 + *

+ * 互联平台 + */ +public interface ConnectService { + + /** + * 同步钉钉部门 + */ + Boolean syncDingDept(); + + /** + * 同步钉钉用户 + */ + R syncDingUser(Long deptId); + + /** + * 同步企微部门 + * @return + */ + R syncCpDept(); + + /** + * 同步企微用户 + * @return + */ + R syncCpUser(); + + WxCpDefaultConfigImpl getCpConfig(); + +} diff --git a/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/MobileService.java b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/MobileService.java new file mode 100644 index 0000000..3245ea5 --- /dev/null +++ b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/MobileService.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.admin.service; + +import com.pig4cloud.pigx.common.core.util.R; + +/** + * @author lengleng + * @date 2018/11/14 + */ +public interface MobileService { + + /** + * 发送手机验证码 + * @param mobile mobile + * @return code + */ + R sendSmsCode(String mobile); + +} diff --git a/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysAuditLogService.java b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysAuditLogService.java new file mode 100644 index 0000000..042e1bb --- /dev/null +++ b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysAuditLogService.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.admin.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.pig4cloud.pigx.admin.api.entity.SysAuditLog; + +/** + * 审计记录表 + * + * @author PIG + * @date 2023-02-28 20:12:23 + */ +public interface SysAuditLogService extends IService { + + /** + * 分页查询审计日志(数据权限处理) + * @param page 分页条件 + * @param sysAuditLog 查询条件 + * @return page + */ + Page getAuditsByScope(Page page, SysAuditLog sysAuditLog); + +} diff --git a/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysDeptService.java b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysDeptService.java new file mode 100644 index 0000000..954e982 --- /dev/null +++ b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysDeptService.java @@ -0,0 +1,73 @@ +/* + * + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + * + */ + +package com.pig4cloud.pigx.admin.service; + +import cn.hutool.core.lang.tree.Tree; +import com.baomidou.mybatisplus.extension.service.IService; +import com.pig4cloud.pigx.admin.api.entity.SysDept; +import com.pig4cloud.pigx.admin.api.vo.DeptExcelVo; +import com.pig4cloud.pigx.common.core.util.R; +import org.springframework.validation.BindingResult; + +import java.util.List; + +/** + *

+ * 部门管理 服务类 + *

+ * + * @author lengleng + * @since 2018-01-20 + */ +public interface SysDeptService extends IService { + + /** + * 查询部门树菜单 + * @param deptName 部门名称 + * @return 树 + */ + List> selectTree(String deptName, Long parentId); + + /** + * 删除部门 + * @param id 部门 ID + * @return 成功、失败 + */ + Boolean removeDeptById(Long id); + + List listExcelVo(); + + R importDept(List excelVOList, BindingResult bindingResult); + + /** + * 获取部门的所有后代部门列表 + * @param deptId 部门ID + * @return 后代部门列表 + */ + List listDescendant(Long deptId); + + /** + * 获取部门负责人 + * @param deptId deptId + * @return user id list + */ + List listDeptLeader(Long deptId); + +} diff --git a/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysDictItemService.java b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysDictItemService.java new file mode 100644 index 0000000..75452b0 --- /dev/null +++ b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysDictItemService.java @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ +package com.pig4cloud.pigx.admin.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.pig4cloud.pigx.admin.api.entity.SysDictItem; +import com.pig4cloud.pigx.common.core.util.R; + +/** + * 字典项 + * + * @author lengleng + * @date 2019/03/19 + */ +public interface SysDictItemService extends IService { + + /** + * 删除字典项 + * @param id 字典项ID + * @return + */ + R removeDictItem(Long id); + + /** + * 更新字典项 + * @param item 字典项 + * @return + */ + R updateDictItem(SysDictItem item); + +} diff --git a/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysDictService.java b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysDictService.java new file mode 100644 index 0000000..07c7c83 --- /dev/null +++ b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysDictService.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ +package com.pig4cloud.pigx.admin.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.pig4cloud.pigx.admin.api.entity.SysDict; +import com.pig4cloud.pigx.common.core.util.R; + +/** + * 字典表 + * + * @author lengleng + * @date 2019/03/19 + */ +public interface SysDictService extends IService { + + /** + * 根据ID 删除字典 + * @param ids ID列表 + * @return + */ + R removeDictByIds(Long[] ids); + + /** + * 更新字典 + * @param sysDict 字典 + * @return + */ + R updateDict(SysDict sysDict); + + /** + * 同步缓存 (清空缓存) + * @return R + */ + R syncDictCache(); + +} diff --git a/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysFileService.java b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysFileService.java new file mode 100644 index 0000000..3597f2b --- /dev/null +++ b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysFileService.java @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.admin.service; + +import cn.hutool.core.lang.tree.Tree; +import com.baomidou.mybatisplus.extension.service.IService; +import com.pig4cloud.pigx.admin.api.dto.SysFileGroupDTO; +import com.pig4cloud.pigx.admin.api.entity.SysFile; +import com.pig4cloud.pigx.admin.api.entity.SysFileGroup; +import com.pig4cloud.pigx.common.core.util.R; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * 文件管理 + * + * @author Luckly + * @date 2019-06-18 17:18:42 + */ +public interface SysFileService extends IService { + + /** + * 上传文件 + * @param file + * @param groupId + * @param type + * @return + */ + R uploadFile(MultipartFile file, Long groupId, String type); + + /** + * 读取文件 + * @param bucket 桶名称 + * @param fileName 文件名称 + * @param response 输出流 + */ + void getFile(String bucket, String fileName, HttpServletResponse response); + + /** + * 删除文件 + * @param id + * @return + */ + Boolean deleteFile(Long id); + + /** + * 查询文件组列表 + * @param fileGroup SysFileGroup对象,用于筛选条件 + * @return 包含文件组列表的Tree对象列表 + */ + List> listFileGroup(SysFileGroup fileGroup); + + /** + * 添加或更新文件组 + * @param fileGroup SysFileGroup对象,要添加或更新的文件组信息 + * @return 添加或更新成功返回true,否则返回false + */ + Boolean saveOrUpdateGroup(SysFileGroup fileGroup); + + /** + * 删除文件组 + * @param id 待删除文件组的ID + * @return 删除成功返回true,否则返回false + */ + Boolean deleteGroup(Long id); + + /** + * 移动文件组 + * @param fileGroupDTO SysFileGroupDTO对象,要移动的文件组信息 + * @return 移动成功返回true,否则返回false + */ + Boolean moveFileGroup(SysFileGroupDTO fileGroupDTO); + +} diff --git a/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysI18nService.java b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysI18nService.java new file mode 100644 index 0000000..7ec2b77 --- /dev/null +++ b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysI18nService.java @@ -0,0 +1,19 @@ +package com.pig4cloud.pigx.admin.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.pig4cloud.pigx.admin.api.entity.SysI18nEntity; +import com.pig4cloud.pigx.common.core.util.R; + +import java.util.Map; + +public interface SysI18nService extends IService { + + Map listMap(); + + /** + * 同步数据 + * @return R + */ + R syncI18nCache(); + +} diff --git a/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysLogService.java b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysLogService.java new file mode 100644 index 0000000..2009d69 --- /dev/null +++ b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysLogService.java @@ -0,0 +1,62 @@ +/* + * + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + * + */ + +package com.pig4cloud.pigx.admin.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.pig4cloud.pigx.admin.api.dto.SysLogDTO; +import com.pig4cloud.pigx.admin.api.entity.SysLog; +import com.pig4cloud.pigx.admin.api.vo.PreLogVO; + +import java.util.List; + +/** + *

+ * 日志表 服务类 + *

+ * + * @author lengleng + * @since 2017-11-20 + */ +public interface SysLogService extends IService { + + /** + * 批量插入前端错误日志 + * @param preLogVoList 日志信息 + * @return true/false + */ + Boolean saveBatchLogs(List preLogVoList); + + /** + * 分页查询日志 + * @param page + * @param sysLog + * @return + */ + Page getLogByPage(Page page, SysLogDTO sysLog); + + /** + * 插入日志 + * @param sysLog 日志对象 + * @return true/false + */ + Boolean saveLog(SysLogDTO sysLog); + +} diff --git a/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysMenuService.java b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysMenuService.java new file mode 100644 index 0000000..90b8b47 --- /dev/null +++ b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysMenuService.java @@ -0,0 +1,77 @@ +/* + * + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + * + */ + +package com.pig4cloud.pigx.admin.service; + +import cn.hutool.core.lang.tree.Tree; +import com.baomidou.mybatisplus.extension.service.IService; +import com.pig4cloud.pigx.admin.api.entity.SysMenu; +import com.pig4cloud.pigx.common.core.util.R; + +import java.util.List; +import java.util.Set; + +/** + *

+ * 菜单权限表 服务类 + *

+ * + * @author lengleng + * @since 2017-10-29 + */ +public interface SysMenuService extends IService { + + /** + * 通过角色编号查询URL 权限 + * @param roleId 角色ID + * @return 菜单列表 + */ + List findMenuByRoleId(Long roleId); + + /** + * 级联删除菜单 + * @param id 菜单ID + * @return 成功、失败 + */ + R removeMenuById(Long id); + + /** + * 更新菜单信息 + * @param sysMenu 菜单信息 + * @return 成功、失败 + */ + Boolean updateMenuById(SysMenu sysMenu); + + /** + * 构建树 + * @param parentId 父节点ID + * @param menuName 菜单名称 + * @return + */ + List> treeMenu(Long parentId, String menuName, String type); + + /** + * 查询菜单 + * @param voSet + * @param parentId + * @return + */ + List> filterMenu(Set voSet, String type, Long parentId); + +} diff --git a/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysOauthClientDetailsService.java b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysOauthClientDetailsService.java new file mode 100644 index 0000000..b9975b2 --- /dev/null +++ b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysOauthClientDetailsService.java @@ -0,0 +1,66 @@ +/* + * + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + * + */ + +package com.pig4cloud.pigx.admin.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.pig4cloud.pigx.admin.api.dto.SysOauthClientDetailsDTO; +import com.pig4cloud.pigx.admin.api.entity.SysOauthClientDetails; +import com.pig4cloud.pigx.common.core.util.R; + +/** + *

+ * 服务类 + *

+ * + * @author lengleng + * @since 2018-05-15 + */ +public interface SysOauthClientDetailsService extends IService { + + /** + * 根据客户端信息 + * @param clientDetailsDTO + * @return + */ + Boolean updateClientById(SysOauthClientDetailsDTO clientDetailsDTO); + + /** + * 添加客户端 + * @param clientDetailsDTO + * @return + */ + Boolean saveClient(SysOauthClientDetailsDTO clientDetailsDTO); + + /** + * 分页查询客户端信息 + * @param page + * @param query + * @return + */ + Page queryPage(Page page, SysOauthClientDetails query); + + /** + * 同步缓存 (清空缓存) + * @return R + */ + R syncClientCache(); + +} diff --git a/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysPostService.java b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysPostService.java new file mode 100644 index 0000000..2ca4957 --- /dev/null +++ b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysPostService.java @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.admin.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.pig4cloud.pigx.admin.api.entity.SysPost; +import com.pig4cloud.pigx.admin.api.vo.PostExcelVO; +import com.pig4cloud.pigx.common.core.util.R; +import org.springframework.validation.BindingResult; + +import java.util.List; + +/** + * 岗位信息表 + * + * @author fxz + * @date 2022-03-26 12:50:43 + */ +public interface SysPostService extends IService { + + /** + * 导出excel 表格 + * @return + */ + List listPost(SysPost post, Long[] ids); + + /** + * 导入岗位 + * @param excelVOList 岗位列表 + * @param bindingResult 错误信息列表 + * @return ok fail + */ + R importPost(List excelVOList, BindingResult bindingResult); + +} diff --git a/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysPublicParamService.java b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysPublicParamService.java new file mode 100644 index 0000000..b127da6 --- /dev/null +++ b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysPublicParamService.java @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.admin.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.pig4cloud.pigx.admin.api.entity.SysPublicParam; +import com.pig4cloud.pigx.common.core.util.R; + +import java.util.Map; + +/** + * 公共参数配置 + * + * @author Lucky + * @date 2019-04-29 + */ +public interface SysPublicParamService extends IService { + + /** + * 通过key查询公共参数指定值 + * @param publicKey + * @return + */ + String getSysPublicParamKeyToValue(String publicKey); + + /** + * 通过key查询公共参数指定值 + * @param keys 参数列表 + * @return Map + */ + Map getSysPublicParamsKeyToValue(String[] keys); + + /** + * 更新参数 + * @param sysPublicParam + * @return + */ + R updateParam(SysPublicParam sysPublicParam); + + /** + * 删除参数 + * @param publicIds 参数列表 + * @return + */ + R removeParamByIds(Long[] publicIds); + + /** + * 同步缓存 + * @return R + */ + R syncParamCache(); + +} diff --git a/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysRoleMenuService.java b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysRoleMenuService.java new file mode 100644 index 0000000..6ed0523 --- /dev/null +++ b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysRoleMenuService.java @@ -0,0 +1,43 @@ +/* + * + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + * + */ + +package com.pig4cloud.pigx.admin.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.pig4cloud.pigx.admin.api.entity.SysRoleMenu; + +/** + *

+ * 角色菜单表 服务类 + *

+ * + * @author lengleng + * @since 2017-10-29 + */ +public interface SysRoleMenuService extends IService { + + /** + * 更新角色菜单 + * @param roleId 角色ID + * @param menuIds 菜单ID拼成的字符串,每个id之间根据逗号分隔 + * @return + */ + Boolean saveRoleMenus(Long roleId, String menuIds); + +} diff --git a/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysRoleService.java b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysRoleService.java new file mode 100644 index 0000000..cb805f2 --- /dev/null +++ b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysRoleService.java @@ -0,0 +1,86 @@ +/* + * + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + * + */ + +package com.pig4cloud.pigx.admin.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.pig4cloud.pigx.admin.api.entity.SysRole; +import com.pig4cloud.pigx.admin.api.vo.RoleExcelVO; +import com.pig4cloud.pigx.admin.api.vo.RoleVO; +import com.pig4cloud.pigx.common.core.util.R; +import org.springframework.validation.BindingResult; + +import java.util.List; + +/** + *

+ * 服务类 + *

+ * + * @author lengleng + * @since 2017-10-29 + */ +public interface SysRoleService extends IService { + + /** + * 通过用户ID,查询角色信息 + * @param userId + * @return + */ + List findRolesByUserId(Long userId); + + /** + * 根据角色ID 查询角色列表 + * @param roleIdList 角色ID列表 + * @param key 缓存key + * @return + */ + List findRolesByRoleIds(List roleIdList, String key); + + /** + * 通过角色ID,删除角色 + * @param ids + * @return + */ + Boolean removeRoleByIds(Long[] ids); + + /** + * 根据角色菜单列表 + * @param roleVo 角色&菜单列表 + * @return + */ + Boolean updateRoleMenus(RoleVO roleVo); + + /** + * 导入角色 + * @param excelVOList 角色列表 + * @param bindingResult 错误信息列表 + * @return ok fail + */ + R importRole(List excelVOList, BindingResult bindingResult); + + /** + * 查询全部的角色 + * @param sysRole 查询条件 + * @param ids 导出ids + * @return list + */ + List listRole(SysRole sysRole, Long[] ids); + +} diff --git a/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysRouteConfService.java b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysRouteConfService.java new file mode 100644 index 0000000..68f1f09 --- /dev/null +++ b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysRouteConfService.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.admin.service; + +import cn.hutool.json.JSONArray; +import com.baomidou.mybatisplus.extension.service.IService; +import com.pig4cloud.pigx.admin.api.entity.SysRouteConf; +import reactor.core.publisher.Mono; + +/** + * 路由 + * + * @author lengleng + * @date 2018-11-06 10:17:18 + */ +public interface SysRouteConfService extends IService { + + /** + * 更新路由信息 + * @param routes 路由信息 + * @return + */ + Mono updateRoutes(JSONArray routes); + +} diff --git a/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysScheduleService.java b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysScheduleService.java new file mode 100644 index 0000000..e1c0c4a --- /dev/null +++ b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysScheduleService.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.admin.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.pig4cloud.pigx.admin.api.entity.SysScheduleEntity; + +import java.util.List; + +/** + * 日程 + * + * @author aeizzz + * @date 2023-03-06 14:26:23 + */ +public interface SysScheduleService extends IService { + + IPage getScheduleByScope(Page page, SysScheduleEntity sysSchedule); + + List selectListByScope(String month); + +} diff --git a/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysSocialDetailsService.java b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysSocialDetailsService.java new file mode 100644 index 0000000..a6df86e --- /dev/null +++ b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysSocialDetailsService.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.admin.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.pig4cloud.pigx.admin.api.dto.UserInfo; +import com.pig4cloud.pigx.admin.api.entity.SysSocialDetails; + +/** + * 系统社交登录账号表 + * + * @author lengleng + * @date 2018-08-16 21:30:41 + */ +public interface SysSocialDetailsService extends IService { + + /** + * 绑定社交账号 + * @param state 类型 + * @param code code + * @return + */ + Boolean bindSocial(String state, String code); + + /** + * 根据入参查询用户信息 + * @param inStr + * @return + */ + UserInfo getUserInfo(String inStr); + +} diff --git a/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysTenantService.java b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysTenantService.java new file mode 100644 index 0000000..f8d0e6d --- /dev/null +++ b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysTenantService.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.admin.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.pig4cloud.pigx.admin.api.entity.SysTenant; + +import java.util.List; + +/** + * 租户管理 + * + * @author lengleng + * @date 2019-05-15 15:55:41 + */ +public interface SysTenantService extends IService { + + /** + * 获取正常的租户 + * @return + */ + List getNormalTenant(); + + /** + * 保存租户 + * @param sysTenant + * @return + */ + Boolean saveTenant(SysTenant sysTenant); + + /** + * 修改租户 + * @param sysTenant + * @return + */ + Boolean updateTenant(SysTenant sysTenant); + +} diff --git a/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysUserRoleService.java b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysUserRoleService.java new file mode 100644 index 0000000..0c314a9 --- /dev/null +++ b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysUserRoleService.java @@ -0,0 +1,35 @@ +/* + * + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + * + */ + +package com.pig4cloud.pigx.admin.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.pig4cloud.pigx.admin.api.entity.SysUserRole; + +/** + *

+ * 用户角色表 服务类 + *

+ * + * @author lengleng + * @since 2017-10-29 + */ +public interface SysUserRoleService extends IService { + +} diff --git a/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysUserService.java b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysUserService.java new file mode 100644 index 0000000..5791c5c --- /dev/null +++ b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysUserService.java @@ -0,0 +1,148 @@ +/* + * + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + * + */ + +package com.pig4cloud.pigx.admin.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.pig4cloud.pigx.admin.api.dto.UserDTO; +import com.pig4cloud.pigx.admin.api.dto.UserInfo; +import com.pig4cloud.pigx.admin.api.entity.SysUser; +import com.pig4cloud.pigx.admin.api.vo.UserExcelVO; +import com.pig4cloud.pigx.admin.api.vo.UserVO; +import com.pig4cloud.pigx.common.core.util.R; +import org.springframework.validation.BindingResult; + +import java.util.List; + +/** + * @author lengleng + * @date 2017/10/31 + */ +public interface SysUserService extends IService { + + /** + * 查询用户信息 + * @param sysUser 用户 + * @return userInfo + */ + UserInfo findUserInfo(SysUser sysUser); + + /** + * 分页查询用户信息(含有角色信息) + * @param page 分页对象 + * @param userDTO 参数列表 + * @return + */ + IPage getUsersWithRolePage(Page page, UserDTO userDTO); + + /** + * 删除用户 + * @param ids 用户 + * @return boolean + */ + Boolean deleteUserByIds(Long[] ids); + + /** + * 更新当前用户基本信息 + * @param userDto 用户信息 + * @return Boolean + */ + R updateUserInfo(UserDTO userDto); + + /** + * 更新指定用户信息 + * @param userDto 用户信息 + * @return + */ + Boolean updateUser(UserDTO userDto); + + /** + * 通过ID查询用户信息 + * @param id 用户ID + * @return 用户信息 + */ + UserVO selectUserVoById(Long id); + + /** + * 查询上级部门的用户信息 + * @param username 用户名 + * @return R + */ + List listAncestorUsers(String username); + + /** + * 保存用户信息 + * @param userDto DTO 对象 + * @return success/fail + */ + Boolean saveUser(UserDTO userDto); + + /** + * 查询全部的用户 + * @param userDTO 查询条件 + * @param ids 目标列表 + * @return list + */ + List listUser(UserDTO userDTO, Long[] ids); + + /** + * excel 导入用户 + * @param excelVOList excel 列表数据 + * @param bindingResult 错误数据 + * @return ok fail + */ + R importUser(List excelVOList, BindingResult bindingResult); + + /** + * 注册用户 + * @param userDto 用户信息 + * @return success/false + */ + R registerUser(UserDTO userDto); + + /** + * 锁定用户 + * @param username + * @return + */ + R lockUser(String username); + + R changePassword(UserDTO userDto); + + R unbinding(String type); + + R checkPassword(String password); + + /** + * 根据角色ID列表获取用户ID列表接口 + * @param roleIdList 角色ID列表 + * @return List 返回结果对象,包含根据角色ID列表获取到的用户ID列表信息 + */ + List listUserIdByRoleIds(List roleIdList); + + /** + * 根据部门ID列表获取用户ID列表接口 + * @param deptIdList 部门ID列表 + * @return List 返回结果对象,包含根据部门ID列表获取到的用户ID列表信息 + */ + List listUserIdByDeptIds(List deptIdList); + +} diff --git a/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/ConnectServiceImpl.java b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/ConnectServiceImpl.java new file mode 100644 index 0000000..6a4c514 --- /dev/null +++ b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/ConnectServiceImpl.java @@ -0,0 +1,330 @@ +package com.pig4cloud.pigx.admin.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONArray; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.dingtalk.api.DefaultDingTalkClient; +import com.dingtalk.api.DingTalkClient; +import com.dingtalk.api.request.OapiGettokenRequest; +import com.dingtalk.api.request.OapiUserListidRequest; +import com.dingtalk.api.request.OapiV2DepartmentListsubRequest; +import com.dingtalk.api.request.OapiV2UserGetRequest; +import com.dingtalk.api.response.OapiGettokenResponse; +import com.dingtalk.api.response.OapiUserListidResponse; +import com.dingtalk.api.response.OapiV2DepartmentListsubResponse; +import com.dingtalk.api.response.OapiV2UserGetResponse; +import com.pig4cloud.pigx.admin.api.dto.UserDTO; +import com.pig4cloud.pigx.admin.api.entity.SysDept; +import com.pig4cloud.pigx.admin.api.entity.SysSocialDetails; +import com.pig4cloud.pigx.admin.api.entity.SysUser; +import com.pig4cloud.pigx.admin.mapper.SysSocialDetailsMapper; +import com.pig4cloud.pigx.admin.service.ConnectService; +import com.pig4cloud.pigx.admin.service.SysDeptService; +import com.pig4cloud.pigx.admin.service.SysUserService; +import com.pig4cloud.pigx.common.core.constant.SecurityConstants; +import com.pig4cloud.pigx.common.core.constant.enums.LoginTypeEnum; +import com.pig4cloud.pigx.common.core.exception.ErrorCodes; +import com.pig4cloud.pigx.common.core.util.MsgUtils; +import com.pig4cloud.pigx.common.core.util.R; +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import me.chanjar.weixin.common.error.WxErrorException; +import me.chanjar.weixin.cp.api.WxCpService; +import me.chanjar.weixin.cp.api.impl.WxCpServiceImpl; +import me.chanjar.weixin.cp.bean.WxCpDepart; +import me.chanjar.weixin.cp.bean.WxCpUser; +import me.chanjar.weixin.cp.config.impl.WxCpDefaultConfigImpl; +import org.springframework.http.HttpMethod; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.LinkedList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 互联平台实现 + *

+ * 钉钉: https://open-dev.dingtalk.com/apiExplorer + * + * @author lengleng + * @date 2022/4/22 + */ +@SuppressWarnings("unchecked") +@Slf4j +@Service +@RequiredArgsConstructor +public class ConnectServiceImpl implements ConnectService { + + private final SysSocialDetailsMapper sysSocialDetailsMapper; + + private final SysDeptService sysDeptService; + + private final SysUserService sysUserService; + + /** + * 同步钉钉部门 + * @return Boolean + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean syncDingDept() { + OapiV2DepartmentListsubRequest req = new OapiV2DepartmentListsubRequest(); + req.setDeptId(1L); + req.setLanguage("zh_CN"); + + // 数据库中现有的部门 + List deptList = sysDeptService.list(Wrappers.emptyWrapper()); + + // 查询根部门下的所有部门 + List insertDept = queryChildDept(req, getDingAccessToken(), deptList); + + // 去重 + List syncDept = insertDept.stream().distinct().collect(Collectors.toList()); + + // 保存部门以及部门关系 + if (CollectionUtils.isNotEmpty(syncDept)) { + syncDept.forEach(sysDeptService::save); + } + + return Boolean.TRUE; + } + + /** + * 同步部门下的钉钉用户 + * @param deptId 部门ID + * @return R + */ + @SneakyThrows + @Override + @Transactional(rollbackFor = Exception.class) + public R syncDingUser(Long deptId) { + // 数据库中现有用户 + List users = sysUserService.list(Wrappers.emptyWrapper()); + + String token = getDingAccessToken(); + + // 查询部门下的用户id列表 + DingTalkClient client = new DefaultDingTalkClient(SecurityConstants.DING_DEPT_USERIDS_URL); + OapiUserListidRequest req = new OapiUserListidRequest(); + req.setDeptId(deptId); + OapiUserListidResponse rsp = client.execute(req, token); + + JSONObject jsonObject = JSONUtil.parseObj(rsp.getBody()); + JSONObject result = jsonObject.getJSONObject("result"); + + if (result == null) { + return R.ok(); + } + List useridList = result.get("userid_list", List.class); + + // 查询用户详情 + for (String userid : useridList) { + DingTalkClient userClient = new DefaultDingTalkClient(SecurityConstants.DING_USER_INFO_URL); + OapiV2UserGetRequest userGetRequest = new OapiV2UserGetRequest(); + userGetRequest.setUserid(userid); + OapiV2UserGetResponse userGetResponse = userClient.execute(userGetRequest, token); + JSONObject userResult = JSONUtil.parseObj(userGetResponse.getBody()); + JSONObject userObj = JSONUtil.parseObj(userResult.get("result")); + + boolean exist = users.stream().filter(user -> StrUtil.isNotBlank(user.getPhone())) + .anyMatch(user -> user.getPhone().equals(userObj.getStr("mobile"))); + + if (exist || StrUtil.isBlank(userObj.getStr("mobile"))) { + log.info("用户已存在或手机号不合法 {}", userid); + continue; + } + + // 用户部门信息 + JSONArray deptOrders = userObj.getJSONArray("dept_order_list"); + JSONObject deptInfo = (JSONObject) deptOrders.get(0); + + // 用户信息 + UserDTO userDTO = new UserDTO(); + userDTO.setDeptId(deptInfo.getLong("dept_id")); + userDTO.setAvatar(userObj.getStr("avatar")); + userDTO.setUsername(userObj.getStr("mobile")); + userDTO.setPhone(userObj.getStr("mobile")); + userDTO.setNickname(userObj.getStr("nickname")); + userDTO.setName(userObj.getStr("name")); + userDTO.setEmail(userObj.getStr("email")); + // 初始化密码为 手机号 + userDTO.setPassword(userObj.getStr("mobile")); + sysUserService.saveUser(userDTO); + } + + return R.ok(); + } + + /** + * 同步企微部门 + * @return R + */ + @Override + @Transactional(rollbackFor = Exception.class) + public R syncCpDept() { + WxCpService wxCpService = new WxCpServiceImpl(); + wxCpService.setWxCpConfigStorage(getCpConfig()); + + List departList; + try { + departList = wxCpService.getDepartmentService().list(null); + } + catch (WxErrorException e) { + log.error("获取企业微信部门列表失败", e); + return R.failed(MsgUtils.getMessage(ErrorCodes.SYS_CONNECT_CP_DEPT_SYNC_ERROR)); + } + + if (CollUtil.isEmpty(departList)) { + return R.ok(); + } + + // 数据库中现有的部门 + List deptList = sysDeptService.list(Wrappers.emptyWrapper()); + departList.stream() + .filter(depart -> deptList.stream().noneMatch(sysDept -> depart.getName().equals(sysDept.getName()))) + .map(dept -> { + SysDept sysDept = new SysDept(); + sysDept.setName(dept.getName()); + sysDept.setDeptId(dept.getId()); + sysDept.setParentId(dept.getParentId()); + sysDept.setSortOrder(dept.getOrder().intValue()); + return sysDept; + }).forEach(sysDeptService::save); + return R.ok(); + } + + /** + * 同步企微用户 + * @return R + */ + @Override + public R syncCpUser() { + WxCpService wxCpService = new WxCpServiceImpl(); + wxCpService.setWxCpConfigStorage(getCpConfig()); + + List cpUserList; + try { + cpUserList = wxCpService.getUserService().listByDepartment(1L, true, 0); + } + catch (WxErrorException e) { + log.error("获取企业微信用户列表失败", e); + return R.failed(MsgUtils.getMessage(ErrorCodes.SYS_CONNECT_CP_USER_SYNC_ERROR)); + } + + if (CollUtil.isEmpty(cpUserList)) { + return R.ok(); + } + + // 系统原有用户 + List userList = sysUserService.list(Wrappers.emptyWrapper()); + + for (WxCpUser cpUser : cpUserList) { + boolean exist = userList.stream().filter(user -> StrUtil.isNotBlank(user.getPhone())) + .anyMatch(user -> user.getPhone().equals(cpUser.getMobile())); + if (exist || StrUtil.isBlank(cpUser.getMobile())) { + log.info("用户已存在或手机号不合法跳过 {}", cpUser); + continue; + } + + UserDTO user = new UserDTO(); + user.setUsername(cpUser.getMobile()); + user.setName(cpUser.getName()); + user.setDeptId(cpUser.getDepartIds()[0]); + user.setEmail(cpUser.getEmail()); + user.setPhone(cpUser.getMobile()); + user.setAvatar(cpUser.getAvatar()); + // 初始化密码为 手机号 + user.setPassword(cpUser.getMobile()); + sysUserService.saveUser(user); + } + + return R.ok(); + } + + private String getDingAccessToken() { + SysSocialDetails dingTalk = sysSocialDetailsMapper.selectOne(Wrappers.lambdaQuery() + .eq(SysSocialDetails::getType, LoginTypeEnum.DINGTALK.getType())); + + DingTalkClient client = new DefaultDingTalkClient(SecurityConstants.DING_OLD_GET_TOKEN); + OapiGettokenRequest request = new OapiGettokenRequest(); + request.setAppkey(dingTalk.getAppId()); + request.setAppsecret(dingTalk.getAppSecret()); + request.setHttpMethod(HttpMethod.GET.name()); + try { + OapiGettokenResponse response = client.execute(request); + return response.getAccessToken(); + } + catch (Exception e) { + log.error("调用钉钉异常", e); + } + return null; + } + + public WxCpDefaultConfigImpl getCpConfig() { + SysSocialDetails cp = sysSocialDetailsMapper.selectOne(Wrappers.lambdaQuery() + .eq(SysSocialDetails::getType, LoginTypeEnum.WEIXIN_CP.getType())); + + WxCpDefaultConfigImpl config = new WxCpDefaultConfigImpl(); + config.setCorpId(cp.getAppId()); // 设置微信企业号的appid + config.setCorpSecret(cp.getAppSecret()); // 设置微信企业号的app + // corpSecret + JSONObject ext = JSONUtil.parseObj(cp.getExt()); + config.setAgentId(ext.getInt("agentId")); // 设置微信企业号应用ID + config.setToken(ext.getStr("token")); // 设置微信企业号应用的token + config.setAesKey(ext.getStr("aesKey")); // 设置微信企业号应用的EncodingAESKey + + return config; + } + + /** + * 查询当前部门下的所有部门 + */ + @SneakyThrows + private List queryChildDept(OapiV2DepartmentListsubRequest req, String token, List deptList) { + List sysDepts = new LinkedList<>(); + + // 调用Api查询 + DingTalkClient client = new DefaultDingTalkClient(SecurityConstants.DING_OLD_DEPT_URL); + OapiV2DepartmentListsubResponse rsp = client.execute(req, token); + + JSONObject result = JSONUtil.parseObj(rsp.getBody()); + List resultList = result.get("result", List.class); + + if (CollUtil.isEmpty(resultList)) { + return sysDepts; + } + + // 过滤出数据库存在的部门 + List depts = resultList.stream() + .filter(dept -> deptList.stream().noneMatch(sysDept -> sysDept.getName().equals(dept.get("name")))) + .map(dept -> { + SysDept sysDept = new SysDept(); + sysDept.setName(Convert.toStr(dept.get("name"))); + sysDept.setDeptId(Convert.toLong(dept.get("dept_id"))); + sysDept.setParentId(Convert.toLong(dept.get("parent_id"))); + return sysDept; + }).collect(Collectors.toList()); + + // 递归查询下一级 + if (CollectionUtils.isNotEmpty(depts)) { + sysDepts.addAll(depts); + depts.forEach(dept -> { + OapiV2DepartmentListsubRequest request = new OapiV2DepartmentListsubRequest(); + request.setDeptId(dept.getDeptId()); + request.setLanguage("zh_CN"); + List childDept = queryChildDept(request, token, deptList); + sysDepts.addAll(childDept); + }); + } + + return sysDepts; + } + +} diff --git a/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/MobileServiceImpl.java b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/MobileServiceImpl.java new file mode 100644 index 0000000..5f2e771 --- /dev/null +++ b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/MobileServiceImpl.java @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.admin.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.RandomUtil; +import com.baomidou.mybatisplus.core.toolkit.StringPool; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.pig4cloud.pigx.admin.api.entity.SysUser; +import com.pig4cloud.pigx.admin.mapper.SysUserMapper; +import com.pig4cloud.pigx.admin.service.MobileService; +import com.pig4cloud.pigx.common.core.constant.CacheConstants; +import com.pig4cloud.pigx.common.core.constant.SecurityConstants; +import com.pig4cloud.pigx.common.core.constant.enums.LoginTypeEnum; +import com.pig4cloud.pigx.common.core.exception.ErrorCodes; +import com.pig4cloud.pigx.common.core.util.MsgUtils; +import com.pig4cloud.pigx.common.core.util.R; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.concurrent.TimeUnit; + +/** + * @author lengleng + * @date 2018/11/14 + *

+ * 手机登录相关业务实现 + */ +@Slf4j +@Service +@AllArgsConstructor +public class MobileServiceImpl implements MobileService { + + private final RedisTemplate redisTemplate; + + private final SysUserMapper userMapper; + + /** + * 发送手机验证码 TODO: 调用短信网关发送验证码,测试返回前端 + * @param mobile mobile + * @return code + */ + @Override + public R sendSmsCode(String mobile) { + List userList = userMapper + .selectList(Wrappers.query().lambda().eq(SysUser::getPhone, mobile)); + + if (CollUtil.isEmpty(userList)) { + log.info("手机号未注册:{}", mobile); + return R.ok(Boolean.FALSE, MsgUtils.getMessage(ErrorCodes.SYS_APP_PHONE_UNREGISTERED, mobile)); + } + + Object codeObj = redisTemplate.opsForValue() + .get(CacheConstants.DEFAULT_CODE_KEY + LoginTypeEnum.SMS.getType() + StringPool.AT + mobile); + + if (codeObj != null) { + log.info("手机号验证码未过期:{},{}", mobile, codeObj); + return R.ok(Boolean.FALSE, MsgUtils.getMessage(ErrorCodes.SYS_APP_SMS_OFTEN)); + } + + String code = RandomUtil.randomNumbers(Integer.parseInt(SecurityConstants.CODE_SIZE)); + log.debug("手机号生成验证码成功:{},{}", mobile, code); + redisTemplate.opsForValue().set( + CacheConstants.DEFAULT_CODE_KEY + LoginTypeEnum.SMS.getType() + StringPool.AT + mobile, code, + SecurityConstants.CODE_TIME, TimeUnit.SECONDS); + return R.ok(Boolean.TRUE, code); + } + +} diff --git a/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysAuditLogServiceImpl.java b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysAuditLogServiceImpl.java new file mode 100644 index 0000000..89f8752 --- /dev/null +++ b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysAuditLogServiceImpl.java @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ +package com.pig4cloud.pigx.admin.service.impl; + +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.pig4cloud.pigx.admin.api.entity.SysAuditLog; +import com.pig4cloud.pigx.admin.mapper.SysAuditLogMapper; +import com.pig4cloud.pigx.admin.service.SysAuditLogService; +import com.pig4cloud.pigx.common.data.datascope.DataScope; +import com.pig4cloud.pigx.common.security.util.SecurityUtils; +import org.springframework.stereotype.Service; + +/** + * 审计记录表 + * + * @author PIG + * @date 2023-02-28 20:12:23 + */ +@Service +public class SysAuditLogServiceImpl extends ServiceImpl implements SysAuditLogService { + + /** + * 分页查询审计日志(数据权限处理) + * @param page 分页条件 + * @param sysAuditLog 查询条件 + * @return page + */ + @Override + public Page getAuditsByScope(Page page, SysAuditLog sysAuditLog) { + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + wrapper.like(StrUtil.isNotBlank(sysAuditLog.getAuditName()), SysAuditLog::getAuditName, + sysAuditLog.getAuditName()); + wrapper.like(StrUtil.isNotBlank(sysAuditLog.getAuditField()), SysAuditLog::getAuditField, + sysAuditLog.getAuditField()); + wrapper.like(StrUtil.isNotBlank(sysAuditLog.getCreateBy()), SysAuditLog::getCreateBy, + sysAuditLog.getCreateBy()); + + // 数据权限限制,只查询本人的审计日志 + DataScope dataScope = new DataScope(); + dataScope.setUsername(SecurityUtils.getUser().getUsername()); + return baseMapper.selectPageByScope(page, wrapper, dataScope); + } + +} diff --git a/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysDeptServiceImpl.java b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysDeptServiceImpl.java new file mode 100644 index 0000000..6c04690 --- /dev/null +++ b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysDeptServiceImpl.java @@ -0,0 +1,250 @@ +/* + * + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + * + */ + +package com.pig4cloud.pigx.admin.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.lang.tree.Tree; +import cn.hutool.core.lang.tree.TreeNode; +import cn.hutool.core.lang.tree.TreeUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.pig4cloud.pigx.admin.api.entity.SysDept; +import com.pig4cloud.pigx.admin.api.entity.SysPost; +import com.pig4cloud.pigx.admin.api.entity.SysUser; +import com.pig4cloud.pigx.admin.api.entity.SysUserPost; +import com.pig4cloud.pigx.admin.api.vo.DeptExcelVo; +import com.pig4cloud.pigx.admin.mapper.SysDeptMapper; +import com.pig4cloud.pigx.admin.mapper.SysPostMapper; +import com.pig4cloud.pigx.admin.mapper.SysUserMapper; +import com.pig4cloud.pigx.admin.mapper.SysUserPostMapper; +import com.pig4cloud.pigx.admin.service.SysDeptService; +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.common.data.datascope.DataScope; +import com.pig4cloud.pigx.common.excel.vo.ErrorMessage; +import lombok.AllArgsConstructor; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.BindingResult; + +import java.util.*; +import java.util.stream.Collectors; + +/** + *

+ * 部门管理 服务实现类 + *

+ * + * @author lengleng + * @since 2018-01-20 + */ +@Service +@AllArgsConstructor +public class SysDeptServiceImpl extends ServiceImpl implements SysDeptService { + + private final SysUserMapper userMapper; + + private final SysDeptMapper deptMapper; + + private final SysPostMapper postMapper; + + private final SysUserPostMapper userPostMapper; + + /** + * 删除部门 + * @param id 部门 ID + * @return 成功、失败 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean removeDeptById(Long id) { + // 级联删除部门 + List idList = this.listDescendant(id).stream().map(SysDept::getDeptId).collect(Collectors.toList()); + + Optional.ofNullable(idList).filter(CollUtil::isNotEmpty).ifPresent(this::removeByIds); + + return Boolean.TRUE; + } + + /** + * 查询全部部门树 + * @param deptName + * @param parentId + * @return 树 部门名称 + */ + @Override + public List> selectTree(String deptName, Long parentId) { + // 查询全部部门 + List deptAllList = deptMapper.selectList( + Wrappers.lambdaQuery().like(StrUtil.isNotBlank(deptName), SysDept::getName, deptName)); + // 查询数据权限内部门 + List deptOwnIdList = deptMapper.selectListByScope( + Wrappers.lambdaQuery().like(StrUtil.isNotBlank(deptName), SysDept::getName, deptName), + DataScope.of()).stream().map(SysDept::getDeptId).collect(Collectors.toList()); + + // 权限内部门 + List> collect = deptAllList.stream() + .filter(dept -> dept.getDeptId().intValue() != dept.getParentId()) + .sorted(Comparator.comparingInt(SysDept::getSortOrder)).map(dept -> { + TreeNode treeNode = new TreeNode<>(); + treeNode.setId(dept.getDeptId()); + treeNode.setParentId(dept.getParentId()); + treeNode.setName(dept.getName()); + treeNode.setWeight(dept.getSortOrder()); + // 有权限不返回标识 + Map extra = new HashMap<>(8); + extra.put("isLock", !deptOwnIdList.contains(dept.getDeptId())); + extra.put("createTime", dept.getCreateTime()); + treeNode.setExtra(extra); + return treeNode; + }).collect(Collectors.toList()); + + // 模糊查询 不组装树结构 直接返回 表格方便编辑 + if (StrUtil.isNotBlank(deptName)) { + return collect.stream().map(node -> { + Tree tree = new Tree<>(); + tree.putAll(node.getExtra()); + BeanUtils.copyProperties(node, tree); + return tree; + }).collect(Collectors.toList()); + } + + return TreeUtil.build(collect, parentId == null ? 0 : parentId); + } + + /** + * 导出部门 + * @return + */ + @Override + public List listExcelVo() { + List list = this.list(); + List deptExcelVos = list.stream().map(item -> { + DeptExcelVo deptExcelVo = new DeptExcelVo(); + deptExcelVo.setName(item.getName()); + Optional first = this.list().stream().filter(it -> item.getParentId().equals(it.getDeptId())) + .map(SysDept::getName).findFirst(); + deptExcelVo.setParentName(first.orElse("根部门")); + deptExcelVo.setSortOrder(item.getSortOrder()); + return deptExcelVo; + }).collect(Collectors.toList()); + return deptExcelVos; + } + + @Override + public R importDept(List excelVOList, BindingResult bindingResult) { + List errorMessageList = (List) bindingResult.getTarget(); + + List deptList = this.list(); + for (DeptExcelVo item : excelVOList) { + Set errorMsg = new HashSet<>(); + boolean exsitUsername = deptList.stream().anyMatch(sysDept -> item.getName().equals(sysDept.getName())); + if (exsitUsername) { + errorMsg.add("部门名称已经存在"); + } + SysDept one = this.getOne(Wrappers.lambdaQuery().eq(SysDept::getName, item.getParentName())); + if (item.getParentName().equals("根部门")) { + one = new SysDept(); + one.setDeptId(0L); + } + if (one == null) { + errorMsg.add("上级部门不存在"); + } + if (CollUtil.isEmpty(errorMsg)) { + SysDept sysDept = new SysDept(); + sysDept.setName(item.getName()); + sysDept.setParentId(one.getDeptId()); + sysDept.setSortOrder(item.getSortOrder()); + baseMapper.insert(sysDept); + } + else { + // 数据不合法情况 + errorMessageList.add(new ErrorMessage(item.getLineNum(), errorMsg)); + } + } + if (CollUtil.isNotEmpty(errorMessageList)) { + return R.failed(errorMessageList); + } + return R.ok(null, "部门导入成功"); + } + + /** + * 查询所有子节点 (包含当前节点) + * @param deptId 部门ID 目标部门ID + * @return ID + */ + @Override + public List listDescendant(Long deptId) { + // 查询全部部门 + List allDeptList = baseMapper.selectList(Wrappers.emptyWrapper()); + + // 递归查询所有子节点 + List resDeptList = new ArrayList<>(); + recursiveDept(allDeptList, deptId, resDeptList); + + // 添加当前节点 + resDeptList.addAll(allDeptList.stream().filter(sysDept -> deptId.equals(sysDept.getDeptId())) + .collect(Collectors.toList())); + return resDeptList; + } + + /** + * 获取部门负责人 + * + * 1. 根据dept 查询用户 2. 筛选用户列表中 post + * @param deptId deptId + * @return user id list + */ + @Override + public List listDeptLeader(Long deptId) { + List sysUserList = userMapper + .selectList(Wrappers.lambdaQuery().eq(SysUser::getDeptId, deptId)); + if (CollUtil.isEmpty(sysUserList)) { + return null; + } + + SysPost deptLeader = postMapper + .selectOne(Wrappers.lambdaQuery().eq(SysPost::getPostCode, "DEPT_LEADER")); + if (deptLeader == null) { + return null; + } + + List userIdList = sysUserList.stream().map(SysUser::getUserId).collect(Collectors.toList()); + return userPostMapper.selectList(Wrappers.lambdaQuery().in(SysUserPost::getUserId, userIdList)) + .stream().filter(post -> Objects.equals(post.getPostId(), deptLeader.getPostId())) + .map(SysUserPost::getUserId).collect(Collectors.toList()); + } + + /** + * 递归查询所有子节点。 + * @param allDeptList 所有部门列表 + * @param parentId 父部门ID + * @param resDeptList 结果集合 + */ + private void recursiveDept(List allDeptList, Long parentId, List resDeptList) { + // 使用 Stream API 进行筛选和遍历 + allDeptList.stream().filter(sysDept -> sysDept.getParentId().equals(parentId)).forEach(sysDept -> { + resDeptList.add(sysDept); + recursiveDept(allDeptList, sysDept.getDeptId(), resDeptList); + }); + } + +} diff --git a/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysDictItemServiceImpl.java b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysDictItemServiceImpl.java new file mode 100644 index 0000000..59c4666 --- /dev/null +++ b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysDictItemServiceImpl.java @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ +package com.pig4cloud.pigx.admin.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.pig4cloud.pigx.admin.api.entity.SysDict; +import com.pig4cloud.pigx.admin.api.entity.SysDictItem; +import com.pig4cloud.pigx.admin.mapper.SysDictItemMapper; +import com.pig4cloud.pigx.admin.service.SysDictItemService; +import com.pig4cloud.pigx.admin.service.SysDictService; +import com.pig4cloud.pigx.common.core.constant.CacheConstants; +import com.pig4cloud.pigx.common.core.constant.enums.DictTypeEnum; +import com.pig4cloud.pigx.common.core.exception.ErrorCodes; +import com.pig4cloud.pigx.common.core.util.MsgUtils; +import com.pig4cloud.pigx.common.core.util.R; +import lombok.AllArgsConstructor; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.stereotype.Service; + +/** + * 字典项 + * + * @author lengleng + * @date 2019/03/19 + */ +@Service +@AllArgsConstructor +public class SysDictItemServiceImpl extends ServiceImpl implements SysDictItemService { + + private final SysDictService dictService; + + /** + * 删除字典项 + * @param id 字典项ID + * @return + */ + @Override + @CacheEvict(value = CacheConstants.DICT_DETAILS, allEntries = true) + public R removeDictItem(Long id) { + // 根据ID查询字典ID + SysDictItem dictItem = this.getById(id); + SysDict dict = dictService.getById(dictItem.getDictId()); + // 系统内置 + if (DictTypeEnum.SYSTEM.getType().equals(dict.getSystemFlag())) { + return R.failed(MsgUtils.getMessage(ErrorCodes.SYS_DICT_DELETE_SYSTEM)); + } + return R.ok(this.removeById(id)); + } + + /** + * 更新字典项 + * @param item 字典项 + * @return + */ + @Override + @CacheEvict(value = CacheConstants.DICT_DETAILS, key = "#item.dictType") + public R updateDictItem(SysDictItem item) { + // 查询字典 + SysDict dict = dictService.getById(item.getDictId()); + // 系统内置 + if (DictTypeEnum.SYSTEM.getType().equals(dict.getSystemFlag())) { + return R.failed(MsgUtils.getMessage(ErrorCodes.SYS_DICT_UPDATE_SYSTEM)); + } + return R.ok(this.updateById(item)); + } + +} diff --git a/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysDictServiceImpl.java b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysDictServiceImpl.java new file mode 100644 index 0000000..8c5ae6d --- /dev/null +++ b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysDictServiceImpl.java @@ -0,0 +1,99 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ +package com.pig4cloud.pigx.admin.service.impl; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.pig4cloud.pigx.admin.api.entity.SysDict; +import com.pig4cloud.pigx.admin.api.entity.SysDictItem; +import com.pig4cloud.pigx.admin.mapper.SysDictItemMapper; +import com.pig4cloud.pigx.admin.mapper.SysDictMapper; +import com.pig4cloud.pigx.admin.service.SysDictService; +import com.pig4cloud.pigx.common.core.constant.CacheConstants; +import com.pig4cloud.pigx.common.core.constant.enums.DictTypeEnum; +import com.pig4cloud.pigx.common.core.exception.ErrorCodes; +import com.pig4cloud.pigx.common.core.util.MsgUtils; +import com.pig4cloud.pigx.common.core.util.R; +import lombok.AllArgsConstructor; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * 字典表 + * + * @author lengleng + * @date 2019/03/19 + */ +@Service +@AllArgsConstructor +public class SysDictServiceImpl extends ServiceImpl implements SysDictService { + + private final SysDictItemMapper dictItemMapper; + + /** + * 根据ID 删除字典 + * @param ids 字典ID 列表 + * @return + */ + @Override + @Transactional(rollbackFor = Exception.class) + @CacheEvict(value = CacheConstants.DICT_DETAILS, allEntries = true) + public R removeDictByIds(Long[] ids) { + + List dictIdList = baseMapper.selectBatchIds(CollUtil.toList(ids)).stream() + .filter(sysDict -> !sysDict.getSystemFlag().equals(DictTypeEnum.SYSTEM.getType()))// 系统内置类型不删除 + .map(SysDict::getId).collect(Collectors.toList()); + + baseMapper.deleteBatchIds(dictIdList); + + dictItemMapper.delete(Wrappers.lambdaQuery().in(SysDictItem::getDictId, dictIdList)); + return R.ok(); + } + + /** + * 更新字典 + * @param dict 字典 + * @return + */ + @Override + @CacheEvict(value = CacheConstants.DICT_DETAILS, key = "#dict.dictType") + public R updateDict(SysDict dict) { + SysDict sysDict = this.getById(dict.getId()); + // 系统内置 + if (DictTypeEnum.SYSTEM.getType().equals(sysDict.getSystemFlag())) { + return R.failed(MsgUtils.getMessage(ErrorCodes.SYS_DICT_UPDATE_SYSTEM)); + } + this.updateById(dict); + return R.ok(dict); + } + + /** + * 同步缓存 (清空缓存) + * @return R + */ + @Override + @CacheEvict(value = CacheConstants.DICT_DETAILS, allEntries = true) + public R syncDictCache() { + return R.ok(); + } + +} diff --git a/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysFileServiceImpl.java b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysFileServiceImpl.java new file mode 100644 index 0000000..e1ee565 --- /dev/null +++ b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysFileServiceImpl.java @@ -0,0 +1,225 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ +package com.pig4cloud.pigx.admin.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.io.IoUtil; +import cn.hutool.core.lang.tree.Tree; +import cn.hutool.core.lang.tree.TreeNode; +import cn.hutool.core.lang.tree.TreeUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.StrUtil; +import com.amazonaws.services.s3.model.S3Object; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.pig4cloud.pigx.admin.api.dto.SysFileGroupDTO; +import com.pig4cloud.pigx.admin.api.entity.SysFile; +import com.pig4cloud.pigx.admin.api.entity.SysFileGroup; +import com.pig4cloud.pigx.admin.mapper.SysFileGroupMapper; +import com.pig4cloud.pigx.admin.mapper.SysFileMapper; +import com.pig4cloud.pigx.admin.service.SysFileService; +import com.pig4cloud.pigx.common.core.constant.CommonConstants; +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.common.file.core.FileProperties; +import com.pig4cloud.pigx.common.file.core.FileTemplate; +import lombok.AllArgsConstructor; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 文件管理 + * + * @author Luckly + * @date 2019-06-18 17:18:42 + */ +@Slf4j +@Service +@AllArgsConstructor +public class SysFileServiceImpl extends ServiceImpl implements SysFileService { + + private final FileTemplate fileTemplate; + + private final SysFileGroupMapper fileGroupMapper; + + private final FileProperties properties; + + /** + * 上传文件 + * @param file + * @param groupId + * @param type + * @return + */ + @Override + public R uploadFile(MultipartFile file, Long groupId, String type) { + String fileName = IdUtil.simpleUUID() + StrUtil.DOT + FileUtil.extName(file.getOriginalFilename()); + Map resultMap = new HashMap<>(4); + resultMap.put("bucketName", properties.getBucketName()); + resultMap.put("fileName", fileName); + resultMap.put("url", String.format("/admin/sys-file/%s/%s", properties.getBucketName(), fileName)); + + try (InputStream inputStream = file.getInputStream()) { + fileTemplate.putObject(properties.getBucketName(), fileName, inputStream, file.getContentType()); + // 文件管理数据记录,收集管理追踪文件 + fileLog(file, fileName, groupId, type); + } + catch (Exception e) { + log.error("上传失败", e); + return R.failed(e.getLocalizedMessage()); + } + return R.ok(resultMap); + } + + /** + * 读取文件 + * @param bucket + * @param fileName + * @param response + */ + @Override + public void getFile(String bucket, String fileName, HttpServletResponse response) { + try (S3Object s3Object = fileTemplate.getObject(bucket, fileName)) { + response.setContentType("application/octet-stream; charset=UTF-8"); + IoUtil.copy(s3Object.getObjectContent(), response.getOutputStream()); + } + catch (Exception e) { + log.error("文件读取异常: {}", e.getLocalizedMessage()); + } + } + + /** + * 删除文件 + * @param id + * @return + */ + @Override + @SneakyThrows + @Transactional(rollbackFor = Exception.class) + public Boolean deleteFile(Long id) { + SysFile file = this.getById(id); + if (Objects.isNull(file)) { + return Boolean.FALSE; + } + fileTemplate.removeObject(properties.getBucketName(), file.getFileName()); + return this.removeById(id); + } + + /** + * 查询文件组列表 + * @param fileGroup SysFileGroup对象,用于筛选条件 + * @return 包含文件组树形结构列表的List对象 + */ + @Override + public List> listFileGroup(SysFileGroup fileGroup) { + // 从数据库查询文件组列表 + List> treeNodeList = fileGroupMapper.selectList(Wrappers.query(fileGroup)).stream() + .map(group -> { + TreeNode treeNode = new TreeNode<>(); + treeNode.setName(group.getName()); + treeNode.setId(group.getId()); + treeNode.setParentId(group.getPid()); + return treeNode; + }).collect(Collectors.toList()); + + // 构建树形结构 + List> treeList = TreeUtil.build(treeNodeList, CommonConstants.MENU_TREE_ROOT_ID); + return CollUtil.isEmpty(treeList) ? new ArrayList<>() : treeList; + } + + /** + * 添加或更新文件组 + * @param fileGroup SysFileGroup对象,要添加或更新的文件组信息 + * @return 添加或更新成功返回true,否则返回false + */ + @Override + public Boolean saveOrUpdateGroup(SysFileGroup fileGroup) { + if (Objects.isNull(fileGroup.getId())) { + // 插入文件组 + fileGroupMapper.insert(fileGroup); + } + else { + // 更新文件组 + fileGroupMapper.updateById(fileGroup); + } + return Boolean.TRUE; + } + + /** + * 删除文件组 + * @param id 待删除文件组的ID + * @return 删除成功返回true,否则返回false + */ + @Override + public Boolean deleteGroup(Long id) { + // 根据ID删除文件组 + fileGroupMapper.deleteById(id); + return Boolean.TRUE; + } + + /** + * 移动文件组 + * @param fileGroupDTO SysFileGroupDTO对象,要移动的文件组信息 + * @return 移动成功返回true,否则返回false + */ + @Override + public Boolean moveFileGroup(SysFileGroupDTO fileGroupDTO) { + // 创建SysFile对象并设置groupId属性 + SysFile file = new SysFile(); + file.setGroupId(fileGroupDTO.getGroupId()); + + // 根据IDS更新对应的SysFile记录 + baseMapper.update(file, Wrappers.lambdaQuery().in(SysFile::getId, fileGroupDTO.getIds())); + return Boolean.TRUE; + } + + /** + * 文件管理数据记录,收集管理追踪文件 + * @param file 上传的文件格式 + * @param fileName 文件名 + * @param groupId 文件组ID + * @param type 文件类型 + */ + private void fileLog(MultipartFile file, String fileName, Long groupId, String type) { + // 创建SysFile对象并设置相关属性 + SysFile sysFile = new SysFile(); + sysFile.setFileName(fileName); + + // 对原始文件名进行编码转换 + String originalFilename = new String( + Objects.requireNonNull(file.getOriginalFilename()).getBytes(StandardCharsets.ISO_8859_1), + StandardCharsets.UTF_8); + sysFile.setOriginal(originalFilename); + sysFile.setFileSize(file.getSize()); + sysFile.setBucketName(properties.getBucketName()); + sysFile.setType(type); + sysFile.setGroupId(groupId); + + // 调用save方法保存SysFile对象 + this.save(sysFile); + } + +} diff --git a/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysI18nServiceImpl.java b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysI18nServiceImpl.java new file mode 100644 index 0000000..659ae02 --- /dev/null +++ b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysI18nServiceImpl.java @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ +package com.pig4cloud.pigx.admin.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.pig4cloud.pigx.admin.api.entity.SysI18nEntity; +import com.pig4cloud.pigx.admin.mapper.SysI18nMapper; +import com.pig4cloud.pigx.admin.service.SysI18nService; +import com.pig4cloud.pigx.common.core.constant.CacheConstants; +import com.pig4cloud.pigx.common.core.util.R; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 系统表-国际化 + * + * @author PIG + * @date 2023-02-14 09:07:01 + */ +@Service +public class SysI18nServiceImpl extends ServiceImpl implements SysI18nService { + + /** + * 生成前段需要的i18n 格式内容 + * @return + */ + @Override + @Cacheable(value = CacheConstants.I18N_DETAILS) + public Map listMap() { + List sysI18nEntities = baseMapper.selectList(null); + HashMap>> stringListHashMap = new HashMap<>(); + List> zhCh = new ArrayList<>(); + List> en = new ArrayList<>(); + sysI18nEntities.forEach(item -> { + HashMap zhChMap = new HashMap<>(); + HashMap enMap = new HashMap<>(); + zhChMap.put(item.getName(), item.getZhCn()); + enMap.put(item.getName(), item.getEn()); + zhCh.add(zhChMap); + en.add(enMap); + }); + stringListHashMap.put("zh-cn", zhCh); + stringListHashMap.put("en", en); + return stringListHashMap; + } + + /** + * 同步数据 + * @return + */ + @Override + @CacheEvict(value = CacheConstants.I18N_DETAILS, allEntries = true) + public R syncI18nCache() { + return R.ok(); + } + +} diff --git a/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysLogServiceImpl.java b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysLogServiceImpl.java new file mode 100644 index 0000000..127e1d8 --- /dev/null +++ b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysLogServiceImpl.java @@ -0,0 +1,109 @@ +/* + * + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + * + */ + +package com.pig4cloud.pigx.admin.service.impl; + +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.pig4cloud.pigx.admin.api.dto.SysLogDTO; +import com.pig4cloud.pigx.admin.api.entity.SysLog; +import com.pig4cloud.pigx.admin.api.vo.PreLogVO; +import com.pig4cloud.pigx.admin.mapper.SysLogMapper; +import com.pig4cloud.pigx.admin.service.SysLogService; +import com.pig4cloud.pigx.common.core.constant.CommonConstants; +import com.pig4cloud.pigx.common.data.tenant.TenantBroker; +import com.pig4cloud.pigx.common.data.tenant.TenantContextHolder; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.stream.Collectors; + +/** + *

+ * 日志表 服务实现类 + *

+ * + * @author lengleng + * @since 2017-11-20 + */ +@Service +public class SysLogServiceImpl extends ServiceImpl implements SysLogService { + + /** + * 批量插入前端错误日志 + * @param preLogVoList 日志信息 + * @return true/false + */ + @Override + public Boolean saveBatchLogs(List preLogVoList) { + List sysLogs = preLogVoList.stream().map(pre -> { + SysLog log = new SysLog(); + log.setLogType(CommonConstants.STATUS_LOCK); + log.setTitle(pre.getInfo()); + log.setException(pre.getStack()); + log.setParams(pre.getMessage()); + log.setCreateTime(LocalDateTime.now()); + log.setRequestUri(pre.getUrl()); + log.setCreateBy(pre.getUser()); + return log; + }).collect(Collectors.toList()); + return this.saveBatch(sysLogs); + } + + @Override + public Page getLogByPage(Page page, SysLogDTO sysLog) { + + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + if (StrUtil.isNotBlank(sysLog.getLogType())) { + wrapper.eq(SysLog::getLogType, sysLog.getLogType()); + } + + if (ArrayUtil.isNotEmpty(sysLog.getCreateTime())) { + wrapper.ge(SysLog::getCreateTime, sysLog.getCreateTime()[0]).le(SysLog::getCreateTime, + sysLog.getCreateTime()[1]); + } + + return baseMapper.selectPage(page, wrapper); + } + + /** + * 插入日志 + * @param sysLog 日志对象 + * @return true/false + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean saveLog(SysLogDTO sysLog) { + TenantBroker.applyAs(sysLog::getTenantId, tenantId -> { + TenantContextHolder.setTenantId(tenantId); + SysLog log = new SysLog(); + BeanUtils.copyProperties(sysLog, log, "createTime"); + return baseMapper.insert(log); + }); + return Boolean.TRUE; + } + +} diff --git a/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysMenuServiceImpl.java b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysMenuServiceImpl.java new file mode 100644 index 0000000..01036cb --- /dev/null +++ b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysMenuServiceImpl.java @@ -0,0 +1,195 @@ +/* + * + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + * + */ + +package com.pig4cloud.pigx.admin.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.lang.tree.Tree; +import cn.hutool.core.lang.tree.TreeNode; +import cn.hutool.core.lang.tree.TreeUtil; +import cn.hutool.core.util.BooleanUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.pig4cloud.pigx.admin.api.entity.SysI18nEntity; +import com.pig4cloud.pigx.admin.api.entity.SysMenu; +import com.pig4cloud.pigx.admin.api.entity.SysRoleMenu; +import com.pig4cloud.pigx.admin.mapper.SysMenuMapper; +import com.pig4cloud.pigx.admin.mapper.SysRoleMenuMapper; +import com.pig4cloud.pigx.admin.service.SysI18nService; +import com.pig4cloud.pigx.admin.service.SysMenuService; +import com.pig4cloud.pigx.common.core.constant.CacheConstants; +import com.pig4cloud.pigx.common.core.constant.CommonConstants; +import com.pig4cloud.pigx.common.core.constant.enums.MenuTypeEnum; +import com.pig4cloud.pigx.common.core.exception.ErrorCodes; +import com.pig4cloud.pigx.common.core.util.MsgUtils; +import com.pig4cloud.pigx.common.core.util.R; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.validation.constraints.NotNull; +import java.util.*; +import java.util.function.Function; +import java.util.function.Predicate; +import java.util.stream.Collectors; + +/** + *

+ * 菜单权限表 服务实现类 + *

+ * + * @author lengleng + * @since 2017-10-29 + */ +@Service +@AllArgsConstructor +@Slf4j +public class SysMenuServiceImpl extends ServiceImpl implements SysMenuService { + + private final SysRoleMenuMapper sysRoleMenuMapper; + + private final SysI18nService sysI18nService; + + @Override + @Cacheable(value = CacheConstants.MENU_DETAILS, key = "#roleId", unless = "#result.isEmpty()") + public List findMenuByRoleId(Long roleId) { + return baseMapper.listMenusByRoleId(roleId); + } + + @Override + @Transactional(rollbackFor = Exception.class) + @CacheEvict(value = CacheConstants.MENU_DETAILS, allEntries = true) + public R removeMenuById(Long id) { + // 查询父节点为当前节点的节点 + List menuList = this.list(Wrappers.query().lambda().eq(SysMenu::getParentId, id)); + if (CollUtil.isNotEmpty(menuList)) { + return R.failed(MsgUtils.getMessage(ErrorCodes.SYS_MENU_DELETE_EXISTING)); + } + + sysRoleMenuMapper.delete(Wrappers.query().lambda().eq(SysRoleMenu::getMenuId, id)); + // 删除当前菜单及其子菜单 + return R.ok(this.removeById(id)); + } + + @Override + @CacheEvict(value = CacheConstants.MENU_DETAILS, allEntries = true) + public Boolean updateMenuById(SysMenu sysMenu) { + return this.updateById(sysMenu); + } + + /** + * 构建树查询 1. 不是懒加载情况,查询全部 2. 是懒加载,根据parentId 查询 2.1 父节点为空,则查询ID -1 + * @param parentId 父节点ID + * @param menuName 菜单名称 + * @return + */ + @Override + public List> treeMenu(Long parentId, String menuName, String type) { + Long parent = parentId == null ? CommonConstants.MENU_TREE_ROOT_ID : parentId; + + List> collect = baseMapper + .selectList(Wrappers.lambdaQuery() + .like(StrUtil.isNotBlank(menuName), SysMenu::getName, menuName) + .eq(StrUtil.isNotBlank(type), SysMenu::getMenuType, type).orderByAsc(SysMenu::getSortOrder)) + .stream().map(getNodeFunction()).collect(Collectors.toList()); + + // 模糊查询 不组装树结构 直接返回 表格方便编辑 + if (StrUtil.isNotBlank(menuName)) { + return collect.stream().map(node -> { + Tree tree = new Tree<>(); + tree.putAll(node.getExtra()); + BeanUtils.copyProperties(node, tree); + return tree; + }).collect(Collectors.toList()); + } + + return TreeUtil.build(collect, parent); + } + + /** + * 查询菜单 + * @param all 全部菜单 + * @param type 类型 + * @param parentId 父节点ID + * @return + */ + @Override + public List> filterMenu(Set all, String type, Long parentId) { + List list = sysI18nService.list(); + List> collect = all.stream().filter(menuTypePredicate(type)).peek(item -> { + Optional first = list.stream().filter(it -> it.getZhCn().equals(item.getName())).findFirst(); + first.ifPresent(sysI18nEntity -> item.setName(sysI18nEntity.getName())); + }).map(getNodeFunction()).collect(Collectors.toList()); + + Long parent = parentId == null ? CommonConstants.MENU_TREE_ROOT_ID : parentId; + return TreeUtil.build(collect, parent); + } + + @NotNull + private Function> getNodeFunction() { + return menu -> { + TreeNode node = new TreeNode<>(); + node.setId(menu.getMenuId()); + node.setName(menu.getName()); + node.setParentId(menu.getParentId()); + node.setWeight(menu.getSortOrder()); + // 扩展属性 + Map extra = new HashMap<>(); + extra.put("path", menu.getPath()); + extra.put("menuType", menu.getMenuType()); + extra.put("permission", menu.getPermission()); + extra.put("sortOrder", menu.getSortOrder()); + + // 适配 vue3 + Map meta = new HashMap<>(); + meta.put("title", menu.getName()); + meta.put("isLink", menu.getPath() != null && menu.getPath().startsWith("http") ? menu.getPath() : ""); + meta.put("isHide", !BooleanUtil.toBooleanObject(menu.getVisible())); + meta.put("isKeepAlive", BooleanUtil.toBooleanObject(menu.getKeepAlive())); + meta.put("isAffix", false); + meta.put("isIframe", BooleanUtil.toBooleanObject(menu.getEmbedded())); + meta.put("icon", menu.getIcon()); + + extra.put("meta", meta); + node.setExtra(extra); + return node; + }; + } + + /** + * menu 类型断言 + * @param type 类型 + * @return Predicate + */ + private Predicate menuTypePredicate(String type) { + return vo -> { + if (MenuTypeEnum.TOP_MENU.getDescription().equals(type)) { + return MenuTypeEnum.TOP_MENU.getType().equals(vo.getMenuType()); + } + // 其他查询 左侧 + 顶部 + return !MenuTypeEnum.BUTTON.getType().equals(vo.getMenuType()); + }; + } + +} diff --git a/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysOauthClientDetailsServiceImpl.java b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysOauthClientDetailsServiceImpl.java new file mode 100644 index 0000000..d777463 --- /dev/null +++ b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysOauthClientDetailsServiceImpl.java @@ -0,0 +1,146 @@ +/* + * + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + * + */ + +package com.pig4cloud.pigx.admin.service.impl; + +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.pig4cloud.pigx.admin.api.dto.SysOauthClientDetailsDTO; +import com.pig4cloud.pigx.admin.api.entity.SysOauthClientDetails; +import com.pig4cloud.pigx.admin.config.ClientDetailsInitRunner; +import com.pig4cloud.pigx.admin.mapper.SysOauthClientDetailsMapper; +import com.pig4cloud.pigx.admin.service.SysOauthClientDetailsService; +import com.pig4cloud.pigx.common.core.constant.CacheConstants; +import com.pig4cloud.pigx.common.core.constant.CommonConstants; +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.common.core.util.SpringContextHolder; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.BeanUtils; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.stream.Collectors; + +/** + *

+ * 服务实现类 + *

+ * + * @author lengleng + * @since 2018-05-15 + */ +@Service +@RequiredArgsConstructor +public class SysOauthClientDetailsServiceImpl extends ServiceImpl + implements SysOauthClientDetailsService { + + /** + * 根据客户端信息 + * @param clientDetailsDTO + * @return + */ + @Override + @CacheEvict(value = CacheConstants.CLIENT_DETAILS_KEY, key = "#clientDetailsDTO.clientId") + @Transactional(rollbackFor = Exception.class) + public Boolean updateClientById(SysOauthClientDetailsDTO clientDetailsDTO) { + this.insertOrUpdate(clientDetailsDTO); + return Boolean.TRUE; + } + + /** + * 添加客户端 + * @param clientDetailsDTO + * @return + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean saveClient(SysOauthClientDetailsDTO clientDetailsDTO) { + this.insertOrUpdate(clientDetailsDTO); + return Boolean.TRUE; + } + + /** + * 插入或更新客户端对象 + * @param clientDetailsDTO + * @return + */ + private SysOauthClientDetails insertOrUpdate(SysOauthClientDetailsDTO clientDetailsDTO) { + // copy dto 对象 + SysOauthClientDetails clientDetails = new SysOauthClientDetails(); + BeanUtils.copyProperties(clientDetailsDTO, clientDetails); + + // 获取扩展信息,插入开关相关 + String information = clientDetailsDTO.getAdditionalInformation(); + JSONObject informationObj = JSONUtil.parseObj(information) + .set(CommonConstants.CAPTCHA_FLAG, clientDetailsDTO.getCaptchaFlag()) + .set(CommonConstants.ENC_FLAG, clientDetailsDTO.getEncFlag()) + .set(CommonConstants.ONLINE_QUANTITY, clientDetailsDTO.getOnlineQuantity()); + clientDetails.setAdditionalInformation(informationObj.toString()); + + // 更新数据库 + saveOrUpdate(clientDetails); + // 更新Redis + SpringContextHolder.publishEvent(new ClientDetailsInitRunner.ClientDetailsInitEvent(clientDetails)); + return clientDetails; + } + + /** + * 分页查询客户端信息 + * @param page + * @param query + * @return + */ + @Override + public Page queryPage(Page page, SysOauthClientDetails query) { + Page selectPage = baseMapper.selectPage(page, Wrappers.query(query)); + + // 处理扩展字段组装dto + List collect = selectPage.getRecords().stream().map(details -> { + String information = details.getAdditionalInformation(); + String captchaFlag = JSONUtil.parseObj(information).getStr(CommonConstants.CAPTCHA_FLAG); + String encFlag = JSONUtil.parseObj(information).getStr(CommonConstants.ENC_FLAG); + String onlineQuantity = JSONUtil.parseObj(information).getStr(CommonConstants.ONLINE_QUANTITY); + SysOauthClientDetailsDTO dto = new SysOauthClientDetailsDTO(); + BeanUtils.copyProperties(details, dto); + dto.setCaptchaFlag(captchaFlag); + dto.setEncFlag(encFlag); + dto.setOnlineQuantity(onlineQuantity); + return dto; + }).collect(Collectors.toList()); + + // 构建dto page 对象 + Page dtoPage = new Page<>(page.getCurrent(), page.getSize(), selectPage.getTotal()); + dtoPage.setRecords(collect); + return dtoPage; + } + + @Override + @CacheEvict(value = CacheConstants.CLIENT_DETAILS_KEY, allEntries = true) + public R syncClientCache() { + // 更新Redis + SpringContextHolder.publishEvent(new ClientDetailsInitRunner.ClientDetailsInitEvent(this)); + return R.ok(); + } + +} diff --git a/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysPostServiceImpl.java b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysPostServiceImpl.java new file mode 100644 index 0000000..c80b062 --- /dev/null +++ b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysPostServiceImpl.java @@ -0,0 +1,115 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ +package com.pig4cloud.pigx.admin.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ArrayUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.pig4cloud.pigx.admin.api.entity.SysPost; +import com.pig4cloud.pigx.admin.api.vo.PostExcelVO; +import com.pig4cloud.pigx.admin.mapper.SysPostMapper; +import com.pig4cloud.pigx.admin.service.SysPostService; +import com.pig4cloud.pigx.common.core.exception.ErrorCodes; +import com.pig4cloud.pigx.common.core.util.MsgUtils; +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.common.excel.vo.ErrorMessage; +import org.springframework.stereotype.Service; +import org.springframework.validation.BindingResult; + +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * 岗位信息表 + * + * @author fxz + * @date 2022-03-26 12:50:43 + */ +@Service +public class SysPostServiceImpl extends ServiceImpl implements SysPostService { + + /** + * 导入岗位 + * @param excelVOList 岗位列表 + * @param bindingResult 错误信息列表 + * @return ok fail + */ + @Override + public R importPost(List excelVOList, BindingResult bindingResult) { + // 通用校验获取失败的数据 + List errorMessageList = (List) bindingResult.getTarget(); + + // 个性化校验逻辑 + List postList = this.list(); + + // 执行数据插入操作 组装 PostDto + for (PostExcelVO excel : excelVOList) { + Set errorMsg = new HashSet<>(); + // 检验岗位名称或者岗位编码是否存在 + boolean existPost = postList.stream().anyMatch(post -> excel.getPostName().equals(post.getPostName()) + || excel.getPostCode().equals(post.getPostCode())); + + if (existPost) { + errorMsg.add(MsgUtils.getMessage(ErrorCodes.SYS_POST_NAMEORCODE_EXISTING, excel.getPostName(), + excel.getPostCode())); + } + + // 数据合法情况 + if (CollUtil.isEmpty(errorMsg)) { + insertExcelPost(excel); + } + else { + // 数据不合法 + errorMessageList.add(new ErrorMessage(excel.getLineNum(), errorMsg)); + } + } + if (CollUtil.isNotEmpty(errorMessageList)) { + return R.failed(errorMessageList); + } + return R.ok(); + } + + /** + * 导出excel 表格 + * @return + */ + @Override + public List listPost(SysPost query, Long[] ids) { + List postList = this + .list(Wrappers.lambdaQuery(query).in(ArrayUtil.isNotEmpty(ids), SysPost::getPostId, ids)); + // 转换成execl 对象输出 + return postList.stream().map(post -> { + PostExcelVO postExcelVO = new PostExcelVO(); + BeanUtil.copyProperties(post, postExcelVO); + return postExcelVO; + }).collect(Collectors.toList()); + } + + /** + * 插入excel Post + */ + private void insertExcelPost(PostExcelVO excel) { + SysPost sysPost = new SysPost(); + BeanUtil.copyProperties(excel, sysPost); + this.save(sysPost); + } + +} diff --git a/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysPublicParamServiceImpl.java b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysPublicParamServiceImpl.java new file mode 100644 index 0000000..be2cb33 --- /dev/null +++ b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysPublicParamServiceImpl.java @@ -0,0 +1,118 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.admin.service.impl; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.pig4cloud.pigx.admin.api.entity.SysPublicParam; +import com.pig4cloud.pigx.admin.mapper.SysPublicParamMapper; +import com.pig4cloud.pigx.admin.service.SysPublicParamService; +import com.pig4cloud.pigx.common.core.constant.CacheConstants; +import com.pig4cloud.pigx.common.core.constant.enums.DictTypeEnum; +import com.pig4cloud.pigx.common.core.exception.ErrorCodes; +import com.pig4cloud.pigx.common.core.util.MsgUtils; +import com.pig4cloud.pigx.common.core.util.R; +import lombok.AllArgsConstructor; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 公共参数配置 + * + * @author Lucky + * @date 2019-04-29 + */ +@Service +@AllArgsConstructor +public class SysPublicParamServiceImpl extends ServiceImpl + implements SysPublicParamService { + + @Override + @Cacheable(value = CacheConstants.PARAMS_DETAILS, key = "#publicKey", unless = "#result == null ") + public String getSysPublicParamKeyToValue(String publicKey) { + SysPublicParam sysPublicParam = this.baseMapper + .selectOne(Wrappers.lambdaQuery().eq(SysPublicParam::getPublicKey, publicKey)); + + if (sysPublicParam != null) { + return sysPublicParam.getPublicValue(); + } + return null; + } + + /** + * 通过key查询公共参数指定值 + * @param keys 参数列表 + * @return Map + */ + @Override + public Map getSysPublicParamsKeyToValue(String[] keys) { + List paramList = this.baseMapper + .selectList(Wrappers.lambdaQuery().in(SysPublicParam::getPublicKey, keys)); + Map result = new HashMap<>(8); + paramList.forEach(param -> result.put(param.getPublicKey(), param.getPublicValue())); + return result; + } + + /** + * 更新参数 + * @param sysPublicParam + * @return + */ + @Override + @CacheEvict(value = CacheConstants.PARAMS_DETAILS, key = "#sysPublicParam.publicKey") + public R updateParam(SysPublicParam sysPublicParam) { + SysPublicParam param = this.getById(sysPublicParam.getPublicId()); + // 系统内置 + if (DictTypeEnum.SYSTEM.getType().equals(param.getSystemFlag())) { + return R.failed(MsgUtils.getMessage(ErrorCodes.SYS_PARAM_DELETE_SYSTEM)); + } + return R.ok(this.updateById(sysPublicParam)); + } + + /** + * 删除参数 + * @param publicIds 参数ID列表 + * @return + */ + @Override + @CacheEvict(value = CacheConstants.PARAMS_DETAILS, allEntries = true) + public R removeParamByIds(Long[] publicIds) { + List idList = this.baseMapper.selectBatchIds(CollUtil.toList(publicIds)).stream() + .filter(p -> !p.getSystemFlag().equals(DictTypeEnum.SYSTEM.getType()))// 系统内置的跳过不能删除 + .map(SysPublicParam::getPublicId).collect(Collectors.toList()); + return R.ok(this.removeBatchByIds(idList)); + } + + /** + * 同步缓存 + * @return R + */ + @Override + @CacheEvict(value = CacheConstants.PARAMS_DETAILS, allEntries = true) + public R syncParamCache() { + return R.ok(); + } + +} diff --git a/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysRoleMenuServiceImpl.java b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysRoleMenuServiceImpl.java new file mode 100644 index 0000000..e80180b --- /dev/null +++ b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysRoleMenuServiceImpl.java @@ -0,0 +1,81 @@ +/* + * + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + * + */ + +package com.pig4cloud.pigx.admin.service.impl; + +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.pig4cloud.pigx.admin.api.entity.SysRoleMenu; +import com.pig4cloud.pigx.admin.mapper.SysRoleMenuMapper; +import com.pig4cloud.pigx.admin.service.SysRoleMenuService; +import com.pig4cloud.pigx.common.core.constant.CacheConstants; +import lombok.AllArgsConstructor; +import org.springframework.cache.CacheManager; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + *

+ * 角色菜单表 服务实现类 + *

+ * + * @author lengleng + * @since 2017-10-29 + */ +@Service +@AllArgsConstructor +public class SysRoleMenuServiceImpl extends ServiceImpl implements SysRoleMenuService { + + private final CacheManager cacheManager; + + /** + * @param role + * @param roleId 角色 + * @param menuIds 菜单ID拼成的字符串,每个id之间根据逗号分隔 + * @return + */ + @Override + @Transactional(rollbackFor = Exception.class) + @CacheEvict(value = CacheConstants.MENU_DETAILS, key = "#roleId") + public Boolean saveRoleMenus(Long roleId, String menuIds) { + this.remove(Wrappers.query().lambda().eq(SysRoleMenu::getRoleId, roleId)); + + if (StrUtil.isBlank(menuIds)) { + return Boolean.TRUE; + } + List roleMenuList = Arrays.stream(menuIds.split(StrUtil.COMMA)).map(menuId -> { + SysRoleMenu roleMenu = new SysRoleMenu(); + roleMenu.setRoleId(roleId); + roleMenu.setMenuId(Long.valueOf(menuId)); + return roleMenu; + }).collect(Collectors.toList()); + + // 清空userinfo + cacheManager.getCache(CacheConstants.USER_DETAILS).clear(); + this.saveBatch(roleMenuList); + return Boolean.TRUE; + } + +} diff --git a/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysRoleServiceImpl.java b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysRoleServiceImpl.java new file mode 100644 index 0000000..24daf3d --- /dev/null +++ b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysRoleServiceImpl.java @@ -0,0 +1,177 @@ +/* + * + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + * + */ + +package com.pig4cloud.pigx.admin.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ArrayUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.pig4cloud.pigx.admin.api.entity.SysRole; +import com.pig4cloud.pigx.admin.api.entity.SysRoleMenu; +import com.pig4cloud.pigx.admin.api.vo.RoleExcelVO; +import com.pig4cloud.pigx.admin.api.vo.RoleVO; +import com.pig4cloud.pigx.admin.mapper.SysRoleMapper; +import com.pig4cloud.pigx.admin.service.SysRoleMenuService; +import com.pig4cloud.pigx.admin.service.SysRoleService; +import com.pig4cloud.pigx.common.core.constant.CacheConstants; +import com.pig4cloud.pigx.common.core.exception.ErrorCodes; +import com.pig4cloud.pigx.common.core.util.MsgUtils; +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.common.excel.vo.ErrorMessage; +import lombok.AllArgsConstructor; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.BindingResult; + +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +/** + *

+ * 服务实现类 + *

+ * + * @author lengleng + * @since 2017-10-29 + */ +@Service +@AllArgsConstructor +public class SysRoleServiceImpl extends ServiceImpl implements SysRoleService { + + private SysRoleMenuService roleMenuService; + + /** + * 通过用户ID,查询角色信息 + * @param userId + * @return + */ + @Override + public List findRolesByUserId(Long userId) { + return baseMapper.listRolesByUserId(userId); + } + + /** + * 根据角色ID 查询角色列表,注意缓存删除 + * @param roleIdList 角色ID列表 + * @param key 缓存key + * @return + */ + @Override + @Cacheable(value = CacheConstants.ROLE_DETAILS, key = "#key", unless = "#result.isEmpty()") + public List findRolesByRoleIds(List roleIdList, String key) { + return baseMapper.selectBatchIds(roleIdList); + } + + /** + * 通过角色ID,删除角色,并清空角色菜单缓存 + * @param ids + * @return + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean removeRoleByIds(Long[] ids) { + roleMenuService + .remove(Wrappers.update().lambda().in(SysRoleMenu::getRoleId, CollUtil.toList(ids))); + return this.removeBatchByIds(CollUtil.toList(ids)); + } + + /** + * 根据角色菜单列表 + * @param roleVo 角色&菜单列表 + * @return + */ + @Override + public Boolean updateRoleMenus(RoleVO roleVo) { + return roleMenuService.saveRoleMenus(roleVo.getRoleId(), roleVo.getMenuIds()); + } + + /** + * 导入角色 + * @param excelVOList 角色列表 + * @param bindingResult 错误信息列表 + * @return ok fail + */ + @Override + public R importRole(List excelVOList, BindingResult bindingResult) { + // 通用校验获取失败的数据 + List errorMessageList = (List) bindingResult.getTarget(); + + // 个性化校验逻辑 + List roleList = this.list(); + + // 执行数据插入操作 组装 RoleDto + for (RoleExcelVO excel : excelVOList) { + Set errorMsg = new HashSet<>(); + // 检验角色名称或者角色编码是否存在 + boolean existRole = roleList.stream().anyMatch(sysRole -> excel.getRoleName().equals(sysRole.getRoleName()) + || excel.getRoleCode().equals(sysRole.getRoleCode())); + + if (existRole) { + errorMsg.add(MsgUtils.getMessage(ErrorCodes.SYS_ROLE_NAMEORCODE_EXISTING, excel.getRoleName(), + excel.getRoleCode())); + } + + // 数据合法情况 + if (CollUtil.isEmpty(errorMsg)) { + insertExcelRole(excel); + } + else { + // 数据不合法情况 + errorMessageList.add(new ErrorMessage(excel.getLineNum(), errorMsg)); + } + } + if (CollUtil.isNotEmpty(errorMessageList)) { + return R.failed(errorMessageList); + } + return R.ok(); + } + + /** + * 查询全部的角色 + * @return list + */ + @Override + public List listRole(SysRole sysRole, Long[] ids) { + List roleList = this + .list(Wrappers.lambdaQuery(sysRole).in(ArrayUtil.isNotEmpty(ids), SysRole::getRoleId, ids)); + // 转换成execl 对象输出 + return roleList.stream().map(role -> { + RoleExcelVO roleExcelVO = new RoleExcelVO(); + BeanUtil.copyProperties(role, roleExcelVO); + return roleExcelVO; + }).collect(Collectors.toList()); + } + + /** + * 插入excel Role + */ + private void insertExcelRole(RoleExcelVO excel) { + SysRole sysRole = new SysRole(); + sysRole.setRoleName(excel.getRoleName()); + sysRole.setRoleDesc(excel.getRoleDesc()); + sysRole.setRoleCode(excel.getRoleCode()); + this.save(sysRole); + } + +} diff --git a/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysRouteConfServiceImpl.java b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysRouteConfServiceImpl.java new file mode 100644 index 0000000..43f6e01 --- /dev/null +++ b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysRouteConfServiceImpl.java @@ -0,0 +1,164 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.admin.service.impl; + +import cn.hutool.json.JSONArray; +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.pig4cloud.pigx.admin.api.entity.SysRouteConf; +import com.pig4cloud.pigx.admin.mapper.SysRouteConfMapper; +import com.pig4cloud.pigx.admin.service.SysRouteConfService; +import com.pig4cloud.pigx.common.core.constant.CacheConstants; +import com.pig4cloud.pigx.common.core.constant.CommonConstants; +import com.pig4cloud.pigx.common.gateway.support.DynamicRouteInitEvent; +import com.pig4cloud.pigx.common.gateway.vo.RouteDefinitionVo; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.cloud.gateway.filter.FilterDefinition; +import org.springframework.cloud.gateway.handler.predicate.PredicateDefinition; +import org.springframework.context.ApplicationEventPublisher; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import reactor.core.publisher.Mono; + +import java.net.URI; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author lengleng + * @date 2018年11月06日10:27:55 + *

+ * 动态路由处理类 + */ +@Slf4j +@AllArgsConstructor +@Service("sysRouteConfService") +public class SysRouteConfServiceImpl extends ServiceImpl + implements SysRouteConfService { + + private final RedisTemplate redisTemplate; + + private final ApplicationEventPublisher applicationEventPublisher; + + /** + * 更新路由信息 + * @param routes 路由信息 + * @return + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Mono updateRoutes(JSONArray routes) { + // 清空Redis 缓存 + Boolean result = redisTemplate.delete(CacheConstants.ROUTE_KEY); + log.info("清空网关路由 {} ", result); + + // 遍历修改的routes,保存到Redis + List routeDefinitionVoList = new ArrayList<>(); + + try { + routes.forEach(value -> { + log.info("更新路由 ->{}", value); + RouteDefinitionVo vo = new RouteDefinitionVo(); + Map map = (Map) value; + + Object id = map.get("routeId"); + if (id != null) { + vo.setId(String.valueOf(id)); + } + + Object routeName = map.get("routeName"); + if (routeName != null) { + vo.setRouteName(String.valueOf(routeName)); + } + + Object predicates = map.get("predicates"); + if (predicates != null) { + JSONArray predicatesArray = (JSONArray) predicates; + List predicateDefinitionList = predicatesArray + .toList(PredicateDefinition.class); + vo.setPredicates(predicateDefinitionList); + } + + Object filters = map.get("filters"); + if (filters != null) { + JSONArray filtersArray = (JSONArray) filters; + List filterDefinitionList = filtersArray.toList(FilterDefinition.class); + vo.setFilters(filterDefinitionList); + } + + Object uri = map.get("uri"); + if (uri != null) { + vo.setUri(URI.create(String.valueOf(uri))); + } + + Object order = map.get("order"); + if (order != null) { + vo.setOrder(Integer.parseInt(String.valueOf(order))); + } + + Object metadata = map.get("metadata"); + if (metadata != null) { + Map metadataMap = JSONUtil.toBean(String.valueOf(metadata), Map.class); + vo.setMetadata(metadataMap); + } + + redisTemplate.setHashValueSerializer(new Jackson2JsonRedisSerializer<>(RouteDefinitionVo.class)); + redisTemplate.opsForHash().put(CacheConstants.ROUTE_KEY, vo.getId(), vo); + routeDefinitionVoList.add(vo); + }); + + // 逻辑删除全部 + SysRouteConf condition = new SysRouteConf(); + condition.setDelFlag(CommonConstants.STATUS_NORMAL); + this.remove(new UpdateWrapper<>(condition)); + + // 插入生效路由 + List routeConfList = routeDefinitionVoList.stream().map(vo -> { + SysRouteConf routeConf = new SysRouteConf(); + routeConf.setRouteId(vo.getId()); + routeConf.setRouteName(vo.getRouteName()); + routeConf.setFilters(JSONUtil.toJsonStr(vo.getFilters())); + routeConf.setPredicates(JSONUtil.toJsonStr(vo.getPredicates())); + routeConf.setSortOrder(vo.getOrder()); + routeConf.setUri(vo.getUri().toString()); + routeConf.setMetadata(JSONUtil.toJsonStr(vo.getMetadata())); + return routeConf; + }).collect(Collectors.toList()); + this.saveBatch(routeConfList); + log.debug("更新网关路由结束 "); + + // 通知网关重置路由 + redisTemplate.convertAndSend(CacheConstants.ROUTE_JVM_RELOAD_TOPIC, "路由信息,网关缓存更新"); + } + catch (Exception e) { + log.error("路由配置解析失败", e); + // 回滚路由,重新加载即可 + this.applicationEventPublisher.publishEvent(new DynamicRouteInitEvent(this)); + // 抛出异常 + throw new RuntimeException(e); + } + return Mono.empty(); + } + +} diff --git a/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysScheduleServiceImpl.java b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysScheduleServiceImpl.java new file mode 100644 index 0000000..7f14b4b --- /dev/null +++ b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysScheduleServiceImpl.java @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ +package com.pig4cloud.pigx.admin.service.impl; + +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.pig4cloud.pigx.admin.api.entity.SysScheduleEntity; +import com.pig4cloud.pigx.admin.mapper.SysScheduleMapper; +import com.pig4cloud.pigx.admin.service.SysScheduleService; +import com.pig4cloud.pigx.common.data.datascope.DataScope; +import com.pig4cloud.pigx.common.security.util.SecurityUtils; +import org.springframework.stereotype.Service; + +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.temporal.TemporalAdjusters; +import java.util.List; +import java.util.Objects; + +/** + * 日程 + * + * @author aeizzz + * @date 2023-03-06 14:26:23 + */ +@Service +public class SysScheduleServiceImpl extends ServiceImpl + implements SysScheduleService { + + @Override + public IPage getScheduleByScope(Page page, SysScheduleEntity sysSchedule) { + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + wrapper.like(StrUtil.isNotBlank(sysSchedule.getTitle()), SysScheduleEntity::getTitle, sysSchedule.getTitle()); + wrapper.like(StrUtil.isNotBlank(sysSchedule.getType()), SysScheduleEntity::getType, sysSchedule.getType()); + wrapper.eq(Objects.nonNull(sysSchedule.getDate()), SysScheduleEntity::getDate, sysSchedule.getDate()); + DataScope dataScope = new DataScope(); + dataScope.setUsername(SecurityUtils.getUser().getUsername()); + return baseMapper.selectPageByScope(page, wrapper, dataScope); + } + + @Override + public List selectListByScope(String month) { + LocalDate parse = LocalDate.parse(month, DateTimeFormatter.ofPattern("yyyy-MM-dd")); + LocalDate firstDay = parse.with(TemporalAdjusters.firstDayOfMonth()); // 获取当前月的第一天 + LocalDate lastDay = parse.with(TemporalAdjusters.lastDayOfMonth()); + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + wrapper.between(SysScheduleEntity::getDate, firstDay, lastDay); + DataScope dataScope = new DataScope(); + dataScope.setUsername(SecurityUtils.getUser().getUsername()); + return baseMapper.selectListByScope(wrapper, dataScope); + } + +} diff --git a/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysSocialDetailsServiceImpl.java b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysSocialDetailsServiceImpl.java new file mode 100644 index 0000000..dc21ac0 --- /dev/null +++ b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysSocialDetailsServiceImpl.java @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.admin.service.impl; + +import com.baomidou.mybatisplus.core.toolkit.StringPool; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.pig4cloud.pigx.admin.api.dto.UserInfo; +import com.pig4cloud.pigx.admin.api.entity.SysSocialDetails; +import com.pig4cloud.pigx.admin.api.entity.SysUser; +import com.pig4cloud.pigx.admin.handler.LoginHandler; +import com.pig4cloud.pigx.admin.mapper.SysSocialDetailsMapper; +import com.pig4cloud.pigx.admin.mapper.SysUserMapper; +import com.pig4cloud.pigx.admin.service.SysSocialDetailsService; +import com.pig4cloud.pigx.common.core.constant.CacheConstants; +import com.pig4cloud.pigx.common.security.util.SecurityUtils; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.cache.CacheManager; +import org.springframework.stereotype.Service; + +import java.util.Map; + +/** + * @author lengleng + * @date 2018年08月16日 + */ +@Slf4j +@AllArgsConstructor +@Service("sysSocialDetailsService") +public class SysSocialDetailsServiceImpl extends ServiceImpl + implements SysSocialDetailsService { + + private final Map loginHandlerMap; + + private final CacheManager cacheManager; + + private final SysUserMapper sysUserMapper; + + /** + * 绑定社交账号 + * @param type type + * @param code code + * @return + */ + @Override + public Boolean bindSocial(String type, String code) { + LoginHandler loginHandler = loginHandlerMap.get(type); + // 绑定逻辑 + String identify = loginHandler.identify(code); + SysUser sysUser = sysUserMapper.selectById(SecurityUtils.getUser().getId()); + loginHandler.bind(sysUser, identify); + + // 更新緩存 + cacheManager.getCache(CacheConstants.USER_DETAILS).evict(sysUser.getUsername()); + return Boolean.TRUE; + } + + /** + * 根据入参查询用户信息 + * @param inStr TYPE@code + * @return + */ + @Override + public UserInfo getUserInfo(String inStr) { + String[] inStrs = inStr.split(StringPool.AT); + String type = inStrs[0]; + String loginStr = inStr.substring(type.length() + 1); + return loginHandlerMap.get(type).handle(loginStr); + } + +} diff --git a/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysTenantServiceImpl.java b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysTenantServiceImpl.java new file mode 100644 index 0000000..3059725 --- /dev/null +++ b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysTenantServiceImpl.java @@ -0,0 +1,306 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ +package com.pig4cloud.pigx.admin.service.impl; + +import cn.hutool.core.util.CharUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.pig4cloud.pigx.admin.api.entity.*; +import com.pig4cloud.pigx.admin.config.ClientDetailsInitRunner; +import com.pig4cloud.pigx.admin.mapper.SysRoleMenuMapper; +import com.pig4cloud.pigx.admin.mapper.SysTenantMapper; +import com.pig4cloud.pigx.admin.service.*; +import com.pig4cloud.pigx.common.core.constant.CacheConstants; +import com.pig4cloud.pigx.common.core.constant.CommonConstants; +import com.pig4cloud.pigx.common.core.util.SpringContextHolder; +import com.pig4cloud.pigx.common.data.datascope.DataScopeTypeEnum; +import com.pig4cloud.pigx.common.data.resolver.ParamResolver; +import com.pig4cloud.pigx.common.data.tenant.TenantBroker; +import lombok.AllArgsConstructor; +import org.springframework.cache.CacheManager; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 租户 + *

+ * mybatis-plus 3.4.3.3 特殊处理 https://github.com/baomidou/mybatis-plus/pull/3592 + * + * @author lengleng + * @date 2019-05-15 15:55:41 + */ +@Service +@AllArgsConstructor +public class SysTenantServiceImpl extends ServiceImpl implements SysTenantService { + + private static final PasswordEncoder ENCODER = new BCryptPasswordEncoder(); + + private final SysOauthClientDetailsService clientServices; + + private final SysUserRoleService userRoleService; + + private final SysRoleMenuMapper roleMenuMapper; + + private final SysDictItemService dictItemService; + + private final SysPublicParamService paramService; + + private final SysUserService userService; + + private final SysRoleService roleService; + + private final SysMenuService menuService; + + private final SysDeptService deptService; + + private final SysDictService dictService; + + private final CacheManager cacheManager; + + /** + * 获取正常状态租户 + *

+ * 1. 状态正常 2. 开始时间小于等于当前时间 3. 结束时间大于等于当前时间 + * @return + */ + @Override + @Cacheable(value = CacheConstants.TENANT_DETAILS) + public List getNormalTenant() { + return baseMapper + .selectList(Wrappers.lambdaQuery().eq(SysTenant::getStatus, CommonConstants.STATUS_NORMAL)); + } + + /** + * 保存租户 + *

+ * 1. 保存租户 2. 初始化权限相关表 - sys_user - sys_role - sys_menu - sys_user_role - + * sys_role_menu - sys_dict - sys_dict_item - sys_client_details - sys_public_params + * @param sysTenant 租户实体 + * @return + */ + @Override + @Transactional(rollbackFor = Exception.class) + @CacheEvict(value = CacheConstants.TENANT_DETAILS) + public Boolean saveTenant(SysTenant sysTenant) { + this.save(sysTenant); + // 查询系统默认租户配置参数 + Long defaultId = ParamResolver.getLong("TENANT_DEFAULT_ID", 1L); + String defaultDeptName = ParamResolver.getStr("TENANT_DEFAULT_DEPTNAME", "租户默认部门"); + String defaultUsername = ParamResolver.getStr("TENANT_DEFAULT_USERNAME", "admin"); + String defaultPassword = ParamResolver.getStr("TENANT_DEFAULT_PASSWORD", "123456"); + String defaultRoleCode = ParamResolver.getStr("TENANT_DEFAULT_ROLECODE", "ROLE_ADMIN"); + String defaultRoleName = ParamResolver.getStr("TENANT_DEFAULT_ROLENAME", "租户默认角色"); + String userDefaultRoleCode = ParamResolver.getStr("USER_DEFAULT_ROLECODE", "GENERAL_USER"); + String userDefaultRoleName = ParamResolver.getStr("USER_DEFAULT_ROLENAME", "普通用户"); + + List dictList = new ArrayList<>(32); + List dictIdList = new ArrayList<>(32); + List dictItemList = new ArrayList<>(64); + List menuList = new ArrayList<>(128); + List clientDetailsList = new ArrayList<>(16); + List publicParamList = new ArrayList<>(64); + + TenantBroker.runAs(defaultId, (id) -> { + // 查询系统内置字典 + dictList.addAll(dictService.list()); + // 查询系统内置字典项目 + dictIdList.addAll(dictList.stream().map(SysDict::getId).collect(Collectors.toList())); + dictItemList.addAll( + dictItemService.list(Wrappers.lambdaQuery().in(SysDictItem::getDictId, dictIdList))); + List newMenuList = menuService.list(Wrappers.lambdaQuery().in(SysMenu::getMenuId, + StrUtil.split(sysTenant.getMenuId(), CharUtil.COMMA))); + // 查询当前租户菜单 + menuList.addAll(newMenuList); + // 查询客户端配置 + clientDetailsList.addAll(clientServices.list()); + // 查询系统参数配置 + publicParamList.addAll(paramService.list()); + }); + + // 保证插入租户为新的租户 + TenantBroker.applyAs(sysTenant.getId(), (id -> { + // 插入部门 + SysDept dept = new SysDept(); + dept.setName(defaultDeptName); + dept.setParentId(0L); + deptService.save(dept); + // 构造初始化用户 + SysUser user = new SysUser(); + user.setUsername(defaultUsername); + user.setPassword(ENCODER.encode(defaultPassword)); + user.setDeptId(dept.getDeptId()); + userService.save(user); + + // 构造普通用户角色 + SysRole roleDefault = new SysRole(); + roleDefault.setRoleCode(userDefaultRoleCode); + roleDefault.setRoleName(userDefaultRoleName); + roleDefault.setDsType(DataScopeTypeEnum.SELF_LEVEL.getType()); + roleService.save(roleDefault); + + // 构造新角色 管理员角色 + SysRole role = new SysRole(); + role.setRoleCode(defaultRoleCode); + role.setRoleName(defaultRoleName); + role.setDsType(DataScopeTypeEnum.ALL.getType()); + roleService.save(role); + // 用户角色关系 + SysUserRole userRole = new SysUserRole(); + userRole.setUserId(user.getUserId()); + userRole.setRoleId(role.getRoleId()); + userRoleService.save(userRole); + // 插入新的菜单 + saveTenantMenu(menuList, CommonConstants.MENU_TREE_ROOT_ID, CommonConstants.MENU_TREE_ROOT_ID); + + // 重新查询出所有的菜单关联角色 + List list = menuService.list(); + + // 查询全部菜单,构造角色菜单关系 + List roleMenuList = list.stream().map(menu -> { + SysRoleMenu roleMenu = new SysRoleMenu(); + roleMenu.setRoleId(role.getRoleId()); + roleMenu.setMenuId(menu.getMenuId()); + return roleMenu; + }).collect(Collectors.toList()); + roleMenuList.forEach(roleMenuMapper::insert); + // 插入系统字典 + dictService.saveBatch(dictList.stream().peek(d -> d.setId(null)).collect(Collectors.toList())); + // 处理字典项最新关联的字典ID + List itemList = dictList.stream().flatMap(dict -> dictItemList.stream() + .filter(item -> item.getDictType().equals(dict.getDictType())).peek(item -> { + item.setDictId(dict.getId()); + item.setId(null); + })).collect(Collectors.toList()); + + // 插入客户端 + clientServices.saveBatch(clientDetailsList.stream().peek(d -> d.setId(null)).collect(Collectors.toList())); + // 插入系统配置 + paramService + .saveBatch(publicParamList.stream().peek(d -> d.setPublicId(null)).collect(Collectors.toList())); + return dictItemService.saveBatch(itemList); + })); + + SpringContextHolder.publishEvent(new ClientDetailsInitRunner.ClientDetailsInitEvent(sysTenant)); + + return Boolean.TRUE; + } + + /** + * 修改租户 + * @param tenantDTO + * @return + */ + @Override + @CacheEvict(value = CacheConstants.TENANT_DETAILS, allEntries = true) + public Boolean updateTenant(SysTenant tenantDTO) { + SysTenant tenant = baseMapper.selectById(tenantDTO.getId()); + // 更新租户数据 + updateById(tenantDTO); + + // 如果没有修改租户套餐 + Long defaultId = ParamResolver.getLong("TENANT_DEFAULT_ID", 1L); + if (defaultId.equals(tenantDTO.getId())) { + return Boolean.TRUE; + } + if (tenant.getMenuId().equals(tenantDTO.getMenuId())) { + return Boolean.TRUE; + } + + List sysMenuList = TenantBroker.applyAs(defaultId, id -> menuService.list(Wrappers + .lambdaQuery().in(SysMenu::getMenuId, StrUtil.split(tenantDTO.getMenuId(), CharUtil.COMMA)))); + + TenantBroker.runAs(tenantDTO.getId(), (tenantId -> { + // 查询当前租户的所有菜单 + List menuList = menuService.list(Wrappers.emptyWrapper()); + + // 套餐功能对比和已有菜单对比 (新增) + List addMenuList = new ArrayList<>(); + List delMenuList = new ArrayList<>(); + + // 判断新增的菜单列表 + menuExist(sysMenuList, menuList, addMenuList); + + // 判断删除的菜单列表 + menuExist(menuList, sysMenuList, delMenuList); + + // 新增的菜单 + this.saveTenantMenu(addMenuList, CommonConstants.MENU_TREE_ROOT_ID, CommonConstants.MENU_TREE_ROOT_ID); + // 套餐删除的菜单 + List menuIdList = delMenuList.stream().map(SysMenu::getMenuId).collect(Collectors.toList()); + menuService.removeBatchByIds(menuIdList); + + // 清空菜单权限 + cacheManager.getCache(CacheConstants.MENU_DETAILS).clear(); + })); + + return Boolean.TRUE; + } + + /** + * 判断菜单是否存在 + * @param sysMenuList 要判断的菜单列表 + * @param menuList 已有菜单列表 + * @param addMenuList 待添加的菜单列表 + */ + private void menuExist(List sysMenuList, List menuList, List addMenuList) { + for (SysMenu sysMenu : sysMenuList) { + + if (StrUtil.isNotBlank(sysMenu.getPath())) { + // 根据菜单path名称,查询套餐菜单是否存在 + if (menuList.stream().noneMatch(menu -> sysMenu.getPath().equals(menu.getPath()))) { + addMenuList.add(sysMenu); + } + } + + if (StrUtil.isNotBlank(sysMenu.getPermission())) { + // 根据菜单permission名称,查询套餐菜单是否存在 + if (menuList.stream().noneMatch(menu -> sysMenu.getPermission().equals(menu.getPermission()))) { + addMenuList.add(sysMenu); + } + } + + } + } + + /** + * 保存新的租户菜单,维护成新的菜单 + * @param menuList 菜单列表 + * @param originParentId 原始上级 + * @param targetParentId 目标上级 + */ + private void saveTenantMenu(List menuList, Long originParentId, Long targetParentId) { + menuList.stream().filter(menu -> menu.getParentId().equals(originParentId)).forEach(menu -> { + // 保存菜单原始menuId, 方便查询子节点使用 + Long originMenuId = menu.getMenuId(); + menu.setMenuId(null); + menu.setParentId(targetParentId); + menuService.save(menu); + // 查找此节点的子节点,然后子节点的重新插入父节点更改为新的menuId + saveTenantMenu(menuList, originMenuId, menu.getMenuId()); + }); + } + +} diff --git a/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysUserRoleServiceImpl.java b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysUserRoleServiceImpl.java new file mode 100644 index 0000000..9bba45e --- /dev/null +++ b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysUserRoleServiceImpl.java @@ -0,0 +1,39 @@ +/* + * + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + * + */ + +package com.pig4cloud.pigx.admin.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.pig4cloud.pigx.admin.api.entity.SysUserRole; +import com.pig4cloud.pigx.admin.mapper.SysUserRoleMapper; +import com.pig4cloud.pigx.admin.service.SysUserRoleService; +import org.springframework.stereotype.Service; + +/** + *

+ * 用户角色表 服务实现类 + *

+ * + * @author lengleng + * @since 2017-10-29 + */ +@Service +public class SysUserRoleServiceImpl extends ServiceImpl implements SysUserRoleService { + +} diff --git a/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysUserServiceImpl.java b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysUserServiceImpl.java new file mode 100644 index 0000000..701d5f5 --- /dev/null +++ b/as-upms/as-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysUserServiceImpl.java @@ -0,0 +1,525 @@ +/* + * + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + * + */ + +package com.pig4cloud.pigx.admin.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.pig4cloud.pigx.admin.api.dto.UserDTO; +import com.pig4cloud.pigx.admin.api.dto.UserInfo; +import com.pig4cloud.pigx.admin.api.entity.*; +import com.pig4cloud.pigx.admin.api.vo.UserExcelVO; +import com.pig4cloud.pigx.admin.api.vo.UserVO; +import com.pig4cloud.pigx.admin.mapper.SysUserMapper; +import com.pig4cloud.pigx.admin.mapper.SysUserPostMapper; +import com.pig4cloud.pigx.admin.mapper.SysUserRoleMapper; +import com.pig4cloud.pigx.admin.service.*; +import com.pig4cloud.pigx.common.audit.annotation.Audit; +import com.pig4cloud.pigx.common.core.constant.CacheConstants; +import com.pig4cloud.pigx.common.core.constant.CommonConstants; +import com.pig4cloud.pigx.common.core.exception.ErrorCodes; +import com.pig4cloud.pigx.common.core.util.MsgUtils; +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.common.data.datascope.DataScope; +import com.pig4cloud.pigx.common.data.resolver.ParamResolver; +import com.pig4cloud.pigx.common.data.tenant.TenantContextHolder; +import com.pig4cloud.pigx.common.excel.vo.ErrorMessage; +import com.pig4cloud.pigx.common.security.service.PigxUser; +import com.pig4cloud.pigx.common.security.util.SecurityUtils; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; +import org.springframework.cache.Cache; +import org.springframework.cache.CacheManager; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.BindingResult; + +import java.time.LocalDateTime; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @author lengleng + * @date 2017/10/31 + */ +@Slf4j +@Service +@AllArgsConstructor +public class SysUserServiceImpl extends ServiceImpl implements SysUserService { + + private static final PasswordEncoder ENCODER = new BCryptPasswordEncoder(); + + private final SysMenuService sysMenuService; + + private final SysRoleService sysRoleService; + + private final SysPostService sysPostService; + + private final SysDeptService sysDeptService; + + private final SysUserRoleMapper sysUserRoleMapper; + + private final SysUserPostMapper sysUserPostMapper; + + private final CacheManager cacheManager; + + /** + * 保存用户信息 + * @param userDto DTO 对象 + * @return success/fail + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean saveUser(UserDTO userDto) { + SysUser sysUser = new SysUser(); + BeanUtils.copyProperties(userDto, sysUser); + sysUser.setDelFlag(CommonConstants.STATUS_NORMAL); + sysUser.setCreateBy(userDto.getUsername()); + sysUser.setUpdateBy(userDto.getUsername()); + sysUser.setPassword(ENCODER.encode(userDto.getPassword())); + baseMapper.insert(sysUser); + // 保存用户岗位信息 + Optional.ofNullable(userDto.getPost()).ifPresent(posts -> { + posts.stream().map(postId -> { + SysUserPost userPost = new SysUserPost(); + userPost.setUserId(sysUser.getUserId()); + userPost.setPostId(postId); + return userPost; + }).forEach(sysUserPostMapper::insert); + }); + + // 如果角色为空,赋默认角色 + if (CollUtil.isEmpty(userDto.getRole())) { + Long tenantId = TenantContextHolder.getTenantId(); + // 获取默认角色编码 + String defaultRole = ParamResolver.getStr("USER_DEFAULT_ROLE"); + // 默认角色 //fix pigX功能bug 添加租户查询(或者去掉租户属性) + SysRole sysRole = sysRoleService + .getOne(Wrappers.lambdaQuery().eq(SysRole::getRoleCode, defaultRole).eq(SysRole::getTenantId,tenantId)); + + userDto.setRole(Collections.singletonList(sysRole.getRoleId())); + } + + // 插入用户角色关系表 + userDto.getRole().stream().map(roleId -> { + SysUserRole userRole = new SysUserRole(); + userRole.setUserId(sysUser.getUserId()); + userRole.setRoleId(roleId); + return userRole; + }).forEach(sysUserRoleMapper::insert); + return Boolean.TRUE; + } + + /** + * 通过查用户的全部信息 + * @param sysUser 用户 + * @return + */ + @Override + public UserInfo findUserInfo(SysUser sysUser) { + UserInfo userInfo = new UserInfo(); + userInfo.setSysUser(sysUser); + // 设置角色列表 (ID) + List roleIds = sysRoleService.findRolesByUserId(sysUser.getUserId()).stream().map(SysRole::getRoleId) + .collect(Collectors.toList()); + userInfo.setRoles(ArrayUtil.toArray(roleIds, Long.class)); + + // 设置权限列表(menu.permission) + Set permissions = new HashSet<>(); + roleIds.forEach(roleId -> { + List permissionList = sysMenuService.findMenuByRoleId(roleId).stream() + .filter(menu -> StrUtil.isNotEmpty(menu.getPermission())).map(SysMenu::getPermission) + .collect(Collectors.toList()); + permissions.addAll(permissionList); + }); + userInfo.setPermissions(ArrayUtil.toArray(permissions, String.class)); + return userInfo; + } + + /** + * 分页查询用户信息(含有角色信息) + * @param page 分页对象 + * @param userDTO 参数列表 + * @return + */ + @Override + public IPage getUsersWithRolePage(Page page, UserDTO userDTO) { + return baseMapper.getUserVosPage(page, userDTO, DataScope.of()); + } + + /** + * 通过ID查询用户信息 + * @param id 用户ID + * @return 用户信息 + */ + @Override + public UserVO selectUserVoById(Long id) { + return baseMapper.getUserVoById(id); + } + + /** + * 删除用户 + * @param ids 用户ID 列表 + * @return Boolean + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean deleteUserByIds(Long[] ids) { + // 删除 spring cache + List userList = baseMapper.selectBatchIds(CollUtil.toList(ids)); + Cache cache = cacheManager.getCache(CacheConstants.USER_DETAILS); + for (SysUser sysUser : userList) { + cache.evict(sysUser.getUsername()); + } + + sysUserRoleMapper.delete(Wrappers.lambdaQuery().in(SysUserRole::getUserId, CollUtil.toList(ids))); + this.removeBatchByIds(CollUtil.toList(ids)); + return Boolean.TRUE; + } + + @Override + @CacheEvict(value = CacheConstants.USER_DETAILS, key = "#userDto.username") + public R updateUserInfo(UserDTO userDto) { + UserVO userVO = baseMapper.getUserVoByUsername(userDto.getUsername()); + + SysUser sysUser = new SysUser(); + sysUser.setPhone(userDto.getPhone()); + sysUser.setUserId(userVO.getUserId()); + sysUser.setAvatar(userDto.getAvatar()); + sysUser.setNickname(userDto.getNickname()); + sysUser.setName(userDto.getName()); + sysUser.setEmail(userDto.getEmail()); + return R.ok(this.updateById(sysUser)); + } + + @Override + @Transactional(rollbackFor = Exception.class) + @Audit(name = "用户更新", spel = "@sysUserMapper.selectById(#userDto.userId)") + @CacheEvict(value = CacheConstants.USER_DETAILS, key = "#userDto.username") + public Boolean updateUser(UserDTO userDto) { + // 更新用户表信息 + SysUser sysUser = new SysUser(); + BeanUtils.copyProperties(userDto, sysUser); + sysUser.setUpdateTime(LocalDateTime.now()); + + if (StrUtil.isNotBlank(userDto.getPassword())) { + sysUser.setPassword(ENCODER.encode(userDto.getPassword())); + } + + this.updateById(sysUser); + + // 更新用户角色表 + if (userDto.getRole() != null) { + sysUserRoleMapper + .delete(Wrappers.lambdaQuery().eq(SysUserRole::getUserId, userDto.getUserId())); + userDto.getRole().stream().map(roleId -> { + SysUserRole userRole = new SysUserRole(); + userRole.setUserId(sysUser.getUserId()); + userRole.setRoleId(roleId); + return userRole; + }).forEach(SysUserRole::insert); + } + + // 更新用户岗位表 + if (userDto.getPost() != null) { + sysUserPostMapper + .delete(Wrappers.lambdaQuery().eq(SysUserPost::getUserId, userDto.getUserId())); + userDto.getPost().stream().map(postId -> { + SysUserPost userPost = new SysUserPost(); + userPost.setUserId(sysUser.getUserId()); + userPost.setPostId(postId); + return userPost; + }).forEach(SysUserPost::insert); + } + + return Boolean.TRUE; + } + + /** + * 查询上级部门的用户信息 + * @param username 用户名 + * @return R + */ + @Override + public List listAncestorUsers(String username) { + SysUser sysUser = this.getOne(Wrappers.query().lambda().eq(SysUser::getUsername, username)); + + SysDept sysDept = sysDeptService.getById(sysUser.getDeptId()); + if (sysDept == null) { + return null; + } + + Long parentId = sysDept.getParentId(); + return this.list(Wrappers.query().lambda().eq(SysUser::getDeptId, parentId)); + } + + /** + * 查询全部的用户 + * @param userDTO 查询条件 + * @param ids ids 用户列表 + * @return list + */ + @Override + public List listUser(UserDTO userDTO, Long[] ids) { + // 根据数据权限查询全部的用户信息 + List voList = baseMapper.selectVoListByScope(userDTO, ids, DataScope.of()); + // 转换成execl 对象输出 + List userExcelVOList = voList.stream().map(userVO -> { + UserExcelVO excelVO = new UserExcelVO(); + BeanUtils.copyProperties(userVO, excelVO); + String roleNameList = userVO.getRoleList().stream().map(SysRole::getRoleName) + .collect(Collectors.joining(StrUtil.COMMA)); + excelVO.setRoleNameList(roleNameList); + String postNameList = userVO.getPostList().stream().map(SysPost::getPostName) + .collect(Collectors.joining(StrUtil.COMMA)); + excelVO.setPostNameList(postNameList); + return excelVO; + }).collect(Collectors.toList()); + return userExcelVOList; + } + + /** + * excel 导入用户, 插入正确的 错误的提示行号 + * @param excelVOList excel 列表数据 + * @param bindingResult 错误数据 + * @return ok fail + */ + @Override + public R importUser(List excelVOList, BindingResult bindingResult) { + // 通用校验获取失败的数据 + List errorMessageList = (List) bindingResult.getTarget(); + List deptList = sysDeptService.list(); + List roleList = sysRoleService.list(); + List postList = sysPostService.list(); + + // 执行数据插入操作 组装 UserDto + for (UserExcelVO excel : excelVOList) { + // 个性化校验逻辑 + List userList = this.list(); + + Set errorMsg = new HashSet<>(); + // 校验用户名是否存在 + boolean exsitUserName = userList.stream() + .anyMatch(sysUser -> excel.getUsername().equals(sysUser.getUsername())); + + if (exsitUserName) { + errorMsg.add(MsgUtils.getMessage(ErrorCodes.SYS_USER_USERNAME_EXISTING, excel.getUsername())); + } + + // 判断输入的部门名称列表是否合法 + Optional deptOptional = deptList.stream() + .filter(dept -> excel.getDeptName().equals(dept.getName())).findFirst(); + if (!deptOptional.isPresent()) { + errorMsg.add(MsgUtils.getMessage(ErrorCodes.SYS_DEPT_DEPTNAME_INEXISTENCE, excel.getDeptName())); + } + + // 判断输入的角色名称列表是否合法 + List roleNameList = StrUtil.split(excel.getRoleNameList(), StrUtil.COMMA); + List roleCollList = roleList.stream() + .filter(role -> roleNameList.stream().anyMatch(name -> role.getRoleName().equals(name))) + .collect(Collectors.toList()); + + if (roleCollList.size() != roleNameList.size()) { + errorMsg.add(MsgUtils.getMessage(ErrorCodes.SYS_ROLE_ROLENAME_INEXISTENCE, excel.getRoleNameList())); + } + + // 判断输入的部门名称列表是否合法 + List postNameList = StrUtil.split(excel.getPostNameList(), StrUtil.COMMA); + List postCollList = postList.stream() + .filter(post -> postNameList.stream().anyMatch(name -> post.getPostName().equals(name))) + .collect(Collectors.toList()); + + if (postCollList.size() != postNameList.size()) { + errorMsg.add(MsgUtils.getMessage(ErrorCodes.SYS_POST_POSTNAME_INEXISTENCE, excel.getPostNameList())); + } + + // 数据合法情况 + if (CollUtil.isEmpty(errorMsg)) { + insertExcelUser(excel, deptOptional, roleCollList, postCollList); + } + else { + // 数据不合法情况 + errorMessageList.add(new ErrorMessage(excel.getLineNum(), errorMsg)); + } + + } + + if (CollUtil.isNotEmpty(errorMessageList)) { + return R.failed(errorMessageList); + } + return R.ok(null, MsgUtils.getMessage(ErrorCodes.SYS_USER_IMPORT_SUCCEED)); + } + + /** + * 插入excel User + */ + private void insertExcelUser(UserExcelVO excel, Optional deptOptional, List roleCollList, + List postCollList) { + UserDTO userDTO = new UserDTO(); + userDTO.setUsername(excel.getUsername()); + userDTO.setPhone(excel.getPhone()); + userDTO.setNickname(excel.getNickname()); + userDTO.setName(excel.getName()); + userDTO.setEmail(excel.getEmail()); + // 批量导入初始密码为手机号 + userDTO.setPassword(userDTO.getPhone()); + // 根据部门名称查询部门ID + userDTO.setDeptId(deptOptional.get().getDeptId()); + // 插入岗位名称 + List postIdList = postCollList.stream().map(SysPost::getPostId).collect(Collectors.toList()); + userDTO.setPost(postIdList); + // 根据角色名称查询角色ID + List roleIdList = roleCollList.stream().map(SysRole::getRoleId).collect(Collectors.toList()); + userDTO.setRole(roleIdList); + // 插入用户 + this.saveUser(userDTO); + } + + /** + * 注册用户 赋予用户默认角色 + * @param userDto 用户信息 + * @return success/false + */ + @Override + @Transactional(rollbackFor = Exception.class) + public R registerUser(UserDTO userDto) { + // 判断用户名是否存在 + SysUser sysUser = this.getOne(Wrappers.lambdaQuery().eq(SysUser::getUsername, userDto.getUsername())); + if (sysUser != null) { + String message = MsgUtils.getMessage(ErrorCodes.SYS_USER_USERNAME_EXISTING, userDto.getUsername()); + return R.failed(message); + } + return R.ok(saveUser(userDto)); + } + + /** + * 锁定用户 + * @param username 用户名 + * @return + */ + @Override + @CacheEvict(value = CacheConstants.USER_DETAILS, key = "#username") + public R lockUser(String username) { + SysUser sysUser = baseMapper.selectOne(Wrappers.lambdaQuery().eq(SysUser::getUsername, username)); + + if (Objects.nonNull(sysUser)) { + sysUser.setLockFlag(CommonConstants.STATUS_LOCK); + baseMapper.updateById(sysUser); + } + return R.ok(); + } + + @Override + @CacheEvict(value = CacheConstants.USER_DETAILS, key = "#userDto.username") + public R changePassword(UserDTO userDto) { + UserVO userVO = baseMapper.getUserVoByUsername(userDto.getUsername()); + if (Objects.isNull(userVO)) { + return R.failed("用户不存在"); + } + + if (StrUtil.isEmpty(userDto.getPassword())) { + return R.failed("原密码不能为空"); + } + + if (!ENCODER.matches(userDto.getPassword(), userVO.getPassword())) { + log.info("原密码错误,修改个人信息失败:{}", userDto.getUsername()); + return R.failed(MsgUtils.getMessage(ErrorCodes.SYS_USER_UPDATE_PASSWORDERROR)); + } + + if (StrUtil.isEmpty(userDto.getNewpassword1())) { + return R.failed("新密码不能为空"); + } + String password = ENCODER.encode(userDto.getNewpassword1()); + + this.update(Wrappers.lambdaUpdate().set(SysUser::getPassword, password).eq(SysUser::getUserId, + userVO.getUserId())); + return R.ok(); + } + + @Override + public R unbinding(String type) { + PigxUser user = SecurityUtils.getUser(); + LambdaUpdateWrapper wrapper = null; + if (type.equals("wechat")) { + wrapper = Wrappers.lambdaUpdate().set(SysUser::getWxOpenid, null).eq(SysUser::getUserId, + user.getId()); + } + else if (type.equals("gitee")) { + wrapper = Wrappers.lambdaUpdate().set(SysUser::getGiteeLogin, null).eq(SysUser::getUserId, + user.getId()); + } + else if (type.equals("osc")) { + wrapper = Wrappers.lambdaUpdate().set(SysUser::getOscId, null).eq(SysUser::getUserId, + user.getId()); + } + else if (type.equals("tencent")) { + wrapper = Wrappers.lambdaUpdate().set(SysUser::getQqOpenid, null).eq(SysUser::getUserId, + user.getId()); + } + if (wrapper == null) { + return R.failed("解绑账号类型不存在"); + } + this.update(wrapper); + return R.ok(); + } + + @Override + public R checkPassword(String password) { + String username = SecurityUtils.getUser().getUsername(); + SysUser condition = new SysUser(); + condition.setUsername(username); + SysUser sysUser = this.getOne(new QueryWrapper<>(condition)); + + if (!ENCODER.matches(password, sysUser.getPassword())) { + log.info("原密码错误"); + return R.failed("密码输入错误"); + } + else { + return R.ok(); + } + } + + @Override + public List listUserIdByRoleIds(List roleIdList) { + return sysUserRoleMapper.selectList(Wrappers.lambdaQuery().in(SysUserRole::getRoleId, roleIdList)) + .stream().map(SysUserRole::getRoleId).collect(Collectors.toList()); + } + + /** + * 根据部门ID列表获取用户ID列表接口 + * @param deptIdList 部门ID列表 + * @return List 返回结果对象,包含根据部门ID列表获取到的用户ID列表信息 + */ + @Override + public List listUserIdByDeptIds(List deptIdList) { + return baseMapper.selectList(Wrappers.lambdaQuery().in(SysUser::getDeptId, deptIdList)); + } + +} diff --git a/as-upms/as-upms-biz/src/main/resources/application.yml b/as-upms/as-upms-biz/src/main/resources/application.yml new file mode 100644 index 0000000..9b62d42 --- /dev/null +++ b/as-upms/as-upms-biz/src/main/resources/application.yml @@ -0,0 +1,21 @@ +server: + port: 4000 + +spring: + application: + name: @artifactId@ + cloud: + nacos: + username: @nacos.username@ + password: @nacos.password@ + discovery: + server-addr: ${NACOS_HOST:pigx-register}:${NACOS_PORT:8848} + config: + server-addr: ${spring.cloud.nacos.discovery.server-addr} + config: + import: + - optional:nacos:application-@profiles.active@.yml + - optional:nacos:${spring.application.name}-@profiles.active@.yml + + + diff --git a/as-upms/as-upms-biz/src/main/resources/file/approle.xlsx b/as-upms/as-upms-biz/src/main/resources/file/approle.xlsx new file mode 100644 index 0000000..0c986e8 Binary files /dev/null and b/as-upms/as-upms-biz/src/main/resources/file/approle.xlsx differ diff --git a/as-upms/as-upms-biz/src/main/resources/file/appuser.xlsx b/as-upms/as-upms-biz/src/main/resources/file/appuser.xlsx new file mode 100644 index 0000000..2794a81 Binary files /dev/null and b/as-upms/as-upms-biz/src/main/resources/file/appuser.xlsx differ diff --git a/as-upms/as-upms-biz/src/main/resources/file/dept.xlsx b/as-upms/as-upms-biz/src/main/resources/file/dept.xlsx new file mode 100644 index 0000000..69439e5 Binary files /dev/null and b/as-upms/as-upms-biz/src/main/resources/file/dept.xlsx differ diff --git a/as-upms/as-upms-biz/src/main/resources/file/post.xlsx b/as-upms/as-upms-biz/src/main/resources/file/post.xlsx new file mode 100644 index 0000000..4e98211 Binary files /dev/null and b/as-upms/as-upms-biz/src/main/resources/file/post.xlsx differ diff --git a/as-upms/as-upms-biz/src/main/resources/file/role.xlsx b/as-upms/as-upms-biz/src/main/resources/file/role.xlsx new file mode 100644 index 0000000..0c986e8 Binary files /dev/null and b/as-upms/as-upms-biz/src/main/resources/file/role.xlsx differ diff --git a/as-upms/as-upms-biz/src/main/resources/file/user.xlsx b/as-upms/as-upms-biz/src/main/resources/file/user.xlsx new file mode 100644 index 0000000..bb557ba Binary files /dev/null and b/as-upms/as-upms-biz/src/main/resources/file/user.xlsx differ diff --git a/as-upms/as-upms-biz/src/main/resources/logback-spring.xml b/as-upms/as-upms-biz/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..60795a4 --- /dev/null +++ b/as-upms/as-upms-biz/src/main/resources/logback-spring.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + + + + + + ${log.path}/debug.log + + ${log.path}/%d{yyyy-MM, aux}/debug.%d{yyyy-MM-dd}.%i.log.gz + 50MB + 30 + + + %date [%thread] %-5level [%logger{50}] %file:%line - %msg%n + + + + + + ${log.path}/error.log + + ${log.path}/%d{yyyy-MM}/error.%d{yyyy-MM-dd}.%i.log.gz + 50MB + 30 + + + %date [%thread] %-5level [%logger{50}] %file:%line - %msg%n + + + ERROR + + + + + + + + + + + + + + + diff --git a/as-upms/as-upms-biz/src/main/resources/mapper/SysDeptMapper.xml b/as-upms/as-upms-biz/src/main/resources/mapper/SysDeptMapper.xml new file mode 100644 index 0000000..33b6b40 --- /dev/null +++ b/as-upms/as-upms-biz/src/main/resources/mapper/SysDeptMapper.xml @@ -0,0 +1,4 @@ + + + + diff --git a/as-upms/as-upms-biz/src/main/resources/mapper/SysMenuMapper.xml b/as-upms/as-upms-biz/src/main/resources/mapper/SysMenuMapper.xml new file mode 100644 index 0000000..48bfb23 --- /dev/null +++ b/as-upms/as-upms-biz/src/main/resources/mapper/SysMenuMapper.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/as-upms/as-upms-biz/src/main/resources/mapper/SysPostMapper.xml b/as-upms/as-upms-biz/src/main/resources/mapper/SysPostMapper.xml new file mode 100644 index 0000000..ba0d1d6 --- /dev/null +++ b/as-upms/as-upms-biz/src/main/resources/mapper/SysPostMapper.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/as-upms/as-upms-biz/src/main/resources/mapper/SysRoleMapper.xml b/as-upms/as-upms-biz/src/main/resources/mapper/SysRoleMapper.xml new file mode 100644 index 0000000..fe2f51d --- /dev/null +++ b/as-upms/as-upms-biz/src/main/resources/mapper/SysRoleMapper.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + diff --git a/as-upms/as-upms-biz/src/main/resources/mapper/SysUserMapper.xml b/as-upms/as-upms-biz/src/main/resources/mapper/SysUserMapper.xml new file mode 100644 index 0000000..3db80db --- /dev/null +++ b/as-upms/as-upms-biz/src/main/resources/mapper/SysUserMapper.xml @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + u.user_id, + u.username, + u.password, + u.salt, + u.phone, + u.avatar, + u.wx_openid, + u.qq_openid, + u.dept_id, + u.del_flag, + u.lock_flag, + u.tenant_id, + u.create_by, + u.create_time ucreate_time, + u.update_time uupdate_time, + r.role_id, + r.role_name, + r.role_code, + r.role_desc, + r.create_time rcreate_time, + r.update_time rupdate_time + + + + u.user_id, + u.username, + u.password, + u.salt, + u.phone, + u.avatar, + u.wx_openid, + u.qq_openid, + u.gitee_login, + u.osc_id, + u.del_flag, + u.lock_flag, + u.tenant_id, + u.nickname, + u.name, + u.email, + u.create_by, + u.create_time ucreate_time, + u.update_time uupdate_time, + d.name dept_name, + d.dept_id + + + + + + + + + + diff --git a/as-upms/pom.xml b/as-upms/pom.xml new file mode 100644 index 0000000..fb59ef3 --- /dev/null +++ b/as-upms/pom.xml @@ -0,0 +1,20 @@ + + + 4.0.0 + + com.pig4cloud + pigx + 5.2.0 + + + as-upms + + pigx 通用用户权限管理聚合模块 + pom + + + as-upms-api + as-upms-biz + + diff --git a/db/1schema.sql b/db/1schema.sql new file mode 100644 index 0000000..1b79479 --- /dev/null +++ b/db/1schema.sql @@ -0,0 +1,29 @@ +-- pigx 核心表 +create database `pigxx` default character set utf8mb4 collate utf8mb4_general_ci; + +-- pigx 工作流相关库 +create database `pigxx_flow` default character set utf8mb4 collate utf8mb4_general_ci; + +-- pigx 任务相关库 +create database `pigxx_job` default character set utf8mb4 collate utf8mb4_general_ci; + +-- pigx 公众号管理相关库 +create database `pigxx_mp` default character set utf8mb4 collate utf8mb4_general_ci; + +-- pigx nacos配置相关库 +create database `pigxx_config` default character set utf8mb4 collate utf8mb4_general_ci; + +-- pigx pay配置相关库 +create database `pigxx_pay` default character set utf8mb4 collate utf8mb4_general_ci; + +-- pigx codegen相关库 +create database `pigxx_codegen` default character set utf8mb4 collate utf8mb4_general_ci; + +-- pigx report相关库 +create database `pigxx_report` default character set utf8mb4 collate utf8mb4_general_ci; + +-- pigx bi 报表相关的数据库 +create database `pigxx_bi` default character set utf8mb4 collate utf8mb4_general_ci; + +-- pigx app 模块相关的数据库 +create database `pigxx_app` default character set utf8mb4 collate utf8mb4_general_ci; diff --git a/db/2pigxx.sql b/db/2pigxx.sql new file mode 100644 index 0000000..93de735 --- /dev/null +++ b/db/2pigxx.sql @@ -0,0 +1,1197 @@ +USE pigxx; + +SET NAMES utf8mb4; +SET FOREIGN_KEY_CHECKS = 0; + +-- ---------------------------- +-- Table structure for sys_audit_log +-- ---------------------------- +DROP TABLE IF EXISTS `sys_audit_log`; +CREATE TABLE `sys_audit_log` ( + `id` bigint(20) NOT NULL COMMENT '主键', + `audit_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '审计名称', + `audit_field` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '字段名称', + `before_val` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '变更前值', + `after_val` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '变更后值', + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '操作人', + `create_time` datetime NOT NULL COMMENT '操作时间', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '删除标记', + `tenant_id` bigint(20) NOT NULL COMMENT '租户ID', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='审计记录表'; + +-- ---------------------------- +-- Records of sys_audit_log +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for sys_dept +-- ---------------------------- +DROP TABLE IF EXISTS `sys_dept`; +CREATE TABLE `sys_dept` ( + `dept_id` bigint(20) NOT NULL COMMENT '部门ID', + `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '部门名称', + `sort_order` int(11) NOT NULL DEFAULT '0' COMMENT '排序', + `create_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ' ' COMMENT '创建人', + `update_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ' ' COMMENT '修改人', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_time` datetime DEFAULT NULL COMMENT '修改时间', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标志', + `parent_id` bigint(20) DEFAULT NULL COMMENT '父级部门ID', + `tenant_id` bigint(20) DEFAULT NULL COMMENT '租户ID', + PRIMARY KEY (`dept_id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='部门管理'; + +-- ---------------------------- +-- Records of sys_dept +-- ---------------------------- +BEGIN; +INSERT INTO `sys_dept` VALUES (1, '总裁办', 1, 'admin', 'admin', '2023-04-03 13:04:47', '2023-04-03 13:07:49', '0', 0, 1); +INSERT INTO `sys_dept` VALUES (2, '技术部', 2, 'admin', 'admin', '2023-04-03 13:04:47', '2023-04-03 13:04:47', '0', 1, 1); +INSERT INTO `sys_dept` VALUES (3, '市场部', 3, 'admin', 'admin', '2023-04-03 13:04:47', '2023-04-03 13:04:47', '0', 1, 1); +INSERT INTO `sys_dept` VALUES (4, '销售部', 4, 'admin', 'admin', '2023-04-03 13:04:47', '2023-04-03 13:04:47', '0', 1, 1); +INSERT INTO `sys_dept` VALUES (5, '财务部', 5, 'admin', 'admin', '2023-04-03 13:04:47', '2023-04-03 13:04:47', '0', 1, 1); +INSERT INTO `sys_dept` VALUES (6, '人事行政部', 6, 'admin', 'admin', '2023-04-03 13:04:47', '2023-04-03 13:53:36', '1', 1, 1); +INSERT INTO `sys_dept` VALUES (7, '研发部', 7, 'admin', 'admin', '2023-04-03 13:04:47', '2023-04-03 13:04:47', '0', 2, 1); +INSERT INTO `sys_dept` VALUES (8, 'UI设计部', 11, 'admin', 'admin', '2023-04-03 13:04:47', '2023-04-03 13:04:47', '0', 7, 1); +INSERT INTO `sys_dept` VALUES (9, '产品部', 12, 'admin', 'admin', '2023-04-03 13:04:47', '2023-04-03 13:04:47', '0', 2, 1); +INSERT INTO `sys_dept` VALUES (10, '渠道部', 13, 'admin', 'admin', '2023-04-03 13:04:47', '2023-04-03 13:04:47', '0', 3, 1); +INSERT INTO `sys_dept` VALUES (11, '推广部', 14, 'admin', 'admin', '2023-04-03 13:04:47', '2023-04-03 13:04:47', '0', 3, 1); +INSERT INTO `sys_dept` VALUES (12, '客服部', 15, 'admin', 'admin', '2023-04-03 13:04:47', '2023-04-03 13:04:47', '0', 4, 1); +INSERT INTO `sys_dept` VALUES (13, '财务会计部', 16, 'admin', 'admin', '2023-04-03 13:04:47', '2023-04-03 13:04:47', '0', 5, 1); +INSERT INTO `sys_dept` VALUES (14, '审计风控部', 17, 'admin', 'admin', '2023-04-03 13:04:47', '2023-04-03 14:06:57', '0', 5, 1); +COMMIT; + +-- ---------------------------- +-- Table structure for sys_dict +-- ---------------------------- +DROP TABLE IF EXISTS `sys_dict`; +CREATE TABLE `sys_dict` ( + `id` bigint(20) NOT NULL COMMENT '编号', + `dict_type` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '字典类型', + `description` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '描述', + `create_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ' ' COMMENT '创建人', + `update_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ' ' COMMENT '修改人', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + `remarks` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注信息', + `system_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '系统标志', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标志', + `tenant_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '所属租户', + PRIMARY KEY (`id`) USING BTREE, + KEY `sys_dict_del_flag` (`del_flag`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='字典表'; + +-- ---------------------------- +-- Records of sys_dict +-- ---------------------------- +BEGIN; +INSERT INTO `sys_dict` VALUES (1, 'log_type', '日志类型', ' ', ' ', '2019-03-19 11:06:44', '2019-03-19 11:06:44', '异常、正常', '1', '0', 1); +INSERT INTO `sys_dict` VALUES (2, 'social_type', '社交登录', ' ', ' ', '2019-03-19 11:09:44', '2019-03-19 11:09:44', '微信、QQ', '1', '0', 1); +INSERT INTO `sys_dict` VALUES (3, 'job_type', '定时任务类型', ' ', ' ', '2019-03-19 11:22:21', '2019-03-19 11:22:21', 'quartz', '1', '0', 1); +INSERT INTO `sys_dict` VALUES (4, 'job_status', '定时任务状态', ' ', ' ', '2019-03-19 11:24:57', '2019-03-19 11:24:57', '发布状态、运行状态', '1', '0', 1); +INSERT INTO `sys_dict` VALUES (5, 'job_execute_status', '定时任务执行状态', ' ', ' ', '2019-03-19 11:26:15', '2019-03-19 11:26:15', '正常、异常', '1', '0', 1); +INSERT INTO `sys_dict` VALUES (6, 'misfire_policy', '定时任务错失执行策略', ' ', ' ', '2019-03-19 11:27:19', '2019-03-19 11:27:19', '周期', '1', '0', 1); +INSERT INTO `sys_dict` VALUES (7, 'gender', '性别', ' ', ' ', '2019-03-27 13:44:06', '2019-03-27 13:44:06', '微信用户性别', '1', '0', 1); +INSERT INTO `sys_dict` VALUES (8, 'subscribe', '订阅状态', ' ', ' ', '2019-03-27 13:48:33', '2019-03-27 13:48:33', '公众号订阅状态', '1', '0', 1); +INSERT INTO `sys_dict` VALUES (9, 'response_type', '回复', ' ', ' ', '2019-03-28 21:29:21', '2019-03-28 21:29:21', '微信消息是否已回复', '1', '0', 1); +INSERT INTO `sys_dict` VALUES (10, 'param_type', '参数配置', ' ', ' ', '2019-04-29 18:20:47', '2019-04-29 18:20:47', '检索、原文、报表、安全、文档、消息、其他', '1', '0', 1); +INSERT INTO `sys_dict` VALUES (11, 'status_type', '租户状态', ' ', ' ', '2019-05-15 16:31:08', '2019-05-15 16:31:08', '租户状态', '1', '0', 1); +INSERT INTO `sys_dict` VALUES (12, 'dict_type', '字典类型', ' ', ' ', '2019-05-16 14:16:20', '2019-05-16 14:20:16', '系统类不能修改', '1', '0', 1); +INSERT INTO `sys_dict` VALUES (13, 'channel_type', '支付类型', ' ', ' ', '2019-05-16 14:16:20', '2019-05-16 14:20:16', '系统类不能修改', '1', '0', 1); +INSERT INTO `sys_dict` VALUES (14, 'grant_types', '授权类型', ' ', ' ', '2019-08-13 07:34:10', '2019-08-13 07:34:10', NULL, '1', '0', 1); +INSERT INTO `sys_dict` VALUES (15, 'style_type', '前端风格', ' ', ' ', '2020-02-07 03:49:28', '2020-02-07 03:50:40', '0-Avue 1-element', '1', '0', 1); +INSERT INTO `sys_dict` VALUES (16, 'captcha_flag_types', '验证码开关', ' ', ' ', '2020-11-18 06:53:25', '2020-11-18 06:53:25', '是否校验验证码', '1', '0', 1); +INSERT INTO `sys_dict` VALUES (17, 'enc_flag_types', '前端密码加密', ' ', ' ', '2020-11-18 06:54:44', '2020-11-18 06:54:44', '前端密码是否加密传输', '1', '0', 1); +INSERT INTO `sys_dict` VALUES (18, 'lock_flag', '用户状态', 'admin', ' ', '2023-02-01 16:55:31', NULL, NULL, '1', '0', 1); +INSERT INTO `sys_dict` VALUES (19, 'ds_config_type', '数据连接类型', 'admin', ' ', '2023-02-06 18:36:59', NULL, NULL, '1', '0', 1); +INSERT INTO `sys_dict` VALUES (20, 'common_status', '通用状态', 'admin', ' ', '2023-02-09 11:02:08', NULL, NULL, '1', '0', 1); +INSERT INTO `sys_dict` VALUES (21, 'app_social_type', 'app社交登录', 'admin', ' ', '2023-02-10 11:11:06', NULL, 'app社交登录', '1', '0', 1); +INSERT INTO `sys_dict` VALUES (22, 'yes_no_type', '是否', 'admin', ' ', '2023-02-20 23:25:04', NULL, NULL, '1', '0', 1); +INSERT INTO `sys_dict` VALUES (23, 'repType', '微信消息类型', 'admin', ' ', '2023-02-24 15:08:25', NULL, NULL, '0', '0', 1); +INSERT INTO `sys_dict` VALUES (24, 'leave_status', '请假状态', 'admin', ' ', '2023-03-02 22:50:15', NULL, NULL, '0', '0', 1); +INSERT INTO `sys_dict` VALUES (25, 'schedule_type', '日程类型', 'admin', ' ', '2023-03-06 14:49:18', NULL, NULL, '0', '0', 1); +INSERT INTO `sys_dict` VALUES (26, 'schedule_status', '日程状态', 'admin', ' ', '2023-03-06 14:52:57', NULL, NULL, '0', '0', 1); +INSERT INTO `sys_dict` VALUES (27, 'ds_type', '代码生成器支持的数据库类型', 'admin', ' ', '2023-03-12 09:57:59', NULL, NULL, '1', '0', 1); +COMMIT; + +-- ---------------------------- +-- Table structure for sys_dict_item +-- ---------------------------- +DROP TABLE IF EXISTS `sys_dict_item`; +CREATE TABLE `sys_dict_item` ( + `id` bigint(20) NOT NULL COMMENT '编号', + `dict_id` bigint(20) NOT NULL COMMENT '字典ID', + `item_value` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '字典项值', + `label` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '字典项名称', + `dict_type` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '字典类型', + `description` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '字典项描述', + `sort_order` int(11) NOT NULL DEFAULT '0' COMMENT '排序(升序)', + `create_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ' ' COMMENT '创建人', + `update_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ' ' COMMENT '修改人', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + `remarks` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注信息', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标志', + `tenant_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '所属租户', + PRIMARY KEY (`id`) USING BTREE, + KEY `sys_dict_value` (`item_value`) USING BTREE, + KEY `sys_dict_label` (`label`) USING BTREE, + KEY `sys_dict_item_del_flag` (`del_flag`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='字典项'; + +-- ---------------------------- +-- Records of sys_dict_item +-- ---------------------------- +BEGIN; +INSERT INTO `sys_dict_item` VALUES (1, 1, '9', '异常', 'log_type', '日志异常', 1, ' ', ' ', '2019-03-19 11:08:59', '2019-03-25 12:49:13', '', '0', 1); +INSERT INTO `sys_dict_item` VALUES (2, 1, '0', '正常', 'log_type', '日志正常', 0, ' ', ' ', '2019-03-19 11:09:17', '2019-03-25 12:49:18', '', '0', 1); +INSERT INTO `sys_dict_item` VALUES (3, 2, 'WX', '微信', 'social_type', '微信登录', 0, ' ', ' ', '2019-03-19 11:10:02', '2019-03-25 12:49:36', '', '0', 1); +INSERT INTO `sys_dict_item` VALUES (4, 2, 'QQ', 'QQ', 'social_type', 'QQ登录', 1, ' ', ' ', '2019-03-19 11:10:14', '2019-03-25 12:49:36', '', '0', 1); +INSERT INTO `sys_dict_item` VALUES (5, 3, '1', 'java类', 'job_type', 'java类', 1, ' ', ' ', '2019-03-19 11:22:37', '2019-03-25 12:49:36', '', '0', 1); +INSERT INTO `sys_dict_item` VALUES (6, 3, '2', 'spring bean', 'job_type', 'spring bean容器实例', 2, ' ', ' ', '2019-03-19 11:23:05', '2019-03-25 12:49:36', '', '0', 1); +INSERT INTO `sys_dict_item` VALUES (7, 3, '9', '其他', 'job_type', '其他类型', 9, ' ', ' ', '2019-03-19 11:23:31', '2019-03-25 12:49:36', '', '0', 1); +INSERT INTO `sys_dict_item` VALUES (8, 3, '3', 'Rest 调用', 'job_type', 'Rest 调用', 3, ' ', ' ', '2019-03-19 11:23:57', '2019-03-25 12:49:36', '', '0', 1); +INSERT INTO `sys_dict_item` VALUES (9, 3, '4', 'jar', 'job_type', 'jar类型', 4, ' ', ' ', '2019-03-19 11:24:20', '2019-03-25 12:49:36', '', '0', 1); +INSERT INTO `sys_dict_item` VALUES (10, 4, '1', '未发布', 'job_status', '未发布', 1, ' ', ' ', '2019-03-19 11:25:18', '2019-03-25 12:49:36', '', '0', 1); +INSERT INTO `sys_dict_item` VALUES (11, 4, '2', '运行中', 'job_status', '运行中', 2, ' ', ' ', '2019-03-19 11:25:31', '2019-03-25 12:49:36', '', '0', 1); +INSERT INTO `sys_dict_item` VALUES (12, 4, '3', '暂停', 'job_status', '暂停', 3, ' ', ' ', '2019-03-19 11:25:42', '2019-03-25 12:49:36', '', '0', 1); +INSERT INTO `sys_dict_item` VALUES (13, 5, '0', '正常', 'job_execute_status', '正常', 0, ' ', ' ', '2019-03-19 11:26:27', '2019-03-25 12:49:36', '', '0', 1); +INSERT INTO `sys_dict_item` VALUES (14, 5, '1', '异常', 'job_execute_status', '异常', 1, ' ', ' ', '2019-03-19 11:26:41', '2019-03-25 12:49:36', '', '0', 1); +INSERT INTO `sys_dict_item` VALUES (15, 6, '1', '错失周期立即执行', 'misfire_policy', '错失周期立即执行', 1, ' ', ' ', '2019-03-19 11:27:45', '2019-03-25 12:49:36', '', '0', 1); +INSERT INTO `sys_dict_item` VALUES (16, 6, '2', '错失周期执行一次', 'misfire_policy', '错失周期执行一次', 2, ' ', ' ', '2019-03-19 11:27:57', '2019-03-25 12:49:36', '', '0', 1); +INSERT INTO `sys_dict_item` VALUES (17, 6, '3', '下周期执行', 'misfire_policy', '下周期执行', 3, ' ', ' ', '2019-03-19 11:28:08', '2019-03-25 12:49:36', '', '0', 1); +INSERT INTO `sys_dict_item` VALUES (18, 7, '1', '男', 'gender', '微信-男', 0, ' ', ' ', '2019-03-27 13:45:13', '2019-03-27 13:45:13', '微信-男', '0', 1); +INSERT INTO `sys_dict_item` VALUES (19, 7, '2', '女', 'gender', '女-微信', 1, ' ', ' ', '2019-03-27 13:45:34', '2019-03-27 13:45:34', '女-微信', '0', 1); +INSERT INTO `sys_dict_item` VALUES (20, 7, '0', '未知', 'gender', 'x性别未知', 3, ' ', ' ', '2019-03-27 13:45:57', '2019-03-27 13:45:57', 'x性别未知', '0', 1); +INSERT INTO `sys_dict_item` VALUES (21, 8, '0', '未关注', 'subscribe', '公众号-未关注', 0, ' ', ' ', '2019-03-27 13:49:07', '2019-03-27 13:49:07', '公众号-未关注', '0', 1); +INSERT INTO `sys_dict_item` VALUES (22, 8, '1', '已关注', 'subscribe', '公众号-已关注', 1, ' ', ' ', '2019-03-27 13:49:26', '2019-03-27 13:49:26', '公众号-已关注', '0', 1); +INSERT INTO `sys_dict_item` VALUES (23, 9, '0', '未回复', 'response_type', '微信消息-未回复', 0, ' ', ' ', '2019-03-28 21:29:47', '2019-03-28 21:29:47', '微信消息-未回复', '0', 1); +INSERT INTO `sys_dict_item` VALUES (24, 9, '1', '已回复', 'response_type', '微信消息-已回复', 1, ' ', ' ', '2019-03-28 21:30:08', '2019-03-28 21:30:08', '微信消息-已回复', '0', 1); +INSERT INTO `sys_dict_item` VALUES (25, 10, '1', '检索', 'param_type', '检索', 0, ' ', ' ', '2019-04-29 18:22:17', '2019-04-29 18:22:17', '检索', '0', 1); +INSERT INTO `sys_dict_item` VALUES (26, 10, '2', '原文', 'param_type', '原文', 0, ' ', ' ', '2019-04-29 18:22:27', '2019-04-29 18:22:27', '原文', '0', 1); +INSERT INTO `sys_dict_item` VALUES (27, 10, '3', '报表', 'param_type', '报表', 0, ' ', ' ', '2019-04-29 18:22:36', '2019-04-29 18:22:36', '报表', '0', 1); +INSERT INTO `sys_dict_item` VALUES (28, 10, '4', '安全', 'param_type', '安全', 0, ' ', ' ', '2019-04-29 18:22:46', '2019-04-29 18:22:46', '安全', '0', 1); +INSERT INTO `sys_dict_item` VALUES (29, 10, '5', '文档', 'param_type', '文档', 0, ' ', ' ', '2019-04-29 18:22:56', '2019-04-29 18:22:56', '文档', '0', 1); +INSERT INTO `sys_dict_item` VALUES (30, 10, '6', '消息', 'param_type', '消息', 0, ' ', ' ', '2019-04-29 18:23:05', '2019-04-29 18:23:05', '消息', '0', 1); +INSERT INTO `sys_dict_item` VALUES (31, 10, '9', '其他', 'param_type', '其他', 0, ' ', ' ', '2019-04-29 18:23:16', '2019-04-29 18:23:16', '其他', '0', 1); +INSERT INTO `sys_dict_item` VALUES (32, 10, '0', '默认', 'param_type', '默认', 0, ' ', ' ', '2019-04-29 18:23:30', '2019-04-29 18:23:30', '默认', '0', 1); +INSERT INTO `sys_dict_item` VALUES (33, 11, '0', '正常', 'status_type', '状态正常', 0, ' ', ' ', '2019-05-15 16:31:34', '2019-05-16 22:30:46', '状态正常', '0', 1); +INSERT INTO `sys_dict_item` VALUES (34, 11, '9', '冻结', 'status_type', '状态冻结', 1, ' ', ' ', '2019-05-15 16:31:56', '2019-05-16 22:30:50', '状态冻结', '0', 1); +INSERT INTO `sys_dict_item` VALUES (35, 12, '1', '系统类', 'dict_type', '系统类字典', 0, ' ', ' ', '2019-05-16 14:20:40', '2019-05-16 14:20:40', '不能修改删除', '0', 1); +INSERT INTO `sys_dict_item` VALUES (36, 12, '0', '业务类', 'dict_type', '业务类字典', 0, ' ', ' ', '2019-05-16 14:20:59', '2019-05-16 14:20:59', '可以修改', '0', 1); +INSERT INTO `sys_dict_item` VALUES (37, 2, 'GITEE', '码云', 'social_type', '码云', 2, ' ', ' ', '2019-06-28 09:59:12', '2019-06-28 09:59:12', '码云', '0', 1); +INSERT INTO `sys_dict_item` VALUES (38, 2, 'OSC', '开源中国', 'social_type', '开源中国登录', 2, ' ', ' ', '2019-06-28 10:04:32', '2019-06-28 10:04:32', '', '0', 1); +INSERT INTO `sys_dict_item` VALUES (39, 14, 'password', '密码模式', 'grant_types', '支持oauth密码模式', 0, ' ', ' ', '2019-08-13 07:35:28', '2019-08-13 07:35:28', NULL, '0', 1); +INSERT INTO `sys_dict_item` VALUES (40, 14, 'authorization_code', '授权码模式', 'grant_types', 'oauth2 授权码模式', 1, ' ', ' ', '2019-08-13 07:36:07', '2019-08-13 07:36:07', NULL, '0', 1); +INSERT INTO `sys_dict_item` VALUES (41, 14, 'client_credentials', '客户端模式', 'grant_types', 'oauth2 客户端模式', 2, ' ', ' ', '2019-08-13 07:36:30', '2019-08-13 07:36:30', NULL, '0', 1); +INSERT INTO `sys_dict_item` VALUES (42, 14, 'refresh_token', '刷新模式', 'grant_types', 'oauth2 刷新token', 3, ' ', ' ', '2019-08-13 07:36:54', '2019-08-13 07:36:54', NULL, '0', 1); +INSERT INTO `sys_dict_item` VALUES (43, 14, 'implicit', '简化模式', 'grant_types', 'oauth2 简化模式', 4, ' ', ' ', '2019-08-13 07:39:32', '2019-08-13 07:39:32', NULL, '0', 1); +INSERT INTO `sys_dict_item` VALUES (44, 15, '0', 'Avue', 'style_type', 'Avue风格', 0, ' ', ' ', '2020-02-07 03:52:52', '2020-02-07 03:52:52', '', '0', 1); +INSERT INTO `sys_dict_item` VALUES (45, 15, '1', 'element', 'style_type', 'element-ui', 1, ' ', ' ', '2020-02-07 03:53:12', '2020-02-07 03:53:12', '', '0', 1); +INSERT INTO `sys_dict_item` VALUES (46, 16, '0', '关', 'captcha_flag_types', '不校验验证码', 0, ' ', ' ', '2020-11-18 06:53:58', '2020-11-18 06:53:58', '不校验验证码 -0', '0', 1); +INSERT INTO `sys_dict_item` VALUES (47, 16, '1', '开', 'captcha_flag_types', '校验验证码', 1, ' ', ' ', '2020-11-18 06:54:15', '2020-11-18 06:54:15', '不校验验证码-1', '0', 1); +INSERT INTO `sys_dict_item` VALUES (48, 17, '0', '否', 'enc_flag_types', '不加密', 0, ' ', ' ', '2020-11-18 06:55:31', '2020-11-18 06:55:31', '不加密-0', '0', 1); +INSERT INTO `sys_dict_item` VALUES (49, 17, '1', '是', 'enc_flag_types', '加密', 1, ' ', ' ', '2020-11-18 06:55:51', '2020-11-18 06:55:51', '加密-1', '0', 1); +INSERT INTO `sys_dict_item` VALUES (50, 13, 'MERGE_PAY', '聚合支付', 'channel_type', '聚合支付', 1, ' ', ' ', '2019-05-30 19:08:08', '2019-06-18 13:51:53', '聚合支付', '0', 1); +INSERT INTO `sys_dict_item` VALUES (51, 2, 'CAS', 'CAS登录', 'social_type', 'CAS 单点登录系统', 3, ' ', ' ', '2022-02-18 13:56:25', '2022-02-18 13:56:28', NULL, '0', 1); +INSERT INTO `sys_dict_item` VALUES (52, 2, 'DINGTALK', '钉钉', 'social_type', '钉钉', 3, ' ', ' ', '2022-02-18 13:56:25', '2022-02-18 13:56:28', NULL, '0', 1); +INSERT INTO `sys_dict_item` VALUES (53, 2, 'WEIXIN_CP', '企业微信', 'social_type', '企业微信', 3, ' ', ' ', '2022-02-18 13:56:25', '2022-02-18 13:56:28', NULL, '0', 1); +INSERT INTO `sys_dict_item` VALUES (54, 15, '2', 'APP', 'style_type', 'uview风格', 1, ' ', ' ', '2020-02-07 03:53:12', '2020-02-07 03:53:12', '', '0', 1); +INSERT INTO `sys_dict_item` VALUES (55, 13, 'ALIPAY_WAP', '支付宝支付', 'channel_type', '支付宝支付', 1, ' ', ' ', '2019-05-30 19:08:08', '2019-06-18 13:51:53', '聚合支付', '0', 1); +INSERT INTO `sys_dict_item` VALUES (56, 13, 'WEIXIN_MP', '微信支付', 'channel_type', '微信支付', 1, ' ', ' ', '2019-05-30 19:08:08', '2019-06-18 13:51:53', '聚合支付', '0', 1); +INSERT INTO `sys_dict_item` VALUES (57, 14, 'mobile', 'mobile', 'grant_types', '移动端登录', 5, 'admin', ' ', '2023-01-29 17:21:42', NULL, NULL, '0', 1); +INSERT INTO `sys_dict_item` VALUES (58, 18, '0', '有效', 'lock_flag', '有效', 0, 'admin', ' ', '2023-02-01 16:56:00', NULL, NULL, '0', 1); +INSERT INTO `sys_dict_item` VALUES (59, 18, '9', '禁用', 'lock_flag', '禁用', 1, 'admin', ' ', '2023-02-01 16:56:09', NULL, NULL, '0', 1); +INSERT INTO `sys_dict_item` VALUES (60, 15, '4', 'vue3', 'style_type', 'element-plus', 4, 'admin', ' ', '2023-02-06 13:52:43', NULL, NULL, '0', 1); +INSERT INTO `sys_dict_item` VALUES (61, 19, '0', '主机', 'ds_config_type', '主机', 0, 'admin', ' ', '2023-02-06 18:37:23', NULL, NULL, '0', 1); +INSERT INTO `sys_dict_item` VALUES (62, 19, '1', 'JDBC', 'ds_config_type', 'jdbc', 2, 'admin', ' ', '2023-02-06 18:37:34', NULL, NULL, '0', 1); +INSERT INTO `sys_dict_item` VALUES (63, 20, 'false', '否', 'common_status', '否', 1, 'admin', ' ', '2023-02-09 11:02:39', NULL, NULL, '0', 1); +INSERT INTO `sys_dict_item` VALUES (64, 20, 'true', '是', 'common_status', '是', 2, 'admin', ' ', '2023-02-09 11:02:52', NULL, NULL, '0', 1); +INSERT INTO `sys_dict_item` VALUES (65, 21, 'MINI', '小程序', 'app_social_type', '小程序登录', 0, 'admin', ' ', '2023-02-10 11:11:41', NULL, NULL, '0', 1); +INSERT INTO `sys_dict_item` VALUES (66, 22, '0', '否', 'yes_no_type', '0', 0, 'admin', ' ', '2023-02-20 23:35:23', NULL, '0', '0', 1); +INSERT INTO `sys_dict_item` VALUES (67, 22, '1', '是', 'yes_no_type', '1', 0, 'admin', ' ', '2023-02-20 23:35:37', NULL, '1', '0', 1); +INSERT INTO `sys_dict_item` VALUES (69, 23, 'text', '文本', 'repType', '文本', 0, 'admin', ' ', '2023-02-24 15:08:45', NULL, NULL, '0', 1); +INSERT INTO `sys_dict_item` VALUES (70, 23, 'image', '图片', 'repType', '图片', 0, 'admin', ' ', '2023-02-24 15:08:56', NULL, NULL, '0', 1); +INSERT INTO `sys_dict_item` VALUES (71, 23, 'voice', '语音', 'repType', '语音', 0, 'admin', ' ', '2023-02-24 15:09:08', NULL, NULL, '0', 1); +INSERT INTO `sys_dict_item` VALUES (72, 23, 'video', '视频', 'repType', '视频', 0, 'admin', ' ', '2023-02-24 15:09:18', NULL, NULL, '0', 1); +INSERT INTO `sys_dict_item` VALUES (73, 23, 'shortvideo', '小视频', 'repType', '小视频', 0, 'admin', ' ', '2023-02-24 15:09:29', NULL, NULL, '0', 1); +INSERT INTO `sys_dict_item` VALUES (74, 23, 'location', '地理位置', 'repType', '地理位置', 0, 'admin', ' ', '2023-02-24 15:09:41', NULL, NULL, '0', 1); +INSERT INTO `sys_dict_item` VALUES (75, 23, 'link', '链接消息', 'repType', '链接消息', 0, 'admin', ' ', '2023-02-24 15:09:49', NULL, NULL, '0', 1); +INSERT INTO `sys_dict_item` VALUES (76, 23, 'event', '事件推送', 'repType', '事件推送', 0, 'admin', ' ', '2023-02-24 15:09:57', NULL, NULL, '0', 1); +INSERT INTO `sys_dict_item` VALUES (77, 24, '0', '未提交', 'leave_status', '未提交', 0, 'admin', ' ', '2023-03-02 22:50:45', NULL, '未提交', '0', 1); +INSERT INTO `sys_dict_item` VALUES (78, 24, '1', '审批中', 'leave_status', '审批中', 0, 'admin', ' ', '2023-03-02 22:50:57', NULL, '审批中', '0', 1); +INSERT INTO `sys_dict_item` VALUES (79, 24, '2', '完成', 'leave_status', '完成', 0, 'admin', ' ', '2023-03-02 22:51:06', NULL, '完成', '0', 1); +INSERT INTO `sys_dict_item` VALUES (80, 24, '9', '驳回', 'leave_status', '驳回', 0, 'admin', ' ', '2023-03-02 22:51:20', NULL, NULL, '0', 1); +INSERT INTO `sys_dict_item` VALUES (81, 25, 'record', '日程记录', 'schedule_type', '日程记录', 0, 'admin', ' ', '2023-03-06 14:50:01', NULL, NULL, '0', 1); +INSERT INTO `sys_dict_item` VALUES (82, 25, 'plan', '计划', 'schedule_type', '计划类型', 0, 'admin', ' ', '2023-03-06 14:50:29', NULL, NULL, '0', 1); +INSERT INTO `sys_dict_item` VALUES (83, 26, '0', '计划中', 'schedule_status', '日程状态', 0, 'admin', ' ', '2023-03-06 14:53:18', NULL, NULL, '0', 1); +INSERT INTO `sys_dict_item` VALUES (84, 26, '1', '已开始', 'schedule_status', '已开始', 0, 'admin', ' ', '2023-03-06 14:53:33', NULL, NULL, '0', 1); +INSERT INTO `sys_dict_item` VALUES (85, 26, '3', '已结束', 'schedule_status', '已结束', 0, 'admin', ' ', '2023-03-06 14:53:41', NULL, NULL, '0', 1); +INSERT INTO `sys_dict_item` VALUES (86, 27, 'mysql', 'mysql', 'ds_type', 'mysql', 0, 'admin', ' ', '2023-03-12 09:58:11', NULL, NULL, '0', 1); +INSERT INTO `sys_dict_item` VALUES (87, 27, 'pg', 'pg', 'ds_type', 'pg', 1, 'admin', ' ', '2023-03-12 09:58:20', NULL, NULL, '0', 1); +INSERT INTO `sys_dict_item` VALUES (88, 27, 'oracle', 'oracle', 'ds_type', 'oracle', 2, 'admin', ' ', '2023-03-12 09:58:29', NULL, NULL, '0', 1); +INSERT INTO `sys_dict_item` VALUES (89, 27, 'mssql', 'mssql', 'ds_type', 'mssql', 3, 'admin', ' ', '2023-03-12 09:58:42', NULL, NULL, '0', 1); +INSERT INTO `sys_dict_item` VALUES (90, 27, 'db2', 'db2', 'ds_type', 'db2', 4, 'admin', ' ', '2023-03-12 09:58:53', NULL, NULL, '0', 1); +INSERT INTO `sys_dict_item` VALUES (91, 27, 'dm', '达梦', 'ds_type', '达梦', 5, 'admin', ' ', '2023-03-12 09:59:07', NULL, NULL, '0', 1); +INSERT INTO `sys_dict_item` VALUES (92, 27, 'highgo', '瀚高', 'ds_type', '瀚高数据库', 5, 'admin', ' ', '2023-03-12 09:59:07', NULL, NULL, '0', 1); +COMMIT; + +-- ---------------------------- +-- Table structure for sys_file +-- ---------------------------- +DROP TABLE IF EXISTS `sys_file`; +CREATE TABLE `sys_file` ( + `id` bigint(20) NOT NULL COMMENT '编号', + `group_id` bigint DEFAULT NULL COMMENT '文件组', + `file_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '文件名', + `bucket_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '文件存储桶名称', + `original` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '原始文件名', + `type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '文件类型', + `file_size` bigint(20) DEFAULT NULL COMMENT '文件大小', + `create_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ' ' COMMENT '创建人', + `update_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ' ' COMMENT '修改人', + `create_time` datetime DEFAULT NULL COMMENT '上传时间', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标志', + `tenant_id` bigint(20) DEFAULT NULL COMMENT '所属租户', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='文件管理表'; + +DROP TABLE IF EXISTS `sys_file_group`; +CREATE TABLE `sys_file_group` ( + `id` bigint unsigned NOT NULL COMMENT '主键ID', + `type` tinyint unsigned DEFAULT '10' COMMENT '类型: [10=图片, 20=视频]', + `name` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '分类名称', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标记', + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '创建人', + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '修改人', + `tenant_id` bigint DEFAULT NULL COMMENT '租户', + `pid` bigint DEFAULT NULL COMMENT '父ID', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='文件分类表'; + +-- ---------------------------- +-- Table structure for sys_i18n +-- ---------------------------- +DROP TABLE IF EXISTS `sys_i18n`; +CREATE TABLE `sys_i18n` ( + `id` bigint(20) NOT NULL COMMENT 'id', + `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'name', + `zh_cn` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '中文', + `en` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '英文', + `create_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ' ' COMMENT '创建人', + `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ' ' COMMENT '修改人', + `update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标记', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='系统表-国际化'; + +-- ---------------------------- +-- Records of sys_i18n +-- ---------------------------- +BEGIN; +INSERT INTO `sys_i18n` VALUES (1, 'router.permissionManagement', '权限管理', 'Permission Management', '', '2023-02-14 02:03:59', '', NULL, '0'); +INSERT INTO `sys_i18n` VALUES (2, 'router.userManagement', '用户管理', 'User Management', 'admin', '2023-02-14 10:39:08', '', NULL, '0'); +INSERT INTO `sys_i18n` VALUES (3, 'router.menuManagement', '菜单管理', 'Menu Management', 'admin', '2023-02-15 23:14:39', '', NULL, '0'); +INSERT INTO `sys_i18n` VALUES (4, 'router.roleManagement', '角色管理', 'Role Management', 'admin', '2023-02-15 23:15:51', '', NULL, '0'); +INSERT INTO `sys_i18n` VALUES (5, 'router.departmentManagement', '部门管理', 'Department Management', 'admin', '2023-02-15 23:16:52', '', NULL, '0'); +INSERT INTO `sys_i18n` VALUES (6, 'router.tenantManagement', '租户管理', 'Tenant Management', 'admin', '2023-02-24 10:08:29', '', NULL, '0'); +INSERT INTO `sys_i18n` VALUES (7, 'router.postManagement', '岗位管理', 'Post Management', 'admin', '2023-02-24 10:12:58', '', NULL, '0'); +INSERT INTO `sys_i18n` VALUES (8, 'router.systemManagement', '系统管理', 'System Management', 'admin', '2023-02-24 10:13:34', 'admin', '2023-02-24 10:58:30', '0'); +INSERT INTO `sys_i18n` VALUES (9, 'router.operationLog', '操作日志', 'Operation Log', 'admin', '2023-02-24 10:14:47', '', NULL, '0'); +INSERT INTO `sys_i18n` VALUES (10, 'router.dictManagement', '字典管理', 'Dictionary Management', 'admin', '2023-02-24 10:16:21', '', NULL, '0'); +INSERT INTO `sys_i18n` VALUES (11, 'router.parameterManagement', '参数管理', 'Parameter Management', 'admin', '2023-02-24 10:17:04', '', NULL, '0'); +INSERT INTO `sys_i18n` VALUES (12, 'router.codeGeneration', '代码生成', 'Code Generation', 'admin', '2023-02-24 10:19:16', '', NULL, '0'); +INSERT INTO `sys_i18n` VALUES (13, 'router.terminalManagement', '终端管理', 'Terminal Management', 'admin', '2023-02-24 10:21:45', '', NULL, '0'); +INSERT INTO `sys_i18n` VALUES (14, 'router.keyManagement', '密钥管理', 'Key Management', 'admin', '2023-02-24 10:22:52', '', NULL, '0'); +INSERT INTO `sys_i18n` VALUES (15, 'router.tokenManagement', '令牌管理', 'Token Management', 'admin', '2023-02-24 10:23:22', '', NULL, '0'); +INSERT INTO `sys_i18n` VALUES (16, 'router.quartzManagement', 'Quartz管理', 'Quartz Management', 'admin', '2023-02-24 10:24:32', '', NULL, '0'); +INSERT INTO `sys_i18n` VALUES (17, 'router.metadataManagement', '元数据管理', 'Metadata Management', 'admin', '2023-02-24 10:25:11', '', NULL, '0'); +INSERT INTO `sys_i18n` VALUES (18, 'router.documentExtension', '文档扩展', 'Document Extension', 'admin', '2023-02-24 10:27:23', '', NULL, '0'); +INSERT INTO `sys_i18n` VALUES (19, 'router.fileManagement', '文件管理', 'File Management', 'admin', '2023-02-24 10:28:44', '', NULL, '0'); +INSERT INTO `sys_i18n` VALUES (20, 'router.platformDevelopment', '开发平台', 'Platform Development', 'admin', '2023-02-24 10:29:28', '', NULL, '0'); +INSERT INTO `sys_i18n` VALUES (21, 'router.dataSourceManagement', '数据源管理', 'Data Source Management', 'admin', '2023-02-24 10:30:33', 'admin', '2023-03-06 14:33:20', '0'); +INSERT INTO `sys_i18n` VALUES (22, 'router.formDesign', '表单设计', 'Form Design', 'admin', '2023-02-24 10:31:33', 'admin', '2023-03-06 14:33:28', '0'); +INSERT INTO `sys_i18n` VALUES (23, 'router.appManagement', 'APP管理', 'App Management', 'admin', '2023-02-24 10:33:22', '', NULL, '0'); +INSERT INTO `sys_i18n` VALUES (24, 'router.customerManagement', '客户管理', 'Customer Management', 'admin', '2023-02-24 10:35:30', '', NULL, '0'); +INSERT INTO `sys_i18n` VALUES (25, 'router.appRole', 'APP角色', 'App Role', 'admin', '2023-02-24 10:36:17', '', NULL, '0'); +INSERT INTO `sys_i18n` VALUES (26, 'router.appPermission', 'APP权限', 'App Permission', 'admin', '2023-02-24 10:36:59', 'admin', '2023-02-24 10:37:47', '0'); +INSERT INTO `sys_i18n` VALUES (27, 'router.appKey', 'APP秘钥', 'App Key', 'admin', '2023-02-24 10:36:59', 'admin', '2023-02-24 10:40:27', '0'); +INSERT INTO `sys_i18n` VALUES (28, 'router.internationalizationManagement', '国际化管理', 'Internationalization Management', 'admin', '2023-02-24 10:36:59', '', NULL, '0'); +INSERT INTO `sys_i18n` VALUES (29, 'router.auditLog', '审计日志', 'Audit Log', 'admin', '2023-02-24 10:36:59', '', NULL, '0'); +INSERT INTO `sys_i18n` VALUES (30, 'router.systemMonitoring', '系统监控', 'System Monitoring', 'admin', '2023-02-24 10:36:59', '', NULL, '0'); +INSERT INTO `sys_i18n` VALUES (31, 'router.generatePages', '生成页面', 'Generate Pages', 'admin', '2023-02-24 10:44:04', '', NULL, '0'); +INSERT INTO `sys_i18n` VALUES (32, 'router.templateManagement', '模板管理', 'Template Management', 'admin', '2023-02-24 10:44:31', '', NULL, '0'); +INSERT INTO `sys_i18n` VALUES (33, 'router.templateGroup', '模板分组', 'Template Group', 'admin', '2023-02-24 10:45:10', '', NULL, '0'); +INSERT INTO `sys_i18n` VALUES (34, 'router.fieldManagement', '字段管理', 'Field Management', 'admin', '2023-02-24 10:46:04', 'admin', '2023-03-07 14:27:48', '0'); +INSERT INTO `sys_i18n` VALUES (35, 'router.wechatPlatform', '公众号平台', 'WeChat Platform', 'admin', '2023-02-24 10:48:51', 'admin', '2023-02-24 11:03:41', '0'); +INSERT INTO `sys_i18n` VALUES (36, 'router.accountManagement', '账号管理', 'Account Management', 'admin', '2023-02-24 10:13:34', '', NULL, '0'); +INSERT INTO `sys_i18n` VALUES (37, 'router.menuSettings', '菜单设置', 'Menu Settings', 'admin', '2023-02-24 14:02:22', '', NULL, '0'); +INSERT INTO `sys_i18n` VALUES (38, 'router.fanManagement', '粉丝管理', 'Fan Management', 'admin', '2023-02-24 14:03:44', '', NULL, '0'); +INSERT INTO `sys_i18n` VALUES (39, 'router.messageManagement', '消息管理', 'Message Management', 'admin', '2023-02-24 14:03:45', '', NULL, '0'); +INSERT INTO `sys_i18n` VALUES (40, 'router.paymentSystem', '支付系统', 'Payment System', 'admin', '2023-02-24 14:03:46', '', NULL, '0'); +INSERT INTO `sys_i18n` VALUES (41, 'router.checkoutCounter', '收银台', 'Checkout Counter', 'admin', '2023-02-24 14:03:47', '', NULL, '0'); +INSERT INTO `sys_i18n` VALUES (42, 'router.mediaManagement', '素材管理', 'Media Management', 'admin', '2023-02-24 14:03:48', '', NULL, '0'); +INSERT INTO `sys_i18n` VALUES (43, 'router.paymentChannel', '支付渠道', 'Payment Channel', 'admin', '2023-02-24 14:03:49', '', NULL, '0'); +INSERT INTO `sys_i18n` VALUES (44, 'router.productOrder', '商品订单', 'Product Order', 'admin', '2023-02-24 14:03:50', '', NULL, '0'); +INSERT INTO `sys_i18n` VALUES (45, 'router.notificationRecord', '通知记录', 'Notification Record', 'admin', '2023-02-24 14:03:51', '', NULL, '0'); +INSERT INTO `sys_i18n` VALUES (46, 'router.refundOrder', '退款订单', 'Refund Order', 'admin', '2023-02-24 14:03:52', '', NULL, '0'); +INSERT INTO `sys_i18n` VALUES (47, 'router.paymentOrder', '支付订单', 'Payment Order', 'admin', '2023-02-24 14:03:53', '', NULL, '0'); +INSERT INTO `sys_i18n` VALUES (48, 'router.autoReply', '自动回复', 'Auto Reply', 'admin', '2023-02-24 14:03:54', '', NULL, '0'); +INSERT INTO `sys_i18n` VALUES (49, 'router.operationalData', '运营数据', 'Operational Data', 'admin', '2023-02-24 14:03:55', '', NULL, '0'); +INSERT INTO `sys_i18n` VALUES (50, 'router.logManagement', '日志管理', 'Log Management', 'admin', NULL, '', NULL, '0'); +INSERT INTO `sys_i18n` VALUES (51, 'router.collaborativeOffice', '协同办公', 'Collaborative Office', 'admin', NULL, '', NULL, '0'); +INSERT INTO `sys_i18n` VALUES (52, 'router.modelManagement', '模型管理', 'Model Management', 'admin', NULL, '', NULL, '0'); +INSERT INTO `sys_i18n` VALUES (53, 'router.modelDiagramView', '模型图查看', 'Model Diagram View', 'admin', NULL, '', NULL, '0'); +INSERT INTO `sys_i18n` VALUES (54, 'router.processManagement', '流程管理', 'Process Management', 'admin', NULL, '', NULL, '0'); +INSERT INTO `sys_i18n` VALUES (55, 'router.leaveWorkOrder', '请假工单', 'Leave Work Order', 'admin', NULL, '', NULL, '0'); +INSERT INTO `sys_i18n` VALUES (56, 'router.todoTask', '代办任务', 'Todo Task', 'admin', NULL, '', NULL, '0'); +INSERT INTO `sys_i18n` VALUES (57, 'router.tagManagement', '标签管理', 'Tag Management', 'admin', NULL, '', NULL, '0'); +INSERT INTO `sys_i18n` VALUES (58, 'router.articleInformation\n', '文章资讯', 'Article Information', ' ', '2023-08-10 13:40:09', ' ', NULL, '0'); +INSERT INTO `sys_i18n` VALUES (59, 'router.articleCategory', '文章分类', 'Article Category', ' ', '2023-08-10 13:40:48', ' ', NULL, '0'); +INSERT INTO `sys_i18n` VALUES (60, 'router.interfaceSettings', '界面设置', 'Interface Settings', ' ', '2023-08-10 13:41:21', ' ', NULL, '0'); +INSERT INTO `sys_i18n` VALUES (61, 'router.bottomNavigation\n', '底部导航', 'Bottom Navigation', ' ', '2023-08-10 13:41:54', ' ', NULL, '0'); +INSERT INTO `sys_i18n` VALUES (62, 'router.cacheMonitoring\n', '缓存监控', 'Cache Monitoring', ' ', '2023-08-10 13:42:35', ' ', NULL, '0'); +INSERT INTO `sys_i18n` VALUES (63, 'rotuer. initiateProcess', '发起流程', 'Initiate Process\n', ' ', '2023-08-10 13:44:23', ' ', NULL, '0'); +INSERT INTO `sys_i18n` VALUES (64, 'router.taskManagement\n', '任务管理', 'Task Management', ' ', '2023-08-10 13:44:53', ' ', NULL, '0'); +INSERT INTO `sys_i18n` VALUES (65, 'router.myInitiations', '我的发起', 'My Initiations', ' ', '2023-08-10 13:45:17', ' ', NULL, '0'); +INSERT INTO `sys_i18n` VALUES (66, 'router.copiedtoMe\n', '抄送给我', 'Copied to Me', ' ', '2023-08-10 13:45:46', ' ', NULL, '0'); +INSERT INTO `sys_i18n` VALUES (67, 'router.completedTasks\n', '我的已办', 'Completed Tasks', ' ', '2023-08-10 13:46:37', ' ', '2023-08-10 13:47:09', '0'); +INSERT INTO `sys_i18n` VALUES (68, 'router.createFlow', '创建流程', 'Create Flow', ' ', '2023-08-10 13:46:37', ' ', '2023-08-10 13:47:09', '0'); +COMMIT; + +-- ---------------------------- +-- Table structure for sys_log +-- ---------------------------- +DROP TABLE IF EXISTS `sys_log`; +CREATE TABLE `sys_log` ( + `id` bigint(20) NOT NULL COMMENT '编号', + `log_type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '日志类型', + `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '日志标题', + `service_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '服务ID', + `create_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ' ' COMMENT '创建人', + `update_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ' ' COMMENT '修改人', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + `remote_addr` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '远程地址', + `user_agent` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '用户代理', + `request_uri` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '请求URI', + `method` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '请求方法', + `params` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '请求参数', + `time` bigint(20) DEFAULT NULL COMMENT '执行时间', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标志', + `exception` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '异常信息', + `tenant_id` bigint(20) DEFAULT '0' COMMENT '所属租户', + PRIMARY KEY (`id`) USING BTREE, + KEY `sys_log_request_uri` (`request_uri`) USING BTREE, + KEY `sys_log_type` (`log_type`) USING BTREE, + KEY `sys_log_create_date` (`create_time`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='日志表'; + +-- ---------------------------- +-- Records of sys_log +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for sys_menu +-- ---------------------------- +DROP TABLE IF EXISTS `sys_menu`; +CREATE TABLE `sys_menu` ( + `menu_id` bigint(20) NOT NULL COMMENT '菜单ID', + `name` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '菜单名称', + `permission` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '权限标识', + `path` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '路由路径', + `parent_id` bigint(20) DEFAULT NULL COMMENT '父菜单ID', + `icon` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '菜单图标', + `visible` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '1' COMMENT '是否可见,0隐藏,1显示', + `sort_order` int(11) DEFAULT '1' COMMENT '排序值,越小越靠前', + `keep_alive` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '是否缓存,0否,1是', + `embedded` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '是否内嵌,0否,1是', + `menu_type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '菜单类型,0目录,1菜单,2按钮', + `create_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ' ' COMMENT '创建人', + `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ' ' COMMENT '修改人', + `update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标志,0未删除,1已删除', + `tenant_id` bigint(20) unsigned DEFAULT NULL COMMENT '租户ID', + PRIMARY KEY (`menu_id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='菜单权限表'; + +-- ---------------------------- +-- Records of sys_menu +-- ---------------------------- +BEGIN; +INSERT INTO `sys_menu` VALUES (1000, '权限管理', NULL, '/admin', -1, 'iconfont icon-icon-', '1', 0, '0', '0', '0', '', '2018-09-28 08:29:53', 'admin', '2023-03-12 22:32:52', '0', 1); +INSERT INTO `sys_menu` VALUES (1100, '用户管理', NULL, '/admin/user/index', 1000, 'ele-User', '1', 1, '0', '0', '0', '', '2017-11-02 22:24:37', 'admin', '2023-03-12 22:32:59', '0', 1); +INSERT INTO `sys_menu` VALUES (1101, '用户新增', 'sys_user_add', NULL, 1100, NULL, '1', 1, '0', NULL, '1', ' ', '2017-11-08 09:52:09', ' ', '2021-05-25 03:12:55', '0', 1); +INSERT INTO `sys_menu` VALUES (1102, '用户修改', 'sys_user_edit', NULL, 1100, NULL, '1', 1, '0', NULL, '1', ' ', '2017-11-08 09:52:48', ' ', '2021-05-25 03:12:55', '0', 1); +INSERT INTO `sys_menu` VALUES (1103, '用户删除', 'sys_user_del', NULL, 1100, NULL, '1', 1, '0', NULL, '1', ' ', '2017-11-08 09:54:01', ' ', '2021-05-25 03:12:55', '0', 1); +INSERT INTO `sys_menu` VALUES (1104, '导入导出', 'sys_user_export', NULL, 1100, NULL, '1', 1, '0', NULL, '1', ' ', '2017-11-08 09:54:01', ' ', '2021-05-25 03:12:55', '0', 1); +INSERT INTO `sys_menu` VALUES (1200, '菜单管理', NULL, '/admin/menu/index', 1000, 'iconfont icon-caidan', '1', 2, '0', '0', '0', '', '2017-11-08 09:57:27', 'admin', '2023-03-29 19:15:25', '0', 1); +INSERT INTO `sys_menu` VALUES (1201, '菜单新增', 'sys_menu_add', NULL, 1200, NULL, '1', 1, '0', NULL, '1', ' ', '2017-11-08 10:15:53', ' ', '2021-05-25 03:12:55', '0', 1); +INSERT INTO `sys_menu` VALUES (1202, '菜单修改', 'sys_menu_edit', NULL, 1200, NULL, '1', 1, '0', NULL, '1', ' ', '2017-11-08 10:16:23', ' ', '2021-05-25 03:12:55', '0', 1); +INSERT INTO `sys_menu` VALUES (1203, '菜单删除', 'sys_menu_del', NULL, 1200, NULL, '1', 1, '0', NULL, '1', ' ', '2017-11-08 10:16:43', ' ', '2021-05-25 03:12:55', '0', 1); +INSERT INTO `sys_menu` VALUES (1300, '角色管理', NULL, '/admin/role/index', 1000, 'iconfont icon-gerenzhongxin', '1', 3, '0', NULL, '0', '', '2017-11-08 10:13:37', 'admin', '2023-02-16 15:21:31', '0', 1); +INSERT INTO `sys_menu` VALUES (1301, '角色新增', 'sys_role_add', NULL, 1300, NULL, '1', 1, '0', NULL, '1', ' ', '2017-11-08 10:14:18', ' ', '2021-05-25 03:12:55', '0', 1); +INSERT INTO `sys_menu` VALUES (1302, '角色修改', 'sys_role_edit', NULL, 1300, NULL, '1', 1, '0', NULL, '1', ' ', '2017-11-08 10:14:41', ' ', '2021-05-25 03:12:55', '0', 1); +INSERT INTO `sys_menu` VALUES (1303, '角色删除', 'sys_role_del', NULL, 1300, NULL, '1', 1, '0', NULL, '1', ' ', '2017-11-08 10:14:59', ' ', '2021-05-25 03:12:55', '0', 1); +INSERT INTO `sys_menu` VALUES (1304, '分配权限', 'sys_role_perm', NULL, 1300, NULL, '1', 1, '0', NULL, '1', ' ', '2018-04-20 07:22:55', ' ', '2021-05-25 03:12:55', '0', 1); +INSERT INTO `sys_menu` VALUES (1305, '角色导入导出', 'sys_role_export', NULL, 1300, NULL, '1', 4, '0', NULL, '1', ' ', '2022-03-26 15:54:34', ' ', NULL, '0', 1); +INSERT INTO `sys_menu` VALUES (1400, '部门管理', NULL, '/admin/dept/index', 1000, 'iconfont icon-zidingyibuju', '1', 4, '0', NULL, '0', '', '2018-01-20 13:17:19', 'admin', '2023-02-16 15:21:45', '0', 1); +INSERT INTO `sys_menu` VALUES (1401, '部门新增', 'sys_dept_add', NULL, 1400, NULL, '1', 1, '0', NULL, '1', ' ', '2018-01-20 14:56:16', ' ', '2021-05-25 03:12:55', '0', 1); +INSERT INTO `sys_menu` VALUES (1402, '部门修改', 'sys_dept_edit', NULL, 1400, NULL, '1', 1, '0', NULL, '1', ' ', '2018-01-20 14:56:59', ' ', '2021-05-25 03:12:55', '0', 1); +INSERT INTO `sys_menu` VALUES (1403, '部门删除', 'sys_dept_del', NULL, 1400, NULL, '1', 1, '0', NULL, '1', ' ', '2018-01-20 14:57:28', ' ', '2021-05-25 03:12:55', '0', 1); +INSERT INTO `sys_menu` VALUES (1404, '开放互联', 'sys_connect_sync', NULL, 1400, NULL, '1', 1, '0', NULL, '1', ' ', '2018-01-20 14:57:28', ' ', '2021-05-25 03:12:55', '0', 1); +INSERT INTO `sys_menu` VALUES (1500, '租户管理', NULL, '/admin/tenant/index', 1000, 'iconfont icon-shuxingtu', '1', 9, '0', '0', '0', '', '2018-01-20 13:17:19', 'admin', '2023-03-07 13:32:15', '0', 1); +INSERT INTO `sys_menu` VALUES (1501, '租户新增', 'sys_systenant_add', NULL, 1500, '1', '1', 0, '0', NULL, '1', ' ', '2018-05-15 21:35:18', ' ', '2020-03-24 08:56:52', '0', 1); +INSERT INTO `sys_menu` VALUES (1502, '租户修改', 'sys_systenant_edit', NULL, 1500, '1', '1', 1, '0', NULL, '1', ' ', '2018-05-15 21:35:18', ' ', '2020-03-24 08:56:53', '0', 1); +INSERT INTO `sys_menu` VALUES (1503, '租户删除', 'sys_systenant_del', NULL, 1500, '1', '1', 2, '0', NULL, '1', ' ', '2018-05-15 21:35:18', ' ', '2020-03-24 08:56:54', '0', 1); +INSERT INTO `sys_menu` VALUES (1504, '租户套餐', 'sys_systenant_tenantmenu', NULL, 1500, '1', '1', 1, '0', NULL, '1', 'admin', '2022-12-12 09:01:41', ' ', '2023-01-11 05:52:51', '0', 1); +INSERT INTO `sys_menu` VALUES (1505, '租户套餐删除', 'sys_systenantmenu_del', NULL, 1500, '1', '1', 1, '0', NULL, '1', 'admin', '2022-12-09 14:04:19', 'admin', '2023-01-11 05:52:51', '0', 1); +INSERT INTO `sys_menu` VALUES (1506, '租户套餐编辑', 'sys_systenantmenu_edit', NULL, 1500, '1', '1', 1, '0', NULL, '1', 'admin', '2022-12-09 14:04:19', 'admin', '2023-01-11 05:52:51', '0', 1); +INSERT INTO `sys_menu` VALUES (1507, '租户套餐新增', 'sys_systenantmenu_add', NULL, 1500, '1', '1', 1, '0', NULL, '1', 'admin', '2022-12-09 14:04:19', 'admin', '2022-12-12 09:02:00', '0', 1); +INSERT INTO `sys_menu` VALUES (1508, '租户套餐导出', 'sys_systenant_export', NULL, 1500, NULL, '1', 0, '0', '0', '1', 'admin', '2023-03-06 16:28:24', ' ', NULL, '0', 1); +INSERT INTO `sys_menu` VALUES (1600, '岗位管理', NULL, '/admin/post/index', 1000, 'iconfont icon--chaifenhang', '1', 5, '1', '0', '0', '', '2022-03-26 13:04:14', 'admin', '2023-03-07 13:32:25', '0', 1); +INSERT INTO `sys_menu` VALUES (1601, '岗位信息查看', 'sys_post_view', NULL, 1600, NULL, '1', 0, '0', NULL, '1', ' ', '2022-03-26 13:05:34', ' ', NULL, '0', 1); +INSERT INTO `sys_menu` VALUES (1602, '岗位信息新增', 'sys_post_add', NULL, 1600, NULL, '1', 1, '0', NULL, '1', ' ', '2022-03-26 13:06:00', ' ', NULL, '0', 1); +INSERT INTO `sys_menu` VALUES (1603, '岗位信息修改', 'sys_post_edit', NULL, 1600, NULL, '1', 2, '0', NULL, '1', ' ', '2022-03-26 13:06:31', ' ', '2022-03-26 13:06:38', '0', 1); +INSERT INTO `sys_menu` VALUES (1604, '岗位信息删除', 'sys_post_del', NULL, 1600, NULL, '1', 3, '0', NULL, '1', ' ', '2022-03-26 13:06:31', ' ', NULL, '0', 1); +INSERT INTO `sys_menu` VALUES (1605, '岗位导入导出', 'sys_post_export', NULL, 1600, NULL, '1', 4, '0', NULL, '1', ' ', '2022-03-26 13:06:31', ' ', '2022-03-26 06:32:02', '0', 1); +INSERT INTO `sys_menu` VALUES (2000, '系统管理', NULL, '/system', -1, 'iconfont icon-quanjushezhi_o', '1', 1, '0', NULL, '0', '', '2017-11-07 20:56:00', 'admin', '2023-02-16 15:15:56', '0', 1); +INSERT INTO `sys_menu` VALUES (2001, '日志管理', NULL, '/admin/logs', 2000, 'ele-Cloudy', '1', 0, '0', '0', '0', 'admin', '2023-03-02 12:26:42', 'admin', '2023-03-02 12:28:35', '0', 1); +INSERT INTO `sys_menu` VALUES (2100, '操作日志', NULL, '/admin/log/index', 2001, 'iconfont icon-jinridaiban', '1', 2, '0', '0', '0', '', '2017-11-20 14:06:22', 'admin', '2023-03-02 12:28:57', '0', 1); +INSERT INTO `sys_menu` VALUES (2101, '日志删除', 'sys_log_del', NULL, 2100, NULL, '1', 1, '0', NULL, '1', ' ', '2017-11-20 20:37:37', ' ', '2021-05-25 03:12:55', '0', 1); +INSERT INTO `sys_menu` VALUES (2102, '导入导出', 'sys_log_export', NULL, 2100, NULL, '1', 1, '0', NULL, '1', ' ', '2017-11-08 09:54:01', ' ', '2021-05-25 03:12:55', '0', 1); +INSERT INTO `sys_menu` VALUES (2103, '审计日志', NULL, '/admin/audit/index', 2001, 'iconfont icon-biaodan', '1', 1, '0', '0', '0', '', NULL, 'admin', '2023-03-02 12:28:47', '0', 1); +INSERT INTO `sys_menu` VALUES (2104, '审计记录表删除', 'sys_audit_del', NULL, 2103, '1', '1', 3, '0', NULL, '1', '', NULL, 'admin', '2023-02-28 20:23:43', '0', 1); +INSERT INTO `sys_menu` VALUES (2105, '导入导出', 'sys_audit_export', NULL, 2103, '1', '1', 3, '0', NULL, '1', '', NULL, 'admin', '2023-02-28 20:23:51', '0', 1); +INSERT INTO `sys_menu` VALUES (2200, '字典管理', NULL, '/admin/dict/index', 2000, 'iconfont icon-zhongduancanshuchaxun', '1', 6, '0', NULL, '0', '', '2017-11-29 11:30:52', 'admin', '2023-02-16 15:24:29', '0', 1); +INSERT INTO `sys_menu` VALUES (2201, '字典删除', 'sys_dict_del', NULL, 2200, NULL, '1', 1, '0', NULL, '1', ' ', '2017-11-29 11:30:11', ' ', '2021-05-25 03:12:55', '0', 1); +INSERT INTO `sys_menu` VALUES (2202, '字典新增', 'sys_dict_add', NULL, 2200, NULL, '1', 1, '0', NULL, '1', ' ', '2018-05-11 22:34:55', ' ', '2021-05-25 03:12:55', '0', 1); +INSERT INTO `sys_menu` VALUES (2203, '字典修改', 'sys_dict_edit', NULL, 2200, NULL, '1', 1, '0', NULL, '1', ' ', '2018-05-11 22:36:03', ' ', '2021-05-25 03:12:55', '0', 1); +INSERT INTO `sys_menu` VALUES (2210, '参数管理', NULL, '/admin/param/index', 2000, 'iconfont icon-wenducanshu-05', '1', 7, '1', NULL, '0', '', '2019-04-29 22:16:50', 'admin', '2023-02-16 15:24:51', '0', 1); +INSERT INTO `sys_menu` VALUES (2211, '参数新增', 'sys_syspublicparam_add', NULL, 2210, NULL, '1', 1, '0', NULL, '1', ' ', '2019-04-29 22:17:36', ' ', '2020-03-24 08:57:11', '0', 1); +INSERT INTO `sys_menu` VALUES (2212, '参数删除', 'sys_syspublicparam_del', NULL, 2210, NULL, '1', 1, '0', NULL, '1', ' ', '2019-04-29 22:17:55', ' ', '2020-03-24 08:57:12', '0', 1); +INSERT INTO `sys_menu` VALUES (2213, '参数编辑', 'sys_syspublicparam_edit', NULL, 2210, NULL, '1', 1, '0', NULL, '1', ' ', '2019-04-29 22:18:14', ' ', '2020-03-24 08:57:13', '0', 1); +INSERT INTO `sys_menu` VALUES (2300, '代码生成', NULL, '/gen/table/index', 9000, 'iconfont icon-zhongduancanshu', '1', 1, '0', '0', '0', '', '2018-01-20 13:17:19', 'admin', '2023-02-20 13:54:35', '0', 1); +INSERT INTO `sys_menu` VALUES (2400, '终端管理', NULL, '/admin/client/index', 2000, 'iconfont icon-gongju', '1', 9, '1', NULL, '0', '', '2018-01-20 13:17:19', 'admin', '2023-02-16 15:25:28', '0', 1); +INSERT INTO `sys_menu` VALUES (2401, '客户端新增', 'sys_client_add', NULL, 2400, '1', '1', 1, '0', NULL, '1', ' ', '2018-05-15 21:35:18', ' ', '2021-05-25 03:12:55', '0', 1); +INSERT INTO `sys_menu` VALUES (2402, '客户端修改', 'sys_client_edit', NULL, 2400, NULL, '1', 1, '0', NULL, '1', ' ', '2018-05-15 21:37:06', ' ', '2021-05-25 03:12:55', '0', 1); +INSERT INTO `sys_menu` VALUES (2403, '客户端删除', 'sys_client_del', NULL, 2400, NULL, '1', 1, '0', NULL, '1', ' ', '2018-05-15 21:39:16', ' ', '2021-05-25 03:12:55', '0', 1); +INSERT INTO `sys_menu` VALUES (2500, '密钥管理', NULL, '/admin/social/index', 2000, 'iconfont icon-quanxian', '1', 10, '0', NULL, '0', '', '2018-01-20 13:17:19', 'admin', '2023-02-16 15:26:16', '0', 1); +INSERT INTO `sys_menu` VALUES (2501, '密钥新增', 'sys_social_details_add', NULL, 2500, '1', '1', 0, '0', NULL, '1', ' ', '2018-05-15 21:35:18', ' ', '2020-03-24 08:57:19', '0', 1); +INSERT INTO `sys_menu` VALUES (2502, '密钥修改', 'sys_social_details_edit', NULL, 2500, '1', '1', 1, '0', NULL, '1', ' ', '2018-05-15 21:35:18', ' ', '2020-03-24 08:57:19', '0', 1); +INSERT INTO `sys_menu` VALUES (2503, '密钥删除', 'sys_social_details_del', NULL, 2500, '1', '1', 2, '0', NULL, '1', ' ', '2018-05-15 21:35:18', ' ', '2020-03-24 08:57:23', '0', 1); +INSERT INTO `sys_menu` VALUES (2600, '令牌管理', NULL, '/admin/token/index', 2000, 'ele-Key', '1', 11, '0', NULL, '0', '', '2018-09-04 05:58:41', 'admin', '2023-02-16 15:28:28', '0', 1); +INSERT INTO `sys_menu` VALUES (2601, '令牌删除', 'sys_token_del', NULL, 2600, NULL, '1', 1, '0', NULL, '1', ' ', '2018-09-04 05:59:50', ' ', '2020-03-24 08:57:24', '0', 1); +INSERT INTO `sys_menu` VALUES (2800, 'Quartz管理', NULL, '/daemon/job-manage/index', 2000, 'ele-AlarmClock', '1', 8, '0', NULL, '0', '', '2018-01-20 13:17:19', 'admin', '2023-02-16 15:25:06', '0', 1); +INSERT INTO `sys_menu` VALUES (2810, '任务新增', 'job_sys_job_add', NULL, 2800, '1', '1', 0, '0', NULL, '1', ' ', '2018-05-15 21:35:18', ' ', '2020-03-24 08:57:26', '0', 1); +INSERT INTO `sys_menu` VALUES (2820, '任务修改', 'job_sys_job_edit', NULL, 2800, '1', '1', 0, '0', NULL, '1', ' ', '2018-05-15 21:35:18', ' ', '2020-03-24 08:57:27', '0', 1); +INSERT INTO `sys_menu` VALUES (2830, '任务删除', 'job_sys_job_del', NULL, 2800, '1', '1', 0, '0', NULL, '1', ' ', '2018-05-15 21:35:18', ' ', '2020-03-24 08:57:28', '0', 1); +INSERT INTO `sys_menu` VALUES (2840, '任务暂停', 'job_sys_job_shutdown_job', NULL, 2800, '1', '1', 0, '0', NULL, '1', ' ', '2018-05-15 21:35:18', ' ', '2020-03-24 08:57:28', '0', 1); +INSERT INTO `sys_menu` VALUES (2850, '任务开始', 'job_sys_job_start_job', NULL, 2800, '1', '1', 0, '0', NULL, '1', ' ', '2018-05-15 21:35:18', ' ', '2020-03-24 08:57:29', '0', 1); +INSERT INTO `sys_menu` VALUES (2860, '任务刷新', 'job_sys_job_refresh_job', NULL, 2800, '1', '1', 0, '0', NULL, '1', ' ', '2018-05-15 21:35:18', ' ', '2020-03-24 08:57:30', '0', 1); +INSERT INTO `sys_menu` VALUES (2870, '执行任务', 'job_sys_job_run_job', NULL, 2800, '1', '1', 0, '0', NULL, '1', ' ', '2019-08-08 15:35:18', ' ', '2020-03-24 08:57:31', '0', 1); +INSERT INTO `sys_menu` VALUES (2871, '导出', 'job_sys_job_export', NULL, 2800, NULL, '1', 0, '0', '0', '1', 'admin', '2023-03-06 15:26:13', ' ', NULL, '0', 1); +INSERT INTO `sys_menu` VALUES (2900, '国际化管理', NULL, '/admin/i18n/index', 2000, 'iconfont icon-zhongyingzhuanhuan', '1', 8, '0', NULL, '0', '', NULL, 'admin', '2023-02-16 15:25:18', '0', 1); +INSERT INTO `sys_menu` VALUES (2901, '系统表-国际化查看', 'sys_i18n_view', NULL, 2900, '1', '1', 0, '0', NULL, '1', ' ', NULL, ' ', NULL, '0', 1); +INSERT INTO `sys_menu` VALUES (2902, '系统表-国际化新增', 'sys_i18n_add', NULL, 2900, '1', '1', 1, '0', NULL, '1', ' ', NULL, ' ', NULL, '0', 1); +INSERT INTO `sys_menu` VALUES (2903, '系统表-国际化修改', 'sys_i18n_edit', NULL, 2900, '1', '1', 2, '0', NULL, '1', ' ', NULL, ' ', NULL, '0', 1); +INSERT INTO `sys_menu` VALUES (2904, '系统表-国际化删除', 'sys_i18n_del', NULL, 2900, '1', '1', 3, '0', NULL, '1', ' ', NULL, ' ', NULL, '0', 1); +INSERT INTO `sys_menu` VALUES (2905, '导入导出', 'sys_i18n_export', NULL, 2900, '1', '1', 3, '0', NULL, '1', ' ', NULL, ' ', NULL, '0', 1); +INSERT INTO `sys_menu` VALUES (2906, '文件管理', NULL, '/admin/file/index', 2000, 'ele-Files', '1', 6, '0', NULL, '0', '', '2019-06-25 12:44:46', 'admin', '2023-02-16 15:24:42', '0', 1); +INSERT INTO `sys_menu` VALUES (2907, '删除文件', 'sys_file_del', NULL, 2906, NULL, '1', 1, '0', NULL, '1', ' ', '2019-06-25 13:41:41', ' ', '2020-03-24 08:58:42', '0', 1); +INSERT INTO `sys_menu` VALUES (2908, '路由管理', NULL, '/ext/route', 2000, 'iconfont icon-diqiu1', '1', 12, '0', NULL, '0', '', '2019-06-25 12:44:46', 'admin', '2023-02-16 15:24:42', '0', 1); +INSERT INTO `sys_menu` VALUES (3000, '公众号平台', NULL, '/mp', -1, 'iconfont icon-zhongyingzhuanhuan', '1', 10, '0', '0', '0', 'admin', '2023-02-24 10:40:44', 'admin', '2023-03-06 10:05:21', '0', 1); +INSERT INTO `sys_menu` VALUES (3001, '账号管理', NULL, '/mp/wx-account/index', 3000, 'iconfont icon-putong', '1', 0, '0', '0', '0', 'admin', '2023-02-24 10:43:03', ' ', NULL, '0', 1); +INSERT INTO `sys_menu` VALUES (3002, '菜单设置', NULL, '/mp/wx-menu/index', 3000, 'iconfont icon--chaifenlie', '1', 1, '0', '0', '0', 'admin', '2023-02-24 11:16:32', 'admin', '2023-03-11 16:28:56', '0', 1); +INSERT INTO `sys_menu` VALUES (3003, '删除', 'mp_wxaccount_del', NULL, 3001, NULL, '0', 0, '0', '0', '1', 'admin', '2023-02-24 13:12:53', ' ', NULL, '0', 1); +INSERT INTO `sys_menu` VALUES (3004, '新增', 'mp_wxaccount_add', NULL, 3001, NULL, '0', 0, '0', '0', '1', 'admin', '2023-02-24 13:13:04', ' ', NULL, '0', 1); +INSERT INTO `sys_menu` VALUES (3005, '编辑', 'mp_wxaccount_edit', NULL, 3001, NULL, '0', 0, '0', '0', '1', 'admin', '2023-02-24 13:13:15', ' ', NULL, '0', 1); +INSERT INTO `sys_menu` VALUES (3006, '粉丝管理', NULL, '/mp/wx-account-fans/index', 3000, 'iconfont icon-tongzhi3', '1', 2, '0', '0', '0', 'admin', '2023-02-24 13:28:24', 'admin', '2023-03-11 16:29:03', '0', 1); +INSERT INTO `sys_menu` VALUES (3007, '同步粉丝', 'mp_wxaccountfans_sync', NULL, 3006, NULL, '0', 0, '0', '0', '1', 'admin', '2023-02-24 14:03:03', ' ', NULL, '0', 1); +INSERT INTO `sys_menu` VALUES (3008, '消息管理', NULL, '/mp/wx-fans-msg/index', 3000, 'iconfont icon-tongzhi3', '1', 6, '0', '0', '0', 'admin', '2023-02-24 15:24:35', 'admin', '2023-03-11 16:32:38', '0', 1); +INSERT INTO `sys_menu` VALUES (3009, '修改微信消息', 'mp_wxmsg_edit', '/mp/wx-account-tag/index', 3008, NULL, '1', 0, '0', '0', '1', 'admin', '2023-02-24 15:41:55', 'admin', '2023-03-01 17:12:44', '0', 1); +INSERT INTO `sys_menu` VALUES (3010, '标签管理', NULL, '/mp/wx-account-tag/index', 3000, 'iconfont icon-zidingyibuju', '1', 3, '0', '0', '0', 'admin', '2023-03-03 09:49:07', 'admin', '2023-03-11 08:32:00', '0', 1); +INSERT INTO `sys_menu` VALUES (3011, '新增标签', 'mp_wx_account_tag_add', NULL, 3010, NULL, '1', 0, '0', '0', '1', 'admin', '2023-03-03 09:49:26', 'admin', '2023-04-07 02:10:27', '0', 1); +INSERT INTO `sys_menu` VALUES (3012, '编辑标签', 'mp_wx_account_tag_edit', NULL, 3010, NULL, '1', 0, '0', '0', '1', 'admin', '2023-03-03 09:49:35', 'admin', '2023-04-07 02:10:25', '0', 1); +INSERT INTO `sys_menu` VALUES (3013, '标签删除', 'mp_wx_account_tag_del', NULL, 3010, NULL, '1', 0, '0', '0', '1', 'admin', '2023-03-03 09:49:45', 'admin', '2023-04-07 02:10:22', '0', 1); +INSERT INTO `sys_menu` VALUES (3014, '同步标签', 'mp_wx_account_tag_sync', NULL, 3010, NULL, '1', 0, '0', '0', '1', 'admin', '2023-03-03 09:49:55', 'admin', '2023-04-07 02:10:20', '0', 1); +INSERT INTO `sys_menu` VALUES (3015, '素材管理', NULL, '/mp/wx-material/index', 3000, 'iconfont icon-tongzhi3', '1', 5, '0', '0', '0', 'admin', '2023-02-27 14:13:47', 'admin', '2023-03-11 16:32:30', '0', 1); +INSERT INTO `sys_menu` VALUES (3016, '素材维护', 'mp_wxmaterial_add', NULL, 3015, NULL, '0', 0, '0', '0', '1', 'admin', '2023-02-27 14:14:07', ' ', NULL, '0', 1); +INSERT INTO `sys_menu` VALUES (3017, '素材删除', 'mp_wxmaterial_del', NULL, 3015, NULL, '0', 0, '0', '0', '1', 'admin', '2023-02-27 14:14:18', ' ', NULL, '0', 1); +INSERT INTO `sys_menu` VALUES (3018, '自动回复', NULL, '/mp/wx-auto-reply/index', 3000, 'iconfont icon-putong', '1', 4, '0', '0', '0', 'admin', '2023-03-01 10:56:10', 'admin', '2023-03-11 16:32:23', '0', 1); +INSERT INTO `sys_menu` VALUES (3019, '新增回复', 'mp_wxautoreply_add', NULL, 3018, NULL, '0', 0, '0', '0', '1', 'admin', '2023-03-01 10:56:28', ' ', NULL, '0', 1); +INSERT INTO `sys_menu` VALUES (3020, '编辑回复', 'mp_wxautoreply_edit', NULL, 3018, NULL, '0', 0, '0', '0', '1', 'admin', '2023-03-01 10:56:42', ' ', NULL, '0', 1); +INSERT INTO `sys_menu` VALUES (3021, '删除回复', 'mp_wxautoreply_del', NULL, 3018, NULL, '0', 0, '0', '0', '1', 'admin', '2023-03-01 10:56:53', ' ', NULL, '0', 1); +INSERT INTO `sys_menu` VALUES (3022, '运营数据', NULL, '/mp/wx-statistics/index', 3000, 'iconfont icon-shuxing', '1', 8, '0', '0', '0', 'admin', '2023-03-01 11:15:58', 'admin', '2023-03-11 16:32:43', '0', 1); +INSERT INTO `sys_menu` VALUES (3023, '新增消息', 'mp_wxmsg_add', NULL, 3008, NULL, '0', 0, '0', '0', '1', 'admin', '2023-03-01 17:12:02', ' ', NULL, '0', 1); +INSERT INTO `sys_menu` VALUES (3024, '新增粉丝', 'mp_wxaccountfans_add', 'mp_wxaccountfans_add', 3006, NULL, '0', 0, '0', '0', '1', 'admin', '2023-03-02 10:57:41', ' ', NULL, '0', 1); +INSERT INTO `sys_menu` VALUES (3025, '粉丝编辑', 'mp_wxaccountfans_edit', 'mp_wxaccountfans_add', 3006, NULL, '0', 0, '0', '0', '1', 'admin', '2023-03-02 10:57:52', ' ', NULL, '0', 1); +INSERT INTO `sys_menu` VALUES (3026, '粉丝删除', 'mp_wxaccountfans_del', 'mp_wxaccountfans_add', 3006, NULL, '0', 0, '0', '0', '1', 'admin', '2023-03-02 10:58:02', ' ', NULL, '0', 1); +INSERT INTO `sys_menu` VALUES (3027, '新增菜单', 'mp_wxmenu_add', NULL, 3002, NULL, '0', 0, '0', '0', '1', 'admin', '2023-02-27 20:54:34', ' ', NULL, '0', 1); +INSERT INTO `sys_menu` VALUES (3028, '发布菜单', 'mp_wxmenu_push', NULL, 3002, NULL, '0', 0, '0', '0', '1', 'admin', '2023-02-27 20:54:48', ' ', NULL, '0', 1); +INSERT INTO `sys_menu` VALUES (3029, '删除菜单', 'mp_wxmenu_del', NULL, 3002, NULL, '0', 0, '0', '0', '1', 'admin', '2023-02-27 20:54:57', ' ', NULL, '0', 1); +INSERT INTO `sys_menu` VALUES (4000, '系统监控', NULL, '/daemon', -1, 'iconfont icon-shuju', '1', 3, '0', '0', '0', 'admin', '2023-02-06 20:20:47', 'admin', '2023-02-23 20:01:07', '0', 1); +INSERT INTO `sys_menu` VALUES (4001, '文档扩展', NULL, 'http://pigx-gateway:9999/admin/doc.html', 4000, 'iconfont icon-biaodan', '1', 2, '0', '1', '0', '', '2018-06-26 10:50:32', 'admin', '2023-02-23 20:01:29', '0', 1); +INSERT INTO `sys_menu` VALUES (4002, '大屏设计', NULL, '/ext/report', -1, 'iconfont icon-putong', '1', 6, '0', '0', '0', 'admin', '2023-04-07 11:04:01', ' ', '2023-04-07 06:22:16', '0', 1); +INSERT INTO `sys_menu` VALUES (4003, '报表设计', NULL, '/ext/jimu', -1, 'iconfont icon-shuju', '1', 7, '0', '0', '0', 'admin', '2023-04-07 13:15:56', 'admin', '2023-04-07 06:22:19', '0', 1); +INSERT INTO `sys_menu` VALUES (4004, '缓存监控', NULL, '/ext/cache', 4000, 'iconfont icon-shuju', '1', 1, '0', '0', '0', 'admin', '2023-05-29 15:12:59', 'admin', '2023-06-06 19:31:18', '0', 1); +INSERT INTO `sys_menu` VALUES (5000, '支付系统', NULL, '/pay', -1, 'iconfont icon-neiqianshujuchucun', '1', 4, '0', '0', '0', 'admin', '2023-02-27 10:57:14', 'admin', '2023-02-27 11:00:47', '0', 1); +INSERT INTO `sys_menu` VALUES (5001, '收银台', NULL, '/pay/cd/index', 5000, 'iconfont icon-diqiu1', '1', 0, '0', '0', '0', 'admin', '2023-02-27 10:58:13', 'admin', '2023-02-27 11:00:14', '0', 1); +INSERT INTO `sys_menu` VALUES (5002, '支付渠道', NULL, '/pay/channel/index', 5000, 'iconfont icon-crew_feature', '1', 1, '0', '0', '0', 'admin', '2023-02-27 19:36:55', 'admin', '2023-02-28 20:02:53', '0', 1); +INSERT INTO `sys_menu` VALUES (5003, '查询', 'pay_channel_view', NULL, 5002, NULL, '0', 0, '0', '0', '1', 'admin', '2023-02-27 19:41:44', ' ', NULL, '0', 1); +INSERT INTO `sys_menu` VALUES (5004, '新增', 'pay_channel_add', NULL, 5002, NULL, '0', 0, '0', '0', '1', 'admin', '2023-02-27 19:42:05', ' ', NULL, '0', 1); +INSERT INTO `sys_menu` VALUES (5005, '编辑', 'pay_channel_edit', NULL, 5002, NULL, '0', 0, '0', '0', '1', 'admin', '2023-02-27 19:42:23', ' ', NULL, '0', 1); +INSERT INTO `sys_menu` VALUES (5006, '删除', 'pay_channel_del', NULL, 5002, NULL, '0', 0, '0', '0', '1', 'admin', '2023-02-27 19:42:40', ' ', NULL, '0', 1); +INSERT INTO `sys_menu` VALUES (5007, '导出', 'pay_channel_export', NULL, 5002, NULL, '0', 0, '0', '0', '1', 'admin', '2023-02-27 19:42:57', ' ', NULL, '0', 1); +INSERT INTO `sys_menu` VALUES (5008, '商品订单', NULL, '/pay/order/index', 5000, 'iconfont icon-fuwenbenkuang', '1', 2, '0', '0', '0', 'admin', '2023-02-28 09:56:22', ' ', NULL, '0', 1); +INSERT INTO `sys_menu` VALUES (5009, '新增', 'pay_order_add', NULL, 5008, NULL, '0', 0, '0', '0', '1', 'admin', '2023-02-28 09:58:25', ' ', NULL, '0', 1); +INSERT INTO `sys_menu` VALUES (5010, '删除', 'pay_order_del', NULL, 5008, NULL, '0', 0, '0', '0', '1', 'admin', '2023-02-28 09:58:40', ' ', NULL, '0', 1); +INSERT INTO `sys_menu` VALUES (5011, '修改', 'pay_order_edit', NULL, 5008, NULL, '0', 0, '0', '0', '1', 'admin', '2023-02-28 09:59:11', ' ', NULL, '0', 1); +INSERT INTO `sys_menu` VALUES (5012, '查找', 'pay_order_view', NULL, 5008, NULL, '0', 0, '0', '0', '1', 'admin', '2023-02-28 09:59:37', ' ', NULL, '0', 1); +INSERT INTO `sys_menu` VALUES (5013, '导出', 'pay_order_export', NULL, 5008, NULL, '0', 0, '0', '0', '1', 'admin', '2023-02-28 09:59:54', ' ', NULL, '0', 1); +INSERT INTO `sys_menu` VALUES (5014, '通知记录', NULL, '/pay/record/index', 5000, 'iconfont icon-fuwenbenkuang', '1', 5, '0', '0', '0', 'admin', '2023-02-28 11:01:37', 'admin', '2023-02-28 20:06:24', '0', 1); +INSERT INTO `sys_menu` VALUES (5015, '新增', 'pay_record_add', NULL, 5014, NULL, '1', 0, '0', '0', '1', 'admin', '2023-02-28 11:04:40', ' ', NULL, '0', 1); +INSERT INTO `sys_menu` VALUES (5016, '修改', 'pay_record_edit', NULL, 5014, NULL, '1', 0, '0', '0', '1', 'admin', '2023-02-28 11:05:00', ' ', NULL, '0', 1); +INSERT INTO `sys_menu` VALUES (5017, '删除', 'pay_record_del', NULL, 5014, NULL, '1', 0, '0', '0', '1', 'admin', '2023-02-28 11:05:15', ' ', NULL, '0', 1); +INSERT INTO `sys_menu` VALUES (5018, '导出', 'pay_record_export', NULL, 5014, NULL, '1', 0, '0', '0', '1', 'admin', '2023-02-28 11:05:41', ' ', NULL, '0', 1); +INSERT INTO `sys_menu` VALUES (5019, '查询', 'pay_record_view', NULL, 5014, NULL, '0', 0, '0', '0', '1', 'admin', '2023-02-28 11:12:53', ' ', NULL, '0', 1); +INSERT INTO `sys_menu` VALUES (5020, '退款订单', NULL, '/pay/refund/index', 5000, 'iconfont icon-fuwenbenkuang', '1', 4, '0', '0', '0', 'admin', '2023-02-28 13:59:04', 'admin', '2023-02-28 20:03:13', '0', 1); +INSERT INTO `sys_menu` VALUES (5021, '查询', 'pay_refund_view', NULL, 5020, NULL, '0', 0, '0', '0', '1', 'admin', '2023-02-28 13:59:31', ' ', NULL, '0', 1); +INSERT INTO `sys_menu` VALUES (5022, '新增', 'pay_refund_add', NULL, 5020, NULL, '0', 0, '0', '0', '1', 'admin', '2023-02-28 13:59:48', ' ', NULL, '0', 1); +INSERT INTO `sys_menu` VALUES (5023, '修改', 'pay_refund_edit', NULL, 5020, NULL, '0', 0, '0', '0', '1', 'admin', '2023-02-28 14:00:05', ' ', NULL, '0', 1); +INSERT INTO `sys_menu` VALUES (5024, '删除', 'pay_refund_del', NULL, 5020, NULL, '0', 0, '0', '0', '1', 'admin', '2023-02-28 14:00:23', ' ', NULL, '0', 1); +INSERT INTO `sys_menu` VALUES (5025, '导出', 'pay_refund_export', NULL, 5020, NULL, '0', 0, '0', '0', '1', 'admin', '2023-02-28 14:00:35', 'admin', '2023-02-28 14:04:15', '0', 1); +INSERT INTO `sys_menu` VALUES (5026, '支付订单', NULL, '/pay/trade/index', 5000, 'iconfont icon-biaodan', '1', 3, '0', '0', '0', 'admin', '2023-02-28 14:44:59', 'admin', '2023-02-28 20:03:09', '0', 1); +INSERT INTO `sys_menu` VALUES (5027, '查询', 'pay_trade_view', NULL, 5026, NULL, '0', 0, '0', '0', '1', 'admin', '2023-02-28 14:45:50', ' ', NULL, '0', 1); +INSERT INTO `sys_menu` VALUES (5028, '新增', 'pay_trade_add', NULL, 5026, NULL, '0', 0, '0', '0', '1', 'admin', '2023-02-28 14:46:08', ' ', NULL, '0', 1); +INSERT INTO `sys_menu` VALUES (5029, '修改', 'pay_trade_edit', NULL, 5026, NULL, '0', 0, '0', '0', '1', 'admin', '2023-02-28 14:46:22', ' ', NULL, '0', 1); +INSERT INTO `sys_menu` VALUES (5030, '删除', 'pay_trade_del', NULL, 5026, NULL, '0', 0, '0', '0', '1', 'admin', '2023-02-28 14:46:36', ' ', NULL, '0', 1); +INSERT INTO `sys_menu` VALUES (5031, '导出', 'pay_trade_export', NULL, 5026, NULL, '0', 0, '0', '0', '1', 'admin', '2023-02-28 14:46:49', ' ', NULL, '0', 1); +INSERT INTO `sys_menu` VALUES (6000, '协同办公', NULL, '/flow', -1, 'ele-Present', '1', 5, '0', '0', '0', 'admin', '2023-03-02 16:36:49', 'admin', '2023-07-27 13:12:32', '0', 1); +INSERT INTO `sys_menu` VALUES (6001, '流程管理', NULL, '/flow/group/index', 6000, 'iconfont icon-gongju', '1', 0, '0', '0', '0', 'admin', '2023-03-02 16:37:55', 'admin', '2023-07-27 13:12:42', '0', 1); +INSERT INTO `sys_menu` VALUES (6002, '创建流程', NULL, '/flow/create/all', 6000, 'fa fa-arrow-circle-right', '0', 2, '0', NULL, '0', '', '2023-07-27 13:14:56', 'admin', '2023-07-27 13:32:32', '0', 1); +INSERT INTO `sys_menu` VALUES (6003, '发起流程', NULL, '/flow/list/index', 6000, 'fa fa-play', '1', 1, '0', '0', '0', 'admin', '2023-03-02 18:18:10', 'admin', '2023-07-27 13:29:00', '0', 1); +INSERT INTO `sys_menu` VALUES (6004, '任务管理', NULL, '/task', 6000, 'fa fa-th', '1', 2, '0', '0', '0', 'admin', '2023-03-02 22:13:29', 'admin', '2023-07-27 13:29:17', '0', 1); +INSERT INTO `sys_menu` VALUES (6005, '代办任务', NULL, '/task/pending', 6004, 'fa fa-flag-checkered', '1', 0, '0', '0', '0', 'admin', '2023-03-02 22:59:35', 'admin', '2023-07-27 13:32:18', '0', 1); +INSERT INTO `sys_menu` VALUES (6006, '我的已办', NULL, '/task/completed', 6004, 'fa fa-hand-o-right', '1', 3, '0', '0', '0', 'admin', '2023-03-02 23:23:13', 'admin', '2023-07-27 13:30:51', '0', 1); +INSERT INTO `sys_menu` VALUES (6007, '我的发起', NULL, '/task/started', 6004, 'fa fa-plane', '1', 1, '0', NULL, '0', '', '2023-07-27 13:14:51', 'admin', '2023-07-27 13:29:47', '0', 1); +INSERT INTO `sys_menu` VALUES (6008, '抄送给我', NULL, '/task/cc', 6004, 'fa fa-arrow-circle-right', '1', 2, '0', NULL, '0', '', '2023-07-27 13:14:56', 'admin', '2023-07-27 13:32:32', '0', 1); +INSERT INTO `sys_menu` VALUES (7000, 'APP管理', NULL, '/app', -1, 'ele-Cellphone', '1', 2, '0', '0', '0', 'admin', NULL, 'admin', '2023-02-23 19:54:05', '0', 1); +INSERT INTO `sys_menu` VALUES (7100, '客户管理', NULL, '/app/appuser/index', 7000, 'ele-UserFilled', '1', 1, '1', NULL, '0', 'admin', NULL, 'admin', '2023-02-16 15:29:08', '0', 1); +INSERT INTO `sys_menu` VALUES (7101, '新增用户', 'app_appuser_add', NULL, 7100, NULL, '1', 1, '0', NULL, '1', 'admin', NULL, 'admin', '2023-01-29 07:01:00', '0', 1); +INSERT INTO `sys_menu` VALUES (7102, '编辑用户', 'app_appuser_edit', NULL, 7100, NULL, '1', 1, '0', NULL, '1', 'admin', NULL, 'admin', '2023-01-29 07:01:00', '0', 1); +INSERT INTO `sys_menu` VALUES (7103, '删除用户', 'app_appuser_del', NULL, 7100, NULL, '1', 1, '0', NULL, '1', 'admin', NULL, 'admin', '2023-01-29 07:01:00', '0', 1); +INSERT INTO `sys_menu` VALUES (7104, '导出用户', 'app_appuser_export', NULL, 7100, NULL, '1', 1, '0', NULL, '1', 'admin', NULL, 'admin', '2023-01-29 07:01:00', '0', 1); +INSERT INTO `sys_menu` VALUES (7200, 'APP角色', NULL, '/app/approle/index', 7000, 'ele-Stamp', '1', 2, '0', '0', '0', 'admin', NULL, 'admin', '2023-03-07 14:18:30', '0', 1); +INSERT INTO `sys_menu` VALUES (7201, '删除角色', 'app_approle_del', NULL, 7200, NULL, '1', 1, '0', NULL, '1', 'admin', NULL, 'admin', '2023-01-29 07:01:01', '0', 1); +INSERT INTO `sys_menu` VALUES (7202, '编辑角色', 'app_approle_edit', NULL, 7200, NULL, '1', 1, '0', NULL, '1', 'admin', NULL, 'admin', '2023-01-29 07:01:01', '0', 1); +INSERT INTO `sys_menu` VALUES (7203, '新增角色', 'app_approle_add', NULL, 7200, NULL, '1', 1, '0', NULL, '1', 'admin', NULL, 'admin', '2023-01-29 07:01:01', '0', 1); +INSERT INTO `sys_menu` VALUES (7204, '导出角色', 'app_approle_export', NULL, 7200, NULL, '1', 1, '0', NULL, '1', 'admin', NULL, 'admin', '2023-01-29 07:01:01', '0', 1); +INSERT INTO `sys_menu` VALUES (7300, 'APP秘钥', NULL, '/app/appsocial/index', 7000, 'iconfont icon-quanxian', '1', 3, '0', '0', '0', 'admin', NULL, 'admin', '2023-03-07 14:18:44', '0', 1); +INSERT INTO `sys_menu` VALUES (7301, '删除秘钥', 'app_social_details_del', NULL, 7300, NULL, '1', 1, '0', NULL, '1', 'admin', NULL, 'admin', '2023-01-29 07:01:02', '0', 1); +INSERT INTO `sys_menu` VALUES (7302, '修改秘钥', 'app_social_details_edit', NULL, 7300, NULL, '1', 1, '0', NULL, '1', 'admin', NULL, 'admin', '2023-01-29 07:01:02', '0', 1); +INSERT INTO `sys_menu` VALUES (7303, '保存秘钥', 'app_social_details_add', NULL, 7300, NULL, '1', 1, '0', NULL, '1', 'admin', NULL, 'admin', '2023-01-29 07:01:02', '0', 1); +INSERT INTO `sys_menu` VALUES (7400, '文章资讯', '', '/app/appArticle/index', 7000, 'ele-CollectionTag', '1', 4, '0', NULL, '0', '', NULL, 'admin', '2023-06-07 17:17:20', '0', 1); +INSERT INTO `sys_menu` VALUES (7401, '文章资讯表查看', 'app_appArticle_view', NULL, 7400, '1', '1', 0, '0', NULL, '1', ' ', NULL, ' ', NULL, '0', 1); +INSERT INTO `sys_menu` VALUES (7402, '文章资讯表新增', 'app_appArticle_add', NULL, 7400, '1', '1', 1, '0', NULL, '1', ' ', NULL, ' ', NULL, '0', 1); +INSERT INTO `sys_menu` VALUES (7403, '文章资讯表修改', 'app_appArticle_edit', NULL, 7400, '1', '1', 2, '0', NULL, '1', ' ', NULL, ' ', NULL, '0', 1); +INSERT INTO `sys_menu` VALUES (7404, '文章资讯表删除', 'app_appArticle_del', NULL, 7400, '1', '1', 3, '0', NULL, '1', ' ', NULL, ' ', NULL, '0', 1); +INSERT INTO `sys_menu` VALUES (7405, '导入导出', 'app_appArticle_export', NULL, 7400, '1', '1', 3, '0', NULL, '1', ' ', NULL, ' ', NULL, '0', 1); +INSERT INTO `sys_menu` VALUES (7500, '文章分类', '', '/app/appArticleCategory/index', 7000, 'iconfont icon-caidan', '1', 5, '0', NULL, '0', '', NULL, 'admin', '2023-06-07 16:22:53', '0', 1); +INSERT INTO `sys_menu` VALUES (7501, '文章分类表查看', 'app_appArticleCategory_view', NULL, 7500, '1', '1', 0, '0', NULL, '1', ' ', NULL, ' ', NULL, '0', 1); +INSERT INTO `sys_menu` VALUES (7502, '文章分类表新增', 'app_appArticleCategory_add', NULL, 7500, '1', '1', 1, '0', NULL, '1', ' ', NULL, ' ', NULL, '0', 1); +INSERT INTO `sys_menu` VALUES (7503, '文章分类表修改', 'app_appArticleCategory_edit', NULL, 7500, '1', '1', 2, '0', NULL, '1', ' ', NULL, ' ', NULL, '0', 1); +INSERT INTO `sys_menu` VALUES (7504, '文章分类表删除', 'app_appArticleCategory_del', NULL, 7500, '1', '1', 3, '0', NULL, '1', ' ', NULL, ' ', NULL, '0', 1); +INSERT INTO `sys_menu` VALUES (7505, '导入导出', 'app_appArticleCategory_export', NULL, 7500, '1', '1', 3, '0', NULL, '1', ' ', NULL, ' ', NULL, '0', 1); +INSERT INTO `sys_menu` VALUES (7600, '文章发布', NULL, '/app/appArticle/form', 7000, 'iconfont icon-shuaxin', '0', 4, '0', '0', '0', 'admin', '2023-06-07 17:05:32', 'admin', '2023-06-07 17:17:49', '0', 1); +INSERT INTO `sys_menu` VALUES (7700, '界面设置', '', '/app/page/index', 7000, 'iconfont icon-diannao1', '1', 8, '0', NULL, '0', '', NULL, 'admin', '2023-06-20 14:02:01', '0', 1); +INSERT INTO `sys_menu` VALUES (7701, '底部导航', NULL, '/app/tabbar/index', 7000, 'iconfont icon-neiqianshujuchucun', '1', 9, '0', '0', '0', 'admin', '2023-06-14 14:36:08', 'admin', '2023-06-20 14:02:18', '0', 1); +INSERT INTO `sys_menu` VALUES (9000, '开发平台', NULL, '/gen', -1, 'iconfont icon-shuxingtu', '1', 9, '0', '0', '0', '', '2019-08-12 09:35:16', 'admin', '2023-02-23 20:02:24', '0', 1); +INSERT INTO `sys_menu` VALUES (9005, '数据源管理', NULL, '/gen/datasource/index', 9000, 'ele-Coin', '1', 0, '0', NULL, '0', '', '2019-08-12 09:42:11', 'admin', '2023-02-16 15:31:37', '0', 1); +INSERT INTO `sys_menu` VALUES (9006, '表单设计', NULL, '/gen/design/index', 9000, 'iconfont icon-AIshiyanshi', '0', 2, '0', '0', '0', '', '2019-08-16 10:08:56', 'admin', '2023-02-23 14:06:50', '0', 1); +INSERT INTO `sys_menu` VALUES (9007, '生成页面', NULL, '/gen/gener/index', 9000, 'iconfont icon-tongzhi4', '0', 0, '0', '0', '0', 'admin', '2023-02-20 09:58:23', 'admin', '2023-02-20 14:41:43', '0', 1); +INSERT INTO `sys_menu` VALUES (9050, '元数据管理', NULL, '/gen/metadata', 9000, 'iconfont icon--chaifenhang', '1', 9, '0', '0', '0', '', '2018-07-27 01:13:21', 'admin', '2023-02-23 19:55:10', '0', 1); +INSERT INTO `sys_menu` VALUES (9051, '模板管理', NULL, '/gen/template/index', 9050, 'iconfont icon--chaifenhang', '1', 5, '0', '0', '0', 'admin', '2023-02-21 11:22:54', 'admin', '2023-02-23 19:56:03', '0', 1); +INSERT INTO `sys_menu` VALUES (9052, '查询', 'codegen_template_view', NULL, 9051, NULL, '0', 0, '0', '0', '1', 'admin', '2023-02-21 12:33:03', 'admin', '2023-02-21 13:50:54', '0', 1); +INSERT INTO `sys_menu` VALUES (9053, '增加', 'codegen_template_add', NULL, 9051, NULL, '1', 0, '0', '0', '1', 'admin', '2023-02-21 13:34:10', 'admin', '2023-02-21 13:39:49', '0', 1); +INSERT INTO `sys_menu` VALUES (9054, '新增', 'codegen_template_add', NULL, 9051, NULL, '0', 1, '0', '0', '1', 'admin', '2023-02-21 13:51:32', ' ', NULL, '0', 1); +INSERT INTO `sys_menu` VALUES (9055, '导出', 'codegen_template_export', NULL, 9051, NULL, '0', 2, '0', '0', '1', 'admin', '2023-02-21 13:51:58', ' ', NULL, '0', 1); +INSERT INTO `sys_menu` VALUES (9056, '删除', 'codegen_template_del', NULL, 9051, NULL, '0', 3, '0', '0', '1', 'admin', '2023-02-21 13:52:16', ' ', NULL, '0', 1); +INSERT INTO `sys_menu` VALUES (9057, '编辑', 'codegen_template_edit', NULL, 9051, NULL, '0', 4, '0', '0', '1', 'admin', '2023-02-21 13:52:58', ' ', NULL, '0', 1); +INSERT INTO `sys_menu` VALUES (9059, '模板分组', NULL, '/gen/group/index', 9050, 'iconfont icon-shuxingtu', '1', 6, '0', '0', '0', 'admin', '2023-02-21 15:06:50', 'admin', '2023-02-23 19:55:25', '0', 1); +INSERT INTO `sys_menu` VALUES (9060, '查询', 'codegen_group_view', NULL, 9059, NULL, '0', 0, '0', '0', '1', 'admin', '2023-02-21 15:08:07', ' ', NULL, '0', 1); +INSERT INTO `sys_menu` VALUES (9061, '新增', 'codegen_group_add', NULL, 9059, NULL, '0', 0, '0', '0', '1', 'admin', '2023-02-21 15:08:28', ' ', NULL, '0', 1); +INSERT INTO `sys_menu` VALUES (9062, '修改', 'codegen_group_edit', NULL, 9059, NULL, '0', 0, '0', '0', '1', 'admin', '2023-02-21 15:08:43', ' ', NULL, '0', 1); +INSERT INTO `sys_menu` VALUES (9063, '删除', 'codegen_group_del', NULL, 9059, NULL, '0', 0, '0', '0', '1', 'admin', '2023-02-21 15:09:02', ' ', NULL, '0', 1); +INSERT INTO `sys_menu` VALUES (9064, '导出', 'codegen_group_export', NULL, 9059, NULL, '0', 0, '0', '0', '1', 'admin', '2023-02-21 15:09:22', ' ', NULL, '0', 1); +INSERT INTO `sys_menu` VALUES (9065, '字段管理', NULL, '/gen/field-type/index', 9050, 'iconfont icon-fuwenben', '1', 0, '0', '0', '0', 'admin', '2023-02-23 20:05:09', 'admin', '2023-02-23 20:05:45', '0', 1); +COMMIT; + +-- ---------------------------- +-- Table structure for sys_oauth_client_details +-- ---------------------------- +DROP TABLE IF EXISTS `sys_oauth_client_details`; +CREATE TABLE `sys_oauth_client_details` ( + `id` bigint(20) NOT NULL COMMENT 'ID', + `client_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '客户端ID', + `resource_ids` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '资源ID集合', + `client_secret` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '客户端秘钥', + `scope` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '授权范围', + `authorized_grant_types` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '授权类型', + `web_server_redirect_uri` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '回调地址', + `authorities` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '权限集合', + `access_token_validity` int(11) DEFAULT NULL COMMENT '访问令牌有效期(秒)', + `refresh_token_validity` int(11) DEFAULT NULL COMMENT '刷新令牌有效期(秒)', + `additional_information` varchar(4096) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '附加信息', + `autoapprove` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '自动授权', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标记,0未删除,1已删除', + `create_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ' ' COMMENT '创建人', + `update_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ' ' COMMENT '修改人', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + `tenant_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '所属租户ID', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='终端信息表'; + +-- ---------------------------- +-- Records of sys_oauth_client_details +-- ---------------------------- +BEGIN; +INSERT INTO `sys_oauth_client_details` VALUES (1, 'app', NULL, 'app', 'server', 'password,refresh_token,authorization_code,client_credentials,mobile', 'http://localhost:4040/sso1/login,http://localhost:4041/sso1/login,http://localhost:8080/renren-admin/sys/oauth2-sso,http://localhost:8090/sys/oauth2-sso', NULL, 43200, 2592001, '{\"enc_flag\":\"1\",\"captcha_flag\":\"1\",\"online_quantity\":\"1\"}', 'true', '0', '', 'admin', NULL, '2023-02-09 13:54:54', 1); +INSERT INTO `sys_oauth_client_details` VALUES (2, 'daemon', NULL, 'daemon', 'server', 'password,refresh_token', NULL, NULL, 43200, 2592001, '{\"enc_flag\":\"1\",\"captcha_flag\":\"1\"}', 'true', '0', ' ', ' ', NULL, NULL, 1); +INSERT INTO `sys_oauth_client_details` VALUES (3, 'gen', NULL, 'gen', 'server', 'password,refresh_token', NULL, NULL, 43200, 2592001, '{\"enc_flag\":\"1\",\"captcha_flag\":\"1\"}', 'true', '0', ' ', ' ', NULL, NULL, 1); +INSERT INTO `sys_oauth_client_details` VALUES (4, 'mp', NULL, 'mp', 'server', 'password,refresh_token', NULL, NULL, 43200, 2592001, '{\"enc_flag\":\"1\",\"captcha_flag\":\"1\"}', 'true', '0', ' ', ' ', NULL, NULL, 1); +INSERT INTO `sys_oauth_client_details` VALUES (5, 'pig', NULL, 'pig', 'server', 'password,refresh_token,authorization_code,client_credentials,mobile', 'http://localhost:4040/sso1/login,http://localhost:4041/sso1/login,http://localhost:8080/renren-admin/sys/oauth2-sso,http://localhost:8090/sys/oauth2-sso', NULL, 43200, 2592001, '{\"enc_flag\":\"1\",\"captcha_flag\":\"1\",\"online_quantity\":\"1\"}', 'false', '0', '', 'admin', NULL, '2023-03-08 11:32:41', 1); +INSERT INTO `sys_oauth_client_details` VALUES (6, 'test', NULL, 'test', 'server', 'password,refresh_token', NULL, NULL, 43200, 2592001, '{ \"enc_flag\":\"1\",\"captcha_flag\":\"0\"}', 'true', '0', ' ', ' ', NULL, NULL, 1); +INSERT INTO `sys_oauth_client_details` VALUES (7, 'social', NULL, 'social', 'server', 'password,refresh_token,mobile', NULL, NULL, 43200, 2592001, '{ \"enc_flag\":\"0\",\"captcha_flag\":\"0\"}', 'true', '0', ' ', ' ', NULL, NULL, 1); +INSERT INTO `sys_oauth_client_details` VALUES (8, 'mini', NULL, 'mini', 'server', 'password,mobile', NULL, NULL, 160000000, 160000000, '{\"captcha_flag\":\"0\",\"enc_flag\":\"1\",\"online_quantity\":\"1\"}', 'true', '0', 'admin', 'admin', '2023-01-29 16:38:06', '2023-01-29 17:21:56', 1); +COMMIT; + +-- ---------------------------- +-- Table structure for sys_post +-- ---------------------------- +DROP TABLE IF EXISTS `sys_post`; +CREATE TABLE `sys_post` ( + `post_id` bigint(20) NOT NULL COMMENT '岗位ID', + `post_code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '岗位编码', + `post_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '岗位名称', + `post_sort` int(11) NOT NULL COMMENT '岗位排序', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '岗位描述', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '0' COMMENT '是否删除 -1:已删除 0:正常', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '创建人', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '更新人', + `tenant_id` bigint(20) DEFAULT NULL COMMENT '租户ID', + PRIMARY KEY (`post_id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='岗位信息表'; + +-- ---------------------------- +-- Records of sys_post +-- ---------------------------- +BEGIN; +INSERT INTO `sys_post` VALUES (1, 'TEAM_LEADER', '部门负责人', 0, 'LEADER', '0', '2022-03-26 13:48:17', '', '2023-03-08 16:03:35', 'admin', 1); +COMMIT; + +-- ---------------------------- +-- Table structure for sys_public_param +-- ---------------------------- +DROP TABLE IF EXISTS `sys_public_param`; +CREATE TABLE `sys_public_param` ( + `public_id` bigint(20) NOT NULL COMMENT '编号', + `public_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '名称', + `public_key` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '键', + `public_value` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '值', + `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '状态,0禁用,1启用', + `validate_code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '校验码', + `create_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ' ' COMMENT '创建人', + `update_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ' ' COMMENT '修改人', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `public_type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '类型,0未知,1系统,2业务', + `system_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '系统标识,0非系统,1系统', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标记,0未删除,1已删除', + `tenant_id` bigint(20) DEFAULT NULL COMMENT '租户ID', + PRIMARY KEY (`public_id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='公共参数配置表'; + +-- ---------------------------- +-- Records of sys_public_param +-- ---------------------------- +BEGIN; +INSERT INTO `sys_public_param` VALUES (1, '租户默认来源', 'TENANT_DEFAULT_ID', '1', '0', '', ' ', ' ', '2020-05-12 04:03:46', '2020-06-20 08:56:30', '2', '0', '1', 1); +INSERT INTO `sys_public_param` VALUES (2, '租户默认部门名称', 'TENANT_DEFAULT_DEPTNAME', '租户默认部门', '0', '', ' ', ' ', '2020-05-12 03:36:32', NULL, '2', '1', '0', 1); +INSERT INTO `sys_public_param` VALUES (3, '租户默认账户', 'TENANT_DEFAULT_USERNAME', 'admin', '0', '', ' ', ' ', '2020-05-12 04:05:04', NULL, '2', '1', '0', 1); +INSERT INTO `sys_public_param` VALUES (4, '租户默认密码', 'TENANT_DEFAULT_PASSWORD', '123456', '0', '', ' ', ' ', '2020-05-12 04:05:24', NULL, '2', '1', '0', 1); +INSERT INTO `sys_public_param` VALUES (5, '租户默认角色编码', 'TENANT_DEFAULT_ROLECODE', 'ROLE_ADMIN', '0', '', ' ', ' ', '2020-05-12 04:05:57', NULL, '2', '1', '0', 1); +INSERT INTO `sys_public_param` VALUES (6, '租户默认角色名称', 'TENANT_DEFAULT_ROLENAME', '租户默认角色', '0', '', ' ', ' ', '2020-05-12 04:06:19', NULL, '2', '1', '0', 1); +INSERT INTO `sys_public_param` VALUES (7, '表前缀', 'GEN_TABLE_PREFIX', 'tb_', '0', '', ' ', ' ', '2020-05-12 04:23:04', NULL, '9', '1', '0', 1); +INSERT INTO `sys_public_param` VALUES (8, '接口文档不显示的字段', 'GEN_HIDDEN_COLUMNS', 'tenant_id', '0', '', ' ', ' ', '2020-05-12 04:25:19', NULL, '9', '1', '0', 1); +INSERT INTO `sys_public_param` VALUES (9, '注册用户默认角色', 'USER_DEFAULT_ROLE', 'GENERAL_USER', '0', NULL, ' ', ' ', '2022-03-31 16:52:24', NULL, '2', '1', '0', 1); +COMMIT; + +-- ---------------------------- +-- Table structure for sys_role +-- ---------------------------- +DROP TABLE IF EXISTS `sys_role`; +CREATE TABLE `sys_role` ( + `role_id` bigint(20) NOT NULL COMMENT '角色ID', + `role_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '角色名称', + `role_code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '角色编码', + `role_desc` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '角色描述', + `ds_type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '2' COMMENT '数据权限类型,0全部,1自定义,2本部门及以下,3本部门,4仅本人', + `ds_scope` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '数据权限范围', + `create_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ' ' COMMENT '创建人', + `update_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ' ' COMMENT '修改人', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标记,0未删除,1已删除', + `tenant_id` bigint(20) DEFAULT NULL COMMENT '租户ID', + PRIMARY KEY (`role_id`) USING BTREE, + KEY `role_idx1_role_code` (`role_code`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='系统角色表'; + +-- ---------------------------- +-- Records of sys_role +-- ---------------------------- +BEGIN; +INSERT INTO `sys_role` VALUES (1, '管理员', 'ROLE_ADMIN', '管理员', '0', '', '', 'edg134', '2017-10-29 15:45:51', '2023-04-06 14:03:28', '0', 1); +INSERT INTO `sys_role` VALUES (2, '普通用户', 'GENERAL_USER', '普通用户', '0', '', '', 'admin', '2022-03-31 17:03:15', '2023-04-03 02:28:51', '0', 1); +COMMIT; + +-- ---------------------------- +-- Table structure for sys_role_menu +-- ---------------------------- +DROP TABLE IF EXISTS `sys_role_menu`; +CREATE TABLE `sys_role_menu` ( + `role_id` bigint(20) NOT NULL COMMENT '角色ID', + `menu_id` bigint(20) NOT NULL COMMENT '菜单ID', + PRIMARY KEY (`role_id`,`menu_id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='角色菜单表'; + +-- ---------------------------- +-- Records of sys_role_menu +-- ---------------------------- +BEGIN; +INSERT INTO `sys_role_menu` VALUES (1, 1000); +INSERT INTO `sys_role_menu` VALUES (1, 1100); +INSERT INTO `sys_role_menu` VALUES (1, 1101); +INSERT INTO `sys_role_menu` VALUES (1, 1102); +INSERT INTO `sys_role_menu` VALUES (1, 1103); +INSERT INTO `sys_role_menu` VALUES (1, 1104); +INSERT INTO `sys_role_menu` VALUES (1, 1200); +INSERT INTO `sys_role_menu` VALUES (1, 1201); +INSERT INTO `sys_role_menu` VALUES (1, 1202); +INSERT INTO `sys_role_menu` VALUES (1, 1203); +INSERT INTO `sys_role_menu` VALUES (1, 1300); +INSERT INTO `sys_role_menu` VALUES (1, 1301); +INSERT INTO `sys_role_menu` VALUES (1, 1302); +INSERT INTO `sys_role_menu` VALUES (1, 1303); +INSERT INTO `sys_role_menu` VALUES (1, 1304); +INSERT INTO `sys_role_menu` VALUES (1, 1305); +INSERT INTO `sys_role_menu` VALUES (1, 1400); +INSERT INTO `sys_role_menu` VALUES (1, 1401); +INSERT INTO `sys_role_menu` VALUES (1, 1402); +INSERT INTO `sys_role_menu` VALUES (1, 1403); +INSERT INTO `sys_role_menu` VALUES (1, 1404); +INSERT INTO `sys_role_menu` VALUES (1, 1500); +INSERT INTO `sys_role_menu` VALUES (1, 1501); +INSERT INTO `sys_role_menu` VALUES (1, 1502); +INSERT INTO `sys_role_menu` VALUES (1, 1503); +INSERT INTO `sys_role_menu` VALUES (1, 1504); +INSERT INTO `sys_role_menu` VALUES (1, 1505); +INSERT INTO `sys_role_menu` VALUES (1, 1506); +INSERT INTO `sys_role_menu` VALUES (1, 1507); +INSERT INTO `sys_role_menu` VALUES (1, 1508); +INSERT INTO `sys_role_menu` VALUES (1, 1600); +INSERT INTO `sys_role_menu` VALUES (1, 1601); +INSERT INTO `sys_role_menu` VALUES (1, 1602); +INSERT INTO `sys_role_menu` VALUES (1, 1603); +INSERT INTO `sys_role_menu` VALUES (1, 1604); +INSERT INTO `sys_role_menu` VALUES (1, 1605); +INSERT INTO `sys_role_menu` VALUES (1, 2000); +INSERT INTO `sys_role_menu` VALUES (1, 2001); +INSERT INTO `sys_role_menu` VALUES (1, 2100); +INSERT INTO `sys_role_menu` VALUES (1, 2101); +INSERT INTO `sys_role_menu` VALUES (1, 2102); +INSERT INTO `sys_role_menu` VALUES (1, 2103); +INSERT INTO `sys_role_menu` VALUES (1, 2104); +INSERT INTO `sys_role_menu` VALUES (1, 2105); +INSERT INTO `sys_role_menu` VALUES (1, 2200); +INSERT INTO `sys_role_menu` VALUES (1, 2201); +INSERT INTO `sys_role_menu` VALUES (1, 2202); +INSERT INTO `sys_role_menu` VALUES (1, 2203); +INSERT INTO `sys_role_menu` VALUES (1, 2210); +INSERT INTO `sys_role_menu` VALUES (1, 2211); +INSERT INTO `sys_role_menu` VALUES (1, 2212); +INSERT INTO `sys_role_menu` VALUES (1, 2213); +INSERT INTO `sys_role_menu` VALUES (1, 2300); +INSERT INTO `sys_role_menu` VALUES (1, 2400); +INSERT INTO `sys_role_menu` VALUES (1, 2401); +INSERT INTO `sys_role_menu` VALUES (1, 2402); +INSERT INTO `sys_role_menu` VALUES (1, 2403); +INSERT INTO `sys_role_menu` VALUES (1, 2500); +INSERT INTO `sys_role_menu` VALUES (1, 2501); +INSERT INTO `sys_role_menu` VALUES (1, 2502); +INSERT INTO `sys_role_menu` VALUES (1, 2503); +INSERT INTO `sys_role_menu` VALUES (1, 2600); +INSERT INTO `sys_role_menu` VALUES (1, 2601); +INSERT INTO `sys_role_menu` VALUES (1, 2800); +INSERT INTO `sys_role_menu` VALUES (1, 2810); +INSERT INTO `sys_role_menu` VALUES (1, 2820); +INSERT INTO `sys_role_menu` VALUES (1, 2830); +INSERT INTO `sys_role_menu` VALUES (1, 2840); +INSERT INTO `sys_role_menu` VALUES (1, 2850); +INSERT INTO `sys_role_menu` VALUES (1, 2860); +INSERT INTO `sys_role_menu` VALUES (1, 2870); +INSERT INTO `sys_role_menu` VALUES (1, 2871); +INSERT INTO `sys_role_menu` VALUES (1, 2900); +INSERT INTO `sys_role_menu` VALUES (1, 2901); +INSERT INTO `sys_role_menu` VALUES (1, 2902); +INSERT INTO `sys_role_menu` VALUES (1, 2903); +INSERT INTO `sys_role_menu` VALUES (1, 2904); +INSERT INTO `sys_role_menu` VALUES (1, 2905); +INSERT INTO `sys_role_menu` VALUES (1, 2906); +INSERT INTO `sys_role_menu` VALUES (1, 2907); +INSERT INTO `sys_role_menu` VALUES (1, 2908); +INSERT INTO `sys_role_menu` VALUES (1, 3000); +INSERT INTO `sys_role_menu` VALUES (1, 3001); +INSERT INTO `sys_role_menu` VALUES (1, 3002); +INSERT INTO `sys_role_menu` VALUES (1, 3003); +INSERT INTO `sys_role_menu` VALUES (1, 3004); +INSERT INTO `sys_role_menu` VALUES (1, 3005); +INSERT INTO `sys_role_menu` VALUES (1, 3006); +INSERT INTO `sys_role_menu` VALUES (1, 3007); +INSERT INTO `sys_role_menu` VALUES (1, 3008); +INSERT INTO `sys_role_menu` VALUES (1, 3009); +INSERT INTO `sys_role_menu` VALUES (1, 3010); +INSERT INTO `sys_role_menu` VALUES (1, 3011); +INSERT INTO `sys_role_menu` VALUES (1, 3012); +INSERT INTO `sys_role_menu` VALUES (1, 3013); +INSERT INTO `sys_role_menu` VALUES (1, 3014); +INSERT INTO `sys_role_menu` VALUES (1, 3015); +INSERT INTO `sys_role_menu` VALUES (1, 3016); +INSERT INTO `sys_role_menu` VALUES (1, 3017); +INSERT INTO `sys_role_menu` VALUES (1, 3018); +INSERT INTO `sys_role_menu` VALUES (1, 3019); +INSERT INTO `sys_role_menu` VALUES (1, 3020); +INSERT INTO `sys_role_menu` VALUES (1, 3021); +INSERT INTO `sys_role_menu` VALUES (1, 3022); +INSERT INTO `sys_role_menu` VALUES (1, 3023); +INSERT INTO `sys_role_menu` VALUES (1, 3024); +INSERT INTO `sys_role_menu` VALUES (1, 3025); +INSERT INTO `sys_role_menu` VALUES (1, 3026); +INSERT INTO `sys_role_menu` VALUES (1, 3027); +INSERT INTO `sys_role_menu` VALUES (1, 3028); +INSERT INTO `sys_role_menu` VALUES (1, 3029); +INSERT INTO `sys_role_menu` VALUES (1, 4000); +INSERT INTO `sys_role_menu` VALUES (1, 4001); +INSERT INTO `sys_role_menu` VALUES (1, 4002); +INSERT INTO `sys_role_menu` VALUES (1, 4003); +INSERT INTO `sys_role_menu` VALUES (1, 4004); +INSERT INTO `sys_role_menu` VALUES (1, 5000); +INSERT INTO `sys_role_menu` VALUES (1, 5001); +INSERT INTO `sys_role_menu` VALUES (1, 5002); +INSERT INTO `sys_role_menu` VALUES (1, 5003); +INSERT INTO `sys_role_menu` VALUES (1, 5004); +INSERT INTO `sys_role_menu` VALUES (1, 5005); +INSERT INTO `sys_role_menu` VALUES (1, 5006); +INSERT INTO `sys_role_menu` VALUES (1, 5007); +INSERT INTO `sys_role_menu` VALUES (1, 5008); +INSERT INTO `sys_role_menu` VALUES (1, 5009); +INSERT INTO `sys_role_menu` VALUES (1, 5010); +INSERT INTO `sys_role_menu` VALUES (1, 5011); +INSERT INTO `sys_role_menu` VALUES (1, 5012); +INSERT INTO `sys_role_menu` VALUES (1, 5013); +INSERT INTO `sys_role_menu` VALUES (1, 5014); +INSERT INTO `sys_role_menu` VALUES (1, 5015); +INSERT INTO `sys_role_menu` VALUES (1, 5016); +INSERT INTO `sys_role_menu` VALUES (1, 5017); +INSERT INTO `sys_role_menu` VALUES (1, 5018); +INSERT INTO `sys_role_menu` VALUES (1, 5019); +INSERT INTO `sys_role_menu` VALUES (1, 5020); +INSERT INTO `sys_role_menu` VALUES (1, 5021); +INSERT INTO `sys_role_menu` VALUES (1, 5022); +INSERT INTO `sys_role_menu` VALUES (1, 5023); +INSERT INTO `sys_role_menu` VALUES (1, 5024); +INSERT INTO `sys_role_menu` VALUES (1, 5025); +INSERT INTO `sys_role_menu` VALUES (1, 5026); +INSERT INTO `sys_role_menu` VALUES (1, 5027); +INSERT INTO `sys_role_menu` VALUES (1, 5028); +INSERT INTO `sys_role_menu` VALUES (1, 5029); +INSERT INTO `sys_role_menu` VALUES (1, 5030); +INSERT INTO `sys_role_menu` VALUES (1, 5031); +INSERT INTO `sys_role_menu` VALUES (1, 6000); +INSERT INTO `sys_role_menu` VALUES (1, 6001); +INSERT INTO `sys_role_menu` VALUES (1, 6002); +INSERT INTO `sys_role_menu` VALUES (1, 6003); +INSERT INTO `sys_role_menu` VALUES (1, 6004); +INSERT INTO `sys_role_menu` VALUES (1, 6005); +INSERT INTO `sys_role_menu` VALUES (1, 6006); +INSERT INTO `sys_role_menu` VALUES (1, 6007); +INSERT INTO `sys_role_menu` VALUES (1, 6008); +INSERT INTO `sys_role_menu` VALUES (1, 7000); +INSERT INTO `sys_role_menu` VALUES (1, 7100); +INSERT INTO `sys_role_menu` VALUES (1, 7101); +INSERT INTO `sys_role_menu` VALUES (1, 7102); +INSERT INTO `sys_role_menu` VALUES (1, 7103); +INSERT INTO `sys_role_menu` VALUES (1, 7104); +INSERT INTO `sys_role_menu` VALUES (1, 7200); +INSERT INTO `sys_role_menu` VALUES (1, 7201); +INSERT INTO `sys_role_menu` VALUES (1, 7202); +INSERT INTO `sys_role_menu` VALUES (1, 7203); +INSERT INTO `sys_role_menu` VALUES (1, 7204); +INSERT INTO `sys_role_menu` VALUES (1, 7300); +INSERT INTO `sys_role_menu` VALUES (1, 7301); +INSERT INTO `sys_role_menu` VALUES (1, 7302); +INSERT INTO `sys_role_menu` VALUES (1, 7303); +INSERT INTO `sys_role_menu` VALUES (1, 7304); +INSERT INTO `sys_role_menu` VALUES (1, 7400); +INSERT INTO `sys_role_menu` VALUES (1, 7401); +INSERT INTO `sys_role_menu` VALUES (1, 7402); +INSERT INTO `sys_role_menu` VALUES (1, 7403); +INSERT INTO `sys_role_menu` VALUES (1, 7404); +INSERT INTO `sys_role_menu` VALUES (1, 7500); +INSERT INTO `sys_role_menu` VALUES (1, 7501); +INSERT INTO `sys_role_menu` VALUES (1, 7502); +INSERT INTO `sys_role_menu` VALUES (1, 7503); +INSERT INTO `sys_role_menu` VALUES (1, 7504); +INSERT INTO `sys_role_menu` VALUES (1, 7600); +INSERT INTO `sys_role_menu` VALUES (1, 7700); +INSERT INTO `sys_role_menu` VALUES (1, 7701); +INSERT INTO `sys_role_menu` VALUES (1, 9000); +INSERT INTO `sys_role_menu` VALUES (1, 9005); +INSERT INTO `sys_role_menu` VALUES (1, 9006); +INSERT INTO `sys_role_menu` VALUES (1, 9007); +INSERT INTO `sys_role_menu` VALUES (1, 9050); +INSERT INTO `sys_role_menu` VALUES (1, 9051); +INSERT INTO `sys_role_menu` VALUES (1, 9052); +INSERT INTO `sys_role_menu` VALUES (1, 9053); +INSERT INTO `sys_role_menu` VALUES (1, 9054); +INSERT INTO `sys_role_menu` VALUES (1, 9055); +INSERT INTO `sys_role_menu` VALUES (1, 9056); +INSERT INTO `sys_role_menu` VALUES (1, 9057); +INSERT INTO `sys_role_menu` VALUES (1, 9059); +INSERT INTO `sys_role_menu` VALUES (1, 9060); +INSERT INTO `sys_role_menu` VALUES (1, 9061); +INSERT INTO `sys_role_menu` VALUES (1, 9062); +INSERT INTO `sys_role_menu` VALUES (1, 9063); +INSERT INTO `sys_role_menu` VALUES (1, 9064); +INSERT INTO `sys_role_menu` VALUES (1, 9065); +COMMIT; + +-- ---------------------------- +-- Table structure for sys_route_conf +-- ---------------------------- +DROP TABLE IF EXISTS `sys_route_conf`; +CREATE TABLE `sys_route_conf` ( + `id` bigint(20) NOT NULL COMMENT '主键', + `route_name` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL, + `route_id` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL, + `predicates` json DEFAULT NULL COMMENT '断言', + `filters` json DEFAULT NULL COMMENT '过滤器', + `uri` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL, + `sort_order` int(11) DEFAULT '0' COMMENT '排序', + `metadata` json DEFAULT NULL COMMENT '路由元信息', + `create_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ' ' COMMENT '创建人', + `update_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ' ' COMMENT '修改人', + `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', + `del_flag` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT '0', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='路由配置表'; + +-- ---------------------------- +-- Records of sys_route_conf +-- ---------------------------- +BEGIN; +INSERT INTO `sys_route_conf` VALUES (1, '工作流管理模块', 'pigx-oa-platform', '[{\"args\": {\"_genkey_0\": \"/act/**\"}, \"name\": \"Path\"}]', '[]', 'lb://pigx-oa-platform', 0, NULL, ' ', ' ', '2019-10-16 16:44:41', '2019-11-05 22:36:56', '0'); +INSERT INTO `sys_route_conf` VALUES (2, '认证中心', 'pigx-auth', '[{\"args\": {\"_genkey_0\": \"/auth/**\"}, \"name\": \"Path\"}]', '[{\"args\": {}, \"name\": \"ValidateCodeGatewayFilter\"}, {\"args\": {}, \"name\": \"PasswordDecoderFilter\"}]', 'lb://pigx-auth', 0, NULL, ' ', ' ', '2019-10-16 16:44:41', '2019-11-05 22:36:57', '0'); +INSERT INTO `sys_route_conf` VALUES (3, '代码生成模块', 'pigx-codegen', '[{\"args\": {\"_genkey_0\": \"/gen/**\"}, \"name\": \"Path\"}]', '[]', 'lb://pigx-codegen', 0, NULL, ' ', ' ', '2019-10-16 16:44:41', '2019-11-05 22:36:58', '0'); +INSERT INTO `sys_route_conf` VALUES (4, 'elastic-job定时任务模块', 'pigx-daemon-elastic-job', '[{\"args\": {\"_genkey_0\": \"/daemon/**\"}, \"name\": \"Path\"}]', '[]', 'lb://pigx-daemon-elastic-job', 0, NULL, ' ', ' ', '2019-10-16 16:44:41', '2019-11-05 22:36:59', '0'); +INSERT INTO `sys_route_conf` VALUES (5, 'quartz定时任务模块', 'pigx-daemon-quartz', '[{\"args\": {\"_genkey_0\": \"/job/**\"}, \"name\": \"Path\"}]', '[]', 'lb://pigx-daemon-quartz', 0, NULL, ' ', ' ', '2019-10-16 16:44:41', '2019-11-05 22:37:02', '0'); +INSERT INTO `sys_route_conf` VALUES (6, '分布式事务模块', 'pigx-tx-manager', '[{\"args\": {\"_genkey_0\": \"/tx/**\"}, \"name\": \"Path\"}]', '[]', 'lb://pigx-tx-manager', 0, NULL, ' ', ' ', '2019-10-16 16:44:41', '2019-11-05 22:37:04', '0'); +INSERT INTO `sys_route_conf` VALUES (7, '通用权限模块', 'pigx-upms-biz', '[{\"args\": {\"_genkey_0\": \"/admin/**\"}, \"name\": \"Path\"}]', '[{\"args\": {\"key-resolver\": \"#{@remoteAddrKeyResolver}\", \"redis-rate-limiter.burstCapacity\": \"1000\", \"redis-rate-limiter.replenishRate\": \"1000\"}, \"name\": \"RequestRateLimiter\"}]', 'lb://pigx-upms-biz', 0, '{\"response-timeout\": \"30000\"}', ' ', ' ', '2019-10-16 16:44:41', '2021-12-14 13:24:55', '0'); +INSERT INTO `sys_route_conf` VALUES (8, '工作流长链接支持', 'pigx-oa-platform-ws', '[{\"args\": {\"_genkey_0\": \"/act/ws/**\"}, \"name\": \"Path\"}]', '[]', 'lb:ws://pigx-oa-platform', 100, NULL, ' ', ' ', '2019-10-16 16:44:41', '2019-11-05 22:37:09', '0'); +INSERT INTO `sys_route_conf` VALUES (9, '微信公众号管理', 'pigx-mp-platform', '[{\"args\": {\"_genkey_0\": \"/mp/**\"}, \"name\": \"Path\"}]', '[]', 'lb://pigx-mp-platform', 0, NULL, ' ', ' ', '2019-10-16 16:44:41', '2019-11-05 22:37:12', '0'); +INSERT INTO `sys_route_conf` VALUES (10, '支付管理', 'pigx-pay-platform', '[{\"args\": {\"_genkey_0\": \"/pay/**\"}, \"name\": \"Path\"}]', '[]', 'lb://pigx-pay-platform', 0, NULL, ' ', ' ', '2019-10-16 16:44:41', '2019-11-05 22:37:13', '0'); +INSERT INTO `sys_route_conf` VALUES (11, '监控管理', 'pigx-monitor', '[{\"args\": {\"_genkey_0\": \"/monitor/**\"}, \"name\": \"Path\"}]', '[]', 'lb://pigx-monitor', 0, NULL, ' ', ' ', '2019-10-16 16:44:41', '2019-11-05 22:37:17', '0'); +INSERT INTO `sys_route_conf` VALUES (12, '积木报表', 'pigx-jimu-platform\n', '[{\"args\": {\"_genkey_0\": \"/jimu/**\"}, \"name\": \"Path\"}]', '[]', 'lb://pigx-jimu-platform', 0, NULL, ' ', ' ', '2019-10-16 16:44:41', '2019-11-05 22:37:17', '0'); +INSERT INTO `sys_route_conf` VALUES (13, '大屏设计', 'pigx-report-platform', '[{\"args\": {\"_genkey_0\": \"/gv/**\"}, \"name\": \"Path\"}]', '[]', 'lb://pigx-report-platform', 0, '{}', ' ', ' ', '2022-08-27 02:38:43', '2023-04-05 07:52:27', '0'); +INSERT INTO `sys_route_conf` VALUES (14, 'APP服务', 'pigx-app-server', '[{\"args\": {\"_genkey_0\": \"/app/**\"}, \"name\": \"Path\"}]', '[]', 'lb://pigx-app-server-biz', 0, '{}', 'admin', ' ', '2022-12-07 10:53:44', NULL, '0'); +INSERT INTO `sys_route_conf` VALUES (15, '工作流引擎', 'pigx-flow-task-biz', '[{\"args\": {\"_genkey_0\": \"/task/**\"}, \"name\": \"Path\"}]', '[]', 'lb://pigx-flow-task-biz', 0, '{}', ' ', ' ', '2023-07-28 16:50:26', NULL, '0'); +COMMIT; + +-- ---------------------------- +-- Table structure for sys_schedule +-- ---------------------------- +DROP TABLE IF EXISTS `sys_schedule`; +CREATE TABLE `sys_schedule` ( + `id` bigint(20) NOT NULL COMMENT 'id', + `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '标题', + `type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '日程类型', + `state` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '状态', + `content` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '内容', + `time` time DEFAULT NULL COMMENT '时间', + `date` date DEFAULT NULL COMMENT '日期', + `create_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ' ' COMMENT '创建人', + `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ' ' COMMENT '修改人', + `update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标记', + `tenant_id` bigint(20) unsigned DEFAULT NULL COMMENT '租户ID', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +-- ---------------------------- +-- Records of sys_schedule +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for sys_social_details +-- ---------------------------- +DROP TABLE IF EXISTS `sys_social_details`; +CREATE TABLE `sys_social_details` ( + `id` bigint(20) NOT NULL COMMENT '主键', + `type` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '社交登录类型', + `remark` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注', + `app_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '应用ID', + `app_secret` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '应用密钥', + `redirect_url` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '回调地址', + `ext` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '拓展字段', + `create_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ' ' COMMENT '创建人', + `update_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ' ' COMMENT '修改人', + `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标记,0未删除,1已删除', + `tenant_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '所属租户', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='系统社交登录账号表'; + +-- ---------------------------- +-- Records of sys_social_details +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for sys_tenant +-- ---------------------------- +DROP TABLE IF EXISTS `sys_tenant`; +CREATE TABLE `sys_tenant` ( + `id` bigint(20) NOT NULL COMMENT '租户ID', + `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '租户名称', + `code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '租户编码', + `tenant_domain` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '租户域名', + `website_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '网站名称', + `mini_qr` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '移动端二维码', + `background` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '登录页背景图', + `footer` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '页脚信息', + `logo` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'logo', + `start_time` datetime DEFAULT NULL COMMENT '租户开始时间', + `end_time` datetime DEFAULT NULL COMMENT '租户结束时间', + `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '租户状态,0正常,1停用', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标记,0未删除,1已删除', + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT ' ' COMMENT '创建人', + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT ' ' COMMENT '修改人', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `menu_id` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '租户菜单ID', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='租户表'; + +-- ---------------------------- +-- Records of sys_tenant +-- ---------------------------- +BEGIN; +INSERT INTO `sys_tenant` VALUES (1, '北京分公司', '1', '', NULL, NULL, NULL, NULL, NULL, '2019-05-15 00:00:00', '2029-05-15 00:00:00', '0', '0', '', 'admin', '2019-05-15 15:44:57', '2023-07-30 14:52:57', 1642752536722997250); +COMMIT; + + +-- ---------------------------- +-- Table structure for sys_user +-- ---------------------------- +DROP TABLE IF EXISTS `sys_user`; +CREATE TABLE `sys_user` ( + `user_id` bigint(20) NOT NULL COMMENT '用户ID', + `username` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '用户名', + `password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '密码', + `salt` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '盐值', + `phone` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '电话号码', + `avatar` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '头像', + `nickname` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '昵称', + `name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '姓名', + `email` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '邮箱地址', + `dept_id` bigint(20) DEFAULT NULL COMMENT '所属部门ID', + `create_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ' ' COMMENT '创建人', + `update_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ' ' COMMENT '修改人', + `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', + `lock_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '锁定标记,0未锁定,9已锁定', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标记,0未删除,1已删除', + `wx_openid` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '微信登录openId', + `mini_openid` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '小程序openId', + `qq_openid` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'QQ openId', + `gitee_login` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '码云标识', + `osc_id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '开源中国标识', + `tenant_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '所属租户ID', + PRIMARY KEY (`user_id`) USING BTREE, + KEY `user_wx_openid` (`wx_openid`) USING BTREE, + KEY `user_qq_openid` (`qq_openid`) USING BTREE, + KEY `user_idx1_username` (`username`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='用户表'; + +-- ---------------------------- +-- Records of sys_user +-- ---------------------------- +BEGIN; +INSERT INTO `sys_user` VALUES (1, 'admin', '$2a$10$c/Ae0pRjJtMZg3BnvVpO.eIK6WYWVbKTzqgdy3afR7w.vd.xi3Mgy', '', '17034642999', '/admin/sys-file/local/46811160fd824c7998303a73fb368076.png', '管理员666777', '管理员', 'sw@mail.pigxl.vip', 4, ' ', 'admin', '2018-04-20 07:15:18', '2023-04-06 16:04:23', '0', '0', NULL, 'oBxPy5E-v82xWGsfzZVzkD3wEX64', NULL, 'log4j', NULL, 1); +COMMIT; + +-- ---------------------------- +-- Table structure for sys_user_post +-- ---------------------------- +DROP TABLE IF EXISTS `sys_user_post`; +CREATE TABLE `sys_user_post` ( + `user_id` bigint(20) NOT NULL COMMENT '用户ID', + `post_id` bigint(20) NOT NULL COMMENT '岗位ID', + PRIMARY KEY (`user_id`,`post_id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='用户与岗位关联表'; + +-- ---------------------------- +-- Records of sys_user_post +-- ---------------------------- +BEGIN; +INSERT INTO `sys_user_post` VALUES (1, 1); +COMMIT; + +-- ---------------------------- +-- Table structure for sys_user_role +-- ---------------------------- +DROP TABLE IF EXISTS `sys_user_role`; +CREATE TABLE `sys_user_role` ( + `user_id` bigint(20) NOT NULL COMMENT '用户ID', + `role_id` bigint(20) NOT NULL COMMENT '角色ID', + PRIMARY KEY (`user_id`,`role_id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='用户角色表'; + +-- ---------------------------- +-- Records of sys_user_role +-- ---------------------------- +BEGIN; +INSERT INTO `sys_user_role` VALUES (1, 1); +COMMIT; + +SET FOREIGN_KEY_CHECKS = 1; diff --git a/db/3pigxx_flow.sql b/db/3pigxx_flow.sql new file mode 100644 index 0000000..8645fa9 --- /dev/null +++ b/db/3pigxx_flow.sql @@ -0,0 +1,198 @@ +USE pigxx_flow; + +SET NAMES utf8mb4; +SET FOREIGN_KEY_CHECKS = 0; + +-- ---------------------------- +-- Table structure for process +-- ---------------------------- +DROP TABLE IF EXISTS `process`; +CREATE TABLE `process` ( + `id` bigint NOT NULL COMMENT '用户id', + `del_flag` tinyint(1) NOT NULL COMMENT '逻辑删除字段', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + `flow_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '表单ID', + `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '表单名称', + `logo` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '图标配置', + `settings` json DEFAULT NULL COMMENT '设置项', + `group_id` bigint NOT NULL COMMENT '分组ID', + `form_items` json NOT NULL COMMENT '表单设置内容', + `process` json NOT NULL COMMENT '流程设置内容', + `remark` varchar(125) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注', + `sort` int NOT NULL, + `is_hidden` tinyint(1) NOT NULL COMMENT '0 正常 1=隐藏', + `is_stop` tinyint(1) NOT NULL COMMENT '0 正常 1=停用 ', + `admin_id` bigint DEFAULT NULL COMMENT '流程管理员', + `unique_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '唯一性id', + `admin_list` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '管理员', + `range_show` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '范围描述显示', + `tenant_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '所属租户id', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE KEY `idx_form_id` (`flow_id`) USING BTREE, + KEY `idx_id` (`id`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=182 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC; + + +-- ---------------------------- +-- Table structure for process_copy +-- ---------------------------- +DROP TABLE IF EXISTS `process_copy`; +CREATE TABLE `process_copy` ( + `id` bigint NOT NULL COMMENT '用户id', + `del_flag` tinyint(1) NOT NULL COMMENT '逻辑删除字段', + `create_time` datetime NOT NULL COMMENT '创建时间', + `update_time` datetime NOT NULL COMMENT '更新时间', + `start_time` datetime NOT NULL COMMENT ' 流程发起时间', + `node_time` datetime NOT NULL COMMENT '当前节点时间', + `start_user_id` bigint NOT NULL COMMENT '发起人', + `flow_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '流程id', + `process_instance_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '实例id', + `node_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '节点id', + `group_id` bigint NOT NULL COMMENT '分组id', + `group_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '分组名称', + `process_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '流程名称', + `node_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '节点 名称', + `form_data` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '表单数据', + `user_id` bigint NOT NULL COMMENT '抄送人id', + `tenant_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '所属租户id', + PRIMARY KEY (`id`) USING BTREE, + KEY `idx_id` (`id`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=74 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='流程抄送数据'; + + +-- ---------------------------- +-- Table structure for process_group +-- ---------------------------- +DROP TABLE IF EXISTS `process_group`; +CREATE TABLE `process_group` ( + `id` bigint NOT NULL COMMENT '用户id', + `del_flag` tinyint(1) NOT NULL COMMENT '逻辑删除字段', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + `group_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '分组名', + `sort` int NOT NULL DEFAULT '0' COMMENT '排序', + `tenant_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '所属租户id', + PRIMARY KEY (`id`) USING BTREE, + KEY `idx_id` (`id`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=20 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC; + + + +-- ---------------------------- +-- Table structure for process_instance_record +-- ---------------------------- +DROP TABLE IF EXISTS `process_instance_record`; +CREATE TABLE `process_instance_record` ( + `id` bigint NOT NULL COMMENT '用户id', + `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '流程名字', + `logo` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '头像', + `user_id` bigint NOT NULL COMMENT '用户id', + `del_flag` tinyint(1) NOT NULL COMMENT '逻辑删除字段', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `flow_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '流程id', + `process_instance_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '流程实例id', + `form_data` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '表单数据', + `group_id` bigint DEFAULT NULL COMMENT '组id', + `group_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '组名称', + `status` int DEFAULT '1' COMMENT '状态', + `end_time` datetime DEFAULT NULL COMMENT '结束时间', + `parent_process_instance_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '上级流程实例id', + `tenant_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '所属租户id', + PRIMARY KEY (`id`) USING BTREE, + KEY `idx_id` (`id`) USING BTREE, + KEY `idx_dep_id` (`user_id`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=366 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='流程记录'; + + +-- ---------------------------- +-- Table structure for process_node_data +-- ---------------------------- +DROP TABLE IF EXISTS `process_node_data`; +CREATE TABLE `process_node_data` ( + `id` bigint NOT NULL COMMENT '用户id', + `del_flag` tinyint(1) NOT NULL COMMENT '逻辑删除字段', + `create_time` datetime NOT NULL COMMENT '创建时间', + `update_time` datetime NOT NULL COMMENT '更新时间', + `flow_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '流程id', + `data` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '表单数据', + `node_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `tenant_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '所属租户id', + PRIMARY KEY (`id`) USING BTREE, + KEY `idx_id` (`id`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=1195 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='流程节点数据'; + + +-- ---------------------------- +-- Table structure for process_node_record +-- ---------------------------- +DROP TABLE IF EXISTS `process_node_record`; +CREATE TABLE `process_node_record` ( + `id` bigint NOT NULL COMMENT '用户id', + `del_flag` tinyint(1) NOT NULL COMMENT '逻辑删除字段', + `create_time` datetime NOT NULL COMMENT '创建时间', + `update_time` datetime NOT NULL COMMENT '更新时间', + `flow_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '流程id', + `process_instance_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '流程实例id', + `data` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '表单数据', + `node_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `node_type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '节点类型', + `node_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '节点名字', + `status` int NOT NULL COMMENT '节点状态', + `start_time` datetime NOT NULL COMMENT '开始时间', + `end_time` datetime DEFAULT NULL COMMENT '结束时间', + `execution_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '执行id', + `tenant_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '所属租户id', + PRIMARY KEY (`id`) USING BTREE, + KEY `idx_id` (`id`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=1435 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='流程节点记录'; + + +-- ---------------------------- +-- Table structure for process_node_record_assign_user +-- ---------------------------- +DROP TABLE IF EXISTS `process_node_record_assign_user`; +CREATE TABLE `process_node_record_assign_user` ( + `id` bigint NOT NULL COMMENT '用户id', + `del_flag` tinyint(1) NOT NULL COMMENT '逻辑删除字段', + `create_time` datetime NOT NULL COMMENT '创建时间', + `update_time` datetime NOT NULL COMMENT '更新时间', + `flow_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '流程id', + `process_instance_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '流程实例id', + `data` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '表单数据', + `node_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `user_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT ' 用户id', + `status` int NOT NULL COMMENT '节点状态', + `start_time` datetime NOT NULL COMMENT '开始时间', + `end_time` datetime DEFAULT NULL COMMENT '结束时间', + `execution_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '执行id', + `task_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT ' 任务id', + `approve_desc` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '审批意见', + `node_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT ' 节点名称', + `task_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '任务类型', + `local_data` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '表单本地数据', + `tenant_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '所属租户id', + PRIMARY KEY (`id`) USING BTREE, + KEY `idx_id` (`id`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=597 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='流程节点记录-执行人'; + + +-- ---------------------------- +-- Table structure for process_starter +-- ---------------------------- +DROP TABLE IF EXISTS `process_starter`; +CREATE TABLE `process_starter` ( + `id` bigint NOT NULL COMMENT '用户id', + `del_flag` tinyint(1) NOT NULL COMMENT '逻辑删除字段', + `create_time` datetime NOT NULL COMMENT '创建时间', + `update_time` datetime NOT NULL COMMENT '更新时间', + `type_id` bigint NOT NULL COMMENT '用户id或者部门id', + `type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT ' 类型 user dept', + `process_id` bigint NOT NULL COMMENT '流程id', + `tenant_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '所属租户id', + PRIMARY KEY (`id`) USING BTREE, + KEY `idx_id` (`id`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=217 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='流程发起人'; + +SET FOREIGN_KEY_CHECKS = 1; diff --git a/db/4pigxx_job.sql b/db/4pigxx_job.sql new file mode 100644 index 0000000..3f576bb --- /dev/null +++ b/db/4pigxx_job.sql @@ -0,0 +1,500 @@ +USE pigxx_job; + +SET NAMES utf8mb4; +SET FOREIGN_KEY_CHECKS = 0; + +-- ---------------------------- +-- Table structure for qrtz_blob_triggers +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_blob_triggers`; +CREATE TABLE `qrtz_blob_triggers` ( + `sched_name` varchar(120) CHARACTER SET utf8 NOT NULL, + `trigger_name` varchar(200) CHARACTER SET utf8 NOT NULL, + `trigger_group` varchar(200) CHARACTER SET utf8 NOT NULL, + `blob_data` blob, + PRIMARY KEY (`sched_name`,`trigger_name`,`trigger_group`) USING BTREE, + CONSTRAINT `qrtz_blob_triggers_ibfk_1` FOREIGN KEY (`sched_name`, `trigger_name`, `trigger_group`) REFERENCES `qrtz_triggers` (`sched_name`, `trigger_name`, `trigger_group`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +-- ---------------------------- +-- Records of qrtz_blob_triggers +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for qrtz_calendars +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_calendars`; +CREATE TABLE `qrtz_calendars` ( + `sched_name` varchar(120) CHARACTER SET utf8 NOT NULL, + `calendar_name` varchar(200) CHARACTER SET utf8 NOT NULL, + `calendar` blob NOT NULL, + PRIMARY KEY (`sched_name`,`calendar_name`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +-- ---------------------------- +-- Records of qrtz_calendars +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for qrtz_cron_triggers +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_cron_triggers`; +CREATE TABLE `qrtz_cron_triggers` ( + `sched_name` varchar(120) CHARACTER SET utf8 NOT NULL, + `trigger_name` varchar(200) CHARACTER SET utf8 NOT NULL, + `trigger_group` varchar(200) CHARACTER SET utf8 NOT NULL, + `cron_expression` varchar(200) CHARACTER SET utf8 NOT NULL, + `time_zone_id` varchar(80) CHARACTER SET utf8 DEFAULT NULL, + PRIMARY KEY (`sched_name`,`trigger_name`,`trigger_group`) USING BTREE, + CONSTRAINT `qrtz_cron_triggers_ibfk_1` FOREIGN KEY (`sched_name`, `trigger_name`, `trigger_group`) REFERENCES `qrtz_triggers` (`sched_name`, `trigger_name`, `trigger_group`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +-- ---------------------------- +-- Records of qrtz_cron_triggers +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for qrtz_fired_triggers +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_fired_triggers`; +CREATE TABLE `qrtz_fired_triggers` ( + `sched_name` varchar(120) CHARACTER SET utf8 NOT NULL, + `entry_id` varchar(95) CHARACTER SET utf8 NOT NULL, + `trigger_name` varchar(200) CHARACTER SET utf8 NOT NULL, + `trigger_group` varchar(200) CHARACTER SET utf8 NOT NULL, + `instance_name` varchar(200) CHARACTER SET utf8 NOT NULL, + `fired_time` bigint NOT NULL, + `sched_time` bigint NOT NULL, + `priority` int NOT NULL, + `state` varchar(16) CHARACTER SET utf8 NOT NULL, + `job_name` varchar(200) CHARACTER SET utf8 DEFAULT NULL, + `job_group` varchar(200) CHARACTER SET utf8 DEFAULT NULL, + `is_nonconcurrent` varchar(1) CHARACTER SET utf8 DEFAULT NULL, + `requests_recovery` varchar(1) CHARACTER SET utf8 DEFAULT NULL, + PRIMARY KEY (`sched_name`,`entry_id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +-- ---------------------------- +-- Records of qrtz_fired_triggers +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for qrtz_job_details +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_job_details`; +CREATE TABLE `qrtz_job_details` ( + `sched_name` varchar(120) CHARACTER SET utf8 NOT NULL, + `job_name` varchar(200) CHARACTER SET utf8 NOT NULL, + `job_group` varchar(200) CHARACTER SET utf8 NOT NULL, + `description` varchar(250) CHARACTER SET utf8 DEFAULT NULL, + `job_class_name` varchar(250) CHARACTER SET utf8 NOT NULL, + `is_durable` varchar(1) CHARACTER SET utf8 NOT NULL, + `is_nonconcurrent` varchar(1) CHARACTER SET utf8 NOT NULL, + `is_update_data` varchar(1) CHARACTER SET utf8 NOT NULL, + `requests_recovery` varchar(1) CHARACTER SET utf8 NOT NULL, + `job_data` blob, + PRIMARY KEY (`sched_name`,`job_name`,`job_group`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +-- ---------------------------- +-- Records of qrtz_job_details +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for qrtz_locks +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_locks`; +CREATE TABLE `qrtz_locks` ( + `sched_name` varchar(120) CHARACTER SET utf8 NOT NULL, + `lock_name` varchar(40) CHARACTER SET utf8 NOT NULL, + PRIMARY KEY (`sched_name`,`lock_name`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +-- ---------------------------- +-- Records of qrtz_locks +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for qrtz_paused_trigger_grps +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_paused_trigger_grps`; +CREATE TABLE `qrtz_paused_trigger_grps` ( + `sched_name` varchar(120) CHARACTER SET utf8 NOT NULL, + `trigger_group` varchar(200) CHARACTER SET utf8 NOT NULL, + PRIMARY KEY (`sched_name`,`trigger_group`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +-- ---------------------------- +-- Records of qrtz_paused_trigger_grps +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for qrtz_scheduler_state +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_scheduler_state`; +CREATE TABLE `qrtz_scheduler_state` ( + `sched_name` varchar(120) CHARACTER SET utf8 NOT NULL, + `instance_name` varchar(200) CHARACTER SET utf8 NOT NULL, + `last_checkin_time` bigint NOT NULL, + `checkin_interval` bigint NOT NULL, + PRIMARY KEY (`sched_name`,`instance_name`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +-- ---------------------------- +-- Records of qrtz_scheduler_state +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for qrtz_simple_triggers +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_simple_triggers`; +CREATE TABLE `qrtz_simple_triggers` ( + `sched_name` varchar(120) CHARACTER SET utf8 NOT NULL, + `trigger_name` varchar(200) CHARACTER SET utf8 NOT NULL, + `trigger_group` varchar(200) CHARACTER SET utf8 NOT NULL, + `repeat_count` bigint NOT NULL, + `repeat_interval` bigint NOT NULL, + `times_triggered` bigint NOT NULL, + PRIMARY KEY (`sched_name`,`trigger_name`,`trigger_group`) USING BTREE, + CONSTRAINT `QRTZ_SIMPLE_TRIGGERS_IBFK_1` FOREIGN KEY (`sched_name`, `trigger_name`, `trigger_group`) REFERENCES `qrtz_triggers` (`sched_name`, `trigger_name`, `trigger_group`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +-- ---------------------------- +-- Records of qrtz_simple_triggers +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for qrtz_simprop_triggers +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_simprop_triggers`; +CREATE TABLE `qrtz_simprop_triggers` ( + `sched_name` varchar(120) CHARACTER SET utf8 NOT NULL, + `trigger_name` varchar(200) CHARACTER SET utf8 NOT NULL, + `trigger_group` varchar(200) CHARACTER SET utf8 NOT NULL, + `str_prop_1` varchar(512) CHARACTER SET utf8 DEFAULT NULL, + `str_prop_2` varchar(512) CHARACTER SET utf8 DEFAULT NULL, + `str_prop_3` varchar(512) CHARACTER SET utf8 DEFAULT NULL, + `int_prop_1` int DEFAULT NULL, + `int_prop_2` int DEFAULT NULL, + `long_prop_1` bigint DEFAULT NULL, + `long_prop_2` bigint DEFAULT NULL, + `dec_prop_1` decimal(13,4) DEFAULT NULL, + `dec_prop_2` decimal(13,4) DEFAULT NULL, + `bool_prop_1` varchar(1) CHARACTER SET utf8 DEFAULT NULL, + `bool_prop_2` varchar(1) CHARACTER SET utf8 DEFAULT NULL, + PRIMARY KEY (`sched_name`,`trigger_name`,`trigger_group`) USING BTREE, + CONSTRAINT `QRTZ_SIMPROP_TRIGGERS_IBFK_1` FOREIGN KEY (`sched_name`, `trigger_name`, `trigger_group`) REFERENCES `qrtz_triggers` (`sched_name`, `trigger_name`, `trigger_group`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +-- ---------------------------- +-- Records of qrtz_simprop_triggers +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for qrtz_triggers +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_triggers`; +CREATE TABLE `qrtz_triggers` ( + `sched_name` varchar(120) CHARACTER SET utf8 NOT NULL, + `trigger_name` varchar(200) CHARACTER SET utf8 NOT NULL, + `trigger_group` varchar(200) CHARACTER SET utf8 NOT NULL, + `job_name` varchar(200) CHARACTER SET utf8 NOT NULL, + `job_group` varchar(200) CHARACTER SET utf8 NOT NULL, + `description` varchar(250) CHARACTER SET utf8 DEFAULT NULL, + `next_fire_time` bigint DEFAULT NULL, + `prev_fire_time` bigint DEFAULT NULL, + `priority` int DEFAULT NULL, + `trigger_state` varchar(16) CHARACTER SET utf8 NOT NULL, + `trigger_type` varchar(8) CHARACTER SET utf8 NOT NULL, + `start_time` bigint NOT NULL, + `end_time` bigint DEFAULT NULL, + `calendar_name` varchar(200) CHARACTER SET utf8 DEFAULT NULL, + `misfire_instr` smallint DEFAULT NULL, + `job_data` blob, + PRIMARY KEY (`sched_name`,`trigger_name`,`trigger_group`) USING BTREE, + KEY `sched_name` (`sched_name`,`job_name`,`job_group`) USING BTREE, + CONSTRAINT `qrtz_triggers_ibfk_1` FOREIGN KEY (`sched_name`, `job_name`, `job_group`) REFERENCES `qrtz_job_details` (`sched_name`, `job_name`, `job_group`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +-- ---------------------------- +-- Records of qrtz_triggers +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for sys_job +-- ---------------------------- +DROP TABLE IF EXISTS `sys_job`; +CREATE TABLE `sys_job` ( + `job_id` bigint NOT NULL COMMENT '任务id', + `job_name` varchar(64) CHARACTER SET utf8mb4 NOT NULL COMMENT '任务名称', + `job_group` varchar(64) CHARACTER SET utf8mb4 NOT NULL COMMENT '任务组名', + `job_order` char(1) CHARACTER SET utf8mb4 DEFAULT '1' COMMENT '组内执行顺利,值越大执行优先级越高,最大值9,最小值1', + `job_type` char(1) CHARACTER SET utf8mb4 NOT NULL DEFAULT '1' COMMENT '1、java类;2、spring bean名称;3、rest调用;4、jar调用;9其他', + `execute_path` varchar(500) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT 'job_type=3时,rest调用地址,仅支持rest get协议,需要增加String返回值,0成功,1失败;job_type=4时,jar路径;其它值为空', + `class_name` varchar(500) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT 'job_type=1时,类完整路径;job_type=2时,spring bean名称;其它值为空', + `method_name` varchar(500) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT '任务方法', + `method_params_value` varchar(2000) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT '参数值', + `cron_expression` varchar(255) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT 'cron执行表达式', + `misfire_policy` varchar(20) CHARACTER SET utf8mb4 DEFAULT '3' COMMENT '错失执行策略(1错失周期立即执行 2错失周期执行一次 3下周期执行)', + `job_tenant_type` char(1) CHARACTER SET utf8mb4 DEFAULT '1' COMMENT '1、多租户任务;2、非多租户任务', + `job_status` char(1) CHARACTER SET utf8mb4 DEFAULT '0' COMMENT '状态(1、未发布;2、运行中;3、暂停;4、删除;)', + `job_execute_status` char(1) CHARACTER SET utf8mb4 DEFAULT '0' COMMENT '状态(0正常 1异常)', + `create_by` varchar(64) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_by` varchar(64) CHARACTER SET utf8mb4 DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间', + `start_time` timestamp NULL DEFAULT NULL COMMENT '初次执行时间', + `previous_time` timestamp NULL DEFAULT NULL COMMENT '上次执行时间', + `next_time` timestamp NULL DEFAULT NULL COMMENT '下次执行时间', + `tenant_id` bigint DEFAULT '1' COMMENT '租户', + `remark` varchar(500) CHARACTER SET utf8mb4 DEFAULT '' COMMENT '备注信息', + PRIMARY KEY (`job_id`,`job_name`,`job_group`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='定时任务调度表'; + +-- ---------------------------- +-- Records of sys_job +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for sys_job_log +-- ---------------------------- +DROP TABLE IF EXISTS `sys_job_log`; +CREATE TABLE `sys_job_log` ( + `job_log_id` bigint NOT NULL COMMENT '任务日志ID', + `job_id` bigint NOT NULL COMMENT '任务id', + `job_name` varchar(64) CHARACTER SET utf8 DEFAULT NULL COMMENT '任务名称', + `job_group` varchar(64) CHARACTER SET utf8 DEFAULT NULL COMMENT '任务组名', + `job_order` char(1) CHARACTER SET utf8 DEFAULT NULL COMMENT '组内执行顺利,值越大执行优先级越高,最大值9,最小值1', + `job_type` char(1) CHARACTER SET utf8 NOT NULL DEFAULT '1' COMMENT '1、java类;2、spring bean名称;3、rest调用;4、jar调用;9其他', + `execute_path` varchar(500) CHARACTER SET utf8 DEFAULT NULL COMMENT 'job_type=3时,rest调用地址,仅支持post协议;job_type=4时,jar路径;其它值为空', + `class_name` varchar(500) CHARACTER SET utf8 DEFAULT NULL COMMENT 'job_type=1时,类完整路径;job_type=2时,spring bean名称;其它值为空', + `method_name` varchar(500) CHARACTER SET utf8 DEFAULT NULL COMMENT '任务方法', + `method_params_value` varchar(2000) CHARACTER SET utf8 DEFAULT NULL COMMENT '参数值', + `cron_expression` varchar(255) CHARACTER SET utf8 DEFAULT NULL COMMENT 'cron执行表达式', + `job_message` varchar(500) CHARACTER SET utf8 DEFAULT NULL COMMENT '日志信息', + `job_log_status` char(1) CHARACTER SET utf8 DEFAULT '0' COMMENT '执行状态(0正常 1失败)', + `execute_time` varchar(30) CHARACTER SET utf8 DEFAULT NULL COMMENT '执行时间', + `exception_info` varchar(2000) CHARACTER SET utf8 DEFAULT '' COMMENT '异常信息', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `tenant_id` bigint NOT NULL DEFAULT '1' COMMENT '租户id', + PRIMARY KEY (`job_log_id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='定时任务执行日志表'; + +-- ---------------------------- +-- Records of sys_job_log +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for xxl_job_group +-- ---------------------------- +DROP TABLE IF EXISTS `xxl_job_group`; +CREATE TABLE `xxl_job_group` ( + `id` int NOT NULL AUTO_INCREMENT, + `app_name` varchar(64) CHARACTER SET utf8mb4 NOT NULL COMMENT '执行器AppName', + `title` varchar(12) CHARACTER SET utf8mb4 NOT NULL COMMENT '执行器名称', + `address_type` tinyint NOT NULL DEFAULT '0' COMMENT '执行器地址类型:0=自动注册、1=手动录入', + `address_list` text CHARACTER SET utf8mb4 COMMENT '执行器地址列表,多地址逗号分隔', + `update_time` datetime DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +-- ---------------------------- +-- Records of xxl_job_group +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for xxl_job_info +-- ---------------------------- +DROP TABLE IF EXISTS `xxl_job_info`; +CREATE TABLE `xxl_job_info` ( + `id` int NOT NULL AUTO_INCREMENT, + `job_group` int NOT NULL COMMENT '执行器主键ID', + `job_desc` varchar(255) CHARACTER SET utf8mb4 NOT NULL, + `add_time` datetime DEFAULT NULL, + `update_time` datetime DEFAULT NULL, + `author` varchar(64) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT '作者', + `alarm_email` varchar(255) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT '报警邮件', + `schedule_type` varchar(50) CHARACTER SET utf8mb4 NOT NULL DEFAULT 'NONE' COMMENT '调度类型', + `schedule_conf` varchar(128) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT '调度配置,值含义取决于调度类型', + `misfire_strategy` varchar(50) CHARACTER SET utf8mb4 NOT NULL DEFAULT 'DO_NOTHING' COMMENT '调度过期策略', + `executor_route_strategy` varchar(50) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT '执行器路由策略', + `executor_handler` varchar(255) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT '执行器任务handler', + `executor_param` varchar(512) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT '执行器任务参数', + `executor_block_strategy` varchar(50) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT '阻塞处理策略', + `executor_timeout` int NOT NULL DEFAULT '0' COMMENT '任务执行超时时间,单位秒', + `executor_fail_retry_count` int NOT NULL DEFAULT '0' COMMENT '失败重试次数', + `glue_type` varchar(50) CHARACTER SET utf8mb4 NOT NULL COMMENT 'GLUE类型', + `glue_source` mediumtext CHARACTER SET utf8mb4 COMMENT 'GLUE源代码', + `glue_remark` varchar(128) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT 'GLUE备注', + `glue_updatetime` datetime DEFAULT NULL COMMENT 'GLUE更新时间', + `child_jobid` varchar(255) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT '子任务ID,多个逗号分隔', + `trigger_status` tinyint NOT NULL DEFAULT '0' COMMENT '调度状态:0-停止,1-运行', + `trigger_last_time` bigint NOT NULL DEFAULT '0' COMMENT '上次调度时间', + `trigger_next_time` bigint NOT NULL DEFAULT '0' COMMENT '下次调度时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +-- ---------------------------- +-- Records of xxl_job_info +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for xxl_job_lock +-- ---------------------------- +DROP TABLE IF EXISTS `xxl_job_lock`; +CREATE TABLE `xxl_job_lock` ( + `lock_name` varchar(50) CHARACTER SET utf8mb4 NOT NULL COMMENT '锁名称', + PRIMARY KEY (`lock_name`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +-- ---------------------------- +-- Records of xxl_job_lock +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for xxl_job_log +-- ---------------------------- +DROP TABLE IF EXISTS `xxl_job_log`; +CREATE TABLE `xxl_job_log` ( + `id` bigint NOT NULL AUTO_INCREMENT, + `job_group` int NOT NULL COMMENT '执行器主键ID', + `job_id` int NOT NULL COMMENT '任务,主键ID', + `executor_address` varchar(255) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT '执行器地址,本次执行的地址', + `executor_handler` varchar(255) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT '执行器任务handler', + `executor_param` varchar(512) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT '执行器任务参数', + `executor_sharding_param` varchar(20) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT '执行器任务分片参数,格式如 1/2', + `executor_fail_retry_count` int NOT NULL DEFAULT '0' COMMENT '失败重试次数', + `trigger_time` datetime DEFAULT NULL COMMENT '调度-时间', + `trigger_code` int NOT NULL COMMENT '调度-结果', + `trigger_msg` text CHARACTER SET utf8mb4 COMMENT '调度-日志', + `handle_time` datetime DEFAULT NULL COMMENT '执行-时间', + `handle_code` int NOT NULL COMMENT '执行-状态', + `handle_msg` text CHARACTER SET utf8mb4 COMMENT '执行-日志', + `alarm_status` tinyint NOT NULL DEFAULT '0' COMMENT '告警状态:0-默认、1-无需告警、2-告警成功、3-告警失败', + PRIMARY KEY (`id`) USING BTREE, + KEY `I_trigger_time` (`trigger_time`) USING BTREE, + KEY `I_handle_code` (`handle_code`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +-- ---------------------------- +-- Records of xxl_job_log +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for xxl_job_log_report +-- ---------------------------- +DROP TABLE IF EXISTS `xxl_job_log_report`; +CREATE TABLE `xxl_job_log_report` ( + `id` int NOT NULL AUTO_INCREMENT, + `trigger_day` datetime DEFAULT NULL COMMENT '调度-时间', + `running_count` int NOT NULL DEFAULT '0' COMMENT '运行中-日志数量', + `suc_count` int NOT NULL DEFAULT '0' COMMENT '执行成功-日志数量', + `fail_count` int NOT NULL DEFAULT '0' COMMENT '执行失败-日志数量', + `update_time` datetime DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE, + UNIQUE KEY `i_trigger_day` (`trigger_day`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +-- ---------------------------- +-- Records of xxl_job_log_report +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for xxl_job_logglue +-- ---------------------------- +DROP TABLE IF EXISTS `xxl_job_logglue`; +CREATE TABLE `xxl_job_logglue` ( + `id` int NOT NULL AUTO_INCREMENT, + `job_id` int NOT NULL COMMENT '任务,主键ID', + `glue_type` varchar(50) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT 'GLUE类型', + `glue_source` mediumtext CHARACTER SET utf8mb4 COMMENT 'GLUE源代码', + `glue_remark` varchar(128) CHARACTER SET utf8mb4 NOT NULL COMMENT 'GLUE备注', + `add_time` datetime DEFAULT NULL, + `update_time` datetime DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +-- ---------------------------- +-- Records of xxl_job_logglue +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for xxl_job_registry +-- ---------------------------- +DROP TABLE IF EXISTS `xxl_job_registry`; +CREATE TABLE `xxl_job_registry` ( + `id` int NOT NULL AUTO_INCREMENT, + `registry_group` varchar(50) CHARACTER SET utf8mb4 NOT NULL, + `registry_key` varchar(255) CHARACTER SET utf8mb4 NOT NULL, + `registry_value` varchar(255) CHARACTER SET utf8mb4 NOT NULL, + `update_time` datetime DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE, + KEY `i_g_k_v` (`registry_group`,`registry_key`,`registry_value`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +-- ---------------------------- +-- Records of xxl_job_registry +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for xxl_job_user +-- ---------------------------- +DROP TABLE IF EXISTS `xxl_job_user`; +CREATE TABLE `xxl_job_user` ( + `id` int NOT NULL AUTO_INCREMENT, + `username` varchar(50) CHARACTER SET utf8mb4 NOT NULL COMMENT '账号', + `password` varchar(50) CHARACTER SET utf8mb4 NOT NULL COMMENT '密码', + `role` tinyint NOT NULL COMMENT '角色:0-普通用户、1-管理员', + `permission` varchar(255) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT '权限:执行器ID列表,多个逗号分割', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE KEY `i_username` (`username`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +-- ---------------------------- +-- Records of xxl_job_user +-- ---------------------------- +BEGIN; +INSERT INTO `xxl_job_user`(`id`, `username`, `password`, `role`, `permission`) VALUES (1, 'admin', 'e10adc3949ba59abbe56e057f20f883e', 1, NULL); +COMMIT; + +SET FOREIGN_KEY_CHECKS = 1; diff --git a/db/5pigxx_mp.sql b/db/5pigxx_mp.sql new file mode 100644 index 0000000..d50bb8e --- /dev/null +++ b/db/5pigxx_mp.sql @@ -0,0 +1,197 @@ +USE pigxx_mp; + +SET NAMES utf8mb4; +SET FOREIGN_KEY_CHECKS = 0; + +-- ---------------------------- +-- Table structure for wx_account +-- ---------------------------- +DROP TABLE IF EXISTS `wx_account`; +CREATE TABLE `wx_account` ( + `id` bigint(20) NOT NULL COMMENT '主键ID', + `name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '名称', + `account` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '账号', + `appid` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '应用ID', + `appsecret` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '应用秘钥', + `url` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'URL地址', + `token` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'Token令牌', + `aeskey` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '消息加解密密钥', + `qr_url` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '二维码URL地址', + `create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标记,0未删除,1已删除', + `tenant_id` bigint(20) DEFAULT NULL COMMENT '租户ID', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='公众号账户表'; + +-- ---------------------------- +-- Records of wx_account +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for wx_account_fans +-- ---------------------------- +DROP TABLE IF EXISTS `wx_account_fans`; +CREATE TABLE `wx_account_fans` ( + `id` bigint(20) NOT NULL COMMENT '主键ID', + `openid` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '粉丝openid', + `subscribe_status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '订阅状态,0未订阅,1已订阅', + `subscribe_time` datetime DEFAULT NULL COMMENT '订阅时间', + `nickname` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '昵称', + `gender` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '性别', + `language` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '语言', + `country` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '国家', + `province` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '省份', + `city` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '城市', + `tag_ids` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '分组ID', + `headimg_url` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '头像URL地址', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注信息', + `wx_account_id` bigint(20) DEFAULT NULL COMMENT '微信公众号ID', + `wx_account_name` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '微信公众号名称', + `wx_account_appid` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '微信公众号AppID', + `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标记,0未删除,1已删除', + `tenant_id` bigint(20) DEFAULT NULL COMMENT '租户ID', + `is_black` int(255) DEFAULT NULL COMMENT '是否在黑名单', + PRIMARY KEY (`id`) USING BTREE, + KEY `idx_1` (`openid`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='微信公众号粉丝表'; + +-- ---------------------------- +-- Records of wx_account_fans +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for wx_account_tag +-- ---------------------------- +DROP TABLE IF EXISTS `wx_account_tag`; +CREATE TABLE `wx_account_tag` ( + `id` bigint(20) NOT NULL COMMENT '主键ID', + `tag` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '标签名称', + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '创建人', + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '修改人', + `create_time` datetime NOT NULL COMMENT '创建时间', + `update_time` datetime NOT NULL COMMENT '修改时间', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '0' COMMENT '删除标记,0未删除,1已删除', + `tenant_id` bigint(20) NOT NULL COMMENT '租户ID', + `wx_account_id` bigint(20) NOT NULL COMMENT '微信公众号ID', + `wx_account_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '微信公众号名称', + `wx_account_appid` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '微信公众号AppID', + `tag_id` bigint(20) NOT NULL COMMENT '标签ID', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='微信公众号标签表'; + +-- ---------------------------- +-- Records of wx_account_tag +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for wx_auto_reply +-- ---------------------------- +DROP TABLE IF EXISTS `wx_auto_reply`; +CREATE TABLE `wx_auto_reply` ( + `id` bigint(20) NOT NULL COMMENT '主键', + `type` char(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '类型(1、关注时回复;2、消息回复;3、关键词回复)', + `req_key` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '关键词', + `req_type` char(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '请求消息类型(text:文本;image:图片;voice:语音;video:视频;shortvideo:小视频;location:地理位置)', + `rep_type` char(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '回复消息类型(text:文本;image:图片;voice:语音;video:视频;music:音乐;news:图文)', + `rep_mate` char(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '回复类型文本匹配类型(1、全匹配,2、半匹配)', + `rep_content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '回复类型文本保存文字', + `rep_media_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '回复类型imge、voice、news、video的mediaID或音乐缩略图的媒体id', + `rep_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '回复的素材名、视频和音乐的标题', + `rep_desc` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '视频和音乐的描述', + `rep_url` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '链接', + `rep_hq_url` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '高质量链接', + `rep_thumb_media_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '缩略图的媒体id', + `rep_thumb_url` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '缩略图url', + `content` json DEFAULT NULL COMMENT '图文消息的内容', + `app_id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '公众号ID', + `remark` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '备注', + `del_flag` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT '0' COMMENT '逻辑删除标记(0:显示;1:隐藏)', + `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `tenant_id` bigint(20) DEFAULT NULL COMMENT '租户ID', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='微信自动回复'; + +-- ---------------------------- +-- Records of wx_auto_reply +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for wx_mp_menu +-- ---------------------------- +DROP TABLE IF EXISTS `wx_mp_menu`; +CREATE TABLE `wx_mp_menu` ( + `id` bigint(20) NOT NULL COMMENT '主键', + `menu` json DEFAULT NULL COMMENT '菜单', + `wx_account_id` bigint(20) DEFAULT NULL COMMENT '公众号ID', + `wx_account_appid` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '公众号APPID', + `wx_account_name` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '公众号名称', + `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标记', + `pub_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '发布标志', + `tenant_id` bigint(20) DEFAULT NULL COMMENT '租户ID', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='微信菜单表'; + +-- ---------------------------- +-- Records of wx_mp_menu +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for wx_msg +-- ---------------------------- +DROP TABLE IF EXISTS `wx_msg`; +CREATE TABLE `wx_msg` ( + `id` bigint(20) NOT NULL COMMENT '主键', + `app_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '公众号名称', + `app_logo` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '公众号logo', + `wx_user_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '微信用户ID', + `nick_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '微信用户昵称', + `headimg_url` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '微信用户头像', + `type` char(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '消息分类(1、用户发给公众号;2、公众号发给用户;)', + `rep_type` char(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '消息类型(text:文本;image:图片;voice:语音;video:视频;shortvideo:小视频;location:地理位置;music:音乐;news:图文;event:推送事件)', + `rep_event` char(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '事件类型(subscribe:关注;unsubscribe:取关;CLICK、VIEW:菜单事件)', + `rep_content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '回复类型文本保存文字、地理位置信息', + `rep_media_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '回复类型imge、voice、news、video的mediaID或音乐缩略图的媒体id', + `rep_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '回复的素材名、视频和音乐的标题', + `rep_desc` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '视频和音乐的描述', + `rep_url` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '链接', + `rep_hq_url` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '高质量链接', + `content` json DEFAULT NULL COMMENT '图文消息的内容', + `rep_thumb_media_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '缩略图的媒体id', + `rep_thumb_url` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '缩略图url', + `rep_location_x` double DEFAULT NULL COMMENT '地理位置维度', + `rep_location_y` double DEFAULT NULL COMMENT '地理位置经度', + `rep_scale` double DEFAULT NULL COMMENT '地图缩放大小', + `read_flag` char(2) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT '1' COMMENT '已读标记(1:是;0:否)', + `app_id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '公众号ID', + `open_id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '微信唯一标识', + `remark` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '备注', + `del_flag` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT '0' COMMENT '逻辑删除标记(0:显示;1:隐藏)', + `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `tenant_id` bigint(20) DEFAULT NULL COMMENT '租户ID', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='微信消息'; + +-- ---------------------------- +-- Records of wx_msg +-- ---------------------------- +BEGIN; +COMMIT; + +SET FOREIGN_KEY_CHECKS = 1; diff --git a/db/6pigxx_config.sql b/db/6pigxx_config.sql new file mode 100644 index 0000000..5460299 --- /dev/null +++ b/db/6pigxx_config.sql @@ -0,0 +1,284 @@ +USE pigxx_config; +SET NAMES utf8mb4; +SET FOREIGN_KEY_CHECKS = 0; + +-- ---------------------------- +-- Table structure for config_info +-- ---------------------------- +DROP TABLE IF EXISTS `config_info`; +CREATE TABLE `config_info` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id', + `data_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 'data_id', + `group_id` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, + `content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 'content', + `md5` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT 'md5', + `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间', + `src_user` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL COMMENT 'source user', + `src_ip` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT 'source ip', + `app_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, + `tenant_id` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '' COMMENT '租户字段', + `c_desc` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, + `c_use` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, + `effect` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, + `type` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, + `c_schema` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL, + `encrypted_data_key` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '秘钥', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE INDEX `uk_configinfo_datagrouptenant`(`data_id` ASC, `group_id` ASC, `tenant_id` ASC) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 21 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = 'config_info' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of config_info +-- ---------------------------- +BEGIN; +INSERT INTO `config_info` VALUES (1, 'application-dev.yml', 'DEFAULT_GROUP', '# 配置文件加密根密码\njasypt:\n encryptor:\n password: pigx\n algorithm: PBEWithMD5AndDES\n iv-generator-classname: org.jasypt.iv.NoIvGenerator\n\n\nspring:\n redis:\n host: pigx-redis\n servlet:\n multipart:\n max-file-size: 100MB\n max-request-size: 100MB\n cloud:\n sentinel:\n eager: true\n transport:\n dashboard: pigx-sentinel:5020\nfeign:\n sentinel:\n enabled: true\n okhttp:\n enabled: true\n httpclient:\n enabled: false\n connection-timeout: 20000\n compression:\n request:\n enabled: true\n response:\n enabled: true\n\n# 端点对外暴露\nmanagement:\n endpoints:\n web:\n exposure:\n include: \'*\' \n endpoint:\n restart:\n enabled: true\n health:\n show-details: ALWAYS\n\n#开启灰度\ngray:\n rule:\n enabled: true\n\n# mybatis-plus 配置\nmybatis-plus:\n tenant-enable: ture\n mapper-locations: classpath:/mapper/*Mapper.xml\n global-config:\n capitalMode: true\n banner: false\n db-config:\n id-type: auto\n select-strategy: not_empty\n insert-strategy: not_empty\n update-strategy: not_null\n type-handlers-package: com.pig4cloud.pigx.common.data.handler\n configuration:\n jdbc-type-for-null: \'null\'\n call-setters-on-nulls: true\n shrink-whitespaces-in-sql: true\nmybatis-plus-join:\n banner: false #关闭连表查询组件banner', '0d8e6819eaf052914700e3e24c20b227', '2022-12-16 10:44:25', '2023-09-11 11:57:29', 'nacos', '127.0.0.1', '', '', '', '', '', 'yaml', '', ''); +INSERT INTO `config_info` VALUES (2, 'pigx-auth-dev.yml', 'DEFAULT_GROUP', '# 数据源\nspring:\n freemarker:\n allow-request-override: false\n allow-session-override: false\n cache: true\n charset: UTF-8\n check-template-location: true\n content-type: text/html\n enabled: true\n expose-request-attributes: false\n expose-session-attributes: false\n expose-spring-macro-helpers: true\n prefer-file-system-access: true\n suffix: .ftl\n template-loader-path: classpath:/templates/', '74f53b71c7799aa754da75662378b93c', '2022-12-16 10:44:25', '2022-12-16 10:44:25', NULL, '0:0:0:0:0:0:0:1', '', '', NULL, NULL, NULL, 'yaml', NULL, ''); +INSERT INTO `config_info` VALUES (3, 'pigx-codegen-dev.yml', 'DEFAULT_GROUP', '# 数据源\nspring:\n datasource:\n type: com.alibaba.druid.pool.DruidDataSource\n druid:\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: ${MYSQL_USER:root}\n password: ${MYSQL_PWD:root}\n url: jdbc:mysql://${MYSQL_HOST:pigx-mysql}:${MYSQL_PORT:3309}/${MYSQL_DB:pigxx_codegen}?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&allowMultiQueries=true&allowPublicKeyRetrieval=true\n resources:\n static-locations: classpath:/static/,classpath:/views/\n\n# 租户表维护\npigx:\n tenant:\n column: tenant_id\n tables:\n - gen_datasource_conf\n - gen_form_conf\n - gen_template\n - gen_group\n', '765e72c9ff3b0a4504ea4703fbdd7859', '2022-12-16 10:44:25', '2023-04-07 14:14:25', 'nacos', '127.0.0.1', '', '', '', '', '', 'yaml', '', ''); +INSERT INTO `config_info` VALUES (4, 'pigx-daemon-elastic-job-dev.yml', 'DEFAULT_GROUP', '# 数据源\nspring:\n datasource:\n type: com.alibaba.druid.pool.DruidDataSource\n druid:\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: ${MYSQL_USER:root}\n password: ${MYSQL_PWD:root}\n url: jdbc:mysql://${MYSQL_HOST:pigx-mysql}:${MYSQL_PORT:3309}/${MYSQL_DB:pigxx_job}?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&allowMultiQueries=true&allowPublicKeyRetrieval=true', '09996f46e0b80d7b2aa320ef4cb31c82', '2022-12-16 10:44:25', '2023-04-07 14:14:50', 'nacos', '127.0.0.1', '', '', '', '', '', 'yaml', '', ''); +INSERT INTO `config_info` VALUES (5, 'pigx-gateway-dev.yml', 'DEFAULT_GROUP', 'gateway:\n encode-key: \'pigxpigxpigxpigx\'\n\n# 验证码相关配置参考: http://t.cn/A647jEdu\naj:\n captcha:\n cache-type: redis\n water-mark: pig4cloud\n\n# 固定路由转发配置 无修改\nspring:\n cloud:\n gateway:\n routes:\n - id: openapi\n uri: lb://pigx-gateway\n predicates:\n - Path=/v3/api-docs/**\n filters:\n - RewritePath=/v3/api-docs/(?.*), /$\\{path}/$\\{path}/v3/api-docs\n\n# gateway 刷新端点\nmanagement:\n endpoint:\n gateway:\n enabled: true\n', 'd138f5bafa91ab76dca8c4c1a01c1de2', '2022-12-16 10:44:25', '2023-07-28 16:49:29', 'nacos', '0:0:0:0:0:0:0:1', '', '', '', '', '', 'yaml', '', ''); +INSERT INTO `config_info` VALUES (6, 'pigx-monitor-dev.yml', 'DEFAULT_GROUP', 'spring:\n # 安全配置\n security:\n user:\n name: ENC(rZHA4LW5hHmhLAAzJoFNag==) # pigx\n password: ENC(bjeyh+Aeii3kHXkoo00ZUw==) # pigx\n autoconfigure:\n exclude: com.pig4cloud.pigx.common.core.config.JacksonConfiguration\n boot:\n admin:\n ui:\n title: \'pigx 服务状态监控\'\n brand: \'pigx 服务状态监控\'\n external-views:\n - label: \"SQL监控\"\n url: /druid/sql.html\n order: 2000\n iframe: true\nmanagement:\n endpoints:\n web:\n exposure:\n include: \'*\'\n endpoint:\n health:\n show-details: ALWAYS #显示详细信息\n\n\n# druid 监控的服务\nmonitor:\n applications:\n - pigx-upms-biz\n', '2bb39e4dee3f90d4186d1e42aa666d2a', '2022-12-16 10:44:25', '2023-04-07 14:12:09', 'nacos', '127.0.0.1', '', '', '', '', '', 'yaml', '', ''); +INSERT INTO `config_info` VALUES (7, 'pigx-upms-biz-dev.yml', 'DEFAULT_GROUP', '## spring security 配置\nsecurity:\n oauth2:\n client:\n ignore-urls:\n - /druid/**\n\n# 数据源\nspring:\n autoconfigure:\n exclude: org.springframework.cloud.gateway.config.GatewayAutoConfiguration,org.springframework.cloud.gateway.config.GatewayClassPathWarningAutoConfiguration\n datasource:\n type: com.alibaba.druid.pool.DruidDataSource\n druid:\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: ${MYSQL_USER:root}\n password: ${MYSQL_PWD:root}\n url: jdbc:mysql://${MYSQL_HOST:pigx-mysql}:${MYSQL_PORT:3309}/${MYSQL_DB:pigxx}?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&allowMultiQueries=true&allowPublicKeyRetrieval=true\n stat-view-servlet:\n enabled: true\n allow: \"\"\n url-pattern: /druid/*\n #login-username: admin\n #login-password: admin\n filter:\n stat:\n enabled: true\n log-slow-sql: true\n slow-sql-millis: 10000\n merge-sql: false\n wall:\n config:\n multi-statement-allow: true\n\n# 本地文件系统\nfile:\n local:\n enable: true\n basePath: /Users/lengleng/Downloads/files\n\n# Logger Config\nlogging:\n level:\n com.pig4cloud.pigx.admin.mapper: debug\n\n# 租户表维护\npigx:\n tenant:\n column: tenant_id\n tables:\n - sys_user\n - sys_role\n - sys_menu\n - sys_dept\n - sys_log\n - sys_social_details\n - sys_dict\n - sys_dict_item\n - sys_public_param\n - sys_log\n - sys_file\n - sys_file_group\n - sys_oauth_client_details\n - sys_post', 'a37e3dc8cf649be64bd35cc5e5e355a9', '2022-12-16 10:44:25', '2023-07-28 13:47:59', 'nacos', '0:0:0:0:0:0:0:1', '', '', '', '', '', 'yaml', '', ''); +INSERT INTO `config_info` VALUES (8, 'pigx-daemon-quartz-dev.yml', 'DEFAULT_GROUP', '# 数据源\nspring:\n datasource:\n type: com.alibaba.druid.pool.DruidDataSource\n druid:\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: ${MYSQL_USER:root}\n password: ${MYSQL_PWD:root}\n url: jdbc:mysql://${MYSQL_HOST:pigx-mysql}:${MYSQL_PORT:3309}/${MYSQL_DB:pigxx_job}?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&allowMultiQueries=true&allowPublicKeyRetrieval=true\n resources:\n static-locations: classpath:/static/,classpath:/views/\n quartz:\n #相关属性配置\n properties:\n org:\n quartz:\n scheduler:\n instanceName: clusteredScheduler\n instanceId: AUTO\n jobStore:\n class: org.springframework.scheduling.quartz.LocalDataSourceJobStore\n driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate\n tablePrefix: QRTZ_\n isClustered: true\n clusterCheckinInterval: 10000\n useProperties: false\n threadPool:\n class: org.quartz.simpl.SimpleThreadPool\n threadCount: 50\n threadPriority: 5\n threadsInheritContextClassLoaderOfInitializingThread: true\n #数据库方式\n job-store-type: jdbc\n #初始化表结构\n #jdbc:\n #initialize-schema: never\n\n', '5f7a45c377318ce767433a1e210e8584', '2022-12-16 10:44:25', '2023-04-07 14:13:08', 'nacos', '127.0.0.1', '', '', '', '', '', 'yaml', '', ''); +INSERT INTO `config_info` VALUES (9, 'pigx-pay-platform-dev.yml', 'DEFAULT_GROUP', '# 数据源\nspring:\n datasource:\n type: com.alibaba.druid.pool.DruidDataSource\n druid:\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: ${MYSQL_USER:root}\n password: ${MYSQL_PWD:root}\n url: jdbc:mysql://${MYSQL_HOST:pigx-mysql}:${MYSQL_PORT:3309}/${MYSQL_DB:pigxx_pay}?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&allowMultiQueries=true&allowPublicKeyRetrieval=true\n freemarker:\n allow-request-override: false\n allow-session-override: false\n cache: true\n charset: UTF-8\n check-template-location: true\n content-type: text/html\n enabled: true\n expose-request-attributes: false\n expose-session-attributes: false\n expose-spring-macro-helpers: true\n prefer-file-system-access: true\n suffix: .ftl\n template-loader-path: classpath:/templates/\n# 租户表维护\npigx:\n pay:\n test: lengleng\n aliPayConfig:\n expire-time: 30\n return-url: http://pig4cloud.com\n notify-url: http://payx.yunjihuitong.com/pay/notify/ali/callbak\n wxPayConfig:\n notify-url: https://admin.pig4cloud.com/pay/notify/wx/callbak\n mergePayConfig:\n return-url: http://pig4cloud.com\n notify-url: http://wechat.pigx.top/pay/notify/merge/callbak\n xsequence: #发号器相关配置\n db:\n retry-times: 3\n table-name: pay_sequence\n tenant:\n column: tenant_id\n tables:\n - pay_channel\n - pay_trade_order\n - pay_goods_order\n - pay_notify_record\n - pay_refund_order', 'c70a66d3c300eab1afef0ed4ad9d42d5', '2022-12-16 10:44:25', '2023-04-07 14:12:40', 'nacos', '127.0.0.1', '', '', '', '', '', 'yaml', '', ''); +INSERT INTO `config_info` VALUES (11, 'pigx-mp-platform-dev.yml', 'DEFAULT_GROUP', '# 数据源\nspring:\n datasource:\n type: com.alibaba.druid.pool.DruidDataSource\n druid:\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: ${MYSQL_USER:root}\n password: ${MYSQL_PWD:root}\n url: jdbc:mysql://${MYSQL_HOST:pigx-mysql}:${MYSQL_PORT:3309}/${MYSQL_DB:pigxx_mp}?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&allowMultiQueries=true&allowPublicKeyRetrieval=true\n resources:\n static-locations: classpath:/static/,classpath:/views/\n\n\n# 租户表维护\npigx:\n tenant:\n column: tenant_id\n tables:\n - wx_mp_menu\n - wx_account\n - wx_account_tag\n - wx_account_fans\n - wx_msg\n - wx_auto_reply', 'ea4e59c98b8aeb4dd78ec989e7f197a4', '2022-12-16 10:44:25', '2023-01-29 13:12:59', 'nacos', '0:0:0:0:0:0:0:1', '', '', '', '', '', 'yaml', '', ''); +INSERT INTO `config_info` VALUES (12, 'pigx-xxl-job-admin-dev.yml', 'DEFAULT_GROUP', '# xxl\nxxl:\n job:\n i18n: zh_CN\n logretentiondays: 30\n triggerpool:\n fast.max: 200\n slow.max: 200\n\n# mybatis\nmybatis:\n mapper-locations: classpath:/mybatis-mapper/*Mapper.xml\n\n# spring\nspring:\n datasource:\n type: com.alibaba.druid.pool.DruidDataSource\n druid:\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: ${MYSQL_USER:root}\n password: ${MYSQL_PWD:root}\n url: jdbc:mysql://${MYSQL_HOST:pigx-mysql}:${MYSQL_PORT:3309}/${MYSQL_DB:pigxx_job}?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&allowMultiQueries=true&allowPublicKeyRetrieval=true\n mvc:\n static-path-pattern: /static/**\n freemarker:\n suffix: .ftl\n request-context-attribute: request\n settings:\n number_format: 0.##########\n mail:\n host: smtp.mxhichina.com\n port: 465\n from: xxxx@gitee.wang\n username: xxxx@gitee.wang\n password: xxxx\n properties:\n mail:\n smtp:\n auth: true\n ssl.enable: true\n starttls.enable: false\n required: false\n\nmanagement:\n health:\n mail:\n enabled: false\n endpoints:\n web:\n exposure:\n include: \'*\'\n endpoint:\n health:\n show-details: ALWAYS', '6d70dce1f3ee48f261dce29bcfa99cbb', '2022-12-16 10:44:25', '2023-01-04 18:22:48', 'nacos', '127.0.0.1', '', '', '', '', '', 'yaml', '', ''); +INSERT INTO `config_info` VALUES (13, 'pigx-report-platform-dev.yml', 'DEFAULT_GROUP', 'spring:\n datasource:\n type: com.alibaba.druid.pool.DruidDataSource\n druid:\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: ${MYSQL_USER:root}\n password: ${MYSQL_PWD:root}\n url: jdbc:mysql://${MYSQL_HOST:pigx-mysql}:${MYSQL_PORT:3309}/${MYSQL_DB:pigxx_report}?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&allowMultiQueries=true&allowPublicKeyRetrieval=true\n jpa:\n database-platform: org.hibernate.dialect.MySQL8Dialect\n\nsecurity:\n oauth2:\n client:\n ignore-urls:\n - /\n - /api/project/getData\n - /static/**\n - /api/project/get-file/*\n\n# 文件上传路径\ngv:\n img-path: /Users/lengleng/Downloads/img/\n', 'ce3fde4b4592cdd61feb2e443b2ddfe5', '2022-12-16 10:44:25', '2023-04-07 12:56:57', 'nacos', '127.0.0.1', '', '', '', '', '', 'yaml', '', ''); +INSERT INTO `config_info` VALUES (14, 'pigx-jimu-platform-dev.yml', 'DEFAULT_GROUP', 'spring:\n #配置静态资源\n mvc:\n static-path-pattern: /**\n resource:\n static-locations: classpath:/static/\n #配置数据库\n datasource:\n type: com.alibaba.druid.pool.DruidDataSource\n druid:\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: ${MYSQL_USER:root}\n password: ${MYSQL_PWD:root}\n url: jdbc:mysql://${MYSQL_HOST:pigx-mysql}:${MYSQL_PORT:3309}/${MYSQL_DB:pigxx_bi}?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&allowMultiQueries=true&allowPublicKeyRetrieval=true\n \n#JimuReport[minidao配置]\nminidao :\n base-package: org.jeecg.modules.jmreport.desreport.dao*\n db-type: mysql\n#JimuReport[上传配置]\njeecg :\n jmreport:\n saas: true\n openTenant: true\n #saasMode: tenant\n customPrePath: /api/jimu\n # 自动保存\n autoSave: true\n # 单位毫秒 默认5*60*1000 \n interval: 10000\n # local|minio|alioss\n uploadType: local\n # local\n path :\n #文件路径A\n upload: ~/jimu/data\n # alioss\n oss:\n endpoint: oss-cn-beijing.aliyuncs.com\n accessKey: ??\n secretKey: ??\n staticDomain: ??\n bucketName: ??\n # minio\n minio:\n minio_url: http://minio.jeecg.com\n minio_name: ??\n minio_pass: ??\n bucketName: ??\n#输出sql日志\nlogging:\n level:\n org.jeecg.modules.jmreport : debug', '1397b44dcc28a7fb5fd455805b932983', '2022-12-16 10:44:25', '2023-09-08 13:06:11', 'nacos', '0:0:0:0:0:0:0:1', '', '', '', '', '', 'yaml', '', ''); +INSERT INTO `config_info` VALUES (15, 'pigx-app-server-biz-dev.yml', 'DEFAULT_GROUP', '# 数据源\nspring:\n datasource:\n type: com.alibaba.druid.pool.DruidDataSource\n druid:\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: ${MYSQL_USER:root}\n password: ${MYSQL_PWD:root}\n url: jdbc:mysql://${MYSQL_HOST:pigx-mysql}:${MYSQL_PORT:3309}/${MYSQL_DB:pigxx_app}?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&allowMultiQueries=true&allowPublicKeyRetrieval=true\n\n# 租户表维护\npigx:\n tenant:\n column: tenant_id\n tables:\n - app_user\n - app_role\n - app_article\n - app_article_category\n - app_article_collect\n - app_page\n - app_tabbar', '2513bb14ce549a2a4ea1cdfd83bba1f3', '2022-12-19 10:30:07', '2023-06-20 18:15:07', 'nacos', '127.0.0.1', '', '', '', '', '', 'yaml', '', ''); +INSERT INTO `config_info` VALUES (16, 'pigx-flow-engine-biz-dev.yml', 'DEFAULT_GROUP', '# 数据源\nspring:\n datasource:\n type: com.alibaba.druid.pool.DruidDataSource\n druid:\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: ${MYSQL_USER:root}\n password: ${MYSQL_PWD:root}\n url: jdbc:mysql://${MYSQL_HOST:pigx-mysql}:${MYSQL_PORT:3309}/${MYSQL_DB:pigxx_flow}?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&allowMultiQueries=true&nullCatalogMeansCurrent=true', '233121e20445609e1ba378c3686ea7d5', '2023-07-28 13:41:32', '2023-07-28 13:43:36', 'nacos', '0:0:0:0:0:0:0:1', '', '', 'flowable 工作引擎', '', '', 'yaml', '', ''); +INSERT INTO `config_info` VALUES (17, 'pigx-flow-task-biz-dev.yml', 'DEFAULT_GROUP', '# 数据源\nspring:\n datasource:\n type: com.alibaba.druid.pool.DruidDataSource\n druid:\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: ${MYSQL_USER:root}\n password: ${MYSQL_PWD:root}\n url: jdbc:mysql://${MYSQL_HOST:pigx-mysql}:${MYSQL_PORT:3309}/${MYSQL_DB:pigxx_flow}?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&allowMultiQueries=true&nullCatalogMeansCurrent=true\n\n# 租户表维护\npigx:\n tenant:\n column: tenant_id\n tables:\n - process\n - process_copy\n - process_group\n - process_instance_record\n - process_node_data\n - process_node_record\n - process_node_record_assign_user\n - process_starter', 'bdead04cdd3666d04786f69e5fb32633', '2023-07-28 13:44:25', '2023-07-28 13:50:08', 'nacos', '0:0:0:0:0:0:0:1', '', '', 'flowable 业务', '', '', 'yaml', '', ''); +COMMIT; +-- ---------------------------- +-- Table structure for config_info_aggr +-- ---------------------------- +DROP TABLE IF EXISTS `config_info_aggr`; +CREATE TABLE `config_info_aggr` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id', + `data_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 'data_id', + `group_id` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 'group_id', + `datum_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 'datum_id', + `content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '内容', + `gmt_modified` datetime NOT NULL COMMENT '修改时间', + `app_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, + `tenant_id` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '' COMMENT '租户字段', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE INDEX `uk_configinfoaggr_datagrouptenantdatum`(`data_id` ASC, `group_id` ASC, `tenant_id` ASC, `datum_id` ASC) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '增加租户字段' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of config_info_aggr +-- ---------------------------- + +-- ---------------------------- +-- Table structure for config_info_beta +-- ---------------------------- +DROP TABLE IF EXISTS `config_info_beta`; +CREATE TABLE `config_info_beta` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id', + `data_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 'data_id', + `group_id` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 'group_id', + `app_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT 'app_name', + `content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 'content', + `beta_ips` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT 'betaIps', + `md5` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT 'md5', + `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间', + `src_user` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL COMMENT 'source user', + `src_ip` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT 'source ip', + `tenant_id` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '' COMMENT '租户字段', + `encrypted_data_key` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '秘钥', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE INDEX `uk_configinfobeta_datagrouptenant`(`data_id` ASC, `group_id` ASC, `tenant_id` ASC) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = 'config_info_beta' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of config_info_beta +-- ---------------------------- + +-- ---------------------------- +-- Table structure for config_info_tag +-- ---------------------------- +DROP TABLE IF EXISTS `config_info_tag`; +CREATE TABLE `config_info_tag` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id', + `data_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 'data_id', + `group_id` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 'group_id', + `tenant_id` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '' COMMENT 'tenant_id', + `tag_id` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 'tag_id', + `app_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT 'app_name', + `content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 'content', + `md5` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT 'md5', + `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间', + `src_user` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL COMMENT 'source user', + `src_ip` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT 'source ip', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE INDEX `uk_configinfotag_datagrouptenanttag`(`data_id` ASC, `group_id` ASC, `tenant_id` ASC, `tag_id` ASC) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = 'config_info_tag' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of config_info_tag +-- ---------------------------- + +-- ---------------------------- +-- Table structure for config_tags_relation +-- ---------------------------- +DROP TABLE IF EXISTS `config_tags_relation`; +CREATE TABLE `config_tags_relation` ( + `id` bigint NOT NULL COMMENT 'id', + `tag_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 'tag_name', + `tag_type` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT 'tag_type', + `data_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 'data_id', + `group_id` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 'group_id', + `tenant_id` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '' COMMENT 'tenant_id', + `nid` bigint NOT NULL AUTO_INCREMENT, + PRIMARY KEY (`nid`) USING BTREE, + UNIQUE INDEX `uk_configtagrelation_configidtag`(`id` ASC, `tag_name` ASC, `tag_type` ASC) USING BTREE, + INDEX `idx_tenant_id`(`tenant_id` ASC) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = 'config_tag_relation' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of config_tags_relation +-- ---------------------------- + +-- ---------------------------- +-- Table structure for group_capacity +-- ---------------------------- +DROP TABLE IF EXISTS `group_capacity`; +CREATE TABLE `group_capacity` ( + `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `group_id` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT '' COMMENT 'Group ID,空字符表示整个集群', + `quota` int UNSIGNED NOT NULL DEFAULT 0 COMMENT '配额,0表示使用默认值', + `usage` int UNSIGNED NOT NULL DEFAULT 0 COMMENT '使用量', + `max_size` int UNSIGNED NOT NULL DEFAULT 0 COMMENT '单个配置大小上限,单位为字节,0表示使用默认值', + `max_aggr_count` int UNSIGNED NOT NULL DEFAULT 0 COMMENT '聚合子配置最大个数,,0表示使用默认值', + `max_aggr_size` int UNSIGNED NOT NULL DEFAULT 0 COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值', + `max_history_count` int UNSIGNED NOT NULL DEFAULT 0 COMMENT '最大变更历史数量', + `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE INDEX `uk_group_id`(`group_id` ASC) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '集群、各Group容量信息表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of group_capacity +-- ---------------------------- + +-- ---------------------------- +-- Table structure for his_config_info +-- ---------------------------- +DROP TABLE IF EXISTS `his_config_info`; +CREATE TABLE `his_config_info` ( + `id` bigint UNSIGNED NOT NULL, + `nid` bigint UNSIGNED NOT NULL AUTO_INCREMENT, + `data_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL, + `group_id` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL, + `app_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT 'app_name', + `content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL, + `md5` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, + `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `src_user` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL, + `src_ip` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, + `op_type` char(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, + `tenant_id` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '' COMMENT '租户字段', + `encrypted_data_key` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '秘钥', + PRIMARY KEY (`nid`) USING BTREE, + INDEX `idx_gmt_create`(`gmt_create` ASC) USING BTREE, + INDEX `idx_gmt_modified`(`gmt_modified` ASC) USING BTREE, + INDEX `idx_did`(`data_id` ASC) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 23 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '多租户改造' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for permissions +-- ---------------------------- +DROP TABLE IF EXISTS `permissions`; +CREATE TABLE `permissions` ( + `role` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `resource` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `action` varchar(8) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + UNIQUE INDEX `uk_role_permission`(`role` ASC, `resource` ASC, `action` ASC) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of permissions +-- ---------------------------- + +-- ---------------------------- +-- Table structure for roles +-- ---------------------------- +DROP TABLE IF EXISTS `roles`; +CREATE TABLE `roles` ( + `username` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `role` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + UNIQUE INDEX `idx_user_role`(`username` ASC, `role` ASC) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of roles +-- ---------------------------- +INSERT INTO `roles` VALUES ('nacos', 'ROLE_ADMIN'); + +-- ---------------------------- +-- Table structure for tenant_capacity +-- ---------------------------- +DROP TABLE IF EXISTS `tenant_capacity`; +CREATE TABLE `tenant_capacity` ( + `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `tenant_id` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT '' COMMENT 'Tenant ID', + `quota` int UNSIGNED NOT NULL DEFAULT 0 COMMENT '配额,0表示使用默认值', + `usage` int UNSIGNED NOT NULL DEFAULT 0 COMMENT '使用量', + `max_size` int UNSIGNED NOT NULL DEFAULT 0 COMMENT '单个配置大小上限,单位为字节,0表示使用默认值', + `max_aggr_count` int UNSIGNED NOT NULL DEFAULT 0 COMMENT '聚合子配置最大个数', + `max_aggr_size` int UNSIGNED NOT NULL DEFAULT 0 COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值', + `max_history_count` int UNSIGNED NOT NULL DEFAULT 0 COMMENT '最大变更历史数量', + `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE INDEX `uk_tenant_id`(`tenant_id` ASC) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '租户容量信息表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of tenant_capacity +-- ---------------------------- + +-- ---------------------------- +-- Table structure for tenant_info +-- ---------------------------- +DROP TABLE IF EXISTS `tenant_info`; +CREATE TABLE `tenant_info` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id', + `kp` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 'kp', + `tenant_id` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '' COMMENT 'tenant_id', + `tenant_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '' COMMENT 'tenant_name', + `tenant_desc` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT 'tenant_desc', + `create_source` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT 'create_source', + `gmt_create` bigint NOT NULL COMMENT '创建时间', + `gmt_modified` bigint NOT NULL COMMENT '修改时间', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE INDEX `uk_tenant_info_kptenantid`(`kp` ASC, `tenant_id` ASC) USING BTREE, + INDEX `idx_tenant_id`(`tenant_id` ASC) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = 'tenant_info' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of tenant_info +-- ---------------------------- + +-- ---------------------------- +-- Table structure for users +-- ---------------------------- +DROP TABLE IF EXISTS `users`; +CREATE TABLE `users` ( + `username` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `password` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `enabled` tinyint(1) NOT NULL, + PRIMARY KEY (`username`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of users +-- ---------------------------- +INSERT INTO `users` VALUES ('nacos', '$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu', 1); + +SET FOREIGN_KEY_CHECKS = 1; diff --git a/db/7pigxx_pay.sql b/db/7pigxx_pay.sql new file mode 100644 index 0000000..9ecdf73 --- /dev/null +++ b/db/7pigxx_pay.sql @@ -0,0 +1,169 @@ +USE pigxx_pay; + +SET NAMES utf8mb4; +SET FOREIGN_KEY_CHECKS = 0; + +-- ---------------------------- +-- Table structure for pay_channel +-- ---------------------------- +DROP TABLE IF EXISTS `pay_channel`; +CREATE TABLE `pay_channel` ( + `id` bigint(20) NOT NULL COMMENT '渠道主键ID', + `mch_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '商户ID', + `channel_id` varchar(24) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '渠道ID', + `channel_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '渠道名称', + `channel_mch_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '渠道商户ID', + `return_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '前端回调地址', + `notify_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '后端回调地址', + `state` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '状态', + `param` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '参数', + `remark` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标志', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `tenant_id` bigint(20) DEFAULT NULL COMMENT '租户ID', + `app_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '应用ID', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='支付渠道表'; + +-- ---------------------------- +-- Records of pay_channel +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for pay_goods_order +-- ---------------------------- +DROP TABLE IF EXISTS `pay_goods_order`; +CREATE TABLE `pay_goods_order` ( + `goods_order_id` bigint(20) NOT NULL COMMENT '商品订单ID', + `goods_id` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '商品ID', + `goods_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '商品名称', + `amount` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '金额', + `user_id` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '用户ID', + `status` varchar(4) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '0' COMMENT '订单状态:订单生成(0)、支付成功(1)、处理完成(2)、处理失败(-1)', + `pay_order_id` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '支付订单ID', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标志', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `tenant_id` bigint(20) DEFAULT NULL COMMENT '租户ID', + PRIMARY KEY (`goods_order_id`) USING BTREE, + UNIQUE KEY `IDX_PayOrderId` (`pay_order_id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='商品订单表'; + +-- ---------------------------- +-- Records of pay_goods_order +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for pay_notify_record +-- ---------------------------- +DROP TABLE IF EXISTS `pay_notify_record`; +CREATE TABLE `pay_notify_record` ( + `id` bigint(20) NOT NULL COMMENT 'ID', + `notify_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '通知ID', + `request` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '请求内容', + `response` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '响应内容', + `order_no` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '订单号', + `http_status` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'http状态', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标志', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `tenant_id` bigint(20) DEFAULT NULL COMMENT '租户ID', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='通知记录日志表'; + +-- ---------------------------- +-- Records of pay_notify_record +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for pay_refund_order +-- ---------------------------- +DROP TABLE IF EXISTS `pay_refund_order`; +CREATE TABLE `pay_refund_order` ( + `refund_order_id` bigint(20) NOT NULL COMMENT '退款订单ID', + `pay_order_id` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '支付订单号', + `channel_pay_order_no` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '渠道支付订单号', + `mch_id` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '商户号', + `mch_refund_no` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '商户退款单号', + `channel_id` varchar(24) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '渠道ID', + `pay_amount` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '支付金额', + `refund_amount` bigint(20) NOT NULL COMMENT '退款金额,单位分', + `currency` varchar(3) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '币种', + `status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '退款状态:0-订单生成,1-退款中,2-退款成功,3-退款失败,4-业务处理完成', + `result` tinyint(4) NOT NULL DEFAULT '0' COMMENT '退款结果:0-不确认结果,1-等待手动处理,2-确认成功,3-确认失败', + `client_ip` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '客户端IP', + `device` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '设备信息', + `remark` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注信息', + `channel_user` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '渠道用户标识', + `username` varchar(24) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '用户名', + `channel_mch_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '渠道商户号', + `channel_order_no` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '渠道订单号', + `channel_err_code` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '渠道错误码', + `channel_err_msg` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '渠道错误信息', + `extra` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '附加信息', + `notify_url` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '通知URL', + `param1` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '扩展参数1', + `param2` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '扩展参数2', + `expire_time` datetime DEFAULT NULL COMMENT '订单失效时间', + `refund_succ_time` datetime DEFAULT NULL COMMENT '订单退款成功时间', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标志', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `tenant_id` bigint(20) DEFAULT NULL COMMENT '租户ID', + PRIMARY KEY (`refund_order_id`) USING BTREE, + UNIQUE KEY `IDX_MchId_MchOrderNo` (`mch_id`,`mch_refund_no`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='退款订单表'; + +-- ---------------------------- +-- Records of pay_refund_order +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for pay_trade_order +-- ---------------------------- +DROP TABLE IF EXISTS `pay_trade_order`; +CREATE TABLE `pay_trade_order` ( + `order_id` bigint(20) NOT NULL COMMENT '订单ID', + `channel_id` varchar(24) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '渠道ID', + `amount` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '支付金额', + `currency` varchar(3) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '币种', + `status` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '0' COMMENT '支付状态:0-订单生成,1-支付中(目前未使用),2-支付成功,3-业务处理完成', + `client_ip` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '客户端IP', + `device` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '设备信息', + `subject` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '标题', + `body` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '内容', + `extra` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '附加信息', + `channel_mch_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '渠道商户号', + `channel_order_no` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '渠道订单号', + `err_code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '错误码', + `err_msg` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '错误信息', + `param1` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '扩展参数1', + `param2` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '扩展参数2', + `notify_url` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '通知URL', + `notify_count` tinyint(4) DEFAULT '0' COMMENT '通知次数', + `last_notify_time` bigint(20) DEFAULT NULL COMMENT '最后一次通知时间', + `expire_time` bigint(20) DEFAULT NULL COMMENT '订单失效时间', + `pay_succ_time` datetime DEFAULT NULL COMMENT '订单支付成功时间', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标志', + `tenant_id` bigint(20) DEFAULT NULL COMMENT '租户ID', + PRIMARY KEY (`order_id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='支付订单表'; + +-- ---------------------------- +-- Records of pay_trade_order +-- ---------------------------- +BEGIN; +COMMIT; + +SET FOREIGN_KEY_CHECKS = 1; diff --git a/db/8pigxx_codegen.sql b/db/8pigxx_codegen.sql new file mode 100644 index 0000000..f5099de --- /dev/null +++ b/db/8pigxx_codegen.sql @@ -0,0 +1,296 @@ +USE pigxx_codegen; + +SET NAMES utf8mb4; +SET FOREIGN_KEY_CHECKS = 0; + +-- ---------------------------- +-- Table structure for gen_datasource_conf +-- ---------------------------- +DROP TABLE IF EXISTS `gen_datasource_conf`; +CREATE TABLE `gen_datasource_conf` ( + `id` bigint NOT NULL COMMENT '主键', + `name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '别名', + `url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'jdbcurl', + `username` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '用户名', + `password` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '密码', + `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标记', + `tenant_id` bigint DEFAULT NULL COMMENT '租户ID', + `ds_type` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '数据库类型', + `conf_type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '配置类型', + `ds_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '数据库名称', + `instance` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '实例', + `port` int DEFAULT NULL COMMENT '端口', + `host` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '主机', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='数据源表'; + +-- ---------------------------- +-- Records of gen_datasource_conf +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for gen_field_type +-- ---------------------------- +DROP TABLE IF EXISTS `gen_field_type`; +CREATE TABLE `gen_field_type` ( + `id` bigint NOT NULL COMMENT 'id', + `column_type` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '字段类型', + `attr_type` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '属性类型', + `package_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '属性包名', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '创建人', + `update_time` datetime DEFAULT NULL COMMENT '修改时间', + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '修改人', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标记', + PRIMARY KEY (`id`), + UNIQUE KEY `column_type` (`column_type`) +) ENGINE=InnoDB AUTO_INCREMENT=1634915190321451010 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='字段类型管理'; + +-- ---------------------------- +-- Records of gen_field_type +-- ---------------------------- +BEGIN; +INSERT INTO `gen_field_type` VALUES (1, 'datetime', 'LocalDateTime', 'java.time.LocalDateTime', '2023-02-06 08:45:10', NULL, NULL, NULL, '0'); +INSERT INTO `gen_field_type` VALUES (2, 'date', 'LocalDate', 'java.time.LocalDate', '2023-02-06 08:45:10', NULL, NULL, NULL, '0'); +INSERT INTO `gen_field_type` VALUES (3, 'tinyint', 'Integer', NULL, '2023-02-06 08:45:11', NULL, NULL, NULL, '0'); +INSERT INTO `gen_field_type` VALUES (4, 'smallint', 'Integer', NULL, '2023-02-06 08:45:11', NULL, NULL, NULL, '0'); +INSERT INTO `gen_field_type` VALUES (5, 'mediumint', 'Integer', NULL, '2023-02-06 08:45:11', NULL, NULL, NULL, '0'); +INSERT INTO `gen_field_type` VALUES (6, 'int', 'Integer', NULL, '2023-02-06 08:45:11', NULL, NULL, NULL, '0'); +INSERT INTO `gen_field_type` VALUES (7, 'integer', 'Integer', NULL, '2023-02-06 08:45:11', NULL, NULL, NULL, '0'); +INSERT INTO `gen_field_type` VALUES (8, 'bigint', 'Long', NULL, '2023-02-06 08:45:11', NULL, NULL, NULL, '0'); +INSERT INTO `gen_field_type` VALUES (9, 'float', 'Float', NULL, '2023-02-06 08:45:11', NULL, NULL, NULL, '0'); +INSERT INTO `gen_field_type` VALUES (10, 'double', 'Double', NULL, '2023-02-06 08:45:11', NULL, NULL, NULL, '0'); +INSERT INTO `gen_field_type` VALUES (11, 'decimal', 'BigDecimal', 'java.math.BigDecimal', '2023-02-06 08:45:11', NULL, NULL, NULL, '0'); +INSERT INTO `gen_field_type` VALUES (12, 'bit', 'Boolean', NULL, '2023-02-06 08:45:11', NULL, NULL, NULL, '0'); +INSERT INTO `gen_field_type` VALUES (13, 'char', 'String', NULL, '2023-02-06 08:45:11', NULL, NULL, NULL, '0'); +INSERT INTO `gen_field_type` VALUES (14, 'varchar', 'String', NULL, '2023-02-06 08:45:11', NULL, NULL, NULL, '0'); +INSERT INTO `gen_field_type` VALUES (15, 'tinytext', 'String', NULL, '2023-02-06 08:45:11', NULL, NULL, NULL, '0'); +INSERT INTO `gen_field_type` VALUES (16, 'text', 'String', NULL, '2023-02-06 08:45:11', NULL, NULL, NULL, '0'); +INSERT INTO `gen_field_type` VALUES (17, 'mediumtext', 'String', NULL, '2023-02-06 08:45:11', NULL, NULL, NULL, '0'); +INSERT INTO `gen_field_type` VALUES (18, 'longtext', 'String', NULL, '2023-02-06 08:45:11', NULL, NULL, NULL, '0'); +INSERT INTO `gen_field_type` VALUES (19, 'timestamp', 'LocalDateTime', 'java.time.LocalDateTime', '2023-02-06 08:45:11', NULL, NULL, NULL, '0'); +INSERT INTO `gen_field_type` VALUES (20, 'NUMBER', 'Integer', NULL, '2023-02-06 08:45:11', NULL, NULL, NULL, '0'); +INSERT INTO `gen_field_type` VALUES (21, 'BINARY_INTEGER', 'Integer', NULL, '2023-02-06 08:45:12', NULL, NULL, NULL, '0'); +INSERT INTO `gen_field_type` VALUES (22, 'BINARY_FLOAT', 'Float', NULL, '2023-02-06 08:45:12', NULL, NULL, NULL, '0'); +INSERT INTO `gen_field_type` VALUES (23, 'BINARY_DOUBLE', 'Double', NULL, '2023-02-06 08:45:12', NULL, NULL, NULL, '0'); +INSERT INTO `gen_field_type` VALUES (24, 'VARCHAR2', 'String', NULL, '2023-02-06 08:45:12', NULL, NULL, NULL, '0'); +INSERT INTO `gen_field_type` VALUES (25, 'NVARCHAR', 'String', NULL, '2023-02-06 08:45:12', NULL, NULL, NULL, '0'); +INSERT INTO `gen_field_type` VALUES (26, 'NVARCHAR2', 'String', NULL, '2023-02-06 08:45:12', NULL, NULL, NULL, '0'); +INSERT INTO `gen_field_type` VALUES (27, 'CLOB', 'String', NULL, '2023-02-06 08:45:12', NULL, NULL, NULL, '0'); +INSERT INTO `gen_field_type` VALUES (28, 'int8', 'Long', NULL, '2023-02-06 08:45:12', NULL, NULL, NULL, '0'); +INSERT INTO `gen_field_type` VALUES (29, 'int4', 'Integer', NULL, '2023-02-06 08:45:12', NULL, NULL, NULL, '0'); +INSERT INTO `gen_field_type` VALUES (30, 'int2', 'Integer', NULL, '2023-02-06 08:45:12', NULL, NULL, NULL, '0'); +INSERT INTO `gen_field_type` VALUES (31, 'numeric', 'BigDecimal', 'java.math.BigDecimal', '2023-02-06 08:45:12', NULL, NULL, NULL, '0'); +INSERT INTO `gen_field_type` VALUES (32, 'json', 'String', NULL, '2023-02-06 08:45:12', NULL, NULL, NULL, '0'); +COMMIT; + +-- ---------------------------- +-- Table structure for gen_form_conf +-- ---------------------------- +DROP TABLE IF EXISTS `gen_form_conf`; +CREATE TABLE `gen_form_conf` ( + `id` bigint NOT NULL COMMENT 'ID', + `ds_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '数据库名称', + `table_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '表名称', + `form_info` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '表单信息', + `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0', + `tenant_id` bigint DEFAULT NULL COMMENT '所属租户', + PRIMARY KEY (`id`) USING BTREE, + KEY `table_name` (`table_name`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='表单配置'; + +-- ---------------------------- +-- Records of gen_form_conf +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for gen_group +-- ---------------------------- +DROP TABLE IF EXISTS `gen_group`; +CREATE TABLE `gen_group` ( + `id` bigint NOT NULL, + `group_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '分组名称', + `group_desc` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '分组描述', + `tenant_id` bigint NOT NULL COMMENT '租户ID', + `create_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ' ' COMMENT '创建人', + `update_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ' ' COMMENT '修改人', + `create_time` datetime DEFAULT NULL COMMENT '创建人', + `update_time` datetime DEFAULT NULL COMMENT '修改人', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标记', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='模板分组'; + +-- ---------------------------- +-- Records of gen_group +-- ---------------------------- +BEGIN; +INSERT INTO `gen_group` VALUES (1, '单表增删改查', '单表增删改查', 1, ' ', ' ', NULL, NULL, '0'); +INSERT INTO `gen_group` VALUES (2, '主子表表增删改查', '主子表表增删改查', 1, ' ', ' ', NULL, NULL, '0'); +COMMIT; + +-- ---------------------------- +-- Table structure for gen_table +-- ---------------------------- +DROP TABLE IF EXISTS `gen_table`; +CREATE TABLE `gen_table` ( + `id` bigint NOT NULL COMMENT 'id', + `table_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '表名', + `class_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '类名', + `db_type` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '数据库类型', + `table_comment` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '说明', + `author` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '作者', + `email` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '邮箱', + `package_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '项目包名', + `version` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '项目版本号', + `i18n` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '是否生成带有i18n 0 不带有 1带有', + `style` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '代码风格', + `child_table_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '子表名称', + `main_field` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '主表关联键', + `child_field` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '子表关联键', + `generator_type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '生成方式 0:zip压缩包 1:自定义目录', + `backend_path` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '后端生成路径', + `frontend_path` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '前端生成路径', + `module_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '模块名', + `function_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '功能名', + `form_layout` tinyint DEFAULT NULL COMMENT '表单布局 1:一列 2:两列', + `ds_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '数据源ID', + `baseclass_id` bigint DEFAULT NULL COMMENT '基类ID', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + PRIMARY KEY (`id`), + UNIQUE KEY `table_name` (`table_name`,`ds_name`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='代码生成表'; + +-- ---------------------------- +-- Records of gen_table +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for gen_table_column +-- ---------------------------- +DROP TABLE IF EXISTS `gen_table_column`; +CREATE TABLE `gen_table_column` ( + `id` bigint NOT NULL COMMENT 'id', + `ds_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '数据源名称', + `table_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '表名称', + `field_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '字段名称', + `field_type` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '字段类型', + `field_comment` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '字段说明', + `attr_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '属性名', + `attr_type` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '属性类型', + `package_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '属性包名', + `sort` int DEFAULT NULL COMMENT '排序', + `auto_fill` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '自动填充 DEFAULT、INSERT、UPDATE、INSERT_UPDATE', + `primary_pk` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '主键 0:否 1:是', + `base_field` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '基类字段 0:否 1:是', + `form_item` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '表单项 0:否 1:是', + `form_required` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '表单必填 0:否 1:是', + `form_type` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '表单类型', + `form_validator` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '表单效验', + `grid_item` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '列表项 0:否 1:是', + `grid_sort` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '列表排序 0:否 1:是', + `query_item` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '查询项 0:否 1:是', + `query_type` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '查询方式', + `query_form_type` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '查询表单类型', + `field_dict` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '字典类型', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='代码生成表字段'; + +-- ---------------------------- +-- Records of gen_table_column +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for gen_template +-- ---------------------------- +DROP TABLE IF EXISTS `gen_template`; +CREATE TABLE `gen_template` ( + `id` bigint NOT NULL COMMENT '主键', + `template_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '模板名称', + `generator_path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '模板路径', + `template_desc` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '模板描述', + `template_code` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '模板代码', + `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '0' COMMENT '删除标记', + `tenant_id` bigint NOT NULL COMMENT '租户ID', + `create_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ' ' COMMENT '创建人', + `update_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ' ' COMMENT '修改人', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='模板'; + +-- ---------------------------- +-- Records of gen_template +-- ---------------------------- +BEGIN; +INSERT INTO `gen_template` VALUES (1, 'vform.json', '/', '表单设计器初始化json模板', '#set($key=${dateTool.getSystemTime()})\n{\n \"widgetList\": [\n {\n \"key\": $key,\n \"type\": \"grid\",\n \"category\": \"container\",\n \"icon\": \"grid\",\n \"cols\": [\n#foreach($field in $formList)\n#if($field.attrName != ${pk.attrName})\n {\n \"type\": \"grid-col\",\n \"category\": \"container\",\n \"icon\": \"grid-col\",\n \"internal\": true,\n \"widgetList\": [\n {\n \"key\": ${math.add($key,${foreach.index})},\n #if($field.formType == \'text\')\n \"type\": \"input\",\n \"icon\": \"text-field\",\n #elseif($field.formType == \'number\')\n \"type\": \"number\",\n \"icon\": \"number-field\",\n #elseif($field.formType == \'textarea\')\n \"type\": \"textarea\",\n \"icon\": \"textarea-field\",\n #elseif($field.formType == \'select\' && ${field.fieldDict})\n \"type\": \"select\",\n \"icon\": \"select-field\",\n #elseif($field.formType == \'radio\' && ${field.fieldDict})\n \"type\": \"radio\",\n \"icon\": \"radio-field\",\n #elseif($field.formType == \'checkbox\' && ${field.fieldDict} )\n \"type\": \"checkbox\",\n \"icon\": \"checkbox-field\",\n #elseif($field.formType == \'date\')\n \"type\": \"date\",\n \"icon\": \"date-field\",\n #elseif($field.formType == \'datetime\')\n \"type\": \"time\",\n \"icon\": \"time-field\",\n #elseif($field.formType == \'upload-file\')\n \"type\": \"file-upload\",\n \"icon\": \"file-upload-field\",\n #elseif($field.formType == \'upload-img\')\n \"type\": \"picture-upload\",\n \"icon\": \"picture-upload-field\",\n #elseif($field.formType == \'editor\')\n \"type\": \"rich-editor\",\n \"icon\": \"rich-editor-field\",\n #else\n \"type\": \"input\",\n \"icon\": \"text-field\",\n #end\n \"formItemFlag\": true,\n \"options\": {\n \"name\": \"${field.attrName}\",\n \"label\": \"#if(${field.fieldComment})${field.fieldComment}#else ${field.attrName}#end\",\n #if(($field.formType == \'select\' || $field.formType == \'radio\' || $field.formType == \'checkbox\') && ${field.fieldDict})\n \"optionItemsDictType\": \"${field.fieldDict}\",\n #end\n \"placeholder\": \"请输入#if(${field.fieldComment})${field.fieldComment}#else ${field.attrName}#end\"\n },\n #if($field.formRequired)\n \"required\": true,\n #end\n \"id\": \"input${math.add($key,${foreach.index})}\"\n }\n ],\n \"options\": {\n \"name\": \"gridCol${math.add($key,${foreach.index})}\",\n \"hidden\": false,\n \"offset\": 0,\n \"push\": 0,\n \"pull\": 0,\n #if($formLayout == 1)\n \"span\": 24,\n #elseif($formLayout == 2)\n \"span\": 12,\n #end\n \"responsive\": false\n },\n \"id\": \"grid-col-${math.add($key,${foreach.index})}\"\n }#if($foreach.hasNext),#end\n#end\n#end\n ],\n \"options\": {\n \"name\": \"grid${functionName}\",\n \"hidden\": false,\n \"gutter\": 12\n },\n \"id\": \"grid${functionName}\"\n }\n ],\n \"formConfig\": {\n \"modelName\": \"form\",\n \"refName\": \"form\",\n \"rulesName\": \"rules\",\n \"labelWidth\": 80,\n \"labelPosition\": \"left\",\n \"labelAlign\": \"label-left-align\",\n \"layoutType\": \"PC\",\n \"jsonVersion\": 3\n }\n}', '2023-02-23 04:33:16', '2023-06-04 10:35:51', '0', 1, ' ', ' '); +INSERT INTO `gen_template` VALUES (2, 'vform.vue', '/', '表单设计器生成sfc模板', '\n\n', '2023-02-23 04:33:52', '2023-08-28 22:08:59', '0', 1, '', 'admin'); +INSERT INTO `gen_template` VALUES (3, 'Controller', '${backendPath}/src/main/java/${packagePath}/${moduleName}/controller/${ClassName}Controller.java', '后台Controller', 'package ${package}.${moduleName}.controller;\n\n#if($queryList)\nimport cn.hutool.core.util.StrUtil;\n#end\nimport cn.hutool.core.util.ArrayUtil;\nimport cn.hutool.core.collection.CollUtil;\nimport com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;\nimport com.baomidou.mybatisplus.core.toolkit.Wrappers;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport com.pig4cloud.pigx.common.core.util.R;\nimport com.pig4cloud.pigx.common.log.annotation.SysLog;\nimport ${package}.${moduleName}.entity.${ClassName}Entity;\nimport ${package}.${moduleName}.service.${ClassName}Service;\nimport org.springframework.security.access.prepost.PreAuthorize;\nimport com.pig4cloud.pigx.common.excel.annotation.ResponseExcel;\nimport io.swagger.v3.oas.annotations.security.SecurityRequirement;\nimport org.springdoc.api.annotations.ParameterObject;\nimport org.springframework.http.HttpHeaders;\nimport io.swagger.v3.oas.annotations.tags.Tag;\nimport io.swagger.v3.oas.annotations.Operation;\nimport lombok.RequiredArgsConstructor;\nimport org.springframework.web.bind.annotation.*;\n\nimport java.util.List;\nimport java.util.Objects;\n\n/**\n * ${tableComment}\n *\n * @author ${author}\n * @date ${datetime}\n */\n@RestController\n@RequiredArgsConstructor\n@RequestMapping(\"/${functionName}\" )\n@Tag(description = \"${functionName}\" , name = \"${tableComment}管理\" )\n@SecurityRequirement(name = HttpHeaders.AUTHORIZATION)\npublic class ${ClassName}Controller {\n\n private final ${ClassName}Service ${className}Service;\n\n /**\n * 分页查询\n * @param page 分页对象\n * @param ${className} ${tableComment}\n * @return\n */\n @Operation(summary = \"分页查询\" , description = \"分页查询\" )\n @GetMapping(\"/page\" )\n @PreAuthorize(\"@pms.hasPermission(\'${moduleName}_${functionName}_view\')\" )\n public R get${ClassName}Page(@ParameterObject Page page, @ParameterObject ${ClassName}Entity ${className}) {\n LambdaQueryWrapper<${ClassName}Entity> wrapper = Wrappers.lambdaQuery();\n#foreach ($field in $queryList)\n#set($getAttrName=$str.getProperty($field.attrName))\n#set($var=\"${className}.$getAttrName()\")\n#if($field.attrType == \'String\')\n#set($expression=\"StrUtil.isNotBlank\")\n#else\n#set($expression=\"Objects.nonNull\")\n#end\n#if($field.queryType == \'=\')\n wrapper.eq($expression($var),${ClassName}Entity::$getAttrName,$var);\n#elseif( $field.queryType == \'like\' )\n wrapper.like($expression($var),${ClassName}Entity::$getAttrName,$var);\n#elseif( $field.queryType == \'!-\' )\n wrapper.ne($expression($var),${ClassName}Entity::$getAttrName,$var);\n#elseif( $field.queryType == \'>\' )\n wrapper.gt($expression($var),${ClassName}Entity::$getAttrName,$var);\n#elseif( $field.queryType == \'<\' )\n wrapper.lt($expression($var),${ClassName}Entity::$getAttrName,$var);\n#elseif( $field.queryType == \'>=\' )\n wrapper.ge($expression($var),${ClassName}Entity::$getAttrName,$var);\n#elseif( $field.queryType == \'<=\' )\n wrapper.le($expression($var),${ClassName}Entity::$getAttrName,$var);\n#elseif( $field.queryType == \'left like\' )\n wrapper.likeLeft($expression($var),${ClassName}Entity::$getAttrName,$var);\n#elseif( $field.queryType == \'right like\' )\n wrapper.likeRight($expression($var),${ClassName}Entity::$getAttrName,$var);\n#end\n#end\n return R.ok(${className}Service.page(page, wrapper));\n }\n\n\n /**\n * 通过id查询${tableComment}\n * @param ${pk.attrName} id\n * @return R\n */\n @Operation(summary = \"通过id查询\" , description = \"通过id查询\" )\n @GetMapping(\"/{${pk.attrName}}\" )\n @PreAuthorize(\"@pms.hasPermission(\'${moduleName}_${functionName}_view\')\" )\n public R getById(@PathVariable(\"${pk.attrName}\" ) ${pk.attrType} ${pk.attrName}) {\n return R.ok(${className}Service.getById(${pk.attrName}));\n }\n\n /**\n * 新增${tableComment}\n * @param ${className} ${tableComment}\n * @return R\n */\n @Operation(summary = \"新增${tableComment}\" , description = \"新增${tableComment}\" )\n @SysLog(\"新增${tableComment}\" )\n @PostMapping\n @PreAuthorize(\"@pms.hasPermission(\'${moduleName}_${functionName}_add\')\" )\n public R save(@RequestBody ${ClassName}Entity ${className}) {\n return R.ok(${className}Service.save(${className}));\n }\n\n /**\n * 修改${tableComment}\n * @param ${className} ${tableComment}\n * @return R\n */\n @Operation(summary = \"修改${tableComment}\" , description = \"修改${tableComment}\" )\n @SysLog(\"修改${tableComment}\" )\n @PutMapping\n @PreAuthorize(\"@pms.hasPermission(\'${moduleName}_${functionName}_edit\')\" )\n public R updateById(@RequestBody ${ClassName}Entity ${className}) {\n return R.ok(${className}Service.updateById(${className}));\n }\n\n /**\n * 通过id删除${tableComment}\n * @param ids ${pk.attrName}列表\n * @return R\n */\n @Operation(summary = \"通过id删除${tableComment}\" , description = \"通过id删除${tableComment}\" )\n @SysLog(\"通过id删除${tableComment}\" )\n @DeleteMapping\n @PreAuthorize(\"@pms.hasPermission(\'${moduleName}_${functionName}_del\')\" )\n public R removeById(@RequestBody ${pk.attrType}[] ids) {\n return R.ok(${className}Service.removeBatchByIds(CollUtil.toList(ids)));\n }\n\n\n /**\n * 导出excel 表格\n * @param ${className} 查询条件\n * @param ids 导出指定ID\n * @return excel 文件流\n */\n @ResponseExcel\n @GetMapping(\"/export\")\n @PreAuthorize(\"@pms.hasPermission(\'${moduleName}_${functionName}_export\')\" )\n public List<${ClassName}Entity> export(${ClassName}Entity ${className},${pk.attrType}[] ids) {\n return ${className}Service.list(Wrappers.lambdaQuery(${className}).in(ArrayUtil.isNotEmpty(ids), ${ClassName}Entity::$str.getProperty($pk.attrName), ids));\n }\n}', '2023-02-23 01:16:17', '2023-08-22 20:54:58', '0', 1, '', 'admin'); +INSERT INTO `gen_template` VALUES (4, 'Service', '${backendPath}/src/main/java/${packagePath}/${moduleName}/service/${ClassName}Service.java', 'Service', 'package ${package}.${moduleName}.service;\n\n#if($ChildClassName)\nimport com.github.yulichang.extension.mapping.base.MPJDeepService;\nimport ${package}.${moduleName}.entity.${ChildClassName}Entity;\n#else\nimport com.baomidou.mybatisplus.extension.service.IService;\n#end\nimport ${package}.${moduleName}.entity.${ClassName}Entity;\n\n#if($ChildClassName)\npublic interface ${ClassName}Service extends MPJDeepService<${ClassName}Entity> {\n Boolean saveDeep(${ClassName}Entity ${className});\n\n Boolean updateDeep(${ClassName}Entity ${className});\n\n Boolean removeDeep(Long[] ids);\n\n Boolean removeChild(Long[] ids);\n#else\npublic interface ${ClassName}Service extends IService<${ClassName}Entity> {\n#end\n\n}', '2023-02-23 01:16:53', '2023-06-04 10:35:25', '0', 1, ' ', ' '); +INSERT INTO `gen_template` VALUES (5, 'ServiceImpl', '${backendPath}/src/main/java/${packagePath}/${moduleName}/service/impl/${ClassName}ServiceImpl.java', 'ServiceImpl', 'package ${package}.${moduleName}.service.impl;\n\nimport com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;\nimport ${package}.${moduleName}.entity.${ClassName}Entity;\nimport ${package}.${moduleName}.mapper.${ClassName}Mapper;\nimport ${package}.${moduleName}.service.${ClassName}Service;\nimport org.springframework.stereotype.Service;\n#if($ChildClassName)\nimport cn.hutool.core.collection.CollUtil;\nimport com.baomidou.mybatisplus.core.toolkit.Wrappers;\nimport ${package}.${moduleName}.entity.${ChildClassName}Entity;\nimport ${package}.${moduleName}.mapper.${ChildClassName}Mapper;\nimport org.springframework.transaction.annotation.Transactional;\nimport lombok.RequiredArgsConstructor;\nimport java.util.Objects;\n#end\n/**\n * ${tableComment}\n *\n * @author ${author}\n * @date ${datetime}\n */\n@Service\n#if($ChildClassName)\n@RequiredArgsConstructor\n#end\npublic class ${ClassName}ServiceImpl extends ServiceImpl<${ClassName}Mapper, ${ClassName}Entity> implements ${ClassName}Service {\n#if($ChildClassName)\n private final ${ChildClassName}Mapper ${childClassName}Mapper;\n\n @Override\n @Transactional(rollbackFor = Exception.class)\n public Boolean saveDeep(${ClassName}Entity ${className}) {\n baseMapper.insert(${className});\n for (${ChildClassName}Entity ${childClassName} : ${className}.get${ChildClassName}List()) {\n ${childClassName}.$str.setProperty($childField)(${className}.$str.getProperty($mainField)());\n ${childClassName}Mapper.insert( ${childClassName});\n }\n\n return Boolean.TRUE;\n }\n\n @Override\n @Transactional(rollbackFor = Exception.class)\n public Boolean updateDeep(${ClassName}Entity ${className}) {\n baseMapper.updateById(${className});\n for (${ChildClassName}Entity ${childClassName} : ${className}.get${ChildClassName}List()) {\n#set($getChildPkName=$str.getProperty(${pk.attrName}))\n if (Objects.isNull(${childClassName}.$getChildPkName())) {\n ${childClassName}.$str.setProperty($childField)(${className}.getId());\n ${childClassName}Mapper.insert(${childClassName});\n } else {\n ${childClassName}Mapper.updateById(${childClassName});\n }\n }\n return Boolean.TRUE;\n }\n\n @Override\n @Transactional(rollbackFor = Exception.class)\n public Boolean removeDeep(Long[] ids) {\n baseMapper.deleteBatchIds(CollUtil.toList(ids));\n ${childClassName}Mapper.delete(Wrappers.<${ChildClassName}Entity>lambdaQuery().in(${ChildClassName}Entity::$str.getProperty($childField), ids));\n return Boolean.TRUE;\n }\n\n @Override\n @Transactional(rollbackFor = Exception.class)\n public Boolean removeChild(Long[] ids) {\n ${childClassName}Mapper.deleteBatchIds(CollUtil.toList(ids));\n return Boolean.TRUE;\n }\n#end\n}', '2023-02-23 01:17:36', '2023-08-27 23:29:58', '0', 1, ' ', ' '); +INSERT INTO `gen_template` VALUES (6, '实体', '${backendPath}/src/main/java/${packagePath}/${moduleName}/entity/${ClassName}Entity.java', 'Entity', 'package ${package}.${moduleName}.entity;\n\nimport com.baomidou.mybatisplus.annotation.*;\nimport com.baomidou.mybatisplus.extension.activerecord.Model;\nimport io.swagger.v3.oas.annotations.media.Schema;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\n#foreach($import in $importList)\nimport $import;\n#end\n#if($ChildClassName)\nimport com.alibaba.excel.annotation.ExcelIgnore;\nimport com.github.yulichang.annotation.EntityMapping;\nimport java.util.List;\n#end\n\n/**\n * ${tableComment}\n *\n * @author ${author}\n * @date ${datetime}\n */\n@Data\n@TableName(\"${tableName}\")\n@EqualsAndHashCode(callSuper = true)\n@Schema(description = \"${tableComment}\")\npublic class ${ClassName}Entity extends Model<${ClassName}Entity> {\n\n#foreach ($field in $fieldList)\n#if(${field.fieldComment})#set($comment=${field.fieldComment})#else #set($comment=${field.attrName})#end\n\n /**\n * $comment\n */\n#if($field.primaryPk == \'1\')\n @TableId(type = IdType.ASSIGN_ID)\n#end\n#if($field.autoFill == \'INSERT\')\n @TableField(fill = FieldFill.INSERT)\n#elseif($field.autoFill == \'INSERT_UPDATE\')\n @TableField(fill = FieldFill.INSERT_UPDATE)\n#elseif($field.autoFill == \'UPDATE\')\n @TableField(fill = FieldFill.UPDATE)\n#end\n#if($field.fieldName == \'del_flag\')\n @TableLogic\n @TableField(fill = FieldFill.INSERT)\n#end\n @Schema(description=\"$comment\"#if($field.hidden),hidden=$field.hidden#end)\n#if($field.formType == \'checkbox\')\n private ${field.attrType}[] $field.attrName;\n#else\n private $field.attrType $field.attrName;\n#end \n#end\n#if($ChildClassName)\n @ExcelIgnore\n @TableField(exist = false)\n @EntityMapping(thisField = \"$mainField\", joinField = \"$childField\")\n private List<${ChildClassName}Entity> ${childClassName}List;\n#end\n}', '2023-02-23 01:17:53', '2023-09-12 16:20:57', '0', 1, ' ', ' '); +INSERT INTO `gen_template` VALUES (7, 'Mapper', '${backendPath}/src/main/java/${packagePath}/${moduleName}/mapper/${ClassName}Mapper.java', 'Mapper', 'package ${package}.${moduleName}.mapper;\n\nimport com.pig4cloud.pigx.common.data.datascope.PigxBaseMapper;\nimport ${package}.${moduleName}.entity.${ClassName}Entity;\nimport org.apache.ibatis.annotations.Mapper;\n\n@Mapper\npublic interface ${ClassName}Mapper extends PigxBaseMapper<${ClassName}Entity> {\n\n\n}', '2023-02-23 01:18:18', '2023-08-13 13:52:50', '0', 1, ' ', ' '); +INSERT INTO `gen_template` VALUES (8, 'Mapper.xml', '${backendPath}/src/main/resources/mapper/${ClassName}Mapper.xml', 'Mapper.xml', '\n\n\n\n\n \n#foreach ($field in $fieldList)\n #if($field.primaryPk)\n \n #end\n #if(!$field.primaryPk)\n \n #end\n#end\n \n', '2023-02-23 01:18:35', '2023-06-04 10:34:56', '0', 1, ' ', ' '); +INSERT INTO `gen_template` VALUES (9, '权限菜单', '${backendPath}/menu/${functionName}_menu.sql', 'menu.sql', '-- 该脚本不要直接执行, 注意维护菜单的父节点ID 默认 父节点-1 , 默认租户 1\n#set($menuId=${dateTool.getSystemTime()})\n\n-- 菜单SQL\ninsert into sys_menu ( menu_id,parent_id, path, permission, menu_type, icon, del_flag, create_time, sort_order, update_time, name, tenant_id)\nvalues (${menuId}, \'-1\', \'/${moduleName}/${functionName}/index\', \'\', \'0\', \'icon-bangzhushouji\', \'0\', null , \'8\', null , \'${tableComment}管理\', 1);\n\n-- 菜单对应按钮SQL\ninsert into sys_menu ( menu_id,parent_id, permission, menu_type, path, icon, del_flag, create_time, sort_order, update_time, name, tenant_id)\nvalues (${math.add($menuId,1)},${menuId}, \'${moduleName}_${functionName}_view\', \'1\', null, \'1\', \'0\', null, \'0\', null, \'${tableComment}查看\', 1);\n\ninsert into sys_menu ( menu_id,parent_id, permission, menu_type, path, icon, del_flag, create_time, sort_order, update_time, name, tenant_id)\nvalues (${math.add($menuId,2)},${menuId}, \'${moduleName}_${functionName}_add\', \'1\', null, \'1\', \'0\', null, \'1\', null, \'${tableComment}新增\', 1);\n\ninsert into sys_menu (menu_id, parent_id, permission, menu_type, path, icon, del_flag, create_time, sort_order, update_time, name, tenant_id)\nvalues (${math.add($menuId,3)},${menuId}, \'${moduleName}_${functionName}_edit\', \'1\', null, \'1\', \'0\', null, \'2\', null, \'${tableComment}修改\', 1);\n\ninsert into sys_menu (menu_id, parent_id, permission, menu_type, path, icon, del_flag, create_time, sort_order, update_time, name, tenant_id)\nvalues (${math.add($menuId,4)},${menuId}, \'${moduleName}_${functionName}_del\', \'1\', null, \'1\', \'0\', null, \'3\', null, \'${tableComment}删除\', 1);\n\ninsert into sys_menu ( menu_id,parent_id, permission, menu_type, path, icon, del_flag, create_time, sort_order, update_time, name, tenant_id)\nvalues (${math.add($menuId,5)},${menuId}, \'${moduleName}_${functionName}_export\', \'1\', null, \'1\', \'0\', null, \'3\', null, \'导入导出\', 1);', '2023-02-23 01:19:08', '2023-08-27 23:16:31', '0', 1, ' ', ' '); +INSERT INTO `gen_template` VALUES (10, 'api.ts', '${frontendPath}/src/api/${moduleName}/${functionName}.ts', 'api.ts', 'import request from \"/@/utils/request\"\n\nexport function fetchList(query?: Object) {\n return request({\n url: \'/${moduleName}/${functionName}/page\',\n method: \'get\',\n params: query\n })\n}\n\nexport function addObj(obj?: Object) {\n return request({\n url: \'/${moduleName}/${functionName}\',\n method: \'post\',\n data: obj\n })\n}\n\nexport function getObj(id?: string) {\n return request({\n url: \'/${moduleName}/${functionName}/\' + id,\n method: \'get\'\n })\n}\n\nexport function delObjs(ids?: Object) {\n return request({\n url: \'/${moduleName}/${functionName}\',\n method: \'delete\',\n data: ids\n })\n}\n\nexport function putObj(obj?: Object) {\n return request({\n url: \'/${moduleName}/${functionName}\',\n method: \'put\',\n data: obj\n })\n}\n\n#if($ChildClassName)\nexport function delChildObj(ids?: Object) {\n return request({\n url: \'/${moduleName}/${functionName}/child\',\n method: \'delete\',\n data: ids\n })\n}\n#end', '2023-02-23 01:19:23', '2023-06-04 10:34:17', '0', 1, ' ', ' '); +INSERT INTO `gen_template` VALUES (11, '表格', '${frontendPath}/src/views/${moduleName}/${functionName}/index.vue', '表格不含i18n', '\n\n', '2023-02-23 01:19:35', '2023-08-29 14:27:53', '0', 1, '', 'admin'); +INSERT INTO `gen_template` VALUES (12, '表单', '${frontendPath}/src/views/${moduleName}/${functionName}/form.vue', '表单不含i18n', '\n\n', '2023-02-23 01:19:48', '2023-09-12 21:59:33', '0', 1, '', 'admin'); +INSERT INTO `gen_template` VALUES (13, 'i18n英文模板', '${frontendPath}/src/views/${moduleName}/${functionName}/i18n/en.ts', 'i18n英文模板', 'export default {\n ${functionName}: {\n index: \'#\',\n import${className}Tip: \'import ${ClassName}\',\n#foreach($field in $fieldList)\n ${field.attrName}: \'${field.attrName}\',\n#end\n#foreach($field in $fieldList)\n input$str.pascalCase(${field.attrName})Tip: \'input ${field.attrName}\',\n#end\n }\n}', '2023-02-23 01:20:25', '2023-06-04 10:49:25', '0', 1, '', 'admin'); +INSERT INTO `gen_template` VALUES (14, 'i18n中文模板', '${frontendPath}/src/views/${moduleName}/${functionName}/i18n/zh-cn.ts', 'i18n中文模板', 'export default {\n ${functionName}: {\n index: \'#\',\n import${className}Tip: \'导入${tableComment}\',\n#foreach($field in $fieldList)\n ${field.attrName}: \'#if(${field.fieldComment})${field.fieldComment}#else ${field.attrName}#end\',\n#end\n#foreach($field in $fieldList)\n input$str.pascalCase(${field.attrName})Tip: \'请输入#if(${field.fieldComment})${field.fieldComment}#else ${field.attrName}#end\',\n#end\n }\n}', '2023-02-23 01:20:40', '2023-06-04 10:49:28', '0', 1, '', 'admin'); +INSERT INTO `gen_template` VALUES (15, '子实体', '${backendPath}/src/main/java/${packagePath}/${moduleName}/entity/${ChildClassName}Entity.java', '子表实体对象', 'package ${package}.${moduleName}.entity;\n\nimport com.baomidou.mybatisplus.annotation.*;\nimport com.baomidou.mybatisplus.extension.activerecord.Model;\nimport io.swagger.v3.oas.annotations.media.Schema;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\n#foreach($import in $importList)\nimport $import;\n#end\n\n/**\n * ${tableComment}\n *\n * @author ${author}\n * @date ${datetime}\n */\n@Data\n@TableName(\"${childTableName}\")\n@EqualsAndHashCode(callSuper = true)\n@Schema(description = \"${childTableName}\")\npublic class ${ChildClassName}Entity extends Model<${ChildClassName}Entity> {\n\n#foreach ($field in $childFieldList)\n#if(${field.fieldComment})#set($comment=${field.fieldComment})#else #set($comment=${field.attrName})#end\n /**\n * $comment\n */\n#if($field.primaryPk == \'1\')\n @TableId(type = IdType.ASSIGN_ID)\n#end\n#if($field.autoFill == \'INSERT\')\n @TableField(fill = FieldFill.INSERT)\n#elseif($field.autoFill == \'INSERT_UPDATE\')\n @TableField(fill = FieldFill.INSERT_UPDATE)\n#elseif($field.autoFill == \'UPDATE\')\n @TableField(fill = FieldFill.UPDATE)\n#end\n#if($field.fieldName == \'del_flag\')\n @TableLogic\n @TableField(fill = FieldFill.INSERT)\n#end\n @Schema(description=\"$comment\"#if($field.hidden),hidden=$field.hidden#end)\n#if($field.formType == \'checkbox\')\n private ${field.attrType}[] $field.attrName;\n#else\n private $field.attrType $field.attrName;\n#end \n#end\n}\n', '2023-06-01 11:07:14', '2023-09-12 16:32:33', '0', 1, ' ', ' '); +INSERT INTO `gen_template` VALUES (16, '主子Contoller', '${backendPath}/src/main/java/${packagePath}/${moduleName}/controller/${ClassName}Controller.java', '子表Controller对象', 'package ${package}.${moduleName}.controller;\n\n#if($queryList)\nimport cn.hutool.core.util.StrUtil;\n#end\nimport cn.hutool.core.util.ArrayUtil;\nimport com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;\nimport com.baomidou.mybatisplus.core.toolkit.Wrappers;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport com.pig4cloud.pigx.common.core.util.R;\nimport com.pig4cloud.pigx.common.log.annotation.SysLog;\nimport ${package}.${moduleName}.entity.${ClassName}Entity;\nimport ${package}.${moduleName}.entity.${ChildClassName}Entity;\nimport ${package}.${moduleName}.service.${ClassName}Service;\nimport org.springframework.security.access.prepost.PreAuthorize;\nimport com.pig4cloud.pigx.common.excel.annotation.ResponseExcel;\nimport io.swagger.v3.oas.annotations.security.SecurityRequirement;\nimport org.springdoc.api.annotations.ParameterObject;\nimport org.springframework.http.HttpHeaders;\nimport io.swagger.v3.oas.annotations.tags.Tag;\nimport io.swagger.v3.oas.annotations.Operation;\nimport lombok.RequiredArgsConstructor;\nimport org.springframework.web.bind.annotation.*;\n\nimport java.util.List;\nimport java.util.Objects;\n\n/**\n * ${tableComment}\n *\n * @author ${author}\n * @date ${datetime}\n */\n@RestController\n@RequiredArgsConstructor\n@RequestMapping(\"/${functionName}\" )\n@Tag(description = \"${functionName}\" , name = \"${tableComment}管理\" )\n@SecurityRequirement(name = HttpHeaders.AUTHORIZATION)\npublic class ${ClassName}Controller {\n\n private final ${ClassName}Service ${className}Service;\n\n /**\n * 分页查询\n * @param page 分页对象\n * @param ${className} ${tableComment}\n * @return\n */\n @Operation(summary = \"分页查询\" , description = \"分页查询\" )\n @GetMapping(\"/page\" )\n @PreAuthorize(\"@pms.hasPermission(\'${moduleName}_${functionName}_view\')\" )\n public R get${ClassName}Page(@ParameterObject Page page, @ParameterObject ${ClassName}Entity ${className}) {\n LambdaQueryWrapper<${ClassName}Entity> wrapper = Wrappers.lambdaQuery();\n#foreach ($field in $queryList)\n#set($getAttrName=$str.getProperty($field.attrName))\n#set($var=\"${className}.$getAttrName()\")\n#if($field.attrType == \'String\')\n#set($expression=\"StrUtil.isNotBlank\")\n#else\n#set($expression=\"Objects.nonNull\")\n#end\n#if($field.queryType == \'=\')\n wrapper.eq($expression($var),${ClassName}Entity::$getAttrName,$var);\n#elseif( $field.queryType == \'like\' )\n wrapper.like($expression($var),${ClassName}Entity::$getAttrName,$var);\n#elseif( $field.queryType == \'!-\' )\n wrapper.ne($expression($var),${ClassName}Entity::$getAttrName,$var);\n#elseif( $field.queryType == \'>\' )\n wrapper.gt($expression($var),${ClassName}Entity::$getAttrName,$var);\n#elseif( $field.queryType == \'<\' )\n wrapper.lt($expression($var),${ClassName}Entity::$getAttrName,$var);\n#elseif( $field.queryType == \'>=\' )\n wrapper.ge($expression($var),${ClassName}Entity::$getAttrName,$var);\n#elseif( $field.queryType == \'<=\' )\n wrapper.le($expression($var),${ClassName}Entity::$getAttrName,$var);\n#elseif( $field.queryType == \'left like\' )\n wrapper.likeLeft($expression($var),${ClassName}Entity::$getAttrName,$var);\n#elseif( $field.queryType == \'right like\' )\n wrapper.likeRight($expression($var),${ClassName}Entity::$getAttrName,$var);\n#end\n#end\n return R.ok(${className}Service.page(page, wrapper));\n }\n\n /**\n * 通过id查询${tableComment}\n * @param ${pk.attrName} id\n * @return R\n */\n @Operation(summary = \"通过id查询\" , description = \"通过id查询\" )\n @GetMapping(\"/{${pk.attrName}}\" )\n @PreAuthorize(\"@pms.hasPermission(\'${moduleName}_${functionName}_view\')\" )\n public R getById(@PathVariable(\"${pk.attrName}\" ) ${pk.attrType} ${pk.attrName}) {\n return R.ok(${className}Service.getByIdDeep(${pk.attrName}));\n }\n\n /**\n * 新增${tableComment}\n * @param ${className} ${tableComment}\n * @return R\n */\n @Operation(summary = \"新增${tableComment}\" , description = \"新增${tableComment}\" )\n @SysLog(\"新增${tableComment}\" )\n @PostMapping\n @PreAuthorize(\"@pms.hasPermission(\'${moduleName}_${functionName}_add\')\" )\n public R save(@RequestBody ${ClassName}Entity ${className}) {\n return R.ok(${className}Service.saveDeep(${className}));\n }\n\n /**\n * 修改${tableComment}\n * @param ${className} ${tableComment}\n * @return R\n */\n @Operation(summary = \"修改${tableComment}\" , description = \"修改${tableComment}\" )\n @SysLog(\"修改${tableComment}\" )\n @PutMapping\n @PreAuthorize(\"@pms.hasPermission(\'${moduleName}_${functionName}_edit\')\" )\n public R updateById(@RequestBody ${ClassName}Entity ${className}) {\n return R.ok(${className}Service.updateDeep(${className}));\n }\n\n /**\n * 通过id删除${tableComment}\n * @param ids ${pk.attrName}列表\n * @return R\n */\n @Operation(summary = \"通过id删除${tableComment}\" , description = \"通过id删除${tableComment}\" )\n @SysLog(\"通过id删除${tableComment}\" )\n @DeleteMapping\n @PreAuthorize(\"@pms.hasPermission(\'${moduleName}_${functionName}_del\')\" )\n public R removeById(@RequestBody ${pk.attrType}[] ids) {\n return R.ok(${className}Service.removeDeep(ids));\n }\n\n /**\n * 通过id删除${tableComment}子表数据\n * @param ids ${pk.attrName}列表\n * @return R\n */\n @Operation(summary = \"通过id删除${tableComment}子表数据\" , description = \"通过id删除${tableComment}子表数据\" )\n @SysLog(\"通过id删除${tableComment}子表数据\" )\n @DeleteMapping(\"/child\")\n @PreAuthorize(\"@pms.hasPermission(\'${moduleName}_${functionName}_del\')\" )\n public R removeChild(@RequestBody ${pk.attrType}[] ids) {\n return R.ok(${className}Service.removeChild(ids));\n }\n\n /**\n * 导出excel 表格\n * @param ${className} 查询条件\n * @param ids 导出指定ID\n * @return excel 文件流\n */\n @ResponseExcel\n @GetMapping(\"/export\")\n @PreAuthorize(\"@pms.hasPermission(\'${moduleName}_${functionName}_export\')\" )\n public List<${ClassName}Entity> export(${ClassName}Entity ${className},${pk.attrType}[] ids) {\n return ${className}Service.list(Wrappers.lambdaQuery(${className}).in(ArrayUtil.isNotEmpty(ids), ${ClassName}Entity::$str.getProperty($pk.attrName), ids));\n }\n}', '2023-06-01 11:25:28', '2023-08-22 21:23:40', '0', 1, '', 'admin'); +INSERT INTO `gen_template` VALUES (17, '主子表单', '${frontendPath}/src/views/${moduleName}/${functionName}/form.vue', '子表表单', '\n\n', '2023-06-01 15:42:46', '2023-09-12 21:58:41', '0', 1, '', 'admin'); +INSERT INTO `gen_template` VALUES (18, '主子表格', '${frontendPath}/src/views/${moduleName}/${functionName}/index.vue', '子表单表格', '\n\n', '2023-06-01 15:43:31', '2023-08-29 10:53:23', '0', 1, ' ', ' '); +INSERT INTO `gen_template` VALUES (19, '子Mapper', '${backendPath}/src/main/java/${packagePath}/${moduleName}/mapper/${ChildClassName}Mapper.java', '子Mapper', 'package ${package}.${moduleName}.mapper;\n\nimport com.pig4cloud.pigx.common.data.datascope.PigxBaseMapper;\n#if($ChildClassName)\nimport ${package}.${moduleName}.entity.${ChildClassName}Entity;\n#else\nimport ${package}.${moduleName}.entity.${ClassName}Entity;\n#end\nimport org.apache.ibatis.annotations.Mapper;\n\n@Mapper\n#if($ChildClassName)\npublic interface ${ChildClassName}Mapper extends PigxBaseMapper<${ChildClassName}Entity> {\n#else\npublic interface ${ClassName}Mapper extends PigxBaseMapper<${ClassName}Entity> {\n#end\n\n}', '2023-02-23 01:18:18', '2023-08-07 09:54:36', '0', 1, ' ', ' '); +COMMIT; + +-- ---------------------------- +-- Table structure for gen_template_group +-- ---------------------------- +DROP TABLE IF EXISTS `gen_template_group`; +CREATE TABLE `gen_template_group` ( + `group_id` bigint NOT NULL COMMENT '分组id', + `template_id` bigint NOT NULL COMMENT '模板id', + PRIMARY KEY (`group_id`,`template_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='模板分组关联表'; + +-- ---------------------------- +-- Records of gen_template_group +-- ---------------------------- +BEGIN; +INSERT INTO `gen_template_group` VALUES (1, 3); +INSERT INTO `gen_template_group` VALUES (1, 4); +INSERT INTO `gen_template_group` VALUES (1, 5); +INSERT INTO `gen_template_group` VALUES (1, 6); +INSERT INTO `gen_template_group` VALUES (1, 7); +INSERT INTO `gen_template_group` VALUES (1, 8); +INSERT INTO `gen_template_group` VALUES (1, 9); +INSERT INTO `gen_template_group` VALUES (1, 10); +INSERT INTO `gen_template_group` VALUES (1, 11); +INSERT INTO `gen_template_group` VALUES (1, 12); +INSERT INTO `gen_template_group` VALUES (2, 4); +INSERT INTO `gen_template_group` VALUES (2, 5); +INSERT INTO `gen_template_group` VALUES (2, 6); +INSERT INTO `gen_template_group` VALUES (2, 7); +INSERT INTO `gen_template_group` VALUES (2, 8); +INSERT INTO `gen_template_group` VALUES (2, 9); +INSERT INTO `gen_template_group` VALUES (2, 10); +INSERT INTO `gen_template_group` VALUES (2, 15); +INSERT INTO `gen_template_group` VALUES (2, 16); +INSERT INTO `gen_template_group` VALUES (2, 17); +INSERT INTO `gen_template_group` VALUES (2, 18); +INSERT INTO `gen_template_group` VALUES (2, 19); +COMMIT; + +SET FOREIGN_KEY_CHECKS = 1; diff --git a/db/999pigxx_app.sql b/db/999pigxx_app.sql new file mode 100644 index 0000000..056df7a --- /dev/null +++ b/db/999pigxx_app.sql @@ -0,0 +1,242 @@ +USE pigxx_app; +SET NAMES utf8mb4; +SET FOREIGN_KEY_CHECKS = 0; + +-- ---------------------------- +-- Table structure for app_article +-- ---------------------------- +DROP TABLE IF EXISTS `app_article`; +CREATE TABLE `app_article` ( + `id` bigint NOT NULL COMMENT '主键', + `cid` bigint NOT NULL COMMENT '分类', + `title` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '标题', + `intro` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '简介', + `summary` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '摘要', + `image` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '封面', + `content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '内容', + `author` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '作者', + `visit` int unsigned NOT NULL DEFAULT '0' COMMENT '浏览', + `sort` int unsigned NOT NULL DEFAULT '50' COMMENT '排序', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + `create_by` varchar(32) COLLATE utf8mb4_general_ci NOT NULL COMMENT '创建人', + `update_by` varchar(32) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '更新人', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '删除时间', + `tenant_id` bigint(20) DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE, + KEY `cid_idx` (`cid`) USING BTREE COMMENT '分类索引' +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='文章资讯表'; + +-- ---------------------------- +-- Records of app_article +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for app_article_category +-- ---------------------------- +DROP TABLE IF EXISTS `app_article_category`; +CREATE TABLE `app_article_category` ( + `id` bigint unsigned NOT NULL COMMENT '主键', + `name` varchar(60) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '名称', + `sort` smallint unsigned NOT NULL DEFAULT '50' COMMENT '排序', + `is_show` tinyint unsigned NOT NULL DEFAULT '1' COMMENT '是否显示: 0=否, 1=是', + `del_flag` char(1) COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '是否删除: 0=否, 1=是', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + `create_by` varchar(32) COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '创建人', + `update_by` varchar(32) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '更新人', + `tenant_id` bigint(20) DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='文章分类表'; + +-- ---------------------------- +-- Records of app_article_category +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for app_article_collect +-- ---------------------------- +DROP TABLE IF EXISTS `app_article_collect`; +CREATE TABLE `app_article_collect` ( + `id` bigint unsigned NOT NULL COMMENT '主键', + `user_id` bigint unsigned NOT NULL DEFAULT '0' COMMENT '用户ID', + `article_id` bigint unsigned NOT NULL DEFAULT '0' COMMENT '文章ID', + `create_time` datetime NOT NULL COMMENT '创建时间', + `update_time` datetime NOT NULL COMMENT '更新时间', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '0' COMMENT '是否删除', + `create_by` varchar(32) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '创建人', + `update_by` varchar(32) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '更新人', + `tenant_id` bigint(20) DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='文章收藏表'; + +-- ---------------------------- +-- Records of app_article_collect +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for app_page +-- ---------------------------- +DROP TABLE IF EXISTS `app_page`; +CREATE TABLE `app_page` ( + `id` bigint unsigned NOT NULL COMMENT '主键', + `page_type` tinyint unsigned NOT NULL DEFAULT '10' COMMENT '页面类型', + `page_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '页面名称', + `page_data` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '页面数据', + `create_by` varchar(32) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '创建人', + `update_by` varchar(32) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '修改人', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_time` datetime DEFAULT NULL COMMENT '修改时间', + `del_flag` char(1) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '删除标记', + `tenant_id` bigint(20) DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='页面装修表'; + +-- ---------------------------- +-- Records of app_page +-- ---------------------------- +BEGIN; +INSERT INTO `app_page` VALUES (1, 1, '商城首页', '[{\"title\":\"搜索\",\"name\":\"search\",\"disabled\":1,\"content\":{},\"styles\":{}},{\"title\":\"首页轮播图\",\"name\":\"banner\",\"content\":{\"enabled\":1,\"data\":[{\"image\":\"/api/static/banner01.png\",\"name\":\"\",\"link\":{\"path\":\"/pages/index/index\",\"name\":\"商城首页\",\"type\":\"shop\"}}]},\"styles\":{}},{\"title\":\"导航菜单\",\"name\":\"nav\",\"content\":{\"enabled\":1,\"data\":[{\"image\":\"https://minio.pigx.top/oss/app/nav01.png\",\"name\":\"资讯中心\",\"link\":{\"path\":\"/pages/news/news\",\"name\":\"文章资讯\",\"type\":\"shop\"}},{\"image\":\"https://minio.pigx.top/oss/app/nav02.png\",\"name\":\"我的收藏\",\"link\":{\"path\":\"/pages/collection/collection\",\"name\":\"我的收藏\",\"type\":\"shop\"}},{\"image\":\"https://minio.pigx.top/oss/app/nav03.png\",\"name\":\"个人设置\",\"link\":{\"path\":\"/pages/user_set/user_set\",\"name\":\"个人设置\",\"type\":\"shop\"}},{\"image\":\"https://minio.pigx.top/oss/app/nav04.png\",\"name\":\"联系客服\",\"link\":{\"path\":\"/pages/customer_service/customer_service\",\"name\":\"联系客服\",\"type\":\"shop\"}},{\"image\":\"https://minio.pigx.top/oss/app/nav05.png\",\"name\":\"关于我们\",\"link\":{\"path\":\"/pages/as_us/as_us\",\"name\":\"关于我们\",\"type\":\"shop\"}}]},\"styles\":{}},{\"id\":\"l84almsk2uhyf\",\"title\":\"资讯\",\"name\":\"news\",\"disabled\":1,\"content\":{},\"styles\":{}}]', NULL, 'admin', NULL, '2023-06-15 09:18:02', '0',1); +INSERT INTO `app_page` VALUES (2, 2, '个人中心', '[{\"title\":\"用户信息\",\"name\":\"user-info\",\"disabled\":1,\"content\":{},\"styles\":{}},{\"title\":\"我的服务\",\"name\":\"my-service\",\"content\":{\"style\":2,\"title\":\"服务中心\",\"data\":[{\"image\":\"https://minio.pigx.top/oss/app/user_collect.png\",\"name\":\"我的收藏\",\"link\":{\"path\":\"/pages/collection/collection\",\"name\":\"我的收藏\",\"type\":\"shop\"}},{\"image\":\"https://minio.pigx.top/oss/app/user_setting.png\",\"name\":\"个人设置\",\"link\":{\"path\":\"/pages/user_set/user_set\",\"name\":\"个人设置\",\"type\":\"shop\"}},{\"image\":\"https://minio.pigx.top/oss/app/user_kefu.png\",\"name\":\"联系客服\",\"link\":{\"path\":\"/pages/customer_service/customer_service\",\"name\":\"联系客服\",\"type\":\"shop\"}}]},\"styles\":{}},{\"title\":\"个人中心广告图\",\"name\":\"user-banner\",\"content\":{\"enabled\":1,\"data\":[{\"image\":\"\",\"name\":\"sdds\",\"link\":{\"path\":\"/pages/user/user\",\"name\":\"个人中心\",\"type\":\"shop\"}}]},\"styles\":{}}]', NULL, 'admin', NULL, '2023-06-18 17:00:05', '0',1); +INSERT INTO `app_page` VALUES (3, 3, '客服设置', '[{\"title\":\"客服设置\",\"name\":\"customer-service\",\"content\":{\"title\":\"添加客服二维码\",\"time\":\"早上 9:00 - 22:00\",\"mobile\":\"13800138000\",\"qrcode\":\"/admin/sys-file/local/adc5061f99e9440abcd9b22572909c88.jpg\"},\"styles\":{}}]', NULL, 'admin', NULL, '2023-06-14 13:12:19', '0',1); +COMMIT; + +-- ---------------------------- +-- Table structure for app_tabbar +-- ---------------------------- +DROP TABLE IF EXISTS `app_tabbar`; +CREATE TABLE `app_tabbar` ( + `id` bigint unsigned NOT NULL COMMENT '主键', + `name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '导航名称', + `selected` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '未选图标', + `unselected` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '已选图标', + `link` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '链接地址', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + `create_by` varchar(32) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '创建人', + `update_by` varchar(32) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '更新人', + `del_flag` char(1) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '删除标记', + `tenant_id` bigint(20) DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='底部装修表'; + +-- ---------------------------- +-- Records of app_tabbar +-- ---------------------------- +BEGIN; +INSERT INTO `app_tabbar` VALUES (1, '首页', 'https://minio.pigx.top/oss/app/tabbar0.png', 'https://minio.pigx.top/oss/app/tabbar0_0.png', '{\"path\":\"/pages/index/index\",\"name\":\"商城首页\",\"type\":\"shop\"}', NULL, '2023-06-15 09:16:25', NULL, 'admin', '0',1); +INSERT INTO `app_tabbar` VALUES (2, '资讯', 'https://minio.pigx.top/oss/app/tabbar1.png', 'https://minio.pigx.top/oss/app/tabbar1_1.png', '{\"path\":\"/pages/news/news\",\"name\":\"文章资讯\",\"type\":\"shop\"}', NULL, '2023-06-15 09:16:25', NULL, 'admin', '0',1); +INSERT INTO `app_tabbar` VALUES (3, '我的', 'https://minio.pigx.top/oss/app/tabbar3.png', 'https://minio.pigx.top/oss/app/tabbar3_3.png', '{\"path\":\"/pages/user/user\",\"name\":\"个人中心\",\"type\":\"shop\"}', NULL, '2023-06-15 09:16:25', NULL, 'admin', '0',1); +COMMIT; + +-- ---------------------------- +-- Table structure for app_role +-- ---------------------------- +DROP TABLE IF EXISTS `app_role`; +CREATE TABLE `app_role` ( + `role_id` bigint(20) NOT NULL, + `role_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `role_code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `role_desc` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT ' ' COMMENT '创建人', + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT ' ' COMMENT '修改人', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP, + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0', + `tenant_id` bigint(20) DEFAULT NULL, + PRIMARY KEY (`role_id`) USING BTREE, + KEY `role_idx1_role_code` (`role_code`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='app角色表'; + +-- ---------------------------- +-- Records of app_role +-- ---------------------------- +BEGIN; +INSERT INTO `app_role` VALUES (1, 'app用户', 'APP_USER', 'app用户角色', '', '', '2022-12-07 06:34:18', '2023-03-09 06:34:42', '0', 1); +COMMIT; + +-- ---------------------------- +-- Table structure for app_social_details +-- ---------------------------- +DROP TABLE IF EXISTS `app_social_details`; +CREATE TABLE `app_social_details` ( + `id` bigint(20) NOT NULL COMMENT '主键', -- 主键 + `type` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '社交类型', -- 社交类型 + `remark` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注', -- 备注 + `app_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '应用ID', -- 应用ID + `app_secret` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '应用密钥', -- 应用密钥 + `redirect_url` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '重定向URL', -- 重定向URL + `ext` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '拓展字段', -- 拓展字段 + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT ' ' COMMENT '创建人', -- 创建人 + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT ' ' COMMENT '修改人', -- 修改人 + `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', -- 创建时间 + `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', -- 更新时间 + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标志', -- 删除标志 +PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC +COMMENT='系统社交登录账号表'; -- 系统社交登录账号表 + +-- ---------------------------- +-- Records of app_social_details +-- ---------------------------- +BEGIN; +INSERT INTO `app_social_details` VALUES (1, 'MINI', '小程序登录', 'app_id', 'app_secret', 'http://www.baidu.com123', NULL, '', 'admin', '2022-12-09 01:44:42', '2023-04-03 06:12:30', '0'); +COMMIT; + +-- ---------------------------- +-- Table structure for app_user +-- ---------------------------- +DROP TABLE IF EXISTS `app_user`; +CREATE TABLE `app_user` ( + `user_id` bigint(20) NOT NULL COMMENT '用户id', + `username` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '用户名', + `password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '密码', + `salt` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '盐值', + `phone` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '手机号码', + `avatar` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '头像图片链接', + `nickname` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '拓展字段:昵称', + `name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '拓展字段:姓名', + `email` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '拓展字段:邮箱', + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT ' ' COMMENT '创建人', + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT ' ' COMMENT '修改人', + `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标志', + `tenant_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '所属租户id', + `last_modified_time` datetime DEFAULT NULL COMMENT '最后一次密码修改时间', + `lock_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '锁定状态', + `wx_openid` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '微信登录openId', + PRIMARY KEY (`user_id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='app用户表'; + +-- ---------------------------- +-- Records of app_user +-- ---------------------------- +BEGIN; +INSERT INTO `app_user` VALUES (1, 'appuser', '$2a$10$XQu3TmORLqDWayFspQN.U.LigJ5TWPTdXPIn/6SxGHKED3PVpuMH6', NULL, '13054729089', NULL, 'aeizzz', '刘洪磊', 'aeizzz@foxmail.com', '', 'appuser', '2022-12-07 02:59:38', '2023-03-09 15:14:44', '0', 1, NULL, '0', 'oBxPy5EnbDiN-gGEaovCpp_IkrkQ'); +COMMIT; + +-- ---------------------------- +-- Table structure for app_user_role +-- ---------------------------- +DROP TABLE IF EXISTS `app_user_role`; +CREATE TABLE `app_user_role` ( + `user_id` bigint(20) NOT NULL COMMENT '用户ID', + `role_id` bigint(20) NOT NULL COMMENT '角色ID', + PRIMARY KEY (`user_id`,`role_id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='用户角色表'; + +-- ---------------------------- +-- Records of app_user_role +-- ---------------------------- +BEGIN; +INSERT INTO `app_user_role` VALUES (1, 1); +COMMIT; + +SET FOREIGN_KEY_CHECKS = 1; diff --git a/db/99pigxx_bi.sql b/db/99pigxx_bi.sql new file mode 100644 index 0000000..9aabca9 --- /dev/null +++ b/db/99pigxx_bi.sql @@ -0,0 +1,1620 @@ +USE pigxx_bi; +SET NAMES utf8mb4; +SET FOREIGN_KEY_CHECKS = 0; + +-- ---------------------------- +-- Table structure for jimu_dict +-- ---------------------------- +DROP TABLE IF EXISTS `jimu_dict`; +CREATE TABLE `jimu_dict` ( + `id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `dict_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '字典名称', + `dict_code` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '字典编码', + `description` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '描述', + `del_flag` int(0) NULL DEFAULT NULL COMMENT '删除状态', + `create_by` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '更新人', + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', + `type` int(1) UNSIGNED ZEROFILL NULL DEFAULT 0 COMMENT '字典类型0为string,1为number', + `tenant_id` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '多租户标识', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE INDEX `uk_sd_dict_code`(`dict_code`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of jimu_dict +-- ---------------------------- +INSERT INTO `jimu_dict` VALUES ('0b1dac3e87ed7229ae19a586a8b8c8f8', '物资类型', 'wz_cc_type', NULL, 0, 'admin', '2019-04-26 18:25:48', NULL, NULL, 0, NULL); +INSERT INTO `jimu_dict` VALUES ('0b5d19e1fce4b2e6647e6b4a17760c14', '通告类型', 'msg_category', '消息类型1:通知公告2:系统消息', 0, 'admin', '2019-04-22 18:01:35', NULL, NULL, 0, NULL); +INSERT INTO `jimu_dict` VALUES ('1166528843122561025', '测试字典员工类型', 'ceshi_code', '', 0, 'admin', '2019-08-28 09:52:04', 'admin', '2021-01-08 14:33:43', 0, NULL); +INSERT INTO `jimu_dict` VALUES ('1174509082208395266', '职务职级', 'position_rank', '职务表职级字典', 0, 'admin', '2019-09-19 10:22:41', NULL, NULL, 0, NULL); +INSERT INTO `jimu_dict` VALUES ('1174511106530525185', '机构类型', 'org_category', '机构类型 1公司,2部门 3岗位', 0, 'admin', '2019-09-19 10:30:43', NULL, NULL, 0, NULL); +INSERT INTO `jimu_dict` VALUES ('1178295274528845826', '表单权限策略', 'form_perms_type', '', 0, 'admin', '2019-09-29 21:07:39', 'admin', '2019-09-29 21:08:26', NULL, NULL); +INSERT INTO `jimu_dict` VALUES ('1199517671259906049', '紧急程度', 'urgent_level', '日程计划紧急程度', 0, 'admin', '2019-11-27 10:37:53', NULL, NULL, 0, NULL); +INSERT INTO `jimu_dict` VALUES ('1199518099888414722', '日程计划类型', 'eoa_plan_type', '', 0, 'admin', '2019-11-27 10:39:36', NULL, NULL, 0, NULL); +INSERT INTO `jimu_dict` VALUES ('1199525215290306561', '日程计划状态', 'eoa_plan_status', '', 0, 'admin', '2019-11-27 11:07:52', 'admin', '2019-11-27 11:10:11', 0, NULL); +INSERT INTO `jimu_dict` VALUES ('1204580702536957953', '打卡类型', 'sign_type', '', 0, 'admin', '2019-12-11 09:56:34', 'admin', '2020-02-13 14:21:36', 0, NULL); +INSERT INTO `jimu_dict` VALUES ('1204581134206337025', '打卡状态', 'sign_status', '', 0, 'admin', '2019-12-11 09:58:17', NULL, NULL, 0, NULL); +INSERT INTO `jimu_dict` VALUES ('1209733563293962241', '数据库类型', 'database_type', '', 0, 'admin', '2019-12-25 15:12:12', NULL, NULL, 0, NULL); +INSERT INTO `jimu_dict` VALUES ('1232913193820581889', 'Online表单业务分类', 'ol_form_biz_type', '', 0, 'admin', '2020-02-27 14:19:46', 'admin', '2020-02-27 14:20:23', 0, NULL); +INSERT INTO `jimu_dict` VALUES ('1242281790421389314', '会议类型', 'mettingType', '', 0, 'admin', '2020-03-24 10:47:13', NULL, NULL, 0, NULL); +INSERT INTO `jimu_dict` VALUES ('1242298510024429569', '提醒方式', 'remindMode', '', 0, 'admin', '2020-03-24 11:53:40', 'admin', '2020-03-24 12:03:22', 0, NULL); +INSERT INTO `jimu_dict` VALUES ('1244538302904672258', '提醒时间', 'remindTime', '', 0, 'admin', '2020-03-30 16:13:48', NULL, NULL, 0, NULL); +INSERT INTO `jimu_dict` VALUES ('1244538772909989889', '重复提醒', 'reminders', '', 0, 'admin', '2020-03-30 16:15:40', NULL, NULL, 0, NULL); +INSERT INTO `jimu_dict` VALUES ('1244941599661178882', '表单设计器路由类型', 'desform_route_type', '表单设计器下一步路由跳转类型', 0, 'admin', '2020-03-31 18:56:22', NULL, NULL, 0, NULL); +INSERT INTO `jimu_dict` VALUES ('1250687930947620866', '定时任务状态', 'quartz_status', '', 0, 'admin', '2020-04-16 15:30:14', '', NULL, NULL, NULL); +INSERT INTO `jimu_dict` VALUES ('1252881342601908225', '栏目类型', 'cms_menu_type', '', 0, 'admin', '2020-04-22 16:46:04', '', NULL, NULL, NULL); +INSERT INTO `jimu_dict` VALUES ('1253673013610672130', '会议室规模', 'meeting_scale', '', 0, 'admin', '2020-04-24 21:11:53', '', NULL, NULL, NULL); +INSERT INTO `jimu_dict` VALUES ('1272739651112034306', '缓急', 'urgency', '', 0, 'admin', '2020-06-16 11:55:54', NULL, NULL, 0, NULL); +INSERT INTO `jimu_dict` VALUES ('1272740254731100161', '密级', 'secret_level', '', 0, 'admin', '2020-06-16 11:58:18', NULL, NULL, 0, NULL); +INSERT INTO `jimu_dict` VALUES ('1280401766745718786', '租户状态', 'tenant_status', '租户状态', 0, 'admin', '2020-07-07 15:22:25', NULL, NULL, 0, NULL); +INSERT INTO `jimu_dict` VALUES ('1336551227544694785', '999', '999', '', 1, 'admin', '2020-12-09 14:00:19', NULL, NULL, 0, NULL); +INSERT INTO `jimu_dict` VALUES ('1338811917237489665', '报表测试职务', 'zhiwu', '积木报表演示', 0, 'admin', '2020-12-15 19:43:30', 'admin', '2021-01-13 14:03:13', 0, NULL); +INSERT INTO `jimu_dict` VALUES ('20863a840c7622c3eab0ee69e55a8c7c', '常用审批语', 'approval_remarks', '常用审批语', 0, 'admin', '2019-03-15 11:03:26', 'admin', '2019-06-10 19:38:31', 0, NULL); +INSERT INTO `jimu_dict` VALUES ('236e8a4baff0db8c62c00dd95632834f', '同步工作流引擎', 'activiti_sync', '同步工作流引擎', 0, 'admin', '2019-05-15 15:27:33', NULL, NULL, 0, NULL); +INSERT INTO `jimu_dict` VALUES ('2e02df51611a4b9632828ab7e5338f00', '权限策略', 'perms_type', '权限策略', 0, 'admin', '2019-04-26 18:26:55', NULL, NULL, 0, NULL); +INSERT INTO `jimu_dict` VALUES ('2f0320997ade5dd147c90130f7218c3e', '推送类别', 'msg_type', '', 0, 'admin', '2019-03-17 21:21:32', 'admin', '2019-03-26 19:57:45', 0, NULL); +INSERT INTO `jimu_dict` VALUES ('3486f32803bb953e7155dab3513dc68b', '删除状态', 'del_flag', '', 0, 'admin', '2019-10-18 21:46:26', 'admin', '2019-05-31 11:32:41', 0, NULL); +INSERT INTO `jimu_dict` VALUES ('36d57175542a3ea85073923e8fccc21c', '尺码类型', 'air_china_size', NULL, 0, 'admin', '2019-04-23 23:02:44', NULL, NULL, 0, NULL); +INSERT INTO `jimu_dict` VALUES ('3d9a351be3436fbefb1307d4cfb49bf2', '性别', 'sex', NULL, 0, NULL, '2019-01-04 14:56:32', 'admin', '2019-03-30 11:28:27', 1, NULL); +INSERT INTO `jimu_dict` VALUES ('4274efc2292239b6f000b153f50823ff', '全局权限策略', 'global_perms_type', '全局权限策略', 0, 'admin', '2019-05-10 17:54:05', NULL, NULL, 0, NULL); +INSERT INTO `jimu_dict` VALUES ('49a0f7247f9c2a7df4e5733b790a4c9f', '供应商', 'air_china_ supplier', NULL, 0, 'admin', '2019-04-24 16:49:25', NULL, NULL, 0, NULL); +INSERT INTO `jimu_dict` VALUES ('4c03fca6bf1f0299c381213961566349', 'Online图表展示模板', 'online_graph_display_template', 'Online图表展示模板', 0, 'admin', '2019-04-12 17:28:50', NULL, NULL, 0, NULL); +INSERT INTO `jimu_dict` VALUES ('4c753b5293304e7a445fd2741b46529d', '字典状态', 'dict_item_status', NULL, 0, 'admin', '2019-06-18 23:18:42', 'admin', '2019-03-30 19:33:52', 1, NULL); +INSERT INTO `jimu_dict` VALUES ('4d7fec1a7799a436d26d02325eff295e', '优先级', 'priority', '优先级', 0, 'admin', '2019-03-16 17:03:34', 'admin', '2019-04-16 17:39:23', 0, NULL); +INSERT INTO `jimu_dict` VALUES ('4e4602b3e3686f0911384e188dc7efb4', '条件规则', 'rule_conditions', '', 0, 'admin', '2019-04-01 10:15:03', 'admin', '2019-04-01 10:30:47', 0, NULL); +INSERT INTO `jimu_dict` VALUES ('4f69be5f507accea8d5df5f11346181a', '发送消息类型', 'msgType', NULL, 0, 'admin', '2019-04-11 14:27:09', NULL, NULL, 0, NULL); +INSERT INTO `jimu_dict` VALUES ('68168534ff5065a152bfab275c2136f8', '有效无效状态', 'valid_status', '有效无效状态', 0, 'admin', '2020-09-26 19:21:14', 'admin', '2019-06-07 00:30:10', 0, NULL); +INSERT INTO `jimu_dict` VALUES ('72cce0989df68887546746d8f09811aa', 'Online表单类型', 'cgform_table_type', '', 0, 'admin', '2019-01-27 10:13:02', 'admin', '2019-03-30 11:37:36', 0, NULL); +INSERT INTO `jimu_dict` VALUES ('76c1d6755018a918c9eeda575dbf3f98', '计量单位', 'air_china_unit', NULL, 0, 'admin', '2017-12-23 23:00:02', 'admin', '2019-04-23 23:13:52', 0, NULL); +INSERT INTO `jimu_dict` VALUES ('78bda155fe380b1b3f175f1e88c284c6', '流程状态', 'bpm_status', '流程状态', 0, 'admin', '2019-05-09 16:31:52', NULL, NULL, 0, NULL); +INSERT INTO `jimu_dict` VALUES ('83bfb33147013cc81640d5fd9eda030c', '日志类型', 'log_type', NULL, 0, 'admin', '2019-03-18 23:22:19', NULL, NULL, 1, NULL); +INSERT INTO `jimu_dict` VALUES ('880a895c98afeca9d9ac39f29e67c13e', '操作类型', 'operate_type', '操作类型', 0, 'admin', '2019-07-22 10:54:29', NULL, NULL, 0, NULL); +INSERT INTO `jimu_dict` VALUES ('8dfe32e2d29ea9430a988b3b558bf233', '发布状态', 'send_status', '发布状态', 0, 'admin', '2019-04-16 17:40:42', NULL, NULL, 0, NULL); +INSERT INTO `jimu_dict` VALUES ('a7adbcd86c37f7dbc9b66945c82ef9e6', '1是0否', 'yn', '', 1, 'admin', '2019-05-22 19:29:29', NULL, NULL, 0, NULL); +INSERT INTO `jimu_dict` VALUES ('a9d9942bd0eccb6e89de92d130ec4c4a', '消息发送状态', 'msgSendStatus', NULL, 0, 'admin', '2019-04-12 18:18:17', NULL, NULL, 0, NULL); +INSERT INTO `jimu_dict` VALUES ('ac2f7c0c5c5775fcea7e2387bcb22f01', '菜单类型', 'menu_type', NULL, 0, 'admin', '2019-12-18 23:24:32', 'admin', '2019-04-01 15:27:06', 1, NULL); +INSERT INTO `jimu_dict` VALUES ('bd1b8bc28e65d6feefefb6f3c79f42fd', 'Online图表数据类型', 'online_graph_data_type', 'Online图表数据类型', 0, 'admin', '2019-04-12 17:24:24', 'admin', '2019-04-12 17:24:57', 0, NULL); +INSERT INTO `jimu_dict` VALUES ('c36169beb12de8a71c8683ee7c28a503', '部门状态', 'depart_status', NULL, 0, 'admin', '2019-03-18 21:59:51', NULL, NULL, 0, NULL); +INSERT INTO `jimu_dict` VALUES ('c5a14c75172783d72cbee6ee7f5df5d1', 'Online图表类型', 'online_graph_type', 'Online图表类型', 0, 'admin', '2019-04-12 17:04:06', NULL, NULL, 0, NULL); +INSERT INTO `jimu_dict` VALUES ('c72e92c2c13cdbc07b455e6abcc60d47', '启动状态', 'air_china_valid', NULL, 0, 'admin', '2019-04-23 23:05:29', NULL, NULL, 0, NULL); +INSERT INTO `jimu_dict` VALUES ('d6e1152968b02d69ff358c75b48a6ee1', '流程类型', 'bpm_process_type', NULL, 0, 'admin', '2019-02-22 19:26:54', 'admin', '2019-03-30 18:14:44', 0, NULL); +INSERT INTO `jimu_dict` VALUES ('fc6cd58fde2e8481db10d3a1e68ce70c', '用户状态', 'user_status', NULL, 0, 'admin', '2019-03-18 21:57:25', 'admin', '2019-03-18 23:11:58', 1, NULL); + +-- ---------------------------- +-- Table structure for jimu_dict_item +-- ---------------------------- +DROP TABLE IF EXISTS `jimu_dict_item`; +CREATE TABLE `jimu_dict_item` ( + `id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `dict_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '字典id', + `item_text` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '字典项文本', + `item_value` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '字典项值', + `description` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '描述', + `sort_order` int(0) NULL DEFAULT NULL COMMENT '排序', + `status` int(0) NULL DEFAULT NULL COMMENT '状态(1启用 0不启用)', + `create_by` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `create_time` datetime(0) NULL DEFAULT NULL, + `update_by` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `update_time` datetime(0) NULL DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE, + INDEX `idx_sdi_role_dict_id`(`dict_id`) USING BTREE, + INDEX `idx_sdi_role_sort_order`(`sort_order`) USING BTREE, + INDEX `idx_sdi_status`(`status`) USING BTREE, + INDEX `idx_sdi_dict_val`(`dict_id`, `item_value`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of jimu_dict_item +-- ---------------------------- +INSERT INTO `jimu_dict_item` VALUES ('0072d115e07c875d76c9b022e2179128', '4d7fec1a7799a436d26d02325eff295e', '低', 'L', '低', 3, 1, 'admin', '2019-04-16 17:04:59', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('00cd5762c968332e2bf8d1fdae872f26', '76c1d6755018a918c9eeda575dbf3f98', '条', '3', NULL, 3, 1, 'admin', '2019-04-23 23:00:42', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('05a2e732ce7b00aa52141ecc3e330b4e', '3486f32803bb953e7155dab3513dc68b', '已删除', '1', NULL, NULL, 1, 'admin', '2025-10-18 21:46:56', 'admin', '2019-03-28 22:23:20'); +INSERT INTO `jimu_dict_item` VALUES ('0737b49b097033b35e1882f970d43263', '36d57175542a3ea85073923e8fccc21c', '量体类', '1', NULL, 1, 1, 'admin', '2019-04-23 23:03:02', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('08ec6c5c986766cc0f398bf88b2c7fd5', '20863a840c7622c3eab0ee69e55a8c7c', '呈领导阅示', '呈领导阅示', '呈领导阅示', 7, 1, 'admin', '2019-05-15 11:07:59', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('096c2e758d823def3855f6376bc736fb', 'bd1b8bc28e65d6feefefb6f3c79f42fd', 'SQL', 'sql', NULL, 1, 1, 'admin', '2019-04-12 17:26:26', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('0c9532916f5cd722017b46bc4d953e41', '2f0320997ade5dd147c90130f7218c3e', '指定用户', 'USER', NULL, NULL, 1, 'admin', '2019-03-17 21:22:19', 'admin', '2019-03-17 21:22:28'); +INSERT INTO `jimu_dict_item` VALUES ('0ca4beba9efc4f9dd54af0911a946d5c', '72cce0989df68887546746d8f09811aa', '附表', '3', NULL, 3, 1, 'admin', '2019-03-27 10:13:43', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1030a2652608f5eac3b49d70458b8532', '2e02df51611a4b9632828ab7e5338f00', '禁用', '2', '禁用', 2, 1, 'admin', '2021-03-26 18:27:28', 'admin', '2019-04-26 18:39:11'); +INSERT INTO `jimu_dict_item` VALUES ('10e3b1b78da8b40161b7b89cefb2f31b', '0b1dac3e87ed7229ae19a586a8b8c8f8', '衣服', 'yifu', NULL, 1, 1, 'admin', '2019-04-26 18:26:04', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1166528884218351617', '1166528843122561025', '普通员工', '1', '', 1, 1, 'admin', '2019-08-28 09:52:14', 'admin', '2021-01-08 14:33:52'); +INSERT INTO `jimu_dict_item` VALUES ('1166528900752297986', '1166528843122561025', '领导', '2', '', 1, 1, 'admin', '2019-08-28 09:52:18', 'admin', '2021-01-08 14:33:57'); +INSERT INTO `jimu_dict_item` VALUES ('1174509082208395266', '1174511106530525185', '岗位', '3', '岗位', 1, 1, 'admin', '2019-09-19 10:31:16', '', NULL); +INSERT INTO `jimu_dict_item` VALUES ('1174509601047994369', '1174509082208395266', '员级', '1', '', 1, 1, 'admin', '2019-09-19 10:24:45', 'admin', '2019-09-23 11:46:39'); +INSERT INTO `jimu_dict_item` VALUES ('1174509667297026049', '1174509082208395266', '助级', '2', '', 2, 1, 'admin', '2019-09-19 10:25:01', 'admin', '2019-09-23 11:46:47'); +INSERT INTO `jimu_dict_item` VALUES ('1174509713568587777', '1174509082208395266', '中级', '3', '', 3, 1, 'admin', '2019-09-19 10:25:12', 'admin', '2019-09-23 11:46:56'); +INSERT INTO `jimu_dict_item` VALUES ('1174509788361416705', '1174509082208395266', '副高级', '4', '', 4, 1, 'admin', '2019-09-19 10:25:30', 'admin', '2019-09-23 11:47:06'); +INSERT INTO `jimu_dict_item` VALUES ('1174509835803189250', '1174509082208395266', '正高级', '5', '', 5, 1, 'admin', '2019-09-19 10:25:41', 'admin', '2019-09-23 11:47:12'); +INSERT INTO `jimu_dict_item` VALUES ('1174511197735665665', '1174511106530525185', '公司', '1', '公司', 1, 1, 'admin', '2019-09-19 10:31:05', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1174511244036587521', '1174511106530525185', '部门', '2', '部门', 1, 1, 'admin', '2019-09-19 10:31:16', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1178295553450061826', '1178295274528845826', '可编辑(未授权禁用)', '2', '', 2, 1, 'admin', '2019-09-29 21:08:46', 'admin', '2019-09-29 21:09:18'); +INSERT INTO `jimu_dict_item` VALUES ('1178295639554928641', '1178295274528845826', '可见(未授权不可见)', '1', '', 1, 1, 'admin', '2019-09-29 21:09:06', 'admin', '2019-09-29 21:09:24'); +INSERT INTO `jimu_dict_item` VALUES ('1199517884758368257', '1199517671259906049', '一般', '1', '', 1, 1, 'admin', '2019-11-27 10:38:44', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1199517914017832962', '1199517671259906049', '重要', '2', '', 1, 1, 'admin', '2019-11-27 10:38:51', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1199517941339529217', '1199517671259906049', '紧急', '3', '', 1, 1, 'admin', '2019-11-27 10:38:58', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1199518186144276482', '1199518099888414722', '日常记录', '1', '', 1, 1, 'admin', '2019-11-27 10:39:56', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1199518214858481666', '1199518099888414722', '本周工作', '2', '', 1, 1, 'admin', '2019-11-27 10:40:03', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1199518235943247874', '1199518099888414722', '下周计划', '3', '', 1, 1, 'admin', '2019-11-27 10:40:08', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1199525468672405505', '1199525215290306561', '未开始', '0', '', 1, 1, 'admin', '2019-11-27 11:08:52', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1199525490575060993', '1199525215290306561', '进行中', '2', '', 3, 1, 'admin', '2019-11-27 11:08:58', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1199525506429530114', '1199525215290306561', '已完成', '3', '', 4, 1, 'admin', '2019-11-27 11:09:02', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1199607547704647681', '4f69be5f507accea8d5df5f11346181a', '系统', '4', '', 1, 1, 'admin', '2019-11-27 16:35:02', 'admin', '2019-11-27 19:37:46'); +INSERT INTO `jimu_dict_item` VALUES ('1203571948706095105', '1199525215290306561', '已提醒', '1', '', 2, 1, 'admin', '2019-12-08 15:08:09', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1204581455016067074', '1204580702536957953', '上班打卡', '1', '', 1, 1, 'admin', '2019-12-11 09:59:34', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1204581521328013314', '1204580702536957953', '下班打卡', '2', '', 1, 1, 'admin', '2019-12-11 09:59:49', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1204581542945456129', '1204580702536957953', '外出打卡', '3', '', 1, 1, 'admin', '2019-12-11 09:59:55', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1204581564143468546', '1204580702536957953', '请假', '4', '', 1, 1, 'admin', '2019-12-11 10:00:00', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1204581583089139713', '1204580702536957953', '出差', '5', '', 1, 1, 'admin', '2019-12-11 10:00:04', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1204581803613061122', '1204581134206337025', '缺卡', '0', '', 1, 1, 'admin', '2019-12-11 10:00:57', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1204581830603407362', '1204581134206337025', '正常', '1', '', 1, 1, 'admin', '2019-12-11 10:01:03', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1204581850283081729', '1204581134206337025', '迟到', '2', '', 1, 1, 'admin', '2019-12-11 10:01:08', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1204581868406669314', '1204581134206337025', '旷工', '3', '', 1, 1, 'admin', '2019-12-11 10:01:12', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1204581886026940417', '1204581134206337025', '早退', '4', '', 1, 1, 'admin', '2019-12-11 10:01:16', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1209733775114702850', '1209733563293962241', 'MySQL5.5', '1', '', 1, 1, 'admin', '2019-12-25 15:13:02', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1209733839933476865', '1209733563293962241', 'Oracle', '2', '', 3, 1, 'admin', '2019-12-25 15:13:18', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1209733903020003330', '1209733563293962241', 'SQLServer', '3', '', 4, 1, 'admin', '2019-12-25 15:13:33', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1232913424813486081', '1232913193820581889', '官方示例', 'demo', '', 1, 1, 'admin', '2020-02-27 14:20:42', 'admin', '2020-02-27 14:21:37'); +INSERT INTO `jimu_dict_item` VALUES ('1232913493717512194', '1232913193820581889', '流程表单', 'bpm', '', 2, 1, 'admin', '2020-02-27 14:20:58', 'admin', '2020-02-27 14:22:20'); +INSERT INTO `jimu_dict_item` VALUES ('1232913605382467585', '1232913193820581889', '测试表单', 'temp', '', 4, 1, 'admin', '2020-02-27 14:21:25', 'admin', '2020-02-27 14:22:16'); +INSERT INTO `jimu_dict_item` VALUES ('1232914232372195330', '1232913193820581889', '导入表单', 'bdfl_include', '', 5, 1, 'admin', '2020-02-27 14:23:54', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1233279228474138625', '4e4602b3e3686f0911384e188dc7efb4', '左模糊', 'LEFT_LIKE', '', 7, 1, 'admin', '2020-02-28 14:34:16', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1233279337333104641', '4e4602b3e3686f0911384e188dc7efb4', '右模糊', 'RIGHT_LIKE', '', 7, 1, 'admin', '2020-02-28 14:34:42', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1242281959082741761', '1242281790421389314', '部门会议', 'depart', '', 1, 1, 'admin', '2020-03-24 10:47:54', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1242282018893516802', '1242281790421389314', '临时会议', 'temp', '', 1, 1, 'admin', '2020-03-24 10:48:08', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1242282141274918913', '1242281790421389314', '公司会议', 'company', '', 1, 1, 'admin', '2020-03-24 10:48:37', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1242282318563954690', '1242281790421389314', '培训会议', 'train', '', 1, 1, 'admin', '2020-03-24 10:49:19', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1242282375325470721', '1242281790421389314', '普通会议', 'common', '', 1, 1, 'admin', '2020-03-24 10:49:33', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1242300779390357505', '1242298510024429569', '短信提醒', '2', '', 2, 1, 'admin', '2020-03-24 12:02:41', 'admin', '2020-03-30 18:21:33'); +INSERT INTO `jimu_dict_item` VALUES ('1242300814383435777', '1242298510024429569', '邮件提醒', '1', '', 1, 1, 'admin', '2020-03-24 12:02:49', 'admin', '2020-03-30 18:21:26'); +INSERT INTO `jimu_dict_item` VALUES ('1242300887343353857', '1242298510024429569', '系统消息', '4', '', 4, 1, 'admin', '2020-03-24 12:03:07', 'admin', '2020-03-30 18:21:43'); +INSERT INTO `jimu_dict_item` VALUES ('1244538412480864258', '1244538302904672258', '不提醒', '0', '', 1, 1, 'admin', '2020-03-30 16:14:14', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1244538453169807361', '1244538302904672258', '开始时', '1', '', 1, 1, 'admin', '2020-03-30 16:14:24', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1244538498132746241', '1244538302904672258', '提前5分钟', '2', '', 2, 1, 'admin', '2020-03-30 16:14:35', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1244538537420791810', '1244538302904672258', '提前10分钟', '3', '', 3, 1, 'admin', '2020-03-30 16:14:44', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1244538569926647810', '1244538302904672258', '提前15分钟', '4', '', 4, 1, 'admin', '2020-03-30 16:14:52', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1244538620744835073', '1244538302904672258', '提前30分钟', '5', '', 5, 1, 'admin', '2020-03-30 16:15:04', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1244538674016690178', '1244538302904672258', '提前1小时', '6', '', 6, 1, 'admin', '2020-03-30 16:15:16', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1244538712323268610', '1244538302904672258', '提前2小时', '7', '', 7, 1, 'admin', '2020-03-30 16:15:26', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1244538832364249090', '1244538772909989889', '不重复', '0', '', 1, 1, 'admin', '2020-03-30 16:15:54', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1244538882335186946', '1244538772909989889', '每天', '1', '', 1, 1, 'admin', '2020-03-30 16:16:06', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1244538920792760321', '1244538772909989889', '每周', '2', '', 2, 1, 'admin', '2020-03-30 16:16:15', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1244538964811980802', '1244538772909989889', '每月(当日)', '3', '', 3, 1, 'admin', '2020-03-30 16:16:26', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1244539005064716289', '1244538772909989889', '每年(当日)', '4', '', 4, 1, 'admin', '2020-03-30 16:16:35', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1244941726052335617', '1244941599661178882', '跳转到表单', '1', '', 1, 1, 'admin', '2020-03-31 18:56:52', 'admin', '2020-03-31 21:16:05'); +INSERT INTO `jimu_dict_item` VALUES ('1244941755555069953', '1244941599661178882', '跳转到菜单', '2', '', 2, 1, 'admin', '2020-03-31 18:56:59', 'admin', '2020-03-31 21:16:09'); +INSERT INTO `jimu_dict_item` VALUES ('1244941784743231489', '1244941599661178882', '跳转到外部', '3', '', 3, 1, 'admin', '2020-03-31 18:57:06', 'admin', '2020-03-31 21:16:14'); +INSERT INTO `jimu_dict_item` VALUES ('1250688147579228161', '1250687930947620866', '正常', '0', '', 1, 1, 'admin', '2020-04-16 15:31:05', '', NULL); +INSERT INTO `jimu_dict_item` VALUES ('1250688201064992770', '1250687930947620866', '停止', '-1', '', 1, 1, 'admin', '2020-04-16 15:31:18', '', NULL); +INSERT INTO `jimu_dict_item` VALUES ('1252882203973537794', '1252881342601908225', '列表', '1', '', 1, 1, 'admin', '2020-04-22 16:49:29', '', NULL); +INSERT INTO `jimu_dict_item` VALUES ('1252882248991002626', '1252881342601908225', '链接', '2', '', 1, 1, 'admin', '2020-04-22 16:49:40', '', NULL); +INSERT INTO `jimu_dict_item` VALUES ('1253673087988264962', '1253673013610672130', '小型', 'S', '', 1, 1, 'admin', '2020-04-24 21:12:10', '', NULL); +INSERT INTO `jimu_dict_item` VALUES ('1253673146364588034', '1253673013610672130', '中型', 'M', '', 1, 1, 'admin', '2020-04-24 21:12:24', '', NULL); +INSERT INTO `jimu_dict_item` VALUES ('1253673184885075970', '1253673013610672130', '大型', 'L', '', 1, 1, 'admin', '2020-04-24 21:12:34', '', NULL); +INSERT INTO `jimu_dict_item` VALUES ('1272739846449160193', '1272739651112034306', '一般', '0', '', 1, 1, 'admin', '2020-06-16 11:56:40', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1272739980616556545', '1272739651112034306', '平急', '1', '', 1, 1, 'admin', '2020-06-16 11:57:12', 'admin', '2020-10-28 17:50:22'); +INSERT INTO `jimu_dict_item` VALUES ('1272740017782284289', '1272739651112034306', '加急', '2', '', 1, 1, 'admin', '2020-06-16 11:57:21', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1272740063856713730', '1272739651112034306', '特急', '3', '', 1, 1, 'admin', '2020-06-16 11:57:32', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1272740134505570306', '1272739651112034306', '特提', '4', '', 1, 1, 'admin', '2020-06-16 11:57:49', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1272740342673072129', '1272740254731100161', '一般', '0', '', 1, 1, 'admin', '2020-06-16 11:58:39', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1272740397966581762', '1272740254731100161', '秘密', '1', '', 1, 1, 'admin', '2020-06-16 11:58:52', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1272740445697761282', '1272740254731100161', '机密', '2', '', 1, 1, 'admin', '2020-06-16 11:59:03', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1272740494238441473', '1272740254731100161', '绝密', '3', '', 1, 1, 'admin', '2020-06-16 11:59:15', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1280401815068295170', '1280401766745718786', '正常', '1', '', 1, 1, 'admin', '2020-07-07 15:22:36', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1280401847607705602', '1280401766745718786', '冻结', '0', '', 1, 1, 'admin', '2020-07-07 15:22:44', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1280417387279060994', '1199525215290306561', '已接受', '4', '', 4, 1, 'admin', '2020-07-07 16:24:28', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1280417420456005634', '1199525215290306561', '已取消', '5', '5', 5, 1, 'admin', '2020-07-07 16:24:36', 'admin', '2020-07-07 16:24:45'); +INSERT INTO `jimu_dict_item` VALUES ('1305827309355302914', 'bd1b8bc28e65d6feefefb6f3c79f42fd', 'API', 'api', '', 3, 1, 'admin', '2020-09-15 19:14:26', 'admin', '2020-09-15 19:14:41'); +INSERT INTO `jimu_dict_item` VALUES ('1334440962954936321', '1209733563293962241', 'MYSQL5.7', '4', NULL, 1, 1, 'admin', '2020-12-03 18:16:02', 'admin', '2020-12-03 18:16:02'); +INSERT INTO `jimu_dict_item` VALUES ('1338812279746990082', '1338811917237489665', '研发经理', '1', '', 1, 1, 'admin', '2020-12-15 19:44:56', 'admin', '2021-01-13 14:00:13'); +INSERT INTO `jimu_dict_item` VALUES ('1338812321702612993', '1338811917237489665', '研发专员', '2', '', 1, 1, 'admin', '2020-12-15 19:45:06', 'admin', '2021-01-13 14:00:16'); +INSERT INTO `jimu_dict_item` VALUES ('1338812381655994370', '1338811917237489665', '财务经理', '3', '', 1, 1, 'admin', '2020-12-15 19:45:20', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1338812417886392322', '1338811917237489665', '财务专员', '4', '', 1, 1, 'admin', '2020-12-15 19:45:29', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1338812461297438721', '1338811917237489665', '客服经理', '5', '', 1, 1, 'admin', '2020-12-15 19:45:39', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1338812495665565697', '1338811917237489665', '客服专员', '6', '', 1, 1, 'admin', '2020-12-15 19:45:48', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('147c48ff4b51545032a9119d13f3222a', 'd6e1152968b02d69ff358c75b48a6ee1', '测试流程', 'test', NULL, 1, 1, 'admin', '2019-03-22 19:27:05', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1543fe7e5e26fb97cdafe4981bedc0c8', '4c03fca6bf1f0299c381213961566349', '单排布局', 'single', NULL, 2, 1, 'admin', '2022-07-12 17:43:39', 'admin', '2019-04-12 17:43:57'); +INSERT INTO `jimu_dict_item` VALUES ('1db531bcff19649fa82a644c8a939dc4', '4c03fca6bf1f0299c381213961566349', '组合布局', 'combination', '', 4, 1, 'admin', '2019-05-11 16:07:08', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('222705e11ef0264d4214affff1fb4ff9', '4f69be5f507accea8d5df5f11346181a', '短信', '1', '', 1, 1, 'admin', '2023-02-28 10:50:36', 'admin', '2019-04-28 10:58:11'); +INSERT INTO `jimu_dict_item` VALUES ('23a5bb76004ed0e39414e928c4cde155', '4e4602b3e3686f0911384e188dc7efb4', '不等于', '!=', '不等于', 3, 1, 'admin', '2019-04-01 16:46:15', 'admin', '2019-04-01 17:48:40'); +INSERT INTO `jimu_dict_item` VALUES ('25847e9cb661a7c711f9998452dc09e6', '4e4602b3e3686f0911384e188dc7efb4', '小于等于', '<=', '小于等于', 6, 1, 'admin', '2019-04-01 16:44:34', 'admin', '2019-04-01 17:49:10'); +INSERT INTO `jimu_dict_item` VALUES ('2d51376643f220afdeb6d216a8ac2c01', '68168534ff5065a152bfab275c2136f8', '有效', '1', '有效', 1, 1, 'admin', '2020-10-26 19:22:01', 'admin', '2019-10-04 17:46:58'); +INSERT INTO `jimu_dict_item` VALUES ('308c8aadf0c37ecdde188b97ca9833f5', '8dfe32e2d29ea9430a988b3b558bf233', '已发布', '1', '已发布', 2, 1, 'admin', '2019-04-16 17:41:24', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('333e6b2196e01ef9a5f76d74e86a6e33', '8dfe32e2d29ea9430a988b3b558bf233', '未发布', '0', '未发布', 1, 1, 'admin', '2019-04-16 17:41:12', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('337ea1e401bda7233f6258c284ce4f50', 'bd1b8bc28e65d6feefefb6f3c79f42fd', 'JSON', 'json', NULL, 1, 1, 'admin', '2019-04-12 17:26:33', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('33bc9d9f753cf7dc40e70461e50fdc54', 'a9d9942bd0eccb6e89de92d130ec4c4a', '发送失败', '2', NULL, 3, 1, 'admin', '2019-04-12 18:20:02', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('3c209b31417aba7cd5663355611d12c5', '36d57175542a3ea85073923e8fccc21c', '羊毛衫及毛背心类', '3', NULL, 3, 1, 'admin', '2019-04-23 23:03:27', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('3fbc03d6c994ae06d083751248037c0e', '78bda155fe380b1b3f175f1e88c284c6', '已完成', '3', '已完成', 3, 1, 'admin', '2019-05-09 16:33:25', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('41d7aaa40c9b61756ffb1f28da5ead8e', '0b5d19e1fce4b2e6647e6b4a17760c14', '通知公告', '1', NULL, 1, 1, 'admin', '2019-04-22 18:01:57', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('41fa1e9571505d643aea87aeb83d4d76', '4e4602b3e3686f0911384e188dc7efb4', '等于', '=', '等于', 4, 1, 'admin', '2019-04-01 16:45:24', 'admin', '2019-04-01 17:49:00'); +INSERT INTO `jimu_dict_item` VALUES ('4d7bcaf63f274e262c8e919470e47e5f', '20863a840c7622c3eab0ee69e55a8c7c', '同意', '同意', '同意', 1, 1, 'admin', '2019-05-15 11:04:31', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('4f05fb5376f4c61502c5105f52e4dd2b', '83bfb33147013cc81640d5fd9eda030c', '操作日志', '2', NULL, NULL, 1, 'admin', '2019-03-18 23:22:49', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('50223341bfb5ba30bf6319789d8d17fe', 'd6e1152968b02d69ff358c75b48a6ee1', '业务办理', 'business', NULL, 3, 1, 'admin', '2023-04-22 19:28:05', 'admin', '2019-03-22 23:24:39'); +INSERT INTO `jimu_dict_item` VALUES ('51222413e5906cdaf160bb5c86fb827c', 'a7adbcd86c37f7dbc9b66945c82ef9e6', '是', '1', '', 1, 1, 'admin', '2019-05-22 19:29:45', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('538fca35afe004972c5f3947c039e766', '2e02df51611a4b9632828ab7e5338f00', '显示', '1', '显示', 1, 1, 'admin', '2025-03-26 18:27:13', 'admin', '2019-04-26 18:39:07'); +INSERT INTO `jimu_dict_item` VALUES ('5584c21993bde231bbde2b966f2633ac', '4e4602b3e3686f0911384e188dc7efb4', '自定义SQL', 'USE_SQL_RULES', '自定义SQL表达式', 9, 1, 'admin', '2019-04-01 10:45:24', 'admin', '2019-04-01 17:49:27'); +INSERT INTO `jimu_dict_item` VALUES ('56b9f1c6364c775236e1aa16ff97afae', '20863a840c7622c3eab0ee69e55a8c7c', '不同意', '不同意', '不同意', 6, 1, 'admin', '2019-05-15 11:07:17', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('58b73b344305c99b9d8db0fc056bbc0a', '72cce0989df68887546746d8f09811aa', '主表', '2', NULL, 2, 1, 'admin', '2019-03-27 10:13:36', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('598380c65be4568b6ad507e563aba667', '76c1d6755018a918c9eeda575dbf3f98', '包', '8', NULL, 8, 1, 'admin', '2019-04-23 23:01:58', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('5b65a88f076b32e8e69d19bbaadb52d5', '2f0320997ade5dd147c90130f7218c3e', '全体用户', 'ALL', NULL, NULL, 1, 'admin', '2020-10-17 21:22:43', 'admin', '2019-03-28 22:17:09'); +INSERT INTO `jimu_dict_item` VALUES ('5d833f69296f691843ccdd0c91212b6b', '880a895c98afeca9d9ac39f29e67c13e', '修改', '3', '', 3, 1, 'admin', '2019-07-22 10:55:07', 'admin', '2019-07-22 10:55:41'); +INSERT INTO `jimu_dict_item` VALUES ('5d84a8634c8fdfe96275385075b105c9', '3d9a351be3436fbefb1307d4cfb49bf2', '女', '2', NULL, 2, 1, NULL, '2019-01-04 14:56:56', NULL, '2019-01-04 17:38:12'); +INSERT INTO `jimu_dict_item` VALUES ('66c952ae2c3701a993e7db58f3baf55e', '4e4602b3e3686f0911384e188dc7efb4', '大于', '>', '大于', 1, 1, 'admin', '2019-04-01 10:45:46', 'admin', '2019-04-01 17:48:29'); +INSERT INTO `jimu_dict_item` VALUES ('69cacf64e244100289ddd4aa9fa3b915', 'a9d9942bd0eccb6e89de92d130ec4c4a', '未发送', '0', NULL, 1, 1, 'admin', '2019-04-12 18:19:23', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('6a7a9e1403a7943aba69e54ebeff9762', '4f69be5f507accea8d5df5f11346181a', '邮件', '2', '', 2, 1, 'admin', '2031-02-28 10:50:44', 'admin', '2019-04-28 10:59:03'); +INSERT INTO `jimu_dict_item` VALUES ('6c682d78ddf1715baf79a1d52d2aa8c2', '72cce0989df68887546746d8f09811aa', '单表', '1', NULL, 1, 1, 'admin', '2019-03-27 10:13:29', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('6d404fd2d82311fbc87722cd302a28bc', '4e4602b3e3686f0911384e188dc7efb4', '模糊', 'LIKE', '模糊', 7, 1, 'admin', '2019-04-01 16:46:02', 'admin', '2019-04-01 17:49:20'); +INSERT INTO `jimu_dict_item` VALUES ('6d4e26e78e1a09699182e08516c49fc4', '4d7fec1a7799a436d26d02325eff295e', '高', 'H', '高', 1, 1, 'admin', '2019-04-16 17:04:24', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('6e65c7d1cb1a433b5cccc2e072f6c536', '76c1d6755018a918c9eeda575dbf3f98', '双', '4', NULL, 4, 1, 'admin', '2019-04-23 23:01:10', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('7050c1522702bac3be40e3b7d2e1dfd8', 'c5a14c75172783d72cbee6ee7f5df5d1', '柱状图', 'bar', NULL, 1, 1, 'admin', '2019-04-12 17:05:17', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('71b924faa93805c5c1579f12e001c809', 'd6e1152968b02d69ff358c75b48a6ee1', 'OA办公', 'oa', NULL, 2, 1, 'admin', '2021-03-22 19:27:17', 'admin', '2019-03-22 23:24:36'); +INSERT INTO `jimu_dict_item` VALUES ('75b260d7db45a39fc7f21badeabdb0ed', 'c36169beb12de8a71c8683ee7c28a503', '不启用', '0', NULL, NULL, 1, 'admin', '2019-03-18 23:29:41', 'admin', '2019-03-18 23:29:54'); +INSERT INTO `jimu_dict_item` VALUES ('7688469db4a3eba61e6e35578dc7c2e5', 'c36169beb12de8a71c8683ee7c28a503', '启用', '1', NULL, NULL, 1, 'admin', '2019-03-18 23:29:28', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('78ea6cadac457967a4b1c4eb7aaa418c', 'fc6cd58fde2e8481db10d3a1e68ce70c', '正常', '1', NULL, NULL, 1, 'admin', '2019-03-18 23:30:28', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('7ccf7b80c70ee002eceb3116854b75cb', 'ac2f7c0c5c5775fcea7e2387bcb22f01', '按钮权限', '2', NULL, NULL, 1, 'admin', '2019-03-18 23:25:40', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('81fb2bb0e838dc68b43f96cc309f8257', 'fc6cd58fde2e8481db10d3a1e68ce70c', '冻结', '2', NULL, NULL, 1, 'admin', '2019-03-18 23:30:37', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('83250269359855501ec4e9c0b7e21596', '4274efc2292239b6f000b153f50823ff', '可见/可访问(授权后可见/可访问)', '1', '', 1, 1, 'admin', '2023-06-10 17:54:51', 'admin', '2019-06-05 19:43:11'); +INSERT INTO `jimu_dict_item` VALUES ('84778d7e928bc843ad4756db1322301f', '4e4602b3e3686f0911384e188dc7efb4', '大于等于', '>=', '大于等于', 5, 1, 'admin', '2019-04-01 10:46:02', 'admin', '2019-04-01 17:49:05'); +INSERT INTO `jimu_dict_item` VALUES ('848d4da35ebd93782029c57b103e5b36', 'c5a14c75172783d72cbee6ee7f5df5d1', '饼图', 'pie', NULL, 3, 1, 'admin', '2019-04-12 17:05:49', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('84dfc178dd61b95a72900fcdd624c471', '78bda155fe380b1b3f175f1e88c284c6', '处理中', '2', '处理中', 2, 1, 'admin', '2019-05-09 16:33:01', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('86f19c7e0a73a0bae451021ac05b99dd', 'ac2f7c0c5c5775fcea7e2387bcb22f01', '子菜单', '1', NULL, NULL, 1, 'admin', '2019-03-18 23:25:27', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('8bccb963e1cd9e8d42482c54cc609ca2', '4f69be5f507accea8d5df5f11346181a', '微信', '3', NULL, 3, 1, 'admin', '2021-05-11 14:29:12', 'admin', '2019-04-11 14:29:31'); +INSERT INTO `jimu_dict_item` VALUES ('8c618902365ca681ebbbe1e28f11a548', '4c753b5293304e7a445fd2741b46529d', '启用', '1', NULL, 0, 0, 'admin', '2019-03-18 23:19:27', 'admin', '2019-03-20 09:33:30'); +INSERT INTO `jimu_dict_item` VALUES ('8cdf08045056671efd10677b8456c999', '4274efc2292239b6f000b153f50823ff', '可编辑(未授权时禁用)', '2', '', 2, 1, 'admin', '2019-05-10 17:55:38', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('8ff48e657a7c5090d4f2a59b37d1b878', '4d7fec1a7799a436d26d02325eff295e', '中', 'M', '中', 2, 1, 'admin', '2019-04-16 17:04:40', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('948923658baa330319e59b2213cda97c', '880a895c98afeca9d9ac39f29e67c13e', '添加', '2', '', 2, 1, 'admin', '2019-07-22 10:54:59', 'admin', '2019-07-22 10:55:36'); +INSERT INTO `jimu_dict_item` VALUES ('9a96c4a4e4c5c9b4e4d0cbf6eb3243cc', '4c753b5293304e7a445fd2741b46529d', '不启用', '0', NULL, 1, 1, 'admin', '2019-03-18 23:19:53', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('9c5b6144c4f954d938c96384e2e948aa', '20863a840c7622c3eab0ee69e55a8c7c', '请审批', '请审批', '请审批', 8, 1, 'admin', '2019-05-15 11:08:35', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('a05f177a7d9aeb84125ee8bc9c4fc64b', '49a0f7247f9c2a7df4e5733b790a4c9f', '耐克供应商', '2', NULL, 1, 1, 'admin', '2023-01-24 16:49:39', 'admin', '2019-04-24 16:49:59'); +INSERT INTO `jimu_dict_item` VALUES ('a1e7d1ca507cff4a480c8caba7c1339e', '880a895c98afeca9d9ac39f29e67c13e', '导出', '6', '', 6, 1, 'admin', '2019-07-22 12:06:50', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('a2be752dd4ec980afaec1efd1fb589af', '8dfe32e2d29ea9430a988b3b558bf233', '已撤销', '2', '已撤销', 3, 1, 'admin', '2019-04-16 17:41:39', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('aa0d8a8042a18715a17f0a888d360aa4', 'ac2f7c0c5c5775fcea7e2387bcb22f01', '一级菜单', '0', NULL, NULL, 1, 'admin', '2019-03-18 23:24:52', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('adcf2a1fe93bb99a84833043f475fe0b', '4e4602b3e3686f0911384e188dc7efb4', '包含', 'IN', '包含', 8, 1, 'admin', '2019-04-01 16:45:47', 'admin', '2019-04-01 17:49:24'); +INSERT INTO `jimu_dict_item` VALUES ('b029a41a851465332ee4ee69dcf0a4c2', '0b5d19e1fce4b2e6647e6b4a17760c14', '系统消息', '2', NULL, 1, 1, 'admin', '2019-02-22 18:02:08', 'admin', '2019-04-22 18:02:13'); +INSERT INTO `jimu_dict_item` VALUES ('b038e6f80c527d684c9ca0e1ecbef72f', '49a0f7247f9c2a7df4e5733b790a4c9f', '阿迪供应商', '1', NULL, 1, 1, 'admin', '2023-01-24 16:49:34', 'admin', '2019-04-24 16:50:02'); +INSERT INTO `jimu_dict_item` VALUES ('b2a8b4bb2c8e66c2c4b1bb086337f393', '3486f32803bb953e7155dab3513dc68b', '正常', '0', NULL, NULL, 1, 'admin', '2022-10-18 21:46:48', 'admin', '2019-03-28 22:22:20'); +INSERT INTO `jimu_dict_item` VALUES ('b5f3bd5f66bb9a83fecd89228c0d93d1', '68168534ff5065a152bfab275c2136f8', '无效', '0', '无效', 2, 1, 'admin', '2020-09-26 19:21:49', 'admin', '2019-05-13 17:20:07'); +INSERT INTO `jimu_dict_item` VALUES ('b96af20aef0c9388f2ae843ea7f8d722', '20863a840c7622c3eab0ee69e55a8c7c', '请***阅示', '请***阅示', '请***阅示', 4, 1, 'admin', '2019-05-15 11:06:25', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('b9fbe2a3602d4a27b45c100ac5328484', '78bda155fe380b1b3f175f1e88c284c6', '待提交', '1', '待提交', 1, 1, 'admin', '2019-05-09 16:32:35', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('ba27737829c6e0e582e334832703d75e', '236e8a4baff0db8c62c00dd95632834f', '同步', '1', '同步', 1, 1, 'admin', '2019-05-15 15:28:15', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('bcec04526b04307e24a005d6dcd27fd6', '880a895c98afeca9d9ac39f29e67c13e', '导入', '5', '', 5, 1, 'admin', '2019-07-22 12:06:41', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('bdeae295bf98a61b45e9be0322657d4b', 'c72e92c2c13cdbc07b455e6abcc60d47', '不启动', '2', NULL, 1, 1, 'admin', '2019-04-23 23:05:57', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('c4896da3525689b477b3c868d728c87f', 'c72e92c2c13cdbc07b455e6abcc60d47', '启动', '1', NULL, 1, 1, 'admin', '2019-04-23 23:05:40', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('c53da022b9912e0aed691bbec3c78473', '880a895c98afeca9d9ac39f29e67c13e', '查询', '1', '', 1, 1, 'admin', '2019-07-22 10:54:51', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('c5700a71ad08994d18ad1dacc37a71a9', 'a7adbcd86c37f7dbc9b66945c82ef9e6', '否', '0', '', 1, 1, 'admin', '2019-05-22 19:29:55', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('c83d907903a7a5ff52de60aabf3550ee', '76c1d6755018a918c9eeda575dbf3f98', '件', '1', NULL, 1, 1, 'admin', '2018-12-23 23:00:17', 'admin', '2019-04-23 23:14:00'); +INSERT INTO `jimu_dict_item` VALUES ('c8e63916333e588ef52d3eb3be9b6944', '0b1dac3e87ed7229ae19a586a8b8c8f8', 'dd', 'dd', NULL, 1, 1, 'admin', '2019-04-26 18:26:07', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('c9c3fb6c8a06b7bf577b4f574adccd12', '20863a840c7622c3eab0ee69e55a8c7c', '请指示', '请指示', '请指示', 3, 1, 'admin', '2019-05-15 11:05:58', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('cbfcc5b88fc3a90975df23ffc8cbe29c', 'c5a14c75172783d72cbee6ee7f5df5d1', '曲线图', 'line', NULL, 2, 1, 'admin', '2019-05-12 17:05:30', 'admin', '2019-04-12 17:06:06'); +INSERT INTO `jimu_dict_item` VALUES ('d217592908ea3e00ff986ce97f24fb98', 'c5a14c75172783d72cbee6ee7f5df5d1', '数据列表', 'table', NULL, 4, 1, 'admin', '2019-04-12 17:05:56', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('d76e35d4fa1c2892ff812e1de08b8684', '36d57175542a3ea85073923e8fccc21c', '标准尺码类', '4', NULL, 4, 1, 'admin', '2019-04-23 23:03:37', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('da01e5c526fc1984ca60fdcf13354d05', '20863a840c7622c3eab0ee69e55a8c7c', '同意***的意见', '同意***的意见', '同意***的意见', 2, 1, 'admin', '2019-05-15 11:05:33', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('db681e7aabd2ff52fdfaf6c2770448ff', '76c1d6755018a918c9eeda575dbf3f98', '套', '2', NULL, 2, 1, 'admin', '2019-04-23 23:00:32', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('df168368dcef46cade2aadd80100d8aa', '3d9a351be3436fbefb1307d4cfb49bf2', '男', '1', '', 1, 1, NULL, '2027-08-04 14:56:49', 'admin', '2020-05-11 14:07:04'); +INSERT INTO `jimu_dict_item` VALUES ('e05d424ee35c707d7bc20de3719fb3ae', '76c1d6755018a918c9eeda575dbf3f98', '块', '7', NULL, 7, 1, 'admin', '2019-01-23 23:01:36', 'admin', '2019-04-23 23:01:48'); +INSERT INTO `jimu_dict_item` VALUES ('e6329e3a66a003819e2eb830b0ca2ea0', '4e4602b3e3686f0911384e188dc7efb4', '小于', '<', '小于', 2, 1, 'admin', '2019-04-01 16:44:15', 'admin', '2019-04-01 17:48:34'); +INSERT INTO `jimu_dict_item` VALUES ('e8f34a36f38f35e2efb1aaa342509242', '78bda155fe380b1b3f175f1e88c284c6', '已挂起', '5', '已挂起', 5, 1, 'admin', '2019-05-23 16:12:42', 'admin', '2019-05-22 18:39:42'); +INSERT INTO `jimu_dict_item` VALUES ('e94eb7af89f1dbfa0d823580a7a6e66a', '236e8a4baff0db8c62c00dd95632834f', '不同步', '0', '不同步', 2, 1, 'admin', '2019-05-15 15:28:28', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('ecb788a9b71d3d11357c31a0febefaaa', '36d57175542a3ea85073923e8fccc21c', '男衬衫类', '2', NULL, 2, 1, 'admin', '2019-04-23 23:03:18', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('f16c5706f3ae05c57a53850c64ce7c45', 'a9d9942bd0eccb6e89de92d130ec4c4a', '发送成功', '1', NULL, 2, 1, 'admin', '2019-04-12 18:19:43', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('f2688992fffa5c62e31ce50bbb1919d9', '20863a840c7622c3eab0ee69e55a8c7c', '审核无误', '审核无误', '审核无误', 9, 1, 'admin', '2019-05-15 11:08:58', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('f2bda3b1ca643b789a2e712ad53b06fb', '36d57175542a3ea85073923e8fccc21c', '固定型号', '5', NULL, 5, 1, 'admin', '2019-04-23 23:03:47', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('f37f90c496ec9841c4c326b065e00bb2', '83bfb33147013cc81640d5fd9eda030c', '登录日志', '1', NULL, NULL, 1, 'admin', '2019-03-18 23:22:37', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('f64ca22c7a2d5793a271590e7b01eb6b', '76c1d6755018a918c9eeda575dbf3f98', '个', '5', NULL, 6, 1, 'admin', '2019-04-23 23:01:21', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('f753aff60ff3931c0ecb4812d8b5e643', '4c03fca6bf1f0299c381213961566349', '双排布局', 'double', NULL, 3, 1, 'admin', '2019-04-12 17:43:51', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('f80a8f6838215753b05e1a5ba3346d22', '880a895c98afeca9d9ac39f29e67c13e', '删除', '4', '', 4, 1, 'admin', '2019-07-22 10:55:14', 'admin', '2019-07-22 10:55:30'); +INSERT INTO `jimu_dict_item` VALUES ('fb80836f3e69d977303e56023cf4b0ca', '20863a840c7622c3eab0ee69e55a8c7c', '请处理', '请处理', '请处理', 5, 1, 'admin', '2019-05-15 11:06:57', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('fcec03570f68a175e1964808dc3f1c91', '4c03fca6bf1f0299c381213961566349', 'Tab风格', 'tab', NULL, 1, 1, 'admin', '2019-04-12 17:43:31', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('fe50b23ae5e68434def76f67cef35d2d', '78bda155fe380b1b3f175f1e88c284c6', '已作废', '4', '已作废', 4, 1, 'admin', '2021-09-09 16:33:43', 'admin', '2019-05-09 16:34:40'); + +-- ---------------------------- +-- Table structure for jimu_report +-- ---------------------------- +DROP TABLE IF EXISTS `jimu_report`; +CREATE TABLE `jimu_report` ( + `id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '主键', + `code` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '编码', + `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '名称', + `note` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '说明', + `status` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '状态', + `type` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '类型', + `json_str` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT 'json字符串', + `api_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '请求地址', + `thumb` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '缩略图', + `create_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '修改人', + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '修改时间', + `del_flag` tinyint(1) NULL DEFAULT NULL COMMENT '删除标识0-正常,1-已删除', + `api_method` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '请求方法0-get,1-post', + `api_code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '请求编码', + `template` tinyint(1) NULL DEFAULT NULL COMMENT '是否是模板 0-是,1-不是', + `view_count` bigint(0) NULL DEFAULT 0 COMMENT '浏览次数', + `css_str` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT 'css增强', + `js_str` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT 'js增强', + `tenant_id` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '多租户标识', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE INDEX `uniq_jmreport_code`(`code`) USING BTREE, + INDEX `uniq_jmreport_createby`(`create_by`) USING BTREE, + INDEX `uniq_jmreport_delflag`(`del_flag`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '在线excel设计器' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of jimu_report +-- ---------------------------- +INSERT INTO `jimu_report` VALUES ('01a1e07ed4b12348b29d5a47ac7f0228', '566960792', '销售公司出库单副本0792', '', NULL, 'printinfo', '{\"area\":{\"sri\":4,\"sci\":0,\"eri\":4,\"eci\":0,\"width\":32,\"height\":25},\"printElWidth\":794,\"excel_config_id\":\"ff9bd143582a6dfed897ba8b6f93b175\",\"printElHeight\":800,\"rows\":{\"0\":{\"cells\":{\"0\":{\"style\":11,\"text\":\"医疗器械销售公司出货单\",\"merge\":[0,9]}},\"height\":83},\"1\":{\"cells\":{\"0\":{\"text\":\"供货单位:\",\"style\":20,\"merge\":[0,1]},\"1\":{\"style\":30},\"2\":{\"text\":\"${gongsi.gname}\",\"style\":19},\"3\":{\"style\":19},\"4\":{\"text\":\"供货日期:\",\"style\":19},\"5\":{\"text\":\"${gongsi.gdata}\",\"style\":19,\"merge\":[0,1]},\"6\":{\"style\":19},\"7\":{\"text\":\"编号:\",\"style\":20},\"8\":{\"text\":\"${gongsi.num}\",\"style\":19,\"merge\":[0,1]},\"9\":{\"style\":19}},\"isDrag\":true},\"2\":{\"cells\":{\"0\":{\"text\":\"行号\",\"style\":39},\"1\":{\"text\":\"产品代码\",\"style\":39},\"2\":{\"text\":\"产品名称\",\"style\":39},\"3\":{\"text\":\"规格型号\",\"style\":39},\"4\":{\"text\":\"单位\",\"style\":39},\"5\":{\"text\":\"实发数量\",\"style\":39},\"6\":{\"text\":\"销售单价(元)\",\"style\":39},\"7\":{\"text\":\"折扣率(%)\",\"style\":39},\"8\":{\"text\":\"销售金额(元)\",\"style\":39},\"9\":{\"text\":\"备注\",\"style\":39}}},\"3\":{\"cells\":{\"0\":{\"style\":35,\"text\":\"#{xiaoshou.id}\"},\"1\":{\"style\":35,\"text\":\"#{xiaoshou.hnum}\"},\"2\":{\"style\":35,\"text\":\"#{xiaoshou.hname}\"},\"3\":{\"style\":35,\"text\":\"#{xiaoshou.xinghao}\"},\"4\":{\"style\":35,\"text\":\"#{xiaoshou.danwei}\"},\"5\":{\"style\":35,\"text\":\"#{xiaoshou.num}\"},\"6\":{\"style\":35,\"text\":\"#{xiaoshou.danjia}\"},\"7\":{\"style\":35,\"text\":\"#{xiaoshou.zhekoulv}\"},\"8\":{\"style\":35,\"text\":\"#{xiaoshou.xiaoshoujine}\"},\"9\":{\"style\":35,\"text\":\"#{xiaoshou.xiaoshoujine}\"}}},\"4\":{\"cells\":{\"0\":{\"style\":4},\"1\":{}},\"isDrag\":true},\"len\":84,\"-1\":{\"cells\":{\"0\":{\"text\":\"#{gongsi.gdata}\"},\"-1\":{\"text\":\"#{gongsi.didian}\"}},\"isDrag\":true}},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":794,\"heightPx\":1047},\"dicts\":[],\"freeze\":\"A1\",\"dataRectWidth\":794,\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"center\"},{\"font\":{\"size\":16}},{\"font\":{\"size\":16},\"align\":\"center\"},{\"align\":\"center\"},{\"border\":{\"top\":[\"thin\",\"#000\"],\"bottom\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"]}},{\"border\":{\"top\":[\"thin\",\"#000\"],\"bottom\":[\"thin\",\"#000\"]}},{\"border\":{\"top\":[\"thin\",\"#000\"],\"bottom\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"right\"},{\"align\":\"right\"},{\"align\":\"center\",\"font\":{\"size\":14}},{\"align\":\"center\",\"font\":{\"size\":14,\"bold\":true}},{\"align\":\"center\",\"font\":{\"size\":9}},{\"font\":{\"size\":9}},{\"align\":\"right\",\"font\":{\"size\":9}},{\"align\":\"center\",\"font\":{\"size\":8}},{\"font\":{\"size\":8}},{\"align\":\"right\",\"font\":{\"size\":8}},{\"align\":\"center\",\"font\":{\"size\":8},\"color\":\"#7f7f7f\"},{\"font\":{\"size\":8},\"color\":\"#7f7f7f\"},{\"align\":\"right\",\"font\":{\"size\":8},\"color\":\"#7f7f7f\"},{\"align\":\"center\",\"font\":{\"size\":8},\"color\":\"#3f3f3f\"},{\"font\":{\"size\":8},\"color\":\"#3f3f3f\"},{\"align\":\"right\",\"font\":{\"size\":8},\"color\":\"#3f3f3f\"},{\"align\":\"center\",\"font\":{\"size\":8},\"color\":\"#262626\"},{\"font\":{\"size\":8},\"color\":\"#262626\"},{\"align\":\"right\",\"font\":{\"size\":8},\"color\":\"#262626\"},{\"align\":\"center\",\"font\":{\"size\":8},\"color\":\"#0c0c0c\"},{\"font\":{\"size\":8},\"color\":\"#0c0c0c\"},{\"align\":\"right\",\"font\":{\"size\":8},\"color\":\"#0c0c0c\"},{\"align\":\"right\",\"color\":\"#7f7f7f\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"center\",\"bgcolor\":\"#71ae47\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"bgcolor\":\"#71ae47\"},{\"border\":{\"bottom\":[\"thin\",\"#538136\"],\"top\":[\"thin\",\"#538136\"],\"left\":[\"thin\",\"#538136\"],\"right\":[\"thin\",\"#538136\"]},\"align\":\"center\",\"bgcolor\":\"#71ae47\"},{\"border\":{\"bottom\":[\"thin\",\"#538136\"],\"top\":[\"thin\",\"#538136\"],\"left\":[\"thin\",\"#538136\"],\"right\":[\"thin\",\"#538136\"]},\"bgcolor\":\"#71ae47\"},{\"border\":{\"bottom\":[\"thin\",\"#538136\"],\"top\":[\"thin\",\"#538136\"],\"left\":[\"thin\",\"#538136\"],\"right\":[\"thin\",\"#538136\"]},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#538136\"],\"top\":[\"thin\",\"#538136\"],\"left\":[\"thin\",\"#538136\"],\"right\":[\"thin\",\"#538136\"]}},{\"border\":{\"bottom\":[\"thin\",\"#538136\"],\"top\":[\"thin\",\"#538136\"],\"left\":[\"thin\",\"#538136\"],\"right\":[\"thin\",\"#538136\"]},\"align\":\"center\",\"bgcolor\":\"#c5e0b3\"},{\"border\":{\"bottom\":[\"thin\",\"#538136\"],\"top\":[\"thin\",\"#538136\"],\"left\":[\"thin\",\"#538136\"],\"right\":[\"thin\",\"#538136\"]},\"bgcolor\":\"#c5e0b3\"},{\"border\":{\"bottom\":[\"thin\",\"#538136\"],\"top\":[\"thin\",\"#538136\"],\"left\":[\"thin\",\"#538136\"],\"right\":[\"thin\",\"#538136\"]},\"align\":\"center\",\"bgcolor\":\"#a7d08c\"},{\"border\":{\"bottom\":[\"thin\",\"#538136\"],\"top\":[\"thin\",\"#538136\"],\"left\":[\"thin\",\"#538136\"],\"right\":[\"thin\",\"#538136\"]},\"bgcolor\":\"#a7d08c\"}],\"validations\":[],\"cols\":{\"0\":{\"width\":32},\"1\":{\"width\":65},\"2\":{\"width\":115},\"3\":{\"width\":70},\"4\":{\"width\":52},\"5\":{\"width\":70},\"6\":{\"width\":93},\"7\":{\"width\":86},\"8\":{\"width\":75},\"9\":{\"width\":136},\"10\":{\"width\":81},\"len\":24},\"merges\":[\"F2:G2\",\"F2:G2\",\"I2:J2\",\"A2:B2\",\"C2:D2\",\"A2:B2\",\"A1:J1\"]}', '', 'https://static.jeecg.com/designreport/images/医疗器械_1607070355110.png', 'admin', '2021-01-19 10:46:43', 'admin', '2021-02-02 19:00:59', 1, NULL, NULL, 0, 766, NULL, NULL, NULL); +INSERT INTO `jimu_report` VALUES ('1314846205892759552', '20201010163252', 'XXX有限公司员工登记表', NULL, NULL, 'printinfo', '{\"loopBlockList\":[],\"area\":{\"sri\":10,\"sci\":11,\"eri\":10,\"eci\":11,\"width\":85,\"height\":38},\"excel_config_id\":\"1314846205892759552\",\"printConfig\":{\"paper\":\"A4\",\"width\":210,\"height\":297,\"definition\":1,\"isBackend\":false,\"marginX\":10,\"marginY\":10},\"rows\":{\"0\":{\"cells\":{\"0\":{\"merge\":[0,8]},\"9\":{}},\"height\":22},\"1\":{\"cells\":{\"1\":{\"style\":87,\"text\":\" \"},\"2\":{\"style\":87,\"text\":\" \"},\"3\":{\"style\":87,\"text\":\" \"},\"4\":{\"style\":87,\"text\":\" \"},\"5\":{\"style\":87,\"text\":\" \"},\"6\":{\"style\":87,\"text\":\" \"},\"7\":{\"style\":87,\"text\":\" \"},\"8\":{\"style\":87,\"text\":\" \"}},\"height\":24},\"2\":{\"cells\":{\"0\":{\"text\":\"所在部门\",\"style\":93},\"1\":{\"text\":\"${yuangongjiben.department}\",\"style\":23,\"merge\":[0,2]},\"4\":{\"text\":\"职务\",\"style\":93},\"5\":{\"text\":\"${yuangongjiben.post}\",\"style\":23},\"6\":{\"text\":\"填写日期\",\"style\":93},\"7\":{\"text\":\"${yuangongjiben.data}\",\"style\":23,\"merge\":[0,1]}},\"isDrag\":true,\"height\":36},\"3\":{\"cells\":{\"0\":{\"text\":\"姓名\",\"style\":93},\"1\":{\"text\":\"${yuangongjiben.name}\",\"style\":23},\"2\":{\"text\":\"性别\",\"style\":93},\"3\":{\"text\":\"${yuangongjiben.sex}\",\"style\":23},\"4\":{\"text\":\"出生日期\",\"style\":93},\"5\":{\"text\":\"${yuangongjiben.birth}\",\"style\":23},\"6\":{\"text\":\"政治面貌\",\"style\":93},\"7\":{\"text\":\"${yuangongjiben.political}\",\"style\":130,\"merge\":[0,1]}},\"isDrag\":true,\"height\":33},\"4\":{\"cells\":{\"0\":{\"text\":\"机关\",\"style\":93},\"1\":{\"text\":\"${yuangongjiben.office}\",\"style\":23},\"2\":{\"style\":93,\"text\":\"民族\"},\"3\":{\"text\":\"${yuangongjiben.nation}\",\"style\":23},\"4\":{\"style\":93,\"text\":\"健康状况\"},\"5\":{\"text\":\"${yuangongjiben.health}\",\"style\":23},\"6\":{\"style\":93,\"text\":\"户籍类型\",\"virtual\":\"1KT8bnqRT4bi8Z7b\"},\"7\":{\"text\":\"${yuangongjiben.register}\",\"style\":26,\"virtual\":\"1KT8bnqRT4bi8Z7b\"},\"8\":{\"merge\":[3,0],\"height\":104,\"style\":35,\"text\":\" \",\"virtual\":\"cvkWDQVZhfJPgcS4\"}},\"isDrag\":true,\"height\":31},\"5\":{\"cells\":{\"0\":{\"text\":\"最高学历\",\"style\":93},\"1\":{\"text\":\"${yuangongjiben.education}\",\"style\":23},\"2\":{\"text\":\"所学专业\",\"style\":93},\"3\":{\"text\":\"${yuangongjiben.major}\",\"style\":23,\"merge\":[0,2]},\"6\":{\"text\":\"毕业时间\",\"style\":93},\"7\":{\"text\":\"${yuangongjiben.gdata}\",\"style\":23}},\"isDrag\":true,\"height\":35},\"6\":{\"cells\":{\"0\":{\"text\":\"电子邮箱\",\"style\":93},\"1\":{\"text\":\"${yuangongjiben.mailbox}\",\"style\":23},\"2\":{\"text\":\"手机号\",\"style\":93},\"3\":{\"text\":\"${yuangongjiben.telphone}\",\"style\":23,\"merge\":[0,2]},\"6\":{\"text\":\"家庭电话\",\"style\":93},\"7\":{\"text\":\"${yuangongjiben.homephone}\",\"style\":23}},\"isDrag\":true,\"height\":38},\"7\":{\"cells\":{\"0\":{\"merge\":[0,1],\"text\":\"第一次参加工作时间\",\"style\":93},\"2\":{\"text\":\"${yuangongjiben.pworktime}\",\"style\":133,\"merge\":[0,2]},\"5\":{\"style\":93,\"text\":\"入职时间\"},\"6\":{\"text\":\"${yuangongjiben.entrytime}\",\"style\":24,\"merge\":[0,1]}},\"isDrag\":true,\"height\":27},\"8\":{\"cells\":{\"0\":{\"merge\":[0,1],\"text\":\"毕业院校\",\"style\":93},\"2\":{\"text\":\"${yuangongjiben.school}\",\"style\":24,\"merge\":[0,2]},\"5\":{\"style\":93,\"text\":\"身份证号\"},\"6\":{\"text\":\"${yuangongjiben.idcard}\",\"style\":24,\"merge\":[0,2]}},\"isDrag\":true,\"height\":34},\"9\":{\"cells\":{\"0\":{\"merge\":[0,1],\"text\":\"入党(团)时间、地点\",\"style\":94},\"2\":{\"text\":\"${yuangongjiben.entrytime}\",\"style\":24,\"merge\":[0,2]},\"5\":{\"text\":\"婚姻状况\",\"style\":93},\"6\":{\"text\":\"${yuangongjiben.marital}\",\"style\":23},\"7\":{\"text\":\"有无子女\",\"style\":93},\"8\":{\"text\":\"${yuangongjiben.children}\",\"style\":23}},\"isDrag\":true,\"height\":33},\"10\":{\"cells\":{\"0\":{\"merge\":[0,1],\"text\":\"户口所在街道名称\",\"style\":93},\"2\":{\"text\":\"${yuangongjiben.hukoustreet}\",\"style\":24,\"merge\":[0,2]},\"5\":{\"merge\":[0,1],\"text\":\"户口所在地邮编\",\"style\":93},\"7\":{\"text\":\"${yuangongjiben.hukounum}\",\"style\":23,\"merge\":[0,1]}},\"isDrag\":true,\"height\":38},\"11\":{\"cells\":{\"0\":{\"text\":\"户口所在地地址\",\"style\":96,\"merge\":[2,1]},\"2\":{\"text\":\"${yuangongjiben.hukoudi}\",\"style\":26,\"merge\":[2,6]}},\"isDrag\":true},\"12\":{\"cells\":{}},\"13\":{\"cells\":{\"11\":{\"text\":\"\"}},\"isDrag\":true},\"14\":{\"cells\":{\"0\":{\"merge\":[0,1],\"text\":\"现居住地址\",\"style\":98},\"2\":{\"text\":\"${yuangongjiben.currentdi}\",\"style\":26,\"merge\":[0,2]},\"5\":{\"style\":98,\"merge\":[0,1],\"text\":\"现居住地址邮编\"},\"7\":{\"text\":\"${yuangongjiben.currentnum}\",\"style\":26,\"merge\":[0,1]}},\"isDrag\":true,\"height\":33},\"15\":{\"cells\":{\"0\":{\"merge\":[0,1],\"text\":\"是否参加社保\",\"style\":98},\"2\":{\"text\":\"${yuangongjiben.socialsecurity}\",\"style\":27,\"merge\":[0,1]},\"4\":{\"text\":\"有无公积金\",\"style\":98},\"5\":{\"text\":\"${yuangongjiben.providentfund}\",\"style\":27,\"merge\":[0,1]},\"7\":{\"text\":\"兴趣爱好\",\"style\":98},\"8\":{\"text\":\"${yuangongjiben.hobby}\",\"style\":27}},\"isDrag\":true,\"height\":34},\"16\":{\"cells\":{\"0\":{\"merge\":[0,1],\"text\":\"参加社保类型\",\"style\":98},\"2\":{\"text\":\"${yuangongjiben.sbtype}\",\"style\":116,\"merge\":[0,6]}},\"isDrag\":true,\"height\":30},\"17\":{\"cells\":{\"0\":{\"merge\":[0,1],\"text\":\"个人档案存放地\",\"style\":98},\"2\":{\"text\":\"${yuangongjiben.archivesdi}\",\"style\":116,\"merge\":[0,6]}},\"isDrag\":true,\"height\":33},\"18\":{\"cells\":{\"0\":{\"text\":\" \",\"style\":7},\"1\":{\"text\":\" \",\"style\":7},\"2\":{\"text\":\" \",\"style\":7},\"3\":{\"text\":\" \",\"style\":7},\"4\":{\"text\":\" \",\"style\":7},\"5\":{\"text\":\" \",\"style\":7},\"6\":{\"text\":\" \",\"style\":7},\"7\":{\"text\":\" \",\"style\":7},\"8\":{\"text\":\" \",\"style\":7}}},\"19\":{\"cells\":{\"0\":{\"merge\":[0,4],\"text\":\"学历、经历(从高中开始写)\",\"style\":99},\"5\":{\"style\":7,\"text\":\" \"},\"6\":{\"style\":7,\"text\":\" \"},\"7\":{\"style\":7,\"text\":\" \"},\"8\":{\"style\":7,\"text\":\" \"},\"9\":{\"style\":112,\"text\":\" \"}}},\"20\":{\"cells\":{\"0\":{\"text\":\"由_年_月\",\"merge\":[0,1],\"style\":36},\"2\":{\"merge\":[0,1],\"text\":\"至_年_月\",\"style\":38},\"4\":{\"merge\":[0,1],\"text\":\"就读学校\",\"style\":38},\"6\":{\"merge\":[0,1],\"text\":\"专业\",\"style\":38},\"8\":{\"text\":\"担任职务\",\"style\":38},\"9\":{\"style\":112,\"text\":\" \"}}},\"21\":{\"cells\":{\"0\":{\"style\":90,\"merge\":[0,1],\"text\":\"#{xueli.kdate}\"},\"2\":{\"style\":90,\"text\":\"#{xueli.jdate}\",\"merge\":[0,1]},\"4\":{\"style\":90,\"text\":\"#{xueli.jstudent}\",\"merge\":[0,1]},\"6\":{\"style\":90,\"text\":\"#{xueli.zhuanye}\",\"merge\":[0,1]},\"8\":{\"style\":90,\"text\":\"#{xueli.zhiwu}\"},\"9\":{\"style\":112,\"text\":\" \"}},\"isDrag\":true},\"22\":{\"cells\":{\"0\":{\"style\":7,\"text\":\" \"},\"1\":{\"style\":7,\"text\":\" \"},\"2\":{\"style\":7,\"text\":\" \"},\"3\":{\"style\":7,\"text\":\" \"},\"4\":{\"style\":7,\"text\":\" \"},\"5\":{\"style\":7,\"text\":\" \"},\"6\":{\"style\":7,\"text\":\" \"},\"7\":{\"style\":7,\"text\":\" \"},\"8\":{\"style\":7,\"text\":\" \"},\"9\":{\"style\":112,\"text\":\" \"}}},\"23\":{\"cells\":{\"0\":{\"merge\":[0,4],\"text\":\"工作经历\",\"style\":124},\"5\":{\"style\":7,\"text\":\" \"},\"6\":{\"style\":7,\"text\":\" \"},\"7\":{\"style\":7,\"text\":\" \"},\"8\":{\"style\":7,\"text\":\" \"},\"9\":{\"style\":112,\"text\":\" \"}},\"height\":27},\"24\":{\"cells\":{\"0\":{\"text\":\"由_年_月\",\"merge\":[0,1],\"style\":36},\"2\":{\"merge\":[0,1],\"text\":\"至_年_月\",\"style\":38},\"4\":{\"text\":\"工作单位及职称\",\"style\":38,\"merge\":[0,1]},\"6\":{\"merge\":[0,1],\"text\":\"证明人\",\"style\":38},\"8\":{\"text\":\"联系方式\",\"style\":38},\"9\":{\"style\":112,\"text\":\" \"}}},\"25\":{\"cells\":{\"0\":{\"text\":\"#{uu.kdate}\",\"style\":90,\"merge\":[0,1]},\"2\":{\"text\":\"#{uu.jdate}\",\"style\":90,\"merge\":[0,1]},\"4\":{\"text\":\"#{uu.jstudent}\",\"style\":90,\"merge\":[0,1]},\"6\":{\"text\":\"#{uu.zmname}\",\"style\":90,\"merge\":[0,1]},\"8\":{\"text\":\"#{uu.zmphone}\",\"style\":90},\"9\":{\"style\":112,\"text\":\" \"}},\"isDrag\":true},\"26\":{\"cells\":{\"0\":{\"style\":7,\"text\":\" \"},\"1\":{\"style\":7,\"text\":\" \"},\"2\":{\"style\":7,\"text\":\" \"},\"3\":{\"style\":7,\"text\":\" \"},\"4\":{\"style\":7,\"text\":\" \"},\"5\":{\"style\":7,\"text\":\" \"},\"6\":{\"style\":7,\"text\":\" \"},\"7\":{\"style\":7,\"text\":\" \"},\"8\":{\"style\":7,\"text\":\" \"},\"9\":{\"style\":112,\"text\":\" \"}}},\"27\":{\"cells\":{\"0\":{\"merge\":[0,4],\"text\":\"职称/资格、证书\",\"style\":125},\"5\":{\"style\":7,\"text\":\" \"},\"6\":{\"style\":7,\"text\":\" \"},\"7\":{\"style\":7,\"text\":\" \"},\"8\":{\"style\":7,\"text\":\" \"},\"9\":{\"style\":112,\"text\":\" \"}},\"height\":46},\"28\":{\"cells\":{\"0\":{\"text\":\"发证时间\",\"merge\":[0,1],\"style\":36},\"2\":{\"merge\":[0,1],\"text\":\"职称名称\",\"style\":38},\"4\":{\"text\":\"级别\",\"style\":38,\"merge\":[0,1]},\"6\":{\"text\":\"发证单位\",\"style\":38,\"merge\":[0,1]},\"8\":{\"text\":\"备注\",\"style\":38},\"9\":{\"style\":112,\"text\":\" \"}}},\"29\":{\"cells\":{\"0\":{\"text\":\"#{zhengshu.fdate}\",\"style\":90,\"merge\":[0,1]},\"2\":{\"text\":\"#{zhengshu.zcname}\",\"style\":90,\"merge\":[0,1]},\"4\":{\"text\":\"#{zhengshu.jibie}\",\"style\":90,\"merge\":[0,1]},\"6\":{\"text\":\"#{zhengshu.danwei}\",\"style\":90,\"merge\":[0,1]},\"8\":{\"text\":\"#{zhengshu.beizhu}\",\"style\":90},\"9\":{\"style\":112,\"text\":\" \"}},\"isDrag\":true},\"30\":{\"cells\":{\"0\":{\"style\":7,\"text\":\" \"},\"1\":{\"style\":7,\"text\":\" \"},\"2\":{\"style\":7,\"text\":\" \"},\"3\":{\"style\":7,\"text\":\" \"},\"4\":{\"style\":7,\"text\":\" \"},\"5\":{\"style\":7,\"text\":\" \"},\"6\":{\"style\":7,\"text\":\" \"},\"7\":{\"style\":7,\"text\":\" \"},\"8\":{\"style\":7,\"text\":\" \"},\"9\":{\"style\":112,\"text\":\" \"}}},\"31\":{\"cells\":{\"0\":{\"merge\":[0,1],\"text\":\"家庭成员\",\"style\":125},\"2\":{\"style\":7,\"text\":\" \"},\"3\":{\"style\":7,\"text\":\" \"},\"4\":{\"style\":7,\"text\":\" \"},\"5\":{\"style\":7,\"text\":\" \"},\"6\":{\"style\":7,\"text\":\" \"},\"7\":{\"style\":7,\"text\":\" \"},\"8\":{\"style\":7,\"text\":\" \"},\"9\":{\"style\":112,\"text\":\" \"}},\"height\":42},\"32\":{\"cells\":{\"0\":{\"merge\":[0,1],\"text\":\"姓名\",\"style\":38},\"2\":{\"merge\":[0,1],\"text\":\"关系\",\"style\":38},\"4\":{\"text\":\"年龄\",\"style\":38},\"5\":{\"text\":\"工作单位\",\"style\":38,\"merge\":[0,1]},\"7\":{\"text\":\"政治面貌\",\"style\":38},\"8\":{\"text\":\"联系方式\",\"style\":38},\"9\":{\"style\":112,\"text\":\" \"}}},\"33\":{\"cells\":{\"0\":{\"text\":\"#{jtcy.name}\",\"style\":90,\"merge\":[0,1]},\"2\":{\"text\":\"#{jtcy.guanxi}\",\"style\":90,\"merge\":[0,1]},\"4\":{\"text\":\"#{jtcy.age}\",\"style\":90},\"5\":{\"text\":\"#{jtcy.danwei}\",\"style\":90,\"merge\":[0,1]},\"7\":{\"text\":\"#{jtcy.zzmm}\",\"style\":90},\"8\":{\"text\":\"#{jtcy.phone}\",\"style\":90},\"9\":{\"style\":112,\"text\":\" \"}},\"isDrag\":true},\"34\":{\"cells\":{\"0\":{\"text\":\" \",\"style\":7},\"1\":{\"text\":\" \",\"style\":7},\"2\":{\"text\":\" \",\"style\":7},\"3\":{\"text\":\" \",\"style\":7},\"4\":{\"text\":\" \",\"style\":7},\"5\":{\"text\":\" \",\"style\":7},\"6\":{\"text\":\" \",\"style\":7},\"7\":{\"text\":\" \",\"style\":7},\"8\":{\"text\":\" \",\"style\":7},\"9\":{\"style\":112,\"text\":\" \"}}},\"35\":{\"cells\":{\"0\":{\"merge\":[0,2],\"text\":\"所获奖励\",\"style\":125},\"3\":{\"text\":\" \",\"style\":7},\"4\":{\"text\":\" \",\"style\":7},\"5\":{\"text\":\" \",\"style\":7},\"6\":{\"text\":\" \",\"style\":7},\"7\":{\"text\":\" \",\"style\":7},\"8\":{\"text\":\" \",\"style\":7},\"9\":{\"style\":112,\"text\":\" \"}},\"height\":47},\"36\":{\"cells\":{\"0\":{\"text\":\"时间\",\"style\":90,\"merge\":[0,2]},\"3\":{\"style\":90,\"text\":\"地点\",\"merge\":[0,2]},\"6\":{\"style\":90,\"text\":\"所获得的奖励名称\",\"merge\":[0,2]},\"9\":{\"style\":112,\"text\":\" \"}}},\"37\":{\"cells\":{\"0\":{\"text\":\"#{jiangli.date}\",\"style\":90,\"merge\":[0,2]},\"3\":{\"text\":\"#{jiangli.didian}\",\"style\":90,\"merge\":[0,2]},\"6\":{\"text\":\"#{jiangli.mingcheng}\",\"style\":90,\"merge\":[0,2]},\"9\":{\"style\":112,\"text\":\" \"}},\"isDrag\":true},\"len\":98},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":718,\"heightPx\":1047},\"dicts\":[],\"freeze\":\"A1\",\"dataRectWidth\":703,\"displayConfig\":{},\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"size\":16}},{\"align\":\"center\",\"font\":{\"size\":16,\"bold\":true}},{\"align\":\"center\",\"font\":{\"size\":14,\"bold\":true}},{\"align\":\"center\",\"font\":{\"name\":\"仿宋\"}},{\"font\":{\"name\":\"仿宋\"}},{\"align\":\"center\",\"font\":{\"name\":\"宋体\"}},{\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"size\":12}},{\"font\":{\"name\":\"宋体\",\"size\":12}},{\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"size\":8}},{\"font\":{\"name\":\"宋体\",\"size\":8}},{\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"size\":10}},{\"font\":{\"name\":\"宋体\",\"size\":10}},{\"align\":\"center\",\"font\":{\"name\":\"隶书\",\"size\":10}},{\"font\":{\"name\":\"隶书\",\"size\":10}},{\"align\":\"center\",\"font\":{\"name\":\"华文中宋\",\"size\":10}},{\"font\":{\"name\":\"华文中宋\",\"size\":10}},{\"align\":\"center\",\"font\":{\"name\":\"Microsoft YaHei\",\"size\":10}},{\"font\":{\"name\":\"Microsoft YaHei\",\"size\":10}},{\"textwrap\":true},{\"textwrap\":true,\"align\":\"center\"},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"size\":10},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"font\":{\"name\":\"宋体\",\"size\":10},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"宋体\"},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"font\":{\"name\":\"宋体\"},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"align\":\"center\",\"font\":{\"name\":\"宋体\"},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"font\":{\"bold\":true}},{\"font\":{\"bold\":true,\"size\":12}},{\"font\":{\"bold\":true,\"size\":10}},{\"font\":{\"bold\":true,\"size\":10},\"align\":\"center\"},{\"font\":{\"bold\":true},\"align\":\"center\"},{\"font\":{\"bold\":true,\"size\":10},\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"bold\":true},\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"bold\":true,\"size\":10,\"name\":\"宋体\"},\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"bold\":true,\"size\":10,\"name\":\"宋体\"},\"align\":\"center\"},{\"font\":{\"bold\":true,\"name\":\"宋体\"},\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"bold\":true,\"name\":\"宋体\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"font\":{\"size\":14,\"bold\":true},\"border\":{\"top\":[\"thin\",\"#000\"]}},{\"border\":{\"top\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"left\":[\"thin\",\"#000\"]}},{\"border\":{\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"top\":[\"medium\",\"#000\"],\"left\":[\"medium\",\"#000\"]}},{\"align\":\"center\",\"font\":{\"size\":14,\"bold\":true},\"border\":{\"top\":[\"medium\",\"#000\"]}},{\"border\":{\"top\":[\"medium\",\"#000\"],\"right\":[\"medium\",\"#000\"]}},{\"border\":{\"left\":[\"medium\",\"#000\"]}},{\"border\":{\"right\":[\"medium\",\"#000\"]}},{\"border\":{\"bottom\":[\"medium\",\"#000\"],\"left\":[\"medium\",\"#000\"]}},{\"border\":{\"bottom\":[\"medium\",\"#000\"]}},{\"border\":{\"bottom\":[\"medium\",\"#000\"],\"right\":[\"medium\",\"#000\"]}},{\"border\":{\"top\":[\"medium\",\"#000\"],\"left\":[\"medium\",\"#000\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"align\":\"center\",\"font\":{\"size\":14,\"bold\":true,\"name\":\"Microsoft YaHei\"},\"border\":{\"top\":[\"medium\",\"#000\"]}},{\"align\":\"center\",\"font\":{\"size\":14,\"bold\":true,\"name\":\"Microsoft YaHei\"}},{\"border\":{\"top\":[\"medium\",\"#000\"],\"right\":[\"medium\",\"#000\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"border\":{\"left\":[\"medium\",\"#000\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"align\":\"center\",\"font\":{\"name\":\"Microsoft YaHei\",\"size\":10},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"border\":{\"right\":[\"medium\",\"#000\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"font\":{\"name\":\"Microsoft YaHei\",\"size\":10},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"font\":{\"name\":\"Microsoft YaHei\"}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Microsoft YaHei\"},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Microsoft YaHei\"}},{\"font\":{\"name\":\"Microsoft YaHei\"},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Microsoft YaHei\"},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Microsoft YaHei\"}},{\"font\":{\"bold\":true,\"size\":10,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"bold\":true,\"size\":10,\"name\":\"Microsoft YaHei\"},\"align\":\"center\"},{\"font\":{\"bold\":true,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"bold\":true,\"name\":\"Microsoft YaHei\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"border\":{\"bottom\":[\"medium\",\"#000\"],\"left\":[\"medium\",\"#000\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"border\":{\"bottom\":[\"medium\",\"#000\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"border\":{\"bottom\":[\"medium\",\"#000\"],\"right\":[\"medium\",\"#000\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"align\":\"center\",\"font\":{\"name\":\"Microsoft YaHei\",\"size\":8},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"font\":{\"name\":\"Microsoft YaHei\",\"size\":8}},{\"align\":\"center\",\"font\":{\"name\":\"Microsoft YaHei\",\"size\":9},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Microsoft YaHei\",\"size\":8}},{\"border\":{\"top\":[\"medium\",\"#000\"],\"left\":[\"medium\",\"#000\"]},\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"font\":{\"size\":14,\"bold\":true,\"name\":\"宋体\"},\"border\":{\"top\":[\"medium\",\"#000\"]}},{\"align\":\"center\",\"font\":{\"size\":14,\"bold\":true,\"name\":\"宋体\"}},{\"border\":{\"left\":[\"medium\",\"#000\"]},\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"size\":8},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"medium\",\"#000\"],\"left\":[\"medium\",\"#000\"]},\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"medium\",\"#000\"]},\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"size\":10,\"bold\":true},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"font\":{\"name\":\"宋体\",\"size\":10,\"bold\":true},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"font\":{\"name\":\"宋体\",\"size\":10,\"bold\":true}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"bold\":true},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"bold\":true}},{\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"bold\":true},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"font\":{\"name\":\"宋体\",\"bold\":true}},{\"border\":{\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"font\":{\"size\":14,\"bold\":true,\"name\":\"宋体\"},\"border\":{\"top\":[\"thin\",\"#000\"]}},{\"border\":{\"top\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"border\":{\"left\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\"}},{\"border\":{\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"border\":{\"top\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"]},\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"font\":{\"size\":14,\"bold\":true,\"name\":\"宋体\"},\"border\":{\"top\":[\"thin\",\"#ffffff\"]}},{\"border\":{\"top\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"border\":{\"left\":[\"thin\",\"#ffffff\"]},\"font\":{\"name\":\"宋体\"}},{\"border\":{\"right\":[\"thin\",\"#ffffff\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"]},\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"]},\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"align\":\"left\",\"font\":{\"name\":\"宋体\"},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"align\":\"left\",\"font\":{\"name\":\"宋体\"}},{\"font\":{\"name\":\"宋体\",\"size\":10},\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"name\":\"宋体\",\"size\":10},\"border\":{\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"name\":\"宋体\",\"size\":10},\"border\":{\"bottom\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"name\":\"宋体\",\"bold\":true},\"align\":\"right\"},{\"font\":{\"name\":\"宋体\",\"bold\":true},\"align\":\"right\",\"valign\":\"bottom\"},{\"font\":{\"name\":\"宋体\",\"bold\":true},\"align\":\"left\",\"valign\":\"bottom\"},{\"font\":{\"name\":\"宋体\",\"bold\":true},\"valign\":\"bottom\"},{\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"size\":10},\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"name\":\"宋体\",\"size\":10,\"bold\":true},\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"bold\":true},\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"align\":\"left\",\"font\":{\"name\":\"宋体\"},\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"font\":{\"name\":\"宋体\",\"size\":10},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"format\":\"datetime\"},{\"font\":{\"name\":\"宋体\",\"size\":10},\"format\":\"datetime\"},{\"font\":{\"name\":\"宋体\",\"size\":10},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"format\":\"normal\"},{\"font\":{\"name\":\"宋体\",\"size\":10},\"format\":\"normal\"}],\"validations\":[],\"cols\":{\"0\":{\"width\":73},\"1\":{\"width\":71},\"2\":{\"width\":69},\"3\":{\"width\":89},\"4\":{\"width\":64},\"5\":{\"width\":47},\"6\":{\"width\":68},\"7\":{\"width\":100},\"8\":{\"width\":103},\"9\":{\"width\":19},\"10\":{\"width\":146},\"11\":{\"width\":85},\"len\":50},\"merges\":[\"H3:I3\",\"B3:D3\",\"A2:I2\",\"D6:F6\",\"D7:F7\",\"A8:B8\",\"G8:H8\",\"A9:B9\",\"A10:B10\",\"C10:E10\",\"C8:E8\",\"C9:E9\",\"A11:B11\",\"C11:E11\",\"F11:G11\",\"H11:I11\",\"C12:I14\",\"A15:B15\",\"C15:E15\",\"F15:G15\",\"H15:I15\",\"A16:B16\",\"A17:B17\",\"A18:B18\",\"C17:I17\",\"C18:I18\",\"A20:E20\",\"A21:B21\",\"C21:D21\",\"E21:F21\",\"G21:H21\",\"A22:B22\",\"A24:E24\",\"A25:B25\",\"C25:D25\",\"G25:H25\",\"A26:B26\",\"A28:E28\",\"A29:B29\",\"C29:D29\",\"A30:B30\",\"A32:B32\",\"A33:B33\",\"C33:D33\",\"A34:B34\",\"C34:D34\",\"A36:C36\",\"C16:D16\",\"F16:G16\",\"QAAAAAACI1:JAAAAAABJ38\",\"A1:I1\",\"H4:I4\",\"G9:I9\",\"G22:H22\",\"E22:F22\",\"C22:D22\",\"C26:D26\",\"G26:H26\",\"C30:D30\",\"G30:H30\",\"E30:F30\",\"D37:F37\",\"D38:F38\",\"A38:C38\",\"A37:C37\",\"G37:I37\",\"G38:I38\",\"E29:F29\",\"G29:H29\",\"E25:F25\",\"E26:F26\",\"F33:G33\",\"F34:G34\",\"A12:B14\",\"I5:I8\"],\"imgList\":[{\"row\":4,\"col\":8,\"width\":\"101\",\"height\":\"128\",\"src\":\"https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/images/QQ截图20210115102648_1610694177544_1617244906979.png\",\"layer_id\":\"cvkWDQVZhfJPgcS4\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[4,8]]}]}', NULL, 'https://static.jeecg.com/designreport/images/1122_1607312336469.png', 'admin', '2020-10-10 16:32:53', 'admin', '2021-06-30 10:16:00', 0, NULL, NULL, 1, 607, NULL, NULL, NULL); +INSERT INTO `jimu_report` VALUES ('1316944968992034816', '20201016113231', '员工信息登记', NULL, NULL, 'printinfo', '{\"loopBlockList\":[],\"area\":false,\"printElWidth\":718,\"excel_config_id\":\"1316944968992034816\",\"printElHeight\":1047,\"rows\":{\"1\":{\"cells\":{\"0\":{\"text\":\"员工信息登记表\",\"merge\":[0,6],\"style\":28},\"1\":{\"style\":21,\"text\":\" \"},\"2\":{\"style\":21,\"text\":\" \"},\"3\":{\"style\":21,\"text\":\" \"},\"4\":{\"style\":21,\"text\":\" \"},\"5\":{\"style\":21,\"text\":\" \"},\"6\":{\"style\":21,\"text\":\" \"}},\"height\":46},\"2\":{\"cells\":{\"0\":{\"text\":\"编号:\",\"style\":29},\"1\":{\"text\":\"${employee.num}\",\"style\":30,\"merge\":[0,3]},\"2\":{\"text\":\" \",\"style\":24},\"3\":{\"text\":\" \",\"style\":24},\"4\":{\"text\":\" \",\"style\":24},\"5\":{\"text\":\"填写日期:\",\"style\":29},\"6\":{\"text\":\"${employee.create_time}\",\"style\":36}},\"isDrag\":true,\"height\":44},\"3\":{\"cells\":{\"0\":{\"text\":\"姓名:\",\"style\":29},\"1\":{\"text\":\"${employee.name}\",\"style\":30},\"2\":{\"text\":\"性别:\",\"style\":29},\"3\":{\"text\":\"${employee.sex}\",\"style\":30},\"4\":{\"text\":\"出生年月:\",\"style\":29},\"5\":{\"text\":\"${employee.birthday}\",\"style\":36},\"6\":{\"style\":3,\"text\":\" \",\"merge\":[4,0],\"virtual\":\"Ym8ny6lYTdutY5tT\"}},\"isDrag\":true,\"height\":42},\"4\":{\"cells\":{\"0\":{\"text\":\"民族:\",\"style\":29},\"1\":{\"text\":\"${employee.nation}\",\"style\":30},\"2\":{\"text\":\"政治面貌:\",\"style\":29},\"3\":{\"text\":\"${employee.political}\",\"style\":30},\"4\":{\"text\":\"籍贯:\",\"style\":29},\"5\":{\"text\":\"${employee.native_place}\",\"style\":30}},\"isDrag\":true,\"height\":38},\"5\":{\"cells\":{\"0\":{\"text\":\"身高(cm):\",\"style\":29},\"1\":{\"text\":\"${employee.height}\",\"style\":30},\"2\":{\"text\":\"体重(kg):\",\"style\":29},\"3\":{\"text\":\"${employee.weight}\",\"style\":30},\"4\":{\"text\":\"健康状况:\",\"style\":29},\"5\":{\"text\":\"${employee.health}\",\"style\":30}},\"isDrag\":true,\"height\":38},\"6\":{\"cells\":{\"0\":{\"text\":\"身份证号:\",\"style\":29},\"1\":{\"text\":\"${employee.id_card}\",\"style\":30,\"merge\":[0,2]},\"2\":{\"text\":\" \",\"style\":24},\"3\":{\"text\":\" \",\"style\":24},\"4\":{\"text\":\"学历:\",\"style\":29},\"5\":{\"text\":\"${employee.education}\",\"style\":30}},\"isDrag\":true,\"height\":40},\"7\":{\"cells\":{\"0\":{\"text\":\"毕业学校:\",\"style\":29},\"1\":{\"text\":\"${employee.school}\",\"style\":30,\"merge\":[0,2]},\"2\":{\"text\":\" \",\"style\":24},\"3\":{\"text\":\" \",\"style\":24},\"4\":{\"text\":\"专业:\",\"style\":29},\"5\":{\"text\":\"${employee.major}\",\"style\":30}},\"isDrag\":true,\"height\":44},\"8\":{\"cells\":{\"0\":{\"text\":\"联系地址:\",\"style\":29},\"1\":{\"text\":\"${employee.address}\",\"style\":30,\"merge\":[0,2]},\"2\":{\"text\":\" \",\"style\":24},\"3\":{\"text\":\" \",\"style\":24},\"4\":{\"text\":\"邮编:\",\"style\":29},\"5\":{\"text\":\"${employee.zip_code}\",\"style\":30,\"merge\":[0,1]},\"6\":{\"text\":\" \",\"style\":24}},\"isDrag\":true,\"height\":45},\"9\":{\"cells\":{\"0\":{\"text\":\"Email:\",\"style\":29},\"1\":{\"text\":\"${employee.email}\",\"style\":30,\"merge\":[0,2]},\"2\":{\"text\":\" \",\"style\":24},\"3\":{\"text\":\" \",\"style\":24},\"4\":{\"text\":\"手机号:\",\"style\":29},\"5\":{\"text\":\"${employee.phone}\",\"style\":30,\"merge\":[0,1]},\"6\":{\"text\":\" \",\"style\":24}},\"isDrag\":true,\"height\":40},\"10\":{\"cells\":{\"0\":{\"text\":\"外语语种:\",\"style\":29},\"1\":{\"text\":\"${employee.foreign_language}\",\"style\":30},\"2\":{\"text\":\"外语水平:\",\"style\":29},\"3\":{\"text\":\"${employee.foreign_language_level}\",\"style\":30},\"4\":{\"text\":\"计算机水平:\",\"style\":29},\"5\":{\"text\":\"${employee.computer_level}\",\"style\":30,\"merge\":[0,1]},\"6\":{\"text\":\" \",\"style\":24}},\"isDrag\":true,\"height\":41},\"11\":{\"cells\":{\"0\":{\"text\":\"毕业时间:\",\"style\":29},\"1\":{\"text\":\"${employee.graduation_time}\",\"style\":34},\"2\":{\"text\":\"到职时间:\",\"style\":29},\"3\":{\"text\":\"${employee.arrival_time}\",\"style\":34},\"4\":{\"text\":\"职称:\",\"style\":29},\"5\":{\"text\":\"${employee.positional_titles}\",\"style\":30,\"merge\":[0,1]},\"6\":{\"text\":\" \",\"style\":24}},\"isDrag\":true,\"height\":42},\"12\":{\"cells\":{\"0\":{\"text\":\"教育经历:\",\"style\":32},\"1\":{\"text\":\"\",\"style\":35,\"merge\":[0,5]},\"2\":{\"text\":\" \",\"style\":40},\"3\":{\"text\":\" \",\"style\":40},\"4\":{\"text\":\" \",\"style\":40},\"5\":{\"text\":\" \",\"style\":40},\"6\":{\"text\":\" \",\"style\":40}},\"isDrag\":true,\"height\":39},\"13\":{\"cells\":{\"0\":{\"text\":\"${employee.education_experience}\",\"style\":33,\"merge\":[0,6]},\"1\":{\"style\":27,\"text\":\" \"},\"2\":{\"style\":27,\"text\":\" \"},\"3\":{\"style\":27,\"text\":\" \"},\"4\":{\"style\":27,\"text\":\" \"},\"5\":{\"style\":27,\"text\":\" \"},\"6\":{\"style\":27,\"text\":\" \"}},\"isDrag\":true,\"height\":70},\"14\":{\"cells\":{\"0\":{\"text\":\"工作经历:\",\"style\":32},\"1\":{\"merge\":[0,5],\"style\":30,\"text\":\" \"},\"2\":{\"text\":\" \",\"style\":24},\"3\":{\"text\":\" \",\"style\":24},\"4\":{\"text\":\" \",\"style\":24},\"5\":{\"text\":\" \",\"style\":24},\"6\":{\"text\":\" \",\"style\":24}},\"height\":43},\"15\":{\"cells\":{\"0\":{\"text\":\"${employee.work_experience}\",\"style\":30,\"merge\":[0,6]},\"1\":{\"text\":\" \",\"style\":24},\"2\":{\"text\":\" \",\"style\":24},\"3\":{\"text\":\" \",\"style\":24},\"4\":{\"text\":\" \",\"style\":24},\"5\":{\"text\":\" \",\"style\":24},\"6\":{\"text\":\" \",\"style\":24}},\"isDrag\":true,\"height\":61},\"17\":{\"cells\":{\"1\":{\"text\":\"\",\"style\":37}}},\"len\":100},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":718,\"heightPx\":1047},\"dicts\":[\"sex1\"],\"freeze\":\"A1\",\"dataRectWidth\":712,\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"bold\":true}},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":16}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"bold\":true}},{\"font\":{\"bold\":true}},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":16},\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"bold\":false}},{\"font\":{\"bold\":false}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"bold\":true},\"align\":\"right\"},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":16},\"border\":{\"bottom\":[\"thin\",\"#a5a5a5\"],\"top\":[\"thin\",\"#a5a5a5\"],\"left\":[\"thin\",\"#a5a5a5\"],\"right\":[\"thin\",\"#a5a5a5\"]}},{\"border\":{\"bottom\":[\"thin\",\"#a5a5a5\"],\"top\":[\"thin\",\"#a5a5a5\"],\"left\":[\"thin\",\"#a5a5a5\"],\"right\":[\"thin\",\"#a5a5a5\"]},\"font\":{\"bold\":true},\"align\":\"right\"},{\"border\":{\"bottom\":[\"thin\",\"#a5a5a5\"],\"top\":[\"thin\",\"#a5a5a5\"],\"left\":[\"thin\",\"#a5a5a5\"],\"right\":[\"thin\",\"#a5a5a5\"]}},{\"border\":{\"bottom\":[\"thin\",\"#a5a5a5\"],\"top\":[\"thin\",\"#a5a5a5\"],\"left\":[\"thin\",\"#a5a5a5\"],\"right\":[\"thin\",\"#a5a5a5\"]},\"font\":{\"bold\":true}},{\"border\":{\"bottom\":[\"thin\",\"#a5a5a5\"],\"top\":[\"thin\",\"#a5a5a5\"],\"left\":[\"thin\",\"#a5a5a5\"],\"right\":[\"thin\",\"#a5a5a5\"]},\"font\":{\"bold\":false}},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":16},\"border\":{\"bottom\":[\"thin\",\"#262626\"],\"top\":[\"thin\",\"#262626\"],\"left\":[\"thin\",\"#262626\"],\"right\":[\"thin\",\"#262626\"]}},{\"border\":{\"bottom\":[\"thin\",\"#262626\"],\"top\":[\"thin\",\"#262626\"],\"left\":[\"thin\",\"#262626\"],\"right\":[\"thin\",\"#262626\"]},\"font\":{\"bold\":true},\"align\":\"right\"},{\"border\":{\"bottom\":[\"thin\",\"#262626\"],\"top\":[\"thin\",\"#262626\"],\"left\":[\"thin\",\"#262626\"],\"right\":[\"thin\",\"#262626\"]}},{\"border\":{\"bottom\":[\"thin\",\"#262626\"],\"top\":[\"thin\",\"#262626\"],\"left\":[\"thin\",\"#262626\"],\"right\":[\"thin\",\"#262626\"]},\"font\":{\"bold\":true}},{\"border\":{\"bottom\":[\"thin\",\"#262626\"],\"top\":[\"thin\",\"#262626\"],\"left\":[\"thin\",\"#262626\"],\"right\":[\"thin\",\"#262626\"]},\"font\":{\"bold\":false}},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":16,\"name\":\"宋体\"},\"border\":{\"bottom\":[\"thin\",\"#262626\"],\"top\":[\"thin\",\"#262626\"],\"left\":[\"thin\",\"#262626\"],\"right\":[\"thin\",\"#262626\"]}},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":16,\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#262626\"],\"top\":[\"thin\",\"#262626\"],\"left\":[\"thin\",\"#262626\"],\"right\":[\"thin\",\"#262626\"]},\"font\":{\"bold\":true,\"name\":\"宋体\"},\"align\":\"right\"},{\"border\":{\"bottom\":[\"thin\",\"#262626\"],\"top\":[\"thin\",\"#262626\"],\"left\":[\"thin\",\"#262626\"],\"right\":[\"thin\",\"#262626\"]},\"font\":{\"name\":\"宋体\"}},{\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#262626\"],\"top\":[\"thin\",\"#262626\"],\"left\":[\"thin\",\"#262626\"],\"right\":[\"thin\",\"#262626\"]},\"font\":{\"bold\":true,\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#262626\"],\"top\":[\"thin\",\"#262626\"],\"left\":[\"thin\",\"#262626\"],\"right\":[\"thin\",\"#262626\"]},\"font\":{\"bold\":false,\"name\":\"宋体\"}},{\"font\":{\"bold\":false,\"name\":\"宋体\"}},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":16,\"name\":\"宋体\"},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"font\":{\"bold\":true,\"name\":\"宋体\"},\"align\":\"right\"},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"font\":{\"bold\":true,\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"font\":{\"bold\":false,\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"font\":{\"name\":\"宋体\"},\"format\":\"date2\"},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"font\":{\"name\":\"宋体\"},\"format\":\"normal\"},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"font\":{\"name\":\"宋体\"},\"format\":\"date\"},{\"format\":\"date2\"},{\"font\":{\"name\":\"宋体\"},\"format\":\"date2\"},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"font\":{\"name\":\"宋体\"},\"format\":\"time\"},{\"font\":{\"name\":\"宋体\"},\"format\":\"normal\"}],\"validations\":[],\"cols\":{\"0\":{\"width\":79},\"1\":{\"width\":92},\"2\":{\"width\":76},\"3\":{\"width\":106},\"5\":{\"width\":123},\"6\":{\"width\":136},\"len\":50},\"merges\":[\"A2:G2\",\"B3:E3\",\"B7:D7\",\"B8:D8\",\"B9:D9\",\"B10:D10\",\"F9:G9\",\"F10:G10\",\"F11:G11\",\"F12:G12\",\"B13:G13\",\"A14:G14\",\"B15:G15\",\"A16:G16\",\"G4:G8\"],\"imgList\":[{\"row\":3,\"col\":6,\"width\":\"135\",\"height\":\"192\",\"src\":\"https://static.jeecg.com/designreport/images/QQ截图20210108095848_1610071294294.png\",\"layer_id\":\"Ym8ny6lYTdutY5tT\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[3,6]]}]}', NULL, 'https://static.jeecg.com/designreport/images/1133_1607312428261.png', 'admin', '2020-10-16 11:32:32', 'admin', '2021-07-13 05:39:23', 0, NULL, NULL, 1, 1412, NULL, NULL, NULL); +INSERT INTO `jimu_report` VALUES ('1331503965770223616', '20201125155042', '房屋销售综合展示大屏', NULL, NULL, 'chartinfo', '{\"loopBlockList\":[],\"chartList\":[{\"row\":1,\"col\":1,\"colspan\":0,\"rowspan\":0,\"width\":\"338\",\"height\":\"378\",\"config\":\"{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"rotate\\\":0,\\\"interval\\\":0,\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"data\\\":[\\\"缤纷南郡\\\",\\\"中航华府\\\",\\\"3中家属楼\\\",\\\"幸福家园\\\",\\\"水晶国际\\\",\\\"绿城小区\\\",\\\"缤纷南郡二期\\\",\\\"国奥家园\\\",\\\"西西胡同\\\",\\\"融创学府\\\",\\\"蓝湾国际\\\",\\\"广发小区\\\"],\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\"}},\\\"show\\\":true,\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false},\\\"type\\\":\\\"category\\\"},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\"}},\\\"show\\\":true,\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false},\\\"type \\\":\\\"value\\\"},\\\"legend\\\":{\\\"padding\\\":[25,20,25,10],\\\"data\\\":[\\\"房子\\\"],\\\"top\\\":\\\"top\\\",\\\"orient\\\":\\\"horizontal\\\",\\\"left\\\":\\\"center\\\",\\\"show\\\":false,\\\"textStyle\\\":{\\\"color\\\":\\\"#333\\\",\\\"fontSize\\\":12}},\\\"grid\\\":{\\\"top\\\":60,\\\"left\\\":71,\\\"bottom\\\":39,\\\"right\\\":29},\\\"series\\\":[{\\\"barWidth\\\":13,\\\"data\\\":[2,2,2,3,4,3,3,5,2,7,4,8],\\\"name\\\":\\\"房子\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"\\\",\\\"barBorderRadius\\\":7},\\\"label\\\":{\\\"show\\\":false,\\\"position\\\":\\\"top\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"black\\\",\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"bolder\\\"}},\\\"type\\\":\\\"bar\\\",\\\"barMinHeight\\\":2,\\\"typeData\\\":[]}],\\\"tooltip\\\":{\\\"show\\\":true,\\\"axisPointer\\\":{\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"padding\\\":[5,20,5,20],\\\"left\\\":\\\"left\\\",\\\"show\\\":true,\\\"text\\\":\\\"各楼盘成交量排名\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"14\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"top\\\":10}}\",\"url\":\"\",\"extData\":{\"dataType\":\"api\",\"apiStatus\":\"1\",\"dataId\":\"1331511745851731969\",\"axisX\":\"name\",\"axisY\":\"value\",\"series\":\"type\",\"yText\":\"\",\"xText\":\"\",\"dbCode\":\"chengjiao\",\"chartType\":\"bar.multi.horizontal\",\"isTiming\":true,\"intervalTime\":\"5\"},\"layer_id\":\"5ggWQtDUvSopC4iL\",\"offsetX\":0,\"offsetY\":0,\"backgroud\":{\"enabled\":false,\"color\":\"#fff\",\"image\":\"\"},\"virtualCellRange\":[[1,1],[1,2],[1,3]]},{\"row\":1,\"col\":12,\"colspan\":0,\"rowspan\":0,\"width\":\"327\",\"height\":\"152\",\"config\":\"{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":12}},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\"}},\\\"show\\\":true,\\\"name\\\":\\\"\\\",\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false}},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"rotate\\\":34,\\\"interval\\\":0,\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"data\\\":[\\\"高层\\\",\\\"小高层\\\",\\\"写字楼\\\",\\\"厂房\\\",\\\"公寓\\\",\\\"别墅\\\",\\\"厂房\\\",\\\"四合院\\\",\\\"loft\\\"],\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\"}},\\\"show\\\":true,\\\"name\\\":\\\"\\\",\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false}},\\\"grid\\\":{\\\"top\\\":50,\\\"left\\\":30,\\\"bottom\\\":44,\\\"right\\\":24},\\\"series\\\":[{\\\"areaStyle\\\":null,\\\"data\\\":[20,25,10,5,9,1,5,1,20],\\\"showSymbol\\\":true,\\\"lineStyle\\\":{\\\"width\\\":2},\\\"symbolSize\\\":5,\\\"isArea\\\":false,\\\"name\\\":\\\"\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"#D04672\\\"},\\\"step\\\":false,\\\"label\\\":{\\\"show\\\":false,\\\"position\\\":\\\"top\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"black\\\",\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"bolder\\\"}},\\\"type\\\":\\\"line\\\",\\\"smooth\\\":true}],\\\"tooltip\\\":{\\\"formatter\\\":\\\"{b} : {c}\\\",\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"show\\\":true,\\\"top\\\":10,\\\"text\\\":\\\"房形分析\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"fontSize\\\":\\\"14\\\"},\\\"left\\\":\\\"left\\\",\\\"padding\\\":[5,20,5,10]}}\",\"url\":\"\",\"extData\":{\"dataType\":\"api\",\"apiStatus\":\"1\",\"dataId\":\"1331922734933987329\",\"axisX\":\"name\",\"axisY\":\"value\",\"series\":\"type\",\"yText\":\"\",\"xText\":\"\",\"dbCode\":\"fangyuan\",\"chartType\":\"line.smooth\",\"isTiming\":true,\"intervalTime\":\"5\"},\"layer_id\":\"nk6I2RCefm9scS1k\",\"offsetX\":0,\"offsetY\":0,\"backgroud\":{\"enabled\":false,\"color\":\"#fff\",\"image\":\"\"},\"virtualCellRange\":[[1,12],[1,13],[1,14],[1,15]]},{\"row\":7,\"col\":12,\"colspan\":0,\"rowspan\":0,\"width\":\"324\",\"height\":\"215\",\"config\":\"{\\\"legend\\\":{\\\"padding\\\":[25,20,25,10],\\\"data\\\":[\\\"1室\\\",\\\"2室\\\",\\\"3室\\\",\\\"4室\\\",\\\"5室\\\"],\\\"top\\\":\\\"bottom\\\",\\\"orient\\\":\\\"vertical\\\",\\\"left\\\":\\\"right\\\",\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"series\\\":[{\\\"isRose\\\":false,\\\"data\\\":[{\\\"name\\\":\\\"1室\\\",\\\"value\\\":10,\\\"itemStyle\\\":{\\\"color\\\":\\\"rgba(53,165,180,1)\\\"}},{\\\"name\\\":\\\"2室\\\",\\\"value\\\":30,\\\"itemStyle\\\":{\\\"color\\\":\\\"rgba(60,140,198,1)\\\"}},{\\\"name\\\":\\\"3室\\\",\\\"value\\\":20,\\\"itemStyle\\\":{\\\"color\\\":\\\"rgba(93,144,81,1)\\\"}},{\\\"name\\\":\\\"4室\\\",\\\"value\\\":5,\\\"itemStyle\\\":{\\\"color\\\":\\\"rgba(191,146,68,1)\\\"}},{\\\"name\\\":\\\"5室\\\",\\\"value\\\":3,\\\"itemStyle\\\":{\\\"color\\\":\\\"rgba(188,69,117,1)\\\"}}],\\\"isRadius\\\":true,\\\"roseType\\\":\\\"\\\",\\\"notCount\\\":false,\\\"center\\\":[\\\"160\\\",\\\"120\\\"],\\\"name\\\":\\\"\\\",\\\"minAngle\\\":0,\\\"label\\\":{\\\"show\\\":false,\\\"position\\\":\\\"outside\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"\\\",\\\"fontSize\\\":\\\"8\\\",\\\"fontWeight\\\":\\\"bolder\\\"}},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":[\\\"40%\\\",\\\"50%\\\"],\\\"autoSort\\\":false}],\\\"tooltip\\\":{\\\"formatter\\\":\\\"{b} : {c}\\\",\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"show\\\":true,\\\"top\\\":10,\\\"text\\\":\\\"不同户型销售\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"fontSize\\\":\\\"14\\\"},\\\"left\\\":\\\"left\\\",\\\"padding\\\":[5,20,5,10]}}\",\"url\":\"\",\"extData\":{\"dataType\":\"api\",\"apiStatus\":\"1\",\"dataId\":\"1331919172472524801\",\"axisX\":\"name\",\"axisY\":\"value\",\"series\":\"type\",\"yText\":\"\",\"xText\":\"\",\"dbCode\":\"huxingxiaoshou\",\"chartType\":\"pie.doughnut\",\"isTiming\":true,\"intervalTime\":\"5\",\"id\":\"MCJP8uqwe57YoCvF\"},\"layer_id\":\"MCJP8uqwe57YoCvF\",\"offsetX\":0,\"offsetY\":0,\"backgroud\":{\"enabled\":false,\"color\":\"#fff\",\"image\":\"\"},\"virtualCellRange\":[[7,12],[7,13],[7,14],[7,15]]},{\"row\":7,\"col\":4,\"colspan\":0,\"rowspan\":0,\"width\":\"662\",\"height\":\"222\",\"config\":\"{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\"}},\\\"show\\\":true,\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false},\\\"type \\\":\\\"value\\\"},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"rotate\\\":0,\\\"interval\\\":0,\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"data\\\":[\\\"1月\\\",\\\"2月\\\",\\\"3月\\\",\\\"4月\\\",\\\"5月\\\",\\\"6月\\\",\\\"7月\\\",\\\"8月\\\",\\\"9月\\\",\\\"10月\\\",\\\"11月\\\",\\\"12月\\\"],\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\"}},\\\"show\\\":true,\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#A98E8E\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false},\\\"type\\\":\\\"category\\\"},\\\"legend\\\":{\\\"padding\\\":[25,20,25,10],\\\"data\\\":[\\\"成交量\\\",\\\"成交价\\\"],\\\"top\\\":\\\"top\\\",\\\"orient\\\":\\\"vertical\\\",\\\"left\\\":\\\"center\\\",\\\"show\\\":false,\\\"textStyle\\\":{\\\"color\\\":\\\"#FBF8F8\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"grid\\\":{\\\"top\\\":58,\\\"left\\\":30,\\\"bottom\\\":43,\\\"right\\\":32},\\\"series\\\":[{\\\"barWidth\\\":15,\\\"stack\\\":\\\"1\\\",\\\"data\\\":[10,7,5,5,7,9,3,6,5,8,6,6],\\\"name\\\":\\\"成交量\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"#37A5B1\\\",\\\"barBorderRadius\\\":13},\\\"type\\\":\\\"bar\\\",\\\"barMinHeight\\\":7,\\\"typeData\\\":[{\\\"name\\\":\\\"成交量\\\",\\\"type\\\":\\\"\\\",\\\"_index\\\":0,\\\"_rowKey\\\":136,\\\"stack\\\":\\\"1\\\"},{\\\"name\\\":\\\"成交价\\\",\\\"type\\\":\\\"\\\",\\\"stack\\\":\\\"1\\\",\\\"_index\\\":1,\\\"_rowKey\\\":139}]},{\\\"barWidth\\\":15,\\\"stack\\\":\\\"1\\\",\\\"data\\\":[5,5,12,5,5,5,5,10,5,5,5,5],\\\"name\\\":\\\"成交价\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"#2E72A7\\\",\\\"barBorderRadius\\\":13},\\\"type\\\":\\\"bar\\\",\\\"barMinHeight\\\":7,\\\"typeData\\\":[{\\\"name\\\":\\\"成交量\\\",\\\"type\\\":\\\"\\\",\\\"_index\\\":0,\\\"_rowKey\\\":136,\\\"stack\\\":\\\"1\\\"},{\\\"name\\\":\\\"成交价\\\",\\\"type\\\":\\\"\\\",\\\"stack\\\":\\\"1\\\",\\\"_index\\\":1,\\\"_rowKey\\\":139}]}],\\\"tooltip\\\":{\\\"show\\\":true,\\\"axisPointer\\\":{\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"padding\\\":[5,20,5,20],\\\"left\\\":\\\"left\\\",\\\"show\\\":true,\\\"text\\\":\\\"成交量和成交价趋势\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"14\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"top\\\":10}}\",\"url\":\"\",\"extData\":{\"dataType\":\"api\",\"apiStatus\":\"1\",\"dataId\":\"1331872643531526146\",\"axisX\":\"name\",\"axisY\":\"value\",\"series\":\"type\",\"yText\":\"\",\"xText\":\"\",\"dbCode\":\"chengjiao1\",\"chartType\":\"bar.stack\",\"chartId\":\"\",\"isTiming\":true,\"intervalTime\":\"5\"},\"layer_id\":\"Nf6Xud4fZqEfvQw4\",\"offsetX\":0,\"offsetY\":0,\"backgroud\":{\"enabled\":false,\"color\":\"#fff\",\"image\":\"\"},\"virtualCellRange\":[[7,4],[7,5],[7,6],[7,7],[7,8],[7,9],[7,10],[7,11]]},{\"row\":16,\"col\":12,\"colspan\":0,\"rowspan\":0,\"width\":\"326\",\"height\":\"200\",\"config\":\"{\\\"radar\\\":[{\\\"indicator\\\":[{\\\"name\\\":\\\"房产证\\\",\\\"max\\\":520},{\\\"name\\\":\\\"购房发票\\\",\\\"max\\\":310},{\\\"name\\\":\\\"购房合同\\\",\\\"max\\\":380},{\\\"name\\\":\\\"预售合同\\\",\\\"max\\\":450},{\\\"name\\\":\\\"抵押合同\\\",\\\"max\\\":600},{\\\"name\\\":\\\"预收合同\\\",\\\"max\\\":350}],\\\"shape\\\":\\\"polygon\\\",\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"gray\\\",\\\"opacity\\\":0.5}},\\\"center\\\":[\\\"50%\\\",\\\"50%\\\"],\\\"name\\\":{\\\"formatter\\\":\\\"【{value}】\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#72ACD1\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"gray\\\",\\\"opacity\\\":0.5}}}],\\\"legend\\\":{\\\"padding\\\":[25,20,25,10],\\\"data\\\":[\\\"售后产权\\\",\\\"单位产权\\\",\\\"个人产权\\\"],\\\"top\\\":\\\"top\\\",\\\"orient\\\":\\\"horizontal\\\",\\\"left\\\":\\\"center\\\",\\\"show\\\":false,\\\"textStyle\\\":{\\\"color\\\":\\\"#333\\\",\\\"fontSize\\\":12}},\\\"series\\\":[{\\\"type\\\":\\\"radar\\\",\\\"data\\\":[{\\\"name\\\":\\\"售后产权\\\",\\\"value\\\":[43,100,280,350,500,250],\\\"areaStyle\\\":{\\\"color\\\":\\\"#3F9AFB\\\",\\\"opacity\\\":1},\\\"lineStyle\\\":{\\\"color\\\":\\\"#2D8CF0\\\"}},{\\\"name\\\":\\\"单位产权\\\",\\\"value\\\":[190,50,140,280,310,150],\\\"areaStyle\\\":{\\\"color\\\":\\\"#A6F65C\\\",\\\"opacity\\\":1},\\\"lineStyle\\\":{\\\"color\\\":\\\"#55FE4D\\\"}},{\\\"name\\\":\\\"个人产权\\\",\\\"value\\\":[420,210,160,0,120,130],\\\"areaStyle\\\":{\\\"color\\\":\\\"rgba(188,69,117,1)\\\",\\\"opacity\\\":1},\\\"lineStyle\\\":{\\\"color\\\":\\\"rgba(188,69,117,1)\\\"}}]}],\\\"tooltip\\\":{\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"show\\\":true,\\\"top\\\":10,\\\"text\\\":\\\"不同产权、证件成交量\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#ffffff\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"fontSize\\\":\\\"14\\\"},\\\"left\\\":\\\"left\\\",\\\"padding\\\":[5,20,5,20]}}\",\"url\":\"\",\"extData\":{\"dataType\":\"api\",\"apiStatus\":\"1\",\"dataId\":\"1331916030221602818\",\"axisX\":\"name\",\"axisY\":\"value\",\"series\":\"type\",\"yText\":\"\",\"xText\":\"\",\"dbCode\":\"btchanquan\",\"chartType\":\"radar.basic\",\"isTiming\":true,\"intervalTime\":\"10\",\"id\":\"IWoBtyiRxjkEbkfD\"},\"layer_id\":\"IWoBtyiRxjkEbkfD\",\"offsetX\":0,\"offsetY\":0,\"backgroud\":{\"enabled\":false,\"color\":\"#fff\",\"image\":\"\"},\"virtualCellRange\":[[16,12],[16,13],[16,14],[16,15]]},{\"row\":16,\"col\":1,\"colspan\":0,\"rowspan\":0,\"width\":\"337\",\"height\":\"205\",\"config\":\"{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"rotate\\\":0,\\\"interval\\\":0,\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"data\\\":[\\\"马小姐\\\",\\\"孙小姐\\\",\\\"王先生\\\",\\\"李先生\\\",\\\"赵小姐\\\"],\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\"}},\\\"show\\\":true,\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false},\\\"type\\\":\\\"category\\\"},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\"}},\\\"show\\\":true,\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false},\\\"type \\\":\\\"value\\\"},\\\"legend\\\":{\\\"padding\\\":[25,20,25,10],\\\"data\\\":[\\\"房子\\\"],\\\"top\\\":\\\"top\\\",\\\"orient\\\":\\\"horizontal\\\",\\\"left\\\":\\\"center\\\",\\\"show\\\":false,\\\"textStyle\\\":{\\\"color\\\":\\\"#333\\\",\\\"fontSize\\\":12}},\\\"grid\\\":{\\\"top\\\":55,\\\"left\\\":70,\\\"bottom\\\":40,\\\"right\\\":24},\\\"series\\\":[{\\\"barWidth\\\":13,\\\"data\\\":[20,15,12,10,7],\\\"name\\\":\\\"房子\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"\\\",\\\"barBorderRadius\\\":7},\\\"label\\\":{\\\"show\\\":false,\\\"position\\\":\\\"top\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"black\\\",\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"bolder\\\"}},\\\"type\\\":\\\"bar\\\",\\\"barMinHeight\\\":2,\\\"typeData\\\":[]}],\\\"tooltip\\\":{\\\"show\\\":true,\\\"axisPointer\\\":{\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"padding\\\":[5,20,5,20],\\\"left\\\":\\\"left\\\",\\\"show\\\":true,\\\"text\\\":\\\"销售量成交排行榜\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"14\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"top\\\":10}}\",\"url\":\"\",\"extData\":{\"dataType\":\"api\",\"apiStatus\":\"1\",\"dataId\":\"1331514838211407873\",\"axisX\":\"name\",\"axisY\":\"value\",\"series\":\"type\",\"yText\":\"\",\"xText\":\"\",\"dbCode\":\"cjpaihang\",\"chartType\":\"bar.multi.horizontal\",\"isTiming\":true,\"intervalTime\":\"5\"},\"layer_id\":\"Cror94F1kmbP71ip\",\"offsetX\":0,\"offsetY\":0,\"backgroud\":{\"enabled\":false,\"color\":\"#fff\",\"image\":\"\"},\"virtualCellRange\":[[16,1],[16,2],[16,3]]},{\"row\":16,\"col\":4,\"colspan\":0,\"rowspan\":0,\"width\":\"334\",\"height\":\"206\",\"config\":\"{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"rotate\\\":0,\\\"interval\\\":0,\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"data\\\":[\\\"马小姐\\\",\\\"孙小姐\\\",\\\"王先生\\\",\\\"李先生\\\",\\\"赵小姐\\\"],\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\"}},\\\"show\\\":true,\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false},\\\"type\\\":\\\"category\\\"},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\"}},\\\"show\\\":true,\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false},\\\"type \\\":\\\"value\\\"},\\\"legend\\\":{\\\"padding\\\":[25,20,25,10],\\\"data\\\":[\\\"房子\\\"],\\\"top\\\":\\\"top\\\",\\\"orient\\\":\\\"horizontal\\\",\\\"left\\\":\\\"center\\\",\\\"show\\\":false,\\\"textStyle\\\":{\\\"color\\\":\\\"#333\\\",\\\"fontSize\\\":12}},\\\"grid\\\":{\\\"top\\\":55,\\\"left\\\":56,\\\"bottom\\\":38,\\\"right\\\":30},\\\"series\\\":[{\\\"barWidth\\\":13,\\\"data\\\":[20,15,12,10,7],\\\"name\\\":\\\"房子\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"\\\",\\\"barBorderRadius\\\":7},\\\"label\\\":{\\\"show\\\":false,\\\"position\\\":\\\"top\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"black\\\",\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"bolder\\\"}},\\\"type\\\":\\\"bar\\\",\\\"barMinHeight\\\":2,\\\"typeData\\\":[]}],\\\"tooltip\\\":{\\\"show\\\":true,\\\"axisPointer\\\":{\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"padding\\\":[5,20,5,20],\\\"left\\\":\\\"left\\\",\\\"show\\\":true,\\\"text\\\":\\\"销售员成交金额\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"14\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"top\\\":10}}\",\"url\":\"\",\"extData\":{\"dataType\":\"api\",\"apiStatus\":\"1\",\"dataId\":\"1331514838211407873\",\"axisX\":\"name\",\"axisY\":\"value\",\"series\":\"type\",\"yText\":\"\",\"xText\":\"\",\"dbCode\":\"cjpaihang\",\"chartType\":\"bar.multi.horizontal\",\"isTiming\":true,\"intervalTime\":\"5\",\"chartId\":\"\"},\"layer_id\":\"pBOwp0Q0g4iuJCVm\",\"offsetX\":0,\"offsetY\":0,\"backgroud\":{\"enabled\":false,\"color\":\"#fff\",\"image\":\"\"},\"virtualCellRange\":[[16,4],[16,5],[16,6],[16,7]]},{\"row\":16,\"col\":8,\"colspan\":0,\"rowspan\":0,\"width\":\"324\",\"height\":\"206\",\"config\":\"{\\\"legend\\\":{\\\"padding\\\":[25,20,25,10],\\\"data\\\":[\\\"简装\\\",\\\"中装\\\",\\\"精装\\\",\\\"豪装\\\",\\\"毛坯\\\"],\\\"top\\\":\\\"bottom\\\",\\\"orient\\\":\\\"vertical\\\",\\\"left\\\":\\\"left\\\",\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"series\\\":[{\\\"isRose\\\":false,\\\"data\\\":[{\\\"name\\\":\\\"简装\\\",\\\"value\\\":10,\\\"itemStyle\\\":{\\\"color\\\":\\\"rgba(52,158,172,1)\\\"}},{\\\"name\\\":\\\"中装\\\",\\\"value\\\":10,\\\"itemStyle\\\":{\\\"color\\\":\\\"rgba(56,131,185,1)\\\"}},{\\\"name\\\":\\\"精装\\\",\\\"value\\\":10,\\\"itemStyle\\\":{\\\"color\\\":\\\"rgba(103,153,75,1)\\\"}},{\\\"name\\\":\\\"豪装\\\",\\\"value\\\":10,\\\"itemStyle\\\":{\\\"color\\\":\\\"rgba(230,165,55,1)\\\"}},{\\\"name\\\":\\\"毛坯\\\",\\\"value\\\":10,\\\"itemStyle\\\":{\\\"color\\\":\\\"\\\"}}],\\\"isRadius\\\":false,\\\"roseType\\\":\\\"\\\",\\\"notCount\\\":false,\\\"center\\\":[\\\"180\\\",\\\"100\\\"],\\\"name\\\":\\\"\\\",\\\"minAngle\\\":0,\\\"label\\\":{\\\"show\\\":false,\\\"position\\\":\\\"outside\\\",\\\"textStyle\\\":{\\\"fontSize\\\":\\\"10\\\",\\\"fontWeight\\\":\\\"bolder\\\"}},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":\\\"52%\\\",\\\"autoSort\\\":false}],\\\"tooltip\\\":{\\\"formatter\\\":\\\"{b} : {c}\\\",\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"show\\\":true,\\\"top\\\":10,\\\"text\\\":\\\"不同装修类型销售销量\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#ffffff\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"fontSize\\\":\\\"14\\\"},\\\"left\\\":\\\"left\\\",\\\"padding\\\":[5,20,5,10]}}\",\"url\":\"\",\"extData\":{\"dataType\":\"api\",\"apiStatus\":\"1\",\"dataId\":\"1331878107552010242\",\"axisX\":\"name\",\"axisY\":\"value\",\"series\":\"type\",\"yText\":\"\",\"xText\":\"\",\"dbCode\":\"zhuangxiu\",\"chartType\":\"pie.simple\",\"isTiming\":true,\"intervalTime\":\"5\",\"id\":\"rQgkcYfLy4x0EP6h\"},\"layer_id\":\"rQgkcYfLy4x0EP6h\",\"offsetX\":0,\"offsetY\":0,\"backgroud\":{\"enabled\":false,\"color\":\"#fff\",\"image\":\"\"},\"virtualCellRange\":[[16,8],[16,9],[16,10],[16,11]]}],\"area\":false,\"excel_config_id\":\"1331503965770223616\",\"printConfig\":{\"paper\":\"A3\",\"width\":297,\"height\":420,\"definition\":1,\"isBackend\":false,\"marginX\":10,\"marginY\":10,\"layout\":\"landscape\"},\"rows\":{\"0\":{\"cells\":{\"0\":{\"text\":\"\"},\"1\":{\"style\":60,\"merge\":[0,13],\"text\":\"房屋销售综合展示大屏\"}},\"height\":113},\"1\":{\"cells\":{\"1\":{\"merge\":[14,2],\"style\":43,\"text\":\" \",\"virtual\":\"5ggWQtDUvSopC4iL\"},\"2\":{\"text\":\" \",\"virtual\":\"5ggWQtDUvSopC4iL\"},\"3\":{\"text\":\" \",\"virtual\":\"5ggWQtDUvSopC4iL\"},\"4\":{\"style\":53,\"text\":\"成交量:\",\"merge\":[2,0],\"virtual\":\"5ggWQtDUvSopC4iL\"},\"5\":{\"text\":\"#{qingkuang.cjl}\",\"style\":64,\"merge\":[2,0]},\"7\":{\"style\":53,\"text\":\"成交金额:\",\"merge\":[2,0]},\"8\":{\"text\":\"#{qingkuang.cjje}\",\"style\":68,\"merge\":[2,0]},\"10\":{\"style\":53,\"text\":\"销售面积:\",\"merge\":[2,0]},\"11\":{\"text\":\"#{qingkuang.xsmj}\",\"style\":64,\"merge\":[2,0]},\"12\":{\"text\":\" \",\"virtual\":\"nk6I2RCefm9scS1k\"},\"13\":{\"text\":\" \",\"virtual\":\"nk6I2RCefm9scS1k\"},\"14\":{\"text\":\" \",\"virtual\":\"nk6I2RCefm9scS1k\"},\"15\":{\"text\":\" \",\"virtual\":\"nk6I2RCefm9scS1k\"}},\"isDrag\":true},\"2\":{\"cells\":{\"12\":{\"text\":\" \"},\"13\":{\"text\":\" \"},\"14\":{\"text\":\" \"}}},\"3\":{\"cells\":{\"12\":{\"text\":\" \"},\"13\":{\"text\":\" \"},\"14\":{\"text\":\" \"}}},\"4\":{\"cells\":{\"4\":{\"style\":58,\"text\":\"成交均价:\",\"merge\":[2,0]},\"5\":{\"text\":\"#{qingkuang.cjjj}\",\"style\":65,\"merge\":[2,0]},\"7\":{\"style\":58,\"text\":\"售房佣金:\",\"merge\":[2,0]},\"8\":{\"text\":\"#{qingkuang.sfyj}\",\"style\":65,\"merge\":[2,0]},\"10\":{\"style\":58,\"text\":\"预定客户:\",\"merge\":[2,0]},\"11\":{\"text\":\"#{qingkuang.ydkh}\",\"style\":65,\"merge\":[2,0]},\"12\":{\"text\":\" \"},\"13\":{\"text\":\" \"},\"14\":{\"text\":\" \"}},\"isDrag\":true,\"height\":25},\"5\":{\"cells\":{\"12\":{\"text\":\" \"},\"13\":{\"text\":\" \"},\"14\":{\"text\":\" \"}}},\"6\":{\"cells\":{\"12\":{\"text\":\" \"},\"13\":{\"text\":\" \"},\"14\":{\"text\":\" \"}}},\"7\":{\"cells\":{\"4\":{\"text\":\" \",\"virtual\":\"Nf6Xud4fZqEfvQw4\"},\"5\":{\"text\":\" \",\"virtual\":\"Nf6Xud4fZqEfvQw4\"},\"6\":{\"text\":\" \",\"virtual\":\"Nf6Xud4fZqEfvQw4\"},\"7\":{\"text\":\" \",\"virtual\":\"Nf6Xud4fZqEfvQw4\"},\"8\":{\"text\":\" \",\"virtual\":\"Nf6Xud4fZqEfvQw4\"},\"9\":{\"text\":\" \",\"virtual\":\"Nf6Xud4fZqEfvQw4\"},\"10\":{\"text\":\" \",\"virtual\":\"Nf6Xud4fZqEfvQw4\"},\"11\":{\"text\":\" \",\"virtual\":\"Nf6Xud4fZqEfvQw4\"},\"12\":{\"text\":\" \",\"virtual\":\"MCJP8uqwe57YoCvF\"},\"13\":{\"text\":\" \",\"virtual\":\"MCJP8uqwe57YoCvF\"},\"14\":{\"text\":\" \",\"virtual\":\"MCJP8uqwe57YoCvF\"},\"15\":{\"text\":\" \",\"virtual\":\"MCJP8uqwe57YoCvF\"}}},\"8\":{\"cells\":{\"4\":{\"text\":\" \"},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"text\":\" \"},\"13\":{\"text\":\" \"},\"14\":{\"text\":\" \"}}},\"9\":{\"cells\":{\"4\":{\"text\":\" \"},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"text\":\" \"},\"13\":{\"text\":\" \"},\"14\":{\"text\":\" \"}}},\"10\":{\"cells\":{\"4\":{\"text\":\" \"},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"text\":\" \"},\"13\":{\"text\":\" \"},\"14\":{\"text\":\" \"}}},\"11\":{\"cells\":{\"4\":{\"text\":\" \"},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"text\":\" \"},\"13\":{\"text\":\" \"},\"14\":{\"text\":\" \"}}},\"12\":{\"cells\":{\"4\":{\"text\":\" \"},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"text\":\" \"},\"13\":{\"text\":\" \"},\"14\":{\"text\":\" \"}}},\"13\":{\"cells\":{\"4\":{\"text\":\" \"},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"text\":\" \"},\"13\":{\"text\":\" \"},\"14\":{\"text\":\" \"}}},\"14\":{\"cells\":{\"4\":{\"text\":\" \"},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"text\":\" \"},\"13\":{\"text\":\" \"},\"14\":{\"text\":\" \"}}},\"15\":{\"cells\":{\"4\":{\"text\":\" \"},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"text\":\" \"},\"13\":{\"text\":\" \"},\"14\":{\"text\":\" \"}}},\"16\":{\"cells\":{\"1\":{\"style\":43,\"text\":\" \",\"merge\":[7,2],\"virtual\":\"Cror94F1kmbP71ip\"},\"2\":{\"text\":\" \",\"virtual\":\"Cror94F1kmbP71ip\"},\"3\":{\"text\":\" \",\"virtual\":\"Cror94F1kmbP71ip\"},\"4\":{\"text\":\" \",\"virtual\":\"pBOwp0Q0g4iuJCVm\"},\"5\":{\"text\":\" \",\"virtual\":\"pBOwp0Q0g4iuJCVm\"},\"6\":{\"text\":\" \",\"virtual\":\"pBOwp0Q0g4iuJCVm\"},\"7\":{\"text\":\" \",\"virtual\":\"pBOwp0Q0g4iuJCVm\"},\"8\":{\"text\":\" \",\"virtual\":\"rQgkcYfLy4x0EP6h\"},\"9\":{\"text\":\" \",\"virtual\":\"rQgkcYfLy4x0EP6h\"},\"10\":{\"text\":\" \",\"virtual\":\"rQgkcYfLy4x0EP6h\"},\"11\":{\"text\":\" \",\"virtual\":\"rQgkcYfLy4x0EP6h\"},\"12\":{\"text\":\" \",\"virtual\":\"IWoBtyiRxjkEbkfD\"},\"13\":{\"text\":\" \",\"virtual\":\"IWoBtyiRxjkEbkfD\"},\"14\":{\"text\":\" \",\"virtual\":\"IWoBtyiRxjkEbkfD\"},\"15\":{\"text\":\" \",\"virtual\":\"IWoBtyiRxjkEbkfD\"}}},\"17\":{\"cells\":{\"4\":{\"text\":\" \"},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"text\":\" \"},\"13\":{\"text\":\" \"},\"14\":{\"text\":\" \"}}},\"18\":{\"cells\":{\"4\":{\"text\":\" \"},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"text\":\" \"},\"13\":{\"text\":\" \"},\"14\":{\"text\":\" \"}}},\"19\":{\"cells\":{\"4\":{\"text\":\" \"},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"text\":\" \"},\"13\":{\"text\":\" \"},\"14\":{\"text\":\" \"}}},\"20\":{\"cells\":{\"4\":{\"text\":\" \"},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"text\":\" \"},\"13\":{\"text\":\" \"},\"14\":{\"text\":\" \"}}},\"21\":{\"cells\":{\"4\":{\"text\":\" \"},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"text\":\" \"},\"13\":{\"text\":\" \"},\"14\":{\"text\":\" \"}}},\"22\":{\"cells\":{\"4\":{\"text\":\" \"},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"text\":\" \"},\"13\":{\"text\":\" \"},\"14\":{\"text\":\" \"}}},\"23\":{\"cells\":{\"4\":{\"text\":\" \"},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"text\":\" \"},\"13\":{\"text\":\" \"},\"14\":{\"text\":\" \"}}},\"24\":{\"cells\":{\"1\":{\"text\":\" \"},\"2\":{\"text\":\" \"},\"3\":{\"text\":\" \"},\"4\":{\"text\":\" \"},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"text\":\" \"},\"13\":{\"text\":\" \"},\"14\":{\"text\":\" \"}}},\"len\":98},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":794,\"heightPx\":1047},\"dicts\":[],\"freeze\":\"A1\",\"dataRectWidth\":1463,\"displayConfig\":{},\"background\":{\"path\":\"https://static.jeecg.com/designreport/images/bg_1606961893275.png\",\"repeat\":\"repeat\",\"width\":\"\",\"height\":\"\"},\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"font\":{\"bold\":true}},{\"font\":{\"bold\":true,\"name\":\"宋体\"}},{\"font\":{\"name\":\"宋体\"}},{\"font\":{\"bold\":true,\"name\":\"Microsoft YaHei\"}},{\"font\":{\"name\":\"Microsoft YaHei\"}},{\"font\":{\"bold\":true,\"name\":\"Microsoft YaHei\",\"size\":18}},{\"font\":{\"name\":\"Microsoft YaHei\",\"size\":18}},{\"font\":{\"bold\":true,\"name\":\"Microsoft YaHei\",\"size\":16}},{\"font\":{\"name\":\"Microsoft YaHei\",\"size\":16}},{\"font\":{\"bold\":true,\"name\":\"Microsoft YaHei\",\"size\":16},\"align\":\"center\"},{\"font\":{\"name\":\"Microsoft YaHei\",\"size\":16},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]}},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"align\":\"right\"},{\"align\":\"right\"},{\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"align\":\"right\",\"font\":{\"size\":14}},{\"align\":\"right\",\"font\":{\"size\":14}},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"align\":\"right\",\"font\":{\"size\":12}},{\"align\":\"right\",\"font\":{\"size\":12}},{\"align\":\"center\",\"font\":{\"size\":12}},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"align\":\"center\",\"font\":{\"size\":12}},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"font\":{\"size\":12}},{\"font\":{\"size\":12}},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"align\":\"right\",\"font\":{\"size\":11}},{\"align\":\"right\",\"font\":{\"size\":11}},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"align\":\"center\",\"font\":{\"size\":11}},{\"align\":\"center\",\"font\":{\"size\":11}},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"font\":{\"size\":11}},{\"font\":{\"size\":11}},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"align\":\"right\",\"font\":{\"size\":11,\"bold\":true}},{\"align\":\"right\",\"font\":{\"size\":11,\"bold\":true}},{\"font\":{\"bold\":true,\"name\":\"Microsoft YaHei\",\"size\":16},\"align\":\"center\",\"color\":\"#ffffff\"},{\"color\":\"#ffffff\"},{\"font\":{\"bold\":true,\"name\":\"Microsoft YaHei\",\"size\":22},\"align\":\"center\",\"color\":\"#ffffff\"},{\"color\":\"#ffffff\",\"font\":{\"size\":22}},{\"font\":{\"bold\":true,\"name\":\"Microsoft YaHei\",\"size\":22},\"align\":\"center\",\"color\":\"#000100\"},{\"color\":\"#000100\",\"font\":{\"size\":22}},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"align\":\"right\",\"font\":{\"size\":11,\"bold\":true},\"color\":\"#ffffff\"},{\"align\":\"right\",\"font\":{\"size\":11,\"bold\":true},\"color\":\"#ffffff\"},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"align\":\"center\",\"font\":{\"size\":11},\"color\":\"#ffffff\"},{\"align\":\"center\",\"font\":{\"size\":11},\"color\":\"#ffffff\"},{\"font\":{\"size\":11},\"color\":\"#ffffff\"},{},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"align\":\"right\",\"font\":{\"size\":11,\"bold\":false},\"color\":\"#ffffff\"},{\"align\":\"right\",\"font\":{\"size\":11,\"bold\":false},\"color\":\"#ffffff\"},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"align\":\"right\",\"font\":{\"size\":11,\"bold\":true,\"name\":\"宋体\"},\"color\":\"#ffffff\"},{\"align\":\"right\",\"font\":{\"size\":11,\"bold\":true,\"name\":\"宋体\"},\"color\":\"#ffffff\"},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"align\":\"right\",\"font\":{\"size\":11,\"bold\":false,\"name\":\"宋体\"},\"color\":\"#ffffff\"},{\"align\":\"right\",\"font\":{\"size\":11,\"bold\":false,\"name\":\"宋体\"},\"color\":\"#ffffff\"},{\"align\":\"center\",\"font\":{\"size\":11},\"color\":\"#ffffff\",\"border\":{\"right\":[\"thin\",\"#eee\"]}},{\"align\":\"right\",\"font\":{\"size\":16,\"bold\":false,\"name\":\"宋体\"},\"color\":\"#ffffff\"},{\"align\":\"right\",\"font\":{\"size\":15,\"bold\":false,\"name\":\"宋体\"},\"color\":\"#ffffff\"},{\"align\":\"right\",\"font\":{\"size\":14,\"bold\":false,\"name\":\"宋体\"},\"color\":\"#ffffff\"},{\"align\":\"center\",\"font\":{\"size\":14},\"color\":\"#ffffff\"},{\"font\":{\"size\":14},\"color\":\"#ffffff\"},{\"align\":\"left\",\"font\":{\"size\":14},\"color\":\"#ffffff\"},{\"align\":\"left\",\"font\":{\"size\":14,\"bold\":false,\"name\":\"宋体\"},\"color\":\"#ffffff\"},{\"align\":\"right\",\"font\":{\"size\":14,\"bold\":false,\"name\":\"宋体\"},\"color\":\"#ffffff\",\"valign\":\"top\"},{\"align\":\"left\",\"font\":{\"size\":14},\"color\":\"#ffffff\",\"valign\":\"top\"},{\"font\":{\"bold\":true,\"name\":\"宋体\",\"size\":22},\"align\":\"center\",\"color\":\"#ffffff\"},{\"color\":\"#ffffff\",\"font\":{\"size\":22,\"name\":\"宋体\"}},{\"align\":\"left\",\"font\":{\"size\":14,\"name\":\"宋体\"},\"color\":\"#ffffff\",\"valign\":\"top\"},{\"align\":\"left\",\"font\":{\"size\":14,\"name\":\"宋体\"},\"color\":\"#ffffff\"},{\"align\":\"left\",\"font\":{\"size\":14,\"name\":\"宋体\"},\"color\":\"#ffff01\"},{\"align\":\"left\",\"font\":{\"size\":14,\"name\":\"宋体\"},\"color\":\"#ffff01\",\"valign\":\"top\"},{\"align\":\"left\",\"font\":{\"size\":14,\"name\":\"宋体\"},\"color\":\"#ffffff\",\"bgcolor\":\"#ffff01\"},{\"align\":\"left\",\"font\":{\"size\":14,\"name\":\"宋体\"},\"color\":\"#ffffff\",\"bgcolor\":\"\"},{\"align\":\"left\",\"font\":{\"size\":14,\"name\":\"宋体\"},\"color\":\"#ffff01\",\"bgcolor\":\"\"}],\"validations\":[],\"cols\":{\"0\":{\"width\":34},\"3\":{\"width\":140},\"4\":{\"width\":136},\"5\":{\"width\":79},\"6\":{\"width\":1},\"7\":{\"width\":123},\"8\":{\"width\":102},\"9\":{\"width\":24},\"11\":{\"width\":100},\"14\":{\"width\":124},\"len\":50},\"merges\":[\"B1:O1\",\"B2:D16\",\"E2:E4\",\"F2:F4\",\"H2:H4\",\"I2:I4\",\"K2:K4\",\"L2:L4\",\"E5:E7\",\"F5:F7\",\"H5:H7\",\"I5:I7\",\"K5:K7\",\"L5:L7\",\"B17:D24\"]}', NULL, 'https://static.jeecg.com/designreport/images/QQ截图20201125161646_1606705892603.png', 'admin', '2020-11-25 15:50:43', 'admin', '2021-07-13 10:05:37', 0, NULL, NULL, 1, 713, NULL, NULL, NULL); +INSERT INTO `jimu_report` VALUES ('1334378897302753280', '20201203140834', '区域销售表', NULL, NULL, 'datainfo', '{\"loopBlockList\":[],\"area\":false,\"printElWidth\":718,\"excel_config_id\":\"1334378897302753280\",\"printElHeight\":1047,\"rows\":{\"0\":{\"cells\":{\"1\":{\"text\":\"区域销售表\",\"merge\":[0,22],\"style\":10},\"2\":{\"style\":10},\"3\":{\"style\":10},\"4\":{\"style\":10},\"5\":{\"style\":10},\"6\":{\"style\":10},\"7\":{\"style\":10},\"8\":{\"style\":10},\"9\":{\"style\":10},\"10\":{\"style\":10},\"11\":{\"style\":10},\"12\":{\"style\":10},\"13\":{\"style\":10},\"14\":{\"style\":10},\"15\":{\"style\":10},\"16\":{\"style\":10},\"17\":{\"style\":10},\"18\":{\"style\":10},\"19\":{\"style\":10},\"20\":{\"style\":10},\"21\":{\"style\":10},\"22\":{\"style\":10},\"23\":{\"style\":10}},\"height\":72},\"1\":{\"cells\":{\"0\":{\"style\":64},\"1\":{\"text\":\"区域\",\"merge\":[1,0],\"style\":65},\"2\":{\"text\":\"省份\",\"merge\":[1,0],\"style\":65},\"3\":{\"text\":\"1月\",\"merge\":[0,2],\"style\":65},\"4\":{\"style\":66,\"text\":\" \"},\"5\":{\"style\":66,\"text\":\" \"},\"6\":{\"text\":\"2月\",\"merge\":[0,2],\"style\":65},\"7\":{\"style\":66,\"text\":\" \"},\"8\":{\"style\":66,\"text\":\" \"},\"9\":{\"text\":\"3月\",\"merge\":[0,2],\"style\":65},\"10\":{\"style\":66,\"text\":\" \"},\"11\":{\"style\":66,\"text\":\" \"},\"12\":{\"text\":\"4月\",\"merge\":[0,2],\"style\":65},\"13\":{\"style\":66,\"text\":\" \"},\"14\":{\"style\":66,\"text\":\" \"},\"15\":{\"text\":\"5月\",\"merge\":[0,2],\"style\":65},\"16\":{\"style\":66,\"text\":\" \"},\"17\":{\"style\":66,\"text\":\" \"},\"18\":{\"text\":\"6月\",\"merge\":[0,2],\"style\":65},\"19\":{\"style\":66,\"text\":\" \"},\"20\":{\"style\":66,\"text\":\" \"},\"21\":{\"text\":\"总合计\",\"merge\":[0,2],\"style\":65},\"22\":{\"style\":66,\"text\":\" \"},\"23\":{\"style\":66,\"text\":\" \"},\"24\":{\"style\":64},\"25\":{\"style\":64}},\"height\":22},\"2\":{\"cells\":{\"0\":{\"style\":64},\"1\":{\"style\":66,\"text\":\" \"},\"2\":{\"style\":65,\"text\":\" \"},\"3\":{\"text\":\"销售额\",\"style\":65},\"4\":{\"text\":\"搭赠\",\"style\":65},\"5\":{\"text\":\"比例\",\"style\":65},\"6\":{\"text\":\"销售额\",\"style\":65},\"7\":{\"text\":\"搭赠\",\"style\":65},\"8\":{\"text\":\"比例\",\"style\":65},\"9\":{\"text\":\"销售额\",\"style\":65},\"10\":{\"text\":\"搭赠\",\"style\":65},\"11\":{\"text\":\"比例\",\"style\":65},\"12\":{\"text\":\"销售额\",\"style\":65},\"13\":{\"text\":\"搭赠\",\"style\":65},\"14\":{\"text\":\"比例\",\"style\":65},\"15\":{\"text\":\"销售额\",\"style\":65},\"16\":{\"text\":\"搭赠\",\"style\":65},\"17\":{\"text\":\"比例\",\"style\":65},\"18\":{\"text\":\"销售额\",\"style\":65},\"19\":{\"text\":\"搭赠\",\"style\":65},\"20\":{\"text\":\"比例\",\"style\":65},\"21\":{\"text\":\"销售额\",\"style\":65},\"22\":{\"text\":\"搭赠\",\"style\":65},\"23\":{\"text\":\"比例\",\"style\":65},\"24\":{\"style\":64},\"25\":{\"style\":64}},\"height\":24},\"3\":{\"cells\":{\"0\":{\"style\":67},\"1\":{\"text\":\"#{quyuxiaoshou.group(region)}\",\"style\":52,\"aggregate\":\"group\"},\"2\":{\"text\":\"#{quyuxiaoshou.province}\",\"style\":53},\"3\":{\"text\":\"#{quyuxiaoshou.sales_1}\",\"style\":17},\"4\":{\"text\":\"#{quyuxiaoshou.gift_1}\",\"style\":17},\"5\":{\"text\":\"#{quyuxiaoshou.proportion_1}\",\"style\":17},\"6\":{\"text\":\"#{quyuxiaoshou.sales_2}\",\"style\":17},\"7\":{\"text\":\"#{quyuxiaoshou.gift_2}\",\"style\":17},\"8\":{\"text\":\"#{quyuxiaoshou.proportion_2}\",\"style\":17},\"9\":{\"text\":\"#{quyuxiaoshou.sales_3}\",\"style\":17},\"10\":{\"text\":\"#{quyuxiaoshou.gift_3}\",\"style\":17},\"11\":{\"text\":\"#{quyuxiaoshou.proportion_3}\",\"style\":17},\"12\":{\"text\":\"#{quyuxiaoshou.sales_4}\",\"style\":17},\"13\":{\"text\":\"#{quyuxiaoshou.gift_4}\",\"style\":17},\"14\":{\"text\":\"#{quyuxiaoshou.proportion_4}\",\"style\":17},\"15\":{\"text\":\"#{quyuxiaoshou.sales_5}\",\"style\":17},\"16\":{\"text\":\"#{quyuxiaoshou.gift_5}\",\"style\":17},\"17\":{\"text\":\"#{quyuxiaoshou.proportion_5}\",\"style\":15},\"18\":{\"text\":\"#{quyuxiaoshou.sales_6}\",\"style\":15},\"19\":{\"text\":\"#{quyuxiaoshou.gift_6}\",\"style\":15},\"20\":{\"text\":\"#{quyuxiaoshou.proportion_6}\",\"style\":15},\"21\":{\"text\":\"#{quyuxiaoshou.sales_z}\",\"style\":15},\"22\":{\"text\":\"#{quyuxiaoshou.gift_z}\",\"style\":15},\"23\":{\"text\":\"#{quyuxiaoshou.proportion_z}\",\"style\":15},\"24\":{\"style\":67},\"25\":{\"style\":67}},\"isDrag\":true,\"height\":56},\"4\":{\"cells\":{\"0\":{\"style\":64},\"1\":{\"style\":39,\"text\":\"总计\",\"merge\":[0,1]},\"3\":{\"style\":68,\"text\":\"=SUM(D4)\"},\"4\":{\"style\":69,\"text\":\"=SUM(E4)\"},\"5\":{\"style\":70,\"text\":\"=SUM(F4)\"},\"6\":{\"style\":69,\"text\":\"=SUM(G4)\"},\"7\":{\"style\":69,\"text\":\"=SUM(H4)\"},\"8\":{\"style\":70,\"text\":\"=SUM(I4)\"},\"9\":{\"style\":69,\"text\":\"=SUM(J4)\"},\"10\":{\"style\":69,\"text\":\"=SUM(K4)\"},\"11\":{\"style\":70,\"text\":\"=SUM(L4)\"},\"12\":{\"style\":69,\"text\":\"=SUM(M4)\"},\"13\":{\"style\":69,\"text\":\"=SUM(N4)\"},\"14\":{\"style\":70,\"text\":\"=SUM(O4)\"},\"15\":{\"style\":69,\"text\":\"=SUM(P4)\"},\"16\":{\"style\":69,\"text\":\"=SUM(Q4)\"},\"17\":{\"style\":70,\"text\":\"=SUM(R4)\"},\"18\":{\"style\":69,\"text\":\"=SUM(S4)\"},\"19\":{\"style\":69,\"text\":\"=SUM(T4)\"},\"20\":{\"style\":70,\"text\":\"=SUM(U4)\"},\"21\":{\"style\":69,\"text\":\"=SUM(V4)\"},\"22\":{\"style\":69,\"text\":\"=SUM(W4)\"},\"23\":{\"style\":69,\"text\":\"=SUM(X4)\"},\"24\":{\"style\":64},\"25\":{\"style\":64}},\"height\":38},\"len\":100},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":718,\"heightPx\":1047},\"dicts\":[],\"groupField\":\"quyuxiaoshou.region\",\"freeze\":\"A1\",\"dataRectWidth\":1554,\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"align\":\"center\"},{\"align\":\"center\",\"bgcolor\":\"\"},{\"align\":\"center\",\"bgcolor\":\"#02a274\"},{\"align\":\"center\",\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\"},{\"bgcolor\":\"#02a274\"},{\"align\":\"center\",\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"bfbfbf\"],\"top\":[\"thin\",\"bfbfbf\"],\"left\":[\"thin\",\"bfbfbf\"],\"right\":[\"thin\",\"bfbfbf\"]}},{\"border\":{\"bottom\":[\"thin\",\"bfbfbf\"],\"top\":[\"thin\",\"bfbfbf\"],\"left\":[\"thin\",\"bfbfbf\"],\"right\":[\"thin\",\"bfbfbf\"]}},{\"align\":\"center\",\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"align\":\"center\",\"font\":{\"size\":16}},{\"align\":\"center\",\"font\":{\"size\":16,\"bold\":true}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8,\"name\":\"宋体\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8,\"name\":\"隶书\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8,\"name\":\"Microsoft YaHei\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"color\":\"#7f7f7f\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"color\":\"#262626\"},{\"align\":\"center\",\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"bold\":true}},{\"align\":\"center\",\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"font\":{\"bold\":true}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"color\":\"#262626\",\"bgcolor\":\"#\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"color\":\"#262626\",\"bgcolor\":\"#f1f9f6\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"color\":\"#262626\",\"bgcolor\":\"#ddefe8\"},{\"align\":\"center\",\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"bold\":true,\"size\":9}},{\"align\":\"center\",\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"font\":{\"bold\":true,\"size\":9}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8,\"name\":\"华文中宋\"},\"align\":\"center\",\"color\":\"#262626\",\"bgcolor\":\"#f1f9f6\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8,\"name\":\"Arial\"},\"align\":\"center\",\"color\":\"#262626\",\"bgcolor\":\"#f1f9f6\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":10}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8},\"bgcolor\":\"#\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"color\":\"#262626\",\"bgcolor\":\"#aedac8\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8},\"bgcolor\":\"#aedac8\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#aedac8\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8},\"bgcolor\":\"#aedac8\",\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8},\"bgcolor\":\"#aedac8\",\"align\":\"center\",\"format\":\"number\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8},\"bgcolor\":\"#aedac8\",\"align\":\"center\",\"format\":\"normal\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#aedac8\",\"align\":\"center\"},{\"align\":\"center\",\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"bold\":false,\"size\":9}},{\"align\":\"center\",\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"font\":{\"bold\":false,\"size\":9}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":10,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"color\":\"#262626\",\"bgcolor\":\"#aedac8\"},{\"font\":{\"size\":10}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":10},\"bgcolor\":\"#aedac8\",\"align\":\"center\",\"format\":\"normal\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":10},\"bgcolor\":\"#aedac8\",\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#aedac8\",\"font\":{\"size\":10}},{\"font\":{\"size\":10},\"bgcolor\":\"#aedac8\"},{\"align\":\"center\",\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"bold\":false,\"size\":10}},{\"align\":\"center\",\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"font\":{\"bold\":false,\"size\":10}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":10,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"color\":\"#262626\",\"bgcolor\":\"#f1f9f6\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":10,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"color\":\"#262626\",\"bgcolor\":\"#ddefe8\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":10,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"color\":\"#262626\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":10,\"name\":\"Microsoft YaHei\"},\"align\":\"center\"},{\"font\":{\"size\":8}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"color\":\"#262626\",\"bgcolor\":\"#f1f9f6\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"color\":\"#262626\",\"bgcolor\":\"#ddefe8\"},{\"align\":\"center\",\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"bold\":false,\"size\":10,\"name\":\"宋体\"}},{\"align\":\"center\",\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"font\":{\"bold\":false,\"size\":10,\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9,\"name\":\"宋体\"},\"align\":\"center\",\"color\":\"#262626\",\"bgcolor\":\"#f1f9f6\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9,\"name\":\"宋体\"},\"align\":\"center\",\"color\":\"#262626\",\"bgcolor\":\"#ddefe8\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8,\"name\":\"宋体\"},\"align\":\"center\",\"color\":\"#262626\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":10,\"name\":\"宋体\"},\"align\":\"center\",\"color\":\"#262626\",\"bgcolor\":\"#aedac8\"},{\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":10,\"name\":\"宋体\"},\"bgcolor\":\"#aedac8\",\"align\":\"center\",\"format\":\"normal\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":10,\"name\":\"宋体\"},\"bgcolor\":\"#aedac8\",\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#aedac8\",\"font\":{\"size\":10,\"name\":\"宋体\"}},{\"font\":{\"name\":\"Microsoft YaHei\"}},{\"align\":\"center\",\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"bold\":false,\"size\":10,\"name\":\"Microsoft YaHei\"}},{\"align\":\"center\",\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"font\":{\"bold\":false,\"size\":10,\"name\":\"Microsoft YaHei\"}},{\"font\":{\"size\":8,\"name\":\"Microsoft YaHei\"}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":10,\"name\":\"Microsoft YaHei\"},\"bgcolor\":\"#aedac8\",\"align\":\"center\",\"format\":\"normal\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":10,\"name\":\"Microsoft YaHei\"},\"bgcolor\":\"#aedac8\",\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#aedac8\",\"font\":{\"size\":10,\"name\":\"Microsoft YaHei\"}}],\"validations\":[],\"isGroup\":true,\"cols\":{\"0\":{\"width\":20},\"1\":{\"width\":84},\"2\":{\"width\":81},\"3\":{\"width\":75},\"4\":{\"width\":63},\"5\":{\"width\":59},\"6\":{\"width\":70},\"7\":{\"width\":57},\"8\":{\"width\":60},\"9\":{\"width\":75},\"10\":{\"width\":66},\"11\":{\"width\":64},\"12\":{\"width\":70},\"13\":{\"width\":61},\"14\":{\"width\":61},\"15\":{\"width\":70},\"16\":{\"width\":58},\"17\":{\"width\":63},\"18\":{\"width\":60},\"19\":{\"width\":63},\"20\":{\"width\":59},\"21\":{\"width\":73},\"22\":{\"width\":69},\"23\":{\"width\":73},\"len\":50},\"merges\":[\"B2:B3\",\"C2:C3\",\"D2:F2\",\"G2:I2\",\"J2:L2\",\"M2:O2\",\"P2:R2\",\"S2:U2\",\"V2:X2\",\"B1:X1\",\"B5:C5\"]}', NULL, 'https://static.jeecg.com/designreport/images/quyu_1607069899537.png', 'admin', '2020-12-03 14:08:34', 'admin', '2021-07-13 05:39:14', 0, NULL, NULL, 1, 444, NULL, NULL, NULL); +INSERT INTO `jimu_report` VALUES ('1334420681185566722', '202012031408346166', '学校经费一览表', NULL, NULL, 'datainfo', '{\"loopBlockList\":[],\"area\":{\"sri\":7,\"sci\":1,\"eri\":7,\"eci\":2,\"width\":216,\"height\":25},\"printElWidth\":718,\"excel_config_id\":\"1334420681185566722\",\"printElHeight\":1047,\"rows\":{\"0\":{\"cells\":{\"1\":{\"text\":\"学校经费一览表\",\"merge\":[0,22],\"style\":10},\"2\":{\"style\":10},\"3\":{\"style\":10},\"4\":{\"style\":10},\"5\":{\"style\":10},\"6\":{\"style\":10},\"7\":{\"style\":10},\"8\":{\"style\":10},\"9\":{\"style\":10},\"10\":{\"style\":10},\"11\":{\"style\":10},\"12\":{\"style\":10},\"13\":{\"style\":10},\"14\":{\"style\":10},\"15\":{\"style\":10},\"16\":{\"style\":10},\"17\":{\"style\":10},\"18\":{\"style\":10},\"19\":{\"style\":10},\"20\":{\"style\":10},\"21\":{\"style\":10},\"22\":{\"style\":10},\"23\":{\"style\":10}},\"height\":72},\"1\":{\"cells\":{\"1\":{\"text\":\"学校类别\",\"style\":221,\"merge\":[4,0]},\"2\":{\"merge\":[4,0],\"style\":222,\"text\":\"学校名称\"},\"3\":{\"text\":\"财政教育经费投入(万元)\",\"merge\":[0,8],\"style\":84},\"4\":{\"style\":40,\"text\":\" \"},\"5\":{\"style\":40,\"text\":\" \"},\"6\":{\"style\":40,\"text\":\" \"},\"7\":{\"style\":40,\"text\":\" \"},\"8\":{\"style\":40,\"text\":\" \"},\"9\":{\"style\":40,\"text\":\" \"},\"10\":{\"style\":40,\"text\":\" \"},\"11\":{\"style\":40,\"text\":\" \"},\"12\":{\"text\":\"其他投入\",\"merge\":[0,7],\"style\":84},\"13\":{\"text\":\" \",\"style\":40},\"14\":{\"text\":\" \",\"style\":40},\"15\":{\"text\":\" \",\"style\":40},\"16\":{\"text\":\" \",\"style\":40},\"17\":{\"text\":\" \",\"style\":40},\"18\":{\"text\":\" \",\"style\":40},\"19\":{\"text\":\" \",\"style\":40},\"20\":{\"style\":84,\"text\":\"补充资料\",\"merge\":[0,4]},\"21\":{\"text\":\" \",\"style\":40},\"22\":{\"text\":\" \",\"style\":40},\"23\":{\"text\":\" \",\"style\":40},\"24\":{\"text\":\" \",\"style\":40}},\"height\":28},\"2\":{\"cells\":{\"1\":{\"text\":\" \",\"style\":40},\"2\":{\"style\":222,\"text\":\" \"},\"3\":{\"text\":\"总计\",\"style\":117,\"merge\":[3,0]},\"4\":{\"text\":\"教育事业费\",\"style\":117,\"merge\":[0,6]},\"5\":{\"style\":118,\"text\":\" \"},\"6\":{\"style\":118,\"text\":\" \"},\"7\":{\"style\":118,\"text\":\" \"},\"8\":{\"style\":118,\"text\":\" \"},\"9\":{\"style\":118,\"text\":\" \"},\"10\":{\"style\":118,\"text\":\" \"},\"11\":{\"text\":\"基础拨款\",\"style\":117,\"merge\":[3,0]},\"12\":{\"text\":\"村投入\",\"style\":117,\"merge\":[0,4]},\"13\":{\"text\":\" \",\"style\":223},\"14\":{\"text\":\" \",\"style\":223},\"15\":{\"text\":\" \",\"style\":223},\"16\":{\"text\":\" \",\"style\":223},\"17\":{\"text\":\"社会捐款\",\"style\":117,\"merge\":[0,2]},\"18\":{\"text\":\" \",\"style\":223},\"19\":{\"text\":\" \",\"style\":223},\"20\":{\"style\":126,\"merge\":[0,4],\"text\":\"信息化建设\"},\"21\":{\"style\":122,\"text\":\" \"},\"22\":{\"style\":122,\"text\":\" \"},\"23\":{\"style\":122,\"text\":\" \"},\"24\":{\"style\":122,\"text\":\" \"}},\"height\":24},\"3\":{\"cells\":{\"1\":{\"text\":\" \",\"style\":40},\"2\":{\"style\":222,\"text\":\" \"},\"3\":{\"style\":118,\"text\":\" \"},\"4\":{\"merge\":[0,1],\"text\":\"合计\",\"style\":121},\"5\":{\"style\":122,\"text\":\" \"},\"6\":{\"merge\":[2,0],\"text\":\"人员经费\",\"style\":121},\"7\":{\"merge\":[2,0],\"text\":\"日常公用费用\",\"style\":123},\"8\":{\"merge\":[0,2],\"text\":\"项目经费\",\"style\":121},\"9\":{\"style\":122,\"text\":\" \"},\"10\":{\"style\":122,\"text\":\" \"},\"11\":{\"style\":118,\"text\":\" \"},\"12\":{\"merge\":[2,0],\"text\":\"合计\",\"style\":121},\"13\":{\"merge\":[0,3],\"text\":\"其中\",\"style\":121},\"14\":{\"text\":\" \",\"style\":223},\"15\":{\"text\":\" \",\"style\":223},\"16\":{\"text\":\" \",\"style\":223},\"17\":{\"merge\":[2,0],\"text\":\"合计\",\"style\":121},\"18\":{\"merge\":[0,1],\"text\":\"其中\",\"style\":121},\"19\":{\"style\":122,\"text\":\" \"},\"20\":{\"merge\":[2,0],\"text\":\"本年投入金额(万元)\",\"style\":230},\"21\":{\"merge\":[0,1],\"text\":\"电脑数(台数)\",\"style\":121},\"22\":{\"style\":122,\"text\":\" \"},\"23\":{\"merge\":[0,1],\"text\":\"校园网数(个)\",\"style\":121},\"24\":{\"style\":122,\"text\":\" \"}}},\"4\":{\"cells\":{\"1\":{\"text\":\" \",\"style\":40},\"2\":{\"style\":222,\"text\":\" \"},\"3\":{\"style\":118,\"text\":\" \"},\"4\":{\"merge\":[1,0],\"text\":\"金额\",\"style\":126},\"5\":{\"merge\":[1,0],\"text\":\"比上年增长(%)\",\"style\":127},\"6\":{\"style\":122,\"text\":\" \"},\"7\":{\"style\":123,\"text\":\" \"},\"8\":{\"merge\":[1,0],\"text\":\"合计\",\"style\":121},\"9\":{\"merge\":[0,1],\"text\":\"其中\",\"style\":121},\"10\":{\"style\":122,\"text\":\" \"},\"11\":{\"style\":118,\"text\":\" \"},\"12\":{\"style\":121,\"text\":\" \"},\"13\":{\"merge\":[1,0],\"text\":\"人员经费\",\"style\":131},\"14\":{\"merge\":[1,0],\"text\":\"日常公用费用\",\"style\":131},\"15\":{\"merge\":[1,0],\"text\":\"项目经费\",\"style\":131},\"16\":{\"merge\":[1,0],\"text\":\"基建投入\",\"style\":131},\"17\":{\"style\":121,\"text\":\" \"},\"18\":{\"merge\":[1,0],\"text\":\"项目经费\",\"style\":131},\"19\":{\"merge\":[1,0],\"text\":\"基础投入\",\"style\":131},\"20\":{\"style\":231,\"text\":\" \"},\"21\":{\"merge\":[1,0],\"text\":\"合计\",\"style\":121},\"22\":{\"merge\":[1,0],\"text\":\"本年购置数\",\"style\":121},\"23\":{\"style\":121,\"merge\":[1,0],\"text\":\"合计\"},\"24\":{\"merge\":[1,0],\"text\":\"本年建成数\",\"style\":121}}},\"5\":{\"cells\":{\"1\":{\"text\":\" \",\"style\":40},\"2\":{\"style\":222,\"text\":\" \"},\"3\":{\"style\":118,\"text\":\" \"},\"4\":{\"style\":126,\"text\":\" \"},\"5\":{\"style\":129,\"text\":\" \"},\"6\":{\"style\":121,\"text\":\" \"},\"7\":{\"style\":130,\"text\":\" \"},\"8\":{\"style\":121,\"text\":\" \"},\"9\":{\"text\":\"标准化建设\",\"style\":131},\"10\":{\"text\":\"信息化建设\",\"style\":121},\"11\":{\"style\":118,\"text\":\" \"},\"12\":{\"style\":121,\"text\":\" \"},\"13\":{\"text\":\" \",\"style\":223},\"14\":{\"style\":131,\"text\":\" \"},\"15\":{\"text\":\" \",\"style\":223},\"16\":{\"style\":131,\"text\":\" \"},\"17\":{\"style\":121,\"text\":\" \"},\"18\":{\"text\":\" \",\"style\":223},\"19\":{\"style\":131,\"text\":\" \"},\"20\":{\"style\":231,\"text\":\" \"},\"21\":{\"style\":121,\"text\":\" \"},\"22\":{\"style\":122,\"text\":\" \"},\"23\":{\"style\":131,\"text\":\" \"},\"24\":{\"style\":122,\"text\":\" \"}}},\"6\":{\"cells\":{\"0\":{\"style\":236},\"1\":{\"text\":\"#{laiyuan.group(class)}\",\"style\":233,\"aggregate\":\"group\"},\"2\":{\"text\":\"#{laiyuan.school}\",\"style\":234},\"3\":{\"style\":15,\"text\":\"=SUM(E7,I7)\"},\"4\":{\"style\":15,\"text\":\"=SUM(G7,H7)\"},\"5\":{\"text\":\"#{laiyuan.lv}\",\"style\":12},\"6\":{\"text\":\"#{laiyuan.renyuan_jy}\",\"style\":12},\"7\":{\"text\":\"#{laiyuan.richang_jy}\",\"style\":12},\"8\":{\"style\":12,\"text\":\"=SUM(J7,K7)\"},\"9\":{\"text\":\"#{laiyuan.biaozhun_jy}\",\"style\":12},\"10\":{\"text\":\"#{laiyuan.xinxi_jy}\",\"style\":12},\"11\":{\"text\":\"#{laiyuan.jichubokuan_jy}\",\"style\":12},\"12\":{\"style\":12,\"text\":\"=SUM(N7,O7)\"},\"13\":{\"text\":\"#{laiyuan.renyuan_ct}\",\"style\":12},\"14\":{\"text\":\"#{laiyuan.richang_ct}\",\"style\":12},\"15\":{\"text\":\"#{laiyuan.xiangmu_ct}\",\"style\":12},\"16\":{\"text\":\"#{laiyuan.jichubokuan_ct}\",\"style\":12},\"17\":{\"style\":12,\"text\":\"=SUM(S7,T7)\"},\"18\":{\"text\":\"#{laiyuan.xiangmu_sh}\",\"style\":12},\"19\":{\"text\":\"#{laiyuan.jichubokuan_sh}\",\"style\":12},\"20\":{\"style\":12,\"text\":\"=SUM(V7,X7)\"},\"21\":{\"style\":12,\"text\":\"#{laiyuan.diannao}\"},\"22\":{\"text\":\"#{laiyuan.diannao}\",\"style\":12},\"23\":{\"style\":12,\"text\":\"#{laiyuan.xiaoyuanwang}\"},\"24\":{\"text\":\"#{laiyuan.xiaoyuanwang}\",\"style\":12},\"25\":{\"style\":236}},\"isDrag\":true},\"7\":{\"cells\":{\"1\":{\"text\":\"总计\",\"style\":226,\"rendered\":\"\",\"merge\":[0,1]},\"3\":{\"style\":228,\"text\":\"=SUM(D7)\"},\"4\":{\"style\":228,\"text\":\"=SUM(E7)\"},\"5\":{\"style\":228,\"text\":\"\"},\"6\":{\"style\":228,\"text\":\"=SUM(G7)\"},\"7\":{\"style\":228,\"text\":\"=SUM(H7)\"},\"8\":{\"style\":228,\"text\":\"=SUM(I7)\"},\"9\":{\"style\":228,\"text\":\"=SUM(J7)\"},\"10\":{\"style\":228,\"text\":\"=SUM(K7)\"},\"11\":{\"style\":228,\"text\":\"=SUM(L7)\"},\"12\":{\"style\":228,\"text\":\"=SUM(M7)\"},\"13\":{\"style\":229,\"text\":\"=SUM(N7)\"},\"14\":{\"style\":229,\"text\":\"=SUM(O7)\"},\"15\":{\"style\":229,\"text\":\"=SUM(P7)\"},\"16\":{\"style\":229,\"text\":\"=SUM(Q7)\"},\"17\":{\"style\":229,\"text\":\"=SUM(R7)\"},\"18\":{\"style\":229,\"text\":\"=SUM(S7)\"},\"19\":{\"style\":229,\"text\":\"=SUM(T7)\"},\"20\":{\"style\":229,\"text\":\"=SUM(U7)\"},\"21\":{\"style\":229,\"text\":\"=SUM(V8)\"},\"22\":{\"style\":229,\"text\":\"=SUM(W7)\"},\"23\":{\"style\":232,\"text\":\"=SUM(X7)\"},\"24\":{\"style\":229,\"text\":\"=SUM(Y7)\"}}},\"9\":{\"cells\":{\"4\":{\"lineStart\":\"leftbottom\",\"text\":\"\"}}},\"len\":100},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":718,\"heightPx\":1047},\"dicts\":[],\"groupField\":\"laiyuan.class\",\"freeze\":\"A1\",\"dataRectWidth\":1738,\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"align\":\"center\"},{\"align\":\"center\",\"bgcolor\":\"\"},{\"align\":\"center\",\"bgcolor\":\"#02a274\"},{\"align\":\"center\",\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\"},{\"bgcolor\":\"#02a274\"},{\"align\":\"center\",\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"bfbfbf\"],\"top\":[\"thin\",\"bfbfbf\"],\"left\":[\"thin\",\"bfbfbf\"],\"right\":[\"thin\",\"bfbfbf\"]}},{\"border\":{\"bottom\":[\"thin\",\"bfbfbf\"],\"top\":[\"thin\",\"bfbfbf\"],\"left\":[\"thin\",\"bfbfbf\"],\"right\":[\"thin\",\"bfbfbf\"]}},{\"align\":\"center\",\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"align\":\"center\",\"font\":{\"size\":16}},{\"align\":\"center\",\"font\":{\"size\":16,\"bold\":true}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8,\"name\":\"宋体\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8,\"name\":\"隶书\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8,\"name\":\"Microsoft YaHei\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"color\":\"#7f7f7f\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"color\":\"#262626\"},{\"align\":\"center\",\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"bold\":true}},{\"align\":\"center\",\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"font\":{\"bold\":true}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"color\":\"#262626\",\"bgcolor\":\"#\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"color\":\"#262626\",\"bgcolor\":\"#f1f9f6\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"color\":\"#262626\",\"bgcolor\":\"#ddefe8\"},{\"align\":\"center\",\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"bold\":true,\"size\":9}},{\"align\":\"center\",\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"font\":{\"bold\":true,\"size\":9}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8,\"name\":\"华文中宋\"},\"align\":\"center\",\"color\":\"#262626\",\"bgcolor\":\"#f1f9f6\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8,\"name\":\"Arial\"},\"align\":\"center\",\"color\":\"#262626\",\"bgcolor\":\"#f1f9f6\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":10}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8},\"bgcolor\":\"#\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"color\":\"#262626\",\"bgcolor\":\"#aedac8\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8},\"bgcolor\":\"#aedac8\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#aedac8\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8},\"bgcolor\":\"#aedac8\",\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8},\"bgcolor\":\"#aedac8\",\"align\":\"center\",\"format\":\"number\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8},\"bgcolor\":\"#aedac8\",\"align\":\"center\",\"format\":\"normal\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#aedac8\",\"align\":\"center\"},{\"align\":\"center\",\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"bold\":false,\"size\":9}},{\"align\":\"center\",\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"font\":{\"bold\":false,\"size\":9}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":10,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"color\":\"#262626\",\"bgcolor\":\"#aedac8\"},{\"font\":{\"size\":10}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":10},\"bgcolor\":\"#aedac8\",\"align\":\"center\",\"format\":\"normal\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":10},\"bgcolor\":\"#aedac8\",\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#aedac8\",\"font\":{\"size\":10}},{\"font\":{\"size\":10},\"bgcolor\":\"#aedac8\"},{\"bgcolor\":\"#02a274\",\"font\":{\"size\":9}},{\"bgcolor\":\"#02a274\",\"font\":{\"size\":9},\"align\":\"center\"},{\"bgcolor\":\"#02a274\",\"font\":{\"size\":9},\"align\":\"center\",\"color\":\"#ffffff\"},{\"textwrap\":true},{\"textwrap\":true,\"font\":{\"size\":9}},{\"textwrap\":true,\"font\":{\"size\":9},\"bgcolor\":\"#02a274\"},{\"textwrap\":true,\"font\":{\"size\":9},\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\"},{\"align\":\"center\",\"bgcolor\":\"#02a274\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"bold\":false,\"size\":9}},{\"color\":\"#000100\"},{\"bgcolor\":\"#02a274\",\"font\":{\"size\":9},\"align\":\"center\",\"color\":\"#000100\"},{\"textwrap\":true,\"font\":{\"size\":9},\"bgcolor\":\"#02a274\",\"color\":\"#000100\"},{\"bgcolor\":\"\",\"font\":{\"size\":9},\"align\":\"center\",\"color\":\"#000100\"},{\"textwrap\":true,\"font\":{\"size\":9},\"bgcolor\":\"\",\"color\":\"#000100\"},{\"align\":\"center\",\"bgcolor\":\"\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"bold\":false,\"size\":9}},{\"color\":\"#000100\",\"bgcolor\":\"\"},{\"textwrap\":true,\"font\":{\"size\":9},\"bgcolor\":\"\",\"color\":\"#000100\",\"align\":\"center\"},{\"font\":{\"size\":9}},{\"font\":{\"size\":9},\"align\":\"center\"},{\"textwrap\":true,\"align\":\"center\"},{\"font\":{\"size\":9},\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#595959\"],\"top\":[\"thin\",\"#595959\"],\"left\":[\"thin\",\"#595959\"],\"right\":[\"thin\",\"#595959\"]}},{\"textwrap\":true,\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#595959\"],\"top\":[\"thin\",\"#595959\"],\"left\":[\"thin\",\"#595959\"],\"right\":[\"thin\",\"#595959\"]}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#595959\"],\"top\":[\"thin\",\"#595959\"],\"left\":[\"thin\",\"#595959\"],\"right\":[\"thin\",\"#595959\"]}},{\"bgcolor\":\"\",\"font\":{\"size\":9},\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#595959\"],\"top\":[\"thin\",\"#595959\"],\"left\":[\"thin\",\"#595959\"],\"right\":[\"thin\",\"#595959\"]}},{\"textwrap\":true,\"font\":{\"size\":9},\"bgcolor\":\"\",\"color\":\"#000100\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#595959\"],\"top\":[\"thin\",\"#595959\"],\"left\":[\"thin\",\"#595959\"],\"right\":[\"thin\",\"#595959\"]}},{\"font\":{\"size\":9},\"border\":{\"bottom\":[\"thin\",\"#595959\"],\"top\":[\"thin\",\"#595959\"],\"left\":[\"thin\",\"#595959\"],\"right\":[\"thin\",\"#595959\"]}},{\"font\":{\"size\":9},\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"],\"top\":[\"thin\",\"#7f7f7f\"],\"left\":[\"thin\",\"#7f7f7f\"],\"right\":[\"thin\",\"#7f7f7f\"]}},{\"textwrap\":true,\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"],\"top\":[\"thin\",\"#7f7f7f\"],\"left\":[\"thin\",\"#7f7f7f\"],\"right\":[\"thin\",\"#7f7f7f\"]}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"],\"top\":[\"thin\",\"#7f7f7f\"],\"left\":[\"thin\",\"#7f7f7f\"],\"right\":[\"thin\",\"#7f7f7f\"]}},{\"bgcolor\":\"\",\"font\":{\"size\":9},\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"],\"top\":[\"thin\",\"#7f7f7f\"],\"left\":[\"thin\",\"#7f7f7f\"],\"right\":[\"thin\",\"#7f7f7f\"]}},{\"textwrap\":true,\"font\":{\"size\":9},\"bgcolor\":\"\",\"color\":\"#000100\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"],\"top\":[\"thin\",\"#7f7f7f\"],\"left\":[\"thin\",\"#7f7f7f\"],\"right\":[\"thin\",\"#7f7f7f\"]}},{\"font\":{\"size\":9},\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"],\"top\":[\"thin\",\"#7f7f7f\"],\"left\":[\"thin\",\"#7f7f7f\"],\"right\":[\"thin\",\"#7f7f7f\"]}},{\"font\":{\"size\":9},\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#756f6f\"],\"top\":[\"thin\",\"#756f6f\"],\"left\":[\"thin\",\"#756f6f\"],\"right\":[\"thin\",\"#756f6f\"]}},{\"textwrap\":true,\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#756f6f\"],\"top\":[\"thin\",\"#756f6f\"],\"left\":[\"thin\",\"#756f6f\"],\"right\":[\"thin\",\"#756f6f\"]}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#756f6f\"],\"top\":[\"thin\",\"#756f6f\"],\"left\":[\"thin\",\"#756f6f\"],\"right\":[\"thin\",\"#756f6f\"]}},{\"bgcolor\":\"\",\"font\":{\"size\":9},\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#756f6f\"],\"top\":[\"thin\",\"#756f6f\"],\"left\":[\"thin\",\"#756f6f\"],\"right\":[\"thin\",\"#756f6f\"]}},{\"textwrap\":true,\"font\":{\"size\":9},\"bgcolor\":\"\",\"color\":\"#000100\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#756f6f\"],\"top\":[\"thin\",\"#756f6f\"],\"left\":[\"thin\",\"#756f6f\"],\"right\":[\"thin\",\"#756f6f\"]}},{\"font\":{\"size\":9},\"border\":{\"bottom\":[\"thin\",\"#756f6f\"],\"top\":[\"thin\",\"#756f6f\"],\"left\":[\"thin\",\"#756f6f\"],\"right\":[\"thin\",\"#756f6f\"]}},{\"align\":\"center\",\"bgcolor\":\"\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"bold\":false,\"size\":9}},{\"bgcolor\":\"\"},{\"align\":\"center\",\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"bold\":false,\"size\":10}},{\"align\":\"center\",\"bgcolor\":\"\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"bold\":false,\"size\":10}},{\"color\":\"#000100\",\"font\":{\"size\":10}},{\"color\":\"#000100\",\"bgcolor\":\"\",\"font\":{\"size\":10}},{\"font\":{\"size\":10},\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"],\"top\":[\"thin\",\"#7f7f7f\"],\"left\":[\"thin\",\"#7f7f7f\"],\"right\":[\"thin\",\"#7f7f7f\"]}},{\"font\":{\"size\":10},\"align\":\"center\"},{\"textwrap\":true,\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"],\"top\":[\"thin\",\"#7f7f7f\"],\"left\":[\"thin\",\"#7f7f7f\"],\"right\":[\"thin\",\"#7f7f7f\"]},\"font\":{\"size\":10}},{\"bgcolor\":\"\",\"font\":{\"size\":10},\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"],\"top\":[\"thin\",\"#7f7f7f\"],\"left\":[\"thin\",\"#7f7f7f\"],\"right\":[\"thin\",\"#7f7f7f\"]}},{\"textwrap\":true,\"font\":{\"size\":10},\"bgcolor\":\"\",\"color\":\"#000100\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"],\"top\":[\"thin\",\"#7f7f7f\"],\"left\":[\"thin\",\"#7f7f7f\"],\"right\":[\"thin\",\"#7f7f7f\"]}},{\"bgcolor\":\"\",\"font\":{\"size\":10},\"align\":\"center\",\"color\":\"#000100\"},{\"font\":{\"size\":10},\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"],\"top\":[\"thin\",\"#7f7f7f\"],\"left\":[\"thin\",\"#7f7f7f\"],\"right\":[\"thin\",\"#7f7f7f\"]}},{\"color\":\"#000100\",\"bgcolor\":\"\",\"align\":\"center\"},{\"font\":{\"size\":10},\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"textwrap\":true,\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":10}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"bgcolor\":\"\",\"font\":{\"size\":10},\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"textwrap\":true,\"font\":{\"size\":10},\"bgcolor\":\"\",\"color\":\"#000100\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"color\":\"#000100\",\"bgcolor\":\"\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"textwrap\":true,\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"align\":\"center\",\"bgcolor\":\"#\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"bold\":false,\"size\":10}},{\"color\":\"#000100\",\"font\":{\"size\":10},\"bgcolor\":\"#\"},{\"align\":\"center\",\"bgcolor\":\"#\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"bold\":false,\"size\":9}},{\"bgcolor\":\"#\"},{\"font\":{\"size\":10},\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#\"},{\"font\":{\"size\":10},\"align\":\"center\",\"bgcolor\":\"#\"},{\"textwrap\":true,\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":10},\"bgcolor\":\"#\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#\"},{\"align\":\"center\",\"bgcolor\":\"#\"},{\"bgcolor\":\"#\",\"font\":{\"size\":10},\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"textwrap\":true,\"font\":{\"size\":10},\"bgcolor\":\"#\",\"color\":\"#000100\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"textwrap\":true,\"font\":{\"size\":10},\"bgcolor\":\"#\",\"color\":\"#000100\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"],\"top\":[\"thin\",\"#7f7f7f\"],\"left\":[\"thin\",\"#7f7f7f\"],\"right\":[\"thin\",\"#7f7f7f\"]}},{\"textwrap\":true,\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"],\"top\":[\"thin\",\"#7f7f7f\"],\"left\":[\"thin\",\"#7f7f7f\"],\"right\":[\"thin\",\"#7f7f7f\"]},\"font\":{\"size\":10},\"bgcolor\":\"#\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":10},\"bgcolor\":\"#\"},{\"align\":\"center\",\"bgcolor\":\"#ddefe8\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"bold\":false,\"size\":10}},{\"color\":\"#000100\",\"font\":{\"size\":10},\"bgcolor\":\"#ddefe8\"},{\"align\":\"center\",\"bgcolor\":\"#ddefe8\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"bold\":false,\"size\":9}},{\"bgcolor\":\"#ddefe8\"},{\"font\":{\"size\":10},\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#ddefe8\"},{\"font\":{\"size\":10},\"align\":\"center\",\"bgcolor\":\"#ddefe8\"},{\"textwrap\":true,\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":10},\"bgcolor\":\"#ddefe8\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#ddefe8\"},{\"align\":\"center\",\"bgcolor\":\"#ddefe8\"},{\"bgcolor\":\"#ddefe8\",\"font\":{\"size\":10},\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"textwrap\":true,\"font\":{\"size\":10},\"bgcolor\":\"#ddefe8\",\"color\":\"#000100\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#ddefe8\"},{\"textwrap\":true,\"font\":{\"size\":10},\"bgcolor\":\"#ddefe8\",\"color\":\"#000100\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"],\"top\":[\"thin\",\"#7f7f7f\"],\"left\":[\"thin\",\"#7f7f7f\"],\"right\":[\"thin\",\"#7f7f7f\"]}},{\"textwrap\":true,\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"],\"top\":[\"thin\",\"#7f7f7f\"],\"left\":[\"thin\",\"#7f7f7f\"],\"right\":[\"thin\",\"#7f7f7f\"]},\"font\":{\"size\":10},\"bgcolor\":\"#ddefe8\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":10},\"bgcolor\":\"#ddefe8\"},{\"color\":\"#000100\",\"bgcolor\":\"#fffff\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"align\":\"center\",\"bgcolor\":\"#fffff\"},{\"textwrap\":true,\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#fffff\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#fffff\"},{\"textwrap\":true,\"bgcolor\":\"#fffff\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#fffff\"},{\"color\":\"#000100\",\"bgcolor\":\"#ffff\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"align\":\"center\",\"bgcolor\":\"#ffff\"},{\"textwrap\":true,\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#ffff\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#ffff\"},{\"textwrap\":true,\"bgcolor\":\"#ffff\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#ffff\"},{\"color\":\"#000100\",\"bgcolor\":\"#fff\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"align\":\"center\",\"bgcolor\":\"#fff\"},{\"textwrap\":true,\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#fff\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#fff\"},{\"textwrap\":true,\"bgcolor\":\"#fff\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#fff\"},{\"color\":\"#000100\",\"bgcolor\":\"#ff\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"align\":\"center\",\"bgcolor\":\"#ff\"},{\"textwrap\":true,\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#ff\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#ff\"},{\"textwrap\":true,\"bgcolor\":\"#ff\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#ff\"},{\"color\":\"#000100\",\"bgcolor\":\"#f\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"align\":\"center\",\"bgcolor\":\"#f\"},{\"textwrap\":true,\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#f\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#f\"},{\"textwrap\":true,\"bgcolor\":\"#f\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#f\"},{\"color\":\"#000100\",\"bgcolor\":\"#\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"textwrap\":true,\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#\"},{\"textwrap\":true,\"bgcolor\":\"#\"},{\"color\":\"#000100\",\"bgcolor\":\"#ddefe8\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"textwrap\":true,\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#ddefe8\"},{\"textwrap\":true,\"bgcolor\":\"#ddefe8\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9}},{\"color\":\"#000100\",\"font\":{\"size\":9},\"bgcolor\":\"#ddefe8\"},{\"bgcolor\":\"#ddefe8\",\"font\":{\"size\":9}},{\"font\":{\"size\":9},\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#ddefe8\"},{\"font\":{\"size\":9},\"align\":\"center\",\"bgcolor\":\"#ddefe8\"},{\"textwrap\":true,\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9},\"bgcolor\":\"#ddefe8\"},{\"bgcolor\":\"#ddefe8\",\"font\":{\"size\":9},\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"textwrap\":true,\"font\":{\"size\":9},\"bgcolor\":\"#ddefe8\",\"color\":\"#000100\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#ddefe8\",\"font\":{\"size\":9}},{\"textwrap\":true,\"font\":{\"size\":9},\"bgcolor\":\"#ddefe8\",\"color\":\"#000100\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"],\"top\":[\"thin\",\"#7f7f7f\"],\"left\":[\"thin\",\"#7f7f7f\"],\"right\":[\"thin\",\"#7f7f7f\"]}},{\"textwrap\":true,\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"],\"top\":[\"thin\",\"#7f7f7f\"],\"left\":[\"thin\",\"#7f7f7f\"],\"right\":[\"thin\",\"#7f7f7f\"]},\"font\":{\"size\":9},\"bgcolor\":\"#ddefe8\"},{\"textwrap\":true,\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#ddefe8\",\"font\":{\"size\":9}},{\"textwrap\":true,\"bgcolor\":\"#ddefe8\",\"font\":{\"size\":9}},{\"align\":\"center\",\"bgcolor\":\"#aedac8\"},{\"bgcolor\":\"#aedac8\"},{\"bgcolor\":\"#fffff\"},{\"bgcolor\":\"#ffff\"},{\"bgcolor\":\"#fff\"},{\"bgcolor\":\"#ff\"},{\"bgcolor\":\"#f\"},{\"align\":\"center\",\"bgcolor\":\"#aedac8\",\"font\":{\"size\":8}},{\"align\":\"center\",\"bgcolor\":\"#aedac8\",\"font\":{\"size\":9}},{\"align\":\"center\",\"bgcolor\":\"#aedac8\",\"font\":{\"size\":9},\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8,\"name\":\"Arial\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"bgcolor\":\"#\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"bgcolor\":\"#f1f9f6\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#aedac8\",\"font\":{\"size\":9}},{\"align\":\"center\",\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"font\":{\"bold\":false,\"size\":9}},{\"bgcolor\":\"#02a274\",\"font\":{\"size\":9},\"align\":\"center\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]}},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"bgcolor\":\"\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"bgcolor\":\"aedac8\"},{\"align\":\"center\",\"bgcolor\":\"aedac8\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"bgcolor\":\"#aedac8\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"bgcolor\":\"#aedac8\",\"color\":\"#ffffff\"},{\"align\":\"center\",\"bgcolor\":\"#aedac8\",\"color\":\"#ffffff\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"bgcolor\":\"#aedac8\",\"color\":\"#ffffff\",\"font\":{\"size\":9}},{\"align\":\"center\",\"bgcolor\":\"#aedac8\",\"color\":\"#ffffff\",\"font\":{\"size\":9}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"bgcolor\":\"#aedac8\",\"color\":\"#000100\",\"font\":{\"size\":9}},{\"align\":\"center\",\"bgcolor\":\"#aedac8\",\"color\":\"#000100\",\"font\":{\"size\":9}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"bgcolor\":\"#aedac8\",\"color\":\"#000100\",\"font\":{\"size\":8}},{\"align\":\"center\",\"bgcolor\":\"#aedac8\",\"color\":\"#000100\",\"font\":{\"size\":8}},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"bgcolor\":\"#\"},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"bgcolor\":\"##aedac8\"},{\"bgcolor\":\"##aedac8\"},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"bgcolor\":\"#aedac8\"},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"bgcolor\":\"#aedac8\",\"font\":{\"size\":8}},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"bgcolor\":\"#aedac8\",\"font\":{\"size\":8},\"align\":\"center\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"bgcolor\":\"#aedac8\",\"font\":{\"size\":9}},{\"bgcolor\":\"#aedac8\",\"font\":{\"size\":8}},{\"bgcolor\":\"#aedac8\",\"font\":{\"size\":8},\"align\":\"left\"},{\"bgcolor\":\"#aedac8\",\"font\":{\"size\":8},\"align\":\"left\",\"valign\":\"middle\"},{\"align\":\"center\",\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"font\":{\"bold\":false,\"size\":10}},{\"bgcolor\":\"#02a274\",\"font\":{\"size\":10},\"align\":\"center\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]}},{\"bgcolor\":\"#ddefe8\",\"font\":{\"size\":10}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":10,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"bgcolor\":\"#f1f9f6\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":10,\"name\":\"Microsoft YaHei\"},\"align\":\"center\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"bgcolor\":\"#aedac8\",\"color\":\"#000100\",\"font\":{\"size\":10}},{\"align\":\"center\",\"bgcolor\":\"#aedac8\",\"color\":\"#000100\",\"font\":{\"size\":10}},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"bgcolor\":\"#aedac8\",\"font\":{\"size\":10},\"align\":\"center\"},{\"align\":\"center\",\"bgcolor\":\"#aedac8\",\"font\":{\"size\":10}},{\"textwrap\":true,\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#ddefe8\",\"font\":{\"size\":10}},{\"textwrap\":true,\"bgcolor\":\"#ddefe8\",\"font\":{\"size\":10}},{\"bgcolor\":\"#aedac8\",\"font\":{\"size\":10},\"align\":\"left\",\"valign\":\"middle\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"bgcolor\":\"#f1f9f6\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9,\"name\":\"Microsoft YaHei\"},\"align\":\"center\"},{\"font\":{\"size\":9},\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"font\":{\"size\":8}}],\"validations\":[],\"isGroup\":true,\"cols\":{\"0\":{\"width\":20},\"1\":{\"width\":84},\"2\":{\"width\":132},\"3\":{\"width\":75},\"4\":{\"width\":63},\"5\":{\"width\":59},\"6\":{\"width\":70},\"7\":{\"width\":61},\"8\":{\"width\":60},\"9\":{\"width\":75},\"10\":{\"width\":75},\"11\":{\"width\":64},\"12\":{\"width\":70},\"13\":{\"width\":63},\"14\":{\"width\":86},\"15\":{\"width\":64},\"16\":{\"width\":58},\"17\":{\"width\":63},\"18\":{\"width\":60},\"19\":{\"width\":63},\"20\":{\"width\":59},\"21\":{\"width\":73},\"22\":{\"width\":82},\"23\":{\"width\":73},\"24\":{\"width\":86},\"len\":50},\"merges\":[\"B1:X1\",\"D3:D6\",\"E5:E6\",\"F5:F6\",\"E4:F4\",\"G4:G6\",\"H4:H6\",\"I5:I6\",\"J5:K5\",\"I4:K4\",\"E3:K3\",\"L3:L6\",\"D2:L2\",\"M4:M6\",\"N5:N6\",\"O5:O6\",\"P5:P6\",\"Q5:Q6\",\"N4:Q4\",\"M3:Q3\",\"R4:R6\",\"R3:T3\",\"S4:T4\",\"S5:S6\",\"T5:T6\",\"U4:U6\",\"V4:W4\",\"V5:V6\",\"W5:W6\",\"X4:Y4\",\"X5:X6\",\"Y5:Y6\",\"U3:Y3\",\"M2:T2\",\"U2:Y2\",\"B2:B6\",\"C2:C6\",\"B8:C8\"]}', NULL, 'https://static.jeecg.com/designreport/images/jingfei_1607069843358.png', 'admin', '2020-12-03 16:54:17', 'admin', '2021-02-03 13:59:08', 0, NULL, NULL, 1, 436, NULL, NULL, NULL); +INSERT INTO `jimu_report` VALUES ('1334457419857793024', '20201203192154', '超市各地区销售额', NULL, NULL, 'datainfo', '{\"loopBlockList\":[],\"area\":{\"sri\":1,\"sci\":26,\"eri\":4,\"eci\":28,\"width\":300,\"height\":100},\"excel_config_id\":\"1334457419857793024\",\"printConfig\":{\"paper\":\"A4\",\"width\":210,\"height\":297,\"definition\":1,\"isBackend\":false,\"marginX\":10,\"marginY\":10},\"rows\":{\"0\":{\"cells\":{\"1\":{\"text\":\"各地区商品销售额一栏表\",\"merge\":[0,18],\"style\":13}},\"height\":82},\"1\":{\"cells\":{\"1\":{\"text\":\"地区/类别/时间\",\"merge\":[1,1],\"style\":46},\"3\":{\"text\":\"2020年\",\"style\":46,\"merge\":[0,12]},\"16\":{\"text\":\"2019年\",\"style\":46,\"merge\":[0,9]}}},\"2\":{\"cells\":{\"3\":{\"text\":\"12月\",\"style\":46},\"4\":{\"text\":\"11月\",\"style\":46},\"5\":{\"text\":\"10月\",\"style\":46},\"6\":{\"text\":\"9月\",\"style\":46},\"7\":{\"text\":\"8月\",\"style\":46},\"8\":{\"text\":\"7月\",\"style\":46},\"9\":{\"text\":\"6月\",\"style\":46},\"10\":{\"text\":\"5月\",\"style\":46},\"11\":{\"text\":\"4月\",\"style\":46},\"12\":{\"text\":\"3月\",\"style\":46},\"13\":{\"text\":\"2月\",\"style\":46},\"14\":{\"text\":\"1月\",\"style\":46},\"15\":{\"text\":\"本年小计\",\"style\":46},\"16\":{\"text\":\"12月\",\"style\":46},\"17\":{\"text\":\"11月\",\"style\":46},\"18\":{\"text\":\"10月\",\"style\":46},\"19\":{\"text\":\"9月\",\"style\":46},\"20\":{\"text\":\"8月\",\"style\":46},\"21\":{\"text\":\"7月\",\"style\":46},\"22\":{\"text\":\"6月\",\"style\":46},\"23\":{\"text\":\"5月\",\"style\":46},\"24\":{\"text\":\"4月\",\"style\":46},\"25\":{\"text\":\"本年小计\",\"style\":46}}},\"3\":{\"cells\":{\"1\":{\"text\":\"#{xiaoshou.group(diqu)}\",\"style\":51,\"aggregate\":\"group\"},\"2\":{\"text\":\"#{xiaoshou.class}\",\"style\":51},\"3\":{\"text\":\"#{xiaoshou.sales_11}\",\"style\":20},\"4\":{\"text\":\"#{xiaoshou.sales_12}\",\"style\":20},\"5\":{\"text\":\"#{xiaoshou.sales_13}\",\"style\":20},\"6\":{\"text\":\"#{xiaoshou.sales_14}\",\"style\":20},\"7\":{\"text\":\"#{xiaoshou.sales_15}\",\"style\":20},\"8\":{\"text\":\"#{xiaoshou.sales_16}\",\"style\":20},\"9\":{\"text\":\"#{xiaoshou.sales_17}\",\"style\":20},\"10\":{\"text\":\"#{xiaoshou.sales_18}\",\"style\":20},\"11\":{\"text\":\"#{xiaoshou.sales_19}\",\"style\":20},\"12\":{\"text\":\"#{xiaoshou.sales_20}\",\"style\":20},\"13\":{\"text\":\"#{xiaoshou.sales_21}\",\"style\":20},\"14\":{\"text\":\"#{xiaoshou.sales_22}\",\"style\":20},\"15\":{\"style\":48,\"text\":\"=SUM(D4:O4)\"},\"16\":{\"text\":\"#{xiaoshou.sales_31}\",\"style\":20},\"17\":{\"text\":\"#{xiaoshou.sales_32}\",\"style\":20},\"18\":{\"text\":\"#{xiaoshou.sales_33}\",\"style\":20},\"19\":{\"text\":\"#{xiaoshou.sales_34}\",\"style\":20},\"20\":{\"text\":\"#{xiaoshou.sales_35}\",\"style\":20},\"21\":{\"text\":\"#{xiaoshou.sales_36}\",\"style\":20},\"22\":{\"text\":\"#{xiaoshou.sales_37}\",\"style\":20},\"23\":{\"text\":\"#{xiaoshou.sales_38}\",\"style\":20},\"24\":{\"text\":\"#{xiaoshou.sales_39}\",\"style\":20},\"25\":{\"style\":48,\"text\":\"=SUM(Q4:Y4)\"}},\"isDrag\":true},\"4\":{\"cells\":{\"1\":{\"text\":\"合计\",\"style\":52,\"rendered\":\"\",\"merge\":[0,1]},\"3\":{\"text\":\"=SUM(D4)\",\"style\":55},\"4\":{\"text\":\"=SUM(E4)\",\"style\":55},\"5\":{\"text\":\"=SUM(F4)\",\"style\":55},\"6\":{\"text\":\"=SUM(G4)\",\"style\":55},\"7\":{\"text\":\"=SUM(H4)\",\"style\":55},\"8\":{\"text\":\"=SUM(I4)\",\"style\":55},\"9\":{\"text\":\"=SUM(J4)\",\"style\":55},\"10\":{\"text\":\"=SUM(K4)\",\"style\":55},\"11\":{\"text\":\"=SUM(L4)\",\"style\":55},\"12\":{\"text\":\"=SUM(M4)\",\"style\":55},\"13\":{\"text\":\"=SUM(N4)\",\"style\":55},\"14\":{\"text\":\"=SUM(O4)\",\"style\":55},\"15\":{\"text\":\"=SUM(P4)\",\"style\":55},\"16\":{\"text\":\"=SUM(Q4)\",\"style\":55},\"17\":{\"text\":\"=SUM(R4)\",\"style\":55},\"18\":{\"text\":\"=SUM(S4)\",\"style\":55},\"19\":{\"text\":\"=SUM(T4)\",\"style\":55},\"20\":{\"text\":\"=SUM(U4)\",\"style\":55},\"21\":{\"text\":\"=SUM(V4)\",\"style\":55},\"22\":{\"text\":\"=SUM(W4)\",\"style\":55},\"23\":{\"text\":\"=SUM(X4)\",\"style\":55},\"24\":{\"text\":\"=SUM(Y4)\",\"style\":55},\"25\":{\"text\":\"=SUM(Z4)\",\"style\":55}},\"isDrag\":true},\"len\":100},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":718,\"heightPx\":1047},\"dicts\":[],\"groupField\":\"xiaoshou.diqu\",\"freeze\":\"A1\",\"dataRectWidth\":2464,\"displayConfig\":{},\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"bgcolor\":\"#\"},{\"bgcolor\":\"#d7f2f9\"},{\"bgcolor\":\"#d7f2f9\",\"align\":\"center\"},{\"align\":\"center\"},{\"align\":\"center\",\"bgcolor\":\"#\"},{\"bgcolor\":\"#d7f2f9\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"2896ea\"],\"top\":[\"thin\",\"2896ea\"],\"left\":[\"thin\",\"2896ea\"],\"right\":[\"thin\",\"2896ea\"]}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"2896ea\"],\"top\":[\"thin\",\"2896ea\"],\"left\":[\"thin\",\"2896ea\"],\"right\":[\"thin\",\"2896ea\"]}},{\"border\":{\"bottom\":[\"thin\",\"2896ea\"],\"top\":[\"thin\",\"2896ea\"],\"left\":[\"thin\",\"2896ea\"],\"right\":[\"thin\",\"2896ea\"]}},{\"bgcolor\":\"#d7f2f9\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#2896ea\"],\"top\":[\"thin\",\"#2896ea\"],\"left\":[\"thin\",\"#2896ea\"],\"right\":[\"thin\",\"#2896ea\"]}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#2896ea\"],\"top\":[\"thin\",\"#2896ea\"],\"left\":[\"thin\",\"#2896ea\"],\"right\":[\"thin\",\"#2896ea\"]}},{\"border\":{\"bottom\":[\"thin\",\"#2896ea\"],\"top\":[\"thin\",\"#2896ea\"],\"left\":[\"thin\",\"#2896ea\"],\"right\":[\"thin\",\"#2896ea\"]}},{\"font\":{\"bold\":true}},{\"font\":{\"bold\":true,\"size\":16}},{\"font\":{\"bold\":true,\"size\":16},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#2896ea\"],\"top\":[\"thin\",\"#2896ea\"],\"left\":[\"thin\",\"#2896ea\"],\"right\":[\"thin\",\"#2896ea\"]},\"font\":{\"size\":8}},{\"border\":{\"bottom\":[\"thin\",\"#2896ea\"],\"top\":[\"thin\",\"#2896ea\"],\"left\":[\"thin\",\"#2896ea\"],\"right\":[\"thin\",\"#2896ea\"]},\"font\":{\"size\":8},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#2896ea\"],\"top\":[\"thin\",\"#2896ea\"],\"left\":[\"thin\",\"#2896ea\"],\"right\":[\"thin\",\"#2896ea\"]},\"font\":{\"size\":8},\"align\":\"center\",\"format\":\"number\"},{\"bgcolor\":\"#5b9cd6\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#2896ea\"],\"top\":[\"thin\",\"#2896ea\"],\"left\":[\"thin\",\"#2896ea\"],\"right\":[\"thin\",\"#2896ea\"]}},{\"bgcolor\":\"#5b9cd6\"},{\"bgcolor\":\"#5b9cd6\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]}},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"font\":{\"size\":8},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"font\":{\"size\":8},\"align\":\"center\",\"format\":\"number\"},{\"bgcolor\":\"#5b9cd6\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#9cc2e6\"],\"top\":[\"thin\",\"#9cc2e6\"],\"left\":[\"thin\",\"#9cc2e6\"],\"right\":[\"thin\",\"#9cc2e6\"]}},{\"border\":{\"bottom\":[\"thin\",\"#9cc2e6\"],\"top\":[\"thin\",\"#9cc2e6\"],\"left\":[\"thin\",\"#9cc2e6\"],\"right\":[\"thin\",\"#9cc2e6\"]},\"font\":{\"size\":8},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#9cc2e6\"],\"top\":[\"thin\",\"#9cc2e6\"],\"left\":[\"thin\",\"#9cc2e6\"],\"right\":[\"thin\",\"#9cc2e6\"]},\"font\":{\"size\":8},\"align\":\"center\",\"format\":\"number\"},{\"bgcolor\":\"#5b9cd6\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#4371c6\"],\"top\":[\"thin\",\"#4371c6\"],\"left\":[\"thin\",\"#4371c6\"],\"right\":[\"thin\",\"#4371c6\"]}},{\"border\":{\"bottom\":[\"thin\",\"#4371c6\"],\"top\":[\"thin\",\"#4371c6\"],\"left\":[\"thin\",\"#4371c6\"],\"right\":[\"thin\",\"#4371c6\"]},\"font\":{\"size\":8},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#4371c6\"],\"top\":[\"thin\",\"#4371c6\"],\"left\":[\"thin\",\"#4371c6\"],\"right\":[\"thin\",\"#4371c6\"]},\"font\":{\"size\":8},\"align\":\"center\",\"format\":\"number\"},{\"bgcolor\":\"#5b9cd6\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#a5a5a5\"],\"top\":[\"thin\",\"#a5a5a5\"],\"left\":[\"thin\",\"#a5a5a5\"],\"right\":[\"thin\",\"#a5a5a5\"]}},{\"bgcolor\":\"#5b9cd6\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"],\"top\":[\"thin\",\"#7f7f7f\"],\"left\":[\"thin\",\"#7f7f7f\"],\"right\":[\"thin\",\"#7f7f7f\"]}},{\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"],\"top\":[\"thin\",\"#7f7f7f\"],\"left\":[\"thin\",\"#7f7f7f\"],\"right\":[\"thin\",\"#7f7f7f\"]},\"font\":{\"size\":8},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"],\"top\":[\"thin\",\"#7f7f7f\"],\"left\":[\"thin\",\"#7f7f7f\"],\"right\":[\"thin\",\"#7f7f7f\"]},\"font\":{\"size\":8},\"align\":\"center\",\"format\":\"number\"},{\"bgcolor\":\"#5b9cd6\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#e7e5e6\"],\"top\":[\"thin\",\"#e7e5e6\"],\"left\":[\"thin\",\"#e7e5e6\"],\"right\":[\"thin\",\"#e7e5e6\"]}},{\"border\":{\"bottom\":[\"thin\",\"#e7e5e6\"],\"top\":[\"thin\",\"#e7e5e6\"],\"left\":[\"thin\",\"#e7e5e6\"],\"right\":[\"thin\",\"#e7e5e6\"]},\"font\":{\"size\":8},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#e7e5e6\"],\"top\":[\"thin\",\"#e7e5e6\"],\"left\":[\"thin\",\"#e7e5e6\"],\"right\":[\"thin\",\"#e7e5e6\"]},\"font\":{\"size\":8},\"align\":\"center\",\"format\":\"number\"},{\"bgcolor\":\"#5b9cd6\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#d0cecf\"],\"top\":[\"thin\",\"#d0cecf\"],\"left\":[\"thin\",\"#d0cecf\"],\"right\":[\"thin\",\"#d0cecf\"]}},{\"border\":{\"bottom\":[\"thin\",\"#d0cecf\"],\"top\":[\"thin\",\"#d0cecf\"],\"left\":[\"thin\",\"#d0cecf\"],\"right\":[\"thin\",\"#d0cecf\"]},\"font\":{\"size\":8},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#d0cecf\"],\"top\":[\"thin\",\"#d0cecf\"],\"left\":[\"thin\",\"#d0cecf\"],\"right\":[\"thin\",\"#d0cecf\"]},\"font\":{\"size\":8},\"align\":\"center\",\"format\":\"number\"},{\"bgcolor\":\"#5b9cd6\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#d0cecf\"],\"top\":[\"thin\",\"#d0cecf\"],\"left\":[\"thin\",\"#d0cecf\"],\"right\":[\"thin\",\"#d0cecf\"]},\"color\":\"#ffffff\"},{\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"bgcolor\":\"#5b9cd6\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#afabac\"],\"top\":[\"thin\",\"#afabac\"],\"left\":[\"thin\",\"#afabac\"],\"right\":[\"thin\",\"#afabac\"]},\"color\":\"#ffffff\"},{\"border\":{\"bottom\":[\"thin\",\"#afabac\"],\"top\":[\"thin\",\"#afabac\"],\"left\":[\"thin\",\"#afabac\"],\"right\":[\"thin\",\"#afabac\"]},\"font\":{\"size\":8},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#afabac\"],\"top\":[\"thin\",\"#afabac\"],\"left\":[\"thin\",\"#afabac\"],\"right\":[\"thin\",\"#afabac\"]},\"font\":{\"size\":8},\"align\":\"center\",\"format\":\"number\"},{\"bgcolor\":\"#5b9cd6\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#f2f2f2\"],\"top\":[\"thin\",\"#f2f2f2\"],\"left\":[\"thin\",\"#f2f2f2\"],\"right\":[\"thin\",\"#f2f2f2\"]},\"color\":\"#ffffff\"},{\"border\":{\"bottom\":[\"thin\",\"#f2f2f2\"],\"top\":[\"thin\",\"#f2f2f2\"],\"left\":[\"thin\",\"#f2f2f2\"],\"right\":[\"thin\",\"#f2f2f2\"]},\"font\":{\"size\":8},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#f2f2f2\"],\"top\":[\"thin\",\"#f2f2f2\"],\"left\":[\"thin\",\"#f2f2f2\"],\"right\":[\"thin\",\"#f2f2f2\"]},\"font\":{\"size\":8},\"align\":\"center\",\"format\":\"number\"},{\"bgcolor\":\"#5b9cd6\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"color\":\"#ffffff\"},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"font\":{\"size\":8},\"align\":\"center\",\"bgcolor\":\"#d7f2f9\"},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"font\":{\"size\":8},\"align\":\"center\",\"format\":\"number\",\"bgcolor\":\"#deeaf6\"},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"font\":{\"size\":8},\"align\":\"center\",\"format\":\"number\",\"bgcolor\":\"#bdd7ee\"},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"font\":{\"size\":10},\"align\":\"center\",\"bgcolor\":\"#d7f2f9\"},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"font\":{\"size\":9},\"align\":\"center\",\"bgcolor\":\"#d7f2f9\"},{\"align\":\"center\",\"bgcolor\":\"#bdd7ee\"},{\"bgcolor\":\"#bdd7ee\"},{\"bgcolor\":\"#bdd7ee\",\"format\":\"number\"},{\"bgcolor\":\"#bdd7ee\",\"format\":\"number\",\"align\":\"center\"}],\"validations\":[],\"isGroup\":true,\"cols\":{\"0\":{\"width\":21},\"1\":{\"width\":63},\"2\":{\"width\":85},\"3\":{\"width\":95},\"4\":{\"width\":83},\"5\":{\"width\":81},\"6\":{\"width\":88},\"7\":{\"width\":89},\"8\":{\"width\":87},\"9\":{\"width\":95},\"10\":{\"width\":92},\"11\":{\"width\":95},\"12\":{\"width\":96},\"13\":{\"width\":98},\"14\":{\"width\":98},\"15\":{\"width\":78},\"16\":{\"width\":110},\"17\":{\"width\":111},\"18\":{\"width\":102},\"19\":{\"width\":102},\"20\":{\"width\":114},\"21\":{\"width\":111},\"22\":{\"width\":113},\"23\":{\"width\":107},\"24\":{\"width\":115},\"25\":{\"width\":135},\"len\":49},\"merges\":[\"D2:P2\",\"B2:C3\",\"Q2:Z2\",\"B1:T1\",\"B5:C5\"]}', NULL, 'https://static.jeecg.com/designreport/images/chaoshi_1607069609875.png', 'admin', '2020-12-03 19:21:55', 'admin', '2021-07-13 05:39:05', 0, NULL, NULL, 1, 372, NULL, NULL, NULL); +INSERT INTO `jimu_report` VALUES ('1334696790477377536', '20201204111149', '学校收入一览表', NULL, NULL, 'datainfo', '{\"loopBlockList\":[],\"area\":{\"sri\":1,\"sci\":24,\"eri\":5,\"eci\":24,\"width\":100,\"height\":138},\"excel_config_id\":\"1334696790477377536\",\"printConfig\":{\"paper\":\"A4\",\"width\":210,\"height\":297,\"definition\":1,\"isBackend\":false,\"marginX\":10,\"marginY\":10},\"rows\":{\"0\":{\"cells\":{\"1\":{\"text\":\"学校收入一览表\",\"merge\":[0,13],\"style\":25}},\"height\":71},\"1\":{\"cells\":{\"1\":{\"text\":\"校园信息\",\"merge\":[1,2],\"style\":40},\"4\":{\"text\":\"学生信息\",\"merge\":[1,2],\"style\":40},\"7\":{\"merge\":[1,5],\"style\":42,\"text\":\"收款信息\"},\"13\":{\"merge\":[0,10],\"text\":\"确认收入信息\",\"style\":43}},\"height\":23},\"2\":{\"cells\":{\"13\":{\"merge\":[0,3],\"text\":\"2020.09\",\"style\":46},\"17\":{\"merge\":[0,3],\"text\":\"2020.10\",\"style\":46},\"21\":{\"text\":\"合计\",\"style\":46,\"merge\":[0,2]}},\"height\":40},\"3\":{\"cells\":{\"1\":{\"text\":\"所属城际\",\"style\":50},\"2\":{\"text\":\"所属校园\",\"style\":50},\"3\":{\"text\":\"NC帐套\",\"style\":50},\"4\":{\"text\":\"学号\",\"style\":50},\"5\":{\"text\":\"姓名\",\"style\":50},\"6\":{\"text\":\"性质\",\"style\":50},\"7\":{\"text\":\"缴费金额\",\"style\":50},\"8\":{\"text\":\"缴费时间\",\"style\":50},\"9\":{\"text\":\"缴费性质\",\"style\":50},\"10\":{\"text\":\"缴费所属期间\",\"style\":50},\"11\":{\"text\":\"缴费月份数\",\"style\":50},\"12\":{\"text\":\"缴费方式\",\"style\":50},\"13\":{\"text\":\"全部\",\"style\":50},\"14\":{\"text\":\"学费\",\"style\":50},\"15\":{\"text\":\"餐费\",\"style\":50},\"16\":{\"text\":\"校车费\",\"style\":50},\"17\":{\"text\":\"全部\",\"style\":50},\"18\":{\"text\":\"学费\",\"style\":50},\"19\":{\"text\":\"餐费\",\"style\":50},\"20\":{\"text\":\"校车费\",\"style\":50},\"21\":{\"text\":\"全部\",\"style\":50},\"22\":{\"text\":\"学费\",\"style\":50},\"23\":{\"text\":\"餐费\",\"style\":50}}},\"4\":{\"cells\":{\"1\":{\"text\":\"#{shouru.group(city)}\",\"style\":45,\"aggregate\":\"group\"},\"2\":{\"text\":\"#{shouru.group(school)}\",\"style\":45,\"aggregate\":\"group\"},\"3\":{\"text\":\"#{shouru.group(ncnum)}\",\"style\":35,\"aggregate\":\"group\"},\"4\":{\"text\":\"#{shouru.num}\",\"style\":35},\"5\":{\"text\":\"#{shouru.name}\",\"style\":35},\"6\":{\"text\":\"#{shouru.class}\",\"style\":35},\"7\":{\"text\":\"#{shouru.pay}\",\"style\":35},\"8\":{\"text\":\"#{shouru.paytime}\",\"style\":35},\"9\":{\"text\":\"#{shouru.payclass}\",\"style\":35},\"10\":{\"text\":\"#{shouru.pay1}\",\"style\":35},\"11\":{\"text\":\"#{shouru.paymoth}\",\"style\":35},\"12\":{\"text\":\"#{shouru.pay2}\",\"style\":35},\"13\":{\"style\":33,\"text\":\"=SUM(O5:Q5)\"},\"14\":{\"text\":\"#{shouru.tuition_09}\",\"style\":35},\"15\":{\"text\":\"#{shouru.meals_09}\",\"style\":35},\"16\":{\"text\":\"#{shouru.busfee_09}\",\"style\":35},\"17\":{\"style\":33,\"text\":\"=SUM(S5:U5)\"},\"18\":{\"text\":\"#{shouru.tuition_10}\",\"style\":35},\"19\":{\"text\":\"#{shouru.meals_10}\",\"style\":35},\"20\":{\"text\":\"#{shouru.busfee_10}\",\"style\":35},\"21\":{\"style\":33,\"text\":\"=SUM(W5,X5)\"},\"22\":{\"style\":35,\"text\":\"=SUM(O5,S5)\"},\"23\":{\"style\":35,\"text\":\"=SUM(P5,T5)\"}},\"isDrag\":true,\"height\":25},\"5\":{\"cells\":{\"1\":{\"style\":66,\"text\":\"合计\"},\"2\":{\"text\":\" \",\"style\":66},\"3\":{\"style\":66,\"text\":\" \"},\"4\":{\"style\":66,\"text\":\" \"},\"5\":{\"style\":66,\"text\":\" \"},\"6\":{\"style\":66,\"text\":\" \"},\"7\":{\"style\":66,\"text\":\" \"},\"8\":{\"style\":66,\"text\":\" \"},\"9\":{\"style\":66,\"text\":\" \"},\"10\":{\"style\":66,\"text\":\" \"},\"11\":{\"style\":66,\"text\":\" \"},\"12\":{\"style\":66,\"text\":\" \"},\"13\":{\"style\":66,\"text\":\" \"},\"14\":{\"style\":66,\"text\":\" \"},\"15\":{\"style\":66,\"text\":\" \"},\"16\":{\"style\":66,\"text\":\" \"},\"17\":{\"style\":66,\"text\":\" \"},\"18\":{\"text\":\" \",\"style\":66},\"19\":{\"style\":66,\"text\":\" \"},\"20\":{\"style\":66,\"text\":\" \"},\"21\":{\"style\":15,\"text\":\"=SUM(V5)\"},\"22\":{\"style\":15,\"text\":\"=SUM(W5)\"},\"23\":{\"style\":15,\"text\":\"=SUM(X5)\"}}},\"9\":{\"cells\":{}},\"11\":{\"cells\":{}},\"len\":101},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":718,\"heightPx\":1047},\"dicts\":[],\"groupField\":\"shouru.city\",\"freeze\":\"A1\",\"dataRectWidth\":1881,\"displayConfig\":{},\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"align\":\"center\"},{\"align\":\"center\",\"bgcolor\":\"#\"},{\"align\":\"center\",\"bgcolor\":\"#309fc6\"},{\"bgcolor\":\"#ffffff\"},{\"align\":\"center\",\"bgcolor\":\"#309fc6\",\"color\":\"#ffffff\"},{\"align\":\"center\",\"bgcolor\":\"#b2ddec\"},{\"align\":\"center\",\"bgcolor\":\"#309fc6\",\"color\":\"#ffffff\",\"font\":{\"size\":8}},{\"align\":\"center\",\"bgcolor\":\"#b2ddec\",\"font\":{\"size\":8}},{\"align\":\"center\",\"bgcolor\":\"#309fc6\",\"color\":\"#ffffff\",\"font\":{\"size\":9}},{\"align\":\"center\",\"bgcolor\":\"#b2ddec\",\"font\":{\"size\":9}},{\"align\":\"center\",\"bgcolor\":\"#309fc6\",\"color\":\"#ffffff\",\"font\":{\"size\":10}},{\"align\":\"center\",\"bgcolor\":\"\"},{\"align\":\"center\",\"bgcolor\":\"#309fc6\",\"color\":\"#ffffff\",\"font\":{\"size\":10},\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"align\":\"center\",\"bgcolor\":\"#309fc6\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"align\":\"center\",\"bgcolor\":\"#b2ddec\",\"font\":{\"size\":9},\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"align\":\"center\",\"bgcolor\":\"#b2ddec\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"font\":{\"size\":9}},{\"align\":\"center\",\"font\":{\"size\":9}},{\"align\":\"center\",\"bgcolor\":\"#dff2f9\"},{\"bgcolor\":\"\"},{\"bgcolor\":\"#309fc6\"},{\"align\":\"center\",\"color\":\"#ffffff\"},{\"align\":\"center\",\"bgcolor\":\"#dff2f9\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"align\":\"center\",\"font\":{\"size\":16}},{\"align\":\"center\",\"font\":{\"size\":16,\"bold\":true}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#b2ddec\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#dff2f9\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"b2ddec\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"¥b2ddec\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"size\":8}},{\"align\":\"center\",\"bgcolor\":\"#b2ddec\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8}},{\"align\":\"center\",\"bgcolor\":\"#dff2f9\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"align\":\"center\",\"font\":{\"size\":8}},{\"align\":\"center\",\"bgcolor\":\"#dff2f9\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"align\":\"center\",\"font\":{\"size\":9}},{\"align\":\"center\",\"bgcolor\":\"\",\"color\":\"#ffffff\",\"font\":{\"size\":10},\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"align\":\"center\",\"bgcolor\":\"\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"align\":\"center\",\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\",\"font\":{\"size\":10},\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"bgcolor\":\"#5b9cd6\"},{\"align\":\"center\",\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"align\":\"center\",\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"align\":\"center\",\"bgcolor\":\"#d7f2f9\",\"font\":{\"size\":9},\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"align\":\"center\",\"bgcolor\":\"#d7f2f9\",\"font\":{\"size\":8},\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"align\":\"center\",\"bgcolor\":\"#5b9cd6\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"align\":\"center\",\"bgcolor\":\"#5b9cd6\"},{\"align\":\"center\",\"bgcolor\":\"#bdd7ee\",\"font\":{\"size\":9},\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"font\":{\"size\":8}},{\"align\":\"center\",\"bgcolor\":\"#bdd7ee\",\"font\":{\"size\":8},\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"font\":{\"size\":10}},{\"align\":\"center\",\"bgcolor\":\"#bdd7ee\",\"font\":{\"size\":10},\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"align\":\"center\",\"font\":{\"size\":10}},{\"align\":\"center\",\"bgcolor\":\"#d7f2f9\",\"font\":{\"size\":10},\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"align\":\"center\",\"font\":{\"size\":10}},{\"font\":{\"size\":12}},{\"align\":\"center\",\"bgcolor\":\"#bdd7ee\",\"font\":{\"size\":12},\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"align\":\"center\",\"font\":{\"size\":12}},{\"align\":\"center\",\"bgcolor\":\"#d7f2f9\",\"font\":{\"size\":12},\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"align\":\"center\",\"font\":{\"size\":12}},{\"font\":{\"size\":10.5}},{\"align\":\"center\",\"bgcolor\":\"#bdd7ee\",\"font\":{\"size\":10.5},\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"align\":\"center\",\"font\":{\"size\":10.5}},{\"align\":\"center\",\"bgcolor\":\"#d7f2f9\",\"font\":{\"size\":10.5},\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"align\":\"center\",\"font\":{\"size\":10.5}},{\"align\":\"left\",\"bgcolor\":\"#b2ddec\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"align\":\"left\"}],\"validations\":[],\"isGroup\":true,\"cols\":{\"0\":{\"width\":37},\"1\":{\"width\":79},\"2\":{\"width\":87},\"3\":{\"width\":79},\"4\":{\"width\":92},\"5\":{\"width\":90},\"6\":{\"width\":77},\"7\":{\"width\":83},\"8\":{\"width\":89},\"9\":{\"width\":79},\"10\":{\"width\":89},\"11\":{\"width\":84},\"12\":{\"width\":76},\"13\":{\"width\":67},\"14\":{\"width\":74},\"15\":{\"width\":69},\"16\":{\"width\":74},\"17\":{\"width\":68},\"18\":{\"width\":76},\"19\":{\"width\":79},\"20\":{\"width\":78},\"21\":{\"width\":74},\"22\":{\"width\":81},\"len\":49},\"merges\":[\"B2:D3\",\"E2:G3\",\"H2:M3\",\"N3:Q3\",\"R3:U3\",\"V3:X3\",\"N2:X2\",\"B1:O1\"]}', NULL, 'https://static.jeecg.com/designreport/images/xuexiao_1607069724407.png', 'admin', '2020-12-04 11:11:50', 'admin', '2021-07-13 05:39:04', 0, NULL, NULL, 1, 432, NULL, NULL, NULL); +INSERT INTO `jimu_report` VALUES ('1334757703079301120', '20201204151358', '车间零件完工一览表', NULL, NULL, 'datainfo', '{\"loopBlockList\":[],\"area\":{\"sri\":7,\"sci\":2,\"eri\":7,\"eci\":2,\"width\":121,\"height\":25},\"excel_config_id\":\"1334757703079301120\",\"printConfig\":{\"paper\":\"A3\",\"width\":297,\"height\":420,\"definition\":1,\"isBackend\":false,\"marginX\":10,\"marginY\":10,\"layout\":\"landscape\"},\"rows\":{\"0\":{\"cells\":{\"1\":{\"text\":\"车间零件完工一览表\",\"merge\":[0,12],\"style\":23}},\"height\":81},\"1\":{\"cells\":{\"1\":{\"text\":\"车间\",\"style\":22},\"2\":{\"text\":\"成品名称\",\"style\":22},\"3\":{\"text\":\"半成品名称\",\"style\":22},\"4\":{\"text\":\"完工时间\",\"style\":22},\"5\":{\"text\":\"状态\",\"style\":22},\"6\":{\"text\":\"成品属性\",\"style\":22},\"7\":{\"text\":\"工单号\",\"style\":22},\"8\":{\"text\":\"工单数量\",\"style\":22},\"9\":{\"text\":\"计划数量\",\"style\":22},\"10\":{\"text\":\"完成数量\",\"style\":22},\"11\":{\"text\":\"UPH\",\"style\":22},\"12\":{\"text\":\"H/C\",\"style\":22},\"13\":{\"text\":\"计划时间\",\"style\":22},\"14\":{\"text\":\"良率\",\"style\":22},\"15\":{\"text\":\"备注\",\"style\":22}},\"height\":55},\"2\":{\"cells\":{\"1\":{\"text\":\"#{chejian.group(city)}\",\"style\":16,\"aggregate\":\"group\"},\"2\":{\"text\":\"#{chejian.finish}\",\"style\":14},\"3\":{\"text\":\"#{chejian.semifinish}\",\"style\":14},\"4\":{\"text\":\"#{chejian.time}\",\"style\":14},\"5\":{\"text\":\"#{chejian.state}\",\"style\":14},\"6\":{\"text\":\"#{chejian.attribute}\",\"style\":14},\"7\":{\"text\":\"#{chejian.num}\",\"style\":14},\"8\":{\"text\":\"#{chejian.gnum}\",\"style\":14},\"9\":{\"text\":\"#{chejian.jnum}\",\"style\":14},\"10\":{\"text\":\"#{chejian.wnum}\",\"style\":14},\"11\":{\"text\":\"#{chejian.uph}\",\"style\":14},\"12\":{\"text\":\"#{chejian.hc}\",\"style\":14},\"13\":{\"text\":\"#{chejian.jtime}\",\"style\":14},\"14\":{\"text\":\"#{chejian.yield}\",\"style\":14},\"15\":{\"text\":\"#{chejian.beizhu}\",\"style\":14}},\"isDrag\":true,\"height\":35},\"len\":100},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":718,\"heightPx\":1047},\"dicts\":[],\"groupField\":\"chejian.city\",\"freeze\":\"A1\",\"dataRectWidth\":1476,\"displayConfig\":{},\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"align\":\"center\"},{\"align\":\"center\",\"bgcolor\":\"#\"},{\"align\":\"center\",\"bgcolor\":\"#309fc6\"},{\"align\":\"center\",\"bgcolor\":\"#309fc6\",\"color\":\"#ffffff\"},{\"bgcolor\":\"#309fc6\"},{\"bgcolor\":\"#309fc6\",\"color\":\"#ffffff\"},{\"align\":\"center\",\"bgcolor\":\"#309fc6\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"bgcolor\":\"#309fc6\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"font\":{\"bold\":true}},{\"font\":{\"bold\":true,\"size\":16}},{\"font\":{\"size\":9}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9}},{\"font\":{\"size\":9},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9},\"align\":\"center\",\"bgcolor\":\"#\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9},\"align\":\"center\",\"bgcolor\":\"#b2ddec\"},{\"font\":{\"size\":8}},{\"align\":\"center\",\"bgcolor\":\"#309fc6\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8}},{\"font\":{\"size\":8},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8},\"align\":\"center\",\"bgcolor\":\"#b2ddec\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8},\"align\":\"center\"},{\"align\":\"center\",\"bgcolor\":\"#309fc6\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9}},{\"font\":{\"bold\":true,\"size\":16},\"align\":\"center\"}],\"validations\":[],\"isGroup\":true,\"cols\":{\"0\":{\"width\":27},\"1\":{\"width\":106},\"2\":{\"width\":121},\"3\":{\"width\":124},\"4\":{\"width\":87},\"5\":{\"width\":76},\"6\":{\"width\":82},\"7\":{\"width\":81},\"8\":{\"width\":69},\"9\":{\"width\":76},\"10\":{\"width\":81},\"15\":{\"width\":146},\"len\":50},\"merges\":[\"B1:N1\"]}', NULL, 'https://static.jeecg.com/designreport/images/QQ截图20201216185352_1608116050060.png', 'admin', '2020-12-04 15:13:58', 'admin', '2021-07-13 05:39:02', 0, NULL, NULL, 1, 526, NULL, NULL, NULL); +INSERT INTO `jimu_report` VALUES ('1338370016550195200', '20201214142804', '条形码报表', NULL, NULL, 'datainfo', '{\"loopBlockList\":[],\"area\":{\"sri\":3,\"sci\":4,\"eri\":3,\"eci\":4,\"width\":96,\"height\":47},\"excel_config_id\":\"1338370016550195200\",\"printConfig\":{\"paper\":\"A4\",\"width\":210,\"height\":297,\"definition\":1,\"isBackend\":false,\"marginX\":10,\"marginY\":10,\"layout\":\"portrait\"},\"rows\":{\"0\":{\"cells\":{\"1\":{\"merge\":[1,3],\"text\":\"居民身份证申领登记表\",\"style\":39},\"5\":{\"merge\":[0,2],\"text\":\"\",\"rendered\":\"\",\"display\":\"text\"},\"-1\":{\"text\":\"${tm.tp}\"}},\"height\":27},\"1\":{\"cells\":{\"5\":{\"style\":2,\"virtual\":\"ZiOFmILaRjdmVs6E\",\"rendered\":\"DnK6I7VRVFyw8dUQ\",\"display\":\"barcode\",\"text\":\"${tm.tm}\",\"merge\":[0,2]}},\"height\":52},\"2\":{\"cells\":{\"1\":{\"text\":\"受理单位(盖章)珠海市公安局\",\"merge\":[0,3],\"style\":36},\"8\":{\"text\":\"\",\"rendered\":\"\"}},\"height\":34},\"3\":{\"cells\":{\"1\":{\"text\":\"姓名\",\"style\":24},\"2\":{\"text\":\"${tm.name}\",\"style\":7,\"rendered\":\"\"},\"3\":{\"text\":\"性别\",\"style\":16},\"4\":{\"text\":\"${tm.sex}\",\"style\":7,\"isDict\":1,\"dictCode\":\"sex1\",\"rendered\":\"\"},\"5\":{\"text\":\"民族\",\"style\":16},\"6\":{\"text\":\"${tm.nation}\",\"style\":7},\"7\":{\"text\":\"${tm.tp}\",\"style\":7,\"merge\":[2,0],\"rendered\":\"ftkUSZOje4A5gVO3\",\"display\":\"img\"},\"9\":{\"text\":\"\",\"rendered\":\"\"}},\"isDrag\":true,\"height\":47},\"4\":{\"cells\":{\"1\":{\"text\":\"出生日期\",\"style\":24},\"2\":{\"text\":\"${tm.birth}\",\"style\":32,\"merge\":[0,4]},\"8\":{\"text\":\"\",\"rendered\":\"\"}},\"isDrag\":true,\"height\":51},\"5\":{\"cells\":{\"1\":{\"text\":\"常住户口所在地住址\",\"style\":21},\"2\":{\"text\":\"${tm.zhuzhi}\",\"style\":7,\"merge\":[0,4]},\"8\":{\"text\":\"\",\"rendered\":\"\",\"config\":\"\"}},\"isDrag\":true,\"height\":62},\"6\":{\"cells\":{\"1\":{\"text\":\"公民身份证\",\"style\":24},\"2\":{\"text\":\"${tm.card}\",\"style\":7,\"merge\":[0,5]}},\"isDrag\":true,\"height\":55},\"7\":{\"cells\":{\"1\":{\"text\":\"有限期限\",\"style\":24},\"2\":{\"text\":\"${tm.ydate}\",\"style\":34,\"merge\":[0,1]},\"4\":{\"text\":\"签发机关\",\"style\":24},\"5\":{\"text\":\"${tm.qfjg}\",\"style\":7,\"merge\":[0,2]}},\"isDrag\":true,\"height\":52},\"8\":{\"cells\":{\"1\":{\"text\":\"申领原因\",\"style\":24},\"2\":{\"text\":\"${tm.slyy}\",\"style\":7,\"merge\":[0,5]}},\"isDrag\":true,\"height\":55},\"9\":{\"cells\":{\"1\":{\"text\":\"受理时间\",\"style\":24},\"2\":{\"text\":\"${tm.sdate}\",\"style\":32,\"merge\":[0,1]},\"4\":{\"text\":\"受理号\",\"style\":24},\"5\":{\"text\":\"${tm.shao}\",\"style\":7,\"merge\":[0,2]}},\"isDrag\":true,\"height\":49},\"10\":{\"cells\":{\"1\":{\"text\":\"承办人\",\"style\":24},\"2\":{\"text\":\"${tm.cbr}\",\"style\":7,\"merge\":[0,1]},\"4\":{\"text\":\"受理单位领导\",\"style\":24},\"5\":{\"text\":\"${tm.sld}\",\"style\":7,\"merge\":[0,2]}},\"isDrag\":true,\"height\":42},\"11\":{\"cells\":{\"1\":{\"text\":\"申请(监护)人签名\",\"style\":21},\"2\":{\"text\":\"${tm.sr}\",\"style\":7,\"merge\":[0,1]},\"4\":{\"text\":\"申请(监护)人联系电话\",\"style\":21},\"5\":{\"text\":\"${tm.jphone}\",\"style\":7,\"merge\":[0,2]}},\"isDrag\":true,\"height\":59},\"12\":{\"cells\":{\"1\":{\"text\":\"领证人签名\",\"style\":24},\"2\":{\"text\":\"${tm.lzr}\",\"style\":7,\"merge\":[0,1]},\"4\":{\"text\":\"领证时间\",\"style\":24},\"5\":{\"text\":\"${tm.ldate}\",\"style\":32,\"merge\":[0,2]}},\"isDrag\":true,\"height\":57},\"13\":{\"cells\":{\"1\":{\"text\":\"是否通过邮政特快专递方式领取二代\",\"merge\":[0,1],\"style\":24},\"3\":{\"text\":\"${tm.sk}\",\"style\":7,\"merge\":[0,4]}},\"isDrag\":true,\"height\":50},\"14\":{\"cells\":{\"1\":{\"text\":\"投递地址\",\"style\":24},\"2\":{\"text\":\"${tm.dizhi}\",\"style\":7,\"merge\":[0,2]},\"5\":{\"text\":\"收件人\",\"style\":24},\"6\":{\"style\":7,\"text\":\" \",\"merge\":[0,1]}},\"isDrag\":true,\"height\":53},\"15\":{\"cells\":{\"1\":{\"text\":\"邮政编码\",\"style\":24},\"2\":{\"text\":\"\",\"style\":7,\"merge\":[0,1]},\"4\":{\"text\":\"备注\",\"style\":24},\"5\":{\"text\":\"\",\"style\":7,\"merge\":[0,2]}},\"isDrag\":true,\"height\":47},\"16\":{\"cells\":{\"1\":{\"merge\":[0,6],\"text\":\"公安部治安管理局治\",\"style\":31}}},\"len\":100},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":718,\"heightPx\":1047},\"dicts\":[\"sex1\",\"sex1\",\"sex1\"],\"freeze\":\"A1\",\"dataRectWidth\":704,\"displayConfig\":{},\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"font\":{\"size\":16}},{\"font\":{\"size\":16},\"align\":\"center\"},{\"align\":\"center\"},{\"textwrap\":true},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"textwrap\":true,\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\"}},{\"textwrap\":true,\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\"}},{\"font\":{\"name\":\"宋体\",\"size\":9}},{\"font\":{\"name\":\"宋体\",\"size\":9},\"color\":\"#3f3f3f\"},{\"font\":{\"name\":\"宋体\",\"size\":9},\"color\":\"#0c0c0c\"},{\"font\":{\"name\":\"宋体\",\"size\":9},\"color\":\"#7f7f7f\"},{\"font\":{\"name\":\"宋体\",\"size\":9},\"color\":\"#595959\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\"},\"align\":\"right\"},{\"textwrap\":true,\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\",\"bold\":true}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\",\"bold\":false}},{\"textwrap\":true,\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\",\"bold\":false}},{\"textwrap\":true,\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\",\"bold\":false},\"align\":\"center\"},{\"textwrap\":true,\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\",\"bold\":true}},{\"textwrap\":true,\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\",\"bold\":true},\"align\":\"center\"},{\"font\":{\"name\":\"宋体\",\"bold\":true}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\",\"bold\":true},\"align\":\"right\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\",\"bold\":true},\"align\":\"center\"},{\"font\":{\"name\":\"宋体\",\"bold\":true},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\"},\"align\":\"center\"},{\"font\":{\"size\":8}},{\"font\":{\"size\":8},\"align\":\"center\"},{\"font\":{\"size\":8},\"align\":\"right\"},{\"font\":{\"size\":10},\"align\":\"right\"},{\"font\":{\"size\":10},\"align\":\"right\",\"color\":\"#7f7f7f\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\"},\"format\":\"date2\"},{\"format\":\"date2\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\"},\"format\":\"date\"},{\"format\":\"date\"},{\"font\":{\"name\":\"宋体\",\"size\":9},\"color\":\"#595959\",\"valign\":\"bottom\"},{\"align\":\"center\",\"font\":{\"bold\":true}},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":16}},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":16},\"valign\":\"bottom\"}],\"validations\":[],\"cols\":{\"0\":{\"width\":16},\"1\":{\"width\":103},\"2\":{\"width\":156},\"3\":{\"width\":51},\"4\":{\"width\":96},\"5\":{\"width\":61},\"6\":{\"width\":106},\"7\":{\"width\":115},\"8\":{\"width\":135},\"len\":50},\"merges\":[\"B1:E2\",\"F1:H1\",\"F2:H2\",\"B3:E3\",\"H4:H6\",\"C5:G5\",\"C6:G6\",\"C7:H7\",\"C8:D8\",\"F8:H8\",\"C9:H9\",\"C10:D10\",\"F10:H10\",\"C11:D11\",\"F11:H11\",\"C12:D12\",\"F12:H12\",\"C13:D13\",\"F13:H13\",\"B14:C14\",\"D14:H14\",\"C15:E15\",\"G15:H15\",\"C16:D16\",\"F16:H16\",\"B17:H17\"]}', NULL, 'https://static.jeecg.com/designreport/images/未标题-1_1608118350039.png', 'admin', '2020-12-14 14:28:04', 'admin', '2021-07-13 05:39:00', 0, NULL, NULL, 1, 771, NULL, NULL, NULL); +INSERT INTO `jimu_report` VALUES ('1338744112815411200', '20201215151426', '简单条件查询报表', NULL, NULL, 'datainfo', '{\"loopBlockList\":[],\"area\":false,\"printElWidth\":718,\"excel_config_id\":\"1338744112815411200\",\"printElHeight\":1047,\"rows\":{\"1\":{\"cells\":{\"1\":{\"text\":\"职务\",\"style\":51},\"2\":{\"text\":\"雇员ID\",\"style\":51},\"3\":{\"text\":\"姓名\",\"style\":51},\"4\":{\"text\":\"性别\",\"style\":51},\"5\":{\"text\":\"雇佣日期\",\"style\":51},\"6\":{\"text\":\"家庭电话\",\"style\":51},\"7\":{\"text\":\"出生日期\",\"style\":51},\"8\":{\"text\":\"户口所在地\",\"style\":51},\"9\":{\"text\":\"联系地址\",\"style\":51},\"10\":{\"text\":\"紧急联系人\",\"style\":52}},\"height\":37},\"2\":{\"cells\":{\"0\":{\"style\":18},\"1\":{\"style\":21,\"text\":\"#{jdcx.group(update_by)}\",\"aggregate\":\"group\"},\"2\":{\"style\":21,\"text\":\"#{jdcx.id}\"},\"3\":{\"style\":21,\"text\":\"#{jdcx.name}\"},\"4\":{\"style\":21,\"text\":\"#{jdcx.sex}\"},\"5\":{\"style\":24,\"text\":\"#{jdcx.gtime}\"},\"6\":{\"style\":21,\"text\":\"#{jdcx.jphone}\"},\"7\":{\"style\":24,\"text\":\"#{jdcx.birth}\"},\"8\":{\"style\":21,\"text\":\"#{jdcx.hukou}\"},\"9\":{\"style\":21,\"text\":\"#{jdcx.laddress}\"},\"10\":{\"style\":56,\"text\":\"#{jdcx.jperson}\"},\"11\":{\"style\":18},\"12\":{\"style\":18},\"13\":{\"style\":18},\"14\":{\"style\":18},\"15\":{\"style\":18},\"16\":{\"style\":18},\"17\":{\"style\":18},\"18\":{\"style\":18},\"19\":{\"style\":18},\"20\":{\"style\":18},\"21\":{\"style\":18},\"22\":{\"style\":18},\"23\":{\"style\":18},\"24\":{\"style\":18},\"25\":{\"style\":18},\"26\":{\"style\":18},\"27\":{\"style\":18},\"28\":{\"style\":18},\"29\":{\"style\":18},\"30\":{\"style\":18},\"31\":{\"style\":18},\"32\":{\"style\":18},\"33\":{\"style\":18},\"34\":{\"style\":18},\"35\":{\"style\":18},\"36\":{\"style\":18},\"37\":{\"style\":18},\"38\":{\"style\":18},\"39\":{\"style\":18},\"40\":{\"style\":18},\"41\":{\"style\":18},\"42\":{\"style\":18},\"43\":{\"style\":18},\"44\":{\"style\":18},\"45\":{\"style\":18},\"46\":{\"style\":18},\"47\":{\"style\":18},\"48\":{\"style\":18}},\"height\":34},\"3\":{\"cells\":{\"0\":{\"style\":39},\"1\":{\"style\":39},\"2\":{\"style\":39},\"3\":{\"style\":39},\"4\":{\"style\":39},\"5\":{\"style\":39},\"6\":{\"style\":39},\"7\":{\"style\":39},\"8\":{\"style\":39},\"9\":{\"style\":39},\"10\":{\"style\":39},\"11\":{\"style\":39},\"12\":{\"style\":39},\"13\":{\"style\":39},\"14\":{\"style\":39},\"15\":{\"style\":39},\"16\":{\"style\":39},\"17\":{\"style\":39},\"18\":{\"style\":39},\"19\":{\"style\":39},\"20\":{\"style\":39},\"21\":{\"style\":39},\"22\":{\"style\":39},\"23\":{\"style\":39},\"24\":{\"style\":39}}},\"4\":{\"cells\":{\"1\":{\"text\":\"备注:\",\"style\":62},\"2\":{\"style\":63,\"text\":\" \"},\"3\":{\"style\":63,\"text\":\" \"},\"4\":{\"style\":63,\"text\":\" \"},\"5\":{\"style\":63,\"text\":\" \"},\"6\":{\"style\":63,\"text\":\" \"},\"7\":{\"style\":64,\"text\":\" \"}}},\"5\":{\"cells\":{\"1\":{\"text\":\"1、支持模糊查询,需要输入 “*+字符串”或 “字符串+* ”或“*+字符串+*”,如:张* / *丽 / *亚*;\",\"style\":65,\"merge\":[0,6]}}},\"6\":{\"cells\":{\"1\":{\"text\":\"2、以上“出生日期”为时间类型;\",\"style\":65,\"merge\":[0,6]}}},\"7\":{\"cells\":{\"1\":{\"text\":\"3、以上“雇佣日期”为日期类型\",\"style\":65,\"merge\":[0,6]}}},\"8\":{\"cells\":{\"1\":{\"text\":\"4、以上“姓名”为字符串类型,支持精准查询和模糊查询;\",\"style\":67,\"merge\":[0,6]}}},\"len\":100},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":718,\"heightPx\":1047},\"dicts\":[],\"groupField\":\"jdcx.update_by\",\"freeze\":\"A1\",\"dataRectWidth\":1242,\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"bgcolor\":\"#5b9cd6\"},{\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"color\":\"#ffffff\"},{\"align\":\"center\"},{\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\",\"align\":\"center\"},{\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"align\":\"center\"},{\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#f1f9f6\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#ddefe8\"},{\"font\":{\"size\":8}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#f1f9f6\",\"font\":{\"size\":8}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#ddefe8\",\"font\":{\"size\":8}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8}},{\"font\":{\"size\":9}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#f1f9f6\",\"font\":{\"size\":9}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#ddefe8\",\"font\":{\"size\":9}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9}},{\"font\":{\"size\":9},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#f1f9f6\",\"font\":{\"size\":9},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#ddefe8\",\"font\":{\"size\":9},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#ddefe8\",\"font\":{\"size\":9},\"align\":\"left\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9},\"align\":\"left\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9},\"align\":\"center\",\"format\":\"date\"},{\"align\":\"center\",\"font\":{\"name\":\"宋体\"}},{\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"name\":\"宋体\"}},{\"font\":{\"size\":9,\"name\":\"宋体\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#f1f9f6\",\"font\":{\"size\":9,\"name\":\"宋体\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#ddefe8\",\"font\":{\"size\":9,\"name\":\"宋体\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9,\"name\":\"宋体\"},\"align\":\"left\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9,\"name\":\"宋体\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9,\"name\":\"宋体\"},\"align\":\"center\",\"format\":\"date\"},{\"font\":{\"size\":10,\"name\":\"宋体\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#f1f9f6\",\"font\":{\"size\":10,\"name\":\"宋体\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#ddefe8\",\"font\":{\"size\":10,\"name\":\"宋体\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":10,\"name\":\"宋体\"},\"align\":\"left\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":10,\"name\":\"宋体\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":10,\"name\":\"宋体\"},\"align\":\"center\",\"format\":\"date\"},{\"font\":{\"name\":\"Microsoft YaHei\"}},{\"align\":\"center\",\"font\":{\"name\":\"Microsoft YaHei\"}},{\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"font\":{\"size\":9,\"name\":\"Microsoft YaHei\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#f1f9f6\",\"font\":{\"size\":9,\"name\":\"Microsoft YaHei\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#ddefe8\",\"font\":{\"size\":9,\"name\":\"Microsoft YaHei\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9,\"name\":\"Microsoft YaHei\"},\"align\":\"left\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9,\"name\":\"Microsoft YaHei\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"format\":\"date\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"format\":\"date2\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"format\":\"normal\"},{\"align\":\"center\",\"bgcolor\":\"#5b9cd6\"},{\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\",\"align\":\"center\",\"border\":{\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"align\":\"center\",\"font\":{\"size\":9}},{\"border\":{\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"]}},{\"border\":{\"top\":[\"thin\",\"#000100\"]}},{\"border\":{\"top\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"border\":{\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"border\":{\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"]},\"font\":{\"name\":\"宋体\"}},{\"border\":{\"top\":[\"thin\",\"#000100\"]},\"font\":{\"name\":\"宋体\"}},{\"border\":{\"top\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"font\":{\"name\":\"宋体\"}},{\"border\":{\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"font\":{\"name\":\"宋体\"}},{\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9},\"align\":\"center\",\"format\":\"number\"}],\"validations\":[],\"isGroup\":true,\"cols\":{\"0\":{\"width\":40},\"1\":{\"width\":88},\"2\":{\"width\":86},\"3\":{\"width\":97},\"4\":{\"width\":67},\"5\":{\"width\":103},\"6\":{\"width\":115},\"7\":{\"width\":90},\"8\":{\"width\":239},\"9\":{\"width\":217},\"len\":50},\"merges\":[\"B6:H6\",\"B7:H7\",\"B8:H8\",\"B9:H9\"]}', NULL, 'https://static.jeecg.com/designreport/images/QQ截图20201216112919_1608089379396.png', 'admin', '2020-12-15 15:14:27', 'admin', '2021-07-13 05:38:58', 0, NULL, NULL, 1, 1059, NULL, NULL, NULL); +INSERT INTO `jimu_report` VALUES ('1338769064067076098', '202012151514266124', '多选条件查询报表', NULL, NULL, 'datainfo', '{\"loopBlockList\":[],\"area\":{\"sri\":5,\"sci\":1,\"eri\":5,\"eci\":1,\"width\":107,\"height\":25},\"excel_config_id\":\"1338769064067076098\",\"printConfig\":{\"paper\":\"A3\",\"width\":297,\"height\":420,\"definition\":1,\"isBackend\":false,\"marginX\":10,\"marginY\":10,\"layout\":\"landscape\"},\"rows\":{\"0\":{\"cells\":{}},\"1\":{\"cells\":{\"1\":{\"text\":\"职务\",\"style\":51},\"2\":{\"text\":\"雇员ID\",\"style\":51},\"3\":{\"text\":\"姓名\",\"style\":51},\"4\":{\"style\":51,\"text\":\"性别\"},\"5\":{\"text\":\"雇佣日期\",\"style\":51},\"6\":{\"text\":\"家庭电话\",\"style\":51},\"7\":{\"text\":\"出生日期\",\"style\":51},\"8\":{\"text\":\"户口所在地\",\"style\":51},\"9\":{\"text\":\"联系地址\",\"style\":51},\"10\":{\"text\":\"紧急联系人\",\"style\":51}},\"height\":46},\"2\":{\"cells\":{\"1\":{\"text\":\"#{pop.group(update_by)}\",\"style\":53,\"aggregate\":\"group\"},\"2\":{\"text\":\"#{pop.group(id)}\",\"style\":54,\"aggregate\":\"group\"},\"3\":{\"text\":\"#{pop.group(name)}\",\"style\":54,\"aggregate\":\"group\"},\"4\":{\"text\":\"#{pop.sex}\",\"style\":55},\"5\":{\"text\":\"#{pop.gtime}\",\"style\":56},\"6\":{\"text\":\"#{pop.jphone}\",\"style\":57},\"7\":{\"text\":\"#{pop.birth}\",\"style\":56},\"8\":{\"text\":\"#{pop.hukou}\",\"style\":58},\"9\":{\"text\":\"#{pop.laddress}\",\"style\":57},\"10\":{\"text\":\"#{pop.jperson}\",\"style\":57}},\"isDrag\":true,\"height\":35},\"5\":{\"cells\":{\"2\":{\"text\":\"\"}},\"isDrag\":true},\"len\":99},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":718,\"heightPx\":1047},\"dicts\":[],\"groupField\":\"pop.update_by\",\"freeze\":\"A1\",\"dataRectWidth\":1494,\"displayConfig\":{},\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"bgcolor\":\"#5b9cd6\"},{\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"color\":\"#ffffff\"},{\"align\":\"center\"},{\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\",\"align\":\"center\"},{\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"align\":\"center\"},{\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#f1f9f6\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#ddefe8\"},{\"font\":{\"size\":8}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#f1f9f6\",\"font\":{\"size\":8}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#ddefe8\",\"font\":{\"size\":8}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8}},{\"font\":{\"size\":9}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#f1f9f6\",\"font\":{\"size\":9}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#ddefe8\",\"font\":{\"size\":9}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9}},{\"font\":{\"size\":9},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#f1f9f6\",\"font\":{\"size\":9},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#ddefe8\",\"font\":{\"size\":9},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#ddefe8\",\"font\":{\"size\":9},\"align\":\"left\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9},\"align\":\"left\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9},\"align\":\"center\",\"format\":\"date\"},{\"align\":\"center\",\"font\":{\"name\":\"宋体\"}},{\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"name\":\"宋体\"}},{\"font\":{\"size\":9,\"name\":\"宋体\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#f1f9f6\",\"font\":{\"size\":9,\"name\":\"宋体\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#ddefe8\",\"font\":{\"size\":9,\"name\":\"宋体\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9,\"name\":\"宋体\"},\"align\":\"left\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9,\"name\":\"宋体\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9,\"name\":\"宋体\"},\"align\":\"center\",\"format\":\"date\"},{\"font\":{\"size\":10,\"name\":\"宋体\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#f1f9f6\",\"font\":{\"size\":10,\"name\":\"宋体\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#ddefe8\",\"font\":{\"size\":10,\"name\":\"宋体\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":10,\"name\":\"宋体\"},\"align\":\"left\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":10,\"name\":\"宋体\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":10,\"name\":\"宋体\"},\"align\":\"center\",\"format\":\"date\"},{\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#9cc2e6\",\"font\":{\"size\":10,\"name\":\"宋体\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#bdd7ee\",\"font\":{\"size\":10,\"name\":\"宋体\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#deeaf6\",\"font\":{\"size\":10,\"name\":\"宋体\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#ffffff\",\"font\":{\"size\":10,\"name\":\"宋体\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":10,\"name\":\"宋体\"},\"align\":\"center\",\"format\":\"normal\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#deeaf6\",\"font\":{\"size\":9,\"name\":\"宋体\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#bdd7ee\",\"font\":{\"size\":9,\"name\":\"宋体\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#ffffff\",\"font\":{\"size\":9,\"name\":\"宋体\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9,\"name\":\"宋体\"},\"align\":\"center\",\"format\":\"normal\"},{\"font\":{\"name\":\"Microsoft YaHei\"}},{\"align\":\"center\",\"font\":{\"name\":\"Microsoft YaHei\"}},{\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"font\":{\"size\":9,\"name\":\"Microsoft YaHei\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#deeaf6\",\"font\":{\"size\":9,\"name\":\"Microsoft YaHei\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#bdd7ee\",\"font\":{\"size\":9,\"name\":\"Microsoft YaHei\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#ffffff\",\"font\":{\"size\":9,\"name\":\"Microsoft YaHei\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"format\":\"date\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"format\":\"normal\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9,\"name\":\"Microsoft YaHei\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"format\":\"date2\"}],\"validations\":[],\"isGroup\":true,\"cols\":{\"0\":{\"width\":48},\"1\":{\"width\":107},\"3\":{\"width\":91},\"4\":{\"width\":142},\"5\":{\"width\":130},\"6\":{\"width\":131},\"7\":{\"width\":235},\"8\":{\"width\":230},\"9\":{\"width\":148},\"10\":{\"width\":132},\"len\":50},\"merges\":[]}', NULL, 'https://static.jeecg.com/designreport/images/QQ截图20201216185224_1608116008543.png', 'admin', '2020-12-15 16:53:13', 'admin', '2021-07-13 05:38:57', 0, NULL, NULL, 1, 907, NULL, NULL, NULL); +INSERT INTO `jimu_report` VALUES ('1347373863746539520', '20210108104603', '实习证明', NULL, NULL, 'printinfo', '{\"loopBlockList\":[],\"area\":{\"sri\":16,\"sci\":5,\"eri\":16,\"eci\":5,\"width\":147,\"height\":25},\"excel_config_id\":\"1347373863746539520\",\"printConfig\":{\"paper\":\"A4\",\"width\":210,\"height\":297,\"definition\":1,\"isBackend\":false,\"marginX\":10,\"marginY\":10,\"layout\":\"portrait\"},\"rows\":{\"0\":{\"cells\":{\"0\":{\"text\":\"\"},\"1\":{\"text\":\"\"}}},\"1\":{\"cells\":{\"0\":{\"text\":\"\"}}},\"3\":{\"cells\":{\"2\":{\"text\":\"\",\"rendered\":\"\"}}},\"5\":{\"cells\":{},\"height\":29},\"6\":{\"cells\":{\"2\":{\"text\":\"\",\"style\":2}},\"height\":34},\"7\":{\"cells\":{\"2\":{\"merge\":[0,4],\"text\":\"实习证明\",\"style\":2}},\"height\":41},\"8\":{\"cells\":{\"1\":{\"text\":\"\",\"style\":3},\"2\":{\"text\":\"\"}}},\"9\":{\"cells\":{\"1\":{\"text\":\"\",\"style\":3},\"2\":{\"text\":\"\",\"style\":3},\"3\":{\"text\":\"\"}},\"isDrag\":true,\"height\":33},\"10\":{\"cells\":{\"2\":{\"text\":\"${tt.name}\",\"style\":11},\"3\":{\"text\":\"同学在我公司与 2020年4月1日 至 2020年5月1日 实习。\",\"style\":19,\"merge\":[0,3],\"height\":34}},\"height\":34},\"11\":{\"cells\":{},\"height\":28},\"12\":{\"cells\":{\"1\":{\"text\":\"\",\"style\":6},\"2\":{\"style\":13,\"text\":\"${tt.pingjia}\",\"merge\":[3,4],\"height\":129}},\"height\":36},\"13\":{\"cells\":{},\"height\":29},\"14\":{\"cells\":{},\"height\":33},\"15\":{\"cells\":{},\"height\":31},\"16\":{\"cells\":{}},\"17\":{\"cells\":{\"1\":{\"text\":\"\"},\"2\":{\"text\":\"特此证明!\",\"style\":12}}},\"20\":{\"cells\":{\"2\":{\"text\":\"\"},\"3\":{\"text\":\"\",\"style\":3},\"4\":{\"text\":\"\"}}},\"21\":{\"cells\":{\"4\":{\"text\":\"\"}}},\"22\":{\"cells\":{\"3\":{\"text\":\"\",\"style\":3},\"4\":{\"text\":\"证明人:\",\"style\":11},\"5\":{\"text\":\"${tt.lingdao}\",\"style\":12}}},\"23\":{\"cells\":{\"4\":{\"text\":\"\"},\"5\":{\"text\":\"${tt.shijian}\",\"style\":15}}},\"len\":100},\"dbexps\":[],\"dicts\":[],\"freeze\":\"A1\",\"dataRectWidth\":576,\"displayConfig\":{},\"background\":{\"path\":\"https://static.jeecg.com/designreport/images/11_1611283832037.png\",\"repeat\":\"no-repeat\",\"width\":\"\",\"height\":\"\"},\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"size\":14}},{\"align\":\"center\",\"font\":{\"size\":16}},{\"align\":\"right\"},{\"align\":\"left\"},{\"align\":\"left\",\"valign\":\"top\"},{\"align\":\"left\",\"valign\":\"top\",\"textwrap\":true},{\"font\":{\"size\":16}},{\"align\":\"left\",\"valign\":\"top\",\"textwrap\":false},{\"textwrap\":false},{\"textwrap\":true},{\"align\":\"right\",\"font\":{\"size\":12}},{\"font\":{\"size\":12}},{\"align\":\"left\",\"valign\":\"top\",\"textwrap\":true,\"font\":{\"size\":12}},{\"textwrap\":true,\"font\":{\"size\":12}},{\"align\":\"left\",\"font\":{\"size\":12}},{\"font\":{\"size\":12},\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":14}},{\"font\":{\"size\":10}},{\"textwrap\":false,\"font\":{\"size\":12}}],\"validations\":[],\"cols\":{\"0\":{\"width\":69},\"1\":{\"width\":41},\"4\":{\"width\":119},\"5\":{\"width\":147},\"6\":{\"width\":31},\"len\":50},\"merges\":[\"C8:G8\",\"D11:G11\",\"C13:G16\"]}', NULL, 'https://static.jeecg.com/designreport/images/未标题-1_1610074948259.png', 'admin', '2021-01-08 10:46:04', 'admin', '2021-07-13 05:39:21', 0, NULL, NULL, 1, 124, NULL, NULL, NULL); +INSERT INTO `jimu_report` VALUES ('1347454742040809472', '20210108161240', '实例:年度各月份佣金收入', NULL, NULL, 'datainfo', '{\"loopBlockList\":[],\"area\":false,\"printElWidth\":718,\"excel_config_id\":\"1347454742040809472\",\"printElHeight\":1047,\"rows\":{\"1\":{\"cells\":{\"1\":{\"text\":\" \",\"virtual\":\"pZTpI3BKFw0lh6D7\"},\"2\":{\"text\":\"年度各月份佣金收入\",\"style\":23,\"merge\":[0,3],\"virtual\":\"pZTpI3BKFw0lh6D7\"},\"3\":{\"style\":24},\"4\":{\"style\":24},\"5\":{\"style\":24},\"6\":{\"text\":\" \"}},\"height\":37},\"2\":{\"cells\":{\"1\":{\"text\":\" \"},\"2\":{\"text\":\" \"},\"3\":{\"text\":\" \"},\"4\":{\"text\":\" \"},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"}}},\"4\":{\"cells\":{\"1\":{\"text\":\"查询年度:2019\"},\"4\":{\"text\":\"查询机构:总公司\"},\"6\":{\"text\":\"单位:元\"}}},\"6\":{\"cells\":{\"1\":{\"text\":\"月份\",\"style\":12},\"2\":{\"text\":\"佣金/主营业收入\",\"style\":12},\"3\":{\"text\":\"累计\",\"style\":12},\"4\":{\"text\":\"历史最低水平\",\"style\":12},\"5\":{\"text\":\"历史平均水平\",\"style\":12},\"6\":{\"text\":\"历史最高水平\",\"style\":12}}},\"7\":{\"cells\":{\"1\":{\"text\":\"#{tmp_report_data_1.monty}\",\"style\":0},\"2\":{\"text\":\"#{tmp_report_data_1.main_income}\",\"style\":0},\"3\":{\"text\":\"#{tmp_report_data_1.total}\",\"style\":18},\"4\":{\"text\":\"#{tmp_report_data_1.his_lowest}\",\"style\":0},\"5\":{\"text\":\"#{tmp_report_data_1.his_average}\",\"style\":0},\"6\":{\"text\":\"#{tmp_report_data_1.his_highest}\",\"style\":0}},\"isDrag\":true},\"9\":{\"cells\":{\"1\":{\"merge\":[1,1]}}},\"len\":99},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":718,\"heightPx\":1047},\"dicts\":[],\"freeze\":\"A1\",\"dataRectWidth\":678,\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"bold\":true}},{\"font\":{\"bold\":true}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"bold\":false}},{\"font\":{\"bold\":false}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"bold\":true},\"align\":\"center\"},{\"font\":{\"bold\":true},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"bold\":true,\"size\":15},\"align\":\"center\"},{\"font\":{\"bold\":true,\"size\":15},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"bgcolor\":\"#01b0f1\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"bgcolor\":\"#33CCCC\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"bgcolor\":\"#33CCCC\",\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"bgcolor\":\"#33CCCC\",\"align\":\"left\"},{\"font\":{\"bold\":true,\"size\":16}},{\"font\":{\"bold\":true,\"size\":24}},{\"font\":{\"bold\":true,\"size\":22}},{\"font\":{\"bold\":true,\"size\":22},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"format\":\"usd\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"format\":\"rmb\"},{\"font\":{\"bold\":true,\"name\":\"黑体\"}},{\"font\":{\"bold\":true,\"name\":\"黑体\",\"size\":22}},{\"font\":{\"bold\":true,\"name\":\"宋体\",\"size\":22}},{\"font\":{\"bold\":true,\"name\":\"楷体\",\"size\":22}},{\"font\":{\"bold\":true,\"name\":\"楷体\",\"size\":22},\"align\":\"center\"},{\"align\":\"center\"}],\"validations\":[],\"cols\":{\"0\":{\"width\":29},\"1\":{\"width\":111},\"2\":{\"width\":116},\"4\":{\"width\":122},\"len\":50},\"merges\":[\"B10:C11\",\"C2:F2\"],\"imgList\":[{\"row\":1,\"col\":1,\"width\":\"148\",\"height\":\"56\",\"src\":\"https://static.jeecg.com/designreport/images/kunlunlog_1610591367645.png\",\"layer_id\":\"pZTpI3BKFw0lh6D7\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[1,1],[1,2]]}]}', NULL, NULL, 'admin', '2021-01-08 16:12:40', 'admin', '2021-07-13 05:38:55', 0, NULL, NULL, 1, 62, NULL, NULL, NULL); +INSERT INTO `jimu_report` VALUES ('1347459370216198144', '20210108164121', '实例:来源收入统计', NULL, NULL, 'datainfo', '{\"loopBlockList\":[],\"chartList\":[{\"row\":1,\"col\":1,\"width\":\"624\",\"height\":\"281\",\"config\":\"{\\\"legend\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#333\\\",\\\"fontSize\\\":\\\"12\\\"},\\\"top\\\":\\\"top\\\",\\\"left\\\":\\\"right\\\",\\\"orient\\\":\\\"vertical\\\",\\\"padding\\\":[25,20,25,10],\\\"data\\\":[\\\"中国石油全资(集团所属)\\\",\\\"中国石油全资(股份所属)\\\",\\\"中石油控股或有控股权\\\",\\\"中石油参股\\\",\\\"非中石油\\\"],\\\"show\\\":true},\\\"series\\\":[{\\\"isRose\\\":false,\\\"data\\\":[{\\\"name\\\":\\\"中国石油全资(集团所属)\\\",\\\"value\\\":38460270.57,\\\"itemStyle\\\":{\\\"color\\\":\\\"#E46C8A\\\"}},{\\\"name\\\":\\\"中国石油全资(股份所属)\\\",\\\"value\\\":227595.77,\\\"itemStyle\\\":{\\\"color\\\":\\\"#FCDE43\\\"}},{\\\"name\\\":\\\"中石油控股或有控股权\\\",\\\"value\\\":679926.75,\\\"itemStyle\\\":{\\\"color\\\":\\\"#01A8E1\\\"}},{\\\"name\\\":\\\"中石油参股\\\",\\\"value\\\":72062.75,\\\"itemStyle\\\":{\\\"color\\\":\\\"#99CC00\\\"}},{\\\"name\\\":\\\"非中石油\\\",\\\"value\\\":1698597.62,\\\"itemStyle\\\":{\\\"color\\\":\\\"#800080\\\"}}],\\\"isRadius\\\":false,\\\"roseType\\\":\\\"\\\",\\\"notCount\\\":false,\\\"center\\\":[320,180],\\\"name\\\":\\\"访问来源\\\",\\\"minAngle\\\":0,\\\"label\\\":{\\\"show\\\":false,\\\"position\\\":\\\"outside\\\",\\\"textStyle\\\":{\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"bolder\\\"}},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":\\\"55%\\\",\\\"autoSort\\\":false}],\\\"tooltip\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"},\\\"formatter\\\":\\\"{b} : {c}\\\",\\\"show\\\":true},\\\"title\\\":{\\\"show\\\":true,\\\"top\\\":5,\\\"text\\\":\\\"来源收入统计\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#c23531\\\",\\\"fontWeight\\\":\\\"bolder\\\",\\\"fontSize\\\":18},\\\"left\\\":\\\"center\\\",\\\"padding\\\":[5,20,5,10]},\\\"backgroundColor\\\":\\\"#fff\\\"}\",\"url\":\"\",\"extData\":{\"dataType\":\"sql\",\"apiStatus\":\"\",\"apiUrl\":\"\",\"dataId\":\"4af57d343f1d6521b71b85097b580786\",\"axisX\":\"biz_income\",\"axisY\":\"total\",\"series\":\"\",\"yText\":\"total\",\"xText\":\"biz_income\",\"dbCode\":\"tmp_report_data_income\",\"dataId1\":\"\",\"source\":\"\",\"target\":\"\",\"isTiming\":true,\"intervalTime\":\"5\",\"chartType\":\"pie.simple\",\"id\":\"\"},\"layer_id\":\"nVUy533exgQ70OPb\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[1,1],[1,2],[1,3],[1,4],[1,5],[1,6],[1,7],[1,8]]}],\"area\":{\"sri\":8,\"sci\":5,\"eri\":8,\"eci\":5,\"width\":63,\"height\":25},\"excel_config_id\":\"1347459370216198144\",\"printConfig\":{\"paper\":\"A4\",\"width\":210,\"height\":297,\"definition\":1,\"isBackend\":false,\"marginX\":10,\"marginY\":10},\"rows\":{\"1\":{\"cells\":{\"1\":{\"text\":\" \",\"virtual\":\"nVUy533exgQ70OPb\"},\"2\":{\"text\":\" \",\"virtual\":\"nVUy533exgQ70OPb\"},\"3\":{\"text\":\" \",\"virtual\":\"nVUy533exgQ70OPb\"},\"4\":{\"text\":\" \",\"virtual\":\"nVUy533exgQ70OPb\"},\"5\":{\"text\":\" \",\"virtual\":\"nVUy533exgQ70OPb\"},\"6\":{\"text\":\" \",\"virtual\":\"nVUy533exgQ70OPb\"},\"7\":{\"text\":\" \",\"virtual\":\"nVUy533exgQ70OPb\"},\"8\":{\"text\":\" \",\"virtual\":\"nVUy533exgQ70OPb\"}}},\"3\":{\"cells\":{}},\"16\":{\"cells\":{\"1\":{\"text\":\"业务来源\",\"style\":1},\"2\":{\"text\":\"保险经纪佣金费\",\"style\":1},\"3\":{\"text\":\"风险咨询费\",\"style\":1},\"4\":{\"text\":\"承保公证评估费\",\"style\":1},\"5\":{\"text\":\"保险公证费\",\"style\":1},\"6\":{\"text\":\"投标咨询费\",\"style\":1},\"7\":{\"text\":\"内控咨询费\",\"style\":1},\"8\":{\"text\":\"总计\",\"style\":1}}},\"17\":{\"cells\":{\"1\":{\"text\":\"#{tmp_report_data_income.biz_income}\",\"style\":0},\"2\":{\"text\":\"#{tmp_report_data_income.bx_jj_yongjin}\",\"style\":0},\"3\":{\"text\":\"#{tmp_report_data_income.bx_zx_money}\",\"style\":0},\"4\":{\"text\":\"#{tmp_report_data_income.chengbao_gz_money}\",\"style\":0},\"5\":{\"text\":\"#{tmp_report_data_income.bx_gg_moeny}\",\"style\":0},\"6\":{\"text\":\"#{tmp_report_data_income.tb_zx_money}\",\"style\":0},\"7\":{\"text\":\"#{tmp_report_data_income.neikong_zx_money}\",\"style\":0},\"8\":{\"text\":\"#{tmp_report_data_income.total}\",\"style\":0}},\"isDrag\":true,\"height\":24},\"len\":58},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":718,\"heightPx\":1047},\"dicts\":[],\"freeze\":\"A1\",\"dataRectWidth\":702,\"displayConfig\":{},\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"bgcolor\":\"#33CCCC\"}],\"validations\":[],\"cols\":{\"0\":{\"width\":16},\"1\":{\"width\":105},\"2\":{\"width\":119},\"3\":{\"width\":87},\"4\":{\"width\":61},\"5\":{\"width\":63},\"6\":{\"width\":60},\"7\":{\"width\":91},\"len\":50},\"merges\":[]}', NULL, NULL, 'admin', '2021-01-08 16:41:21', 'admin', '2021-07-13 05:38:53', 0, NULL, NULL, 1, 63, NULL, NULL, NULL); +INSERT INTO `jimu_report` VALUES ('1352160857479581696', '20210121154924', 'redis', NULL, NULL, 'chartinfo', '{\"loopBlockList\":[],\"chartList\":[{\"row\":1,\"col\":7,\"width\":\"551\",\"height\":\"350\",\"config\":\"{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#211F1E\\\",\\\"fontSize\\\":12}},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#211E1E\\\"}},\\\"show\\\":false,\\\"name\\\":\\\"数量\\\",\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false}},\\\"xAxis\\\":{\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false},\\\"axisLabel\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#171515\\\",\\\"fontSize\\\":12},\\\"rotate\\\":0,\\\"interval\\\":0},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#171515\\\"}},\\\"data\\\":[\\\"15:02:38\\\",\\\"15:02:39\\\",\\\"15:02:40\\\",\\\"15:02:41\\\",\\\"15:02:42\\\"],\\\"show\\\":true,\\\"name\\\":\\\"时间\\\"},\\\"grid\\\":{\\\"top\\\":60,\\\"left\\\":60,\\\"bottom\\\":60,\\\"right\\\":60},\\\"series\\\":[{\\\"areaStyle\\\":{\\\"color\\\":\\\"rgba(231,69,193,1)\\\",\\\"opacity\\\":0.2},\\\"data\\\":[59,59,59,59,59],\\\"showSymbol\\\":true,\\\"lineStyle\\\":{\\\"width\\\":5},\\\"symbolSize\\\":5,\\\"isArea\\\":true,\\\"name\\\":\\\"销量\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"rgba(241,71,214,1)\\\"},\\\"step\\\":false,\\\"label\\\":{\\\"show\\\":true,\\\"position\\\":\\\"top\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"black\\\",\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"bolder\\\"}},\\\"type\\\":\\\"line\\\",\\\"smooth\\\":true}],\\\"tooltip\\\":{\\\"formatter\\\":\\\"{b} : {c}\\\",\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":18}},\\\"title\\\":{\\\"show\\\":true,\\\"top\\\":0,\\\"text\\\":\\\"redis数量\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#9031C2\\\",\\\"fontWeight\\\":\\\"bolder\\\",\\\"fontSize\\\":18},\\\"left\\\":\\\"center\\\",\\\"padding\\\":[5,20,5,10]}}\",\"url\":\"\",\"extData\":{\"dataType\":\"api\",\"apiStatus\":\"1\",\"dataId\":\"d4a29dfda94357308faf62be2b94db08\",\"axisX\":\"name\",\"axisY\":\"value\",\"series\":\"type\",\"yText\":\"\",\"xText\":\"\",\"dbCode\":\"keysSizeForReport\",\"dataId1\":\"\",\"source\":\"\",\"target\":\"\",\"isTiming\":true,\"intervalTime\":\"5\",\"chartType\":\"line.area\",\"id\":\"NbjJrEsYcliaQRGO\"},\"layer_id\":\"NbjJrEsYcliaQRGO\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[1,7],[1,8],[1,9],[1,10],[1,11],[1,12]]},{\"row\":1,\"col\":1,\"width\":\"597\",\"height\":\"350\",\"config\":\"{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#2692DD\\\",\\\"fontSize\\\":12}},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#469BDC\\\"}},\\\"show\\\":false,\\\"name\\\":\\\"内存(kb)\\\",\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false}},\\\"xAxis\\\":{\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#00FFF2\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false},\\\"axisLabel\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#398DD3\\\",\\\"fontSize\\\":12},\\\"rotate\\\":0,\\\"interval\\\":0},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#1E88D0\\\"}},\\\"data\\\":[\\\"15:02:38\\\",\\\"15:02:39\\\",\\\"15:02:40\\\",\\\"15:02:41\\\",\\\"15:02:42\\\"],\\\"show\\\":true,\\\"name\\\":\\\"时间\\\"},\\\"grid\\\":{\\\"top\\\":60,\\\"left\\\":60,\\\"bottom\\\":60,\\\"right\\\":60},\\\"series\\\":[{\\\"areaStyle\\\":{\\\"color\\\":\\\"#74BCFF\\\",\\\"opacity\\\":0.3},\\\"data\\\":[875,875,875,875,875],\\\"showSymbol\\\":true,\\\"lineStyle\\\":{\\\"width\\\":5},\\\"symbolSize\\\":5,\\\"isArea\\\":true,\\\"name\\\":\\\"销量\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"#1890FF\\\"},\\\"step\\\":false,\\\"label\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"black\\\",\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"bolder\\\"},\\\"show\\\":true,\\\"position\\\":\\\"top\\\"},\\\"type\\\":\\\"line\\\",\\\"smooth\\\":true}],\\\"tooltip\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":18},\\\"formatter\\\":\\\"{b} : {c}\\\",\\\"show\\\":true},\\\"title\\\":{\\\"show\\\":true,\\\"top\\\":5,\\\"text\\\":\\\"redis内存占用情况\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#4C87E4\\\",\\\"fontWeight\\\":\\\"bolder\\\",\\\"fontSize\\\":18},\\\"left\\\":\\\"center\\\",\\\"padding\\\":[5,20,5,10]}}\",\"url\":\"\",\"extData\":{\"dataType\":\"api\",\"apiStatus\":\"1\",\"dataId\":\"6a1d22ca4c95e8fab655d3ceed43a84d\",\"axisX\":\"name\",\"axisY\":\"value\",\"series\":\"type\",\"yText\":\"\",\"xText\":\"\",\"dbCode\":\"memoryForReport\",\"dataId1\":\"\",\"source\":\"\",\"target\":\"\",\"isTiming\":true,\"intervalTime\":\"5\",\"chartType\":\"line.area\",\"id\":\"YW0FQUwafBUTagh3\"},\"layer_id\":\"YW0FQUwafBUTagh3\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[1,1],[1,2],[1,3],[1,4],[1,5],[1,6]]}],\"area\":false,\"printElWidth\":1565,\"excel_config_id\":\"1352160857479581696\",\"printElHeight\":1047,\"rows\":{\"1\":{\"cells\":{\"1\":{\"text\":\" \",\"virtual\":\"YW0FQUwafBUTagh3\",\"style\":19,\"merge\":[0,1]},\"2\":{\"text\":\" \",\"virtual\":\"YW0FQUwafBUTagh3\"},\"3\":{\"style\":19,\"virtual\":\"YW0FQUwafBUTagh3\"},\"4\":{\"style\":19,\"virtual\":\"YW0FQUwafBUTagh3\"},\"5\":{\"style\":19,\"virtual\":\"YW0FQUwafBUTagh3\"},\"6\":{\"style\":19,\"virtual\":\"YW0FQUwafBUTagh3\"},\"7\":{\"text\":\" \",\"virtual\":\"NbjJrEsYcliaQRGO\"},\"8\":{\"text\":\" \",\"virtual\":\"NbjJrEsYcliaQRGO\"},\"9\":{\"text\":\" \",\"virtual\":\"NbjJrEsYcliaQRGO\"},\"10\":{\"text\":\" \",\"virtual\":\"NbjJrEsYcliaQRGO\"},\"11\":{\"text\":\" \",\"virtual\":\"NbjJrEsYcliaQRGO\"},\"12\":{\"text\":\" \",\"virtual\":\"NbjJrEsYcliaQRGO\"}}},\"2\":{\"cells\":{\"1\":{\"style\":19},\"2\":{\"style\":19},\"3\":{\"style\":19},\"4\":{\"style\":19},\"5\":{\"style\":19},\"6\":{\"style\":19},\"7\":{\"text\":\" \"}}},\"3\":{\"cells\":{\"1\":{\"style\":19},\"2\":{\"style\":19},\"3\":{\"style\":19},\"4\":{\"style\":19},\"5\":{\"style\":19},\"6\":{\"style\":19},\"7\":{\"text\":\" \"}}},\"4\":{\"cells\":{\"1\":{\"style\":19},\"2\":{\"style\":19},\"3\":{\"style\":19},\"4\":{\"style\":19},\"5\":{\"style\":19},\"6\":{\"style\":19},\"7\":{\"text\":\" \"}}},\"5\":{\"cells\":{\"1\":{\"style\":19},\"2\":{\"style\":19},\"3\":{\"style\":19},\"4\":{\"style\":19},\"5\":{\"style\":19},\"6\":{\"style\":19},\"7\":{\"text\":\" \"}}},\"6\":{\"cells\":{\"1\":{\"style\":19},\"2\":{\"style\":19},\"3\":{\"style\":19},\"4\":{\"style\":19},\"5\":{\"style\":19},\"6\":{\"style\":19},\"7\":{\"text\":\" \"}}},\"7\":{\"cells\":{\"1\":{\"style\":19},\"2\":{\"style\":19},\"3\":{\"style\":19},\"4\":{\"style\":19},\"5\":{\"style\":19},\"6\":{\"style\":19},\"7\":{\"text\":\" \"}}},\"8\":{\"cells\":{\"1\":{\"style\":19},\"2\":{\"style\":19},\"3\":{\"style\":19},\"4\":{\"style\":19},\"5\":{\"style\":19},\"6\":{\"style\":19},\"7\":{\"text\":\" \"}}},\"9\":{\"cells\":{\"1\":{\"style\":19},\"2\":{\"style\":19},\"3\":{\"style\":19},\"4\":{\"style\":19},\"5\":{\"style\":19},\"6\":{\"style\":19},\"7\":{\"text\":\" \"}}},\"10\":{\"cells\":{\"1\":{\"style\":19},\"2\":{\"style\":19},\"3\":{\"style\":19},\"4\":{\"style\":19},\"5\":{\"style\":19},\"6\":{\"style\":19},\"7\":{\"text\":\" \"}}},\"11\":{\"cells\":{\"1\":{\"style\":19},\"2\":{\"style\":19},\"3\":{\"style\":19},\"4\":{\"style\":19},\"5\":{\"style\":19},\"6\":{\"style\":19},\"7\":{\"text\":\" \"}}},\"12\":{\"cells\":{\"1\":{\"style\":19},\"2\":{\"style\":19},\"3\":{\"style\":19},\"4\":{\"style\":19},\"5\":{\"style\":19},\"6\":{\"style\":19},\"7\":{\"text\":\" \"}}},\"13\":{\"cells\":{\"1\":{\"style\":19},\"2\":{\"style\":19},\"3\":{\"style\":19},\"4\":{\"style\":19},\"5\":{\"style\":19},\"6\":{\"style\":19},\"7\":{\"text\":\" \"}}},\"14\":{\"cells\":{\"1\":{\"style\":19},\"2\":{\"style\":19},\"3\":{\"style\":19},\"4\":{\"style\":19},\"5\":{\"style\":19},\"6\":{\"style\":19},\"7\":{\"text\":\" \"}}},\"17\":{\"cells\":{\"1\":{}}},\"18\":{\"cells\":{\"1\":{\"text\":\"redis详细信息\",\"style\":5,\"merge\":[1,1]}}},\"19\":{\"cells\":{}},\"20\":{\"cells\":{\"1\":{\"text\":\"key\",\"merge\":[0,1],\"style\":46},\"2\":{\"text\":\" \",\"style\":47},\"3\":{\"merge\":[0,1],\"style\":46,\"text\":\"value\"},\"4\":{\"text\":\" \",\"style\":47},\"5\":{\"merge\":[0,9],\"style\":46,\"text\":\"desc\"},\"6\":{\"text\":\" \",\"style\":47},\"7\":{\"text\":\" \",\"style\":47},\"8\":{\"text\":\" \",\"style\":47},\"9\":{\"text\":\" \",\"style\":47},\"10\":{\"text\":\" \",\"style\":47},\"11\":{\"text\":\" \",\"style\":47},\"12\":{\"text\":\" \",\"style\":47},\"13\":{\"text\":\" \",\"style\":47},\"14\":{\"text\":\" \",\"style\":47}}},\"21\":{\"cells\":{\"1\":{\"merge\":[0,1],\"text\":\"#{infoForReport.key}\",\"style\":52},\"2\":{\"text\":\" \",\"style\":53},\"3\":{\"merge\":[0,1],\"text\":\"#{infoForReport.value}\",\"style\":52},\"4\":{\"text\":\" \",\"style\":53},\"5\":{\"text\":\"#{infoForReport.description}\",\"style\":52,\"merge\":[0,9]}}},\"len\":98},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":794,\"heightPx\":1047},\"dicts\":[],\"freeze\":\"A1\",\"dataRectWidth\":1500,\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"font\":{\"bold\":true}},{\"font\":{\"bold\":true},\"align\":\"center\"},{\"align\":\"center\"},{\"font\":{\"bold\":true,\"size\":18},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"size\":18}},{\"font\":{\"bold\":true,\"size\":14},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"size\":14}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"bgcolor\":\"#d8d8d8\"},{\"bgcolor\":\"#d8d8d8\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"bgcolor\":\"#d8d8d8\",\"align\":\"center\"},{\"bgcolor\":\"#d8d8d8\",\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"bgcolor\":\"#f2f2f2\",\"align\":\"center\"},{\"bgcolor\":\"#f2f2f2\",\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"bgcolor\":\"#a5a5a5\",\"align\":\"center\"},{\"bgcolor\":\"#a5a5a5\",\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"bgcolor\":\"#bfbfbf\",\"align\":\"center\"},{\"bgcolor\":\"#bfbfbf\",\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"bgcolor\":\"#ffffff\"},{\"bgcolor\":\"#ffffff\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"bgcolor\":\"#f2f2f2\"},{\"bgcolor\":\"#f2f2f2\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"bgcolor\":\"#5b9cd6\"},{\"bgcolor\":\"#5b9cd6\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"bgcolor\":\"#deeaf6\",\"align\":\"center\"},{\"bgcolor\":\"#deeaf6\",\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"bgcolor\":\"#9cc2e6\"},{\"bgcolor\":\"#9cc2e6\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"bgcolor\":\"#93d051\",\"align\":\"center\"},{\"bgcolor\":\"#93d051\",\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"bgcolor\":\"#a7d08c\",\"align\":\"center\"},{\"bgcolor\":\"#a7d08c\",\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"bgcolor\":\"#c5e0b3\",\"align\":\"center\"},{\"bgcolor\":\"#c5e0b3\",\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"bgcolor\":\"#deeaf6\"},{\"bgcolor\":\"#deeaf6\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"bgcolor\":\"#d5dce4\"},{\"bgcolor\":\"#d5dce4\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"bgcolor\":\"#93d051\"},{\"bgcolor\":\"#93d051\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"bgcolor\":\"#756f6f\"},{\"bgcolor\":\"#756f6f\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"bgcolor\":\"#c5e0b3\"},{\"bgcolor\":\"#c5e0b3\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"bgcolor\":\"#a7d08c\"},{\"bgcolor\":\"#a7d08c\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"bgcolor\":\"#71ae47\"},{\"bgcolor\":\"#71ae47\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"bgcolor\":\"#01b0f1\"},{\"bgcolor\":\"#01b0f1\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"bgcolor\":\"#0170c1\"},{\"bgcolor\":\"#0170c1\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"bgcolor\":\"#8eaada\"},{\"bgcolor\":\"#8eaada\"}],\"validations\":[],\"cols\":{\"len\":50},\"merges\":[\"D19:E19\",\"F19:M19\",\"D20:E20\",\"F20:M20\",\"B2:C2\",\"B19:C20\",\"B22:C22\",\"D22:E22\",\"B21:C21\",\"D21:E21\",\"F21:O21\",\"F22:O22\"]}', NULL, NULL, 'admin', '2021-01-21 15:49:25', 'admin', '2021-02-03 13:58:06', 1, NULL, NULL, 0, 64, NULL, NULL, NULL); +INSERT INTO `jimu_report` VALUES ('1cd9d574d0c42f3915046dc61d9f33bd', '202012171553133795', '企业实时报表副本3795', NULL, NULL, 'chartinfo', '{\"loopBlockList\":[],\"chartList\":[{\"row\":6,\"col\":1,\"colspan\":0,\"rowspan\":0,\"width\":\"302\",\"height\":\"337\",\"config\":\"{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"rotate\\\":0,\\\"interval\\\":0,\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"data\\\":[\\\"江苏\\\",\\\"山东\\\",\\\"安徽\\\",\\\"江西\\\",\\\"河北\\\",\\\"吉林\\\",\\\"黑龙江\\\",\\\"重庆\\\",\\\"广东\\\",\\\"上海\\\",\\\"哈尔滨\\\",\\\"福建\\\",\\\"四川\\\"],\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\"}},\\\"show\\\":true,\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false},\\\"type\\\":\\\"category\\\"},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#333\\\",\\\"fontSize\\\":12}},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#333\\\"}},\\\"show\\\":false,\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false},\\\"type \\\":\\\"value\\\"},\\\"legend\\\":{\\\"padding\\\":[25,20,25,10],\\\"data\\\":[\\\"销售额\\\"],\\\"top\\\":\\\"top\\\",\\\"orient\\\":\\\"horizontal\\\",\\\"left\\\":\\\"center\\\",\\\"show\\\":false,\\\"textStyle\\\":{\\\"color\\\":\\\"#333\\\",\\\"fontSize\\\":12}},\\\"grid\\\":{\\\"top\\\":20,\\\"left\\\":45,\\\"bottom\\\":16,\\\"right\\\":46},\\\"series\\\":[{\\\"barWidth\\\":13,\\\"data\\\":[100,800,1200,1700,2500,4000,5800,6500,7000,7500,8000,8800,9500],\\\"name\\\":\\\"销售额\\\",\\\"itemStyle\\\":{\\\"barBorderRadius\\\":5,\\\"color\\\":\\\"rgba(67,184,251,1)\\\"},\\\"label\\\":{\\\"show\\\":true,\\\"position\\\":\\\"right\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#689AFB\\\",\\\"fontSize\\\":\\\"10\\\",\\\"fontWeight\\\":\\\"normal\\\"}},\\\"type\\\":\\\"bar\\\",\\\"barMinHeight\\\":2,\\\"typeData\\\":[],\\\"textStyle\\\":{\\\"color\\\":\\\"black\\\",\\\"fontWeight\\\":\\\"bolder\\\"}}],\\\"tooltip\\\":{\\\"show\\\":true,\\\"axisPointer\\\":{\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"show\\\":false,\\\"top\\\":5,\\\"text\\\":\\\"销售额省份排名\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"fontSize\\\":\\\"14\\\"},\\\"left\\\":\\\"left\\\",\\\"padding\\\":[5,20,5,20]}}\",\"url\":\"\",\"extData\":{\"dataType\":\"api\",\"apiStatus\":\"1\",\"dataId\":\"1339491107951640577\",\"axisX\":\"name\",\"axisY\":\"value\",\"series\":\"type\",\"yText\":\"\",\"xText\":\"\",\"dbCode\":\"xiaoshoue\",\"dataId1\":\"\",\"source\":\"\",\"target\":\"\",\"isTiming\":true,\"intervalTime\":\"5\",\"chartType\":\"bar.multi.horizontal\",\"chartId\":\"pie.doughnut\"},\"layer_id\":\"IFj1lg5S5aNG1wPx\",\"offsetX\":0,\"offsetY\":0,\"backgroud\":{\"enabled\":false,\"color\":\"#fff\",\"image\":\"\"},\"virtualCellRange\":[[6,1],[6,2],[6,3],[6,4]]},{\"row\":6,\"col\":10,\"colspan\":0,\"rowspan\":0,\"width\":\"247\",\"height\":\"124\",\"config\":\"{\\\"legend\\\":{\\\"padding\\\":[25,20,25,10],\\\"data\\\":[\\\"销售额\\\",\\\"其他\\\"],\\\"top\\\":\\\"top\\\",\\\"orient\\\":\\\"horizontal\\\",\\\"left\\\":\\\"center\\\",\\\"show\\\":false,\\\"textStyle\\\":{\\\"color\\\":\\\"#333\\\",\\\"fontSize\\\":12}},\\\"series\\\":[{\\\"isRose\\\":false,\\\"data\\\":[{\\\"name\\\":\\\"销售额\\\",\\\"value\\\":6000000,\\\"itemStyle\\\":{\\\"color\\\":\\\"rgba(43,193,254,1)\\\"}},{\\\"name\\\":\\\"其他\\\",\\\"value\\\":3400879,\\\"itemStyle\\\":{\\\"color\\\":\\\"rgba(42,45,76,0.59)\\\"}}],\\\"isRadius\\\":true,\\\"roseType\\\":\\\"\\\",\\\"notCount\\\":false,\\\"name\\\":\\\"访问来源\\\",\\\"minAngle\\\":0,\\\"label\\\":{\\\"show\\\":false,\\\"position\\\":\\\"outside\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"\\\",\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"bolder\\\"}},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":[\\\"45%\\\",\\\"55%\\\"],\\\"autoSort\\\":false}],\\\"tooltip\\\":{\\\"formatter\\\":\\\"{b} : {c}\\\",\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"show\\\":false,\\\"top\\\":5,\\\"text\\\":\\\"销售进度\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"fontSize\\\":\\\"14\\\"},\\\"left\\\":\\\"left\\\",\\\"padding\\\":[5,20,5,10]}}\",\"url\":\"\",\"extData\":{\"dataType\":\"api\",\"apiStatus\":\"1\",\"dataId\":\"1339498906765000705\",\"axisX\":\"name\",\"axisY\":\"value\",\"series\":\"type\",\"yText\":\"\",\"xText\":\"\",\"dbCode\":\"xsjd\",\"dataId1\":\"\",\"source\":\"\",\"target\":\"\",\"isTiming\":true,\"intervalTime\":\"5\",\"chartType\":\"pie.doughnut\",\"chartId\":\"pie.doughnut\"},\"layer_id\":\"Yb2TIGEAxnvN9ITx\",\"offsetX\":0,\"offsetY\":0,\"backgroud\":{\"enabled\":false,\"color\":\"#fff\",\"image\":\"\"},\"virtualCellRange\":[[6,10],[6,11]]},{\"row\":6,\"col\":12,\"colspan\":0,\"rowspan\":0,\"width\":\"244\",\"height\":\"128\",\"config\":\"{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"rotate\\\":0,\\\"interval\\\":0,\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"data\\\":[\\\"北京\\\",\\\"青岛\\\",\\\"合肥\\\",\\\"深圳\\\",\\\"石家庄\\\",\\\"重庆\\\",\\\"保定\\\",\\\"邯郸\\\"],\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\"}},\\\"show\\\":true,\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false},\\\"type\\\":\\\"category\\\"},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#333\\\",\\\"fontSize\\\":12}},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#333\\\"}},\\\"show\\\":false,\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false},\\\"type \\\":\\\"value\\\"},\\\"legend\\\":{\\\"padding\\\":[25,20,25,10],\\\"data\\\":[\\\"销售额\\\"],\\\"top\\\":\\\"top\\\",\\\"orient\\\":\\\"horizontal\\\",\\\"left\\\":\\\"center\\\",\\\"show\\\":false,\\\"textStyle\\\":{\\\"color\\\":\\\"#333\\\",\\\"fontSize\\\":12}},\\\"grid\\\":{\\\"top\\\":10,\\\"left\\\":49,\\\"bottom\\\":16,\\\"right\\\":45},\\\"series\\\":[{\\\"barWidth\\\":9,\\\"data\\\":[80,500,800,1000,1200,1500,1600,2000],\\\"name\\\":\\\"销售额\\\",\\\"itemStyle\\\":{\\\"barBorderRadius\\\":0,\\\"color\\\":\\\"rgba(146,119,252,1)\\\"},\\\"label\\\":{\\\"show\\\":true,\\\"position\\\":\\\"right\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#689AFB\\\",\\\"fontSize\\\":\\\"10\\\",\\\"fontWeight\\\":\\\"normal\\\"}},\\\"type\\\":\\\"bar\\\",\\\"barMinHeight\\\":2,\\\"typeData\\\":[],\\\"textStyle\\\":{\\\"color\\\":\\\"black\\\",\\\"fontWeight\\\":\\\"bolder\\\"}}],\\\"tooltip\\\":{\\\"show\\\":true,\\\"axisPointer\\\":{\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"show\\\":false,\\\"top\\\":5,\\\"text\\\":\\\"销售额城市排名\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"fontSize\\\":\\\"14\\\"},\\\"left\\\":\\\"left\\\",\\\"padding\\\":[5,20,5,20]}}\",\"url\":\"\",\"extData\":{\"dataType\":\"api\",\"apiStatus\":\"1\",\"dataId\":\"1339495346077728770\",\"axisX\":\"name\",\"axisY\":\"value\",\"series\":\"type\",\"yText\":\"\",\"xText\":\"\",\"dbCode\":\"chengshi\",\"dataId1\":\"\",\"source\":\"\",\"target\":\"\",\"isTiming\":true,\"intervalTime\":\"5\",\"chartType\":\"bar.multi.horizontal\",\"chartId\":\"bar.multi.horizontal\"},\"layer_id\":\"qQHpevWlqElpRQUl\",\"offsetX\":0,\"offsetY\":0,\"backgroud\":{\"enabled\":false,\"color\":\"#fff\",\"image\":\"\"},\"virtualCellRange\":[[6,12],[6,13],[6,14]]},{\"row\":6,\"col\":15,\"colspan\":0,\"rowspan\":0,\"width\":\"230\",\"height\":\"127\",\"config\":\"{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"rotate\\\":0,\\\"interval\\\":0,\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"data\\\":[\\\"北京\\\",\\\"青岛\\\",\\\"合肥\\\",\\\"深圳\\\",\\\"石家庄\\\",\\\"重庆\\\",\\\"保定\\\",\\\"邯郸\\\"],\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\"}},\\\"show\\\":true,\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false},\\\"type\\\":\\\"category\\\"},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#333\\\",\\\"fontSize\\\":12}},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#333\\\"}},\\\"show\\\":false,\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false},\\\"type \\\":\\\"value\\\"},\\\"legend\\\":{\\\"padding\\\":[25,20,25,10],\\\"data\\\":[\\\"销售额\\\"],\\\"top\\\":\\\"top\\\",\\\"orient\\\":\\\"horizontal\\\",\\\"left\\\":\\\"center\\\",\\\"show\\\":false,\\\"textStyle\\\":{\\\"color\\\":\\\"#333\\\",\\\"fontSize\\\":12}},\\\"grid\\\":{\\\"top\\\":10,\\\"left\\\":49,\\\"bottom\\\":20,\\\"right\\\":48},\\\"series\\\":[{\\\"barWidth\\\":9,\\\"data\\\":[80,500,800,1000,1200,1500,1600,2000],\\\"name\\\":\\\"销售额\\\",\\\"itemStyle\\\":{\\\"barBorderRadius\\\":0,\\\"color\\\":\\\"rgba(146,119,252,1)\\\"},\\\"label\\\":{\\\"show\\\":true,\\\"position\\\":\\\"right\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#689AFB\\\",\\\"fontSize\\\":\\\"10\\\",\\\"fontWeight\\\":\\\"normal\\\"}},\\\"type\\\":\\\"bar\\\",\\\"barMinHeight\\\":2,\\\"typeData\\\":[],\\\"textStyle\\\":{\\\"color\\\":\\\"black\\\",\\\"fontWeight\\\":\\\"bolder\\\"}}],\\\"tooltip\\\":{\\\"show\\\":true,\\\"axisPointer\\\":{\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"show\\\":false,\\\"top\\\":5,\\\"text\\\":\\\"某站点用户访问来源\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#c23531\\\",\\\"fontWeight\\\":\\\"bolder\\\",\\\"fontSize\\\":18},\\\"left\\\":\\\"left\\\",\\\"padding\\\":[5,20,5,20]}}\",\"url\":\"\",\"extData\":{\"dataType\":\"api\",\"apiStatus\":\"1\",\"dataId\":\"1339495346077728770\",\"axisX\":\"name\",\"axisY\":\"value\",\"series\":\"type\",\"yText\":\"\",\"xText\":\"\",\"dbCode\":\"chengshi\",\"dataId1\":\"\",\"source\":\"\",\"target\":\"\",\"isTiming\":true,\"intervalTime\":\"5\",\"chartType\":\"bar.multi.horizontal\",\"chartId\":\"bar.multi.horizontal\"},\"layer_id\":\"phTmhkjHLebYlOEQ\",\"offsetX\":0,\"offsetY\":0,\"backgroud\":{\"enabled\":false,\"color\":\"#fff\",\"image\":\"\"},\"virtualCellRange\":[[6,15],[6,16],[6,17],[6,18]]},{\"row\":7,\"col\":5,\"colspan\":0,\"rowspan\":0,\"width\":\"430\",\"height\":\"293\",\"config\":\"{\\\"geo\\\":{\\\"map\\\":\\\"china\\\",\\\"zoom\\\":0.5,\\\"label\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"8\\\",\\\"show\\\":true},\\\"itemStyle\\\":{\\\"borderWidth\\\":0.5,\\\"areaColor\\\":\\\"#8284FB\\\",\\\"borderColor\\\":\\\"#000\\\"},\\\"emphasis\\\":{\\\"label\\\":{\\\"color\\\":\\\"#fff\\\"},\\\"itemStyle\\\":{\\\"areaColor\\\":\\\"#4195EF\\\"}},\\\"regions\\\":[],\\\"layoutSize\\\":600,\\\"roam\\\":true,\\\"layoutCenter\\\":[\\\"50%\\\",\\\"50%\\\"]},\\\"series\\\":[{\\\"encode\\\":{\\\"value\\\":[2]},\\\"data\\\":[{\\\"name\\\":\\\"河北\\\",\\\"value\\\":[114.502461,38.045474,279]},{\\\"name\\\":\\\"海南\\\",\\\"value\\\":[110.33119,20.031971,273]},{\\\"name\\\":\\\"山东\\\",\\\"value\\\":[117.000923,36.675807,229]},{\\\"name\\\":\\\"甘肃\\\",\\\"value\\\":[103.823557,36.058039,194]},{\\\"name\\\":\\\"宁夏\\\",\\\"value\\\":[106.278179,38.46637,193]},{\\\"name\\\":\\\"浙江\\\",\\\"value\\\":[120.153576,30.287459,177]},{\\\"name\\\":\\\"湖南\\\",\\\"value\\\":[112.982279,28.19409,119]},{\\\"name\\\":\\\"湖北\\\",\\\"value\\\":[114.298572,30.584355,79]},{\\\"name\\\":\\\"河南\\\",\\\"value\\\":[113.665412,34.757975,67]},{\\\"name\\\":\\\"北京\\\",\\\"value\\\":[116.405285,39.904989,58]},{\\\"name\\\":\\\"天津\\\",\\\"value\\\":[117.190182,39.125596,59]},{\\\"name\\\":\\\"上海\\\",\\\"value\\\":[121.472644,31.231706,63]}],\\\"name\\\":\\\"\\\",\\\"emphasis\\\":{\\\"label\\\":{\\\"show\\\":true}},\\\"itemStyle\\\":{\\\"color\\\":\\\"#FF1205\\\"},\\\"coordinateSystem\\\":\\\"geo\\\",\\\"label\\\":{\\\"formatter\\\":\\\"{b}\\\",\\\"show\\\":false,\\\"position\\\":\\\"right\\\"},\\\"type\\\":\\\"scatter\\\",\\\"symbolSize\\\":5}],\\\"chartType\\\":\\\"map\\\",\\\"tooltip\\\":{\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"show\\\":false,\\\"top\\\":5,\\\"text\\\":\\\"主要城市空气质量\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#c23531\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"fontSize\\\":\\\"14\\\"},\\\"left\\\":\\\"left\\\",\\\"padding\\\":[5,20,5,10]}}\",\"url\":\"\",\"extData\":{\"chartType\":\"map.scatter\"},\"layer_id\":\"YTri6J59av4gj1CY\",\"offsetX\":0,\"offsetY\":0,\"backgroud\":{\"enabled\":false,\"color\":\"#fff\",\"image\":\"\"},\"virtualCellRange\":[[7,5],[7,6],[7,7],[7,8]]},{\"row\":14,\"col\":12,\"colspan\":0,\"rowspan\":0,\"width\":\"244\",\"height\":\"138\",\"config\":\"{\\\"legend\\\":{\\\"padding\\\":[25,20,25,10],\\\"data\\\":[\\\"销售额\\\",\\\"其他\\\"],\\\"top\\\":\\\"top\\\",\\\"orient\\\":\\\"horizontal\\\",\\\"left\\\":\\\"center\\\",\\\"show\\\":false,\\\"textStyle\\\":{\\\"color\\\":\\\"#333\\\",\\\"fontSize\\\":12}},\\\"series\\\":[{\\\"isRose\\\":false,\\\"data\\\":[{\\\"name\\\":\\\"销售额\\\",\\\"value\\\":6000000,\\\"itemStyle\\\":{\\\"color\\\":\\\"rgba(43,193,254,1)\\\"}},{\\\"name\\\":\\\"其他\\\",\\\"value\\\":3400879,\\\"itemStyle\\\":{\\\"color\\\":\\\"rgba(42,45,76,0.59)\\\"}}],\\\"isRadius\\\":true,\\\"roseType\\\":\\\"\\\",\\\"notCount\\\":false,\\\"name\\\":\\\"访问来源\\\",\\\"minAngle\\\":0,\\\"label\\\":{\\\"show\\\":false,\\\"position\\\":\\\"outside\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"\\\",\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"bolder\\\"}},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":[\\\"50%\\\",\\\"60%\\\"],\\\"autoSort\\\":false}],\\\"tooltip\\\":{\\\"formatter\\\":\\\"{b} : {c}\\\",\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"show\\\":false,\\\"top\\\":5,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#c23531\\\",\\\"fontWeight\\\":\\\"bolder\\\",\\\"fontSize\\\":18},\\\"left\\\":\\\"left\\\",\\\"padding\\\":[5,20,5,10]}}\",\"url\":\"\",\"extData\":{\"dataType\":\"api\",\"apiStatus\":\"1\",\"dataId\":\"1339498906765000705\",\"axisX\":\"name\",\"axisY\":\"value\",\"series\":\"type\",\"yText\":\"\",\"xText\":\"\",\"dbCode\":\"xsjd\",\"dataId1\":\"\",\"source\":\"\",\"target\":\"\",\"isTiming\":true,\"intervalTime\":\"5\",\"chartType\":\"pie.doughnut\",\"chartId\":\"pie.doughnut\"},\"layer_id\":\"ARuuHLfjqV9l1tQD\",\"offsetX\":0,\"offsetY\":0,\"backgroud\":{\"enabled\":false,\"color\":\"#fff\",\"image\":\"\"},\"virtualCellRange\":[[14,12],[14,13],[14,14]]},{\"row\":14,\"col\":15,\"colspan\":0,\"rowspan\":0,\"width\":\"230\",\"height\":\"139\",\"config\":\"{\\\"legend\\\":{\\\"padding\\\":[25,20,25,10],\\\"data\\\":[\\\"销售额\\\",\\\"其他\\\"],\\\"top\\\":\\\"top\\\",\\\"orient\\\":\\\"horizontal\\\",\\\"left\\\":\\\"center\\\",\\\"show\\\":false,\\\"textStyle\\\":{\\\"color\\\":\\\"#333\\\",\\\"fontSize\\\":12}},\\\"series\\\":[{\\\"isRose\\\":false,\\\"data\\\":[{\\\"name\\\":\\\"销售额\\\",\\\"value\\\":6000000,\\\"itemStyle\\\":{\\\"color\\\":\\\"rgba(43,193,254,1)\\\"}},{\\\"name\\\":\\\"其他\\\",\\\"value\\\":3400879,\\\"itemStyle\\\":{\\\"color\\\":\\\"rgba(42,45,76,0.59)\\\"}}],\\\"isRadius\\\":true,\\\"roseType\\\":\\\"\\\",\\\"notCount\\\":false,\\\"name\\\":\\\"访问来源\\\",\\\"minAngle\\\":0,\\\"label\\\":{\\\"show\\\":false,\\\"position\\\":\\\"outside\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"\\\",\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"bolder\\\"}},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":[\\\"45%\\\",\\\"55%\\\"],\\\"autoSort\\\":false}],\\\"tooltip\\\":{\\\"formatter\\\":\\\"{b} : {c}\\\",\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"show\\\":false,\\\"top\\\":5,\\\"text\\\":\\\"某站点用户访问来源\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#c23531\\\",\\\"fontWeight\\\":\\\"bolder\\\",\\\"fontSize\\\":18},\\\"left\\\":\\\"left\\\",\\\"padding\\\":[5,20,5,10]}}\",\"url\":\"\",\"extData\":{\"dataType\":\"api\",\"apiStatus\":\"1\",\"dataId\":\"1339498906765000705\",\"axisX\":\"name\",\"axisY\":\"value\",\"series\":\"type\",\"yText\":\"\",\"xText\":\"\",\"dbCode\":\"xsjd\",\"dataId1\":\"\",\"source\":\"\",\"target\":\"\",\"isTiming\":true,\"intervalTime\":\"5\",\"chartType\":\"pie.doughnut\",\"chartId\":\"\"},\"layer_id\":\"bcrMtWqTd2AJIjLd\",\"offsetX\":0,\"offsetY\":0,\"backgroud\":{\"enabled\":false,\"color\":\"#fff\",\"image\":\"\"},\"virtualCellRange\":[[14,15],[14,16],[14,17],[14,18]]},{\"row\":14,\"col\":10,\"colspan\":0,\"rowspan\":0,\"width\":\"244\",\"height\":\"138\",\"config\":\"{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"rotate\\\":0,\\\"interval\\\":0,\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"data\\\":[\\\"北京\\\",\\\"青岛\\\",\\\"合肥\\\",\\\"深圳\\\",\\\"石家庄\\\",\\\"重庆\\\",\\\"保定\\\",\\\"邯郸\\\"],\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\"}},\\\"show\\\":true,\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false},\\\"type\\\":\\\"category\\\"},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#333\\\",\\\"fontSize\\\":12}},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#333\\\"}},\\\"show\\\":false,\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false},\\\"type \\\":\\\"value\\\"},\\\"legend\\\":{\\\"padding\\\":[25,20,25,10],\\\"data\\\":[\\\"销售额\\\"],\\\"top\\\":\\\"top\\\",\\\"orient\\\":\\\"horizontal\\\",\\\"left\\\":\\\"center\\\",\\\"show\\\":false,\\\"textStyle\\\":{\\\"color\\\":\\\"#333\\\",\\\"fontSize\\\":12}},\\\"grid\\\":{\\\"top\\\":10,\\\"left\\\":49,\\\"bottom\\\":15,\\\"right\\\":45},\\\"series\\\":[{\\\"barWidth\\\":9,\\\"data\\\":[80,500,800,1000,1200,1500,1600,2000],\\\"name\\\":\\\"销售额\\\",\\\"itemStyle\\\":{\\\"barBorderRadius\\\":0,\\\"color\\\":\\\"rgba(146,119,252,1)\\\"},\\\"label\\\":{\\\"show\\\":true,\\\"position\\\":\\\"right\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#698AFB\\\",\\\"fontSize\\\":\\\"10\\\",\\\"fontWeight\\\":\\\"normal\\\"}},\\\"type\\\":\\\"bar\\\",\\\"barMinHeight\\\":2,\\\"typeData\\\":[],\\\"textStyle\\\":{\\\"color\\\":\\\"black\\\",\\\"fontWeight\\\":\\\"bolder\\\"}}],\\\"tooltip\\\":{\\\"show\\\":true,\\\"axisPointer\\\":{\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"show\\\":false,\\\"top\\\":5,\\\"text\\\":\\\"某站点用户访问来源\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#c23531\\\",\\\"fontWeight\\\":\\\"bolder\\\",\\\"fontSize\\\":18},\\\"left\\\":\\\"left\\\",\\\"padding\\\":[5,20,5,20]}}\",\"url\":\"\",\"extData\":{\"dataType\":\"api\",\"apiStatus\":\"1\",\"dataId\":\"1339495346077728770\",\"axisX\":\"name\",\"axisY\":\"value\",\"series\":\"type\",\"yText\":\"\",\"xText\":\"\",\"dbCode\":\"chengshi\",\"dataId1\":\"\",\"source\":\"\",\"target\":\"\",\"isTiming\":true,\"intervalTime\":\"5\",\"chartType\":\"bar.multi.horizontal\",\"chartId\":\"bar.multi.horizontal\"},\"layer_id\":\"Y1kgYOWBHIVQdSN5\",\"offsetX\":0,\"offsetY\":0,\"backgroud\":{\"enabled\":false,\"color\":\"#fff\",\"image\":\"\"},\"virtualCellRange\":[[14,10],[14,11]]},{\"row\":20,\"col\":1,\"colspan\":0,\"rowspan\":0,\"width\":\"743\",\"height\":\"150\",\"config\":\"{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\"}},\\\"show\\\":true,\\\"name\\\":\\\"\\\",\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false}},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"rotate\\\":0,\\\"interval\\\":0,\\\"textStyle\\\":{\\\"color\\\":\\\"#FEFEFE\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"data\\\":[\\\"2020-01-09\\\",\\\"2020-01-12\\\",\\\"2020-01-14\\\",\\\"2020-01-16\\\",\\\"2020-01-18\\\"],\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\"}},\\\"show\\\":true,\\\"name\\\":\\\"\\\",\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false}},\\\"grid\\\":{\\\"top\\\":53,\\\"left\\\":22,\\\"bottom\\\":37,\\\"right\\\":20},\\\"series\\\":[{\\\"areaStyle\\\":{\\\"color\\\":\\\"#43B8FB\\\",\\\"opacity\\\":0.7},\\\"data\\\":[2,6,7,5,6],\\\"showSymbol\\\":true,\\\"lineStyle\\\":{\\\"width\\\":2},\\\"symbolSize\\\":5,\\\"isArea\\\":true,\\\"name\\\":\\\"销量\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"#43B8FB\\\"},\\\"step\\\":false,\\\"label\\\":{\\\"show\\\":false,\\\"position\\\":\\\"top\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"black\\\",\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"bolder\\\"}},\\\"type\\\":\\\"line\\\",\\\"smooth\\\":false}],\\\"tooltip\\\":{\\\"formatter\\\":\\\"{b} : {c}\\\",\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"show\\\":true,\\\"top\\\":14,\\\"text\\\":\\\"销售额增速\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"fontSize\\\":\\\"14\\\"},\\\"left\\\":\\\"left\\\",\\\"padding\\\":[5,20,5,10]}}\",\"url\":\"\",\"extData\":{\"dataType\":\"api\",\"apiStatus\":\"1\",\"dataId\":\"1339538388453195777\",\"axisX\":\"name\",\"axisY\":\"value\",\"series\":\"type\",\"yText\":\"\",\"xText\":\"\",\"dbCode\":\"zhexian\",\"dataId1\":\"\",\"source\":\"\",\"target\":\"\",\"isTiming\":true,\"intervalTime\":\"5\",\"chartType\":\"line.area\",\"chartId\":\"\"},\"layer_id\":\"uChrZaHYoV04MQpT\",\"offsetX\":0,\"offsetY\":0,\"backgroud\":{\"enabled\":false,\"color\":\"#fff\",\"image\":\"\"},\"virtualCellRange\":[[20,1],[20,2],[20,3],[20,4],[20,5],[20,6],[20,7],[20,8],[20,9]]}],\"area\":false,\"excel_config_id\":\"1cd9d574d0c42f3915046dc61d9f33bd\",\"printConfig\":{\"paper\":\"A3\",\"width\":297,\"height\":420,\"definition\":1,\"isBackend\":false,\"marginX\":10,\"marginY\":10,\"layout\":\"landscape\"},\"zonedEditionList\":[],\"rows\":{\"0\":{\"cells\":{}},\"2\":{\"cells\":{\"1\":{\"merge\":[0,17],\"text\":\"企业实时销售数据\",\"style\":3}}},\"3\":{\"cells\":{},\"height\":35},\"4\":{\"cells\":{\"1\":{\"text\":\" 销售额省份排名\",\"style\":32,\"merge\":[0,1],\"virtual\":\"IFj1lg5S5aNG1wPx\"},\"2\":{\"style\":32,\"virtual\":\"IFj1lg5S5aNG1wPx\",\"text\":\" \"},\"5\":{\"text\":\" 销售总额\",\"style\":69},\"10\":{\"text\":\" 销售进度\",\"style\":43},\"11\":{\"text\":\" \",\"style\":43},\"13\":{\"text\":\" 销售额城市排名\",\"style\":32,\"merge\":[0,1]},\"15\":{\"text\":\" 个人业绩排名\",\"style\":32,\"merge\":[0,1]},\"17\":{\"text\":\" \",\"style\":32,\"merge\":[0,1]}},\"height\":38},\"5\":{\"cells\":{\"1\":{\"text\":\" Sales ranking points\",\"virtual\":\"IFj1lg5S5aNG1wPx\",\"style\":62,\"merge\":[0,1]},\"5\":{\"text\":\"12436025\",\"style\":52,\"merge\":[1,0]},\"6\":{\"merge\":[1,0],\"text\":\"元\",\"style\":22},\"10\":{\"text\":\" Sales progress\",\"style\":33},\"11\":{\"text\":\" \",\"virtual\":\"Yb2TIGEAxnvN9ITx\",\"style\":33},\"13\":{\"text\":\" Sales ranking\",\"virtual\":\"qQHpevWlqElpRQUl\",\"style\":31},\"15\":{\"text\":\" Personal ranking\",\"style\":62,\"merge\":[0,1]},\"17\":{\"text\":\" \",\"style\":62,\"merge\":[0,1]}},\"height\":24},\"6\":{\"cells\":{\"1\":{\"text\":\" \",\"merge\":[0,1],\"style\":31,\"virtual\":\"IFj1lg5S5aNG1wPx\"},\"2\":{\"style\":31,\"virtual\":\"IFj1lg5S5aNG1wPx\",\"text\":\" \"},\"3\":{\"text\":\" \",\"virtual\":\"IFj1lg5S5aNG1wPx\"},\"4\":{\"text\":\" \",\"virtual\":\"IFj1lg5S5aNG1wPx\"},\"10\":{\"text\":\" \",\"virtual\":\"Yb2TIGEAxnvN9ITx\"},\"11\":{\"text\":\" \",\"style\":33,\"virtual\":\"Yb2TIGEAxnvN9ITx\"},\"12\":{\"text\":\" \",\"virtual\":\"qQHpevWlqElpRQUl\"},\"13\":{\"text\":\" \",\"virtual\":\"qQHpevWlqElpRQUl\",\"style\":31},\"14\":{\"text\":\" \",\"virtual\":\"qQHpevWlqElpRQUl\"},\"15\":{\"text\":\" \",\"virtual\":\"phTmhkjHLebYlOEQ\"},\"16\":{\"text\":\" \",\"virtual\":\"phTmhkjHLebYlOEQ\"},\"17\":{\"text\":\" \",\"style\":31,\"virtual\":\"phTmhkjHLebYlOEQ\"},\"18\":{\"text\":\" \",\"virtual\":\"phTmhkjHLebYlOEQ\"}}},\"7\":{\"cells\":{\"5\":{\"style\":53,\"virtual\":\"YTri6J59av4gj1CY\",\"text\":\" \"},\"6\":{\"style\":22,\"virtual\":\"YTri6J59av4gj1CY\",\"text\":\" \"},\"7\":{\"text\":\" \",\"virtual\":\"YTri6J59av4gj1CY\"},\"8\":{\"text\":\" \",\"virtual\":\"YTri6J59av4gj1CY\"}}},\"8\":{\"cells\":{\"5\":{\"style\":18,\"text\":\" \",\"virtual\":\"YTri6J59av4gj1CY\"}}},\"9\":{\"cells\":{\"5\":{\"style\":21,\"text\":\" \"}}},\"10\":{\"cells\":{\"5\":{\"text\":\" \",\"style\":17}}},\"12\":{\"cells\":{\"10\":{\"text\":\" 品类销售排名\",\"style\":43},\"11\":{\"text\":\" \",\"style\":43},\"13\":{\"text\":\" 品类销售额占比\",\"style\":43,\"merge\":[0,1]},\"15\":{\"text\":\" 一季度销售季度\",\"style\":43,\"merge\":[0,1]},\"17\":{\"text\":\" \",\"style\":43,\"merge\":[0,1]}}},\"13\":{\"cells\":{\"10\":{\"text\":\" Category Sales ranking\",\"style\":31},\"11\":{\"text\":\" \",\"style\":31},\"13\":{\"text\":\" Type of Sales \",\"style\":31},\"15\":{\"text\":\" Quarterly sales progree\",\"style\":58,\"merge\":[0,1]},\"17\":{\"text\":\" \",\"style\":58,\"merge\":[0,1]}}},\"14\":{\"cells\":{\"10\":{\"text\":\" \",\"virtual\":\"Y1kgYOWBHIVQdSN5\"},\"11\":{\"text\":\" \",\"virtual\":\"Y1kgYOWBHIVQdSN5\"},\"12\":{\"text\":\" \",\"virtual\":\"ARuuHLfjqV9l1tQD\"},\"13\":{\"text\":\" \",\"virtual\":\"ARuuHLfjqV9l1tQD\"},\"14\":{\"text\":\" \",\"virtual\":\"ARuuHLfjqV9l1tQD\"},\"15\":{\"text\":\" \",\"virtual\":\"bcrMtWqTd2AJIjLd\"},\"16\":{\"text\":\" \",\"virtual\":\"bcrMtWqTd2AJIjLd\"},\"17\":{\"text\":\" \",\"virtual\":\"bcrMtWqTd2AJIjLd\"},\"18\":{\"text\":\" \",\"virtual\":\"bcrMtWqTd2AJIjLd\"}}},\"15\":{\"cells\":{},\"height\":15},\"16\":{\"cells\":{\"11\":{\"text\":\" \",\"style\":43},\"13\":{\"text\":\" \",\"style\":43,\"merge\":[0,1]},\"17\":{\"text\":\" \",\"style\":43,\"merge\":[0,1]}}},\"17\":{\"cells\":{\"11\":{\"text\":\" \",\"style\":31},\"13\":{\"text\":\" \",\"style\":31},\"17\":{\"text\":\" \",\"merge\":[0,1],\"style\":58}}},\"18\":{\"cells\":{}},\"20\":{\"cells\":{\"1\":{\"text\":\" \",\"virtual\":\"uChrZaHYoV04MQpT\"},\"2\":{\"text\":\" \",\"virtual\":\"uChrZaHYoV04MQpT\"},\"3\":{\"text\":\" \",\"virtual\":\"uChrZaHYoV04MQpT\"},\"4\":{\"text\":\" \",\"virtual\":\"uChrZaHYoV04MQpT\"},\"5\":{\"text\":\" \",\"virtual\":\"uChrZaHYoV04MQpT\"},\"6\":{\"text\":\" \",\"virtual\":\"uChrZaHYoV04MQpT\"},\"7\":{\"text\":\" \",\"virtual\":\"uChrZaHYoV04MQpT\"},\"8\":{\"text\":\" \",\"virtual\":\"uChrZaHYoV04MQpT\"},\"9\":{\"text\":\" \",\"virtual\":\"uChrZaHYoV04MQpT\"}},\"height\":39},\"22\":{\"cells\":{\"10\":{\"text\":\"企业经营指标\",\"style\":74},\"11\":{\"text\":\"1201043元\",\"style\":73},\"13\":{\"text\":\"企业经营指标\",\"style\":74},\"14\":{\"text\":\"1201043元\",\"style\":73},\"16\":{\"text\":\"企业经营指标\",\"style\":74},\"17\":{\"text\":\"1201043元\",\"style\":73}}},\"23\":{\"cells\":{\"10\":{\"text\":\"企业经营指标1\",\"style\":74},\"11\":{\"text\":\"1201043元\",\"style\":73},\"13\":{\"text\":\"企业经营指标1\",\"style\":74},\"14\":{\"text\":\"1201043元\",\"style\":73},\"16\":{\"text\":\"企业经营指标1\",\"style\":74},\"17\":{\"text\":\"1201043元\",\"style\":73}}},\"26\":{\"cells\":{},\"height\":33},\"len\":100},\"dbexps\":[],\"dicts\":[],\"rpbar\":{\"show\":true,\"pageSize\":\"\",\"btnList\":[]},\"fixedPrintHeadRows\":[],\"fixedPrintTailRows\":[],\"freeze\":\"A1\",\"displayConfig\":{},\"background\":{\"path\":\"https://static.jeecg.com/designreport/images/bg55_1608205385382.png\",\"repeat\":\"no-repeat\",\"width\":\"1525\",\"height\":\"700\"},\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"color\":\"#ffffff\"},{\"color\":\"#ffffff\",\"font\":{\"size\":16}},{\"color\":\"#ffffff\",\"font\":{\"size\":16},\"align\":\"center\"},{\"color\":\"#ffffff\",\"font\":{\"size\":18},\"align\":\"center\"},{\"font\":{\"size\":18}},{\"color\":\"#67b1ee\"},{\"color\":\"#67b1ee\",\"font\":{\"size\":14}},{\"color\":\"#67b1ee\",\"font\":{\"size\":12}},{\"font\":{\"size\":14}},{\"font\":{\"size\":18},\"bgcolor\":\"#ffffff\"},{\"font\":{\"size\":18},\"bgcolor\":\"#ffffff\",\"color\":\"#ffffff\"},{\"font\":{\"size\":16},\"bgcolor\":\"#ffffff\",\"color\":\"#ffffff\"},{\"color\":\"#67b1ee\",\"font\":{\"size\":12},\"align\":\"right\"},{\"font\":{\"size\":16},\"bgcolor\":\"#ffffff\",\"color\":\"#ffffff\",\"align\":\"right\"},{\"color\":\"#67b1ee\",\"font\":{\"size\":12},\"align\":\"center\"},{\"font\":{\"size\":16}},{\"font\":{\"size\":16},\"color\":\"#fe0000\"},{\"font\":{\"size\":16},\"color\":\"#fe0000\",\"align\":\"center\"},{\"color\":\"#67b1ee\",\"font\":{\"size\":12},\"align\":\"left\"},{\"align\":\"left\"},{\"align\":\"left\",\"font\":{\"size\":14}},{\"align\":\"left\",\"font\":{\"size\":14},\"color\":\"#ffffff\"},{\"font\":{\"size\":14},\"color\":\"#ffffff\"},{\"font\":{\"size\":12},\"color\":\"#ffffff\"},{\"font\":{\"size\":12,\"bold\":true},\"color\":\"#ffffff\"},{\"font\":{\"size\":12,\"bold\":false},\"color\":\"#ffffff\"},{\"font\":{\"size\":11,\"bold\":false},\"color\":\"#ffffff\"},{\"font\":{\"size\":8}},{\"font\":{\"size\":9}},{\"font\":{\"size\":9},\"color\":\"#67b1ee\"},{\"font\":{\"size\":9},\"color\":\"#67b1ee\",\"valign\":\"top\"},{\"font\":{\"size\":8},\"color\":\"#67b1ee\",\"valign\":\"top\"},{\"font\":{\"size\":11,\"bold\":false},\"color\":\"#ffffff\",\"valign\":\"bottom\"},{\"font\":{\"size\":8},\"color\":\"#67b1ee\"},{\"color\":\"#67b1ee\",\"font\":{\"size\":12},\"align\":\"left\",\"valign\":\"bottom\"},{\"align\":\"left\",\"valign\":\"bottom\"},{\"color\":\"#67b1ee\",\"font\":{\"size\":12},\"align\":\"center\",\"valign\":\"bottom\"},{\"align\":\"center\",\"valign\":\"bottom\"},{\"color\":\"#67b1ee\",\"font\":{\"size\":12},\"align\":\"left\",\"valign\":\"middle\"},{\"align\":\"left\",\"valign\":\"middle\"},{\"font\":{\"size\":11}},{\"font\":{\"size\":11},\"color\":\"#ffffff\"},{\"font\":{\"size\":11},\"color\":\"#ffffff\",\"valign\":\"middle\"},{\"font\":{\"size\":11},\"color\":\"#ffffff\",\"valign\":\"bottom\"},{\"color\":\"#ffffff\",\"font\":{\"size\":12},\"align\":\"left\",\"valign\":\"middle\"},{\"align\":\"left\",\"valign\":\"middle\",\"color\":\"#ffffff\"},{\"color\":\"#67b1ee\",\"font\":{\"size\":16}},{\"color\":\"#ffff01\",\"font\":{\"size\":16}},{\"color\":\"#ffffff\",\"font\":{\"size\":11},\"align\":\"left\",\"valign\":\"middle\"},{\"color\":\"#ffffff\",\"font\":{\"size\":14},\"align\":\"left\",\"valign\":\"middle\"},{\"color\":\"#ffff01\",\"font\":{\"size\":14},\"align\":\"left\",\"valign\":\"middle\"},{\"font\":{\"size\":14},\"color\":\"#ffff01\"},{\"color\":\"#ffff01\",\"font\":{\"size\":14},\"align\":\"right\",\"valign\":\"middle\"},{\"font\":{\"size\":14},\"color\":\"#ffff01\",\"align\":\"right\"},{\"color\":\"#ffffff\",\"valign\":\"bottom\"},{\"font\":{\"size\":8},\"bgcolor\":\"#67b1ee\"},{\"font\":{\"size\":8},\"bgcolor\":\"#ffffff\"},{\"font\":{\"size\":8},\"bgcolor\":\"#ffffff\",\"color\":\"#67b1ee\"},{\"font\":{\"size\":8},\"bgcolor\":\"#ffffff\",\"color\":\"#67b1ee\",\"valign\":\"top\"},{\"font\":{\"size\":8,\"bold\":false},\"color\":\"#ffffff\",\"valign\":\"bottom\"},{\"font\":{\"size\":8,\"bold\":false},\"color\":\"#ffffff\",\"valign\":\"top\"},{\"font\":{\"size\":8},\"valign\":\"top\"},{\"font\":{\"size\":8,\"bold\":false},\"color\":\"#67b1ee\",\"valign\":\"top\"},{\"color\":\"#ffffff\",\"font\":{\"size\":11},\"align\":\"center\",\"valign\":\"middle\"},{\"align\":\"center\"},{\"color\":\"#ffffff\",\"font\":{\"size\":11},\"align\":\"right\",\"valign\":\"middle\"},{\"align\":\"right\"},{\"color\":\"#ffffff\",\"font\":{\"size\":14},\"align\":\"right\",\"valign\":\"middle\"},{\"align\":\"right\",\"font\":{\"size\":14}},{\"color\":\"#ffffff\",\"font\":{\"size\":11},\"align\":\"left\",\"valign\":\"bottom\"},{\"color\":\"#67b1ee\",\"font\":{\"size\":11}},{\"color\":\"#67b1ee\",\"font\":{\"size\":11},\"align\":\"center\"},{\"font\":{\"size\":12}},{\"font\":{\"size\":12},\"color\":\"#ffff01\"},{\"color\":\"#67b1ee\",\"font\":{\"size\":11},\"align\":\"right\"}],\"validations\":[],\"cols\":{\"0\":{\"width\":10},\"3\":{\"width\":102},\"4\":{\"width\":9},\"5\":{\"width\":105},\"6\":{\"width\":102},\"8\":{\"width\":124},\"9\":{\"width\":14},\"10\":{\"width\":136},\"11\":{\"width\":114},\"12\":{\"width\":15},\"13\":{\"width\":113},\"14\":{\"width\":129},\"15\":{\"width\":11},\"len\":50},\"merges\":[\"B3:S3\",\"B5:C5\",\"N5:O5\",\"P5:Q5\",\"R5:S5\",\"B6:C6\",\"F6:F7\",\"G6:G7\",\"P6:Q6\",\"R6:S6\",\"B7:C7\",\"N13:O13\",\"P13:Q13\",\"R13:S13\",\"P14:Q14\",\"R14:S14\",\"N17:O17\",\"R17:S17\",\"R18:S18\"]}', NULL, 'https://static.jeecg.com/designreport/images/QQ截图20201218200943_1608293404719.png', 'admin', '2021-01-18 13:21:10', 'admin', '2022-12-15 08:55:23', 0, NULL, NULL, 0, 681, NULL, NULL, NULL); +INSERT INTO `jimu_report` VALUES ('519c1c6f4d1f584ae8fa5b43b45acdc7', '56623333333', '销售单', '', NULL, 'printinfo', '{\"loopBlockList\":[],\"area\":false,\"excel_config_id\":\"519c1c6f4d1f584ae8fa5b43b45acdc7\",\"printConfig\":{\"paper\":\"A4\",\"width\":210,\"height\":297,\"definition\":1,\"isBackend\":false,\"marginX\":10,\"marginY\":10},\"rows\":{\"0\":{\"cells\":{\"1\":{\"text\":\"销售单\",\"style\":40,\"merge\":[0,6]}},\"height\":99},\"1\":{\"cells\":{\"1\":{\"text\":\"商品编码\",\"style\":62},\"2\":{\"text\":\"商品名称\",\"style\":62},\"3\":{\"text\":\"销售时间\",\"style\":62},\"4\":{\"text\":\"销售数量\",\"style\":62},\"5\":{\"text\":\"定价\",\"style\":62},\"6\":{\"text\":\"优惠价\",\"style\":62},\"7\":{\"text\":\"付款金额\",\"style\":62}},\"height\":39},\"2\":{\"cells\":{\"1\":{\"text\":\"#{xiaoshou.bianma}\",\"style\":61},\"2\":{\"text\":\"#{xiaoshou.cname}\",\"style\":61},\"3\":{\"text\":\"#{xiaoshou.ctime}\",\"style\":61},\"4\":{\"text\":\"#{xiaoshou.cnum}\",\"style\":61},\"5\":{\"text\":\"#{xiaoshou.cprice}\",\"style\":61},\"6\":{\"text\":\"#{xiaoshou.yprice}\",\"style\":61},\"7\":{\"text\":\"#{xiaoshou.ctotal}\",\"style\":61}},\"isDrag\":true,\"height\":35},\"3\":{\"cells\":{\"1\":{\"style\":44,\"text\":\"\"},\"5\":{\"style\":44,\"text\":\"\"},\"6\":{\"text\":\"\",\"style\":45},\"7\":{\"style\":46,\"text\":\"=SUM(H3)\"}},\"isDrag\":true,\"height\":73},\"5\":{\"cells\":{},\"isDrag\":true},\"6\":{\"cells\":{},\"isDrag\":true},\"7\":{\"cells\":{\"2\":{\"text\":\"\"}},\"isDrag\":true},\"len\":100},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":718,\"heightPx\":1047},\"dicts\":[],\"freeze\":\"A1\",\"dataRectWidth\":703,\"displayConfig\":{},\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"align\":\"center\"},{\"align\":\"center\",\"color\":\"#000100\"},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#01b0f1\"],\"top\":[\"thin\",\"#01b0f1\"],\"left\":[\"thin\",\"#01b0f1\"],\"right\":[\"thin\",\"#01b0f1\"]}},{\"border\":{\"bottom\":[\"thin\",\"#01b0f1\"],\"top\":[\"thin\",\"#01b0f1\"],\"left\":[\"thin\",\"#01b0f1\"],\"right\":[\"thin\",\"#01b0f1\"]}},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#01b0f1\"],\"top\":[\"thin\",\"#01b0f1\"],\"left\":[\"thin\",\"#01b0f1\"],\"right\":[\"thin\",\"#01b0f1\"]},\"bgcolor\":\"#01b0f1\"},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]},\"bgcolor\":\"#01b0f1\"},{\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"align\":\"center\",\"font\":{\"size\":18}},{\"align\":\"center\",\"font\":{\"size\":18,\"bold\":true}},{\"align\":\"center\",\"font\":{\"size\":16,\"bold\":true}},{\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]},\"align\":\"center\"},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]},\"bgcolor\":\"#fed964\"},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]},\"bgcolor\":\"#fdc101\"},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#fdc101\"],\"top\":[\"thin\",\"#fdc101\"],\"left\":[\"thin\",\"#fdc101\"],\"right\":[\"thin\",\"#fdc101\"]},\"bgcolor\":\"#fdc101\"},{\"border\":{\"bottom\":[\"thin\",\"#fdc101\"],\"top\":[\"thin\",\"#fdc101\"],\"left\":[\"thin\",\"#fdc101\"],\"right\":[\"thin\",\"#fdc101\"]},\"align\":\"center\"},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#fdc101\"],\"top\":[\"thin\",\"#fdc101\"],\"left\":[\"thin\",\"#fdc101\"],\"right\":[\"thin\",\"#fdc101\"]},\"bgcolor\":\"#ffe59a\"},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#fdc101\"],\"top\":[\"thin\",\"#fdc101\"],\"left\":[\"thin\",\"#fdc101\"],\"right\":[\"thin\",\"#fdc101\"]},\"bgcolor\":\"#ffc001\"},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#fdc101\"],\"top\":[\"thin\",\"#fdc101\"],\"left\":[\"thin\",\"#fdc101\"],\"right\":[\"thin\",\"#fdc101\"]},\"bgcolor\":\"#fed964\"},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#fdc101\"],\"top\":[\"thin\",\"#fdc101\"],\"left\":[\"thin\",\"#fdc101\"],\"right\":[\"thin\",\"#fdc101\"]},\"bgcolor\":\"#ed7d31\"},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#fdc101\"],\"top\":[\"thin\",\"#fdc101\"],\"left\":[\"thin\",\"#fdc101\"],\"right\":[\"thin\",\"#fdc101\"]},\"bgcolor\":\"#5b9cd6\"},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#4371c6\"],\"top\":[\"thin\",\"#4371c6\"],\"left\":[\"thin\",\"#4371c6\"],\"right\":[\"thin\",\"#4371c6\"]},\"bgcolor\":\"#5b9cd6\"},{\"border\":{\"bottom\":[\"thin\",\"#4371c6\"],\"top\":[\"thin\",\"#4371c6\"],\"left\":[\"thin\",\"#4371c6\"],\"right\":[\"thin\",\"#4371c6\"]},\"align\":\"center\"},{\"font\":{\"size\":8}},{\"font\":{\"size\":8},\"color\":\"#7f7f7f\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#4371c6\"],\"top\":[\"thin\",\"#4371c6\"],\"left\":[\"thin\",\"#4371c6\"],\"right\":[\"thin\",\"#4371c6\"]},\"bgcolor\":\"#9cc2e6\"},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]},\"bgcolor\":\"#9cc2e6\"},{\"border\":{\"bottom\":[\"thin\",\"#4371c6\"],\"top\":[\"thin\",\"#4371c6\"],\"left\":[\"thin\",\"#4371c6\"],\"right\":[\"thin\",\"#4371c6\"]}},{\"font\":{\"bold\":true}},{\"font\":{\"bold\":true,\"size\":12}},{\"font\":{\"bold\":true,\"size\":16}},{\"font\":{\"bold\":true,\"size\":18}},{\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]},\"align\":\"right\"},{\"align\":\"right\"},{\"align\":\"left\"},{\"align\":\"right\",\"font\":{\"size\":16}},{\"align\":\"left\",\"font\":{\"size\":16}},{\"align\":\"right\",\"font\":{\"size\":14}},{\"align\":\"left\",\"font\":{\"size\":14}},{\"align\":\"center\",\"font\":{\"size\":18,\"bold\":true,\"name\":\"宋体\"}},{\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#4371c6\"],\"top\":[\"thin\",\"#4371c6\"],\"left\":[\"thin\",\"#4371c6\"],\"right\":[\"thin\",\"#4371c6\"]},\"bgcolor\":\"#9cc2e6\",\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#4371c6\"],\"top\":[\"thin\",\"#4371c6\"],\"left\":[\"thin\",\"#4371c6\"],\"right\":[\"thin\",\"#4371c6\"]},\"align\":\"center\",\"font\":{\"name\":\"宋体\"}},{\"align\":\"right\",\"font\":{\"name\":\"宋体\"}},{\"align\":\"right\",\"font\":{\"size\":14,\"name\":\"宋体\"}},{\"align\":\"left\",\"font\":{\"size\":14,\"name\":\"宋体\"}},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#2e75b5\"],\"top\":[\"thin\",\"#2e75b5\"],\"left\":[\"thin\",\"#2e75b5\"],\"right\":[\"thin\",\"#2e75b5\"]},\"bgcolor\":\"#9cc2e6\",\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"color\":\"#000100\",\"bgcolor\":\"#9cc2e6\",\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]},\"align\":\"center\",\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#ffff01\"],\"top\":[\"thin\",\"#ffff01\"],\"left\":[\"thin\",\"#ffff01\"],\"right\":[\"thin\",\"#ffff01\"]},\"align\":\"center\",\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"center\",\"font\":{\"name\":\"宋体\"}},{\"align\":\"right\",\"font\":{\"size\":14,\"name\":\"宋体\"},\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"align\":\"center\",\"color\":\"#000100\",\"bgcolor\":\"#9cc2e6\",\"font\":{\"name\":\"宋体\"},\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"color\":\"#000100\",\"bgcolor\":\"#9cc2e6\",\"font\":{\"name\":\"宋体\"},\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"align\":\"center\",\"color\":\"#ffffff\",\"bgcolor\":\"#9cc2e6\",\"font\":{\"name\":\"宋体\"},\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"align\":\"center\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#2e75b5\"],\"top\":[\"thin\",\"#2e75b5\"],\"left\":[\"thin\",\"#2e75b5\"],\"right\":[\"thin\",\"#2e75b5\"]},\"bgcolor\":\"#9cc2e6\",\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#4371c6\"],\"top\":[\"thin\",\"#4371c6\"],\"left\":[\"thin\",\"#4371c6\"],\"right\":[\"thin\",\"#4371c6\"]},\"bgcolor\":\"#9cc2e6\",\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"color\":\"#ffffff\",\"bgcolor\":\"#9cc2e6\",\"font\":{\"name\":\"宋体\"},\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]}},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"align\":\"center\",\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"color\":\"#ffffff\",\"bgcolor\":\"#9cc2e6\",\"font\":{\"name\":\"宋体\"},\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"align\":\"center\",\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"color\":\"#ffffff\",\"bgcolor\":\"#5b9cd6\",\"font\":{\"name\":\"宋体\"},\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}}],\"validations\":[],\"cols\":{\"0\":{\"width\":18},\"1\":{\"width\":102},\"2\":{\"width\":132},\"3\":{\"width\":147},\"4\":{\"width\":66},\"5\":{\"width\":66},\"6\":{\"width\":84},\"7\":{\"width\":88},\"8\":{\"width\":121},\"len\":50},\"merges\":[\"B1:H1\"]}', '', 'https://static.jeecg.com/designreport/images/xiaoshou_1607310086160.png', 'jeecg', '2020-07-28 16:54:44', 'admin', '2021-07-12 12:21:30', 0, NULL, NULL, 1, 2085, NULL, NULL, NULL); +INSERT INTO `jimu_report` VALUES ('537446834339098624', '20210401114849', 'oo', NULL, NULL, 'printinfo', '{\"loopBlockList\":[],\"area\":{\"sri\":3,\"sci\":4,\"eri\":3,\"eci\":4,\"width\":100,\"height\":25},\"excel_config_id\":\"537446834339098624\",\"printConfig\":{\"paper\":\"A4\",\"width\":210,\"height\":297,\"definition\":1,\"isBackend\":false,\"marginX\":10,\"marginY\":10},\"rows\":{\"3\":{\"cells\":{\"1\":{\"text\":\"#{pp.id}\"},\"2\":{\"text\":\"#{pp.cname}\"},\"3\":{\"text\":\"#{pp.cnum}\"},\"4\":{\"text\":\"#{pp.cprice}\"}}},\"len\":98,\"-1\":{\"cells\":{\"-1\":{\"text\":\"#{tt.id}\"}}}},\"dbexps\":[],\"dicts\":[],\"freeze\":\"A1\",\"dataRectWidth\":512,\"displayConfig\":{},\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[],\"validations\":[],\"cols\":{\"2\":{\"width\":109},\"3\":{\"width\":103},\"len\":50},\"merges\":[]}', NULL, NULL, 'admin', '2021-04-01 03:48:50', 'admin', '2021-04-01 05:56:45', 1, NULL, NULL, 0, 49, NULL, NULL, NULL); +INSERT INTO `jimu_report` VALUES ('539340274106675200', '20210406171243', '333', NULL, NULL, 'printinfo', '{\"loopBlockList\":[],\"area\":false,\"excel_config_id\":\"539340274106675200\",\"printConfig\":{\"paper\":\"A4\",\"width\":210,\"height\":297,\"definition\":1,\"isBackend\":false,\"marginX\":10,\"marginY\":10},\"rows\":{\"1\":{\"cells\":{\"0\":{\"text\":\" \",\"virtual\":\"4YgDWyELjvBe4KIH\"},\"1\":{\"text\":\" \",\"virtual\":\"4YgDWyELjvBe4KIH\"},\"2\":{\"text\":\" \",\"virtual\":\"4YgDWyELjvBe4KIH\"}}},\"len\":100},\"dbexps\":[],\"dicts\":[],\"freeze\":\"A1\",\"dataRectWidth\":0,\"displayConfig\":{},\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[],\"validations\":[],\"cols\":{\"len\":50},\"merges\":[],\"imgList\":[{\"row\":1,\"col\":0,\"width\":\"247\",\"height\":\"213\",\"src\":\"excel_online/11_1617700358412.jpg\",\"layer_id\":\"4YgDWyELjvBe4KIH\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[1,0],[1,1],[1,2]]}]}', NULL, NULL, 'admin', '2021-04-06 09:12:44', 'admin', '2021-07-13 10:23:35', 1, NULL, NULL, 0, 4, NULL, NULL, NULL); +INSERT INTO `jimu_report` VALUES ('53c82a76f837d5661dceec7d93afafec', '5678', '阜阳检票数查询', '', NULL, 'printinfo', '{\"loopBlockList\":[],\"area\":false,\"printElWidth\":718,\"excel_config_id\":\"53c82a76f837d5661dceec7d93afafec\",\"printElHeight\":1047,\"rows\":{\"0\":{\"cells\":{\"0\":{\"style\":58},\"1\":{\"text\":\"\",\"style\":66},\"2\":{\"style\":66},\"3\":{\"style\":67,\"merge\":[0,3],\"text\":\"阜阳火车站检票数\"},\"4\":{\"style\":67},\"5\":{\"style\":67},\"6\":{\"style\":67},\"7\":{\"style\":66},\"8\":{\"style\":66},\"9\":{\"style\":58}},\"height\":63},\"1\":{\"cells\":{\"0\":{\"style\":58},\"1\":{\"style\":66},\"2\":{\"style\":66},\"3\":{\"style\":66},\"4\":{\"style\":66},\"5\":{\"style\":66},\"6\":{\"style\":66},\"7\":{\"style\":66},\"8\":{\"style\":66},\"9\":{\"style\":58}},\"height\":20},\"2\":{\"cells\":{\"0\":{\"style\":58},\"1\":{\"text\":\"日期:\",\"style\":68},\"2\":{\"text\":\"${gongsi.tdata}\",\"style\":69},\"3\":{\"style\":66},\"4\":{\"style\":66,\"text\":\"制表人:\"},\"5\":{\"text\":\"${gongsi.gname}\",\"style\":66},\"6\":{\"style\":66},\"7\":{\"text\":\"\",\"merge\":[0,1],\"style\":70},\"8\":{\"style\":70},\"9\":{\"style\":58}},\"isDrag\":true},\"3\":{\"cells\":{\"0\":{\"style\":58},\"1\":{\"text\":\"班次\",\"merge\":[1,0],\"style\":71},\"2\":{\"text\":\"发车时间\",\"merge\":[1,0],\"style\":71},\"3\":{\"text\":\"是否放空\",\"merge\":[1,0],\"style\":71},\"4\":{\"text\":\"路线\",\"merge\":[0,1],\"style\":71},\"5\":{\"style\":72},\"6\":{\"text\":\"核载座位数\",\"merge\":[1,0],\"style\":71},\"7\":{\"merge\":[1,0],\"style\":71,\"text\":\"检票数\"},\"8\":{\"merge\":[1,0],\"style\":71,\"text\":\"实载率(%)\"},\"9\":{\"style\":58}}},\"4\":{\"cells\":{\"0\":{\"style\":58},\"1\":{\"style\":72},\"2\":{\"style\":71},\"3\":{\"style\":72},\"4\":{\"text\":\"从\",\"style\":71},\"5\":{\"text\":\"到\",\"style\":71},\"6\":{\"style\":72},\"7\":{\"style\":71},\"8\":{\"style\":72},\"9\":{\"style\":58}},\"height\":25},\"5\":{\"cells\":{\"0\":{\"style\":58},\"1\":{\"style\":73,\"text\":\"#{jianpiao.bnum}\"},\"2\":{\"style\":73,\"text\":\"#{jianpiao.ftime}\"},\"3\":{\"style\":73,\"text\":\"#{jianpiao.sfkong}\"},\"4\":{\"style\":73,\"text\":\"#{jianpiao.kaishi}\"},\"5\":{\"style\":73,\"text\":\"#{jianpiao.jieshu}\"},\"6\":{\"style\":73,\"text\":\"#{jianpiao.hezairen}\"},\"7\":{\"style\":73,\"text\":\"#{jianpiao.jpnum}\"},\"8\":{\"style\":73,\"text\":\"#{jianpiao.shihelv}\"},\"9\":{\"style\":58}},\"height\":33},\"6\":{\"cells\":{\"1\":{\"text\":\"\",\"style\":11},\"2\":{\"style\":11},\"3\":{\"style\":11},\"4\":{\"style\":11},\"5\":{\"style\":11},\"6\":{\"style\":11},\"7\":{\"style\":11},\"8\":{\"style\":11}},\"isDrag\":true},\"7\":{\"cells\":{\"1\":{\"style\":11},\"2\":{\"style\":11,\"text\":\"\"},\"3\":{\"style\":11},\"4\":{\"style\":11},\"5\":{\"style\":11},\"6\":{\"style\":11},\"7\":{\"style\":11},\"8\":{\"style\":11}}},\"8\":{\"cells\":{\"1\":{\"style\":11},\"2\":{\"style\":11},\"3\":{\"style\":11},\"4\":{\"style\":11},\"5\":{\"style\":11},\"6\":{\"style\":11},\"7\":{\"style\":11},\"8\":{\"style\":11}}},\"9\":{\"cells\":{\"1\":{\"style\":11},\"2\":{\"style\":11},\"3\":{\"style\":11},\"4\":{\"style\":11},\"5\":{\"style\":11},\"6\":{\"style\":11},\"7\":{\"style\":11},\"8\":{\"style\":11}}},\"10\":{\"cells\":{\"1\":{\"style\":11},\"2\":{\"style\":11},\"3\":{\"style\":11},\"4\":{\"style\":11},\"5\":{\"style\":11},\"6\":{\"style\":11},\"7\":{\"style\":11},\"8\":{\"style\":11}}},\"11\":{\"cells\":{\"1\":{\"style\":11},\"2\":{\"style\":11},\"3\":{\"style\":11},\"4\":{\"style\":11},\"5\":{\"style\":11},\"6\":{\"style\":11},\"7\":{\"style\":11},\"8\":{\"style\":11}}},\"12\":{\"cells\":{\"1\":{\"style\":11},\"2\":{\"style\":11},\"3\":{\"style\":11},\"4\":{\"style\":11},\"5\":{\"style\":11},\"6\":{\"style\":11},\"7\":{\"style\":11},\"8\":{\"style\":11}}},\"13\":{\"cells\":{\"1\":{\"style\":11},\"2\":{\"style\":11},\"3\":{\"style\":11},\"4\":{\"style\":11},\"5\":{\"style\":11},\"6\":{\"style\":11},\"7\":{\"style\":11},\"8\":{\"style\":11}}},\"14\":{\"cells\":{\"1\":{\"style\":11},\"2\":{\"style\":11},\"3\":{\"style\":11},\"4\":{\"style\":11},\"5\":{\"style\":11},\"6\":{\"style\":11},\"7\":{\"style\":11},\"8\":{\"style\":11}}},\"len\":96,\"-1\":{\"cells\":{\"-1\":{\"text\":\"${gongsi.id}\"}},\"isDrag\":true}},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":718,\"heightPx\":1047},\"dicts\":[],\"freeze\":\"A1\",\"dataRectWidth\":701,\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"align\":\"center\"},{\"align\":\"center\",\"border\":{\"top\":[\"thin\",\"#000\"],\"bottom\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"border\":{\"top\":[\"thin\",\"#000\"],\"bottom\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"border\":{\"top\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"border\":{\"top\":[\"thin\",\"#000\"],\"bottom\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"border\":{\"top\":[\"thin\",\"#000\"],\"bottom\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"border\":{\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{},{\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"],\"top\":[\"thin\",\"#7f7f7f\"],\"left\":[\"thin\",\"#7f7f7f\"],\"right\":[\"thin\",\"#7f7f7f\"]}},{\"border\":{\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"]}},{\"border\":{\"top\":[\"thin\",\"#000100\"]}},{\"border\":{\"top\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"border\":{\"left\":[\"thin\",\"#000100\"]}},{\"border\":{\"right\":[\"thin\",\"#000100\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000100\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"border\":{\"top\":[\"thin\",\"#7f7f7f\"]}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"border\":{\"right\":[\"thin\",\"#7f7f7f\"],\"bottom\":[\"thin\",\"#7f7f7f\"]}},{\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"]}},{\"border\":{\"right\":[\"thin\",\"#7f7f7f\"]}},{\"align\":\"center\",\"font\":{\"size\":16}},{\"align\":\"center\",\"font\":{\"size\":16,\"bold\":true}},{\"font\":{\"bold\":true}},{\"font\":{\"bold\":false}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"font\":{\"bold\":true}},{\"align\":\"center\",\"font\":{\"bold\":true}},{\"align\":\"right\"},{\"align\":\"center\",\"font\":{\"size\":14,\"bold\":true}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"font\":{\"bold\":true},\"bgcolor\":\"#4371c6\"},{\"align\":\"center\",\"font\":{\"bold\":true},\"bgcolor\":\"#4371c6\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"font\":{\"bold\":false},\"bgcolor\":\"#4371c6\"},{\"align\":\"center\",\"font\":{\"bold\":false},\"bgcolor\":\"#4371c6\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"font\":{\"bold\":false},\"bgcolor\":\"#2e75b5\"},{\"align\":\"center\",\"font\":{\"bold\":false},\"bgcolor\":\"#2e75b5\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"font\":{\"bold\":false},\"bgcolor\":\"#5b9cd6\"},{\"align\":\"center\",\"font\":{\"bold\":false},\"bgcolor\":\"#5b9cd6\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"font\":{\"bold\":false},\"bgcolor\":\"#0170c1\"},{\"align\":\"center\",\"font\":{\"bold\":false},\"bgcolor\":\"#0170c1\"},{\"font\":{\"bold\":false},\"color\":\"#7f7f7f\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"font\":{\"bold\":false},\"bgcolor\":\"#9cc2e6\"},{\"align\":\"center\",\"font\":{\"bold\":false},\"bgcolor\":\"#9cc2e6\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"font\":{\"bold\":false},\"bgcolor\":\"#01b0f1\"},{\"align\":\"center\",\"font\":{\"bold\":false},\"bgcolor\":\"#01b0f1\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]},\"font\":{\"bold\":false},\"bgcolor\":\"#5b9cd6\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]},\"font\":{\"bold\":false},\"bgcolor\":\"#9cc2e6\"},{\"align\":\"center\",\"font\":{\"size\":16,\"bold\":true},\"valign\":\"bottom\"},{\"align\":\"center\",\"font\":{\"size\":22,\"bold\":true},\"valign\":\"bottom\"},{\"align\":\"center\",\"font\":{\"size\":18,\"bold\":true},\"valign\":\"bottom\"},{\"font\":{\"bold\":false},\"color\":\"#7f7f7f\",\"align\":\"right\"},{\"color\":\"#7f7f7f\"},{\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"font\":{\"size\":18,\"bold\":true,\"name\":\"宋体\"},\"valign\":\"bottom\"},{\"font\":{\"bold\":false,\"name\":\"宋体\"},\"color\":\"#7f7f7f\",\"align\":\"right\"},{\"color\":\"#7f7f7f\",\"font\":{\"name\":\"宋体\"}},{\"align\":\"right\",\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]},\"font\":{\"bold\":false,\"name\":\"宋体\"},\"bgcolor\":\"#9cc2e6\"},{\"align\":\"center\",\"font\":{\"bold\":false,\"name\":\"宋体\"},\"bgcolor\":\"#9cc2e6\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]},\"font\":{\"name\":\"宋体\"}},{\"font\":{\"name\":\"Microsoft YaHei\"}},{\"align\":\"center\",\"font\":{\"size\":18,\"bold\":true,\"name\":\"Microsoft YaHei\"},\"valign\":\"bottom\"},{\"font\":{\"bold\":false,\"name\":\"Microsoft YaHei\"},\"color\":\"#7f7f7f\",\"align\":\"right\"},{\"color\":\"#7f7f7f\",\"font\":{\"name\":\"Microsoft YaHei\"}},{\"align\":\"right\",\"font\":{\"name\":\"Microsoft YaHei\"}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]},\"font\":{\"bold\":false,\"name\":\"Microsoft YaHei\"},\"bgcolor\":\"#9cc2e6\"},{\"align\":\"center\",\"font\":{\"bold\":false,\"name\":\"Microsoft YaHei\"},\"bgcolor\":\"#9cc2e6\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]},\"font\":{\"name\":\"Microsoft YaHei\"}}],\"validations\":[],\"cols\":{\"0\":{\"width\":17},\"1\":{\"width\":118},\"2\":{\"width\":75},\"3\":{\"width\":54},\"4\":{\"width\":95},\"5\":{\"width\":109},\"6\":{\"width\":75},\"7\":{\"width\":75},\"8\":{\"width\":83},\"9\":{\"width\":30},\"len\":50},\"merges\":[\"E4:F4\",\"B4:B5\",\"C4:C5\",\"D4:D5\",\"G4:G5\",\"H4:H5\",\"I4:I5\",\"D1:G1\",\"H3:I3\"]}', '', 'https://static.jeecg.com/designreport/images/25_1597233573577.png', 'jeecg', '2020-06-16 15:01:42', 'admin', '2021-02-03 12:11:37', 0, NULL, NULL, 1, 691, NULL, NULL, NULL); +INSERT INTO `jimu_report` VALUES ('5485950d88c9918d03dece2ad24b4d72', '202101081612408899', '实例:年度各月份佣金收入副本8899', NULL, NULL, 'datainfo', '{\"loopBlockList\":[],\"area\":{\"sri\":11,\"sci\":7,\"eri\":11,\"eci\":7,\"width\":100,\"height\":25},\"printElWidth\":749,\"excel_config_id\":\"1347454742040809472\",\"printElHeight\":1047,\"rows\":{\"1\":{\"cells\":{\"1\":{\"text\":\" \",\"virtual\":\"pZTpI3BKFw0lh6D7\"},\"2\":{\"text\":\"年度各月份佣金收入\",\"style\":23,\"merge\":[0,3],\"virtual\":\"pZTpI3BKFw0lh6D7\"},\"3\":{\"style\":24},\"4\":{\"style\":24},\"5\":{\"style\":24},\"6\":{\"text\":\" \"}},\"height\":37},\"2\":{\"cells\":{\"1\":{\"text\":\" \"},\"2\":{\"text\":\" \"},\"3\":{\"text\":\" \"},\"4\":{\"text\":\" \"},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"}}},\"4\":{\"cells\":{\"1\":{\"text\":\"查询年度:2019\"},\"4\":{\"text\":\"查询机构:总公司\"},\"6\":{\"text\":\"单位:元\"}}},\"6\":{\"cells\":{\"1\":{\"text\":\"月份\",\"style\":12},\"2\":{\"text\":\"佣金/主营业收入\",\"style\":12},\"3\":{\"text\":\"累计\",\"style\":12},\"4\":{\"text\":\"历史最低水平\",\"style\":12},\"5\":{\"text\":\"历史平均水平\",\"style\":12},\"6\":{\"text\":\"历史最高水平\",\"style\":12}}},\"7\":{\"cells\":{\"1\":{\"text\":\"#{tmp_report_data_1.monty}\",\"style\":0},\"2\":{\"text\":\"#{tmp_report_data_1.main_income}\",\"style\":0},\"3\":{\"text\":\"#{tmp_report_data_1.total}\",\"style\":18},\"4\":{\"text\":\"#{tmp_report_data_1.his_lowest}\",\"style\":0},\"5\":{\"text\":\"#{tmp_report_data_1.his_average}\",\"style\":0},\"6\":{\"text\":\"#{tmp_report_data_1.his_highest}\",\"style\":0}},\"isDrag\":true},\"9\":{\"cells\":{\"1\":{\"merge\":[1,1]}}},\"len\":99},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":794,\"heightPx\":1047},\"dicts\":[],\"freeze\":\"A1\",\"dataRectWidth\":703,\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"bold\":true}},{\"font\":{\"bold\":true}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"bold\":false}},{\"font\":{\"bold\":false}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"bold\":true},\"align\":\"center\"},{\"font\":{\"bold\":true},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"bold\":true,\"size\":15},\"align\":\"center\"},{\"font\":{\"bold\":true,\"size\":15},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"bgcolor\":\"#01b0f1\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"bgcolor\":\"#33CCCC\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"bgcolor\":\"#33CCCC\",\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"bgcolor\":\"#33CCCC\",\"align\":\"left\"},{\"font\":{\"bold\":true,\"size\":16}},{\"font\":{\"bold\":true,\"size\":24}},{\"font\":{\"bold\":true,\"size\":22}},{\"font\":{\"bold\":true,\"size\":22},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"format\":\"usd\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"format\":\"rmb\"},{\"font\":{\"bold\":true,\"name\":\"黑体\"}},{\"font\":{\"bold\":true,\"name\":\"黑体\",\"size\":22}},{\"font\":{\"bold\":true,\"name\":\"宋体\",\"size\":22}},{\"font\":{\"bold\":true,\"name\":\"楷体\",\"size\":22}},{\"font\":{\"bold\":true,\"name\":\"楷体\",\"size\":22},\"align\":\"center\"},{\"align\":\"center\"}],\"validations\":[],\"cols\":{\"0\":{\"width\":54},\"1\":{\"width\":111},\"2\":{\"width\":116},\"4\":{\"width\":122},\"len\":26},\"merges\":[\"B10:C11\",\"C2:F2\"],\"imgList\":[{\"row\":1,\"col\":1,\"width\":\"148\",\"height\":\"56\",\"src\":\"https://static.jeecg.com/designreport/images/kunlunlog_1610591367645.png\",\"layer_id\":\"pZTpI3BKFw0lh6D7\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[1,1],[1,2]]}]}', NULL, NULL, 'admin', '2021-01-19 10:45:44', 'admin', '2021-02-03 12:02:25', 1, NULL, NULL, 0, 43, NULL, NULL, NULL); +INSERT INTO `jimu_report` VALUES ('570128838205493248', '20210630161541', 'ddd', NULL, NULL, 'datainfo', '{\"loopBlockList\":[],\"area\":{\"sri\":4,\"sci\":1,\"eri\":7,\"eci\":5,\"width\":500,\"height\":230},\"excel_config_id\":\"570128838205493248\",\"printConfig\":{\"paper\":\"A4\",\"width\":210,\"height\":297,\"definition\":1,\"isBackend\":false,\"marginX\":10,\"marginY\":10,\"layout\":\"portrait\"},\"rows\":{\"4\":{\"cells\":{\"1\":{\"text\":\"111\",\"style\":0},\"2\":{\"style\":0,\"text\":\" \"},\"3\":{\"style\":0,\"text\":\" \"},\"4\":{\"style\":0,\"text\":\" \"},\"5\":{\"style\":0,\"text\":\" \"}},\"height\":70},\"5\":{\"cells\":{\"1\":{\"text\":\"22\",\"style\":0},\"2\":{\"style\":0,\"text\":\" \"},\"3\":{\"style\":0,\"text\":\" \"},\"4\":{\"style\":0,\"text\":\" \"},\"5\":{\"style\":0,\"text\":\" \"}},\"height\":41},\"6\":{\"cells\":{\"1\":{\"text\":\"33\",\"style\":0},\"2\":{\"style\":0,\"text\":\" \"},\"3\":{\"style\":0,\"text\":\" \"},\"4\":{\"style\":0,\"text\":\" \"},\"5\":{\"style\":0,\"text\":\" \"}},\"height\":51},\"7\":{\"cells\":{\"1\":{\"text\":\"44\",\"style\":0},\"2\":{\"style\":0,\"text\":\" \"},\"3\":{\"style\":0,\"text\":\" \"},\"4\":{\"style\":0,\"text\":\" \"},\"5\":{\"style\":0,\"text\":\" \"}},\"height\":68},\"len\":100},\"dbexps\":[],\"dicts\":[],\"freeze\":\"A1\",\"dataRectWidth\":600,\"displayConfig\":{},\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}}],\"validations\":[],\"cols\":{\"len\":50},\"merges\":[]}', NULL, NULL, 'admin', '2021-06-30 08:15:42', 'admin', '2021-06-30 10:15:07', 1, NULL, NULL, 0, 4, NULL, NULL, NULL); +INSERT INTO `jimu_report` VALUES ('574873661613404160', '202010101632520060', 'XXX有限公司员工登记表副本0060', NULL, NULL, 'printinfo', '{\"loopBlockList\":[],\"area\":{\"sri\":10,\"sci\":11,\"eri\":10,\"eci\":11,\"width\":85,\"height\":38},\"excel_config_id\":\"1314846205892759552\",\"printConfig\":{\"paper\":\"A4\",\"width\":210,\"height\":297,\"definition\":1,\"isBackend\":false,\"marginX\":10,\"marginY\":10},\"rows\":{\"0\":{\"cells\":{\"0\":{\"merge\":[0,8]},\"9\":{}},\"height\":22},\"1\":{\"cells\":{\"1\":{\"style\":87,\"text\":\" \"},\"2\":{\"style\":87,\"text\":\" \"},\"3\":{\"style\":87,\"text\":\" \"},\"4\":{\"style\":87,\"text\":\" \"},\"5\":{\"style\":87,\"text\":\" \"},\"6\":{\"style\":87,\"text\":\" \"},\"7\":{\"style\":87,\"text\":\" \"},\"8\":{\"style\":87,\"text\":\" \"}},\"height\":24},\"2\":{\"cells\":{\"0\":{\"text\":\"所在部门\",\"style\":93},\"1\":{\"text\":\"${yuangongjiben.department}\",\"style\":23,\"merge\":[0,2]},\"4\":{\"text\":\"职务\",\"style\":93},\"5\":{\"text\":\"${yuangongjiben.post}\",\"style\":23},\"6\":{\"text\":\"填写日期\",\"style\":93},\"7\":{\"text\":\"${yuangongjiben.data}\",\"style\":23,\"merge\":[0,1]}},\"isDrag\":true,\"height\":36},\"3\":{\"cells\":{\"0\":{\"text\":\"姓名\",\"style\":93},\"1\":{\"text\":\"${yuangongjiben.name}\",\"style\":23},\"2\":{\"text\":\"性别\",\"style\":93},\"3\":{\"text\":\"${yuangongjiben.sex}\",\"style\":23},\"4\":{\"text\":\"出生日期\",\"style\":93},\"5\":{\"text\":\"${yuangongjiben.birth}\",\"style\":23},\"6\":{\"text\":\"政治面貌\",\"style\":93},\"7\":{\"text\":\"${yuangongjiben.political}\",\"style\":130,\"merge\":[0,1]}},\"isDrag\":true,\"height\":33},\"4\":{\"cells\":{\"0\":{\"text\":\"机关\",\"style\":93},\"1\":{\"text\":\"${yuangongjiben.office}\",\"style\":23},\"2\":{\"style\":93,\"text\":\"民族\"},\"3\":{\"text\":\"${yuangongjiben.nation}\",\"style\":23},\"4\":{\"style\":93,\"text\":\"健康状况\"},\"5\":{\"text\":\"${yuangongjiben.health}\",\"style\":23},\"6\":{\"style\":93,\"text\":\"户籍类型\",\"virtual\":\"1KT8bnqRT4bi8Z7b\"},\"7\":{\"text\":\"${yuangongjiben.register}\",\"style\":26,\"virtual\":\"1KT8bnqRT4bi8Z7b\"},\"8\":{\"merge\":[3,0],\"height\":104,\"style\":35,\"text\":\" \",\"virtual\":\"cvkWDQVZhfJPgcS4\"}},\"isDrag\":true,\"height\":31},\"5\":{\"cells\":{\"0\":{\"text\":\"最高学历\",\"style\":93},\"1\":{\"text\":\"${yuangongjiben.education}\",\"style\":23},\"2\":{\"text\":\"所学专业\",\"style\":93},\"3\":{\"text\":\"${yuangongjiben.major}\",\"style\":23,\"merge\":[0,2]},\"6\":{\"text\":\"毕业时间\",\"style\":93},\"7\":{\"text\":\"${yuangongjiben.gdata}\",\"style\":23}},\"isDrag\":true,\"height\":35},\"6\":{\"cells\":{\"0\":{\"text\":\"电子邮箱\",\"style\":93},\"1\":{\"text\":\"${yuangongjiben.mailbox}\",\"style\":23},\"2\":{\"text\":\"手机号\",\"style\":93},\"3\":{\"text\":\"${yuangongjiben.telphone}\",\"style\":23,\"merge\":[0,2]},\"6\":{\"text\":\"家庭电话\",\"style\":93},\"7\":{\"text\":\"${yuangongjiben.homephone}\",\"style\":23}},\"isDrag\":true,\"height\":38},\"7\":{\"cells\":{\"0\":{\"merge\":[0,1],\"text\":\"第一次参加工作时间\",\"style\":93},\"2\":{\"text\":\"${yuangongjiben.pworktime}\",\"style\":133,\"merge\":[0,2]},\"5\":{\"style\":93,\"text\":\"入职时间\"},\"6\":{\"text\":\"${yuangongjiben.entrytime}\",\"style\":24,\"merge\":[0,1]}},\"isDrag\":true,\"height\":27},\"8\":{\"cells\":{\"0\":{\"merge\":[0,1],\"text\":\"毕业院校\",\"style\":93},\"2\":{\"text\":\"${yuangongjiben.school}\",\"style\":24,\"merge\":[0,2]},\"5\":{\"style\":93,\"text\":\"身份证号\"},\"6\":{\"text\":\"${yuangongjiben.idcard}\",\"style\":24,\"merge\":[0,2]}},\"isDrag\":true,\"height\":34},\"9\":{\"cells\":{\"0\":{\"merge\":[0,1],\"text\":\"入党(团)时间、地点\",\"style\":94},\"2\":{\"text\":\"${yuangongjiben.entrytime}\",\"style\":24,\"merge\":[0,2]},\"5\":{\"text\":\"婚姻状况\",\"style\":93},\"6\":{\"text\":\"${yuangongjiben.marital}\",\"style\":23},\"7\":{\"text\":\"有无子女\",\"style\":93},\"8\":{\"text\":\"${yuangongjiben.children}\",\"style\":23}},\"isDrag\":true,\"height\":33},\"10\":{\"cells\":{\"0\":{\"merge\":[0,1],\"text\":\"户口所在街道名称\",\"style\":93},\"2\":{\"text\":\"${yuangongjiben.hukoustreet}\",\"style\":24,\"merge\":[0,2]},\"5\":{\"merge\":[0,1],\"text\":\"户口所在地邮编\",\"style\":93},\"7\":{\"text\":\"${yuangongjiben.hukounum}\",\"style\":23,\"merge\":[0,1]}},\"isDrag\":true,\"height\":38},\"11\":{\"cells\":{\"0\":{\"text\":\"户口所在地地址\",\"style\":96,\"merge\":[2,1]},\"2\":{\"text\":\"${yuangongjiben.hukoudi}\",\"style\":26,\"merge\":[2,6]}},\"isDrag\":true},\"12\":{\"cells\":{}},\"13\":{\"cells\":{\"11\":{\"text\":\"\"}},\"isDrag\":true},\"14\":{\"cells\":{\"0\":{\"merge\":[0,1],\"text\":\"现居住地址\",\"style\":98},\"2\":{\"text\":\"${yuangongjiben.currentdi}\",\"style\":26,\"merge\":[0,2]},\"5\":{\"style\":98,\"merge\":[0,1],\"text\":\"现居住地址邮编\"},\"7\":{\"text\":\"${yuangongjiben.currentnum}\",\"style\":26,\"merge\":[0,1]}},\"isDrag\":true,\"height\":33},\"15\":{\"cells\":{\"0\":{\"merge\":[0,1],\"text\":\"是否参加社保\",\"style\":98},\"2\":{\"text\":\"${yuangongjiben.socialsecurity}\",\"style\":27,\"merge\":[0,1]},\"4\":{\"text\":\"有无公积金\",\"style\":98},\"5\":{\"text\":\"${yuangongjiben.providentfund}\",\"style\":27,\"merge\":[0,1]},\"7\":{\"text\":\"兴趣爱好\",\"style\":98},\"8\":{\"text\":\"${yuangongjiben.hobby}\",\"style\":27}},\"isDrag\":true,\"height\":34},\"16\":{\"cells\":{\"0\":{\"merge\":[0,1],\"text\":\"参加社保类型\",\"style\":98},\"2\":{\"text\":\"${yuangongjiben.sbtype}\",\"style\":116,\"merge\":[0,6]}},\"isDrag\":true,\"height\":30},\"17\":{\"cells\":{\"0\":{\"merge\":[0,1],\"text\":\"个人档案存放地\",\"style\":98},\"2\":{\"text\":\"${yuangongjiben.archivesdi}\",\"style\":116,\"merge\":[0,6]}},\"isDrag\":true,\"height\":33},\"18\":{\"cells\":{\"0\":{\"text\":\" \",\"style\":7},\"1\":{\"text\":\" \",\"style\":7},\"2\":{\"text\":\" \",\"style\":7},\"3\":{\"text\":\" \",\"style\":7},\"4\":{\"text\":\" \",\"style\":7},\"5\":{\"text\":\" \",\"style\":7},\"6\":{\"text\":\" \",\"style\":7},\"7\":{\"text\":\" \",\"style\":7},\"8\":{\"text\":\" \",\"style\":7}}},\"19\":{\"cells\":{\"0\":{\"merge\":[0,4],\"text\":\"学历、经历(从高中开始写)\",\"style\":99},\"5\":{\"style\":7,\"text\":\" \"},\"6\":{\"style\":7,\"text\":\" \"},\"7\":{\"style\":7,\"text\":\" \"},\"8\":{\"style\":7,\"text\":\" \"},\"9\":{\"style\":112,\"text\":\" \"}}},\"20\":{\"cells\":{\"0\":{\"text\":\"由_年_月\",\"merge\":[0,1],\"style\":36},\"2\":{\"merge\":[0,1],\"text\":\"至_年_月\",\"style\":38},\"4\":{\"merge\":[0,1],\"text\":\"就读学校\",\"style\":38},\"6\":{\"merge\":[0,1],\"text\":\"专业\",\"style\":38},\"8\":{\"text\":\"担任职务\",\"style\":38},\"9\":{\"style\":112,\"text\":\" \"}}},\"21\":{\"cells\":{\"0\":{\"style\":90,\"merge\":[0,1],\"text\":\"#{xueli.kdate}\"},\"2\":{\"style\":90,\"text\":\"#{xueli.jdate}\",\"merge\":[0,1]},\"4\":{\"style\":90,\"text\":\"#{xueli.jstudent}\",\"merge\":[0,1]},\"6\":{\"style\":90,\"text\":\"#{xueli.zhuanye}\",\"merge\":[0,1]},\"8\":{\"style\":90,\"text\":\"#{xueli.zhiwu}\"},\"9\":{\"style\":112,\"text\":\" \"}},\"isDrag\":true},\"22\":{\"cells\":{\"0\":{\"style\":7,\"text\":\" \"},\"1\":{\"style\":7,\"text\":\" \"},\"2\":{\"style\":7,\"text\":\" \"},\"3\":{\"style\":7,\"text\":\" \"},\"4\":{\"style\":7,\"text\":\" \"},\"5\":{\"style\":7,\"text\":\" \"},\"6\":{\"style\":7,\"text\":\" \"},\"7\":{\"style\":7,\"text\":\" \"},\"8\":{\"style\":7,\"text\":\" \"},\"9\":{\"style\":112,\"text\":\" \"}}},\"23\":{\"cells\":{\"0\":{\"merge\":[0,4],\"text\":\"工作经历\",\"style\":124},\"5\":{\"style\":7,\"text\":\" \"},\"6\":{\"style\":7,\"text\":\" \"},\"7\":{\"style\":7,\"text\":\" \"},\"8\":{\"style\":7,\"text\":\" \"},\"9\":{\"style\":112,\"text\":\" \"}},\"height\":27},\"24\":{\"cells\":{\"0\":{\"text\":\"由_年_月\",\"merge\":[0,1],\"style\":36},\"2\":{\"merge\":[0,1],\"text\":\"至_年_月\",\"style\":38},\"4\":{\"text\":\"工作单位及职称\",\"style\":38,\"merge\":[0,1]},\"6\":{\"merge\":[0,1],\"text\":\"证明人\",\"style\":38},\"8\":{\"text\":\"联系方式\",\"style\":38},\"9\":{\"style\":112,\"text\":\" \"}}},\"25\":{\"cells\":{\"0\":{\"text\":\"#{uu.kdate}\",\"style\":90,\"merge\":[0,1]},\"2\":{\"text\":\"#{uu.jdate}\",\"style\":90,\"merge\":[0,1]},\"4\":{\"text\":\"#{uu.jstudent}\",\"style\":90,\"merge\":[0,1]},\"6\":{\"text\":\"#{uu.zmname}\",\"style\":90,\"merge\":[0,1]},\"8\":{\"text\":\"#{uu.zmphone}\",\"style\":90},\"9\":{\"style\":112,\"text\":\" \"}},\"isDrag\":true},\"26\":{\"cells\":{\"0\":{\"style\":7,\"text\":\" \"},\"1\":{\"style\":7,\"text\":\" \"},\"2\":{\"style\":7,\"text\":\" \"},\"3\":{\"style\":7,\"text\":\" \"},\"4\":{\"style\":7,\"text\":\" \"},\"5\":{\"style\":7,\"text\":\" \"},\"6\":{\"style\":7,\"text\":\" \"},\"7\":{\"style\":7,\"text\":\" \"},\"8\":{\"style\":7,\"text\":\" \"},\"9\":{\"style\":112,\"text\":\" \"}}},\"27\":{\"cells\":{\"0\":{\"merge\":[0,4],\"text\":\"职称/资格、证书\",\"style\":125},\"5\":{\"style\":7,\"text\":\" \"},\"6\":{\"style\":7,\"text\":\" \"},\"7\":{\"style\":7,\"text\":\" \"},\"8\":{\"style\":7,\"text\":\" \"},\"9\":{\"style\":112,\"text\":\" \"}},\"height\":46},\"28\":{\"cells\":{\"0\":{\"text\":\"发证时间\",\"merge\":[0,1],\"style\":36},\"2\":{\"merge\":[0,1],\"text\":\"职称名称\",\"style\":38},\"4\":{\"text\":\"级别\",\"style\":38,\"merge\":[0,1]},\"6\":{\"text\":\"发证单位\",\"style\":38,\"merge\":[0,1]},\"8\":{\"text\":\"备注\",\"style\":38},\"9\":{\"style\":112,\"text\":\" \"}}},\"29\":{\"cells\":{\"0\":{\"text\":\"#{zhengshu.fdate}\",\"style\":90,\"merge\":[0,1]},\"2\":{\"text\":\"#{zhengshu.zcname}\",\"style\":90,\"merge\":[0,1]},\"4\":{\"text\":\"#{zhengshu.jibie}\",\"style\":90,\"merge\":[0,1]},\"6\":{\"text\":\"#{zhengshu.danwei}\",\"style\":90,\"merge\":[0,1]},\"8\":{\"text\":\"#{zhengshu.beizhu}\",\"style\":90},\"9\":{\"style\":112,\"text\":\" \"}},\"isDrag\":true},\"30\":{\"cells\":{\"0\":{\"style\":7,\"text\":\" \"},\"1\":{\"style\":7,\"text\":\" \"},\"2\":{\"style\":7,\"text\":\" \"},\"3\":{\"style\":7,\"text\":\" \"},\"4\":{\"style\":7,\"text\":\" \"},\"5\":{\"style\":7,\"text\":\" \"},\"6\":{\"style\":7,\"text\":\" \"},\"7\":{\"style\":7,\"text\":\" \"},\"8\":{\"style\":7,\"text\":\" \"},\"9\":{\"style\":112,\"text\":\" \"}}},\"31\":{\"cells\":{\"0\":{\"merge\":[0,1],\"text\":\"家庭成员\",\"style\":125},\"2\":{\"style\":7,\"text\":\" \"},\"3\":{\"style\":7,\"text\":\" \"},\"4\":{\"style\":7,\"text\":\" \"},\"5\":{\"style\":7,\"text\":\" \"},\"6\":{\"style\":7,\"text\":\" \"},\"7\":{\"style\":7,\"text\":\" \"},\"8\":{\"style\":7,\"text\":\" \"},\"9\":{\"style\":112,\"text\":\" \"}},\"height\":42},\"32\":{\"cells\":{\"0\":{\"merge\":[0,1],\"text\":\"姓名\",\"style\":38},\"2\":{\"merge\":[0,1],\"text\":\"关系\",\"style\":38},\"4\":{\"text\":\"年龄\",\"style\":38},\"5\":{\"text\":\"工作单位\",\"style\":38,\"merge\":[0,1]},\"7\":{\"text\":\"政治面貌\",\"style\":38},\"8\":{\"text\":\"联系方式\",\"style\":38},\"9\":{\"style\":112,\"text\":\" \"}}},\"33\":{\"cells\":{\"0\":{\"text\":\"#{jtcy.name}\",\"style\":90,\"merge\":[0,1]},\"2\":{\"text\":\"#{jtcy.guanxi}\",\"style\":90,\"merge\":[0,1]},\"4\":{\"text\":\"#{jtcy.age}\",\"style\":90},\"5\":{\"text\":\"#{jtcy.danwei}\",\"style\":90,\"merge\":[0,1]},\"7\":{\"text\":\"#{jtcy.zzmm}\",\"style\":90},\"8\":{\"text\":\"#{jtcy.phone}\",\"style\":90},\"9\":{\"style\":112,\"text\":\" \"}},\"isDrag\":true},\"34\":{\"cells\":{\"0\":{\"text\":\" \",\"style\":7},\"1\":{\"text\":\" \",\"style\":7},\"2\":{\"text\":\" \",\"style\":7},\"3\":{\"text\":\" \",\"style\":7},\"4\":{\"text\":\" \",\"style\":7},\"5\":{\"text\":\" \",\"style\":7},\"6\":{\"text\":\" \",\"style\":7},\"7\":{\"text\":\" \",\"style\":7},\"8\":{\"text\":\" \",\"style\":7},\"9\":{\"style\":112,\"text\":\" \"}}},\"35\":{\"cells\":{\"0\":{\"merge\":[0,2],\"text\":\"所获奖励\",\"style\":125},\"3\":{\"text\":\" \",\"style\":7},\"4\":{\"text\":\" \",\"style\":7},\"5\":{\"text\":\" \",\"style\":7},\"6\":{\"text\":\" \",\"style\":7},\"7\":{\"text\":\" \",\"style\":7},\"8\":{\"text\":\" \",\"style\":7},\"9\":{\"style\":112,\"text\":\" \"}},\"height\":47},\"36\":{\"cells\":{\"0\":{\"text\":\"时间\",\"style\":90,\"merge\":[0,2]},\"3\":{\"style\":90,\"text\":\"地点\",\"merge\":[0,2]},\"6\":{\"style\":90,\"text\":\"所获得的奖励名称\",\"merge\":[0,2]},\"9\":{\"style\":112,\"text\":\" \"}}},\"37\":{\"cells\":{\"0\":{\"text\":\"#{jiangli.date}\",\"style\":90,\"merge\":[0,2]},\"3\":{\"text\":\"#{jiangli.didian}\",\"style\":90,\"merge\":[0,2]},\"6\":{\"text\":\"#{jiangli.mingcheng}\",\"style\":90,\"merge\":[0,2]},\"9\":{\"style\":112,\"text\":\" \"}},\"isDrag\":true},\"len\":98},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":718,\"heightPx\":1047},\"dicts\":[],\"freeze\":\"A1\",\"dataRectWidth\":703,\"displayConfig\":{},\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"size\":16}},{\"align\":\"center\",\"font\":{\"size\":16,\"bold\":true}},{\"align\":\"center\",\"font\":{\"size\":14,\"bold\":true}},{\"align\":\"center\",\"font\":{\"name\":\"仿宋\"}},{\"font\":{\"name\":\"仿宋\"}},{\"align\":\"center\",\"font\":{\"name\":\"宋体\"}},{\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"size\":12}},{\"font\":{\"name\":\"宋体\",\"size\":12}},{\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"size\":8}},{\"font\":{\"name\":\"宋体\",\"size\":8}},{\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"size\":10}},{\"font\":{\"name\":\"宋体\",\"size\":10}},{\"align\":\"center\",\"font\":{\"name\":\"隶书\",\"size\":10}},{\"font\":{\"name\":\"隶书\",\"size\":10}},{\"align\":\"center\",\"font\":{\"name\":\"华文中宋\",\"size\":10}},{\"font\":{\"name\":\"华文中宋\",\"size\":10}},{\"align\":\"center\",\"font\":{\"name\":\"Microsoft YaHei\",\"size\":10}},{\"font\":{\"name\":\"Microsoft YaHei\",\"size\":10}},{\"textwrap\":true},{\"textwrap\":true,\"align\":\"center\"},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"size\":10},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"font\":{\"name\":\"宋体\",\"size\":10},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"宋体\"},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"font\":{\"name\":\"宋体\"},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"align\":\"center\",\"font\":{\"name\":\"宋体\"},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"font\":{\"bold\":true}},{\"font\":{\"bold\":true,\"size\":12}},{\"font\":{\"bold\":true,\"size\":10}},{\"font\":{\"bold\":true,\"size\":10},\"align\":\"center\"},{\"font\":{\"bold\":true},\"align\":\"center\"},{\"font\":{\"bold\":true,\"size\":10},\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"bold\":true},\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"bold\":true,\"size\":10,\"name\":\"宋体\"},\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"bold\":true,\"size\":10,\"name\":\"宋体\"},\"align\":\"center\"},{\"font\":{\"bold\":true,\"name\":\"宋体\"},\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"bold\":true,\"name\":\"宋体\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"font\":{\"size\":14,\"bold\":true},\"border\":{\"top\":[\"thin\",\"#000\"]}},{\"border\":{\"top\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"left\":[\"thin\",\"#000\"]}},{\"border\":{\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"top\":[\"medium\",\"#000\"],\"left\":[\"medium\",\"#000\"]}},{\"align\":\"center\",\"font\":{\"size\":14,\"bold\":true},\"border\":{\"top\":[\"medium\",\"#000\"]}},{\"border\":{\"top\":[\"medium\",\"#000\"],\"right\":[\"medium\",\"#000\"]}},{\"border\":{\"left\":[\"medium\",\"#000\"]}},{\"border\":{\"right\":[\"medium\",\"#000\"]}},{\"border\":{\"bottom\":[\"medium\",\"#000\"],\"left\":[\"medium\",\"#000\"]}},{\"border\":{\"bottom\":[\"medium\",\"#000\"]}},{\"border\":{\"bottom\":[\"medium\",\"#000\"],\"right\":[\"medium\",\"#000\"]}},{\"border\":{\"top\":[\"medium\",\"#000\"],\"left\":[\"medium\",\"#000\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"align\":\"center\",\"font\":{\"size\":14,\"bold\":true,\"name\":\"Microsoft YaHei\"},\"border\":{\"top\":[\"medium\",\"#000\"]}},{\"align\":\"center\",\"font\":{\"size\":14,\"bold\":true,\"name\":\"Microsoft YaHei\"}},{\"border\":{\"top\":[\"medium\",\"#000\"],\"right\":[\"medium\",\"#000\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"border\":{\"left\":[\"medium\",\"#000\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"align\":\"center\",\"font\":{\"name\":\"Microsoft YaHei\",\"size\":10},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"border\":{\"right\":[\"medium\",\"#000\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"font\":{\"name\":\"Microsoft YaHei\",\"size\":10},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"font\":{\"name\":\"Microsoft YaHei\"}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Microsoft YaHei\"},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Microsoft YaHei\"}},{\"font\":{\"name\":\"Microsoft YaHei\"},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Microsoft YaHei\"},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Microsoft YaHei\"}},{\"font\":{\"bold\":true,\"size\":10,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"bold\":true,\"size\":10,\"name\":\"Microsoft YaHei\"},\"align\":\"center\"},{\"font\":{\"bold\":true,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"bold\":true,\"name\":\"Microsoft YaHei\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"border\":{\"bottom\":[\"medium\",\"#000\"],\"left\":[\"medium\",\"#000\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"border\":{\"bottom\":[\"medium\",\"#000\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"border\":{\"bottom\":[\"medium\",\"#000\"],\"right\":[\"medium\",\"#000\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"align\":\"center\",\"font\":{\"name\":\"Microsoft YaHei\",\"size\":8},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"font\":{\"name\":\"Microsoft YaHei\",\"size\":8}},{\"align\":\"center\",\"font\":{\"name\":\"Microsoft YaHei\",\"size\":9},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Microsoft YaHei\",\"size\":8}},{\"border\":{\"top\":[\"medium\",\"#000\"],\"left\":[\"medium\",\"#000\"]},\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"font\":{\"size\":14,\"bold\":true,\"name\":\"宋体\"},\"border\":{\"top\":[\"medium\",\"#000\"]}},{\"align\":\"center\",\"font\":{\"size\":14,\"bold\":true,\"name\":\"宋体\"}},{\"border\":{\"left\":[\"medium\",\"#000\"]},\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"size\":8},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"medium\",\"#000\"],\"left\":[\"medium\",\"#000\"]},\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"medium\",\"#000\"]},\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"size\":10,\"bold\":true},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"font\":{\"name\":\"宋体\",\"size\":10,\"bold\":true},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"font\":{\"name\":\"宋体\",\"size\":10,\"bold\":true}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"bold\":true},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"bold\":true}},{\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"bold\":true},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"font\":{\"name\":\"宋体\",\"bold\":true}},{\"border\":{\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"font\":{\"size\":14,\"bold\":true,\"name\":\"宋体\"},\"border\":{\"top\":[\"thin\",\"#000\"]}},{\"border\":{\"top\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"border\":{\"left\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\"}},{\"border\":{\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"border\":{\"top\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"]},\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"font\":{\"size\":14,\"bold\":true,\"name\":\"宋体\"},\"border\":{\"top\":[\"thin\",\"#ffffff\"]}},{\"border\":{\"top\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"border\":{\"left\":[\"thin\",\"#ffffff\"]},\"font\":{\"name\":\"宋体\"}},{\"border\":{\"right\":[\"thin\",\"#ffffff\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"]},\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"]},\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"align\":\"left\",\"font\":{\"name\":\"宋体\"},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"align\":\"left\",\"font\":{\"name\":\"宋体\"}},{\"font\":{\"name\":\"宋体\",\"size\":10},\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"name\":\"宋体\",\"size\":10},\"border\":{\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"name\":\"宋体\",\"size\":10},\"border\":{\"bottom\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"name\":\"宋体\",\"bold\":true},\"align\":\"right\"},{\"font\":{\"name\":\"宋体\",\"bold\":true},\"align\":\"right\",\"valign\":\"bottom\"},{\"font\":{\"name\":\"宋体\",\"bold\":true},\"align\":\"left\",\"valign\":\"bottom\"},{\"font\":{\"name\":\"宋体\",\"bold\":true},\"valign\":\"bottom\"},{\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"size\":10},\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"name\":\"宋体\",\"size\":10,\"bold\":true},\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"bold\":true},\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"align\":\"left\",\"font\":{\"name\":\"宋体\"},\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"font\":{\"name\":\"宋体\",\"size\":10},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"format\":\"datetime\"},{\"font\":{\"name\":\"宋体\",\"size\":10},\"format\":\"datetime\"},{\"font\":{\"name\":\"宋体\",\"size\":10},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"format\":\"normal\"},{\"font\":{\"name\":\"宋体\",\"size\":10},\"format\":\"normal\"}],\"validations\":[],\"cols\":{\"0\":{\"width\":73},\"1\":{\"width\":71},\"2\":{\"width\":69},\"3\":{\"width\":89},\"4\":{\"width\":64},\"5\":{\"width\":47},\"6\":{\"width\":68},\"7\":{\"width\":100},\"8\":{\"width\":103},\"9\":{\"width\":19},\"10\":{\"width\":146},\"11\":{\"width\":85},\"len\":50},\"merges\":[\"H3:I3\",\"B3:D3\",\"A2:I2\",\"D6:F6\",\"D7:F7\",\"A8:B8\",\"G8:H8\",\"A9:B9\",\"A10:B10\",\"C10:E10\",\"C8:E8\",\"C9:E9\",\"A11:B11\",\"C11:E11\",\"F11:G11\",\"H11:I11\",\"C12:I14\",\"A15:B15\",\"C15:E15\",\"F15:G15\",\"H15:I15\",\"A16:B16\",\"A17:B17\",\"A18:B18\",\"C17:I17\",\"C18:I18\",\"A20:E20\",\"A21:B21\",\"C21:D21\",\"E21:F21\",\"G21:H21\",\"A22:B22\",\"A24:E24\",\"A25:B25\",\"C25:D25\",\"G25:H25\",\"A26:B26\",\"A28:E28\",\"A29:B29\",\"C29:D29\",\"A30:B30\",\"A32:B32\",\"A33:B33\",\"C33:D33\",\"A34:B34\",\"C34:D34\",\"A36:C36\",\"C16:D16\",\"F16:G16\",\"QAAAAAACI1:JAAAAAABJ38\",\"A1:I1\",\"H4:I4\",\"G9:I9\",\"G22:H22\",\"E22:F22\",\"C22:D22\",\"C26:D26\",\"G26:H26\",\"C30:D30\",\"G30:H30\",\"E30:F30\",\"D37:F37\",\"D38:F38\",\"A38:C38\",\"A37:C37\",\"G37:I37\",\"G38:I38\",\"E29:F29\",\"G29:H29\",\"E25:F25\",\"E26:F26\",\"F33:G33\",\"F34:G34\",\"A12:B14\",\"I5:I8\"],\"imgList\":[{\"row\":4,\"col\":8,\"width\":\"101\",\"height\":\"128\",\"src\":\"https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/images/QQ截图20210115102648_1610694177544_1617244906979.png\",\"layer_id\":\"cvkWDQVZhfJPgcS4\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[4,8]]}]}', NULL, 'https://static.jeecg.com/designreport/images/1122_1607312336469.png', 'admin', '2021-07-13 10:29:32', 'admin', '2021-07-13 10:29:43', 1, NULL, NULL, 0, 0, NULL, NULL, NULL); +INSERT INTO `jimu_report` VALUES ('574875722233016320', '202101081046035167', '实习证明副本5167', NULL, NULL, 'printinfo', '{\"loopBlockList\":[],\"area\":{\"sri\":16,\"sci\":5,\"eri\":16,\"eci\":5,\"width\":147,\"height\":25},\"excel_config_id\":\"1347373863746539520\",\"printConfig\":{\"paper\":\"A4\",\"width\":210,\"height\":297,\"definition\":1,\"isBackend\":false,\"marginX\":10,\"marginY\":10,\"layout\":\"portrait\"},\"rows\":{\"0\":{\"cells\":{\"0\":{\"text\":\"\"},\"1\":{\"text\":\"\"}}},\"1\":{\"cells\":{\"0\":{\"text\":\"\"}}},\"3\":{\"cells\":{\"2\":{\"text\":\"\",\"rendered\":\"\"}}},\"5\":{\"cells\":{},\"height\":29},\"6\":{\"cells\":{\"2\":{\"text\":\"\",\"style\":2}},\"height\":34},\"7\":{\"cells\":{\"2\":{\"merge\":[0,4],\"text\":\"实习证明\",\"style\":2}},\"height\":41},\"8\":{\"cells\":{\"1\":{\"text\":\"\",\"style\":3},\"2\":{\"text\":\"\"}}},\"9\":{\"cells\":{\"1\":{\"text\":\"\",\"style\":3},\"2\":{\"text\":\"\",\"style\":3},\"3\":{\"text\":\"\"}},\"isDrag\":true,\"height\":33},\"10\":{\"cells\":{\"2\":{\"text\":\"${tt.name}\",\"style\":11},\"3\":{\"text\":\"同学在我公司与 2020年4月1日 至 2020年5月1日 实习。\",\"style\":19,\"merge\":[0,3],\"height\":34}},\"height\":34},\"11\":{\"cells\":{},\"height\":28},\"12\":{\"cells\":{\"1\":{\"text\":\"\",\"style\":6},\"2\":{\"style\":13,\"text\":\"${tt.pingjia}\",\"merge\":[3,4],\"height\":129}},\"height\":36},\"13\":{\"cells\":{},\"height\":29},\"14\":{\"cells\":{},\"height\":33},\"15\":{\"cells\":{},\"height\":31},\"16\":{\"cells\":{}},\"17\":{\"cells\":{\"1\":{\"text\":\"\"},\"2\":{\"text\":\"特此证明!\",\"style\":12}}},\"20\":{\"cells\":{\"2\":{\"text\":\"\"},\"3\":{\"text\":\"\",\"style\":3},\"4\":{\"text\":\"\"}}},\"21\":{\"cells\":{\"4\":{\"text\":\"\"}}},\"22\":{\"cells\":{\"3\":{\"text\":\"\",\"style\":3},\"4\":{\"text\":\"证明人:\",\"style\":11},\"5\":{\"text\":\"${tt.lingdao}\",\"style\":12}}},\"23\":{\"cells\":{\"4\":{\"text\":\"\"},\"5\":{\"text\":\"${tt.shijian}\",\"style\":15}}},\"len\":100},\"dbexps\":[],\"dicts\":[],\"freeze\":\"A1\",\"dataRectWidth\":576,\"displayConfig\":{},\"background\":{\"path\":\"https://static.jeecg.com/designreport/images/11_1611283832037.png\",\"repeat\":\"no-repeat\",\"width\":\"\",\"height\":\"\"},\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"size\":14}},{\"align\":\"center\",\"font\":{\"size\":16}},{\"align\":\"right\"},{\"align\":\"left\"},{\"align\":\"left\",\"valign\":\"top\"},{\"align\":\"left\",\"valign\":\"top\",\"textwrap\":true},{\"font\":{\"size\":16}},{\"align\":\"left\",\"valign\":\"top\",\"textwrap\":false},{\"textwrap\":false},{\"textwrap\":true},{\"align\":\"right\",\"font\":{\"size\":12}},{\"font\":{\"size\":12}},{\"align\":\"left\",\"valign\":\"top\",\"textwrap\":true,\"font\":{\"size\":12}},{\"textwrap\":true,\"font\":{\"size\":12}},{\"align\":\"left\",\"font\":{\"size\":12}},{\"font\":{\"size\":12},\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":14}},{\"font\":{\"size\":10}},{\"textwrap\":false,\"font\":{\"size\":12}}],\"validations\":[],\"cols\":{\"0\":{\"width\":69},\"1\":{\"width\":41},\"4\":{\"width\":119},\"5\":{\"width\":147},\"6\":{\"width\":31},\"len\":50},\"merges\":[\"C8:G8\",\"D11:G11\",\"C13:G16\"]}', NULL, 'https://static.jeecg.com/designreport/images/未标题-1_1610074948259.png', 'admin', '2021-07-13 10:37:43', 'admin', '2021-07-13 10:37:54', 1, NULL, NULL, 0, 0, NULL, NULL, NULL); +INSERT INTO `jimu_report` VALUES ('574875730525155328', '202010101632526669', 'XXX有限公司员工登记表副本6669', NULL, NULL, 'printinfo', '{\"loopBlockList\":[],\"area\":{\"sri\":10,\"sci\":11,\"eri\":10,\"eci\":11,\"width\":85,\"height\":38},\"excel_config_id\":\"1314846205892759552\",\"printConfig\":{\"paper\":\"A4\",\"width\":210,\"height\":297,\"definition\":1,\"isBackend\":false,\"marginX\":10,\"marginY\":10},\"rows\":{\"0\":{\"cells\":{\"0\":{\"merge\":[0,8]},\"9\":{}},\"height\":22},\"1\":{\"cells\":{\"1\":{\"style\":87,\"text\":\" \"},\"2\":{\"style\":87,\"text\":\" \"},\"3\":{\"style\":87,\"text\":\" \"},\"4\":{\"style\":87,\"text\":\" \"},\"5\":{\"style\":87,\"text\":\" \"},\"6\":{\"style\":87,\"text\":\" \"},\"7\":{\"style\":87,\"text\":\" \"},\"8\":{\"style\":87,\"text\":\" \"}},\"height\":24},\"2\":{\"cells\":{\"0\":{\"text\":\"所在部门\",\"style\":93},\"1\":{\"text\":\"${yuangongjiben.department}\",\"style\":23,\"merge\":[0,2]},\"4\":{\"text\":\"职务\",\"style\":93},\"5\":{\"text\":\"${yuangongjiben.post}\",\"style\":23},\"6\":{\"text\":\"填写日期\",\"style\":93},\"7\":{\"text\":\"${yuangongjiben.data}\",\"style\":23,\"merge\":[0,1]}},\"isDrag\":true,\"height\":36},\"3\":{\"cells\":{\"0\":{\"text\":\"姓名\",\"style\":93},\"1\":{\"text\":\"${yuangongjiben.name}\",\"style\":23},\"2\":{\"text\":\"性别\",\"style\":93},\"3\":{\"text\":\"${yuangongjiben.sex}\",\"style\":23},\"4\":{\"text\":\"出生日期\",\"style\":93},\"5\":{\"text\":\"${yuangongjiben.birth}\",\"style\":23},\"6\":{\"text\":\"政治面貌\",\"style\":93},\"7\":{\"text\":\"${yuangongjiben.political}\",\"style\":130,\"merge\":[0,1]}},\"isDrag\":true,\"height\":33},\"4\":{\"cells\":{\"0\":{\"text\":\"机关\",\"style\":93},\"1\":{\"text\":\"${yuangongjiben.office}\",\"style\":23},\"2\":{\"style\":93,\"text\":\"民族\"},\"3\":{\"text\":\"${yuangongjiben.nation}\",\"style\":23},\"4\":{\"style\":93,\"text\":\"健康状况\"},\"5\":{\"text\":\"${yuangongjiben.health}\",\"style\":23},\"6\":{\"style\":93,\"text\":\"户籍类型\",\"virtual\":\"1KT8bnqRT4bi8Z7b\"},\"7\":{\"text\":\"${yuangongjiben.register}\",\"style\":26,\"virtual\":\"1KT8bnqRT4bi8Z7b\"},\"8\":{\"merge\":[3,0],\"height\":104,\"style\":35,\"text\":\" \",\"virtual\":\"cvkWDQVZhfJPgcS4\"}},\"isDrag\":true,\"height\":31},\"5\":{\"cells\":{\"0\":{\"text\":\"最高学历\",\"style\":93},\"1\":{\"text\":\"${yuangongjiben.education}\",\"style\":23},\"2\":{\"text\":\"所学专业\",\"style\":93},\"3\":{\"text\":\"${yuangongjiben.major}\",\"style\":23,\"merge\":[0,2]},\"6\":{\"text\":\"毕业时间\",\"style\":93},\"7\":{\"text\":\"${yuangongjiben.gdata}\",\"style\":23}},\"isDrag\":true,\"height\":35},\"6\":{\"cells\":{\"0\":{\"text\":\"电子邮箱\",\"style\":93},\"1\":{\"text\":\"${yuangongjiben.mailbox}\",\"style\":23},\"2\":{\"text\":\"手机号\",\"style\":93},\"3\":{\"text\":\"${yuangongjiben.telphone}\",\"style\":23,\"merge\":[0,2]},\"6\":{\"text\":\"家庭电话\",\"style\":93},\"7\":{\"text\":\"${yuangongjiben.homephone}\",\"style\":23}},\"isDrag\":true,\"height\":38},\"7\":{\"cells\":{\"0\":{\"merge\":[0,1],\"text\":\"第一次参加工作时间\",\"style\":93},\"2\":{\"text\":\"${yuangongjiben.pworktime}\",\"style\":133,\"merge\":[0,2]},\"5\":{\"style\":93,\"text\":\"入职时间\"},\"6\":{\"text\":\"${yuangongjiben.entrytime}\",\"style\":24,\"merge\":[0,1]}},\"isDrag\":true,\"height\":27},\"8\":{\"cells\":{\"0\":{\"merge\":[0,1],\"text\":\"毕业院校\",\"style\":93},\"2\":{\"text\":\"${yuangongjiben.school}\",\"style\":24,\"merge\":[0,2]},\"5\":{\"style\":93,\"text\":\"身份证号\"},\"6\":{\"text\":\"${yuangongjiben.idcard}\",\"style\":24,\"merge\":[0,2]}},\"isDrag\":true,\"height\":34},\"9\":{\"cells\":{\"0\":{\"merge\":[0,1],\"text\":\"入党(团)时间、地点\",\"style\":94},\"2\":{\"text\":\"${yuangongjiben.entrytime}\",\"style\":24,\"merge\":[0,2]},\"5\":{\"text\":\"婚姻状况\",\"style\":93},\"6\":{\"text\":\"${yuangongjiben.marital}\",\"style\":23},\"7\":{\"text\":\"有无子女\",\"style\":93},\"8\":{\"text\":\"${yuangongjiben.children}\",\"style\":23}},\"isDrag\":true,\"height\":33},\"10\":{\"cells\":{\"0\":{\"merge\":[0,1],\"text\":\"户口所在街道名称\",\"style\":93},\"2\":{\"text\":\"${yuangongjiben.hukoustreet}\",\"style\":24,\"merge\":[0,2]},\"5\":{\"merge\":[0,1],\"text\":\"户口所在地邮编\",\"style\":93},\"7\":{\"text\":\"${yuangongjiben.hukounum}\",\"style\":23,\"merge\":[0,1]}},\"isDrag\":true,\"height\":38},\"11\":{\"cells\":{\"0\":{\"text\":\"户口所在地地址\",\"style\":96,\"merge\":[2,1]},\"2\":{\"text\":\"${yuangongjiben.hukoudi}\",\"style\":26,\"merge\":[2,6]}},\"isDrag\":true},\"12\":{\"cells\":{}},\"13\":{\"cells\":{\"11\":{\"text\":\"\"}},\"isDrag\":true},\"14\":{\"cells\":{\"0\":{\"merge\":[0,1],\"text\":\"现居住地址\",\"style\":98},\"2\":{\"text\":\"${yuangongjiben.currentdi}\",\"style\":26,\"merge\":[0,2]},\"5\":{\"style\":98,\"merge\":[0,1],\"text\":\"现居住地址邮编\"},\"7\":{\"text\":\"${yuangongjiben.currentnum}\",\"style\":26,\"merge\":[0,1]}},\"isDrag\":true,\"height\":33},\"15\":{\"cells\":{\"0\":{\"merge\":[0,1],\"text\":\"是否参加社保\",\"style\":98},\"2\":{\"text\":\"${yuangongjiben.socialsecurity}\",\"style\":27,\"merge\":[0,1]},\"4\":{\"text\":\"有无公积金\",\"style\":98},\"5\":{\"text\":\"${yuangongjiben.providentfund}\",\"style\":27,\"merge\":[0,1]},\"7\":{\"text\":\"兴趣爱好\",\"style\":98},\"8\":{\"text\":\"${yuangongjiben.hobby}\",\"style\":27}},\"isDrag\":true,\"height\":34},\"16\":{\"cells\":{\"0\":{\"merge\":[0,1],\"text\":\"参加社保类型\",\"style\":98},\"2\":{\"text\":\"${yuangongjiben.sbtype}\",\"style\":116,\"merge\":[0,6]}},\"isDrag\":true,\"height\":30},\"17\":{\"cells\":{\"0\":{\"merge\":[0,1],\"text\":\"个人档案存放地\",\"style\":98},\"2\":{\"text\":\"${yuangongjiben.archivesdi}\",\"style\":116,\"merge\":[0,6]}},\"isDrag\":true,\"height\":33},\"18\":{\"cells\":{\"0\":{\"text\":\" \",\"style\":7},\"1\":{\"text\":\" \",\"style\":7},\"2\":{\"text\":\" \",\"style\":7},\"3\":{\"text\":\" \",\"style\":7},\"4\":{\"text\":\" \",\"style\":7},\"5\":{\"text\":\" \",\"style\":7},\"6\":{\"text\":\" \",\"style\":7},\"7\":{\"text\":\" \",\"style\":7},\"8\":{\"text\":\" \",\"style\":7}}},\"19\":{\"cells\":{\"0\":{\"merge\":[0,4],\"text\":\"学历、经历(从高中开始写)\",\"style\":99},\"5\":{\"style\":7,\"text\":\" \"},\"6\":{\"style\":7,\"text\":\" \"},\"7\":{\"style\":7,\"text\":\" \"},\"8\":{\"style\":7,\"text\":\" \"},\"9\":{\"style\":112,\"text\":\" \"}}},\"20\":{\"cells\":{\"0\":{\"text\":\"由_年_月\",\"merge\":[0,1],\"style\":36},\"2\":{\"merge\":[0,1],\"text\":\"至_年_月\",\"style\":38},\"4\":{\"merge\":[0,1],\"text\":\"就读学校\",\"style\":38},\"6\":{\"merge\":[0,1],\"text\":\"专业\",\"style\":38},\"8\":{\"text\":\"担任职务\",\"style\":38},\"9\":{\"style\":112,\"text\":\" \"}}},\"21\":{\"cells\":{\"0\":{\"style\":90,\"merge\":[0,1],\"text\":\"#{xueli.kdate}\"},\"2\":{\"style\":90,\"text\":\"#{xueli.jdate}\",\"merge\":[0,1]},\"4\":{\"style\":90,\"text\":\"#{xueli.jstudent}\",\"merge\":[0,1]},\"6\":{\"style\":90,\"text\":\"#{xueli.zhuanye}\",\"merge\":[0,1]},\"8\":{\"style\":90,\"text\":\"#{xueli.zhiwu}\"},\"9\":{\"style\":112,\"text\":\" \"}},\"isDrag\":true},\"22\":{\"cells\":{\"0\":{\"style\":7,\"text\":\" \"},\"1\":{\"style\":7,\"text\":\" \"},\"2\":{\"style\":7,\"text\":\" \"},\"3\":{\"style\":7,\"text\":\" \"},\"4\":{\"style\":7,\"text\":\" \"},\"5\":{\"style\":7,\"text\":\" \"},\"6\":{\"style\":7,\"text\":\" \"},\"7\":{\"style\":7,\"text\":\" \"},\"8\":{\"style\":7,\"text\":\" \"},\"9\":{\"style\":112,\"text\":\" \"}}},\"23\":{\"cells\":{\"0\":{\"merge\":[0,4],\"text\":\"工作经历\",\"style\":124},\"5\":{\"style\":7,\"text\":\" \"},\"6\":{\"style\":7,\"text\":\" \"},\"7\":{\"style\":7,\"text\":\" \"},\"8\":{\"style\":7,\"text\":\" \"},\"9\":{\"style\":112,\"text\":\" \"}},\"height\":27},\"24\":{\"cells\":{\"0\":{\"text\":\"由_年_月\",\"merge\":[0,1],\"style\":36},\"2\":{\"merge\":[0,1],\"text\":\"至_年_月\",\"style\":38},\"4\":{\"text\":\"工作单位及职称\",\"style\":38,\"merge\":[0,1]},\"6\":{\"merge\":[0,1],\"text\":\"证明人\",\"style\":38},\"8\":{\"text\":\"联系方式\",\"style\":38},\"9\":{\"style\":112,\"text\":\" \"}}},\"25\":{\"cells\":{\"0\":{\"text\":\"#{uu.kdate}\",\"style\":90,\"merge\":[0,1]},\"2\":{\"text\":\"#{uu.jdate}\",\"style\":90,\"merge\":[0,1]},\"4\":{\"text\":\"#{uu.jstudent}\",\"style\":90,\"merge\":[0,1]},\"6\":{\"text\":\"#{uu.zmname}\",\"style\":90,\"merge\":[0,1]},\"8\":{\"text\":\"#{uu.zmphone}\",\"style\":90},\"9\":{\"style\":112,\"text\":\" \"}},\"isDrag\":true},\"26\":{\"cells\":{\"0\":{\"style\":7,\"text\":\" \"},\"1\":{\"style\":7,\"text\":\" \"},\"2\":{\"style\":7,\"text\":\" \"},\"3\":{\"style\":7,\"text\":\" \"},\"4\":{\"style\":7,\"text\":\" \"},\"5\":{\"style\":7,\"text\":\" \"},\"6\":{\"style\":7,\"text\":\" \"},\"7\":{\"style\":7,\"text\":\" \"},\"8\":{\"style\":7,\"text\":\" \"},\"9\":{\"style\":112,\"text\":\" \"}}},\"27\":{\"cells\":{\"0\":{\"merge\":[0,4],\"text\":\"职称/资格、证书\",\"style\":125},\"5\":{\"style\":7,\"text\":\" \"},\"6\":{\"style\":7,\"text\":\" \"},\"7\":{\"style\":7,\"text\":\" \"},\"8\":{\"style\":7,\"text\":\" \"},\"9\":{\"style\":112,\"text\":\" \"}},\"height\":46},\"28\":{\"cells\":{\"0\":{\"text\":\"发证时间\",\"merge\":[0,1],\"style\":36},\"2\":{\"merge\":[0,1],\"text\":\"职称名称\",\"style\":38},\"4\":{\"text\":\"级别\",\"style\":38,\"merge\":[0,1]},\"6\":{\"text\":\"发证单位\",\"style\":38,\"merge\":[0,1]},\"8\":{\"text\":\"备注\",\"style\":38},\"9\":{\"style\":112,\"text\":\" \"}}},\"29\":{\"cells\":{\"0\":{\"text\":\"#{zhengshu.fdate}\",\"style\":90,\"merge\":[0,1]},\"2\":{\"text\":\"#{zhengshu.zcname}\",\"style\":90,\"merge\":[0,1]},\"4\":{\"text\":\"#{zhengshu.jibie}\",\"style\":90,\"merge\":[0,1]},\"6\":{\"text\":\"#{zhengshu.danwei}\",\"style\":90,\"merge\":[0,1]},\"8\":{\"text\":\"#{zhengshu.beizhu}\",\"style\":90},\"9\":{\"style\":112,\"text\":\" \"}},\"isDrag\":true},\"30\":{\"cells\":{\"0\":{\"style\":7,\"text\":\" \"},\"1\":{\"style\":7,\"text\":\" \"},\"2\":{\"style\":7,\"text\":\" \"},\"3\":{\"style\":7,\"text\":\" \"},\"4\":{\"style\":7,\"text\":\" \"},\"5\":{\"style\":7,\"text\":\" \"},\"6\":{\"style\":7,\"text\":\" \"},\"7\":{\"style\":7,\"text\":\" \"},\"8\":{\"style\":7,\"text\":\" \"},\"9\":{\"style\":112,\"text\":\" \"}}},\"31\":{\"cells\":{\"0\":{\"merge\":[0,1],\"text\":\"家庭成员\",\"style\":125},\"2\":{\"style\":7,\"text\":\" \"},\"3\":{\"style\":7,\"text\":\" \"},\"4\":{\"style\":7,\"text\":\" \"},\"5\":{\"style\":7,\"text\":\" \"},\"6\":{\"style\":7,\"text\":\" \"},\"7\":{\"style\":7,\"text\":\" \"},\"8\":{\"style\":7,\"text\":\" \"},\"9\":{\"style\":112,\"text\":\" \"}},\"height\":42},\"32\":{\"cells\":{\"0\":{\"merge\":[0,1],\"text\":\"姓名\",\"style\":38},\"2\":{\"merge\":[0,1],\"text\":\"关系\",\"style\":38},\"4\":{\"text\":\"年龄\",\"style\":38},\"5\":{\"text\":\"工作单位\",\"style\":38,\"merge\":[0,1]},\"7\":{\"text\":\"政治面貌\",\"style\":38},\"8\":{\"text\":\"联系方式\",\"style\":38},\"9\":{\"style\":112,\"text\":\" \"}}},\"33\":{\"cells\":{\"0\":{\"text\":\"#{jtcy.name}\",\"style\":90,\"merge\":[0,1]},\"2\":{\"text\":\"#{jtcy.guanxi}\",\"style\":90,\"merge\":[0,1]},\"4\":{\"text\":\"#{jtcy.age}\",\"style\":90},\"5\":{\"text\":\"#{jtcy.danwei}\",\"style\":90,\"merge\":[0,1]},\"7\":{\"text\":\"#{jtcy.zzmm}\",\"style\":90},\"8\":{\"text\":\"#{jtcy.phone}\",\"style\":90},\"9\":{\"style\":112,\"text\":\" \"}},\"isDrag\":true},\"34\":{\"cells\":{\"0\":{\"text\":\" \",\"style\":7},\"1\":{\"text\":\" \",\"style\":7},\"2\":{\"text\":\" \",\"style\":7},\"3\":{\"text\":\" \",\"style\":7},\"4\":{\"text\":\" \",\"style\":7},\"5\":{\"text\":\" \",\"style\":7},\"6\":{\"text\":\" \",\"style\":7},\"7\":{\"text\":\" \",\"style\":7},\"8\":{\"text\":\" \",\"style\":7},\"9\":{\"style\":112,\"text\":\" \"}}},\"35\":{\"cells\":{\"0\":{\"merge\":[0,2],\"text\":\"所获奖励\",\"style\":125},\"3\":{\"text\":\" \",\"style\":7},\"4\":{\"text\":\" \",\"style\":7},\"5\":{\"text\":\" \",\"style\":7},\"6\":{\"text\":\" \",\"style\":7},\"7\":{\"text\":\" \",\"style\":7},\"8\":{\"text\":\" \",\"style\":7},\"9\":{\"style\":112,\"text\":\" \"}},\"height\":47},\"36\":{\"cells\":{\"0\":{\"text\":\"时间\",\"style\":90,\"merge\":[0,2]},\"3\":{\"style\":90,\"text\":\"地点\",\"merge\":[0,2]},\"6\":{\"style\":90,\"text\":\"所获得的奖励名称\",\"merge\":[0,2]},\"9\":{\"style\":112,\"text\":\" \"}}},\"37\":{\"cells\":{\"0\":{\"text\":\"#{jiangli.date}\",\"style\":90,\"merge\":[0,2]},\"3\":{\"text\":\"#{jiangli.didian}\",\"style\":90,\"merge\":[0,2]},\"6\":{\"text\":\"#{jiangli.mingcheng}\",\"style\":90,\"merge\":[0,2]},\"9\":{\"style\":112,\"text\":\" \"}},\"isDrag\":true},\"len\":98},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":718,\"heightPx\":1047},\"dicts\":[],\"freeze\":\"A1\",\"dataRectWidth\":703,\"displayConfig\":{},\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"size\":16}},{\"align\":\"center\",\"font\":{\"size\":16,\"bold\":true}},{\"align\":\"center\",\"font\":{\"size\":14,\"bold\":true}},{\"align\":\"center\",\"font\":{\"name\":\"仿宋\"}},{\"font\":{\"name\":\"仿宋\"}},{\"align\":\"center\",\"font\":{\"name\":\"宋体\"}},{\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"size\":12}},{\"font\":{\"name\":\"宋体\",\"size\":12}},{\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"size\":8}},{\"font\":{\"name\":\"宋体\",\"size\":8}},{\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"size\":10}},{\"font\":{\"name\":\"宋体\",\"size\":10}},{\"align\":\"center\",\"font\":{\"name\":\"隶书\",\"size\":10}},{\"font\":{\"name\":\"隶书\",\"size\":10}},{\"align\":\"center\",\"font\":{\"name\":\"华文中宋\",\"size\":10}},{\"font\":{\"name\":\"华文中宋\",\"size\":10}},{\"align\":\"center\",\"font\":{\"name\":\"Microsoft YaHei\",\"size\":10}},{\"font\":{\"name\":\"Microsoft YaHei\",\"size\":10}},{\"textwrap\":true},{\"textwrap\":true,\"align\":\"center\"},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"size\":10},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"font\":{\"name\":\"宋体\",\"size\":10},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"宋体\"},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"font\":{\"name\":\"宋体\"},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"align\":\"center\",\"font\":{\"name\":\"宋体\"},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"font\":{\"bold\":true}},{\"font\":{\"bold\":true,\"size\":12}},{\"font\":{\"bold\":true,\"size\":10}},{\"font\":{\"bold\":true,\"size\":10},\"align\":\"center\"},{\"font\":{\"bold\":true},\"align\":\"center\"},{\"font\":{\"bold\":true,\"size\":10},\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"bold\":true},\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"bold\":true,\"size\":10,\"name\":\"宋体\"},\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"bold\":true,\"size\":10,\"name\":\"宋体\"},\"align\":\"center\"},{\"font\":{\"bold\":true,\"name\":\"宋体\"},\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"bold\":true,\"name\":\"宋体\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"font\":{\"size\":14,\"bold\":true},\"border\":{\"top\":[\"thin\",\"#000\"]}},{\"border\":{\"top\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"left\":[\"thin\",\"#000\"]}},{\"border\":{\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"top\":[\"medium\",\"#000\"],\"left\":[\"medium\",\"#000\"]}},{\"align\":\"center\",\"font\":{\"size\":14,\"bold\":true},\"border\":{\"top\":[\"medium\",\"#000\"]}},{\"border\":{\"top\":[\"medium\",\"#000\"],\"right\":[\"medium\",\"#000\"]}},{\"border\":{\"left\":[\"medium\",\"#000\"]}},{\"border\":{\"right\":[\"medium\",\"#000\"]}},{\"border\":{\"bottom\":[\"medium\",\"#000\"],\"left\":[\"medium\",\"#000\"]}},{\"border\":{\"bottom\":[\"medium\",\"#000\"]}},{\"border\":{\"bottom\":[\"medium\",\"#000\"],\"right\":[\"medium\",\"#000\"]}},{\"border\":{\"top\":[\"medium\",\"#000\"],\"left\":[\"medium\",\"#000\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"align\":\"center\",\"font\":{\"size\":14,\"bold\":true,\"name\":\"Microsoft YaHei\"},\"border\":{\"top\":[\"medium\",\"#000\"]}},{\"align\":\"center\",\"font\":{\"size\":14,\"bold\":true,\"name\":\"Microsoft YaHei\"}},{\"border\":{\"top\":[\"medium\",\"#000\"],\"right\":[\"medium\",\"#000\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"border\":{\"left\":[\"medium\",\"#000\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"align\":\"center\",\"font\":{\"name\":\"Microsoft YaHei\",\"size\":10},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"border\":{\"right\":[\"medium\",\"#000\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"font\":{\"name\":\"Microsoft YaHei\",\"size\":10},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"font\":{\"name\":\"Microsoft YaHei\"}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Microsoft YaHei\"},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Microsoft YaHei\"}},{\"font\":{\"name\":\"Microsoft YaHei\"},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Microsoft YaHei\"},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Microsoft YaHei\"}},{\"font\":{\"bold\":true,\"size\":10,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"bold\":true,\"size\":10,\"name\":\"Microsoft YaHei\"},\"align\":\"center\"},{\"font\":{\"bold\":true,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"bold\":true,\"name\":\"Microsoft YaHei\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"border\":{\"bottom\":[\"medium\",\"#000\"],\"left\":[\"medium\",\"#000\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"border\":{\"bottom\":[\"medium\",\"#000\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"border\":{\"bottom\":[\"medium\",\"#000\"],\"right\":[\"medium\",\"#000\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"align\":\"center\",\"font\":{\"name\":\"Microsoft YaHei\",\"size\":8},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"font\":{\"name\":\"Microsoft YaHei\",\"size\":8}},{\"align\":\"center\",\"font\":{\"name\":\"Microsoft YaHei\",\"size\":9},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Microsoft YaHei\",\"size\":8}},{\"border\":{\"top\":[\"medium\",\"#000\"],\"left\":[\"medium\",\"#000\"]},\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"font\":{\"size\":14,\"bold\":true,\"name\":\"宋体\"},\"border\":{\"top\":[\"medium\",\"#000\"]}},{\"align\":\"center\",\"font\":{\"size\":14,\"bold\":true,\"name\":\"宋体\"}},{\"border\":{\"left\":[\"medium\",\"#000\"]},\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"size\":8},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"medium\",\"#000\"],\"left\":[\"medium\",\"#000\"]},\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"medium\",\"#000\"]},\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"size\":10,\"bold\":true},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"font\":{\"name\":\"宋体\",\"size\":10,\"bold\":true},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"font\":{\"name\":\"宋体\",\"size\":10,\"bold\":true}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"bold\":true},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"bold\":true}},{\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"bold\":true},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"font\":{\"name\":\"宋体\",\"bold\":true}},{\"border\":{\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"font\":{\"size\":14,\"bold\":true,\"name\":\"宋体\"},\"border\":{\"top\":[\"thin\",\"#000\"]}},{\"border\":{\"top\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"border\":{\"left\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\"}},{\"border\":{\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"border\":{\"top\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"]},\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"font\":{\"size\":14,\"bold\":true,\"name\":\"宋体\"},\"border\":{\"top\":[\"thin\",\"#ffffff\"]}},{\"border\":{\"top\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"border\":{\"left\":[\"thin\",\"#ffffff\"]},\"font\":{\"name\":\"宋体\"}},{\"border\":{\"right\":[\"thin\",\"#ffffff\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"]},\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"]},\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"align\":\"left\",\"font\":{\"name\":\"宋体\"},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"align\":\"left\",\"font\":{\"name\":\"宋体\"}},{\"font\":{\"name\":\"宋体\",\"size\":10},\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"name\":\"宋体\",\"size\":10},\"border\":{\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"name\":\"宋体\",\"size\":10},\"border\":{\"bottom\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"name\":\"宋体\",\"bold\":true},\"align\":\"right\"},{\"font\":{\"name\":\"宋体\",\"bold\":true},\"align\":\"right\",\"valign\":\"bottom\"},{\"font\":{\"name\":\"宋体\",\"bold\":true},\"align\":\"left\",\"valign\":\"bottom\"},{\"font\":{\"name\":\"宋体\",\"bold\":true},\"valign\":\"bottom\"},{\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"size\":10},\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"name\":\"宋体\",\"size\":10,\"bold\":true},\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"bold\":true},\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"align\":\"left\",\"font\":{\"name\":\"宋体\"},\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"font\":{\"name\":\"宋体\",\"size\":10},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"format\":\"datetime\"},{\"font\":{\"name\":\"宋体\",\"size\":10},\"format\":\"datetime\"},{\"font\":{\"name\":\"宋体\",\"size\":10},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"format\":\"normal\"},{\"font\":{\"name\":\"宋体\",\"size\":10},\"format\":\"normal\"}],\"validations\":[],\"cols\":{\"0\":{\"width\":73},\"1\":{\"width\":71},\"2\":{\"width\":69},\"3\":{\"width\":89},\"4\":{\"width\":64},\"5\":{\"width\":47},\"6\":{\"width\":68},\"7\":{\"width\":100},\"8\":{\"width\":103},\"9\":{\"width\":19},\"10\":{\"width\":146},\"11\":{\"width\":85},\"len\":50},\"merges\":[\"H3:I3\",\"B3:D3\",\"A2:I2\",\"D6:F6\",\"D7:F7\",\"A8:B8\",\"G8:H8\",\"A9:B9\",\"A10:B10\",\"C10:E10\",\"C8:E8\",\"C9:E9\",\"A11:B11\",\"C11:E11\",\"F11:G11\",\"H11:I11\",\"C12:I14\",\"A15:B15\",\"C15:E15\",\"F15:G15\",\"H15:I15\",\"A16:B16\",\"A17:B17\",\"A18:B18\",\"C17:I17\",\"C18:I18\",\"A20:E20\",\"A21:B21\",\"C21:D21\",\"E21:F21\",\"G21:H21\",\"A22:B22\",\"A24:E24\",\"A25:B25\",\"C25:D25\",\"G25:H25\",\"A26:B26\",\"A28:E28\",\"A29:B29\",\"C29:D29\",\"A30:B30\",\"A32:B32\",\"A33:B33\",\"C33:D33\",\"A34:B34\",\"C34:D34\",\"A36:C36\",\"C16:D16\",\"F16:G16\",\"QAAAAAACI1:JAAAAAABJ38\",\"A1:I1\",\"H4:I4\",\"G9:I9\",\"G22:H22\",\"E22:F22\",\"C22:D22\",\"C26:D26\",\"G26:H26\",\"C30:D30\",\"G30:H30\",\"E30:F30\",\"D37:F37\",\"D38:F38\",\"A38:C38\",\"A37:C37\",\"G37:I37\",\"G38:I38\",\"E29:F29\",\"G29:H29\",\"E25:F25\",\"E26:F26\",\"F33:G33\",\"F34:G34\",\"A12:B14\",\"I5:I8\"],\"imgList\":[{\"row\":4,\"col\":8,\"width\":\"101\",\"height\":\"128\",\"src\":\"https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/images/QQ截图20210115102648_1610694177544_1617244906979.png\",\"layer_id\":\"cvkWDQVZhfJPgcS4\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[4,8]]}]}', NULL, 'https://static.jeecg.com/designreport/images/1122_1607312336469.png', 'admin', '2021-07-13 10:37:45', 'admin', '2021-07-13 10:37:49', 1, NULL, NULL, 0, 0, NULL, NULL, NULL); +INSERT INTO `jimu_report` VALUES ('575163965000249344', '20210714134509', 'ddd', NULL, NULL, 'chartinfo', '{\"loopBlockList\":[],\"chartList\":[{\"row\":-1,\"col\":6,\"colspan\":7,\"rowspan\":14,\"width\":\"650\",\"height\":\"350\",\"config\":\"{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#333\\\",\\\"fontSize\\\":12}},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#333\\\"}},\\\"show\\\":true,\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false},\\\"type \\\":\\\"value\\\"},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"rotate\\\":0,\\\"interval\\\":\\\"auto\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#333\\\",\\\"fontSize\\\":12}},\\\"data\\\":[\\\"周一\\\",\\\"周二\\\",\\\"周三\\\",\\\"周四\\\",\\\"周五\\\",\\\"周六\\\",\\\"周日\\\"],\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#333\\\"}},\\\"show\\\":true,\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false},\\\"type\\\":\\\"category\\\"},\\\"legend\\\":{\\\"padding\\\":[25,20,25,10],\\\"data\\\":[\\\"直接访问\\\",\\\"邮件营销\\\",\\\"联盟广告\\\"],\\\"top\\\":\\\"top\\\",\\\"orient\\\":\\\"horizontal\\\",\\\"left\\\":\\\"center\\\",\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#333\\\",\\\"fontSize\\\":12}},\\\"grid\\\":{\\\"top\\\":60,\\\"left\\\":60,\\\"bottom\\\":60,\\\"right\\\":60},\\\"series\\\":[{\\\"barWidth\\\":0,\\\"data\\\":[320,332,301,334,390,330,320],\\\"name\\\":\\\"直接访问\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"\\\",\\\"barBorderRadius\\\":0},\\\"label\\\":{\\\"show\\\":true,\\\"position\\\":\\\"top\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"black\\\",\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"bolder\\\"}},\\\"type\\\":\\\"bar\\\",\\\"barMinHeight\\\":2},{\\\"barWidth\\\":0,\\\"data\\\":[120,132,101,134,90,230,210],\\\"name\\\":\\\"邮件营销\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"\\\",\\\"barBorderRadius\\\":0},\\\"label\\\":{\\\"show\\\":true,\\\"position\\\":\\\"top\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"black\\\",\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"bolder\\\"}},\\\"type\\\":\\\"bar\\\",\\\"barMinHeight\\\":2},{\\\"barWidth\\\":0,\\\"data\\\":[220,182,191,234,290,330,310],\\\"name\\\":\\\"联盟广告\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"\\\",\\\"barBorderRadius\\\":0},\\\"label\\\":{\\\"show\\\":true,\\\"position\\\":\\\"top\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"black\\\",\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"bolder\\\"}},\\\"type\\\":\\\"bar\\\",\\\"barMinHeight\\\":2}],\\\"tooltip\\\":{\\\"show\\\":true,\\\"axisPointer\\\":{\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":18}},\\\"title\\\":{\\\"padding\\\":[5,20,5,20],\\\"left\\\":\\\"left\\\",\\\"show\\\":true,\\\"text\\\":\\\"某站点用户访问来源\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#c23531\\\",\\\"fontSize\\\":18,\\\"fontWeight\\\":\\\"bolder\\\"}}}\",\"url\":\"\",\"extData\":{\"chartId\":\"bar.multi\",\"chartType\":\"bar.multi\"},\"layer_id\":\"x5jNAjrL8TFhuTEo\",\"offsetX\":0,\"offsetY\":0,\"backgroud\":{\"enabled\":false,\"color\":\"#fff\",\"image\":\"\"},\"virtualCellRange\":[[-1,6],[-1,7],[-1,8],[-1,9],[-1,10],[-1,11],[-1,12]]},{\"row\":0,\"col\":0,\"colspan\":6,\"rowspan\":14,\"width\":\"570\",\"height\":\"340\",\"config\":\"{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#EFEDED\\\",\\\"fontSize\\\":12}},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#FBF4F4\\\"}},\\\"show\\\":true,\\\"name\\\":\\\"销量\\\",\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false}},\\\"xAxis\\\":{\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false},\\\"axisLabel\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFAFA\\\",\\\"fontSize\\\":12},\\\"rotate\\\":0,\\\"interval\\\":\\\"auto\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#FCFCFC\\\"}},\\\"data\\\":[\\\"衬衫\\\",\\\"羊毛衫\\\",\\\"雪纺衫\\\",\\\"裤子\\\",\\\"高跟鞋\\\",\\\"袜子\\\"],\\\"show\\\":true,\\\"name\\\":\\\"服饰\\\"},\\\"grid\\\":{\\\"top\\\":60,\\\"left\\\":60,\\\"bottom\\\":60,\\\"right\\\":60},\\\"series\\\":[{\\\"barWidth\\\":50,\\\"data\\\":[5,20,36,10,10,20],\\\"name\\\":\\\"销量\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"#c43632\\\",\\\"barBorderRadius\\\":0},\\\"label\\\":{\\\"show\\\":true,\\\"position\\\":\\\"top\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"black\\\",\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"bolder\\\"}},\\\"type\\\":\\\"bar\\\",\\\"barMinHeight\\\":2}],\\\"tooltip\\\":{\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":18}},\\\"title\\\":{\\\"show\\\":true,\\\"top\\\":\\\"5\\\",\\\"text\\\":\\\"某站点用户访问来源\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#FCF6F6\\\",\\\"fontWeight\\\":\\\"bolder\\\",\\\"fontSize\\\":18},\\\"left\\\":\\\"left\\\",\\\"padding\\\":[5,20,5,20]}}\",\"url\":\"\",\"extData\":{\"chartId\":\"bar.simple\",\"chartType\":\"bar.simple\"},\"layer_id\":\"WPLlLTIi2vHV8ikB\",\"offsetX\":0,\"offsetY\":0,\"backgroud\":{\"enabled\":false,\"color\":\"#fff\",\"image\":\"\"},\"virtualCellRange\":[[0,0],[0,1],[0,2],[0,3],[0,4],[0,5]]},{\"row\":14,\"col\":-1,\"colspan\":7,\"rowspan\":14,\"width\":\"647\",\"height\":\"349\",\"config\":\"{\\\"radar\\\":[{\\\"indicator\\\":[{\\\"max\\\":6500,\\\"name\\\":\\\"指标一\\\"},{\\\"max\\\":6500,\\\"name\\\":\\\"指标二\\\"},{\\\"max\\\":6500,\\\"name\\\":\\\"指标三\\\"},{\\\"max\\\":6500,\\\"name\\\":\\\"指标四\\\"},{\\\"max\\\":6500,\\\"name\\\":\\\"指标五\\\"}],\\\"startAngle\\\":90,\\\"shape\\\":\\\"circle\\\",\\\"splitArea\\\":{\\\"areaStyle\\\":{\\\"color\\\":[\\\"rgba(114, 172, 209, 0.2)\\\",\\\"rgba(114, 172, 209, 0.4)\\\",\\\"rgba(114, 172, 209, 0.6)\\\",\\\"rgba(114, 172, 209, 0.8)\\\",\\\"rgba(114, 172, 209, 1)\\\"],\\\"shadowBlur\\\":10,\\\"shadowColor\\\":\\\"rgba(0, 0, 0, 0.3)\\\"}},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"gray\\\",\\\"opacity\\\":0.5}},\\\"center\\\":[320,200],\\\"name\\\":{\\\"formatter\\\":\\\"【{value}】\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#72ACD1\\\"}},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"gray\\\",\\\"opacity\\\":0.5}},\\\"splitNumber\\\":4,\\\"radius\\\":90}],\\\"legend\\\":{\\\"padding\\\":[25,20,25,10],\\\"data\\\":[\\\"图一\\\",\\\"图二\\\"],\\\"top\\\":\\\"top\\\",\\\"orient\\\":\\\"horizontal\\\",\\\"left\\\":\\\"center\\\",\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#333\\\",\\\"fontSize\\\":12}},\\\"series\\\":[{\\\"data\\\":[{\\\"lineStyle\\\":{},\\\"name\\\":\\\"图一\\\",\\\"value\\\":[1000,2000,3000,4000,2000]},{\\\"lineStyle\\\":{},\\\"name\\\":\\\"图二\\\",\\\"value\\\":[5000,4000,3000,100,1500]}],\\\"name\\\":\\\"雷达图\\\",\\\"type\\\":\\\"radar\\\"}],\\\"tooltip\\\":{\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":18}},\\\"title\\\":{\\\"padding\\\":[8,20,5,20],\\\"left\\\":\\\"left\\\",\\\"show\\\":true,\\\"text\\\":\\\"圆形雷达图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#c23531\\\",\\\"fontSize\\\":18,\\\"fontWeight\\\":\\\"bolder\\\"}}}\",\"url\":\"\",\"extData\":{\"chartId\":\"radar.custom\",\"chartType\":\"radar.basic\"},\"layer_id\":\"1goCA1os5O64qksC\",\"offsetX\":0,\"offsetY\":0,\"backgroud\":{\"enabled\":false,\"color\":\"#fff\",\"image\":\"\"},\"virtualCellRange\":[[14,-1],[14,0],[14,1],[14,2],[14,3],[14,4],[14,5]]},{\"row\":14,\"col\":6,\"colspan\":7,\"rowspan\":14,\"width\":\"650\",\"height\":\"350\",\"config\":\"{\\\"geo\\\":{\\\"regions\\\":[],\\\"layoutSize\\\":600,\\\"emphasis\\\":{\\\"itemStyle\\\":{\\\"areaColor\\\":\\\"red\\\"},\\\"label\\\":{\\\"color\\\":\\\"#fff\\\"}},\\\"itemStyle\\\":{\\\"borderColor\\\":\\\"#000\\\",\\\"areaColor\\\":\\\"#fff\\\",\\\"borderWidth\\\":0.5},\\\"zoom\\\":0.5,\\\"label\\\":{\\\"color\\\":\\\"#000\\\",\\\"show\\\":true,\\\"fontSize\\\":12},\\\"roam\\\":true,\\\"map\\\":\\\"china\\\",\\\"layoutCenter\\\":[\\\"50%\\\",\\\"50%\\\"]},\\\"series\\\":[{\\\"name\\\":\\\"地图\\\",\\\"coordinateSystem\\\":\\\"geo\\\",\\\"type\\\":\\\"map\\\"}],\\\"chartType\\\":\\\"map\\\",\\\"title\\\":{\\\"padding\\\":[5,20,5,10],\\\"left\\\":\\\"left\\\",\\\"show\\\":true,\\\"text\\\":\\\"中国地图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#c23531\\\",\\\"fontSize\\\":18,\\\"fontWeight\\\":\\\"bolder\\\"}}}\",\"url\":\"\",\"extData\":{\"chartId\":\"map.simple\",\"chartType\":\"map.simple\"},\"layer_id\":\"yOwMM2eUbvZ7INPJ\",\"offsetX\":0,\"offsetY\":0,\"backgroud\":{\"enabled\":false,\"color\":\"#fff\",\"image\":\"\"},\"virtualCellRange\":[[14,6],[14,7],[14,8],[14,9],[14,10],[14,11],[14,12]]}],\"area\":{\"sri\":9,\"sci\":3,\"eri\":9,\"eci\":3,\"width\":100,\"height\":25},\"excel_config_id\":\"575163965000249344\",\"printConfig\":{\"paper\":\"A3\",\"width\":297,\"height\":420,\"definition\":1,\"isBackend\":false,\"marginX\":10,\"marginY\":10,\"layout\":\"landscape\"},\"rows\":{\"0\":{\"cells\":{\"0\":{\"text\":\" \",\"virtual\":\"WPLlLTIi2vHV8ikB\"},\"1\":{\"text\":\" \",\"virtual\":\"WPLlLTIi2vHV8ikB\"},\"2\":{\"text\":\" \",\"virtual\":\"WPLlLTIi2vHV8ikB\"},\"3\":{\"text\":\" \",\"virtual\":\"WPLlLTIi2vHV8ikB\"},\"4\":{\"text\":\" \",\"virtual\":\"WPLlLTIi2vHV8ikB\"},\"5\":{\"text\":\" \",\"virtual\":\"WPLlLTIi2vHV8ikB\"}}},\"14\":{\"cells\":{\"0\":{\"text\":\" \",\"virtual\":\"1goCA1os5O64qksC\"},\"1\":{\"text\":\" \",\"virtual\":\"1goCA1os5O64qksC\"},\"2\":{\"text\":\" \",\"virtual\":\"1goCA1os5O64qksC\"},\"3\":{\"text\":\" \",\"virtual\":\"1goCA1os5O64qksC\"},\"4\":{\"text\":\" \",\"virtual\":\"1goCA1os5O64qksC\"},\"5\":{\"text\":\" \",\"virtual\":\"1goCA1os5O64qksC\"},\"6\":{\"text\":\" \",\"virtual\":\"yOwMM2eUbvZ7INPJ\"},\"7\":{\"text\":\" \",\"virtual\":\"yOwMM2eUbvZ7INPJ\"},\"8\":{\"text\":\" \",\"virtual\":\"yOwMM2eUbvZ7INPJ\"},\"9\":{\"text\":\" \",\"virtual\":\"yOwMM2eUbvZ7INPJ\"},\"10\":{\"text\":\" \",\"virtual\":\"yOwMM2eUbvZ7INPJ\"},\"11\":{\"text\":\" \",\"virtual\":\"yOwMM2eUbvZ7INPJ\"},\"12\":{\"text\":\" \",\"virtual\":\"yOwMM2eUbvZ7INPJ\"},\"-1\":{\"text\":\" \",\"virtual\":\"1goCA1os5O64qksC\"}}},\"len\":100,\"-1\":{\"cells\":{\"6\":{\"text\":\" \",\"virtual\":\"x5jNAjrL8TFhuTEo\"},\"7\":{\"text\":\" \",\"virtual\":\"x5jNAjrL8TFhuTEo\"},\"8\":{\"text\":\" \",\"virtual\":\"x5jNAjrL8TFhuTEo\"},\"9\":{\"text\":\" \",\"virtual\":\"x5jNAjrL8TFhuTEo\"},\"10\":{\"text\":\" \",\"virtual\":\"x5jNAjrL8TFhuTEo\"},\"11\":{\"text\":\" \",\"virtual\":\"x5jNAjrL8TFhuTEo\"},\"12\":{\"text\":\" \",\"virtual\":\"x5jNAjrL8TFhuTEo\"}}}},\"dbexps\":[],\"dicts\":[],\"freeze\":\"A1\",\"dataRectWidth\":1300,\"displayConfig\":{},\"background\":{\"path\":\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/designreport/images/QQ图片20210714134925_1626241778771.png\",\"repeat\":\"no-repeat\",\"width\":\"\",\"height\":\"\"},\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[],\"validations\":[],\"cols\":{\"len\":50},\"merges\":[]}', NULL, NULL, 'admin', '2021-07-14 05:45:09', 'admin', '2021-07-14 05:59:44', 0, NULL, NULL, 0, 5, NULL, NULL, NULL); +INSERT INTO `jimu_report` VALUES ('6059e405dd9c66a6d38e00841d2e40cc', '566777', '处方笺', '', NULL, 'printinfo', '{\"loopBlockList\":[],\"area\":{\"sri\":9,\"sci\":3,\"eri\":9,\"eci\":11,\"width\":593,\"height\":25},\"printElWidth\":718,\"excel_config_id\":\"6059e405dd9c66a6d38e00841d2e40cc\",\"printElHeight\":1047,\"rows\":{\"0\":{\"cells\":{\"3\":{\"style\":80,\"text\":\" \"}},\"height\":96},\"1\":{\"cells\":{\"1\":{\"style\":24,\"text\":\" \"},\"2\":{\"style\":25,\"text\":\" \"},\"3\":{\"style\":25,\"text\":\" \"},\"4\":{\"style\":25,\"text\":\" \"},\"5\":{\"style\":25,\"text\":\" \"},\"6\":{\"style\":25,\"text\":\" \"},\"7\":{\"style\":25,\"text\":\" \"},\"8\":{\"style\":25,\"text\":\" \"},\"9\":{\"style\":25,\"text\":\" \"},\"10\":{\"style\":25,\"text\":\" \"},\"11\":{\"style\":25,\"text\":\" \"},\"12\":{\"style\":26,\"text\":\" \"}},\"height\":18},\"2\":{\"cells\":{\"1\":{\"text\":\" \",\"style\":27},\"2\":{\"merge\":[0,9],\"text\":\"智能医学院处方笺\",\"style\":38},\"3\":{\"style\":12,\"text\":\" \"},\"4\":{\"style\":12,\"text\":\" \"},\"5\":{\"style\":12,\"text\":\" \"},\"6\":{\"style\":12,\"text\":\" \"},\"7\":{\"style\":12,\"text\":\" \"},\"8\":{\"style\":12,\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"style\":12,\"text\":\" \"},\"11\":{\"style\":12,\"text\":\" \"},\"12\":{\"style\":28,\"text\":\" \"},\"13\":{\"style\":80,\"text\":\" \"}},\"height\":124},\"3\":{\"cells\":{\"1\":{\"text\":\" \",\"style\":46},\"2\":{\"merge\":[0,1],\"text\":\"姓名:\",\"style\":4},\"3\":{\"style\":4,\"text\":\" \"},\"4\":{\"text\":\"${yonghu.yphone}\"},\"5\":{\"text\":\"性别:\",\"style\":42},\"6\":{\"text\":\"${yonghu.ysex}\",\"style\":42},\"7\":{\"text\":\"年龄:\",\"style\":47},\"8\":{\"text\":\"${yonghu.yage}\"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \",\"style\":42},\"11\":{\"style\":69,\"text\":\" \",\"merge\":[0,1]},\"12\":{\"style\":43,\"text\":\" \"},\"13\":{\"style\":80,\"text\":\" \"}},\"isDrag\":true},\"4\":{\"cells\":{\"1\":{\"text\":\" \",\"style\":74},\"2\":{\"style\":4,\"merge\":[0,1],\"text\":\"单位:\"},\"3\":{\"style\":4,\"text\":\" \"},\"4\":{\"text\":\"${yonghu.danwei}\"},\"5\":{\"text\":\"电话:\"},\"6\":{\"text\":\"${yonghu.yphone}\",\"merge\":[0,5]},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"style\":28,\"text\":\" \"},\"15\":{\"text\":\"\"}},\"isDrag\":true,\"height\":29},\"5\":{\"cells\":{\"1\":{\"style\":31,\"text\":\" \"},\"2\":{\"merge\":[0,1],\"text\":\"初步诊断:\",\"style\":4},\"3\":{\"text\":\" \",\"style\":4},\"4\":{\"text\":\"${yonghu.yjieguo}\",\"merge\":[0,7]},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"style\":28,\"text\":\" \"}},\"isDrag\":true,\"height\":34},\"6\":{\"cells\":{\"1\":{\"text\":\" RP:\",\"merge\":[0,2],\"style\":79},\"2\":{\"style\":11,\"text\":\" \"},\"3\":{\"style\":11,\"text\":\" \"},\"4\":{\"style\":39,\"text\":\" \"},\"5\":{\"style\":0,\"text\":\" \"},\"6\":{\"style\":0,\"text\":\" \"},\"7\":{\"style\":0,\"text\":\" \"},\"8\":{\"style\":0,\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"style\":0,\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"style\":28,\"text\":\" \"},\"14\":{},\"16\":{}},\"height\":79},\"7\":{\"cells\":{\"1\":{\"text\":\".\",\"style\":48},\"2\":{\"text\":\"\",\"style\":1},\"3\":{\"text\":\"#{yaopin.name}\",\"merge\":[0,1]},\"5\":{},\"6\":{},\"7\":{\"text\":\"#{yaopin.percent}\",\"merge\":[0,1]},\"9\":{},\"10\":{},\"11\":{\"text\":\"\"},\"12\":{\"style\":28,\"text\":\" \"},\"14\":{}},\"isDrag\":true,\"height\":37},\"8\":{\"cells\":{\"1\":{\"style\":31,\"text\":\" \"},\"2\":{\"text\":\" \"},\"3\":{\"text\":\" \"},\"4\":{\"text\":\" \"},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"style\":28,\"text\":\" \"}},\"height\":27},\"9\":{\"cells\":{\"1\":{\"style\":31,\"text\":\" \"},\"2\":{\"text\":\"医嘱:\",\"style\":76},\"3\":{\"text\":\"${yonghu.yizhu}\",\"style\":6,\"merge\":[0,8]},\"12\":{\"style\":28,\"text\":\" \"}},\"isDrag\":true},\"10\":{\"cells\":{\"1\":{\"style\":31,\"text\":\" \"},\"2\":{\"text\":\"药品费\",\"style\":6,\"merge\":[0,1]},\"3\":{\"text\":\" \"},\"4\":{\"text\":\"${yonghu.yprice}\",\"style\":6},\"5\":{\"text\":\"中成药费\",\"style\":6,\"rendered\":\"\",\"merge\":[0,1]},\"7\":{\"style\":6,\"text\":\" \"},\"8\":{\"text\":\"治疗费\",\"merge\":[0,2],\"style\":6},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"style\":6,\"text\":\" \"},\"12\":{\"style\":28,\"text\":\" \"}},\"isDrag\":true},\"11\":{\"cells\":{\"1\":{\"style\":31,\"text\":\" \"},\"2\":{\"text\":\"检查费\",\"style\":6,\"merge\":[0,1]},\"3\":{\"text\":\" \"},\"4\":{\"style\":6,\"text\":\" \"},\"5\":{\"text\":\"换药费\",\"style\":6,\"merge\":[0,1]},\"7\":{\"style\":6,\"text\":\" \"},\"8\":{\"merge\":[0,2],\"text\":\"诊疗费\",\"style\":6},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\"${yonghu.yzhenliao}\",\"style\":6},\"12\":{\"style\":28,\"text\":\" \"}},\"isDrag\":true},\"12\":{\"cells\":{\"1\":{\"style\":31,\"text\":\" \"},\"2\":{\"text\":\"注射费\",\"style\":6,\"merge\":[0,1]},\"3\":{\"text\":\" \"},\"4\":{\"style\":6,\"merge\":[0,3],\"text\":\" \"},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"merge\":[0,2],\"text\":\"其他\",\"style\":6},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"style\":6,\"text\":\" \"},\"12\":{\"style\":28,\"text\":\" \"}}},\"13\":{\"cells\":{\"1\":{\"style\":31,\"text\":\" \"},\"2\":{\"text\":\"合计\",\"style\":6,\"merge\":[0,1]},\"3\":{\"text\":\" \"},\"4\":{\"text\":\"${yonghu.ytotal}\",\"style\":6,\"merge\":[0,7]},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"style\":28,\"text\":\" \"}},\"isDrag\":true},\"14\":{\"cells\":{\"1\":{\"style\":31,\"text\":\" \"},\"2\":{\"text\":\" \"},\"3\":{\"text\":\" \"},\"4\":{\"text\":\" \"},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"style\":28,\"text\":\" \"},\"13\":{\"style\":80,\"text\":\" \"}},\"height\":9},\"15\":{\"cells\":{\"1\":{\"style\":31,\"text\":\" \"},\"2\":{\"text\":\"医师:\",\"style\":4,\"rendered\":\"\",\"merge\":[0,1]},\"4\":{\"text\":\"${yonghu.yishe}\",\"style\":80},\"5\":{\"style\":80,\"text\":\" \"},\"6\":{\"style\":80,\"text\":\" \"},\"7\":{\"style\":80,\"text\":\" \"},\"8\":{\"text\":\"日期:\",\"style\":4},\"9\":{\"text\":\"${yonghu.kdata}\",\"style\":80,\"merge\":[0,2]},\"12\":{\"style\":71,\"text\":\" \"},\"13\":{\"style\":80,\"text\":\" \"}},\"isDrag\":true,\"height\":43},\"16\":{\"cells\":{\"1\":{\"style\":31,\"text\":\" \"},\"2\":{\"style\":80,\"text\":\" \"},\"3\":{\"style\":80,\"text\":\" \"},\"4\":{\"style\":80,\"text\":\" \"},\"5\":{\"style\":80,\"text\":\" \"},\"6\":{\"style\":80,\"text\":\" \"},\"7\":{\"style\":80,\"text\":\" \"},\"8\":{\"style\":80,\"text\":\" \"},\"9\":{\"style\":80,\"text\":\" \"},\"10\":{\"style\":80,\"text\":\" \"},\"11\":{\"style\":80,\"text\":\" \"},\"12\":{\"style\":28,\"text\":\" \"}},\"height\":17},\"17\":{\"cells\":{\"1\":{\"text\":\" \",\"style\":32},\"2\":{\"text\":\" \",\"style\":33},\"3\":{\"style\":33,\"text\":\" \"},\"4\":{\"text\":\" \",\"style\":33},\"5\":{\"text\":\" \",\"style\":33},\"6\":{\"text\":\" \",\"style\":33},\"7\":{\"text\":\" \",\"style\":33},\"8\":{\"text\":\" \",\"style\":33},\"9\":{\"text\":\" \",\"style\":33},\"10\":{\"text\":\" \",\"style\":33},\"11\":{\"text\":\" \",\"style\":33},\"12\":{\"text\":\" \",\"style\":34}}},\"18\":{\"cells\":{\"11\":{\"text\":\"\"}},\"isDrag\":true},\"len\":94,\"-1\":{\"cells\":{\"-1\":{\"text\":\"#{yaopin.key1}\"}},\"isDrag\":true},\"\":{\"cells\":{\"NaN\":{\"text\":\"\",\"rendered\":\"\"}}}},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":718,\"heightPx\":1047},\"dicts\":[],\"freeze\":\"A1\",\"dataRectWidth\":709,\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"font\":{\"size\":12}},{\"font\":{\"size\":10}},{\"font\":{\"size\":12},\"align\":\"right\"},{\"font\":{\"size\":14}},{\"align\":\"right\"},{\"font\":{\"size\":10},\"align\":\"right\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"center\"},{\"align\":\"center\"},{\"font\":{\"size\":12},\"align\":\"center\"},{\"font\":{\"size\":12,\"bold\":true},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"bold\":true}},{\"font\":{\"size\":14,\"bold\":true},\"align\":\"center\"},{\"border\":{\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"]}},{\"border\":{\"top\":[\"thin\",\"#000\"]}},{\"border\":{\"top\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":14,\"bold\":true},\"align\":\"center\",\"border\":{\"left\":[\"thin\",\"#000\"]}},{\"border\":{\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":12},\"border\":{\"left\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":10},\"border\":{\"left\":[\"thin\",\"#000\"]}},{\"border\":{\"left\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"top\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]}},{\"border\":{\"top\":[\"thick\",\"#000\"]}},{\"border\":{\"top\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":14,\"bold\":true},\"align\":\"center\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12},\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":10},\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]}},{\"border\":{\"bottom\":[\"thick\",\"#000\"]}},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":15},\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":15}},{\"align\":\"left\"},{\"font\":{\"size\":14,\"bold\":true},\"align\":\"center\",\"border\":{\"bottom\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"bold\":true}},{\"font\":{\"size\":12,\"bold\":true},\"align\":\"center\",\"border\":{\"bottom\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":10},\"border\":{\"left\":[\"thick\",\"#000\"]},\"valign\":\"bottom\"},{\"font\":{\"size\":10},\"valign\":\"bottom\"},{\"valign\":\"bottom\"},{\"align\":\"right\",\"border\":{\"top\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"border\":{\"top\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":10},\"border\":{\"left\":[\"thick\",\"#000\"]},\"valign\":\"bottom\",\"align\":\"right\"},{\"font\":{\"size\":10},\"valign\":\"bottom\",\"align\":\"right\"},{\"font\":{\"size\":10},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"right\"},{\"font\":{\"size\":10},\"border\":{\"left\":[\"thick\",\"#000\"]},\"textwrap\":true},{\"font\":{\"size\":10},\"textwrap\":true},{\"font\":{\"size\":10},\"border\":{\"left\":[\"thick\",\"#000\"]},\"textwrap\":false},{\"font\":{\"size\":10},\"textwrap\":false},{\"font\":{\"size\":10},\"border\":{\"left\":[\"thick\",\"#000\"]},\"textwrap\":false,\"align\":\"right\"},{\"font\":{\"size\":10},\"textwrap\":false,\"align\":\"right\"},{\"font\":{\"size\":10},\"border\":{\"left\":[\"thick\",\"#000\"]},\"textwrap\":false,\"align\":\"left\"},{\"font\":{\"size\":10},\"textwrap\":false,\"align\":\"left\"},{\"font\":{\"size\":10},\"border\":{\"left\":[\"thick\",\"#000\"]},\"textwrap\":false,\"align\":\"center\"},{\"font\":{\"size\":10},\"textwrap\":false,\"align\":\"center\"},{\"font\":{\"size\":15},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"right\"},{\"font\":{\"size\":15},\"align\":\"right\"},{\"font\":{\"size\":15},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\"},{\"font\":{\"size\":10},\"border\":{\"left\":[\"thin\",\"#000\"]},\"valign\":\"bottom\",\"align\":\"right\"},{\"font\":{\"size\":10},\"valign\":\"bottom\",\"border\":{\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":10},\"border\":{\"left\":[\"thin\",\"#000\"]},\"align\":\"right\"},{\"font\":{\"size\":10},\"border\":{\"left\":[\"thin\",\"#000\"]},\"textwrap\":false,\"align\":\"left\"},{\"font\":{\"size\":10},\"border\":{\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":15},\"border\":{\"left\":[\"thin\",\"#000\"]},\"align\":\"center\"},{\"align\":\"left\",\"border\":{\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":10},\"valign\":\"bottom\",\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":10},\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":10},\"align\":\"left\"},{\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\"},{\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"right\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"top\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"right\"},{\"font\":{\"size\":10},\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":10},\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":15,\"bold\":true},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\"},{},{\"font\":{\"size\":15,\"bold\":true},\"align\":\"center\"},{\"align\":\"right\",\"border\":{\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":14,\"bold\":true},\"align\":\"center\",\"border\":{\"bottom\":[\"thick\",\"#000\"],\"top\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}}],\"validations\":[],\"cols\":{\"0\":{\"width\":23},\"1\":{\"width\":14},\"2\":{\"width\":56},\"3\":{\"width\":40},\"4\":{\"width\":156},\"5\":{\"width\":41},\"6\":{\"width\":18},\"7\":{\"width\":92},\"8\":{\"width\":58},\"9\":{\"width\":20},\"10\":{\"width\":20},\"11\":{\"width\":148},\"12\":{\"width\":12},\"13\":{\"width\":11},\"len\":50},\"merges\":[\"C3:E3\",\"C7:E7\",\"H3:I3\",\"H7:I7\",\"C7:E7\",\"H7:I7\",\"I11:K11\",\"I12:K12\",\"I13:K13\",\"E13:H13\",\"C11:D11\",\"C12:D12\",\"C13:D13\",\"C14:D14\",\"L4:M4\",\"C3:L3\",\"B7:D7\",\"C4:D4\",\"C5:D5\",\"E14:L14\",\"G5:L5\",\"C6:D6\",\"E6:L6\",\"D8:E8\",\"H8:I8\",\"C16:D16\",\"J16:L16\",\"F11:G11\",\"F12:G12\",\"D10:L10\"]}', '', 'https://static.jeecg.com/designreport/images/处方_1607071731580.png', 'jeecg', '2020-07-10 17:12:16', 'admin', '2021-07-12 12:25:06', 0, NULL, NULL, 1, 849, NULL, NULL, NULL); +INSERT INTO `jimu_report` VALUES ('6d6bdcb5e820c301ea32789e3ae43c44', '1223', '供电公司抢修单', '', NULL, 'printinfo', '{\"loopBlockList\":[],\"area\":{\"sri\":14,\"sci\":8,\"eri\":14,\"eci\":8,\"width\":100,\"height\":67},\"printElWidth\":718,\"excel_config_id\":\"6d6bdcb5e820c301ea32789e3ae43c44\",\"printElHeight\":1047,\"rows\":{\"0\":{\"cells\":{},\"height\":11},\"1\":{\"cells\":{\"1\":{\"text\":\"供电公司抢修竣工单\",\"merge\":[0,5],\"style\":39},\"2\":{\"style\":39},\"3\":{\"style\":39},\"4\":{\"style\":39},\"5\":{\"style\":39},\"6\":{\"style\":39}},\"height\":56},\"2\":{\"cells\":{\"1\":{\"text\":\"填报单位:\",\"style\":26},\"2\":{\"text\":\"#{qiangxiu.danwei}\",\"style\":27},\"3\":{\"style\":27},\"4\":{\"text\":\"\",\"style\":27},\"5\":{\"text\":\"填报日期:\",\"style\":26},\"6\":{\"text\":\"#{qiangxiu.time}\",\"style\":27}}},\"3\":{\"cells\":{\"1\":{\"text\":\"填报名称:\",\"style\":26},\"2\":{\"text\":\"#{qiangxiu.ktime}\",\"style\":27},\"3\":{\"style\":27},\"4\":{\"style\":27},\"5\":{\"text\":\"项目编号:\",\"style\":26},\"6\":{\"text\":\"#{qiangxiu.wtime}\",\"style\":27}}},\"4\":{\"cells\":{\"1\":{\"style\":28},\"2\":{\"style\":28},\"3\":{\"style\":28},\"4\":{\"style\":28},\"5\":{\"style\":28},\"6\":{\"style\":28}},\"height\":10},\"5\":{\"cells\":{\"1\":{\"text\":\"项目批准核算\",\"style\":29},\"2\":{\"text\":\"#{qiangxiu.yusuan}\",\"style\":30,\"merge\":[0,4]}},\"height\":89},\"6\":{\"cells\":{\"1\":{\"text\":\"开工日期\",\"style\":32},\"2\":{\"style\":33,\"text\":\"#{qiangxiu.ktime}\",\"merge\":[0,1]},\"3\":{\"style\":28},\"4\":{\"style\":34,\"text\":\"完工日期\"},\"5\":{\"style\":33,\"merge\":[0,1],\"text\":\"#{qiangxiu.wtime}\"},\"6\":{\"style\":28}},\"height\":31},\"7\":{\"cells\":{\"1\":{\"text\":\"完工主要内容\",\"style\":32},\"2\":{\"style\":33,\"text\":\"#{qiangxiu.neirong}\",\"merge\":[0,4]}},\"height\":71},\"8\":{\"cells\":{\"1\":{\"text\":\"形成能力\",\"style\":32},\"2\":{\"style\":33,\"merge\":[0,4],\"text\":\"#{qiangxiu.nengli}\"},\"3\":{\"style\":28},\"4\":{\"style\":28},\"5\":{\"style\":28},\"6\":{\"style\":28}},\"height\":49},\"9\":{\"cells\":{\"1\":{\"text\":\"目标效益验收意见\",\"style\":32},\"2\":{\"style\":35,\"text\":\"#{qiangxiu.yijian}\",\"rendered\":\"\",\"merge\":[0,4]}},\"height\":100},\"10\":{\"cells\":{\"1\":{\"style\":37,\"text\":\" \",\"merge\":[0,3]},\"2\":{\"style\":28},\"3\":{\"style\":28},\"4\":{\"style\":28},\"5\":{\"style\":37,\"text\":\"#{qiangxiu.time1}\",\"merge\":[0,1]},\"6\":{\"style\":28}}},\"11\":{\"cells\":{\"1\":{\"text\":\"实施质量验收评价\",\"style\":32},\"2\":{\"style\":35,\"text\":\"#{qiangxiu.pingjia}\",\"merge\":[0,4]}},\"height\":99},\"12\":{\"cells\":{\"1\":{\"style\":33,\"merge\":[0,3]},\"2\":{\"style\":28},\"3\":{\"style\":28},\"4\":{\"style\":28},\"5\":{\"style\":33,\"merge\":[0,1],\"text\":\"#{qiangxiu.time1}\"},\"6\":{\"style\":28}}},\"13\":{\"cells\":{\"1\":{\"text\":\"验收总结\",\"style\":32},\"2\":{\"style\":35,\"text\":\"#{qiangxiu.zongjie}\",\"merge\":[0,4],\"rendered\":\"\"}},\"height\":80},\"14\":{\"cells\":{\"1\":{\"text\":\"责任单位意见\",\"style\":32},\"2\":{\"style\":33,\"merge\":[0,4],\"text\":\"#{qiangxiu.zongjie}\"}},\"height\":67},\"15\":{\"cells\":{\"1\":{\"text\":\"责任单位审核人\",\"style\":32},\"2\":{\"style\":33,\"merge\":[0,1],\"text\":\"#{qiangxiu.dshenhe}\"},\"3\":{\"style\":28},\"4\":{\"style\":34,\"text\":\"日期\"},\"5\":{\"style\":33,\"text\":\"#{qiangxiu.time3}\",\"merge\":[0,1]},\"6\":{\"style\":28}},\"height\":42},\"16\":{\"cells\":{\"1\":{\"text\":\"生技部审批意见\",\"style\":32},\"2\":{\"style\":33,\"text\":\"#{qiangxiu.dshenhe}\",\"merge\":[0,4]}},\"height\":107},\"17\":{\"cells\":{\"1\":{\"text\":\"生技部主任\",\"style\":32},\"2\":{\"style\":33,\"merge\":[0,1],\"text\":\"#{qiangxiu.zhuren}\"},\"3\":{\"style\":28},\"4\":{\"style\":34,\"text\":\"日期\"},\"5\":{\"style\":33,\"text\":\"#{qiangxiu.time4}\",\"merge\":[0,1]},\"6\":{\"style\":28}},\"height\":41},\"18\":{\"cells\":{\"1\":{\"style\":28},\"2\":{\"style\":28},\"3\":{\"style\":28},\"4\":{\"style\":28},\"5\":{\"style\":28},\"6\":{\"style\":28}}},\"len\":100},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":718,\"heightPx\":1047},\"dicts\":[],\"freeze\":\"A1\",\"dataRectWidth\":699,\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"bgcolor\":\"#9cc2e6\"},{\"bgcolor\":\"#9cc2e6\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"bgcolor\":\"#ffffff\"},{\"bgcolor\":\"#ffffff\"},{\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"size\":14}},{\"align\":\"center\",\"font\":{\"size\":14,\"bold\":true}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"right\"},{\"align\":\"right\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"left\"},{\"align\":\"left\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true},{\"textwrap\":true},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":false},{\"textwrap\":false},{\"align\":\"center\",\"font\":{\"size\":18,\"bold\":true}},{\"align\":\"center\",\"font\":{\"size\":16,\"bold\":true}},{\"align\":\"right\",\"color\":\"#7f7f7f\"},{\"color\":\"#7f7f7f\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"bgcolor\":\"#ffffff\",\"font\":{\"bold\":true}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"bold\":true}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"bgcolor\":\"#ffffff\",\"font\":{\"bold\":false}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"bold\":false}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"right\",\"font\":{\"bold\":true}},{\"align\":\"center\",\"font\":{\"size\":16,\"bold\":true,\"name\":\"宋体\"}},{\"align\":\"right\",\"color\":\"#7f7f7f\",\"font\":{\"name\":\"宋体\"}},{\"color\":\"#7f7f7f\",\"font\":{\"name\":\"宋体\"}},{\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"bgcolor\":\"#ffffff\",\"font\":{\"bold\":true,\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"bgcolor\":\"#ffffff\",\"font\":{\"name\":\"宋体\"}},{\"bgcolor\":\"#ffffff\",\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"bold\":true,\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"right\",\"font\":{\"bold\":true,\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"font\":{\"name\":\"宋体\"}},{\"textwrap\":true,\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"left\",\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"font\":{\"size\":16,\"bold\":false,\"name\":\"宋体\"}},{\"align\":\"center\",\"font\":{\"size\":18,\"bold\":true,\"name\":\"宋体\"}}],\"validations\":[],\"cols\":{\"0\":{\"width\":23},\"1\":{\"width\":117},\"3\":{\"width\":108},\"4\":{\"width\":127},\"5\":{\"width\":76},\"6\":{\"width\":148},\"7\":{\"width\":13},\"len\":50},\"merges\":[\"C7:D7\",\"F7:G7\",\"B2:G2\",\"C9:G9\",\"B11:E11\",\"F11:G11\",\"B13:E13\",\"F13:G13\",\"C16:D16\",\"C18:D18\",\"F16:G16\",\"F18:G18\",\"C10:G10\",\"C8:G8\",\"C6:G6\",\"C12:G12\",\"C14:G14\",\"C15:G15\",\"C17:G17\"]}', '', 'https://static.jeecg.com/designreport/images/222_1607311944321.png', 'jeecg', '2020-07-20 19:37:54', 'admin', '2021-07-12 12:25:19', 0, NULL, NULL, 1, 178, NULL, NULL, NULL); +INSERT INTO `jimu_report` VALUES ('6df599d933df24de007764d0e98eb105', '5667774539', '处方笺副本4539', '', NULL, 'printinfo', '{\"loopBlockList\":[],\"area\":false,\"printElWidth\":718,\"excel_config_id\":\"6df599d933df24de007764d0e98eb105\",\"printElHeight\":1047,\"rows\":{\"0\":{\"cells\":{\"3\":{\"style\":80,\"text\":\" \"}},\"height\":96},\"1\":{\"cells\":{\"1\":{\"style\":24,\"text\":\" \"},\"2\":{\"style\":25,\"text\":\" \"},\"3\":{\"style\":25,\"text\":\" \"},\"4\":{\"style\":25,\"text\":\" \"},\"5\":{\"style\":25,\"text\":\" \"},\"6\":{\"style\":25,\"text\":\" \"},\"7\":{\"style\":25,\"text\":\" \"},\"8\":{\"style\":25,\"text\":\" \"},\"9\":{\"style\":25,\"text\":\" \"},\"10\":{\"style\":25,\"text\":\" \"},\"11\":{\"style\":25,\"text\":\" \"},\"12\":{\"style\":26,\"text\":\" \"}},\"height\":18},\"2\":{\"cells\":{\"1\":{\"text\":\" \",\"style\":27},\"2\":{\"merge\":[0,9],\"text\":\"智能医学院处方笺\",\"style\":38},\"3\":{\"style\":12,\"text\":\" \"},\"4\":{\"style\":12,\"text\":\" \"},\"5\":{\"style\":12,\"text\":\" \"},\"6\":{\"style\":12,\"text\":\" \"},\"7\":{\"style\":12,\"text\":\" \"},\"8\":{\"style\":12,\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"style\":12,\"text\":\" \"},\"11\":{\"style\":12,\"text\":\" \"},\"12\":{\"style\":28,\"text\":\" \"},\"13\":{\"style\":80,\"text\":\" \"}},\"height\":124},\"3\":{\"cells\":{\"1\":{\"text\":\" \",\"style\":46},\"2\":{\"merge\":[0,1],\"text\":\"姓名:\",\"style\":4},\"3\":{\"style\":4,\"text\":\" \"},\"4\":{\"text\":\"${yonghu.yphone}\"},\"5\":{\"text\":\"性别:\",\"style\":42},\"6\":{\"text\":\"${yonghu.ysex}\",\"style\":42},\"7\":{\"text\":\"年龄:\",\"style\":47},\"8\":{\"text\":\"${yonghu.yage}\"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \",\"style\":42},\"11\":{\"style\":69,\"text\":\" \",\"merge\":[0,1]},\"12\":{\"style\":43,\"text\":\" \"},\"13\":{\"style\":80,\"text\":\" \"}},\"isDrag\":true},\"4\":{\"cells\":{\"1\":{\"text\":\" \",\"style\":74},\"2\":{\"style\":4,\"merge\":[0,1],\"text\":\"单位:\"},\"3\":{\"style\":4,\"text\":\" \"},\"4\":{\"text\":\"${yonghu.danwei}\"},\"5\":{\"text\":\"电话:\"},\"6\":{\"text\":\"${yonghu.yphone}\",\"merge\":[0,5]},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"style\":28,\"text\":\" \"},\"15\":{\"text\":\"\"}},\"isDrag\":true,\"height\":29},\"5\":{\"cells\":{\"1\":{\"style\":31,\"text\":\" \"},\"2\":{\"merge\":[0,1],\"text\":\"初步诊断:\",\"style\":4},\"3\":{\"text\":\" \",\"style\":4},\"4\":{\"text\":\"${yonghu.yjieguo}\",\"merge\":[0,7]},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"style\":28,\"text\":\" \"}},\"isDrag\":true,\"height\":34},\"6\":{\"cells\":{\"1\":{\"text\":\" RP:\",\"merge\":[0,2],\"style\":79},\"2\":{\"style\":11,\"text\":\" \"},\"3\":{\"style\":11,\"text\":\" \"},\"4\":{\"style\":39,\"text\":\" \"},\"5\":{\"style\":0,\"text\":\" \"},\"6\":{\"style\":0,\"text\":\" \"},\"7\":{\"style\":0,\"text\":\" \"},\"8\":{\"style\":0,\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"style\":0,\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"style\":28,\"text\":\" \"},\"14\":{},\"16\":{}},\"height\":79},\"7\":{\"cells\":{\"1\":{\"text\":\".\",\"style\":48},\"2\":{\"text\":\"\",\"style\":1},\"3\":{\"text\":\"#{yaopin.name}\",\"merge\":[0,1]},\"5\":{},\"6\":{},\"7\":{\"text\":\"#{yaopin.percent}\",\"merge\":[0,1]},\"9\":{},\"10\":{},\"11\":{\"text\":\"\"},\"12\":{\"style\":28,\"text\":\" \"},\"14\":{}},\"isDrag\":true,\"height\":37},\"8\":{\"cells\":{\"1\":{\"style\":31,\"text\":\" \"},\"2\":{\"text\":\" \"},\"3\":{\"text\":\" \"},\"4\":{\"text\":\" \"},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"style\":28,\"text\":\" \"}},\"height\":27},\"9\":{\"cells\":{\"1\":{\"style\":31,\"text\":\" \"},\"2\":{\"text\":\"医嘱:\",\"style\":76},\"3\":{\"text\":\"${yonghu.yizhu}\",\"style\":6,\"merge\":[0,8]},\"4\":{\"text\":\" \"},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"style\":28,\"text\":\" \"}},\"isDrag\":true},\"10\":{\"cells\":{\"1\":{\"style\":31,\"text\":\" \"},\"2\":{\"text\":\"药品费\",\"style\":6,\"merge\":[0,1]},\"3\":{\"text\":\" \"},\"4\":{\"text\":\"${yonghu.yprice}\",\"style\":6},\"5\":{\"merge\":[0,1],\"text\":\"中成药费\",\"style\":6},\"6\":{\"text\":\" \"},\"7\":{\"style\":6,\"text\":\" \"},\"8\":{\"text\":\"治疗费\",\"merge\":[0,2],\"style\":6},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"style\":6,\"text\":\" \"},\"12\":{\"style\":28,\"text\":\" \"}},\"isDrag\":true},\"11\":{\"cells\":{\"1\":{\"style\":31,\"text\":\" \"},\"2\":{\"text\":\"检查费\",\"style\":6,\"merge\":[0,1]},\"3\":{\"text\":\" \"},\"4\":{\"style\":6,\"text\":\" \"},\"5\":{\"merge\":[0,1],\"text\":\"换药费\",\"style\":6},\"6\":{\"text\":\" \"},\"7\":{\"style\":6,\"text\":\" \"},\"8\":{\"merge\":[0,2],\"text\":\"诊疗费\",\"style\":6},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\"${yonghu.yzhenliao}\",\"style\":6},\"12\":{\"style\":28,\"text\":\" \"}},\"isDrag\":true},\"12\":{\"cells\":{\"1\":{\"style\":31,\"text\":\" \"},\"2\":{\"text\":\"注射费\",\"style\":6,\"merge\":[0,1]},\"3\":{\"text\":\" \"},\"4\":{\"style\":6,\"merge\":[0,3],\"text\":\" \"},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"merge\":[0,2],\"text\":\"其他\",\"style\":6},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"style\":6,\"text\":\" \"},\"12\":{\"style\":28,\"text\":\" \"}}},\"13\":{\"cells\":{\"1\":{\"style\":31,\"text\":\" \"},\"2\":{\"text\":\"合计\",\"style\":6,\"merge\":[0,1]},\"3\":{\"text\":\" \"},\"4\":{\"text\":\"${yonghu.ytotal}\",\"style\":6,\"merge\":[0,7]},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"style\":28,\"text\":\" \"}},\"isDrag\":true},\"14\":{\"cells\":{\"1\":{\"style\":31,\"text\":\" \"},\"2\":{\"text\":\" \"},\"3\":{\"text\":\" \"},\"4\":{\"text\":\" \"},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"style\":28,\"text\":\" \"},\"13\":{\"style\":80,\"text\":\" \"}},\"height\":9},\"15\":{\"cells\":{\"1\":{\"style\":31,\"text\":\" \"},\"2\":{\"text\":\"医师:\",\"style\":4,\"merge\":[0,1]},\"3\":{\"text\":\" \"},\"4\":{\"text\":\"${yonghu.yishe}\",\"style\":80},\"5\":{\"style\":80,\"text\":\" \"},\"6\":{\"style\":80,\"text\":\" \"},\"7\":{\"style\":80,\"text\":\" \"},\"8\":{\"text\":\"日期:\",\"style\":4},\"9\":{\"text\":\"${yonghu.kdata}\",\"style\":80,\"merge\":[0,2]},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"style\":71,\"text\":\" \"},\"13\":{\"style\":80,\"text\":\" \"}},\"isDrag\":true,\"height\":43},\"16\":{\"cells\":{\"1\":{\"style\":31,\"text\":\" \"},\"2\":{\"style\":80,\"text\":\" \"},\"3\":{\"style\":80,\"text\":\" \"},\"4\":{\"style\":80,\"text\":\" \"},\"5\":{\"style\":80,\"text\":\" \"},\"6\":{\"style\":80,\"text\":\" \"},\"7\":{\"style\":80,\"text\":\" \"},\"8\":{\"style\":80,\"text\":\" \"},\"9\":{\"style\":80,\"text\":\" \"},\"10\":{\"style\":80,\"text\":\" \"},\"11\":{\"style\":80,\"text\":\" \"},\"12\":{\"style\":28,\"text\":\" \"}},\"height\":17},\"17\":{\"cells\":{\"1\":{\"text\":\" \",\"style\":32},\"2\":{\"text\":\" \",\"style\":33},\"3\":{\"style\":33,\"text\":\" \"},\"4\":{\"text\":\" \",\"style\":33},\"5\":{\"text\":\" \",\"style\":33},\"6\":{\"text\":\" \",\"style\":33},\"7\":{\"text\":\" \",\"style\":33},\"8\":{\"text\":\" \",\"style\":33},\"9\":{\"text\":\" \",\"style\":33},\"10\":{\"text\":\" \",\"style\":33},\"11\":{\"text\":\" \",\"style\":33},\"12\":{\"text\":\" \",\"style\":34}}},\"18\":{\"cells\":{\"11\":{\"text\":\"\"}},\"isDrag\":true},\"len\":94,\"-1\":{\"cells\":{\"-1\":{\"text\":\"#{yaopin.key1}\"}},\"isDrag\":true},\"\":{\"cells\":{\"NaN\":{\"text\":\"\",\"rendered\":\"\"}}}},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":718,\"heightPx\":1047},\"dicts\":[],\"freeze\":\"A1\",\"dataRectWidth\":798,\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"font\":{\"size\":12}},{\"font\":{\"size\":10}},{\"font\":{\"size\":12},\"align\":\"right\"},{\"font\":{\"size\":14}},{\"align\":\"right\"},{\"font\":{\"size\":10},\"align\":\"right\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"center\"},{\"align\":\"center\"},{\"font\":{\"size\":12},\"align\":\"center\"},{\"font\":{\"size\":12,\"bold\":true},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"bold\":true}},{\"font\":{\"size\":14,\"bold\":true},\"align\":\"center\"},{\"border\":{\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"]}},{\"border\":{\"top\":[\"thin\",\"#000\"]}},{\"border\":{\"top\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":14,\"bold\":true},\"align\":\"center\",\"border\":{\"left\":[\"thin\",\"#000\"]}},{\"border\":{\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":12},\"border\":{\"left\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":10},\"border\":{\"left\":[\"thin\",\"#000\"]}},{\"border\":{\"left\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"top\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]}},{\"border\":{\"top\":[\"thick\",\"#000\"]}},{\"border\":{\"top\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":14,\"bold\":true},\"align\":\"center\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12},\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":10},\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]}},{\"border\":{\"bottom\":[\"thick\",\"#000\"]}},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":15},\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":15}},{\"align\":\"left\"},{\"font\":{\"size\":14,\"bold\":true},\"align\":\"center\",\"border\":{\"bottom\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"bold\":true}},{\"font\":{\"size\":12,\"bold\":true},\"align\":\"center\",\"border\":{\"bottom\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":10},\"border\":{\"left\":[\"thick\",\"#000\"]},\"valign\":\"bottom\"},{\"font\":{\"size\":10},\"valign\":\"bottom\"},{\"valign\":\"bottom\"},{\"align\":\"right\",\"border\":{\"top\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"border\":{\"top\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":10},\"border\":{\"left\":[\"thick\",\"#000\"]},\"valign\":\"bottom\",\"align\":\"right\"},{\"font\":{\"size\":10},\"valign\":\"bottom\",\"align\":\"right\"},{\"font\":{\"size\":10},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"right\"},{\"font\":{\"size\":10},\"border\":{\"left\":[\"thick\",\"#000\"]},\"textwrap\":true},{\"font\":{\"size\":10},\"textwrap\":true},{\"font\":{\"size\":10},\"border\":{\"left\":[\"thick\",\"#000\"]},\"textwrap\":false},{\"font\":{\"size\":10},\"textwrap\":false},{\"font\":{\"size\":10},\"border\":{\"left\":[\"thick\",\"#000\"]},\"textwrap\":false,\"align\":\"right\"},{\"font\":{\"size\":10},\"textwrap\":false,\"align\":\"right\"},{\"font\":{\"size\":10},\"border\":{\"left\":[\"thick\",\"#000\"]},\"textwrap\":false,\"align\":\"left\"},{\"font\":{\"size\":10},\"textwrap\":false,\"align\":\"left\"},{\"font\":{\"size\":10},\"border\":{\"left\":[\"thick\",\"#000\"]},\"textwrap\":false,\"align\":\"center\"},{\"font\":{\"size\":10},\"textwrap\":false,\"align\":\"center\"},{\"font\":{\"size\":15},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"right\"},{\"font\":{\"size\":15},\"align\":\"right\"},{\"font\":{\"size\":15},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\"},{\"font\":{\"size\":10},\"border\":{\"left\":[\"thin\",\"#000\"]},\"valign\":\"bottom\",\"align\":\"right\"},{\"font\":{\"size\":10},\"valign\":\"bottom\",\"border\":{\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":10},\"border\":{\"left\":[\"thin\",\"#000\"]},\"align\":\"right\"},{\"font\":{\"size\":10},\"border\":{\"left\":[\"thin\",\"#000\"]},\"textwrap\":false,\"align\":\"left\"},{\"font\":{\"size\":10},\"border\":{\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":15},\"border\":{\"left\":[\"thin\",\"#000\"]},\"align\":\"center\"},{\"align\":\"left\",\"border\":{\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":10},\"valign\":\"bottom\",\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":10},\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":10},\"align\":\"left\"},{\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\"},{\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"right\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"top\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"right\"},{\"font\":{\"size\":10},\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":10},\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":15,\"bold\":true},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\"},{},{\"font\":{\"size\":15,\"bold\":true},\"align\":\"center\"},{\"align\":\"right\",\"border\":{\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":14,\"bold\":true},\"align\":\"center\",\"border\":{\"bottom\":[\"thick\",\"#000\"],\"top\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}}],\"validations\":[],\"cols\":{\"0\":{\"width\":23},\"1\":{\"width\":14},\"2\":{\"width\":56},\"3\":{\"width\":40},\"4\":{\"width\":156},\"5\":{\"width\":41},\"6\":{\"width\":18},\"7\":{\"width\":92},\"8\":{\"width\":58},\"9\":{\"width\":20},\"10\":{\"width\":20},\"11\":{\"width\":148},\"12\":{\"width\":12},\"len\":50},\"merges\":[\"C3:E3\",\"C7:E7\",\"H3:I3\",\"H7:I7\",\"C7:E7\",\"H7:I7\",\"F11:G11\",\"I11:K11\",\"F12:G12\",\"I12:K12\",\"I13:K13\",\"E13:H13\",\"C11:D11\",\"C12:D12\",\"C13:D13\",\"C14:D14\",\"C16:D16\",\"L4:M4\",\"C3:L3\",\"B7:D7\",\"C4:D4\",\"C5:D5\",\"E14:L14\",\"J16:L16\",\"D10:L10\",\"G5:L5\",\"C6:D6\",\"E6:L6\",\"D8:E8\",\"H8:I8\"]}', '', 'https://static.jeecg.com/designreport/images/处方_1607071731580.png', 'admin', '2021-02-02 20:13:47', 'admin', '2021-07-13 10:24:42', 1, NULL, NULL, 0, 835, NULL, NULL, NULL); +INSERT INTO `jimu_report` VALUES ('7905022412733a0c68dc7b4ef8947489', '8996445', '介绍信', '', NULL, 'printinfo', '{\"loopBlockList\":[],\"area\":{\"sri\":5,\"sci\":15,\"eri\":5,\"eci\":15,\"width\":100,\"height\":42},\"excel_config_id\":\"7905022412733a0c68dc7b4ef8947489\",\"printConfig\":{\"paper\":\"A4\",\"width\":210,\"height\":297,\"definition\":1,\"isBackend\":false,\"marginX\":10,\"marginY\":10,\"layout\":\"portrait\"},\"rows\":{\"0\":{\"cells\":{\"1\":{},\"12\":{}},\"height\":11},\"3\":{\"cells\":{\"0\":{\"text\":\"\",\"style\":46},\"1\":{\"merge\":[0,10],\"text\":\"介绍信\",\"style\":337}},\"height\":216},\"4\":{\"cells\":{\"1\":{\"text\":\"${jieshaoxin.name}\",\"style\":338,\"merge\":[0,3]},\"5\":{\"text\":\":\",\"style\":339}},\"isDrag\":true,\"height\":80},\"5\":{\"cells\":{\"1\":{\"text\":\"兹介绍我局\",\"style\":340,\"merge\":[0,5]},\"7\":{\"text\":\"${jieshaoxin.value}\",\"style\":341},\"8\":{\"text\":\"同志\",\"style\":339},\"9\":{\"text\":\"#{jieshaoxin.percent}\",\"style\":339},\"10\":{\"text\":\"人,前往你处\",\"style\":339,\"merge\":[0,1]}},\"isDrag\":true,\"height\":42},\"6\":{\"cells\":{\"1\":{\"text\":\"${jieshaoxin.shiqing}\",\"style\":342,\"merge\":[0,5]},\"15\":{\"text\":\"\"}},\"isDrag\":true,\"height\":48},\"7\":{\"cells\":{\"1\":{\"style\":343,\"text\":\"\"},\"2\":{\"style\":344,\"merge\":[0,5],\"text\":\"请予接洽并给予帮助。\"}},\"height\":56},\"10\":{\"cells\":{\"8\":{\"text\":\"\",\"style\":316,\"merge\":[0,3]}},\"height\":39},\"11\":{\"cells\":{\"8\":{\"merge\":[0,2],\"text\":\"单位盖章\",\"style\":347},\"11\":{\"merge\":[0,1],\"style\":316}},\"height\":84},\"12\":{\"cells\":{\"1\":{\"merge\":[0,2],\"text\":\"\",\"style\":317},\"4\":{\"merge\":[0,2],\"text\":\"\",\"style\":346},\"7\":{\"text\":\"(有效时间:至\",\"style\":317},\"8\":{\"text\":\"${jieshaoxin.gdata}\",\"style\":316,\"merge\":[0,2]},\"11\":{\"style\":348,\"text\":\"止)\"}},\"isDrag\":true,\"height\":30},\"13\":{\"cells\":{\"1\":{\"merge\":[8,11]}}},\"len\":83},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":718,\"heightPx\":1047},\"dicts\":[],\"freeze\":\"A1\",\"dataRectWidth\":694,\"displayConfig\":{},\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"align\":\"left\"},{\"align\":\"left\",\"underline\":true},{\"underline\":true},{\"align\":\"center\",\"underline\":true},{\"align\":\"center\"},{\"align\":\"center\",\"underline\":false},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"]}},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]}},{\"align\":\"left\",\"font\":{\"size\":16}},{\"font\":{\"size\":16}},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":16}},{\"align\":\"center\",\"underline\":false,\"font\":{\"size\":16}},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":16}},{\"align\":\"left\",\"font\":{\"size\":16,\"bold\":true}},{\"font\":{\"size\":16,\"bold\":true}},{\"align\":\"center\",\"underline\":false,\"font\":{\"size\":16,\"bold\":true}},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":16,\"bold\":true}},{\"font\":{\"bold\":true}},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":16,\"bold\":true}},{\"align\":\"left\",\"font\":{\"size\":16,\"bold\":false}},{\"font\":{\"size\":16,\"bold\":false}},{\"align\":\"center\",\"underline\":false,\"font\":{\"size\":16,\"bold\":false}},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":16,\"bold\":false}},{\"font\":{\"bold\":false}},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":16,\"bold\":false}},{\"align\":\"left\",\"font\":{\"size\":16,\"bold\":false},\"color\":\"#3f3f3f\"},{\"font\":{\"size\":16,\"bold\":false},\"color\":\"#3f3f3f\"},{\"align\":\"center\",\"underline\":false,\"font\":{\"size\":16,\"bold\":false},\"color\":\"#3f3f3f\"},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":16,\"bold\":false},\"color\":\"#3f3f3f\"},{\"font\":{\"bold\":false},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":16,\"bold\":false},\"color\":\"#3f3f3f\"},{\"font\":{\"size\":12}},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\"},{\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\"},{\"align\":\"center\",\"underline\":false,\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\"},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\"},{\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\",\"align\":\"center\"},{\"font\":{\"size\":12},\"align\":\"center\"},{\"font\":{\"size\":8}},{\"font\":{\"size\":10}},{\"font\":{\"size\":10,\"bold\":true}},{\"font\":{\"size\":10,\"bold\":true},\"align\":\"center\"},{\"font\":{\"size\":18,\"bold\":true},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"size\":18}},{\"font\":{\"size\":16,\"bold\":true},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"size\":16}},{\"font\":{\"size\":12},\"valign\":\"bottom\"},{\"font\":{\"size\":12},\"valign\":\"middle\"},{\"font\":{\"size\":12},\"border\":{\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":12},\"border\":{\"top\":[\"thin\",\"#000\"]}},{\"border\":{\"top\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":12},\"border\":{\"top\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":12},\"border\":{\"left\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":12},\"border\":{\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":12},\"valign\":\"middle\",\"border\":{\"right\":[\"thin\",\"#000\"]}},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"underline\":false,\"border\":{\"right\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\"},{\"align\":\"center\",\"border\":{\"right\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"border\":{\"right\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":12},\"border\":{\"top\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12},\"border\":{\"top\":[\"thick\",\"#000\"]}},{\"border\":{\"top\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12},\"border\":{\"top\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12},\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12},\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12},\"valign\":\"middle\",\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"center\",\"underline\":false,\"border\":{\"right\":[\"thick\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\"},{\"align\":\"center\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]}},{\"border\":{\"bottom\":[\"thick\",\"#000\"]}},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"align\":\"center\",\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"border\":{\"left\":[\"thin\",\"#000\"]}},{\"border\":{\"left\":[\"dashed\",\"#000\"]}},{\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"border\":{\"bottom\":[\"thick\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\"},{\"font\":{\"size\":12},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\"},{\"font\":{\"size\":12,\"bold\":true},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"bold\":true}},{\"font\":{\"size\":14,\"bold\":true},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":14}},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"border\":{\"top\":[\"thick\",\"#000\"]}},{\"border\":{\"top\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Arial\"}},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"name\":\"Arial\"}},{\"font\":{\"size\":14,\"bold\":true,\"name\":\"Arial\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":14,\"name\":\"Arial\"}},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Arial\"}},{\"font\":{\"name\":\"Arial\"}},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"valign\":\"middle\",\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#3f3f3f\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#3f3f3f\"},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#3f3f3f\",\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#3f3f3f\"},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Arial\"}},{\"border\":{\"bottom\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Arial\"}},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Arial\"}},{\"font\":{\"size\":12,\"name\":\"Source Sans Pro\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Source Sans Pro\"},\"border\":{\"top\":[\"thick\",\"#000\"]}},{\"border\":{\"top\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Source Sans Pro\"}},{\"font\":{\"size\":12,\"name\":\"Source Sans Pro\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Source Sans Pro\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"name\":\"Source Sans Pro\"}},{\"font\":{\"size\":14,\"bold\":true,\"name\":\"Source Sans Pro\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":14,\"name\":\"Source Sans Pro\"}},{\"font\":{\"size\":12,\"name\":\"Source Sans Pro\"},\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Source Sans Pro\"}},{\"font\":{\"name\":\"Source Sans Pro\"}},{\"font\":{\"size\":12,\"name\":\"Source Sans Pro\"},\"valign\":\"middle\",\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Source Sans Pro\"},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Source Sans Pro\"},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Source Sans Pro\"},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Source Sans Pro\"},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Source Sans Pro\"},\"color\":\"#3f3f3f\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Source Sans Pro\"},\"color\":\"#3f3f3f\"},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Source Sans Pro\"},\"color\":\"#3f3f3f\",\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Source Sans Pro\"},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Source Sans Pro\"},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Source Sans Pro\"},\"color\":\"#3f3f3f\"},{\"font\":{\"size\":12,\"name\":\"Source Sans Pro\"},\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Source Sans Pro\"}},{\"border\":{\"bottom\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Source Sans Pro\"}},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Source Sans Pro\"}},{\"font\":{\"size\":12,\"name\":\"Comic Sans MS\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Comic Sans MS\"},\"border\":{\"top\":[\"thick\",\"#000\"]}},{\"border\":{\"top\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Comic Sans MS\"}},{\"font\":{\"size\":12,\"name\":\"Comic Sans MS\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Comic Sans MS\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"name\":\"Comic Sans MS\"}},{\"font\":{\"size\":14,\"bold\":true,\"name\":\"Comic Sans MS\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":14,\"name\":\"Comic Sans MS\"}},{\"font\":{\"size\":12,\"name\":\"Comic Sans MS\"},\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Comic Sans MS\"}},{\"font\":{\"name\":\"Comic Sans MS\"}},{\"font\":{\"size\":12,\"name\":\"Comic Sans MS\"},\"valign\":\"middle\",\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Comic Sans MS\"},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Comic Sans MS\"},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Comic Sans MS\"},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Comic Sans MS\"},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Comic Sans MS\"},\"color\":\"#3f3f3f\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Comic Sans MS\"},\"color\":\"#3f3f3f\"},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Comic Sans MS\"},\"color\":\"#3f3f3f\",\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Comic Sans MS\"},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Comic Sans MS\"},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Comic Sans MS\"},\"color\":\"#3f3f3f\"},{\"font\":{\"size\":12,\"name\":\"Comic Sans MS\"},\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Comic Sans MS\"}},{\"border\":{\"bottom\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Comic Sans MS\"}},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Comic Sans MS\"}},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"border\":{\"top\":[\"thick\",\"#000\"]}},{\"border\":{\"top\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Courier New\"}},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"name\":\"Courier New\"}},{\"font\":{\"size\":14,\"bold\":true,\"name\":\"Courier New\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":14,\"name\":\"Courier New\"}},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Courier New\"}},{\"font\":{\"name\":\"Courier New\"}},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"valign\":\"middle\",\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#3f3f3f\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#3f3f3f\"},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#3f3f3f\",\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#3f3f3f\"},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Courier New\"}},{\"border\":{\"bottom\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Courier New\"}},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Courier New\"}},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"border\":{\"top\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"border\":{\"top\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\",\"color\":\"#000100\"},{\"align\":\"center\",\"font\":{\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"font\":{\"size\":14,\"bold\":true,\"name\":\"Courier New\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\",\"color\":\"#000100\"},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":14,\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"font\":{\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"valign\":\"middle\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#000100\",\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"border\":{\"right\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"border\":{\"top\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"border\":{\"top\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Arial\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\",\"color\":\"#000100\"},{\"align\":\"center\",\"font\":{\"name\":\"Arial\"},\"color\":\"#000100\"},{\"font\":{\"size\":14,\"bold\":true,\"name\":\"Arial\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\",\"color\":\"#000100\"},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":14,\"name\":\"Arial\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"color\":\"#000100\"},{\"font\":{\"name\":\"Arial\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"valign\":\"middle\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#000100\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#000100\"},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#000100\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#000100\",\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#000100\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"border\":{\"right\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Arial\"},\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Arial\"},\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Arial\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Helvetica\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Helvetica\"},\"border\":{\"top\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"border\":{\"top\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Helvetica\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Helvetica\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Helvetica\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\",\"color\":\"#000100\"},{\"align\":\"center\",\"font\":{\"name\":\"Helvetica\"},\"color\":\"#000100\"},{\"font\":{\"size\":14,\"bold\":true,\"name\":\"Helvetica\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\",\"color\":\"#000100\"},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":14,\"name\":\"Helvetica\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Helvetica\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Helvetica\"},\"color\":\"#000100\"},{\"font\":{\"name\":\"Helvetica\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Helvetica\"},\"valign\":\"middle\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Helvetica\"},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Helvetica\"},\"color\":\"#000100\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Helvetica\"},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Helvetica\"},\"color\":\"#000100\"},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Helvetica\"},\"color\":\"#000100\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Helvetica\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Helvetica\"},\"color\":\"#000100\",\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Helvetica\"},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Helvetica\"},\"color\":\"#000100\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Helvetica\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Helvetica\"},\"border\":{\"right\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Helvetica\"},\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Helvetica\"},\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Helvetica\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"border\":{\"top\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"border\":{\"top\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\",\"color\":\"#000100\"},{\"align\":\"center\",\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\"},{\"font\":{\"size\":14,\"bold\":true,\"name\":\"Lato\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\",\"color\":\"#000100\"},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":14,\"name\":\"Lato\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"color\":\"#000100\"},{\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"valign\":\"middle\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\"},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\",\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"border\":{\"right\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\"},{\"font\":{\"size\":10,\"name\":\"Lato\"},\"valign\":\"middle\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"color\":\"#000100\",\"align\":\"center\"},{\"font\":{\"size\":10,\"name\":\"Lato\"},\"valign\":\"middle\",\"color\":\"#000100\"},{\"align\":\"center\",\"underline\":false,\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\"},{},{\"font\":{\"size\":12,\"name\":\"Lato\",\"bold\":true},\"color\":\"#000100\",\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"bold\":true},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\",\"align\":\"right\"},{\"align\":\"right\"},{\"align\":\"right\",\"font\":{\"size\":12}},{\"align\":\"left\",\"font\":{\"size\":12}},{\"font\":{\"size\":12},\"border\":{\"bottom\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":12},\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"align\":\"center\"},{\"valign\":\"top\"},{\"valign\":\"top\",\"align\":\"center\"},{\"valign\":\"top\",\"align\":\"center\",\"font\":{\"size\":12}},{\"font\":{\"size\":14,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\",\"align\":\"right\"},{\"font\":{\"size\":14}},{\"align\":\"right\",\"font\":{\"size\":14}},{\"font\":{\"size\":14},\"border\":{\"bottom\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":14,\"bold\":true}},{\"align\":\"right\",\"font\":{\"size\":9}},{\"font\":{\"size\":9}},{\"font\":{\"size\":9},\"align\":\"center\"},{\"font\":{\"size\":9},\"align\":\"left\"},{\"align\":\"left\",\"font\":{\"bold\":true,\"size\":14}},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":14},\"valign\":\"top\"},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":16},\"valign\":\"top\"},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":18},\"valign\":\"top\"},{\"align\":\"right\",\"font\":{\"size\":10}},{\"font\":{\"size\":10},\"align\":\"center\"},{\"align\":\"left\",\"font\":{\"size\":10}},{\"align\":\"right\",\"font\":{\"size\":12},\"valign\":\"bottom\"},{\"valign\":\"bottom\"},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\",\"align\":\"right\",\"valign\":\"bottom\"},{\"font\":{\"size\":12},\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"align\":\"center\",\"valign\":\"bottom\"},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\",\"valign\":\"bottom\"},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\",\"valign\":\"bottom\"},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":22},\"valign\":\"top\"},{\"align\":\"right\",\"font\":{\"size\":14},\"valign\":\"bottom\"},{\"font\":{\"size\":14},\"valign\":\"bottom\"},{\"font\":{\"size\":14,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\",\"align\":\"right\",\"valign\":\"bottom\"},{\"font\":{\"size\":14},\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"align\":\"center\",\"valign\":\"bottom\"},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":14,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\",\"valign\":\"bottom\"},{\"align\":\"left\",\"font\":{\"size\":14,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\"},{\"font\":{\"size\":14,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\",\"valign\":\"bottom\"},{\"font\":{\"size\":14,\"name\":\"Lato\"},\"color\":\"#000100\"},{\"font\":{\"size\":14},\"align\":\"center\"},{\"valign\":\"top\",\"align\":\"center\",\"font\":{\"size\":14}},{\"align\":\"left\",\"font\":{\"size\":14}}],\"validations\":[],\"cols\":{\"0\":{\"width\":23},\"1\":{\"width\":46},\"2\":{\"width\":24},\"3\":{\"width\":15},\"4\":{\"width\":43},\"5\":{\"width\":13},\"6\":{\"width\":83},\"7\":{\"width\":256},\"8\":{\"width\":42},\"9\":{\"width\":18},\"10\":{\"width\":77},\"11\":{\"width\":54},\"12\":{\"width\":28},\"13\":{\"width\":62},\"16\":{\"width\":55},\"len\":50},\"merges\":[\"B4:L4\",\"B5:E5\",\"B6:G6\",\"K6:L6\",\"B7:G7\",\"C8:H8\",\"I11:L11\",\"I12:K12\",\"L12:M12\",\"B13:D13\",\"E13:G13\",\"I13:K13\",\"B14:M22\"]}', '', 'https://static.jeecg.com/designreport/images/介绍xin_1607072641405.png', 'jeecg', '2020-07-10 13:38:40', 'admin', '2021-07-12 12:24:47', 0, NULL, NULL, 1, 836, NULL, NULL, NULL); +INSERT INTO `jimu_report` VALUES ('7acddbc92bc73d06c7f62ff55dfdca19', '566233333333867', '销售单副本3867', '', NULL, 'printinfo', '{\"area\":{\"sri\":6,\"sci\":7,\"eri\":6,\"eci\":7,\"width\":88,\"height\":25},\"printElWidth\":794,\"excel_config_id\":\"519c1c6f4d1f584ae8fa5b43b45acdc7\",\"printElHeight\":1047,\"rows\":{\"0\":{\"cells\":{\"1\":{\"text\":\"销售单\",\"style\":40,\"merge\":[0,6]},\"2\":{\"style\":41},\"3\":{\"style\":41},\"4\":{\"style\":41},\"5\":{\"style\":41},\"6\":{\"style\":41},\"7\":{\"style\":41}},\"height\":99},\"1\":{\"cells\":{\"1\":{\"text\":\"商品编码\",\"style\":62},\"2\":{\"text\":\"商品名称\",\"style\":62},\"3\":{\"text\":\"销售时间\",\"style\":62},\"4\":{\"text\":\"销售数量\",\"style\":62},\"5\":{\"text\":\"定价\",\"style\":62},\"6\":{\"text\":\"优惠价\",\"style\":62},\"7\":{\"text\":\"付款金额\",\"style\":62}},\"height\":39},\"2\":{\"cells\":{\"1\":{\"text\":\"#{xiaoshou.bianma}\",\"style\":61},\"2\":{\"text\":\"#{xiaoshou.cname}\",\"style\":61},\"3\":{\"text\":\"#{xiaoshou.ctime}\",\"style\":61},\"4\":{\"text\":\"#{xiaoshou.cnum}\",\"style\":61},\"5\":{\"text\":\"#{xiaoshou.cprice}\",\"style\":61},\"6\":{\"text\":\"#{xiaoshou.yprice}\",\"style\":61},\"7\":{\"text\":\"#{xiaoshou.ctotal}\",\"style\":61}},\"isDrag\":true,\"height\":35},\"3\":{\"cells\":{\"1\":{\"style\":44,\"text\":\"\"},\"2\":{\"style\":44},\"3\":{\"style\":44},\"4\":{\"style\":44},\"5\":{\"style\":44,\"text\":\"\"},\"6\":{\"text\":\"\",\"style\":45},\"7\":{\"style\":46,\"text\":\"=SUM(H3)\"}},\"isDrag\":true,\"height\":73},\"5\":{\"cells\":{},\"isDrag\":true},\"6\":{\"cells\":{},\"isDrag\":true},\"7\":{\"cells\":{\"2\":{\"text\":\"\"}},\"isDrag\":true},\"len\":100},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":794,\"heightPx\":1047},\"dicts\":[],\"freeze\":\"A1\",\"dataRectWidth\":754,\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"align\":\"center\"},{\"align\":\"center\",\"color\":\"#000100\"},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#01b0f1\"],\"top\":[\"thin\",\"#01b0f1\"],\"left\":[\"thin\",\"#01b0f1\"],\"right\":[\"thin\",\"#01b0f1\"]}},{\"border\":{\"bottom\":[\"thin\",\"#01b0f1\"],\"top\":[\"thin\",\"#01b0f1\"],\"left\":[\"thin\",\"#01b0f1\"],\"right\":[\"thin\",\"#01b0f1\"]}},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#01b0f1\"],\"top\":[\"thin\",\"#01b0f1\"],\"left\":[\"thin\",\"#01b0f1\"],\"right\":[\"thin\",\"#01b0f1\"]},\"bgcolor\":\"#01b0f1\"},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]},\"bgcolor\":\"#01b0f1\"},{\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"align\":\"center\",\"font\":{\"size\":18}},{\"align\":\"center\",\"font\":{\"size\":18,\"bold\":true}},{\"align\":\"center\",\"font\":{\"size\":16,\"bold\":true}},{\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]},\"align\":\"center\"},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]},\"bgcolor\":\"#fed964\"},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]},\"bgcolor\":\"#fdc101\"},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#fdc101\"],\"top\":[\"thin\",\"#fdc101\"],\"left\":[\"thin\",\"#fdc101\"],\"right\":[\"thin\",\"#fdc101\"]},\"bgcolor\":\"#fdc101\"},{\"border\":{\"bottom\":[\"thin\",\"#fdc101\"],\"top\":[\"thin\",\"#fdc101\"],\"left\":[\"thin\",\"#fdc101\"],\"right\":[\"thin\",\"#fdc101\"]},\"align\":\"center\"},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#fdc101\"],\"top\":[\"thin\",\"#fdc101\"],\"left\":[\"thin\",\"#fdc101\"],\"right\":[\"thin\",\"#fdc101\"]},\"bgcolor\":\"#ffe59a\"},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#fdc101\"],\"top\":[\"thin\",\"#fdc101\"],\"left\":[\"thin\",\"#fdc101\"],\"right\":[\"thin\",\"#fdc101\"]},\"bgcolor\":\"#ffc001\"},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#fdc101\"],\"top\":[\"thin\",\"#fdc101\"],\"left\":[\"thin\",\"#fdc101\"],\"right\":[\"thin\",\"#fdc101\"]},\"bgcolor\":\"#fed964\"},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#fdc101\"],\"top\":[\"thin\",\"#fdc101\"],\"left\":[\"thin\",\"#fdc101\"],\"right\":[\"thin\",\"#fdc101\"]},\"bgcolor\":\"#ed7d31\"},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#fdc101\"],\"top\":[\"thin\",\"#fdc101\"],\"left\":[\"thin\",\"#fdc101\"],\"right\":[\"thin\",\"#fdc101\"]},\"bgcolor\":\"#5b9cd6\"},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#4371c6\"],\"top\":[\"thin\",\"#4371c6\"],\"left\":[\"thin\",\"#4371c6\"],\"right\":[\"thin\",\"#4371c6\"]},\"bgcolor\":\"#5b9cd6\"},{\"border\":{\"bottom\":[\"thin\",\"#4371c6\"],\"top\":[\"thin\",\"#4371c6\"],\"left\":[\"thin\",\"#4371c6\"],\"right\":[\"thin\",\"#4371c6\"]},\"align\":\"center\"},{\"font\":{\"size\":8}},{\"font\":{\"size\":8},\"color\":\"#7f7f7f\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#4371c6\"],\"top\":[\"thin\",\"#4371c6\"],\"left\":[\"thin\",\"#4371c6\"],\"right\":[\"thin\",\"#4371c6\"]},\"bgcolor\":\"#9cc2e6\"},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]},\"bgcolor\":\"#9cc2e6\"},{\"border\":{\"bottom\":[\"thin\",\"#4371c6\"],\"top\":[\"thin\",\"#4371c6\"],\"left\":[\"thin\",\"#4371c6\"],\"right\":[\"thin\",\"#4371c6\"]}},{\"font\":{\"bold\":true}},{\"font\":{\"bold\":true,\"size\":12}},{\"font\":{\"bold\":true,\"size\":16}},{\"font\":{\"bold\":true,\"size\":18}},{\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]},\"align\":\"right\"},{\"align\":\"right\"},{\"align\":\"left\"},{\"align\":\"right\",\"font\":{\"size\":16}},{\"align\":\"left\",\"font\":{\"size\":16}},{\"align\":\"right\",\"font\":{\"size\":14}},{\"align\":\"left\",\"font\":{\"size\":14}},{\"align\":\"center\",\"font\":{\"size\":18,\"bold\":true,\"name\":\"宋体\"}},{\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#4371c6\"],\"top\":[\"thin\",\"#4371c6\"],\"left\":[\"thin\",\"#4371c6\"],\"right\":[\"thin\",\"#4371c6\"]},\"bgcolor\":\"#9cc2e6\",\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#4371c6\"],\"top\":[\"thin\",\"#4371c6\"],\"left\":[\"thin\",\"#4371c6\"],\"right\":[\"thin\",\"#4371c6\"]},\"align\":\"center\",\"font\":{\"name\":\"宋体\"}},{\"align\":\"right\",\"font\":{\"name\":\"宋体\"}},{\"align\":\"right\",\"font\":{\"size\":14,\"name\":\"宋体\"}},{\"align\":\"left\",\"font\":{\"size\":14,\"name\":\"宋体\"}},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#2e75b5\"],\"top\":[\"thin\",\"#2e75b5\"],\"left\":[\"thin\",\"#2e75b5\"],\"right\":[\"thin\",\"#2e75b5\"]},\"bgcolor\":\"#9cc2e6\",\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"color\":\"#000100\",\"bgcolor\":\"#9cc2e6\",\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]},\"align\":\"center\",\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#ffff01\"],\"top\":[\"thin\",\"#ffff01\"],\"left\":[\"thin\",\"#ffff01\"],\"right\":[\"thin\",\"#ffff01\"]},\"align\":\"center\",\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"center\",\"font\":{\"name\":\"宋体\"}},{\"align\":\"right\",\"font\":{\"size\":14,\"name\":\"宋体\"},\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"align\":\"center\",\"color\":\"#000100\",\"bgcolor\":\"#9cc2e6\",\"font\":{\"name\":\"宋体\"},\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"color\":\"#000100\",\"bgcolor\":\"#9cc2e6\",\"font\":{\"name\":\"宋体\"},\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"align\":\"center\",\"color\":\"#ffffff\",\"bgcolor\":\"#9cc2e6\",\"font\":{\"name\":\"宋体\"},\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"align\":\"center\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#2e75b5\"],\"top\":[\"thin\",\"#2e75b5\"],\"left\":[\"thin\",\"#2e75b5\"],\"right\":[\"thin\",\"#2e75b5\"]},\"bgcolor\":\"#9cc2e6\",\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#4371c6\"],\"top\":[\"thin\",\"#4371c6\"],\"left\":[\"thin\",\"#4371c6\"],\"right\":[\"thin\",\"#4371c6\"]},\"bgcolor\":\"#9cc2e6\",\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"color\":\"#ffffff\",\"bgcolor\":\"#9cc2e6\",\"font\":{\"name\":\"宋体\"},\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]}},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"align\":\"center\",\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"color\":\"#ffffff\",\"bgcolor\":\"#9cc2e6\",\"font\":{\"name\":\"宋体\"},\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"align\":\"center\",\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"color\":\"#ffffff\",\"bgcolor\":\"#5b9cd6\",\"font\":{\"name\":\"宋体\"},\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}}],\"validations\":[],\"cols\":{\"0\":{\"width\":31},\"1\":{\"width\":102},\"2\":{\"width\":170},\"3\":{\"width\":147},\"4\":{\"width\":66},\"5\":{\"width\":66},\"6\":{\"width\":84},\"7\":{\"width\":88},\"8\":{\"width\":121},\"len\":26},\"merges\":[\"B1:H1\"]}', '', 'https://static.jeecg.com/designreport/images/xiaoshou_1607310086160.png', 'admin', '2021-01-19 10:46:18', 'admin', '2021-02-02 19:01:02', 1, NULL, NULL, 0, 2096, NULL, NULL, NULL); +INSERT INTO `jimu_report` VALUES ('7c02c224a2db56d0350069650033f702', '895666', '核查评估表', '', NULL, 'printinfo', '{\"loopBlockList\":[],\"area\":{\"sri\":5,\"sci\":18,\"eri\":5,\"eci\":18,\"width\":53,\"height\":46},\"printElWidth\":1399,\"excel_config_id\":\"7c02c224a2db56d0350069650033f702\",\"printElHeight\":790,\"rows\":{\"0\":{\"cells\":{\"1\":{\"text\":\"XX县(市、区)YY低保第三方核查评估汇总表\",\"merge\":[0,21],\"style\":386},\"2\":{\"style\":386},\"3\":{\"style\":386},\"4\":{\"style\":386},\"5\":{\"style\":386},\"6\":{\"style\":386},\"7\":{\"style\":386},\"8\":{\"style\":386},\"9\":{\"style\":386},\"10\":{\"style\":386},\"11\":{\"style\":386},\"12\":{\"style\":386},\"13\":{\"style\":386},\"14\":{\"style\":386},\"15\":{\"style\":386},\"16\":{\"style\":386},\"17\":{\"style\":386},\"18\":{\"style\":386},\"19\":{\"style\":386},\"20\":{\"style\":386},\"21\":{\"style\":386},\"22\":{\"style\":386}},\"height\":70},\"1\":{\"cells\":{\"1\":{\"merge\":[0,2],\"style\":403,\"text\":\" 北京市林翠社区\"},\"2\":{\"style\":398,\"text\":\" \"},\"3\":{\"style\":398,\"text\":\" \"},\"4\":{\"merge\":[0,2],\"text\":\"镇(乡、街道办事处)\",\"style\":399},\"5\":{\"style\":399},\"6\":{\"style\":399},\"7\":{\"style\":399,\"merge\":[0,7]},\"8\":{\"style\":400},\"9\":{\"style\":400},\"10\":{\"style\":400},\"11\":{\"style\":400},\"12\":{\"style\":400},\"13\":{\"style\":400},\"14\":{\"style\":400},\"15\":{\"merge\":[0,7],\"text\":\"单位:人、元、套、平方米\",\"style\":398},\"16\":{\"style\":401},\"17\":{\"style\":401},\"18\":{\"style\":401},\"19\":{\"style\":401},\"20\":{\"style\":401},\"21\":{\"style\":401},\"22\":{\"style\":401}}},\"2\":{\"cells\":{\"1\":{\"style\":114},\"2\":{\"style\":114},\"3\":{\"style\":114},\"4\":{\"style\":114},\"5\":{\"style\":114},\"6\":{\"style\":114},\"7\":{\"style\":114},\"8\":{\"style\":114},\"9\":{\"style\":114},\"10\":{\"style\":114},\"11\":{\"style\":114},\"12\":{\"style\":114},\"13\":{\"style\":114},\"14\":{\"style\":114},\"15\":{\"style\":114},\"16\":{\"style\":114},\"17\":{\"style\":114},\"18\":{\"style\":114},\"19\":{\"style\":114},\"20\":{\"style\":114},\"21\":{\"style\":114},\"22\":{\"style\":114}},\"height\":14},\"3\":{\"cells\":{\"1\":{\"style\":406,\"text\":\"村(社区)名称\",\"merge\":[1,0]},\"2\":{\"style\":407,\"text\":\"户主名称\",\"merge\":[1,0]},\"3\":{\"style\":407,\"text\":\"保障编号\",\"merge\":[1,0]},\"4\":{\"style\":408,\"text\":\"家庭人口\",\"merge\":[1,0]},\"5\":{\"style\":409,\"text\":\"家庭住址\",\"merge\":[1,0]},\"6\":{\"style\":409,\"text\":\"联系电话\",\"merge\":[1,0]},\"7\":{\"style\":408,\"text\":\"身份证号码\",\"merge\":[1,0]},\"8\":{\"style\":409,\"text\":\"原保障\",\"merge\":[0,2]},\"9\":{\"style\":377,\"text\":\" \"},\"10\":{\"style\":377,\"text\":\" \"},\"11\":{\"text\":\"核减后月人均收入\",\"style\":408,\"merge\":[1,0]},\"12\":{\"merge\":[0,5],\"text\":\"保障建议\",\"style\":410},\"13\":{\"style\":379,\"text\":\" \"},\"14\":{\"style\":379,\"text\":\" \"},\"15\":{\"style\":379,\"text\":\" \"},\"16\":{\"style\":379,\"text\":\" \"},\"17\":{\"style\":379,\"text\":\" \"},\"18\":{\"text\":\"是否新增对象\",\"style\":411,\"merge\":[1,0]},\"19\":{\"text\":\"建议取消原因\",\"style\":409,\"merge\":[0,3]},\"20\":{\"style\":377,\"text\":\" \"},\"21\":{\"style\":377,\"text\":\" \"},\"22\":{\"style\":377,\"text\":\" \"}}},\"4\":{\"cells\":{\"1\":{\"style\":381,\"text\":\" \"},\"2\":{\"style\":407,\"text\":\" \"},\"3\":{\"style\":382,\"text\":\" \"},\"4\":{\"style\":408,\"text\":\" \"},\"5\":{\"style\":377,\"text\":\" \"},\"6\":{\"style\":409,\"text\":\" \"},\"7\":{\"style\":383,\"text\":\" \"},\"8\":{\"text\":\"户数\",\"style\":412},\"9\":{\"style\":411,\"text\":\"人口\"},\"10\":{\"style\":413,\"text\":\"金额\"},\"11\":{\"style\":383,\"text\":\" \"},\"12\":{\"text\":\"保障类型\",\"style\":408},\"13\":{\"style\":413,\"text\":\"人口\"},\"14\":{\"style\":408,\"text\":\"差额补助\"},\"15\":{\"style\":408,\"text\":\"全额补助\"},\"16\":{\"style\":408,\"text\":\"增发补助\"},\"17\":{\"style\":408,\"text\":\"合计补助\"},\"18\":{\"style\":411,\"text\":\" \"},\"19\":{\"style\":408,\"text\":\"收入超标\"},\"20\":{\"style\":406,\"text\":\"机动车超标\"},\"21\":{\"style\":410,\"text\":\"死亡\"},\"22\":{\"style\":410,\"text\":\"其他\"}},\"height\":50},\"5\":{\"cells\":{\"1\":{\"text\":\"#{hecha.name}\",\"style\":414,\"rendered\":\"\"},\"2\":{\"text\":\"#{hecha.hname}\",\"style\":414},\"3\":{\"text\":\"#{hecha.num}\",\"style\":414},\"4\":{\"text\":\"#{hecha.knum}\",\"style\":414},\"5\":{\"text\":\"#{hecha.zhuzhi}\",\"style\":414},\"6\":{\"text\":\"#{hecha.phone}\",\"style\":414},\"7\":{\"text\":\"#{hecha.scard}\",\"style\":414},\"8\":{\"text\":\"#{hecha.yhnum}\",\"style\":414},\"9\":{\"text\":\"#{hecha.yren}\",\"style\":414},\"10\":{\"text\":\"#{hecha.yjine}\",\"style\":414},\"11\":{\"text\":\"#{hecha.yjine}\",\"style\":414},\"12\":{\"text\":\"#{hecha.type}\",\"style\":414},\"13\":{\"text\":\"#{hecha.rk}\",\"style\":414},\"14\":{\"text\":\"#{hecha.cbz}\",\"style\":414},\"15\":{\"text\":\"#{hecha.cbz}\",\"style\":414},\"16\":{\"text\":\"#{hecha.cbz}\",\"style\":414},\"17\":{\"text\":\"#{hecha.cbz}\",\"style\":414},\"18\":{\"text\":\"#{hecha.sf1}\",\"style\":414},\"19\":{\"text\":\"#{hecha.sf2}\",\"style\":414},\"20\":{\"text\":\"#{hecha.sf3}\",\"style\":414},\"21\":{\"text\":\"#{hecha.sf4}\",\"style\":414},\"22\":{\"text\":\"#{hecha.bz}\",\"style\":414}},\"isDrag\":true,\"height\":46},\"6\":{\"cells\":{\"1\":{\"style\":114},\"2\":{\"style\":114},\"3\":{\"style\":114},\"4\":{\"style\":114},\"5\":{\"style\":114},\"6\":{\"style\":114},\"7\":{\"style\":114},\"8\":{\"style\":114},\"9\":{\"style\":114},\"10\":{\"style\":114},\"11\":{\"style\":114},\"12\":{\"style\":114},\"13\":{\"style\":114},\"14\":{\"style\":114},\"15\":{\"style\":114},\"16\":{\"style\":114},\"17\":{\"style\":114},\"18\":{\"style\":114},\"19\":{\"style\":114},\"20\":{\"style\":114},\"21\":{\"style\":114},\"22\":{\"style\":114}},\"height\":46},\"7\":{\"cells\":{\"1\":{\"style\":114},\"2\":{\"style\":114},\"3\":{\"style\":114},\"4\":{\"style\":114},\"5\":{\"style\":114},\"6\":{\"style\":114},\"7\":{\"style\":114},\"8\":{\"style\":114},\"9\":{\"style\":114},\"10\":{\"style\":114},\"11\":{\"style\":114},\"12\":{\"style\":114},\"13\":{\"style\":114},\"14\":{\"style\":114},\"15\":{\"style\":114},\"16\":{\"style\":114},\"17\":{\"style\":114},\"18\":{\"style\":114},\"19\":{\"style\":114},\"20\":{\"style\":114},\"21\":{\"style\":114},\"22\":{\"style\":114}},\"height\":46},\"8\":{\"cells\":{\"1\":{\"text\":\"\"},\"2\":{\"style\":114},\"3\":{\"style\":114},\"4\":{\"style\":114},\"5\":{\"style\":114},\"6\":{\"style\":114},\"7\":{\"style\":114},\"8\":{\"style\":114},\"9\":{\"style\":114},\"10\":{\"style\":114},\"11\":{\"style\":114},\"12\":{\"style\":114},\"13\":{\"style\":114},\"14\":{\"style\":114},\"15\":{\"style\":114},\"16\":{\"style\":114},\"17\":{\"style\":114},\"18\":{\"style\":114},\"19\":{\"style\":114},\"20\":{\"style\":114},\"21\":{\"style\":114},\"22\":{\"style\":114}},\"isDrag\":true},\"len\":102},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":794,\"heightPx\":1047},\"dicts\":[],\"freeze\":\"A1\",\"dataRectWidth\":1378,\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true},{\"textwrap\":true},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":false},{\"textwrap\":false},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"align\":\"center\"},{\"textwrap\":true,\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"center\"},{\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\"},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"valign\":\"middle\"},{\"textwrap\":true,\"valign\":\"middle\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":false,\"valign\":\"middle\"},{\"textwrap\":false,\"valign\":\"middle\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\"},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"top\"},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"top\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"valign\":\"bottom\"},{\"textwrap\":true,\"valign\":\"bottom\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"valign\":\"top\"},{\"border\":{\"bottom\":[\"medium\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"font\":{\"size\":18}},{\"align\":\"center\",\"font\":{\"size\":16}},{\"align\":\"center\",\"font\":{\"size\":16,\"bold\":true}},{\"align\":\"center\",\"font\":{\"size\":16,\"bold\":true,\"name\":\"Helvetica\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Helvetica\"}},{\"font\":{\"name\":\"Helvetica\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"font\":{\"name\":\"Helvetica\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Helvetica\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"center\",\"font\":{\"name\":\"Helvetica\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Helvetica\"}},{\"align\":\"center\",\"font\":{\"name\":\"Helvetica\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"top\",\"font\":{\"name\":\"Helvetica\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Helvetica\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Helvetica\"}},{\"textwrap\":true,\"font\":{\"name\":\"Helvetica\"}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Helvetica\"}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Helvetica\"}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"top\",\"font\":{\"name\":\"Helvetica\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"valign\":\"bottom\",\"font\":{\"name\":\"Helvetica\"}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Helvetica\"}},{\"align\":\"center\",\"font\":{\"size\":16,\"bold\":true,\"name\":\"Source Sans Pro\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Source Sans Pro\"}},{\"font\":{\"name\":\"Source Sans Pro\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"font\":{\"name\":\"Source Sans Pro\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Source Sans Pro\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"center\",\"font\":{\"name\":\"Source Sans Pro\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Source Sans Pro\"}},{\"align\":\"center\",\"font\":{\"name\":\"Source Sans Pro\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"top\",\"font\":{\"name\":\"Source Sans Pro\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Source Sans Pro\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Source Sans Pro\"}},{\"textwrap\":true,\"font\":{\"name\":\"Source Sans Pro\"}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Source Sans Pro\"}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Source Sans Pro\"}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"top\",\"font\":{\"name\":\"Source Sans Pro\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"valign\":\"bottom\",\"font\":{\"name\":\"Source Sans Pro\"}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Source Sans Pro\"}},{\"align\":\"center\",\"font\":{\"size\":16,\"bold\":true,\"name\":\"Comic Sans MS\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Comic Sans MS\"}},{\"font\":{\"name\":\"Comic Sans MS\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"font\":{\"name\":\"Comic Sans MS\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Comic Sans MS\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"center\",\"font\":{\"name\":\"Comic Sans MS\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Comic Sans MS\"}},{\"align\":\"center\",\"font\":{\"name\":\"Comic Sans MS\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"top\",\"font\":{\"name\":\"Comic Sans MS\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Comic Sans MS\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Comic Sans MS\"}},{\"textwrap\":true,\"font\":{\"name\":\"Comic Sans MS\"}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Comic Sans MS\"}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Comic Sans MS\"}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"top\",\"font\":{\"name\":\"Comic Sans MS\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"valign\":\"bottom\",\"font\":{\"name\":\"Comic Sans MS\"}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Comic Sans MS\"}},{\"align\":\"center\",\"font\":{\"size\":16,\"bold\":true,\"name\":\"Courier New\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Courier New\"}},{\"font\":{\"name\":\"Courier New\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"font\":{\"name\":\"Courier New\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Courier New\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"center\",\"font\":{\"name\":\"Courier New\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Courier New\"}},{\"align\":\"center\",\"font\":{\"name\":\"Courier New\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"top\",\"font\":{\"name\":\"Courier New\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Courier New\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Courier New\"}},{\"textwrap\":true,\"font\":{\"name\":\"Courier New\"}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Courier New\"}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Courier New\"}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"top\",\"font\":{\"name\":\"Courier New\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"valign\":\"bottom\",\"font\":{\"name\":\"Courier New\"}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Courier New\"}},{\"align\":\"center\",\"font\":{\"size\":16,\"bold\":true,\"name\":\"Verdana\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Verdana\"}},{\"font\":{\"name\":\"Verdana\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"font\":{\"name\":\"Verdana\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Verdana\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"center\",\"font\":{\"name\":\"Verdana\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Verdana\"}},{\"align\":\"center\",\"font\":{\"name\":\"Verdana\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"top\",\"font\":{\"name\":\"Verdana\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Verdana\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Verdana\"}},{\"textwrap\":true,\"font\":{\"name\":\"Verdana\"}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Verdana\"}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Verdana\"}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"top\",\"font\":{\"name\":\"Verdana\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"valign\":\"bottom\",\"font\":{\"name\":\"Verdana\"}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Verdana\"}},{\"align\":\"center\",\"font\":{\"size\":16,\"bold\":true,\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Lato\"}},{\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"center\",\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\"}},{\"align\":\"center\",\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"top\",\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\"}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\"}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\"}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\"}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"top\",\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\"}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#262626\"],\"top\":[\"thin\",\"#262626\"],\"left\":[\"thin\",\"#262626\"],\"right\":[\"thin\",\"#262626\"]},\"textwrap\":true,\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#262626\"],\"top\":[\"thin\",\"#262626\"],\"left\":[\"thin\",\"#262626\"],\"right\":[\"thin\",\"#262626\"]},\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#262626\"],\"top\":[\"thin\",\"#262626\"],\"left\":[\"thin\",\"#262626\"],\"right\":[\"thin\",\"#262626\"]},\"align\":\"center\",\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#262626\"],\"top\":[\"thin\",\"#262626\"],\"left\":[\"thin\",\"#262626\"],\"right\":[\"thin\",\"#262626\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#262626\"],\"top\":[\"thin\",\"#262626\"],\"left\":[\"thin\",\"#262626\"],\"right\":[\"thin\",\"#262626\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"top\",\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#262626\"],\"top\":[\"thin\",\"#262626\"],\"left\":[\"thin\",\"#262626\"],\"right\":[\"thin\",\"#262626\"]},\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#262626\"],\"top\":[\"thin\",\"#262626\"],\"left\":[\"thin\",\"#262626\"],\"right\":[\"thin\",\"#262626\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#262626\"],\"top\":[\"thin\",\"#262626\"],\"left\":[\"thin\",\"#262626\"],\"right\":[\"thin\",\"#262626\"]},\"textwrap\":true,\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"],\"top\":[\"thin\",\"#7f7f7f\"],\"left\":[\"thin\",\"#7f7f7f\"],\"right\":[\"thin\",\"#7f7f7f\"]},\"textwrap\":true,\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"],\"top\":[\"thin\",\"#7f7f7f\"],\"left\":[\"thin\",\"#7f7f7f\"],\"right\":[\"thin\",\"#7f7f7f\"]},\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"],\"top\":[\"thin\",\"#7f7f7f\"],\"left\":[\"thin\",\"#7f7f7f\"],\"right\":[\"thin\",\"#7f7f7f\"]},\"align\":\"center\",\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"],\"top\":[\"thin\",\"#7f7f7f\"],\"left\":[\"thin\",\"#7f7f7f\"],\"right\":[\"thin\",\"#7f7f7f\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"],\"top\":[\"thin\",\"#7f7f7f\"],\"left\":[\"thin\",\"#7f7f7f\"],\"right\":[\"thin\",\"#7f7f7f\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"top\",\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"],\"top\":[\"thin\",\"#7f7f7f\"],\"left\":[\"thin\",\"#7f7f7f\"],\"right\":[\"thin\",\"#7f7f7f\"]},\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"],\"top\":[\"thin\",\"#7f7f7f\"],\"left\":[\"thin\",\"#7f7f7f\"],\"right\":[\"thin\",\"#7f7f7f\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"],\"top\":[\"thin\",\"#7f7f7f\"],\"left\":[\"thin\",\"#7f7f7f\"],\"right\":[\"thin\",\"#7f7f7f\"]},\"textwrap\":true,\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"textwrap\":true,\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"align\":\"center\",\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"top\",\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"textwrap\":true,\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\"}},{\"align\":\"center\",\"valign\":\"middle\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"center\",\"valign\":\"middle\"},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"textwrap\":false,\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"textwrap\":true,\"font\":{\"name\":\"Lato\"},\"valign\":\"middle\"},{\"align\":\"center\",\"font\":{\"size\":16,\"bold\":true,\"name\":\"Lato\"},\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"textwrap\":true,\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\"},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\"},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\"},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"align\":\"center\",\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\"},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"top\",\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\"},{\"align\":\"center\",\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\"},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\"},{\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\"},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\"},{\"textwrap\":true,\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\"},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\"},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"top\",\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\"},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"textwrap\":true,\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\"},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"top\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]},\"textwrap\":true,\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\"},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"top\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]},\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\"},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"top\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\"},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"top\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]},\"align\":\"center\",\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\"},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"top\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"top\",\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\"},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"top\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]},\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\"},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"top\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\"},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"top\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]},\"textwrap\":true,\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\"},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"top\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]},\"textwrap\":true,\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"top\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]},\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"top\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"top\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]},\"align\":\"center\",\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"top\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"top\",\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"align\":\"center\",\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"top\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]},\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"top\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"textwrap\":true,\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"top\",\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"top\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]},\"textwrap\":true,\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"top\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]},\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"top\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]},\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"top\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"top\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]},\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"top\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"top\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"top\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]},\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"top\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"top\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"top\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]},\"textwrap\":true,\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"top\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]},\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\",\"valign\":\"middle\"},{\"align\":\"center\",\"border\":{\"right\":[\"thin\",\"#ffffff\"]}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"top\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]}},{\"align\":\"center\",\"valign\":\"middle\",\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"top\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Lato\"},\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"top\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]}},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"top\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]}},{\"align\":\"center\",\"valign\":\"middle\",\"border\":{\"right\":[\"thin\",\"#ffffff\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Lato\"},\"border\":{\"right\":[\"thin\",\"#ffffff\"]}},{\"border\":{\"right\":[\"thin\",\"#ffffff\"]}},{\"align\":\"center\",\"valign\":\"middle\",\"border\":{\"right\":[\"thin\",\"#000100\"]}},{\"align\":\"center\",\"border\":{\"right\":[\"thin\",\"#000100\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Lato\"},\"border\":{\"right\":[\"thin\",\"#000100\"]}},{\"border\":{\"right\":[\"thin\",\"#000100\"]}},{\"align\":\"center\",\"valign\":\"middle\",\"border\":{\"left\":[\"thin\",\"#000100\"]}},{\"align\":\"center\",\"valign\":\"middle\",\"border\":{\"bottom\":[\"thin\",\"#000100\"]}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000100\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Lato\"},\"border\":{\"bottom\":[\"thin\",\"#000100\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000100\"]}},{\"font\":{\"name\":\"Lato\"},\"border\":{\"top\":[\"thin\",\"#000100\"]}},{\"align\":\"center\",\"valign\":\"middle\",\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"],\"top\":[\"thin\",\"#7f7f7f\"],\"left\":[\"thin\",\"#7f7f7f\"],\"right\":[\"thin\",\"#7f7f7f\"]}},{\"font\":{\"name\":\"Lato\"},\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"]}},{\"font\":{\"name\":\"Lato\"},\"border\":{\"bottom\":[\"thin\",\"#000100\"]}},{\"font\":{\"name\":\"Lato\"},\"border\":{\"bottom\":[\"thin\",\"#000100\"]},\"align\":\"right\"},{\"font\":{\"name\":\"Lato\"},\"align\":\"right\"},{\"textwrap\":true,\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\",\"valign\":\"middle\"},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\",\"valign\":\"middle\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]},\"align\":\"center\"},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#ffffff\"},{\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#ffffff\"},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#ffffff\"},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#ffffff\"},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#ffffff\"},{\"textwrap\":true,\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#ffffff\",\"valign\":\"middle\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#000100\"},{\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#000100\"},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#000100\"},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#000100\"},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#000100\"},{\"textwrap\":true,\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#000100\",\"valign\":\"middle\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#262626\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#262626\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#262626\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#262626\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#262626\"},{\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#262626\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#262626\"},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#262626\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#262626\"},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#262626\"},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#262626\"},{\"textwrap\":true,\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#262626\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#262626\",\"valign\":\"middle\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#9cc2e6\",\"color\":\"#262626\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#9cc2e6\",\"color\":\"#262626\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#9cc2e6\",\"color\":\"#262626\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#9cc2e6\",\"color\":\"#262626\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#9cc2e6\",\"color\":\"#262626\"},{\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#9cc2e6\",\"color\":\"#262626\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#9cc2e6\",\"color\":\"#262626\"},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#9cc2e6\",\"color\":\"#262626\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#9cc2e6\",\"color\":\"#262626\"},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#9cc2e6\",\"color\":\"#262626\"},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#9cc2e6\",\"color\":\"#262626\"},{\"textwrap\":true,\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#9cc2e6\",\"color\":\"#262626\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#9cc2e6\",\"color\":\"#262626\",\"valign\":\"middle\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#262626\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#262626\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#262626\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#262626\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#262626\"},{\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#262626\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#262626\"},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#262626\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#262626\"},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#262626\"},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#262626\"},{\"textwrap\":true,\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#262626\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#262626\",\"valign\":\"middle\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#ffffff\"},{\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#ffffff\"},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#ffffff\"},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#ffffff\"},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#ffffff\"},{\"textwrap\":true,\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#ffffff\",\"valign\":\"middle\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"textwrap\":true,\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#ffffff\",\"valign\":\"middle\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]},\"align\":\"center\"},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#a7d08c\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#a7d08c\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#a7d08c\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#a7d08c\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#a7d08c\",\"color\":\"#ffffff\"},{\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#a7d08c\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#a7d08c\",\"color\":\"#ffffff\"},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#a7d08c\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#a7d08c\",\"color\":\"#ffffff\"},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#a7d08c\",\"color\":\"#ffffff\"},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#a7d08c\",\"color\":\"#ffffff\"},{\"textwrap\":true,\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#a7d08c\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#a7d08c\",\"color\":\"#ffffff\",\"valign\":\"middle\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#71ae47\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#71ae47\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#71ae47\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#71ae47\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#71ae47\",\"color\":\"#ffffff\"},{\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#71ae47\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#71ae47\",\"color\":\"#ffffff\"},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#71ae47\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#71ae47\",\"color\":\"#ffffff\"},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#71ae47\",\"color\":\"#ffffff\"},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#71ae47\",\"color\":\"#ffffff\"},{\"textwrap\":true,\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#71ae47\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#71ae47\",\"color\":\"#ffffff\",\"valign\":\"middle\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]},\"align\":\"center\",\"font\":{\"size\":8}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#71ae47\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#71ae47\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#71ae47\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#71ae47\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#71ae47\",\"color\":\"#ffffff\"},{\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#71ae47\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#71ae47\",\"color\":\"#ffffff\"},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#71ae47\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#71ae47\",\"color\":\"#ffffff\"},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#71ae47\",\"color\":\"#ffffff\"},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#71ae47\",\"color\":\"#ffffff\"},{\"textwrap\":true,\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#71ae47\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#71ae47\",\"color\":\"#ffffff\",\"valign\":\"middle\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\"},{\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\"},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\"},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\"},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\"},{\"textwrap\":true,\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"valign\":\"middle\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"align\":\"center\",\"font\":{\"size\":15,\"bold\":true,\"name\":\"Lato\"}},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":9},\"border\":{\"bottom\":[\"thin\",\"#000100\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":9}},{\"font\":{\"name\":\"Lato\",\"size\":9}},{\"font\":{\"size\":9}},{\"align\":\"center\",\"font\":{\"size\":9}},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":9},\"border\":{\"bottom\":[\"thin\",\"#000100\"]},\"color\":\"#a5a5a5\"},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":9},\"color\":\"#a5a5a5\"},{\"font\":{\"name\":\"Lato\",\"size\":9},\"color\":\"#a5a5a5\"},{\"font\":{\"size\":9},\"color\":\"#a5a5a5\"},{\"align\":\"center\",\"font\":{\"size\":9},\"color\":\"#a5a5a5\"},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":9},\"border\":{\"bottom\":[\"thin\",\"#000100\"]},\"color\":\"#7f7f7f\"},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":9},\"color\":\"#7f7f7f\"},{\"font\":{\"name\":\"Lato\",\"size\":9},\"color\":\"#7f7f7f\"},{\"font\":{\"size\":9},\"color\":\"#7f7f7f\"},{\"align\":\"center\",\"font\":{\"size\":9},\"color\":\"#7f7f7f\"},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":9},\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"],\"top\":[\"thin\",\"#7f7f7f\"],\"left\":[\"thin\",\"#7f7f7f\"],\"right\":[\"thin\",\"#7f7f7f\"]},\"color\":\"#7f7f7f\"},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":9},\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"]},\"color\":\"#7f7f7f\"},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"]},\"align\":\"center\",\"font\":{\"size\":8}},{\"border\":{\"bottom\":[\"thin\",\"#a5a5a5\"]},\"align\":\"center\",\"font\":{\"size\":8}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#a5a5a5\"],\"top\":[\"thin\",\"#a5a5a5\"],\"left\":[\"thin\",\"#a5a5a5\"],\"right\":[\"thin\",\"#a5a5a5\"]}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#a5a5a5\"],\"top\":[\"thin\",\"#a5a5a5\"],\"left\":[\"thin\",\"#a5a5a5\"],\"right\":[\"thin\",\"#a5a5a5\"]}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#a5a5a5\"],\"top\":[\"thin\",\"#a5a5a5\"],\"left\":[\"thin\",\"#a5a5a5\"],\"right\":[\"thin\",\"#a5a5a5\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#a5a5a5\"],\"top\":[\"thin\",\"#a5a5a5\"],\"left\":[\"thin\",\"#a5a5a5\"],\"right\":[\"thin\",\"#a5a5a5\"]}},{\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#a5a5a5\"],\"top\":[\"thin\",\"#a5a5a5\"],\"left\":[\"thin\",\"#a5a5a5\"],\"right\":[\"thin\",\"#a5a5a5\"]}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#a5a5a5\"],\"top\":[\"thin\",\"#a5a5a5\"],\"left\":[\"thin\",\"#a5a5a5\"],\"right\":[\"thin\",\"#a5a5a5\"]}},{\"textwrap\":true,\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#a5a5a5\"],\"top\":[\"thin\",\"#a5a5a5\"],\"left\":[\"thin\",\"#a5a5a5\"],\"right\":[\"thin\",\"#a5a5a5\"]}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"valign\":\"middle\",\"border\":{\"bottom\":[\"thin\",\"#a5a5a5\"],\"top\":[\"thin\",\"#a5a5a5\"],\"left\":[\"thin\",\"#a5a5a5\"],\"right\":[\"thin\",\"#a5a5a5\"]}},{\"border\":{\"bottom\":[\"thin\",\"#a5a5a5\"],\"top\":[\"thin\",\"#a5a5a5\"],\"left\":[\"thin\",\"#a5a5a5\"],\"right\":[\"thin\",\"#a5a5a5\"]},\"align\":\"center\",\"font\":{\"size\":8}}],\"validations\":[],\"cols\":{\"0\":{\"width\":30},\"1\":{\"width\":68},\"2\":{\"width\":86},\"3\":{\"width\":93},\"4\":{\"width\":91},\"5\":{\"width\":156},\"6\":{\"width\":95},\"7\":{\"width\":85},\"8\":{\"width\":37},\"9\":{\"width\":30},\"10\":{\"width\":43},\"11\":{\"width\":66},\"12\":{\"width\":38},\"13\":{\"width\":41},\"14\":{\"width\":54},\"15\":{\"width\":49},\"16\":{\"width\":45},\"17\":{\"width\":49},\"18\":{\"width\":53},\"19\":{\"width\":40},\"20\":{\"width\":50},\"21\":{\"width\":40},\"22\":{\"width\":39},\"len\":50},\"merges\":[\"M4:R4\",\"B4:B5\",\"C4:C5\",\"D4:D5\",\"E4:E5\",\"F4:F5\",\"G4:G5\",\"H4:H5\",\"I4:K4\",\"L4:L5\",\"S4:S5\",\"T4:W4\",\"E2:G2\",\"B2:D2\",\"B1:W1\",\"P2:W2\",\"H2:O2\"]}', '', 'https://static.jeecg.com/designreport/images/QQ截图20201207113312_1607312171402.png', 'jeecg', '2020-07-14 16:41:42', 'admin', '2021-02-03 14:01:17', 0, NULL, NULL, 1, 260, NULL, NULL, NULL); +INSERT INTO `jimu_report` VALUES ('94b04a1ed7c17f8e96baa6d89fb90758', '3698522', '员工请假单', '', NULL, 'printinfo', '{\"area\":false,\"printElWidth\":794,\"excel_config_id\":\"94b04a1ed7c17f8e96baa6d89fb90758\",\"printElHeight\":1047,\"rows\":{\"1\":{\"cells\":{\"0\":{\"text\":\"员工请假单\",\"style\":100,\"merge\":[0,7]},\"1\":{\"style\":100},\"2\":{\"style\":100},\"3\":{\"style\":100},\"4\":{\"style\":100},\"5\":{\"style\":100},\"6\":{\"style\":100},\"7\":{\"style\":100}},\"height\":65},\"2\":{\"cells\":{\"0\":{\"text\":\"单位:北极星\",\"style\":101,\"merge\":[0,2]},\"1\":{\"style\":101},\"2\":{\"style\":101},\"3\":{\"style\":102},\"4\":{\"style\":102},\"5\":{\"style\":102},\"6\":{\"style\":102},\"7\":{\"style\":102}},\"height\":38},\"3\":{\"cells\":{\"0\":{\"text\":\"姓名\",\"style\":119},\"1\":{\"style\":119,\"text\":\" \"},\"2\":{\"text\":\"工作岗位\",\"style\":120},\"3\":{\"style\":119,\"text\":\" \"},\"4\":{\"text\":\"工作时间\",\"style\":119},\"5\":{\"style\":119,\"text\":\" \"},\"6\":{\"text\":\"出生日期\",\"style\":119},\"7\":{\"style\":119,\"text\":\" \"}}},\"4\":{\"cells\":{\"0\":{\"text\":\"请选择假类型\",\"style\":121,\"merge\":[4,0]},\"1\":{\"text\":\"年休假\",\"style\":120},\"2\":{\"style\":120,\"text\":\"病、事假\"},\"3\":{\"style\":120,\"text\":\"探亲假\"},\"4\":{\"style\":119,\"merge\":[0,1],\"text\":\"婚、丧假\"},\"5\":{\"style\":107,\"text\":\" \"},\"6\":{\"style\":119,\"merge\":[0,1],\"text\":\"生育假\"},\"7\":{\"style\":107,\"text\":\" \"}},\"height\":29},\"5\":{\"cells\":{\"0\":{\"style\":0},\"1\":{\"text\":\"1、公岭满1~9年(5天)\",\"style\":122},\"2\":{\"style\":119,\"text\":\"1、病假\"},\"3\":{\"style\":119,\"text\":\"1、未婚探父母(20天)\"},\"4\":{\"style\":119,\"merge\":[0,1],\"text\":\"1、婚假(3天)\"},\"5\":{\"style\":107,\"text\":\" \"},\"6\":{\"style\":119,\"merge\":[0,1],\"text\":\"1、流产\"},\"7\":{\"style\":107,\"text\":\" \"}},\"height\":25},\"6\":{\"cells\":{\"0\":{\"style\":0},\"1\":{\"style\":123,\"text\":\"2、公岭满10~19年(10天)\"},\"2\":{\"style\":119,\"text\":\"2、事假\"},\"3\":{\"style\":119,\"text\":\"2、已婚探父母(20天)\"},\"4\":{\"style\":119,\"merge\":[0,1],\"text\":\"2、晚婚假(13天)\"},\"5\":{\"style\":107,\"text\":\" \"},\"6\":{\"style\":119,\"merge\":[0,1],\"text\":\"2、产假\"},\"7\":{\"style\":107,\"text\":\" \"}}},\"7\":{\"cells\":{\"0\":{\"style\":0},\"1\":{\"style\":123,\"text\":\"3、公岭满20年(15天)\"},\"2\":{\"style\":119,\"text\":\" \"},\"3\":{\"style\":119,\"text\":\"3、探配偶(30天)\"},\"4\":{\"style\":119,\"merge\":[0,1],\"text\":\"3、丧假(3天)\"},\"5\":{\"style\":107,\"text\":\" \"},\"6\":{\"style\":119,\"merge\":[0,1],\"text\":\"3、哺乳假\"},\"7\":{\"style\":107,\"text\":\" \"}}},\"8\":{\"cells\":{\"0\":{\"style\":0},\"1\":{\"style\":119,\"text\":\" \"},\"2\":{\"style\":119,\"text\":\" \"},\"3\":{\"style\":119,\"text\":\"探亲地点:\",\"merge\":[0,2]},\"4\":{\"style\":107,\"text\":\" \"},\"5\":{\"style\":107,\"text\":\" \"},\"6\":{\"style\":119,\"merge\":[0,1],\"text\":\"4、陪护假\"},\"7\":{\"style\":107,\"text\":\" \"},\"8\":{\"style\":15},\"9\":{\"style\":15},\"10\":{\"style\":15},\"11\":{\"style\":15},\"12\":{\"style\":15},\"13\":{\"style\":15},\"14\":{\"style\":15},\"15\":{\"style\":15},\"16\":{\"style\":15},\"17\":{\"style\":15},\"18\":{\"style\":15},\"19\":{\"style\":15},\"20\":{\"style\":15},\"21\":{\"style\":15},\"22\":{\"style\":15},\"23\":{\"style\":5},\"24\":{\"style\":5},\"25\":{\"style\":5}}},\"9\":{\"cells\":{\"0\":{\"style\":124,\"text\":\"请假时间\"},\"1\":{\"style\":125,\"merge\":[0,6],\"text\":\"2020年02-30 至2020年02-03-30\"},\"2\":{\"style\":115,\"text\":\" \"},\"3\":{\"style\":115,\"text\":\" \"},\"4\":{\"style\":115,\"text\":\" \"},\"5\":{\"style\":115,\"text\":\" \"},\"6\":{\"style\":115,\"text\":\" \"},\"7\":{\"style\":115,\"text\":\" \"}},\"height\":46},\"10\":{\"cells\":{\"0\":{\"style\":126,\"text\":\"审批人员及意见\"},\"1\":{\"merge\":[0,6],\"style\":127,\"text\":\"同意\"},\"2\":{\"style\":118,\"text\":\" \"},\"3\":{\"style\":118,\"text\":\" \"},\"4\":{\"style\":118,\"text\":\" \"},\"5\":{\"style\":118,\"text\":\" \"},\"6\":{\"style\":118,\"text\":\" \"},\"7\":{\"style\":118,\"text\":\" \"}},\"height\":89},\"11\":{\"cells\":{\"0\":{\"text\":\"备注\",\"style\":119},\"1\":{\"style\":119,\"text\":\" \"},\"2\":{\"text\":\"请假人签名\",\"style\":119},\"3\":{\"merge\":[0,4],\"style\":119,\"text\":\" \"},\"4\":{\"style\":107,\"text\":\" \"},\"5\":{\"style\":107,\"text\":\" \"},\"6\":{\"style\":107,\"text\":\" \"},\"7\":{\"style\":107,\"text\":\" \"}},\"height\":90},\"12\":{\"cells\":{\"0\":{\"merge\":[0,7],\"style\":120,\"text\":\"请假审批表一式两份,考勤员与人力资源部门各存一份\"},\"1\":{\"style\":106,\"text\":\" \"},\"2\":{\"style\":106,\"text\":\" \"},\"3\":{\"style\":106,\"text\":\" \"},\"4\":{\"style\":106,\"text\":\" \"},\"5\":{\"style\":106,\"text\":\" \"},\"6\":{\"style\":106,\"text\":\" \"},\"7\":{\"style\":106,\"text\":\" \"}},\"height\":25},\"len\":101},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":794,\"heightPx\":1047},\"dicts\":[],\"freeze\":\"A1\",\"dataRectWidth\":789,\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"textwrap\":true},{\"textwrap\":false},{\"textwrap\":true,\"valign\":\"middle\"},{\"textwrap\":false,\"valign\":\"middle\"},{\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"textwrap\":true,\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"textwrap\":false,\"valign\":\"middle\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"textwrap\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"textwrap\":false,\"valign\":\"middle\",\"border\":{\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"textwrap\":false,\"border\":{\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"textwrap\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"left\"},{},{\"font\":{\"name\":\"Helvetica\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Helvetica\"}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Helvetica\"}},{\"textwrap\":true,\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Helvetica\"}},{\"align\":\"center\",\"font\":{\"name\":\"Helvetica\"}},{\"textwrap\":false,\"valign\":\"middle\",\"border\":{\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Helvetica\"}},{\"textwrap\":false,\"border\":{\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Helvetica\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Helvetica\"}},{\"font\":{\"name\":\"Arial\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Arial\"}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Arial\"}},{\"textwrap\":true,\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Arial\"}},{\"align\":\"center\",\"font\":{\"name\":\"Arial\"}},{\"textwrap\":false,\"valign\":\"middle\",\"border\":{\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Arial\"}},{\"textwrap\":false,\"border\":{\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Arial\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Arial\"}},{\"font\":{\"name\":\"Source Sans Pro\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Source Sans Pro\"}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Source Sans Pro\"}},{\"textwrap\":true,\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Source Sans Pro\"}},{\"align\":\"center\",\"font\":{\"name\":\"Source Sans Pro\"}},{\"textwrap\":false,\"valign\":\"middle\",\"border\":{\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Source Sans Pro\"}},{\"textwrap\":false,\"border\":{\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Source Sans Pro\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Source Sans Pro\"}},{\"font\":{\"name\":\"Courier New\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Courier New\"}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Courier New\"}},{\"textwrap\":true,\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Courier New\"}},{\"align\":\"center\",\"font\":{\"name\":\"Courier New\"}},{\"textwrap\":false,\"valign\":\"middle\",\"border\":{\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Courier New\"}},{\"textwrap\":false,\"border\":{\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Courier New\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Courier New\"}},{\"font\":{\"name\":\"Courier New\"},\"border\":{\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"name\":\"Courier New\"},\"border\":{\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"textwrap\":true,\"border\":{\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Courier New\"}},{\"textwrap\":true,\"border\":{\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Courier New\"},\"align\":\"center\"},{\"font\":{\"name\":\"Courier New\"},\"border\":{\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Courier New\"},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"name\":\"Courier New\",\"size\":14}},{\"align\":\"center\",\"font\":{\"size\":14}},{\"align\":\"center\",\"font\":{\"name\":\"Courier New\",\"size\":14,\"bold\":true}},{\"align\":\"center\",\"font\":{\"size\":14,\"bold\":true}},{\"font\":{\"name\":\"Courier New\"},\"color\":\"#7f7f7f\"},{\"color\":\"#7f7f7f\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"textwrap\":true,\"border\":{\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Courier New\"},\"align\":\"center\",\"color\":\"#000100\"},{\"align\":\"center\",\"font\":{\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"font\":{\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"font\":{\"name\":\"Courier New\"},\"border\":{\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"center\",\"color\":\"#000100\"},{\"textwrap\":false,\"valign\":\"middle\",\"border\":{\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"textwrap\":false,\"border\":{\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Courier New\"},\"align\":\"center\",\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"color\":\"#000100\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"color\":\"#000100\"},{\"align\":\"center\",\"color\":\"#000100\"},{\"textwrap\":true,\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"color\":\"#000100\"},{\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\"},{\"textwrap\":true,\"border\":{\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Lato\"},\"align\":\"center\",\"color\":\"#000100\"},{\"align\":\"center\",\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\"},{\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\"},{\"font\":{\"name\":\"Lato\"},\"border\":{\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"center\",\"color\":\"#000100\"},{\"textwrap\":false,\"valign\":\"middle\",\"border\":{\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\"},{\"textwrap\":false,\"border\":{\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Lato\"},\"align\":\"center\",\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\"},{\"textwrap\":true,\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"color\":\"#000100\",\"font\":{\"name\":\"Lato\"}},{\"textwrap\":true,\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"color\":\"#000100\",\"font\":{\"name\":\"Lato\"},\"valign\":\"middle\"},{\"textwrap\":true,\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"color\":\"#000100\",\"font\":{\"name\":\"Lato\"},\"valign\":\"bottom\"},{\"textwrap\":true,\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"color\":\"#000100\",\"font\":{\"name\":\"Lato\"},\"valign\":\"top\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\",\"valign\":\"top\"},{\"align\":\"center\",\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\",\"valign\":\"top\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\",\"valign\":\"middle\"},{\"align\":\"center\",\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\",\"valign\":\"middle\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\",\"valign\":\"bottom\"},{\"align\":\"center\",\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\",\"valign\":\"bottom\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\",\"textwrap\":true},{\"align\":\"center\",\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\",\"textwrap\":true},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\",\"textwrap\":false},{\"align\":\"center\",\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\",\"textwrap\":false},{\"textwrap\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"color\":\"#000100\",\"font\":{\"name\":\"Lato\"}},{\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"size\":14,\"bold\":true}},{\"font\":{\"name\":\"宋体\"},\"color\":\"#7f7f7f\"},{\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\"},\"color\":\"#000100\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\"},\"color\":\"#000100\"},{\"textwrap\":true,\"border\":{\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\"},\"align\":\"center\",\"color\":\"#000100\"},{\"align\":\"center\",\"font\":{\"name\":\"宋体\"},\"color\":\"#000100\"},{\"font\":{\"name\":\"宋体\"},\"color\":\"#000100\"},{\"font\":{\"name\":\"宋体\"},\"border\":{\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"center\",\"color\":\"#000100\"},{\"textwrap\":false,\"valign\":\"middle\",\"border\":{\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\"},\"color\":\"#000100\"},{\"textwrap\":false,\"border\":{\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\"},\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\"},\"align\":\"center\",\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\"},\"color\":\"#000100\"},{\"textwrap\":true,\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"color\":\"#000100\",\"font\":{\"name\":\"宋体\"},\"valign\":\"top\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\"},\"color\":\"#000100\",\"valign\":\"top\"},{\"align\":\"center\",\"font\":{\"name\":\"宋体\"},\"color\":\"#000100\",\"valign\":\"top\"},{\"textwrap\":true,\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"color\":\"#000100\",\"font\":{\"name\":\"宋体\"},\"valign\":\"bottom\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\"},\"color\":\"#000100\",\"textwrap\":false},{\"align\":\"center\",\"font\":{\"name\":\"宋体\"},\"color\":\"#000100\",\"textwrap\":false},{\"border\":{\"bottom\":[\"thin\",\"#262626\"],\"top\":[\"thin\",\"#262626\"],\"left\":[\"thin\",\"#262626\"],\"right\":[\"thin\",\"#262626\"]},\"font\":{\"name\":\"宋体\"},\"color\":\"#000100\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#262626\"],\"top\":[\"thin\",\"#262626\"],\"left\":[\"thin\",\"#262626\"],\"right\":[\"thin\",\"#262626\"]},\"font\":{\"name\":\"宋体\"},\"color\":\"#000100\"},{\"textwrap\":true,\"border\":{\"bottom\":[\"thin\",\"#262626\"],\"top\":[\"thin\",\"#262626\"],\"left\":[\"thin\",\"#262626\"],\"right\":[\"thin\",\"#262626\"]},\"font\":{\"name\":\"宋体\"},\"align\":\"center\",\"color\":\"#000100\"},{\"textwrap\":false,\"valign\":\"middle\",\"border\":{\"bottom\":[\"thin\",\"#262626\"],\"top\":[\"thin\",\"#262626\"],\"left\":[\"thin\",\"#262626\"],\"right\":[\"thin\",\"#262626\"]},\"font\":{\"name\":\"宋体\"},\"color\":\"#000100\"},{\"textwrap\":false,\"border\":{\"bottom\":[\"thin\",\"#262626\"],\"top\":[\"thin\",\"#262626\"],\"left\":[\"thin\",\"#262626\"],\"right\":[\"thin\",\"#262626\"]},\"font\":{\"name\":\"宋体\"},\"color\":\"#000100\"},{\"textwrap\":true,\"border\":{\"bottom\":[\"thin\",\"#262626\"],\"top\":[\"thin\",\"#262626\"],\"left\":[\"thin\",\"#262626\"],\"right\":[\"thin\",\"#262626\"]},\"color\":\"#000100\",\"font\":{\"name\":\"宋体\"},\"valign\":\"top\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#262626\"],\"top\":[\"thin\",\"#262626\"],\"left\":[\"thin\",\"#262626\"],\"right\":[\"thin\",\"#262626\"]},\"font\":{\"name\":\"宋体\"},\"color\":\"#000100\",\"valign\":\"top\"},{\"textwrap\":true,\"border\":{\"bottom\":[\"thin\",\"#262626\"],\"top\":[\"thin\",\"#262626\"],\"left\":[\"thin\",\"#262626\"],\"right\":[\"thin\",\"#262626\"]},\"color\":\"#000100\",\"font\":{\"name\":\"宋体\"},\"valign\":\"bottom\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#262626\"],\"top\":[\"thin\",\"#262626\"],\"left\":[\"thin\",\"#262626\"],\"right\":[\"thin\",\"#262626\"]},\"font\":{\"name\":\"宋体\"},\"color\":\"#000100\",\"textwrap\":false}],\"validations\":[],\"cols\":{\"0\":{\"width\":35},\"1\":{\"width\":195},\"2\":{\"width\":77},\"3\":{\"width\":168},\"4\":{\"width\":62},\"6\":{\"width\":70},\"7\":{\"width\":82},\"len\":26},\"merges\":[\"D9:F9\",\"E5:F5\",\"E6:F6\",\"E7:F7\",\"E8:F8\",\"G5:H5\",\"G6:H6\",\"G7:H7\",\"G8:H8\",\"G9:H9\",\"B10:H10\",\"B11:H11\",\"D12:H12\",\"A13:H13\",\"A3:C3\",\"A2:H2\",\"A5:A9\"]}', '', 'https://static.jeecg.com/designreport/images/QQ截图20201207135257_1607320433681.png', 'jeecg', '2020-07-10 18:29:39', 'admin', '2021-02-03 14:01:12', 0, NULL, NULL, 1, 142, NULL, NULL, NULL); +INSERT INTO `jimu_report` VALUES ('961455b47c0b86dc961e90b5893bff05', '56780774', '阜阳检票数查询副本0774', '', NULL, 'printinfo', '{\"area\":{\"sri\":8,\"sci\":6,\"eri\":8,\"eci\":6,\"width\":75,\"height\":25},\"printElWidth\":794,\"excel_config_id\":\"53c82a76f837d5661dceec7d93afafec\",\"printElHeight\":1047,\"rows\":{\"0\":{\"cells\":{\"0\":{\"style\":58},\"1\":{\"text\":\"\",\"style\":66},\"2\":{\"style\":66},\"3\":{\"style\":67,\"merge\":[0,3],\"text\":\"阜阳火车站检票数\"},\"4\":{\"style\":67},\"5\":{\"style\":67},\"6\":{\"style\":67},\"7\":{\"style\":66},\"8\":{\"style\":66},\"9\":{\"style\":58}},\"height\":63},\"1\":{\"cells\":{\"0\":{\"style\":58},\"1\":{\"style\":66},\"2\":{\"style\":66},\"3\":{\"style\":66},\"4\":{\"style\":66},\"5\":{\"style\":66},\"6\":{\"style\":66},\"7\":{\"style\":66},\"8\":{\"style\":66},\"9\":{\"style\":58}},\"height\":20},\"2\":{\"cells\":{\"0\":{\"style\":58},\"1\":{\"text\":\"日期:\",\"style\":68},\"2\":{\"text\":\"${gongsi.tdata}\",\"style\":69},\"3\":{\"style\":66},\"4\":{\"style\":66,\"text\":\"制表人:\"},\"5\":{\"text\":\"${gongsi.gname}\",\"style\":66},\"6\":{\"style\":66},\"7\":{\"text\":\"\",\"merge\":[0,1],\"style\":70},\"8\":{\"style\":70},\"9\":{\"style\":58}},\"isDrag\":true},\"3\":{\"cells\":{\"0\":{\"style\":58},\"1\":{\"text\":\"班次\",\"merge\":[1,0],\"style\":71},\"2\":{\"text\":\"发车时间\",\"merge\":[1,0],\"style\":71},\"3\":{\"text\":\"是否放空\",\"merge\":[1,0],\"style\":71},\"4\":{\"text\":\"路线\",\"merge\":[0,1],\"style\":71},\"5\":{\"style\":72},\"6\":{\"text\":\"核载座位数\",\"merge\":[1,0],\"style\":71},\"7\":{\"merge\":[1,0],\"style\":71,\"text\":\"检票数\"},\"8\":{\"merge\":[1,0],\"style\":71,\"text\":\"实载率(%)\"},\"9\":{\"style\":58}}},\"4\":{\"cells\":{\"0\":{\"style\":58},\"1\":{\"style\":72},\"2\":{\"style\":71},\"3\":{\"style\":72},\"4\":{\"text\":\"从\",\"style\":71},\"5\":{\"text\":\"到\",\"style\":71},\"6\":{\"style\":72},\"7\":{\"style\":71},\"8\":{\"style\":72},\"9\":{\"style\":58}},\"height\":25},\"5\":{\"cells\":{\"0\":{\"style\":58},\"1\":{\"style\":73,\"text\":\"#{jianpiao.bnum}\"},\"2\":{\"style\":73,\"text\":\"#{jianpiao.ftime}\"},\"3\":{\"style\":73,\"text\":\"#{jianpiao.sfkong}\"},\"4\":{\"style\":73,\"text\":\"#{jianpiao.kaishi}\"},\"5\":{\"style\":73,\"text\":\"#{jianpiao.jieshu}\"},\"6\":{\"style\":73,\"text\":\"#{jianpiao.hezairen}\"},\"7\":{\"style\":73,\"text\":\"#{jianpiao.jpnum}\"},\"8\":{\"style\":73,\"text\":\"#{jianpiao.shihelv}\"},\"9\":{\"style\":58}},\"height\":33},\"6\":{\"cells\":{\"1\":{\"text\":\"\",\"style\":11},\"2\":{\"style\":11},\"3\":{\"style\":11},\"4\":{\"style\":11},\"5\":{\"style\":11},\"6\":{\"style\":11},\"7\":{\"style\":11},\"8\":{\"style\":11}},\"isDrag\":true},\"7\":{\"cells\":{\"1\":{\"style\":11},\"2\":{\"style\":11,\"text\":\"\"},\"3\":{\"style\":11},\"4\":{\"style\":11},\"5\":{\"style\":11},\"6\":{\"style\":11},\"7\":{\"style\":11},\"8\":{\"style\":11}}},\"8\":{\"cells\":{\"1\":{\"style\":11},\"2\":{\"style\":11},\"3\":{\"style\":11},\"4\":{\"style\":11},\"5\":{\"style\":11},\"6\":{\"style\":11},\"7\":{\"style\":11},\"8\":{\"style\":11}}},\"9\":{\"cells\":{\"1\":{\"style\":11},\"2\":{\"style\":11},\"3\":{\"style\":11},\"4\":{\"style\":11},\"5\":{\"style\":11},\"6\":{\"style\":11},\"7\":{\"style\":11},\"8\":{\"style\":11}}},\"10\":{\"cells\":{\"1\":{\"style\":11},\"2\":{\"style\":11},\"3\":{\"style\":11},\"4\":{\"style\":11},\"5\":{\"style\":11},\"6\":{\"style\":11},\"7\":{\"style\":11},\"8\":{\"style\":11}}},\"11\":{\"cells\":{\"1\":{\"style\":11},\"2\":{\"style\":11},\"3\":{\"style\":11},\"4\":{\"style\":11},\"5\":{\"style\":11},\"6\":{\"style\":11},\"7\":{\"style\":11},\"8\":{\"style\":11}}},\"12\":{\"cells\":{\"1\":{\"style\":11},\"2\":{\"style\":11},\"3\":{\"style\":11},\"4\":{\"style\":11},\"5\":{\"style\":11},\"6\":{\"style\":11},\"7\":{\"style\":11},\"8\":{\"style\":11}}},\"13\":{\"cells\":{\"1\":{\"style\":11},\"2\":{\"style\":11},\"3\":{\"style\":11},\"4\":{\"style\":11},\"5\":{\"style\":11},\"6\":{\"style\":11},\"7\":{\"style\":11},\"8\":{\"style\":11}}},\"14\":{\"cells\":{\"1\":{\"style\":11},\"2\":{\"style\":11},\"3\":{\"style\":11},\"4\":{\"style\":11},\"5\":{\"style\":11},\"6\":{\"style\":11},\"7\":{\"style\":11},\"8\":{\"style\":11}}},\"len\":96,\"-1\":{\"cells\":{\"-1\":{\"text\":\"${gongsi.id}\"}},\"isDrag\":true}},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":794,\"heightPx\":1047},\"dicts\":[],\"freeze\":\"A1\",\"dataRectWidth\":737,\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"align\":\"center\"},{\"align\":\"center\",\"border\":{\"top\":[\"thin\",\"#000\"],\"bottom\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"border\":{\"top\":[\"thin\",\"#000\"],\"bottom\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"border\":{\"top\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"border\":{\"top\":[\"thin\",\"#000\"],\"bottom\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"border\":{\"top\":[\"thin\",\"#000\"],\"bottom\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"border\":{\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{},{\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"],\"top\":[\"thin\",\"#7f7f7f\"],\"left\":[\"thin\",\"#7f7f7f\"],\"right\":[\"thin\",\"#7f7f7f\"]}},{\"border\":{\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"]}},{\"border\":{\"top\":[\"thin\",\"#000100\"]}},{\"border\":{\"top\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"border\":{\"left\":[\"thin\",\"#000100\"]}},{\"border\":{\"right\":[\"thin\",\"#000100\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000100\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"border\":{\"top\":[\"thin\",\"#7f7f7f\"]}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"border\":{\"right\":[\"thin\",\"#7f7f7f\"],\"bottom\":[\"thin\",\"#7f7f7f\"]}},{\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"]}},{\"border\":{\"right\":[\"thin\",\"#7f7f7f\"]}},{\"align\":\"center\",\"font\":{\"size\":16}},{\"align\":\"center\",\"font\":{\"size\":16,\"bold\":true}},{\"font\":{\"bold\":true}},{\"font\":{\"bold\":false}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"font\":{\"bold\":true}},{\"align\":\"center\",\"font\":{\"bold\":true}},{\"align\":\"right\"},{\"align\":\"center\",\"font\":{\"size\":14,\"bold\":true}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"font\":{\"bold\":true},\"bgcolor\":\"#4371c6\"},{\"align\":\"center\",\"font\":{\"bold\":true},\"bgcolor\":\"#4371c6\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"font\":{\"bold\":false},\"bgcolor\":\"#4371c6\"},{\"align\":\"center\",\"font\":{\"bold\":false},\"bgcolor\":\"#4371c6\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"font\":{\"bold\":false},\"bgcolor\":\"#2e75b5\"},{\"align\":\"center\",\"font\":{\"bold\":false},\"bgcolor\":\"#2e75b5\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"font\":{\"bold\":false},\"bgcolor\":\"#5b9cd6\"},{\"align\":\"center\",\"font\":{\"bold\":false},\"bgcolor\":\"#5b9cd6\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"font\":{\"bold\":false},\"bgcolor\":\"#0170c1\"},{\"align\":\"center\",\"font\":{\"bold\":false},\"bgcolor\":\"#0170c1\"},{\"font\":{\"bold\":false},\"color\":\"#7f7f7f\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"font\":{\"bold\":false},\"bgcolor\":\"#9cc2e6\"},{\"align\":\"center\",\"font\":{\"bold\":false},\"bgcolor\":\"#9cc2e6\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"font\":{\"bold\":false},\"bgcolor\":\"#01b0f1\"},{\"align\":\"center\",\"font\":{\"bold\":false},\"bgcolor\":\"#01b0f1\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]},\"font\":{\"bold\":false},\"bgcolor\":\"#5b9cd6\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]},\"font\":{\"bold\":false},\"bgcolor\":\"#9cc2e6\"},{\"align\":\"center\",\"font\":{\"size\":16,\"bold\":true},\"valign\":\"bottom\"},{\"align\":\"center\",\"font\":{\"size\":22,\"bold\":true},\"valign\":\"bottom\"},{\"align\":\"center\",\"font\":{\"size\":18,\"bold\":true},\"valign\":\"bottom\"},{\"font\":{\"bold\":false},\"color\":\"#7f7f7f\",\"align\":\"right\"},{\"color\":\"#7f7f7f\"},{\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"font\":{\"size\":18,\"bold\":true,\"name\":\"宋体\"},\"valign\":\"bottom\"},{\"font\":{\"bold\":false,\"name\":\"宋体\"},\"color\":\"#7f7f7f\",\"align\":\"right\"},{\"color\":\"#7f7f7f\",\"font\":{\"name\":\"宋体\"}},{\"align\":\"right\",\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]},\"font\":{\"bold\":false,\"name\":\"宋体\"},\"bgcolor\":\"#9cc2e6\"},{\"align\":\"center\",\"font\":{\"bold\":false,\"name\":\"宋体\"},\"bgcolor\":\"#9cc2e6\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]},\"font\":{\"name\":\"宋体\"}},{\"font\":{\"name\":\"Microsoft YaHei\"}},{\"align\":\"center\",\"font\":{\"size\":18,\"bold\":true,\"name\":\"Microsoft YaHei\"},\"valign\":\"bottom\"},{\"font\":{\"bold\":false,\"name\":\"Microsoft YaHei\"},\"color\":\"#7f7f7f\",\"align\":\"right\"},{\"color\":\"#7f7f7f\",\"font\":{\"name\":\"Microsoft YaHei\"}},{\"align\":\"right\",\"font\":{\"name\":\"Microsoft YaHei\"}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]},\"font\":{\"bold\":false,\"name\":\"Microsoft YaHei\"},\"bgcolor\":\"#9cc2e6\"},{\"align\":\"center\",\"font\":{\"bold\":false,\"name\":\"Microsoft YaHei\"},\"bgcolor\":\"#9cc2e6\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]},\"font\":{\"name\":\"Microsoft YaHei\"}}],\"validations\":[],\"cols\":{\"0\":{\"width\":53},\"1\":{\"width\":118},\"2\":{\"width\":75},\"3\":{\"width\":54},\"4\":{\"width\":95},\"5\":{\"width\":109},\"6\":{\"width\":75},\"7\":{\"width\":75},\"8\":{\"width\":83},\"9\":{\"width\":30},\"len\":27},\"merges\":[\"E4:F4\",\"B4:B5\",\"C4:C5\",\"D4:D5\",\"G4:G5\",\"H4:H5\",\"I4:I5\",\"D1:G1\",\"H3:I3\"]}', '', 'https://static.jeecg.com/designreport/images/25_1597233573577.png', 'admin', '2021-01-19 10:46:45', 'admin', '2021-02-03 13:58:22', 0, NULL, NULL, 0, 697, NULL, NULL, NULL); +INSERT INTO `jimu_report` VALUES ('9dbadaee8720767efe3164a7d018c870', '45566', '发票打印', '', NULL, 'printinfo', '{\"area\":{\"sri\":8,\"sci\":4,\"eri\":8,\"eci\":4,\"width\":100,\"height\":25},\"printElWidth\":794,\"excel_config_id\":\"9dbadaee8720767efe3164a7d018c870\",\"printElHeight\":500,\"rows\":{\"0\":{\"cells\":{\"0\":{\"text\":\"\",\"virtual\":\"RTA6TUIKs1pmgVOM\"},\"1\":{\"text\":\" \",\"virtual\":\"RTA6TUIKs1pmgVOM\"},\"2\":{\"text\":\" \",\"virtual\":\"RTA6TUIKs1pmgVOM\"},\"3\":{\"text\":\" \",\"virtual\":\"RTA6TUIKs1pmgVOM\"},\"4\":{\"text\":\" \",\"virtual\":\"RTA6TUIKs1pmgVOM\"},\"5\":{\"text\":\" \",\"virtual\":\"RTA6TUIKs1pmgVOM\"},\"6\":{\"text\":\" \",\"virtual\":\"RTA6TUIKs1pmgVOM\"},\"7\":{\"text\":\" \",\"virtual\":\"RTA6TUIKs1pmgVOM\"},\"8\":{\"text\":\" \",\"virtual\":\"RTA6TUIKs1pmgVOM\"}}},\"2\":{\"cells\":{},\"height\":11},\"3\":{\"cells\":{\"2\":{\"text\":\"\"},\"5\":{\"text\":\"\"}},\"height\":18},\"4\":{\"cells\":{\"2\":{\"text\":\"182123434\",\"style\":0},\"5\":{\"text\":\"12345678\"}},\"height\":15},\"5\":{\"cells\":{\"2\":{\"text\":\"\"}}},\"7\":{\"cells\":{}},\"8\":{\"cells\":{\"1\":{\"text\":\"餐饮\"},\"2\":{\"text\":\" A11\"},\"3\":{\"text\":\" 333 3\"},\"4\":{\"text\":\" 3 4\"},\"5\":{\"text\":\" 1\"},\"6\":{\"text\":\"3333\"}}},\"9\":{\"cells\":{\"1\":{\"text\":\"测试\"},\"2\":{\"text\":\" mmm\"},\"3\":{\"text\":\" 33 5\"}}},\"10\":{\"cells\":{},\"height\":22},\"11\":{\"cells\":{\"2\":{\"text\":\" \"},\"3\":{\"text\":\"343434\"},\"6\":{\"text\":\"3434\"}},\"height\":45},\"12\":{\"cells\":{\"4\":{\"text\":\" 刮开中奖\"}},\"height\":12},\"13\":{\"cells\":{\"2\":{\"text\":\"\"},\"4\":{\"text\":\" \"},\"5\":{\"text\":\"备注\"}},\"height\":31},\"14\":{\"cells\":{\"1\":{\"text\":\" 张三\"},\"3\":{\"text\":\"完成\"},\"4\":{\"text\":\" 李思\"}},\"height\":41},\"len\":100},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":794,\"heightPx\":1047},\"dicts\":[],\"freeze\":\"A1\",\"dataRectWidth\":847,\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"font\":{\"size\":8}}],\"validations\":[],\"cols\":{\"0\":{\"width\":93},\"1\":{\"width\":74},\"2\":{\"width\":80},\"len\":26},\"merges\":[],\"imgList\":[{\"row\":0,\"col\":0,\"width\":\"832\",\"height\":\"480\",\"src\":\"https://static.jeecg.com/designreport/images/套打_1609313052910.png\",\"isBackend\":true,\"commonBackend\":true,\"layer_id\":\"RTA6TUIKs1pmgVOM\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[0,0],[0,1],[0,2],[0,3],[0,4],[0,5],[0,6],[0,7],[0,8]]}]}', '', 'https://static.jeecg.com/designreport/images/QQ截图20201207113651_1607312223499.png', 'jeecg', '2020-07-20 18:55:59', 'admin', '2021-02-03 13:38:49', 0, NULL, NULL, 0, 1125, NULL, NULL, NULL); +INSERT INTO `jimu_report` VALUES ('a250846887abe01217aab173d3006489', '56663', '不动产打印', '', NULL, 'printinfo', '{\"loopBlockList\":[],\"area\":false,\"excel_config_id\":\"a250846887abe01217aab173d3006489\",\"printConfig\":{\"paper\":\"A4\",\"width\":210,\"height\":297,\"definition\":1,\"isBackend\":true,\"marginX\":10,\"marginY\":10},\"rows\":{\"0\":{\"cells\":{\"0\":{\"text\":\" \",\"virtual\":\"BJ9o6oelCr85EpT2\"},\"1\":{\"text\":\" \",\"virtual\":\"BJ9o6oelCr85EpT2\"},\"2\":{\"text\":\" \",\"virtual\":\"BJ9o6oelCr85EpT2\"},\"3\":{\"text\":\" \",\"virtual\":\"BJ9o6oelCr85EpT2\"},\"4\":{\"text\":\" \",\"virtual\":\"BJ9o6oelCr85EpT2\"},\"5\":{\"text\":\" \",\"virtual\":\"BJ9o6oelCr85EpT2\"},\"6\":{\"text\":\" \",\"virtual\":\"BJ9o6oelCr85EpT2\"},\"7\":{\"text\":\" \",\"virtual\":\"BJ9o6oelCr85EpT2\"},\"8\":{\"text\":\" \",\"virtual\":\"BJ9o6oelCr85EpT2\"},\"9\":{\"text\":\" \",\"virtual\":\"BJ9o6oelCr85EpT2\"}},\"isDrag\":true,\"height\":45},\"1\":{\"cells\":{},\"height\":23},\"2\":{\"cells\":{\"0\":{\"text\":\"\",\"style\":0},\"1\":{\"text\":\" ${budong.yname}\",\"style\":21,\"merge\":[0,2]}},\"isDrag\":true,\"height\":34},\"3\":{\"cells\":{\"1\":{\"text\":\" ${budong.chanquan}\",\"style\":0,\"merge\":[0,2]},\"5\":{\"text\":\"${budong.beizhu}\",\"merge\":[5,3]}},\"isDrag\":true,\"height\":39},\"4\":{\"cells\":{\"1\":{\"text\":\" ${budong.zhuzhi}\",\"style\":39,\"merge\":[0,2]}},\"isDrag\":true,\"height\":33},\"5\":{\"cells\":{\"1\":{\"text\":\" ${budong.danyuan}\",\"style\":0,\"merge\":[0,2]}},\"isDrag\":true,\"height\":53},\"6\":{\"cells\":{\"1\":{\"text\":\" ${budong.type}\",\"style\":0,\"merge\":[0,2]}},\"isDrag\":true,\"height\":47},\"7\":{\"cells\":{\"1\":{\"text\":\" ${budong.xtype}\",\"style\":0,\"merge\":[0,2]}},\"isDrag\":true,\"height\":38},\"8\":{\"cells\":{\"1\":{\"text\":\" ${budong.suoyou}\",\"style\":0,\"merge\":[0,2]}},\"isDrag\":true,\"height\":31},\"9\":{\"cells\":{\"1\":{\"text\":\" ${budong.mianji}\",\"style\":0,\"merge\":[0,2]}},\"isDrag\":true,\"height\":45},\"10\":{\"cells\":{\"1\":{\"text\":\" ${budong.riqi}\",\"style\":0,\"merge\":[0,2]}},\"isDrag\":true,\"height\":26},\"11\":{\"cells\":{\"1\":{\"text\":\"\",\"style\":0,\"merge\":[0,2]}},\"height\":35},\"12\":{\"cells\":{\"1\":{\"text\":\"\",\"style\":0},\"2\":{\"text\":\"${budong.chanquan}\",\"style\":0,\"merge\":[4,1]}},\"isDrag\":true},\"13\":{\"cells\":{}},\"14\":{\"cells\":{}},\"15\":{\"cells\":{}},\"16\":{\"cells\":{},\"height\":5},\"17\":{\"cells\":{\"2\":{\"text\":\"\",\"style\":0}},\"isDrag\":true,\"height\":33},\"18\":{\"cells\":{\"2\":{\"style\":0,\"text\":\"\"}}},\"len\":100,\"-1\":{\"cells\":{\"0\":{\"text\":\"#{budong.zhuzhi}\"},\"-1\":{\"text\":\"#{budong.suoyou}\"}},\"isDrag\":true}},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":794,\"heightPx\":1047},\"dicts\":[],\"freeze\":\"A1\",\"dataRectWidth\":1024,\"displayConfig\":{},\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"font\":{\"bold\":true}},{\"font\":{\"italic\":true}},{\"font\":{\"italic\":true,\"bold\":true}},{\"font\":{\"italic\":true,\"bold\":false}},{\"font\":{\"italic\":false,\"bold\":false}},{\"font\":{\"italic\":false,\"bold\":true}},{\"align\":\"left\"},{\"align\":\"center\"},{\"align\":\"right\"},{\"align\":\"left\",\"valign\":\"top\"},{\"align\":\"left\",\"valign\":\"top\",\"font\":{\"bold\":true}},{\"font\":{\"bold\":false}},{\"align\":\"left\",\"valign\":\"bottom\"},{\"valign\":\"bottom\"},{\"align\":\"center\",\"valign\":\"bottom\"},{\"textwrap\":true},{\"font\":{\"bold\":true},\"valign\":\"bottom\"},{\"font\":{\"italic\":false,\"bold\":true},\"valign\":\"top\"},{\"valign\":\"top\"},{\"textwrap\":true,\"font\":{\"bold\":true}},{\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"bold\":true}},{\"align\":\"left\",\"valign\":\"bottom\",\"font\":{\"bold\":true}},{\"align\":\"left\",\"valign\":\"bottom\",\"font\":{\"bold\":true,\"size\":8}},{\"font\":{\"bold\":true,\"size\":8},\"valign\":\"bottom\"},{\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"bold\":true,\"size\":8}},{\"align\":\"left\",\"valign\":\"middle\",\"font\":{\"bold\":true}},{\"align\":\"left\",\"valign\":\"middle\"},{\"font\":{\"italic\":false,\"bold\":true},\"valign\":\"bottom\"},{\"font\":{\"italic\":false,\"bold\":true},\"valign\":\"middle\"},{\"valign\":\"middle\"},{\"font\":{\"italic\":true,\"bold\":true},\"valign\":\"middle\"},{\"valign\":\"middle\",\"font\":{\"italic\":true}},{\"valign\":\"middle\",\"font\":{\"italic\":false}},{\"font\":{\"italic\":false,\"bold\":false},\"valign\":\"middle\"},{\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"bold\":true,\"size\":8}},{\"font\":{\"bold\":true,\"size\":8},\"valign\":\"middle\"},{\"align\":\"left\",\"valign\":\"middle\",\"font\":{\"bold\":true,\"size\":8}},{\"align\":\"right\",\"valign\":\"middle\",\"font\":{\"bold\":true,\"size\":8}},{\"font\":{\"italic\":false,\"bold\":true},\"valign\":\"middle\",\"align\":\"center\"},{\"font\":{\"italic\":false,\"bold\":true},\"valign\":\"middle\",\"align\":\"left\"},{\"align\":\"right\",\"valign\":\"bottom\"},{\"align\":\"right\",\"valign\":\"bottom\",\"font\":{\"bold\":true,\"size\":8}},{\"align\":\"center\",\"valign\":\"middle\"}],\"validations\":[],\"cols\":{\"0\":{\"width\":107},\"1\":{\"width\":54},\"2\":{\"width\":135},\"3\":{\"width\":180},\"6\":{\"width\":123},\"8\":{\"width\":25},\"len\":50},\"merges\":[\"B1:B2\",\"B12:D12\",\"B9:D9\",\"B7:D7\",\"B6:D6\",\"B5:D5\",\"B3:D3\",\"B11:D11\",\"B8:D8\",\"B10:D10\",\"C13:D17\",\"C1:C2\",\"B4:D4\",\"F4:I9\",\"D1:D2\"],\"imgList\":[{\"row\":0,\"col\":0,\"width\":\"950\",\"height\":\"683\",\"src\":\"https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/images/38_1610456500965_1617247643815.jpg\",\"isBackend\":true,\"commonBackend\":true,\"layer_id\":\"BJ9o6oelCr85EpT2\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[0,0],[0,1],[0,2],[0,3],[0,4],[0,5],[0,6],[0,7],[0,8],[0,9]]}]}', '', 'https://static.jeecg.com/designreport/images/24_1597233568822.png', 'jeecg', '2020-07-09 10:48:22', 'admin', '2021-06-30 10:16:05', 0, NULL, NULL, 1, 1414, NULL, NULL, NULL); +INSERT INTO `jimu_report` VALUES ('a9f068972508920cd4aab831814f0c04', '23445', '逮捕证', '', NULL, 'printinfo', '{\"loopBlockList\":[],\"area\":false,\"excel_config_id\":\"a9f068972508920cd4aab831814f0c04\",\"printConfig\":{\"paper\":\"A4\",\"width\":210,\"height\":297,\"definition\":1,\"isBackend\":false,\"marginX\":10,\"marginY\":10},\"rows\":{\"0\":{\"cells\":{\"2\":{\"text\":\"\",\"merge\":[0,9],\"style\":324},\"12\":{}},\"isDrag\":true,\"height\":55},\"1\":{\"cells\":{\"1\":{\"style\":410,\"merge\":[0,13],\"text\":\"兰州市经济侦查大队\"},\"15\":{\"style\":324,\"text\":\" \"}},\"height\":128},\"2\":{\"cells\":{\"1\":{\"style\":411,\"merge\":[0,13],\"text\":\"逮捕令\"},\"15\":{\"style\":324,\"text\":\" \"}},\"height\":41},\"3\":{\"cells\":{\"1\":{\"style\":412,\"merge\":[0,12],\"text\":\"第123459663号\"},\"14\":{\"style\":413,\"text\":\" \"}},\"height\":60},\"4\":{\"cells\":{\"1\":{\"style\":414,\"text\":\" \"},\"2\":{\"text\":\" 根据《中华人民共和国刑事诉讼法》第七十八条之规定,\",\"style\":341,\"merge\":[0,11]},\"14\":{\"style\":413,\"text\":\" \"}},\"height\":43},\"5\":{\"cells\":{\"1\":{\"style\":414,\"text\":\" \"},\"2\":{\"style\":341,\"text\":\"经\",\"merge\":[0,1]},\"4\":{\"text\":\"${pdaibu.pname}\",\"style\":342,\"merge\":[0,9]},\"14\":{\"style\":413,\"text\":\" \"}},\"isDrag\":true,\"height\":47},\"6\":{\"cells\":{\"1\":{\"style\":414,\"text\":\" \"},\"2\":{\"style\":344,\"text\":\" \",\"merge\":[0,2]},\"5\":{\"merge\":[0,3],\"text\":\"批准,兹由我局对涉嫌\",\"style\":338},\"9\":{\"text\":\"${pdaibu.shiqing}\",\"style\":347,\"merge\":[0,4]},\"14\":{\"style\":413,\"text\":\" \"}},\"isDrag\":true,\"height\":49},\"7\":{\"cells\":{\"1\":{\"style\":414,\"text\":\" \"},\"2\":{\"style\":341,\"text\":\"的\"},\"3\":{\"text\":\"${pdaibu.fname}\",\"style\":345,\"merge\":[0,1]},\"5\":{\"text\":\"(性别\",\"style\":343},\"6\":{\"text\":\"${pdaibu.fsex}\",\"style\":347,\"merge\":[0,1]},\"8\":{\"style\":346,\"text\":\"出生日期\"},\"9\":{\"text\":\"${pdaibu.cdata}\",\"style\":345,\"merge\":[0,4]},\"14\":{\"style\":413,\"text\":\" \"}},\"isDrag\":true,\"height\":51},\"8\":{\"cells\":{\"1\":{\"style\":414,\"text\":\" \"},\"2\":{\"text\":\"${pdaibu.zhuzhi}\",\"style\":345,\"merge\":[0,7]},\"10\":{\"style\":341,\"text\":\"执行逮捕,送兰州\",\"merge\":[0,3]},\"14\":{\"style\":413,\"text\":\" \"}},\"isDrag\":true,\"height\":51},\"9\":{\"cells\":{\"1\":{\"style\":414,\"text\":\" \"},\"2\":{\"style\":341,\"merge\":[0,6],\"text\":\"市经济侦查大队羁押。\"},\"9\":{\"style\":341,\"text\":\" \"},\"10\":{\"style\":341,\"merge\":[5,1],\"text\":\" \"},\"14\":{\"style\":413,\"text\":\" \"}},\"height\":57},\"10\":{\"cells\":{\"1\":{\"style\":414,\"text\":\" \"},\"4\":{\"style\":338,\"virtual\":\"DId4FGTLnP3vfp4y\",\"text\":\" \"},\"5\":{\"style\":338,\"virtual\":\"DId4FGTLnP3vfp4y\",\"text\":\" \"},\"6\":{\"style\":338,\"virtual\":\"DId4FGTLnP3vfp4y\",\"text\":\" \"},\"14\":{\"style\":413,\"text\":\" \"}},\"height\":61},\"11\":{\"cells\":{\"1\":{\"style\":414,\"text\":\" \"},\"6\":{\"style\":376,\"merge\":[0,2],\"text\":\" \"},\"14\":{\"style\":413,\"text\":\" \"}},\"height\":83},\"12\":{\"cells\":{\"1\":{\"style\":414,\"text\":\" \"},\"2\":{\"merge\":[0,6],\"style\":338,\"text\":\" \"},\"14\":{\"style\":413,\"text\":\" \"}},\"height\":14},\"13\":{\"cells\":{\"1\":{\"style\":414,\"text\":\" \"},\"2\":{\"style\":351,\"merge\":[0,5],\"text\":\" \"},\"8\":{\"style\":380,\"text\":\"公安局印\"},\"9\":{\"text\":\" \",\"virtual\":\"XefZfpEcdS3wI6Ae\"},\"10\":{\"text\":\" \",\"virtual\":\"XefZfpEcdS3wI6Ae\"},\"11\":{\"text\":\" \",\"virtual\":\"XefZfpEcdS3wI6Ae\"},\"14\":{\"style\":413,\"text\":\" \"}},\"height\":89},\"14\":{\"cells\":{\"1\":{\"style\":414,\"text\":\" \"},\"14\":{\"style\":413,\"text\":\" \"}},\"height\":21},\"15\":{\"cells\":{\"1\":{\"style\":415,\"text\":\" \"},\"2\":{\"style\":416,\"text\":\" \"},\"3\":{\"style\":417,\"text\":\" \"},\"4\":{\"style\":417,\"text\":\" \"},\"5\":{\"style\":417,\"text\":\" \"},\"6\":{\"text\":\"${pdaibu.gdata}\",\"style\":421,\"merge\":[0,6]},\"13\":{\"style\":417,\"text\":\" \"},\"14\":{\"style\":419,\"text\":\" \"}},\"isDrag\":true,\"height\":168},\"len\":88,\"-1\":{\"cells\":{\"1\":{\"text\":\"#{daibu.fdata}\"},\"-1\":{\"text\":\"#{pdaibu.shiqing}\"}},\"isDrag\":true}},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":718,\"heightPx\":1047},\"dicts\":[],\"freeze\":\"A1\",\"dataRectWidth\":709,\"displayConfig\":{},\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"align\":\"left\"},{\"align\":\"left\",\"underline\":true},{\"underline\":true},{\"align\":\"center\",\"underline\":true},{\"align\":\"center\"},{\"align\":\"center\",\"underline\":false},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"]}},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]}},{\"align\":\"left\",\"font\":{\"size\":16}},{\"font\":{\"size\":16}},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":16}},{\"align\":\"center\",\"underline\":false,\"font\":{\"size\":16}},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":16}},{\"align\":\"left\",\"font\":{\"size\":16,\"bold\":true}},{\"font\":{\"size\":16,\"bold\":true}},{\"align\":\"center\",\"underline\":false,\"font\":{\"size\":16,\"bold\":true}},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":16,\"bold\":true}},{\"font\":{\"bold\":true}},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":16,\"bold\":true}},{\"align\":\"left\",\"font\":{\"size\":16,\"bold\":false}},{\"font\":{\"size\":16,\"bold\":false}},{\"align\":\"center\",\"underline\":false,\"font\":{\"size\":16,\"bold\":false}},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":16,\"bold\":false}},{\"font\":{\"bold\":false}},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":16,\"bold\":false}},{\"align\":\"left\",\"font\":{\"size\":16,\"bold\":false},\"color\":\"#3f3f3f\"},{\"font\":{\"size\":16,\"bold\":false},\"color\":\"#3f3f3f\"},{\"align\":\"center\",\"underline\":false,\"font\":{\"size\":16,\"bold\":false},\"color\":\"#3f3f3f\"},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":16,\"bold\":false},\"color\":\"#3f3f3f\"},{\"font\":{\"bold\":false},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":16,\"bold\":false},\"color\":\"#3f3f3f\"},{\"font\":{\"size\":12}},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\"},{\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\"},{\"align\":\"center\",\"underline\":false,\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\"},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\"},{\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\",\"align\":\"center\"},{\"font\":{\"size\":12},\"align\":\"center\"},{\"font\":{\"size\":8}},{\"font\":{\"size\":10}},{\"font\":{\"size\":10,\"bold\":true}},{\"font\":{\"size\":10,\"bold\":true},\"align\":\"center\"},{\"font\":{\"size\":18,\"bold\":true},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"size\":18}},{\"font\":{\"size\":16,\"bold\":true},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"size\":16}},{\"font\":{\"size\":12},\"valign\":\"bottom\"},{\"font\":{\"size\":12},\"valign\":\"middle\"},{\"font\":{\"size\":12},\"border\":{\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":12},\"border\":{\"top\":[\"thin\",\"#000\"]}},{\"border\":{\"top\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":12},\"border\":{\"top\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":12},\"border\":{\"left\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":12},\"border\":{\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":12},\"valign\":\"middle\",\"border\":{\"right\":[\"thin\",\"#000\"]}},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"underline\":false,\"border\":{\"right\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\"},{\"align\":\"center\",\"border\":{\"right\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"border\":{\"right\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":12},\"border\":{\"top\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12},\"border\":{\"top\":[\"thick\",\"#000\"]}},{\"border\":{\"top\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12},\"border\":{\"top\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12},\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12},\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12},\"valign\":\"middle\",\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"center\",\"underline\":false,\"border\":{\"right\":[\"thick\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\"},{\"align\":\"center\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]}},{\"border\":{\"bottom\":[\"thick\",\"#000\"]}},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"align\":\"center\",\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"border\":{\"left\":[\"thin\",\"#000\"]}},{\"border\":{\"left\":[\"dashed\",\"#000\"]}},{\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"border\":{\"bottom\":[\"thick\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\"},{\"font\":{\"size\":12},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\"},{\"font\":{\"size\":12,\"bold\":true},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"bold\":true}},{\"font\":{\"size\":14,\"bold\":true},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":14}},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"border\":{\"top\":[\"thick\",\"#000\"]}},{\"border\":{\"top\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Arial\"}},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"name\":\"Arial\"}},{\"font\":{\"size\":14,\"bold\":true,\"name\":\"Arial\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":14,\"name\":\"Arial\"}},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Arial\"}},{\"font\":{\"name\":\"Arial\"}},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"valign\":\"middle\",\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#3f3f3f\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#3f3f3f\"},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#3f3f3f\",\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#3f3f3f\"},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Arial\"}},{\"border\":{\"bottom\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Arial\"}},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Arial\"}},{\"font\":{\"size\":12,\"name\":\"Source Sans Pro\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Source Sans Pro\"},\"border\":{\"top\":[\"thick\",\"#000\"]}},{\"border\":{\"top\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Source Sans Pro\"}},{\"font\":{\"size\":12,\"name\":\"Source Sans Pro\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Source Sans Pro\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"name\":\"Source Sans Pro\"}},{\"font\":{\"size\":14,\"bold\":true,\"name\":\"Source Sans Pro\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":14,\"name\":\"Source Sans Pro\"}},{\"font\":{\"size\":12,\"name\":\"Source Sans Pro\"},\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Source Sans Pro\"}},{\"font\":{\"name\":\"Source Sans Pro\"}},{\"font\":{\"size\":12,\"name\":\"Source Sans Pro\"},\"valign\":\"middle\",\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Source Sans Pro\"},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Source Sans Pro\"},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Source Sans Pro\"},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Source Sans Pro\"},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Source Sans Pro\"},\"color\":\"#3f3f3f\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Source Sans Pro\"},\"color\":\"#3f3f3f\"},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Source Sans Pro\"},\"color\":\"#3f3f3f\",\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Source Sans Pro\"},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Source Sans Pro\"},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Source Sans Pro\"},\"color\":\"#3f3f3f\"},{\"font\":{\"size\":12,\"name\":\"Source Sans Pro\"},\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Source Sans Pro\"}},{\"border\":{\"bottom\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Source Sans Pro\"}},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Source Sans Pro\"}},{\"font\":{\"size\":12,\"name\":\"Comic Sans MS\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Comic Sans MS\"},\"border\":{\"top\":[\"thick\",\"#000\"]}},{\"border\":{\"top\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Comic Sans MS\"}},{\"font\":{\"size\":12,\"name\":\"Comic Sans MS\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Comic Sans MS\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"name\":\"Comic Sans MS\"}},{\"font\":{\"size\":14,\"bold\":true,\"name\":\"Comic Sans MS\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":14,\"name\":\"Comic Sans MS\"}},{\"font\":{\"size\":12,\"name\":\"Comic Sans MS\"},\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Comic Sans MS\"}},{\"font\":{\"name\":\"Comic Sans MS\"}},{\"font\":{\"size\":12,\"name\":\"Comic Sans MS\"},\"valign\":\"middle\",\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Comic Sans MS\"},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Comic Sans MS\"},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Comic Sans MS\"},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Comic Sans MS\"},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Comic Sans MS\"},\"color\":\"#3f3f3f\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Comic Sans MS\"},\"color\":\"#3f3f3f\"},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Comic Sans MS\"},\"color\":\"#3f3f3f\",\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Comic Sans MS\"},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Comic Sans MS\"},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Comic Sans MS\"},\"color\":\"#3f3f3f\"},{\"font\":{\"size\":12,\"name\":\"Comic Sans MS\"},\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Comic Sans MS\"}},{\"border\":{\"bottom\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Comic Sans MS\"}},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Comic Sans MS\"}},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"border\":{\"top\":[\"thick\",\"#000\"]}},{\"border\":{\"top\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Courier New\"}},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"name\":\"Courier New\"}},{\"font\":{\"size\":14,\"bold\":true,\"name\":\"Courier New\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":14,\"name\":\"Courier New\"}},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Courier New\"}},{\"font\":{\"name\":\"Courier New\"}},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"valign\":\"middle\",\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#3f3f3f\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#3f3f3f\"},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#3f3f3f\",\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#3f3f3f\"},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Courier New\"}},{\"border\":{\"bottom\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Courier New\"}},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Courier New\"}},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"border\":{\"top\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"border\":{\"top\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\",\"color\":\"#000100\"},{\"align\":\"center\",\"font\":{\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"font\":{\"size\":14,\"bold\":true,\"name\":\"Courier New\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\",\"color\":\"#000100\"},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":14,\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"font\":{\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"valign\":\"middle\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#000100\",\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"border\":{\"right\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"border\":{\"top\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"border\":{\"top\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Arial\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\",\"color\":\"#000100\"},{\"align\":\"center\",\"font\":{\"name\":\"Arial\"},\"color\":\"#000100\"},{\"font\":{\"size\":14,\"bold\":true,\"name\":\"Arial\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\",\"color\":\"#000100\"},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":14,\"name\":\"Arial\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"color\":\"#000100\"},{\"font\":{\"name\":\"Arial\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"valign\":\"middle\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#000100\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#000100\"},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#000100\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#000100\",\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#000100\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"border\":{\"right\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Arial\"},\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Arial\"},\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Arial\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Helvetica\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Helvetica\"},\"border\":{\"top\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"border\":{\"top\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Helvetica\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Helvetica\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Helvetica\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\",\"color\":\"#000100\"},{\"align\":\"center\",\"font\":{\"name\":\"Helvetica\"},\"color\":\"#000100\"},{\"font\":{\"size\":14,\"bold\":true,\"name\":\"Helvetica\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\",\"color\":\"#000100\"},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":14,\"name\":\"Helvetica\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Helvetica\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Helvetica\"},\"color\":\"#000100\"},{\"font\":{\"name\":\"Helvetica\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Helvetica\"},\"valign\":\"middle\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Helvetica\"},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Helvetica\"},\"color\":\"#000100\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Helvetica\"},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Helvetica\"},\"color\":\"#000100\"},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Helvetica\"},\"color\":\"#000100\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Helvetica\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Helvetica\"},\"color\":\"#000100\",\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Helvetica\"},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Helvetica\"},\"color\":\"#000100\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Helvetica\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Helvetica\"},\"border\":{\"right\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Helvetica\"},\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Helvetica\"},\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Helvetica\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"border\":{\"top\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"border\":{\"top\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\",\"color\":\"#000100\"},{\"align\":\"center\",\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\"},{\"font\":{\"size\":14,\"bold\":true,\"name\":\"Lato\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\",\"color\":\"#000100\"},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":14,\"name\":\"Lato\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"color\":\"#000100\"},{\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"valign\":\"middle\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\"},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\",\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"border\":{\"right\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\"},{\"font\":{\"size\":10,\"name\":\"Lato\"},\"valign\":\"middle\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"color\":\"#000100\",\"align\":\"center\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"color\":\"#000100\",\"align\":\"right\"},{\"align\":\"right\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"left\",\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"left\",\"color\":\"#000100\",\"valign\":\"top\"},{\"align\":\"left\",\"valign\":\"top\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"left\",\"color\":\"#000100\",\"valign\":\"middle\"},{\"align\":\"left\",\"valign\":\"middle\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"left\",\"color\":\"#000100\",\"valign\":\"bottom\"},{\"align\":\"left\",\"valign\":\"bottom\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\",\"color\":\"#000100\",\"valign\":\"bottom\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"right\",\"color\":\"#000100\",\"valign\":\"bottom\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"center\",\"color\":\"#000100\"},{\"font\":{\"size\":14,\"bold\":true,\"name\":\"Lato\"},\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"center\",\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"right\",\"color\":\"#000100\",\"valign\":\"bottom\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\"},{\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"color\":\"#000100\",\"align\":\"right\"},{\"font\":{\"size\":12,\"name\":\"Lato\",\"bold\":true},\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"color\":\"#000100\"},{\"border\":{\"right\":[\"thin\",\"#000\"]}},{},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"color\":\"#000100\",\"align\":\"right\"},{\"font\":{\"size\":12,\"name\":\"Lato\",\"bold\":true},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"align\":\"right\",\"color\":\"#000100\",\"valign\":\"bottom\"},{\"align\":\"center\",\"underline\":false,\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\"},{\"font\":{\"size\":12},\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"]}},{\"align\":\"left\",\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"color\":\"#000100\",\"align\":\"right\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12}},{\"align\":\"center\",\"font\":{\"bold\":false}},{\"align\":\"center\",\"font\":{\"bold\":false,\"size\":12}},{\"align\":\"center\",\"font\":{\"bold\":false,\"size\":12},\"border\":{\"bottom\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"valign\":\"top\"},{\"font\":{\"size\":14,\"name\":\"Lato\"},\"color\":\"#000100\",\"align\":\"center\"},{\"font\":{\"size\":14}},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":16,\"name\":\"Lato\"},\"color\":\"#000100\"},{\"font\":{\"size\":14,\"name\":\"Lato\"},\"align\":\"right\",\"color\":\"#000100\",\"valign\":\"bottom\"},{\"align\":\"left\",\"font\":{\"size\":14,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\"},{\"align\":\"center\",\"font\":{\"bold\":false,\"size\":14},\"border\":{\"bottom\":[\"thin\",\"#000\"]}},{\"font\":{\"name\":\"Lato\",\"size\":14},\"color\":\"#000100\"},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":14,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":14,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\"},{\"font\":{\"size\":14,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\",\"align\":\"center\"},{\"font\":{\"size\":14},\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":14}},{\"align\":\"left\",\"font\":{\"size\":14}},{\"align\":\"left\",\"font\":{\"name\":\"Lato\",\"size\":14},\"color\":\"#000100\"},{\"font\":{\"size\":14,\"name\":\"Lato\"},\"color\":\"#000100\",\"align\":\"right\"},{\"align\":\"left\",\"valign\":\"top\",\"font\":{\"size\":14}},{\"border\":{\"top\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":14,\"name\":\"Lato\"},\"color\":\"#000100\",\"align\":\"center\",\"border\":{\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":16,\"name\":\"Lato\"},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":14,\"name\":\"Lato\"},\"align\":\"right\",\"color\":\"#000100\",\"valign\":\"bottom\",\"border\":{\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"font\":{\"size\":14,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"font\":{\"size\":14,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"center\",\"font\":{\"bold\":false,\"size\":14},\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"align\":\"center\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"font\":{\"size\":14,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\"},{\"border\":{\"right\":[\"thick\",\"#000\"]},\"font\":{\"size\":14}},{\"align\":\"left\",\"font\":{\"size\":14,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\",\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"name\":\"Lato\",\"size\":14},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":14,\"name\":\"Lato\"},\"color\":\"#000100\",\"align\":\"center\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":14},\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":14,\"name\":\"Lato\"},\"color\":\"#000100\",\"align\":\"right\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"color\":\"#000100\",\"align\":\"right\",\"border\":{\"bottom\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":14},\"border\":{\"bottom\":[\"thick\",\"#000\"]}},{\"align\":\"center\",\"font\":{\"bold\":false,\"size\":14}},{\"font\":{\"size\":14},\"align\":\"center\"},{\"font\":{\"size\":14,\"name\":\"Lato\"},\"color\":\"#000100\",\"align\":\"center\",\"border\":{\"top\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"border\":{\"top\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":14,\"name\":\"Lato\"},\"color\":\"#000100\",\"align\":\"center\",\"border\":{\"top\":[\"thick\",\"#000\"]}},{\"border\":{\"top\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"color\":\"#000100\",\"align\":\"right\",\"border\":{\"bottom\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":14},\"align\":\"right\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"]},\"font\":{\"size\":12}},{\"font\":{\"size\":14},\"border\":{\"bottom\":[\"thick\",\"#000\"]},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"]},\"font\":{\"size\":12},\"align\":\"center\"},{\"align\":\"left\",\"valign\":\"middle\",\"font\":{\"size\":14}},{\"border\":{\"top\":[\"thick\",\"#000\"]},\"font\":{\"size\":24}},{\"font\":{\"size\":24}},{\"border\":{\"top\":[\"thick\",\"#000\"]},\"font\":{\"size\":22}},{\"font\":{\"size\":22}},{\"border\":{\"top\":[\"thick\",\"#000\"]},\"font\":{\"size\":18}},{\"font\":{\"size\":18}},{\"border\":{\"top\":[\"thick\",\"#000\"]},\"font\":{\"size\":18,\"bold\":true}},{\"font\":{\"size\":18,\"bold\":true}},{\"border\":{\"top\":[\"thick\",\"#000\"]},\"font\":{\"size\":18,\"bold\":true},\"align\":\"center\"},{\"border\":{\"top\":[\"thick\",\"#000\"]},\"font\":{\"size\":18,\"bold\":false},\"align\":\"center\"},{\"font\":{\"size\":18,\"bold\":false},\"align\":\"center\"},{\"font\":{\"size\":14,\"bold\":true}},{\"border\":{\"top\":[\"thick\",\"#000\"]},\"font\":{\"size\":18,\"bold\":false},\"align\":\"center\",\"valign\":\"bottom\"},{\"font\":{\"size\":18,\"bold\":false},\"align\":\"center\",\"valign\":\"bottom\"},{\"valign\":\"bottom\"},{\"valign\":\"bottom\",\"align\":\"right\"},{\"valign\":\"bottom\",\"align\":\"right\",\"font\":{\"size\":14}},{\"font\":{\"size\":18,\"bold\":false},\"align\":\"center\",\"valign\":\"bottom\",\"border\":{\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":14},\"border\":{\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"valign\":\"bottom\",\"align\":\"right\",\"font\":{\"size\":14},\"border\":{\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"align\":\"left\",\"font\":{\"size\":14,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\",\"border\":{\"right\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"font\":{\"bold\":false,\"size\":14},\"border\":{\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":14},\"align\":\"center\",\"border\":{\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":18,\"bold\":false},\"align\":\"center\",\"valign\":\"bottom\",\"border\":{\"top\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":14},\"border\":{\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"valign\":\"bottom\",\"align\":\"right\",\"font\":{\"size\":14},\"border\":{\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":14},\"align\":\"center\",\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":18,\"bold\":false},\"align\":\"center\",\"valign\":\"bottom\",\"border\":{\"top\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]}},{\"valign\":\"bottom\",\"align\":\"right\",\"font\":{\"size\":14},\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":18,\"bold\":false},\"align\":\"center\",\"valign\":\"bottom\",\"border\":{\"top\":[\"medium\",\"#000\"],\"left\":[\"medium\",\"#000\"],\"right\":[\"medium\",\"#000\"]}},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":14},\"border\":{\"left\":[\"medium\",\"#000\"],\"right\":[\"medium\",\"#000\"]}},{\"valign\":\"bottom\",\"align\":\"right\",\"font\":{\"size\":14},\"border\":{\"left\":[\"medium\",\"#000\"]}},{\"border\":{\"right\":[\"medium\",\"#000\"]}},{\"border\":{\"left\":[\"medium\",\"#000\"]}},{\"border\":{\"bottom\":[\"medium\",\"#000\"],\"left\":[\"medium\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"color\":\"#000100\",\"align\":\"right\",\"border\":{\"bottom\":[\"medium\",\"#000\"]}},{\"border\":{\"bottom\":[\"medium\",\"#000\"]}},{\"font\":{\"size\":12},\"align\":\"center\",\"border\":{\"bottom\":[\"medium\",\"#000\"]}},{\"border\":{\"bottom\":[\"medium\",\"#000\"],\"right\":[\"medium\",\"#000\"]}},{\"align\":\"center\",\"font\":{\"bold\":false,\"size\":14},\"border\":{\"top\":[\"thin\",\"#000\"],\"bottom\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":12},\"align\":\"right\",\"border\":{\"bottom\":[\"medium\",\"#000\"]}},{\"font\":{\"size\":12},\"align\":\"right\"}],\"validations\":[],\"cols\":{\"0\":{\"width\":18},\"1\":{\"width\":21},\"2\":{\"width\":27},\"3\":{\"width\":6},\"4\":{\"width\":87},\"5\":{\"width\":51},\"6\":{\"width\":51},\"7\":{\"width\":1},\"8\":{\"width\":86},\"9\":{\"width\":163},\"10\":{\"width\":1},\"11\":{\"width\":60},\"12\":{\"width\":45},\"13\":{\"width\":49},\"14\":{\"width\":23},\"15\":{\"width\":20},\"len\":50},\"merges\":[\"D8:E8\",\"C6:D6\",\"C10:I10\",\"G8:H8\",\"C9:J9\",\"C1:L1\",\"K10:L15\",\"C13:I13\",\"C14:H14\",\"F7:I7\",\"G12:I12\",\"G16:M16\",\"B4:N4\",\"C5:N5\",\"E6:N6\",\"J7:N7\",\"C7:E7\",\"K9:N9\",\"B2:O2\",\"B3:O3\",\"J8:N8\"],\"imgList\":[{\"row\":13,\"col\":9,\"width\":\"168\",\"height\":\"158\",\"src\":\"https://static.jeecg.com/designreport/images/QQ截图20210105214919_1610075317075.png\",\"layer_id\":\"XefZfpEcdS3wI6Ae\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[13,9],[13,10],[13,11]]}]}', '', 'https://static.jeecg.com/designreport/images/逮捕令_1607070625878.png', 'jeecg', '2020-07-10 13:38:40', 'admin', '2021-04-01 03:17:16', 0, NULL, NULL, 1, 2505, NULL, NULL, NULL); +INSERT INTO `jimu_report` VALUES ('dd482bfd6ca470a0f49d9bb4e61ec694', '202101081046034402', '实习证明副本4402', NULL, NULL, 'printinfo', '{\"area\":false,\"printElWidth\":570,\"excel_config_id\":\"1347373863746539520\",\"printElHeight\":1047,\"rows\":{\"6\":{\"cells\":{\"2\":{\"merge\":[0,1],\"text\":\"实习证明\",\"style\":2},\"3\":{\"style\":2}},\"height\":50},\"8\":{\"cells\":{\"1\":{\"text\":\"#{tt.name}\",\"style\":3},\"2\":{\"merge\":[0,2],\"text\":\"同学在我公司与 2020年4月1日 至 2020年5月1日 实习。\"}}},\"9\":{\"cells\":{\"1\":{\"text\":\"\"}},\"isDrag\":true},\"12\":{\"cells\":{\"1\":{\"merge\":[4,3],\"text\":\"#{tt.pingjia}\",\"style\":6},\"2\":{\"style\":6},\"3\":{\"style\":6},\"4\":{\"style\":6}}},\"13\":{\"cells\":{\"1\":{\"style\":6},\"2\":{\"style\":6},\"3\":{\"style\":6},\"4\":{\"style\":6}}},\"14\":{\"cells\":{\"1\":{\"style\":6},\"2\":{\"style\":6},\"3\":{\"style\":6},\"4\":{\"style\":6}}},\"15\":{\"cells\":{\"1\":{\"style\":6},\"2\":{\"style\":6},\"3\":{\"style\":6},\"4\":{\"style\":6}}},\"16\":{\"cells\":{\"1\":{\"style\":6},\"2\":{\"style\":6},\"3\":{\"style\":6},\"4\":{\"style\":6}}},\"17\":{\"cells\":{\"1\":{\"text\":\"特此证明!\"}}},\"20\":{\"cells\":{\"2\":{\"text\":\"\"},\"3\":{\"text\":\"\",\"style\":3},\"4\":{\"text\":\"\"}}},\"21\":{\"cells\":{\"4\":{\"text\":\"\"}}},\"22\":{\"cells\":{\"3\":{\"text\":\"证明人:\",\"style\":3},\"4\":{\"text\":\"#{tt.lingdao}\"}}},\"23\":{\"cells\":{\"4\":{\"text\":\"#{tt.shijian}\"}}},\"len\":100},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":794,\"heightPx\":1047},\"dicts\":[],\"freeze\":\"A1\",\"dataRectWidth\":487,\"background\":{\"path\":\"https://static.jeecg.com/designreport/images/report_1595906079684_1610075686629.png\",\"repeat\":\"no-repeat\",\"width\":\"\",\"height\":\"\"},\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"size\":14}},{\"align\":\"center\",\"font\":{\"size\":16}},{\"align\":\"right\"},{\"align\":\"left\"},{\"align\":\"left\",\"valign\":\"top\"},{\"align\":\"left\",\"valign\":\"top\",\"textwrap\":true}],\"validations\":[],\"cols\":{\"0\":{\"width\":82},\"1\":{\"width\":86},\"4\":{\"width\":119},\"len\":26},\"merges\":[\"C7:D7\",\"C9:E9\",\"B13:E17\"]}', NULL, 'https://static.jeecg.com/designreport/images/未标题-1_1610074948259.png', 'admin', '2021-01-18 13:21:18', 'admin', '2021-02-02 19:01:05', 1, NULL, NULL, 0, 94, NULL, NULL, NULL); +INSERT INTO `jimu_report` VALUES ('f5f275b5e28b45256ef24587ec792f0c', '202101081641215447', '实例:来源收入统计副本5447', NULL, NULL, 'datainfo', '{\"loopBlockList\":[],\"chartList\":[{\"row\":1,\"col\":1,\"colspan\":8,\"rowspan\":12,\"width\":\"675\",\"height\":\"289\",\"config\":\"{\\\"legend\\\":{\\\"padding\\\":[25,20,25,10],\\\"data\\\":[\\\"中国石油全资(集团所属)\\\",\\\"中国石油全资(股份所属)\\\",\\\"中石油控股或有控股权\\\",\\\"中石油参股\\\",\\\"非中石油\\\"],\\\"top\\\":\\\"top\\\",\\\"orient\\\":\\\"vertical\\\",\\\"left\\\":\\\"right\\\",\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#333\\\",\\\"fontSize\\\":12}},\\\"series\\\":[{\\\"isRose\\\":false,\\\"data\\\":[{\\\"name\\\":\\\"中国石油全资(集团所属)\\\",\\\"value\\\":38460270.57,\\\"itemStyle\\\":{\\\"color\\\":\\\"#E46C8A\\\"}},{\\\"name\\\":\\\"中国石油全资(股份所属)\\\",\\\"value\\\":227595.77,\\\"itemStyle\\\":{\\\"color\\\":\\\"#FCDE43\\\"}},{\\\"name\\\":\\\"中石油控股或有控股权\\\",\\\"value\\\":679926.75,\\\"itemStyle\\\":{\\\"color\\\":\\\"#01A8E1\\\"}},{\\\"name\\\":\\\"中石油参股\\\",\\\"value\\\":72062.75,\\\"itemStyle\\\":{\\\"color\\\":\\\"#99CC00\\\"}},{\\\"name\\\":\\\"非中石油\\\",\\\"value\\\":1698597.62,\\\"itemStyle\\\":{\\\"color\\\":\\\"#800080\\\"}}],\\\"isRadius\\\":false,\\\"roseType\\\":\\\"\\\",\\\"notCount\\\":false,\\\"center\\\":[320,180],\\\"name\\\":\\\"total\\\",\\\"minAngle\\\":0,\\\"label\\\":{\\\"show\\\":false,\\\"position\\\":\\\"outside\\\",\\\"textStyle\\\":{\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"bolder\\\"}},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":\\\"55%\\\",\\\"autoSort\\\":false}],\\\"tooltip\\\":{\\\"formatter\\\":\\\"{b} : {c}\\\",\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":18}},\\\"title\\\":{\\\"show\\\":true,\\\"top\\\":5,\\\"text\\\":\\\"来源收入统计\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#c23531\\\",\\\"fontWeight\\\":\\\"bolder\\\",\\\"fontSize\\\":18},\\\"left\\\":\\\"center\\\",\\\"padding\\\":[5,20,5,10]}}\",\"url\":\"\",\"extData\":{\"dataType\":\"sql\",\"apiStatus\":\"\",\"apiUrl\":\"\",\"dataId\":\"4af57d343f1d6521b71b85097b580786\",\"axisX\":\"biz_income\",\"axisY\":\"total\",\"series\":\"\",\"yText\":\"total\",\"xText\":\"biz_income\",\"dbCode\":\"tmp_report_data_income\",\"dataId1\":\"\",\"source\":\"\",\"target\":\"\",\"isTiming\":true,\"intervalTime\":\"5\",\"chartType\":\"pie.simple\",\"id\":\"\"},\"layer_id\":\"nVUy533exgQ70OPb\",\"offsetX\":0,\"offsetY\":0,\"backgroud\":{\"enabled\":false,\"color\":\"#fff\",\"image\":\"\"},\"virtualCellRange\":[[1,1],[1,2],[1,3],[1,4],[1,5],[1,6],[1,7],[1,8]]}],\"area\":{\"sri\":15,\"sci\":14,\"eri\":15,\"eci\":14,\"width\":100,\"height\":25},\"excel_config_id\":\"f5f275b5e28b45256ef24587ec792f0c\",\"printConfig\":{\"paper\":\"A4\",\"width\":210,\"height\":297,\"definition\":1,\"isBackend\":false,\"marginX\":10,\"marginY\":10,\"layout\":\"portrait\"},\"zonedEditionList\":[],\"rows\":{\"1\":{\"cells\":{\"1\":{\"text\":\" \",\"virtual\":\"nVUy533exgQ70OPb\"},\"2\":{\"text\":\" \",\"virtual\":\"nVUy533exgQ70OPb\"},\"3\":{\"text\":\" \",\"virtual\":\"nVUy533exgQ70OPb\"},\"4\":{\"text\":\" \",\"virtual\":\"nVUy533exgQ70OPb\"},\"5\":{\"text\":\" \",\"virtual\":\"nVUy533exgQ70OPb\"},\"6\":{\"text\":\" \",\"virtual\":\"nVUy533exgQ70OPb\"},\"7\":{\"text\":\" \",\"virtual\":\"nVUy533exgQ70OPb\"},\"8\":{\"text\":\" \",\"virtual\":\"nVUy533exgQ70OPb\"}}},\"3\":{\"cells\":{}},\"16\":{\"cells\":{\"1\":{\"text\":\"业务来源\",\"style\":1},\"2\":{\"text\":\"保险经纪佣金费\",\"style\":1},\"3\":{\"text\":\"风险咨询费\",\"style\":1},\"4\":{\"text\":\"承保公证评估费\",\"style\":1},\"5\":{\"text\":\"保险公证费\",\"style\":1},\"6\":{\"text\":\"投标咨询费\",\"style\":1},\"7\":{\"text\":\"内控咨询费\",\"style\":1},\"8\":{\"text\":\"总计\",\"style\":1}}},\"17\":{\"cells\":{\"1\":{\"text\":\"#{tmp_report_data_income.biz_income}\",\"style\":0},\"2\":{\"text\":\"#{tmp_report_data_income.bx_jj_yongjin}\",\"style\":0},\"3\":{\"text\":\"#{tmp_report_data_income.bx_zx_money}\",\"style\":0},\"4\":{\"text\":\"#{tmp_report_data_income.chengbao_gz_money}\",\"style\":0},\"5\":{\"text\":\"#{tmp_report_data_income.bx_gg_moeny}\",\"style\":0},\"6\":{\"text\":\"#{tmp_report_data_income.tb_zx_money}\",\"style\":0},\"7\":{\"text\":\"#{tmp_report_data_income.neikong_zx_money}\",\"style\":0},\"8\":{\"text\":\"#{tmp_report_data_income.total}\",\"style\":0}},\"isDrag\":true,\"height\":24},\"len\":58},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":794,\"heightPx\":1047},\"dicts\":[],\"rpbar\":{\"show\":true,\"btnList\":[]},\"freeze\":\"A1\",\"dataRectWidth\":701,\"displayConfig\":{},\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"bgcolor\":\"#33CCCC\"}],\"validations\":[],\"cols\":{\"0\":{\"width\":15},\"1\":{\"width\":105},\"2\":{\"width\":119},\"3\":{\"width\":87},\"4\":{\"width\":61},\"5\":{\"width\":63},\"6\":{\"width\":60},\"7\":{\"width\":91},\"len\":50},\"merges\":[]}', NULL, NULL, 'admin', '2021-01-18 13:21:14', 'admin', '2021-10-11 09:47:48', 0, NULL, NULL, 0, 104, NULL, NULL, NULL); +INSERT INTO `jimu_report` VALUES ('f6ee801e8bdc28ba9d63f95dc65ccd79', '4556633', '采购单', '', NULL, 'printinfo', '{\"loopBlockList\":[],\"area\":false,\"excel_config_id\":\"f6ee801e8bdc28ba9d63f95dc65ccd79\",\"printConfig\":{\"paper\":\"A4\",\"width\":210,\"height\":297,\"definition\":1,\"isBackend\":false,\"marginX\":10,\"marginY\":10},\"rows\":{\"0\":{\"cells\":{\"1\":{\"text\":\"采购单\",\"style\":21,\"merge\":[0,6]}},\"height\":89},\"1\":{\"cells\":{\"1\":{\"text\":\"产品名称\",\"style\":23},\"2\":{\"text\":\"产品数量\",\"style\":23},\"3\":{\"text\":\"单价\",\"style\":23},\"4\":{\"text\":\"库存量\",\"style\":23},\"5\":{\"text\":\"库存总值\",\"style\":23},\"6\":{\"text\":\"订购量\",\"style\":23},\"7\":{\"text\":\"二次订购量\",\"style\":23}},\"height\":45},\"2\":{\"cells\":{\"1\":{\"style\":24,\"text\":\"#{caigou.cname}\"},\"2\":{\"style\":24,\"text\":\"#{caigou.cnum}\"},\"3\":{\"style\":24,\"text\":\"#{caigou.cprice}\"},\"4\":{\"style\":24,\"text\":\"#{caigou.ctotal}\"},\"5\":{\"style\":24,\"text\":\"#{caigou.tp}\"},\"6\":{\"style\":24,\"text\":\"#{caigou.dtotal}\"},\"7\":{\"style\":24,\"text\":\"#{caigou.ztotal}\"}},\"height\":26},\"5\":{\"cells\":{\"1\":{\"text\":\"\"}},\"isDrag\":true},\"6\":{\"cells\":{\"1\":{\"text\":\"\"}},\"isDrag\":true},\"7\":{\"cells\":{\"1\":{\"text\":\"\"},\"2\":{\"text\":\"\"}},\"isDrag\":true},\"len\":100},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":718,\"heightPx\":1047},\"dicts\":[],\"freeze\":\"A1\",\"dataRectWidth\":682,\"displayConfig\":{},\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"align\":\"center\"},{\"align\":\"center\",\"color\":\"#000100\"},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#01b0f1\"],\"top\":[\"thin\",\"#01b0f1\"],\"left\":[\"thin\",\"#01b0f1\"],\"right\":[\"thin\",\"#01b0f1\"]}},{\"border\":{\"bottom\":[\"thin\",\"#01b0f1\"],\"top\":[\"thin\",\"#01b0f1\"],\"left\":[\"thin\",\"#01b0f1\"],\"right\":[\"thin\",\"#01b0f1\"]}},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#01b0f1\"],\"top\":[\"thin\",\"#01b0f1\"],\"left\":[\"thin\",\"#01b0f1\"],\"right\":[\"thin\",\"#01b0f1\"]},\"bgcolor\":\"#01b0f1\"},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]},\"bgcolor\":\"#01b0f1\"},{\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"align\":\"center\",\"font\":{\"size\":18}},{\"align\":\"center\",\"font\":{\"size\":18,\"bold\":true}},{\"align\":\"center\",\"font\":{\"size\":16,\"bold\":true}},{\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]},\"align\":\"center\"},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]},\"bgcolor\":\"#9cc2e6\"},{\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"font\":{\"size\":16,\"bold\":true,\"name\":\"宋体\"}},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]},\"bgcolor\":\"#9cc2e6\",\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]},\"align\":\"center\",\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#9cc2e6\",\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"align\":\"center\",\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#5b9cd6\",\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#5b9cd6\",\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"font\":{\"size\":16,\"bold\":true,\"name\":\"Microsoft YaHei\"}},{\"font\":{\"name\":\"Microsoft YaHei\"}},{\"align\":\"center\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#5b9cd6\",\"font\":{\"name\":\"Microsoft YaHei\"}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"align\":\"center\",\"font\":{\"name\":\"Microsoft YaHei\"}}],\"validations\":[],\"cols\":{\"0\":{\"width\":43},\"1\":{\"width\":114},\"2\":{\"width\":109},\"3\":{\"width\":78},\"4\":{\"width\":77},\"5\":{\"width\":84},\"6\":{\"width\":82},\"7\":{\"width\":95},\"len\":50},\"merges\":[\"B1:H1\"]}', '', 'https://static.jeecg.com/designreport/images/caigou_1607310279439.png', 'jeecg', '2020-07-28 16:54:44', 'admin', '2021-04-01 03:09:41', 0, NULL, NULL, 1, 1248, NULL, NULL, NULL); +INSERT INTO `jimu_report` VALUES ('ff9bd143582a6dfed897ba8b6f93b175', '56696', '销售公司出库单', '', NULL, 'printinfo', '{\"area\":{\"sri\":4,\"sci\":0,\"eri\":4,\"eci\":0,\"width\":32,\"height\":25},\"printElWidth\":794,\"excel_config_id\":\"ff9bd143582a6dfed897ba8b6f93b175\",\"printElHeight\":800,\"rows\":{\"0\":{\"cells\":{\"0\":{\"style\":11,\"text\":\"医疗器械销售公司出货单\",\"merge\":[0,9]}},\"height\":83},\"1\":{\"cells\":{\"0\":{\"text\":\"供货单位:\",\"style\":20,\"merge\":[0,1]},\"1\":{\"style\":30},\"2\":{\"text\":\"${gongsi.gname}\",\"style\":19},\"3\":{\"style\":19},\"4\":{\"text\":\"供货日期:\",\"style\":19},\"5\":{\"text\":\"${gongsi.gdata}\",\"style\":19,\"merge\":[0,1]},\"6\":{\"style\":19},\"7\":{\"text\":\"编号:\",\"style\":20},\"8\":{\"text\":\"${gongsi.num}\",\"style\":19,\"merge\":[0,1]},\"9\":{\"style\":19}},\"isDrag\":true},\"2\":{\"cells\":{\"0\":{\"text\":\"行号\",\"style\":39},\"1\":{\"text\":\"产品代码\",\"style\":39},\"2\":{\"text\":\"产品名称\",\"style\":39},\"3\":{\"text\":\"规格型号\",\"style\":39},\"4\":{\"text\":\"单位\",\"style\":39},\"5\":{\"text\":\"实发数量\",\"style\":39},\"6\":{\"text\":\"销售单价(元)\",\"style\":39},\"7\":{\"text\":\"折扣率(%)\",\"style\":39},\"8\":{\"text\":\"销售金额(元)\",\"style\":39},\"9\":{\"text\":\"备注\",\"style\":39}}},\"3\":{\"cells\":{\"0\":{\"style\":35,\"text\":\"#{xiaoshou.id}\"},\"1\":{\"style\":35,\"text\":\"#{xiaoshou.hnum}\"},\"2\":{\"style\":35,\"text\":\"#{xiaoshou.hname}\"},\"3\":{\"style\":35,\"text\":\"#{xiaoshou.xinghao}\"},\"4\":{\"style\":35,\"text\":\"#{xiaoshou.danwei}\"},\"5\":{\"style\":35,\"text\":\"#{xiaoshou.num}\"},\"6\":{\"style\":35,\"text\":\"#{xiaoshou.danjia}\"},\"7\":{\"style\":35,\"text\":\"#{xiaoshou.zhekoulv}\"},\"8\":{\"style\":35,\"text\":\"#{xiaoshou.xiaoshoujine}\"},\"9\":{\"style\":35,\"text\":\"#{xiaoshou.xiaoshoujine}\"}}},\"4\":{\"cells\":{\"0\":{\"style\":4},\"1\":{}},\"isDrag\":true},\"len\":84,\"-1\":{\"cells\":{\"0\":{\"text\":\"#{gongsi.gdata}\"},\"-1\":{\"text\":\"#{gongsi.didian}\"}},\"isDrag\":true}},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":794,\"heightPx\":1047},\"dicts\":[],\"freeze\":\"A1\",\"dataRectWidth\":794,\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"center\"},{\"font\":{\"size\":16}},{\"font\":{\"size\":16},\"align\":\"center\"},{\"align\":\"center\"},{\"border\":{\"top\":[\"thin\",\"#000\"],\"bottom\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"]}},{\"border\":{\"top\":[\"thin\",\"#000\"],\"bottom\":[\"thin\",\"#000\"]}},{\"border\":{\"top\":[\"thin\",\"#000\"],\"bottom\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"right\"},{\"align\":\"right\"},{\"align\":\"center\",\"font\":{\"size\":14}},{\"align\":\"center\",\"font\":{\"size\":14,\"bold\":true}},{\"align\":\"center\",\"font\":{\"size\":9}},{\"font\":{\"size\":9}},{\"align\":\"right\",\"font\":{\"size\":9}},{\"align\":\"center\",\"font\":{\"size\":8}},{\"font\":{\"size\":8}},{\"align\":\"right\",\"font\":{\"size\":8}},{\"align\":\"center\",\"font\":{\"size\":8},\"color\":\"#7f7f7f\"},{\"font\":{\"size\":8},\"color\":\"#7f7f7f\"},{\"align\":\"right\",\"font\":{\"size\":8},\"color\":\"#7f7f7f\"},{\"align\":\"center\",\"font\":{\"size\":8},\"color\":\"#3f3f3f\"},{\"font\":{\"size\":8},\"color\":\"#3f3f3f\"},{\"align\":\"right\",\"font\":{\"size\":8},\"color\":\"#3f3f3f\"},{\"align\":\"center\",\"font\":{\"size\":8},\"color\":\"#262626\"},{\"font\":{\"size\":8},\"color\":\"#262626\"},{\"align\":\"right\",\"font\":{\"size\":8},\"color\":\"#262626\"},{\"align\":\"center\",\"font\":{\"size\":8},\"color\":\"#0c0c0c\"},{\"font\":{\"size\":8},\"color\":\"#0c0c0c\"},{\"align\":\"right\",\"font\":{\"size\":8},\"color\":\"#0c0c0c\"},{\"align\":\"right\",\"color\":\"#7f7f7f\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"center\",\"bgcolor\":\"#71ae47\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"bgcolor\":\"#71ae47\"},{\"border\":{\"bottom\":[\"thin\",\"#538136\"],\"top\":[\"thin\",\"#538136\"],\"left\":[\"thin\",\"#538136\"],\"right\":[\"thin\",\"#538136\"]},\"align\":\"center\",\"bgcolor\":\"#71ae47\"},{\"border\":{\"bottom\":[\"thin\",\"#538136\"],\"top\":[\"thin\",\"#538136\"],\"left\":[\"thin\",\"#538136\"],\"right\":[\"thin\",\"#538136\"]},\"bgcolor\":\"#71ae47\"},{\"border\":{\"bottom\":[\"thin\",\"#538136\"],\"top\":[\"thin\",\"#538136\"],\"left\":[\"thin\",\"#538136\"],\"right\":[\"thin\",\"#538136\"]},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#538136\"],\"top\":[\"thin\",\"#538136\"],\"left\":[\"thin\",\"#538136\"],\"right\":[\"thin\",\"#538136\"]}},{\"border\":{\"bottom\":[\"thin\",\"#538136\"],\"top\":[\"thin\",\"#538136\"],\"left\":[\"thin\",\"#538136\"],\"right\":[\"thin\",\"#538136\"]},\"align\":\"center\",\"bgcolor\":\"#c5e0b3\"},{\"border\":{\"bottom\":[\"thin\",\"#538136\"],\"top\":[\"thin\",\"#538136\"],\"left\":[\"thin\",\"#538136\"],\"right\":[\"thin\",\"#538136\"]},\"bgcolor\":\"#c5e0b3\"},{\"border\":{\"bottom\":[\"thin\",\"#538136\"],\"top\":[\"thin\",\"#538136\"],\"left\":[\"thin\",\"#538136\"],\"right\":[\"thin\",\"#538136\"]},\"align\":\"center\",\"bgcolor\":\"#a7d08c\"},{\"border\":{\"bottom\":[\"thin\",\"#538136\"],\"top\":[\"thin\",\"#538136\"],\"left\":[\"thin\",\"#538136\"],\"right\":[\"thin\",\"#538136\"]},\"bgcolor\":\"#a7d08c\"}],\"validations\":[],\"cols\":{\"0\":{\"width\":32},\"1\":{\"width\":65},\"2\":{\"width\":115},\"3\":{\"width\":70},\"4\":{\"width\":52},\"5\":{\"width\":70},\"6\":{\"width\":93},\"7\":{\"width\":86},\"8\":{\"width\":75},\"9\":{\"width\":136},\"10\":{\"width\":81},\"len\":24},\"merges\":[\"F2:G2\",\"F2:G2\",\"I2:J2\",\"A2:B2\",\"C2:D2\",\"A2:B2\",\"A1:J1\"]}', '', 'https://static.jeecg.com/designreport/images/医疗器械_1607070355110.png', 'jeecg', '2020-06-16 11:54:02', 'admin', '2021-02-02 19:34:39', 0, NULL, NULL, 0, 764, NULL, NULL, NULL); + +-- ---------------------------- +-- Table structure for jimu_report_data_source +-- ---------------------------- +DROP TABLE IF EXISTS `jimu_report_data_source`; +CREATE TABLE `jimu_report_data_source` ( + `id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '数据源名称', + `report_id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '报表_id', + `code` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '编码', + `remark` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注', + `db_type` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '数据库类型', + `db_driver` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '驱动类', + `db_url` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '数据源地址', + `db_username` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '用户名', + `db_password` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '密码', + `create_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建日期', + `update_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '更新人', + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新日期', + `connect_times` int(0) UNSIGNED NULL DEFAULT 0 COMMENT '连接失败次数', + `tenant_id` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '多租户标识', + `type` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '类型(report:报表;drag:仪表盘)', + PRIMARY KEY (`id`) USING BTREE, + INDEX `idx_jmdatasource_report_id`(`report_id`) USING BTREE, + INDEX `idx_jmdatasource_code`(`code`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of jimu_report_data_source +-- ---------------------------- +INSERT INTO `jimu_report_data_source` VALUES ('1324261983692902402', 'jeewx', '1324261770294071296', '', NULL, 'MYSQL', 'com.mysql.jdbc.Driver', 'jdbc:mysql://127.0.0.1:3309/jeewx-boot?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8', 'root', 'root', 'jeecg', '2020-11-05 16:07:15', NULL, '2020-11-05 16:07:15', 0, NULL, 'report'); +INSERT INTO `jimu_report_data_source` VALUES ('26d21fe4f27920d2f56abc8d90a8e527', 'oracle', '1308645288868712448', '', NULL, 'ORACLE', 'oracle.jdbc.OracleDriver', 'jdbc:oracle:thin:@192.168.1.199:1521:helowin', 'jeecgbootbpm', 'jeecg196283', 'admin', '2021-01-05 19:26:24', NULL, '2021-01-05 19:26:24', 1, NULL, 'report'); +INSERT INTO `jimu_report_data_source` VALUES ('8f90daf47d15d35ca6cf420748b8b9ba', 'localhost', '1316944968992034816', '', NULL, 'MYSQL5.7', 'com.mysql.cj.jdbc.Driver', 'jdbc:mysql://127.0.0.1:3309/jeecg-boot?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8', 'root', 'root', 'admin', '2021-01-13 14:34:00', NULL, '2021-01-13 14:34:00', 0, NULL, 'report'); + +-- ---------------------------- +-- Table structure for jimu_report_db +-- ---------------------------- +DROP TABLE IF EXISTS `jimu_report_db`; +CREATE TABLE `jimu_report_db` ( + `id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'id', + `jimu_report_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '主键字段', + `create_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建人登录名称', + `update_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '更新人登录名称', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建日期', + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新日期', + `db_code` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '数据集编码', + `db_ch_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '数据集名字', + `db_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '数据源类型', + `db_table_name` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '数据库表名', + `db_dyn_sql` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '动态查询SQL', + `db_key` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '数据源KEY', + `tb_db_key` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '填报数据源', + `tb_db_table_name` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '填报数据表', + `java_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'java类数据集 类型(spring:springkey,class:java类名)', + `java_value` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'java类数据源 数值(bean key/java类名)', + `api_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '请求地址', + `api_method` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '请求方法0-get,1-post', + `is_list` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '是否是列表0否1是 默认0', + `is_page` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '是否作为分页,0:不分页,1:分页', + `db_source` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '数据源', + `db_source_type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '数据库类型 MYSQL ORACLE SQLSERVER', + `json_data` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT 'json数据,直接解析json内容', + `api_convert` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'api转换器', + PRIMARY KEY (`id`) USING BTREE, + INDEX `idx_jmreportdb_db_key`(`db_key`) USING BTREE, + INDEX `idx_jimu_report_id`(`jimu_report_id`) USING BTREE, + INDEX `idx_db_source_id`(`db_source`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of jimu_report_db +-- ---------------------------- +INSERT INTO `jimu_report_db` VALUES ('1272834687525482497', '53c82a76f837d5661dceec7d93afafec', 'admin', NULL, '2021-01-04 20:42:17', '2021-01-04 20:42:17', 'jianpiao', 'jianpiao', '0', NULL, 'select * from rep_demo_jianpiao where s_id=\'${id}\'', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '1', '1', NULL, 'MYSQL', NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('1272858455908073473', 'ff9bd143582a6dfed897ba8b6f93b175', 'admin', NULL, '2020-12-14 16:21:09', '2020-12-14 16:21:09', 'xiaoshou', 'xiaoshou', '0', NULL, 'select * from rep_demo_xiaoshou where s_id=\'${id}\'', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '1', '1', NULL, 'MYSQL', NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('1273495682564534273', 'ff9bd143582a6dfed897ba8b6f93b175', 'admin', NULL, '2020-09-28 10:18:07', '2020-12-14 16:21:09', 'gongsi', 'gongsi', '0', NULL, 'select * from rep_demo_gongsi where id=\'${id}\'', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '0', '0', NULL, 'MYSQL', NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('1283730831482937345', '6059e405dd9c66a6d38e00841d2e40cc', 'admin', NULL, '2020-12-04 16:53:38', '2020-12-04 16:53:38', 'yaopin', 'yaopin', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/baobiao/chufangjian', '0', '0', '0', NULL, 'MYSQL', NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('1283957016150249473', '6059e405dd9c66a6d38e00841d2e40cc', NULL, NULL, '2020-07-17 10:49:42', NULL, 'yonghu', 'yonghu', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/baobiao/yonghu', '0', '0', NULL, NULL, 'MYSQL', NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('1284070508744257537', 'a250846887abe01217aab173d3006489', NULL, NULL, '2020-07-17 15:33:53', '2020-07-20 17:50:49', 'budong', 'budong', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/baobiao/budongchan', '0', '0', NULL, NULL, 'MYSQL', NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('1285157606524002305', 'a9f068972508920cd4aab831814f0c04', 'admin', 'admin', '2021-04-01 02:44:48', '2021-04-01 02:44:48', 'pdaibu', 'pdaibu', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/baobiao/daibu', '0', '0', '0', '', 'MYSQL', NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('1285164420728692737', '7905022412733a0c68dc7b4ef8947489', NULL, NULL, '2020-07-20 18:47:30', NULL, 'jieshaoxin', 'jieshaoxin', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/baobiao/jieshaoxin', '0', '0', NULL, NULL, 'MYSQL', NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('1285178919099637762', '6d6bdcb5e820c301ea32789e3ae43c44', NULL, NULL, '2020-07-20 19:45:06', NULL, 'qiangxiu', 'qiangxiu', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/baobiao/qiangxiu', '0', '0', NULL, NULL, 'MYSQL', NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('1288038655293661186', 'f6ee801e8bdc28ba9d63f95dc65ccd79', 'admin', 'admin', '2021-04-01 03:09:40', '2021-04-01 03:09:40', 'caigou', 'caigou', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/baobiao/caigou?pageNo=\'${pageNo}\'&pageSize=\'${pageSize}\'', '0', '1', '1', '', NULL, NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('1289140698221678593', '519c1c6f4d1f584ae8fa5b43b45acdc7', 'admin', 'admin', '2021-04-01 03:09:23', '2021-04-01 03:09:23', 'xiaoshou', 'xiaoshou', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/baobiao/xiaoshou?pageNo=\'${pageNo}\'&pageSize=\'${pageSize}\'', '0', '1', '1', '', NULL, NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('1290104038414721025', '53c82a76f837d5661dceec7d93afafec', 'admin', NULL, '2021-01-04 20:47:07', '2021-01-04 20:47:07', 'gongsi', 'gongsi', '0', NULL, 'select * from rep_demo_gongsi where id=\'${id}\'', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '0', '0', '', 'MYSQL', NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('1316987047604514817', '1314846205892759552', 'admin', NULL, '2021-01-08 10:36:58', '2021-01-08 10:36:58', 'yuangongjiben', 'yuangongjiben', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/yuangongjiben', '0', '0', '0', '', NULL, NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('1316997232402231298', '1316944968992034816', 'admin', NULL, '2021-01-13 14:34:06', '2021-01-13 14:34:06', 'employee', 'employee', '0', NULL, 'select * from rep_demo_employee where id=\'${id}\'', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '1', '0', '', '', NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('1317006713165049858', '1314846205892759552', 'admin', NULL, '2021-01-11 14:38:14', '2021-01-11 14:38:14', 'xueli', 'xueli', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/xueli', '0', '1', '0', '', NULL, NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('1317007979484147714', '1314846205892759552', 'admin', NULL, '2021-01-08 10:40:31', '2021-01-08 10:40:31', 'uu', 'uu', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/gongzuojingli', '0', '1', '0', '', NULL, NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('1317009166140829698', '1314846205892759552', 'admin', NULL, '2020-10-16 15:47:09', '2021-01-05 15:33:58', 'zhengshu', 'zhengshu', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/zhengshu', '0', '0', '0', '', NULL, NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('1317013474634756097', '1314846205892759552', 'admin', NULL, '2020-10-16 16:04:16', '2021-01-05 15:33:58', 'jtcy', 'jtcy', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/jtcy', '0', '0', '0', '', NULL, NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('1317015169494282241', '1314846205892759552', 'admin', NULL, '2020-10-16 16:11:00', '2021-01-05 15:33:58', 'jiangli', 'jiangli', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/jiangli', '0', '0', '0', '', NULL, NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('1331511745851731969', '1331503965770223616', 'admin', NULL, '2020-11-25 16:15:13', '2020-11-25 16:15:13', 'chengjiao', 'chengjiao', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/chengjiao', '0', '0', '0', '', NULL, NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('1331514838211407873', '1331503965770223616', 'admin', NULL, '2020-11-25 16:27:30', '2020-11-25 16:27:30', 'cjpaihang', 'cjpaihang', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/cjpaihang', '0', '0', '0', '', NULL, NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('1331514935028527106', '1331503965770223616', 'admin', NULL, '2020-11-25 16:27:54', '2020-11-25 16:27:54', 'cjjine', 'cjjine', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/cjjine', '0', '0', '0', '', NULL, NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('1331872643531526146', '1331503965770223616', 'admin', NULL, '2020-11-26 16:09:18', '2020-11-26 16:09:18', 'chengjiao1', 'chengjiao1', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/chengjiao1', '0', '0', '0', '', NULL, NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('1331878107552010242', '1331503965770223616', 'admin', NULL, '2020-11-26 16:31:01', '2020-11-26 16:31:01', 'zhuangxiu', 'zhuangxiu', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/zhuangxiu', '0', '0', '0', '', NULL, NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('1331916030221602818', '1331503965770223616', 'admin', NULL, '2020-11-26 19:01:42', '2020-11-26 19:01:42', 'btchanquan', 'btchanquan', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/btchanquan', '0', '0', '0', '', NULL, NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('1331919172472524801', '1331503965770223616', 'admin', NULL, '2020-11-26 19:14:11', '2020-11-26 19:14:11', 'huxingxiaoshou', 'huxingxiaoshou', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/huxingxiaoshou', '0', '0', '0', '', NULL, NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('1331922734933987329', '1331503965770223616', 'admin', NULL, '2020-11-26 19:28:21', '2020-11-26 19:28:21', 'fangyuan', 'fangyuan', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/fangyuan', '0', '0', '0', '', NULL, NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('1331926127597441025', '1331503965770223616', 'admin', NULL, '2020-11-26 19:41:49', '2020-11-26 19:41:49', 'qingkuang', 'qingkuang', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/qingkuang', '0', '0', '0', '', NULL, NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('1334390762455965697', '1334378897302753280', 'admin', NULL, '2021-01-06 11:43:35', '2021-01-06 11:43:35', 'quyuxiaoshou', 'quyuxiaoshou', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/quyuxiaoshou', '0', '1', '1', '', NULL, NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('1334440263732436994', '1334420681185566722', 'admin', NULL, '2021-01-04 21:28:19', '2021-01-04 21:28:19', 'laiyuan', 'laiyuan', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/laiyuan', '0', '1', '1', '', NULL, NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('1334465135435063298', '1334457419857793024', 'admin', NULL, '2021-01-04 21:29:28', '2021-01-04 21:29:28', 'xiaoshou', 'xiaoshou', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/xiaoshou', '0', '1', '1', '', NULL, NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('1334708015269490689', '1334696790477377536', 'admin', NULL, '2021-01-04 21:30:29', '2021-01-04 21:30:29', 'shouru', 'shouru', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/shouru', '0', '1', '0', '', NULL, NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('1334763434197200897', '1334757703079301120', 'admin', NULL, '2020-12-04 15:40:31', '2020-12-04 15:40:31', 'chejian', 'chejian', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/chejian', '0', '0', '0', '', NULL, NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('1338756341933543425', '1338744112815411200', 'admin', NULL, '2021-02-02 19:20:56', '2021-02-02 19:20:56', 'jdcx', 'jdcx', '0', NULL, 'select * from rep_demo_dxtj', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '1', '0', '', 'MYSQL', NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('22f025b781ee9fe4746438621e82674f', '01a1e07ed4b12348b29d5a47ac7f0228', 'admin', NULL, '2020-12-14 16:21:09', '2020-12-14 16:21:09', 'xiaoshou', 'xiaoshou', '0', NULL, 'select * from rep_demo_xiaoshou where s_id=\'${id}\'', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '1', '1', NULL, 'MYSQL', NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('2324fac242b35938678a05bbbba345e2', '7acddbc92bc73d06c7f62ff55dfdca19', 'admin', NULL, '2021-01-11 14:25:45', '2021-01-11 14:25:45', 'xiaoshou', 'xiaoshou', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/baobiao/xiaoshou?pageNo=\'${pageNo}\'&pageSize=\'${pageSize}\'', '0', '1', '1', '', NULL, NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('28e0b01cc3e2b0d361107661527bfdff', '6df599d933df24de007764d0e98eb105', 'admin', NULL, '2020-12-04 16:53:38', '2020-12-04 16:53:38', 'yaopin', 'yaopin', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/baobiao/chufangjian', '0', '0', '0', NULL, 'MYSQL', NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('4af57d343f1d6521b71b85097b580786', '1347459370216198144', 'admin', NULL, '2021-01-08 17:26:57', '2021-01-08 17:26:57', 'tmp_report_data_income', '来源收入统计', '0', NULL, 'select * from tmp_report_data_income', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '1', '1', '', 'MYSQL', NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('4dc208eb92fd1a84ef7b4723251e3e51', '5485950d88c9918d03dece2ad24b4d72', 'admin', NULL, '2021-01-08 16:24:16', '2021-01-08 16:24:16', 'tmp_report_data_1', '年度佣金收入', '0', NULL, 'select monty,main_income,total,his_lowest,his_average,his_highest from tmp_report_data_1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '1', '0', '', 'MYSQL', NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('537477711022567424', '537446834339098624', 'admin', 'admin', '2021-04-01 05:54:42', '2021-04-01 05:54:42', 'yy', 'yy', '0', NULL, 'select * from rep_demo_dxtj', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '1', '1', '', 'MYSQL', NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('537478337278291968', '537446834339098624', 'admin', 'admin', '2021-04-01 05:54:37', '2021-04-01 05:54:37', 'tt', 'tt', '0', NULL, 'select * from SYS_DATA_LOG', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '1', '0', '26d21fe4f27920d2f56abc8d90a8e527', 'ORACLE', NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('537478706314129408', '537446834339098624', 'admin', 'admin', '2021-04-01 05:56:44', '2021-04-01 05:56:44', 'pp', 'pp', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/baobiao/caigou', '0', '1', '0', '', NULL, NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('574873661957337088', '574873661613404160', 'admin', NULL, '2021-07-13 10:29:32', '2021-01-08 10:36:58', 'yuangongjiben', 'yuangongjiben', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/yuangongjiben', '0', '0', '0', '', NULL, NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('574873663005913088', '574873661613404160', 'admin', NULL, '2021-07-13 10:29:32', '2021-01-11 14:38:14', 'xueli', 'xueli', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/xueli', '0', '1', '0', '', NULL, NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('574873663161102336', '574873661613404160', 'admin', NULL, '2021-07-13 10:29:32', '2021-01-08 10:40:31', 'uu', 'uu', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/gongzuojingli', '0', '1', '0', '', NULL, NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('574873663341457408', '574873661613404160', 'admin', NULL, '2021-07-13 10:29:32', '2021-01-05 15:33:58', 'zhengshu', 'zhengshu', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/zhengshu', '0', '0', '0', '', NULL, NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('574873663500840960', '574873661613404160', 'admin', NULL, '2021-07-13 10:29:32', '2021-01-05 15:33:58', 'jtcy', 'jtcy', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/jtcy', '0', '0', '0', '', NULL, NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('574873663693778944', '574873661613404160', 'admin', NULL, '2021-07-13 10:29:32', '2021-01-05 15:33:58', 'jiangli', 'jiangli', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/jiangli', '0', '0', '0', '', NULL, NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('574875722388205568', '574875722233016320', 'admin', NULL, '2021-07-13 10:37:43', '2021-01-08 10:47:52', 'tt', 'tt', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/baobiao/shixi', '0', '0', '0', '', NULL, NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('574875730650984448', '574875730525155328', 'admin', NULL, '2021-07-13 10:37:45', '2021-01-08 10:36:58', 'yuangongjiben', 'yuangongjiben', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/yuangongjiben', '0', '0', '0', '', NULL, NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('574875731594702848', '574875730525155328', 'admin', NULL, '2021-07-13 10:37:45', '2021-01-11 14:38:14', 'xueli', 'xueli', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/xueli', '0', '1', '0', '', NULL, NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('574875731737309184', '574875730525155328', 'admin', NULL, '2021-07-13 10:37:45', '2021-01-08 10:40:31', 'uu', 'uu', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/gongzuojingli', '0', '1', '0', '', NULL, NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('574875731867332608', '574875730525155328', 'admin', NULL, '2021-07-13 10:37:45', '2021-01-05 15:33:58', 'zhengshu', 'zhengshu', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/zhengshu', '0', '0', '0', '', NULL, NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('574875731997356032', '574875730525155328', 'admin', NULL, '2021-07-13 10:37:45', '2021-01-05 15:33:58', 'jtcy', 'jtcy', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/jtcy', '0', '0', '0', '', NULL, NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('574875732131573760', '574875730525155328', 'admin', NULL, '2021-07-13 10:37:45', '2021-01-05 15:33:58', 'jiangli', 'jiangli', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/jiangli', '0', '0', '0', '', NULL, NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('6011955e58d89040fca52e7f962d0bf4', '961455b47c0b86dc961e90b5893bff05', 'admin', NULL, '2021-01-04 20:47:07', '2021-01-04 20:47:07', 'gongsi', 'gongsi', '0', NULL, 'select * from rep_demo_gongsi where id=\'${id}\'', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '0', '0', '', 'MYSQL', NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('60b3feffadc55eb49baa5a48fdf1ff0e', '1352160857479581696', 'admin', NULL, '2021-01-29 18:36:35', '2021-01-29 18:36:35', 'infoForReport', '信息', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://localhost:8080/jeecg-boot/sys/actuator/redis/infoForReport', '0', '1', '1', '', NULL, NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('629609c4d540cb4675e9064af8955296', '7c02c224a2db56d0350069650033f702', 'admin', NULL, '2021-02-02 19:33:09', '2021-02-02 19:33:09', 'hecha', 'hecha', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/hecha', '0', '1', '0', '', NULL, NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('654609e4247a0469e0b2befbc69b00f9', '1cd9d574d0c42f3915046dc61d9f33bd', 'admin', NULL, '2020-12-17 16:42:21', '2020-12-17 19:50:14', 'xiaoshoue', '销售额', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/xiaoshoue', '0', '0', '0', '', NULL, NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('6a1d22ca4c95e8fab655d3ceed43a84d', '1352160857479581696', 'admin', NULL, '2021-01-29 18:36:42', '2021-01-29 18:36:42', 'memoryForReport', '内存', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://localhost:8080/jeecg-boot/sys/actuator/redis/memoryForReport', '0', '1', '0', '', NULL, NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('7911bd189c2d53e182693bd599a315a2', '1cd9d574d0c42f3915046dc61d9f33bd', 'admin', NULL, '2020-12-17 16:59:12', '2020-12-17 19:50:14', 'chengshi', '城市', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/chengshi', '0', '0', '0', '', NULL, NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('7b20679054449c554cde856ef24126ab', '1347454742040809472', 'admin', NULL, '2021-01-08 16:24:16', '2021-01-08 16:24:16', 'tmp_report_data_1', '年度佣金收入', '0', NULL, 'select monty,main_income,total,his_lowest,his_average,his_highest from tmp_report_data_1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '1', '0', '', 'MYSQL', NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('94bcd8202bc6bc467efd0d679dadd7bb', '1338370016550195200', 'admin', 'admin', '2021-07-12 12:15:08', '2021-07-12 12:15:08', 'tm', 'tm', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/tiaoma1', '0', '0', '0', '', NULL, NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('9b75c161322e0b7e29b3ffc84239a72c', '1cd9d574d0c42f3915046dc61d9f33bd', 'admin', NULL, '2020-12-17 17:13:21', '2020-12-17 19:50:14', 'xsjd', '销售进度', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/xsjd', '0', '0', '0', '', NULL, NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('9b7d28336b01f9a6b1a613957c3d7cda', '1338769064067076098', 'admin', NULL, '2021-02-02 19:12:55', '2021-02-02 19:12:55', 'pop', 'pop', '0', NULL, 'select * from rep_demo_dxtj', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '1', '0', '', 'MYSQL', NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('a543d8dd40f4d26839b78bd604be659e', 'f5f275b5e28b45256ef24587ec792f0c', 'admin', NULL, '2021-01-08 17:26:57', '2021-01-08 17:26:57', 'tmp_report_data_income', '来源收入统计', '0', NULL, 'select * from tmp_report_data_income', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '1', '1', '', 'MYSQL', NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('bbc5d5ab143d59f0beab484682361aa5', 'dd482bfd6ca470a0f49d9bb4e61ec694', 'admin', NULL, '2021-01-08 10:47:52', '2021-01-08 10:47:52', 'tt', 'tt', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/baobiao/shixi', '0', '0', '0', '', NULL, NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('c9bdb6b7ac68accfecb366718bf78f79', '01a1e07ed4b12348b29d5a47ac7f0228', 'admin', NULL, '2020-09-28 10:18:07', '2020-12-14 16:21:09', 'gongsi', 'gongsi', '0', NULL, 'select * from rep_demo_gongsi where id=\'${id}\'', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '0', '0', NULL, 'MYSQL', NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('d4a29dfda94357308faf62be2b94db08', '1352160857479581696', 'admin', NULL, '2021-01-29 18:36:47', '2021-01-29 18:36:47', 'keysSizeForReport', '数量', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://localhost:8080/jeecg-boot/sys/actuator/redis/keysSizeForReport', '0', '1', '0', '', NULL, NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('e0fe1d693625c906c1171d7de706a47c', '6df599d933df24de007764d0e98eb105', NULL, NULL, '2020-07-17 10:49:42', NULL, 'yonghu', 'yonghu', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/baobiao/yonghu', '0', '0', NULL, NULL, 'MYSQL', NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('e4cec9ff15bc0ea42f536a442a6d1335', '961455b47c0b86dc961e90b5893bff05', 'admin', NULL, '2021-01-04 20:42:17', '2021-01-04 20:42:17', 'jianpiao', 'jianpiao', '0', NULL, 'select * from rep_demo_jianpiao where s_id=\'${id}\'', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '1', '1', NULL, 'MYSQL', NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('f7649b77cfc9e0a9dacdac370cd4036b', '1347373863746539520', 'admin', NULL, '2021-01-08 10:47:52', '2021-01-08 10:47:52', 'tt', 'tt', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/baobiao/shixi', '0', '0', '0', '', NULL, NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('fb70a91730f087f8023afd88d24f9697', '1cd9d574d0c42f3915046dc61d9f33bd', 'admin', NULL, '2020-12-17 19:50:14', '2020-12-17 19:50:14', 'zhexian', 'zhexian', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/zhexian', '0', '1', '1', '', NULL, NULL, NULL); + +-- ---------------------------- +-- Table structure for jimu_report_db_field +-- ---------------------------- +DROP TABLE IF EXISTS `jimu_report_db_field`; +CREATE TABLE `jimu_report_db_field` ( + `id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'id', + `create_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建人登录名称', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建日期', + `update_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '更新人登录名称', + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新日期', + `jimu_report_db_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '数据源ID', + `field_name` varchar(80) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '字段名', + `field_text` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '字段文本', + `widget_type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '控件类型', + `widget_width` int(0) NULL DEFAULT NULL COMMENT '控件宽度', + `order_num` int(0) NULL DEFAULT NULL COMMENT '排序', + `search_flag` int(0) NULL DEFAULT 0 COMMENT '查询标识0否1是 默认0', + `search_mode` int(0) NULL DEFAULT NULL COMMENT '查询模式1简单2范围', + `dict_code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '字典编码支持从表中取数据', + `search_value` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '查询默认值', + `search_format` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '查询时间格式化表达式', + `ext_json` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '参数配置', + PRIMARY KEY (`id`) USING BTREE, + INDEX `idx_jrdf_jimu_report_db_id`(`jimu_report_db_id`) USING BTREE, + INDEX `idx_dbfield_order_num`(`order_num`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of jimu_report_db_field +-- ---------------------------- +INSERT INTO `jimu_report_db_field` VALUES ('00a67b539ac15446c1bd658104e1020a', NULL, '2020-07-21 15:17:10', NULL, NULL, 'c9bdb6b7ac68accfecb366718bf78f79', 'gdata', 'gdata', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('014179e260e0adf1706c616a3ad6e552', NULL, '2021-01-08 16:10:28', NULL, NULL, '7b20679054449c554cde856ef24126ab', 'main_income', 'main_income', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('01cb1f61f836aae43bca333dbaf293be', NULL, '2021-01-11 14:38:14', NULL, NULL, '1317006713165049858', 'zhuanye', 'zhuanye', 'String', NULL, 4, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('0470c07d386940053253fe8a8c200225', NULL, '2021-01-08 16:29:02', NULL, NULL, '4af57d343f1d6521b71b85097b580786', 'chengbao_gz_money', 'chengbao_gz_money', 'String', NULL, 4, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('0680555456f0e579a0065c4ca5dd8d06', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'id', 'id', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('06b24135f3670ea4f4c7f554d2521a39', NULL, '2021-01-08 16:29:02', NULL, NULL, 'a543d8dd40f4d26839b78bd604be659e', 'biz_income', 'biz_income', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('08e22bbf63e81198c0d2585dce8ee8f9', NULL, '2021-02-02 19:10:15', NULL, NULL, '9b7d28336b01f9a6b1a613957c3d7cda', 'jperson', 'jperson', 'String', NULL, 9, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('0c82931edb766ad89ead9e98a998d43f', NULL, '2021-01-11 14:38:14', NULL, NULL, '1317006713165049858', 'kdate', 'kdate', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('0c9f65f5f754f1251070f51a2a19905d', NULL, '2021-02-02 19:30:23', NULL, NULL, '629609c4d540cb4675e9064af8955296', 'hname', 'hname', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('0fb03c8e2330e051564f3dd1de54512f', NULL, '2021-01-11 14:38:14', NULL, NULL, '1317006713165049858', 'jstudent', 'jstudent', 'String', NULL, 3, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('10e61155dcf655d7843ebc01cc90c8b1', NULL, '2021-01-08 16:10:28', NULL, NULL, '7b20679054449c554cde856ef24126ab', 'total', 'total', 'String', NULL, 3, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('115c1ac01462ca1fbecb3c0a55218395', NULL, '2021-01-08 16:10:28', NULL, NULL, '7b20679054449c554cde856ef24126ab', 'his_highest', 'his_highest', 'String', NULL, 6, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('11713370900fa3c1455cac7e8db61fe1', NULL, '2021-01-08 10:47:52', NULL, NULL, 'bbc5d5ab143d59f0beab484682361aa5', 'pingjia', 'pingjia', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('11d3a082d297adeffecd86690e28cf39', NULL, '2021-01-05 15:09:15', NULL, NULL, '2324fac242b35938678a05bbbba345e2', 'ctotal', 'ctotal', 'String', NULL, 8, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1260eb03ab66bd12766b2102e343d280', NULL, '2021-01-21 17:07:16', NULL, NULL, '6a1d22ca4c95e8fab655d3ceed43a84d', 'value', 'value', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1272834907562864641', NULL, '2020-06-16 18:14:25', NULL, NULL, '1272834687525482497', 'id', 'id', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1272834907567058946', NULL, '2020-06-16 18:14:25', NULL, NULL, '1272834687525482497', 'bnum', 'bnum', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1272834907571253250', NULL, '2020-06-16 18:14:25', NULL, NULL, '1272834687525482497', 'ftime', 'ftime', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1272834907571253251', NULL, '2020-06-16 18:14:25', NULL, NULL, '1272834687525482497', 'sfkong', 'sfkong', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1272834907571253252', NULL, '2020-06-16 18:14:25', NULL, NULL, '1272834687525482497', 'kaishi', 'kaishi', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1272834907571253253', NULL, '2020-06-16 18:14:25', NULL, NULL, '1272834687525482497', 'jieshu', 'jieshu', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1272834907571253254', NULL, '2020-06-16 18:14:25', NULL, NULL, '1272834687525482497', 'hezairen', 'hezairen', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1272834907571253255', NULL, '2020-06-16 18:14:25', NULL, NULL, '1272834687525482497', 'jpnum', 'jpnum', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1272834907575447554', NULL, '2020-06-16 18:14:25', NULL, NULL, '1272834687525482497', 'shihelv', 'shihelv', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1283957016175415297', NULL, '2020-07-17 10:49:42', NULL, NULL, '1283957016150249473', 'yphone', 'yphone', NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1283957016183803906', NULL, '2020-07-17 10:49:42', NULL, NULL, '1283957016150249473', 'yzhenliao', 'yzhenliao', NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1283957016187998209', NULL, '2020-07-17 10:49:42', NULL, NULL, '1283957016150249473', 'ysex', 'ysex', NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1283957016192192513', NULL, '2020-07-17 10:49:42', NULL, NULL, '1283957016150249473', 'danwei', 'danwei', NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1283957016196386818', NULL, '2020-07-17 10:49:42', NULL, NULL, '1283957016150249473', 'kdata', 'kdata', NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1283957016204775425', NULL, '2020-07-17 10:49:42', NULL, NULL, '1283957016150249473', 'yname', 'yname', NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1283957016208969729', NULL, '2020-07-17 10:49:42', NULL, NULL, '1283957016150249473', 'yprice', 'yprice', NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1283957016213164033', NULL, '2020-07-17 10:49:42', NULL, NULL, '1283957016150249473', 'ytotal', 'ytotal', NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1283957016217358337', NULL, '2020-07-17 10:49:42', NULL, NULL, '1283957016150249473', 'yishe', 'yishe', NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1283957016221552641', NULL, '2020-07-17 10:49:42', NULL, NULL, '1283957016150249473', 'yizhu', 'yizhu', NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1283957016225746946', NULL, '2020-07-17 10:49:42', NULL, NULL, '1283957016150249473', 'yage', 'yage', NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1283957016229941249', NULL, '2020-07-17 10:49:42', NULL, NULL, '1283957016150249473', 'yjieguo', 'yjieguo', NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285150155649130497', NULL, '2020-07-20 17:50:49', NULL, NULL, '1284070508744257537', 'xtype', 'xtype', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285150155686879234', NULL, '2020-07-20 17:50:49', NULL, NULL, '1284070508744257537', 'danyuan', 'danyuan', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285150155691073538', NULL, '2020-07-20 17:50:49', NULL, NULL, '1284070508744257537', 'chanquan', 'chanquan', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285150155695267841', NULL, '2020-07-20 17:50:49', NULL, NULL, '1284070508744257537', 'zhuzhi', 'zhuzhi', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285150155699462145', NULL, '2020-07-20 17:50:49', NULL, NULL, '1284070508744257537', 'fujian', 'fujian', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285150155707850754', NULL, '2020-07-20 17:50:49', NULL, NULL, '1284070508744257537', 'didian', 'didian', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285150155707850755', NULL, '2020-07-20 17:50:49', NULL, NULL, '1284070508744257537', 'type', 'type', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285150155712045058', NULL, '2020-07-20 17:50:49', NULL, NULL, '1284070508744257537', 'suoyou', 'suoyou', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285150155716239361', NULL, '2020-07-20 17:50:49', NULL, NULL, '1284070508744257537', 'name', 'name', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285150155716239362', NULL, '2020-07-20 17:50:49', NULL, NULL, '1284070508744257537', 'bianhao', 'bianhao', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285150155720433666', NULL, '2020-07-20 17:50:49', NULL, NULL, '1284070508744257537', 'yname', 'yname', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285150155720433667', NULL, '2020-07-20 17:50:49', NULL, NULL, '1284070508744257537', 'riqi', 'riqi', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285150155724627969', NULL, '2020-07-20 17:50:49', NULL, NULL, '1284070508744257537', 'beizhu', 'beizhu', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285150155728822274', NULL, '2020-07-20 17:50:49', NULL, NULL, '1284070508744257537', 'time', 'time', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285150155728822275', NULL, '2020-07-20 17:50:49', NULL, NULL, '1284070508744257537', 'mianji', 'mianji', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285159608326889474', 'admin', '2021-04-01 02:44:48', NULL, NULL, '1285157606524002305', 'fsex', 'fsex', 'string', NULL, NULL, 0, NULL, 'sex', NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285159608335278082', 'admin', '2021-04-01 02:44:48', NULL, NULL, '1285157606524002305', 'fname', 'fname', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285159608339472385', 'admin', '2021-04-01 02:44:48', NULL, NULL, '1285157606524002305', 'shiqing', 'shiqing', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285159608339472386', 'admin', '2021-04-01 02:44:48', NULL, NULL, '1285157606524002305', 'pname', 'pname', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285159608339472387', 'admin', '2021-04-01 02:44:48', NULL, NULL, '1285157606524002305', 'zhuzhi', 'zhuzhi', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285159608339472388', 'admin', '2021-04-01 02:44:48', NULL, NULL, '1285157606524002305', 'gdata', 'gdata', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285159608343666690', 'admin', '2021-04-01 02:44:48', NULL, NULL, '1285157606524002305', 'cdata', 'cdata', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285164420749664258', NULL, '2020-07-20 18:47:30', NULL, NULL, '1285164420728692737', 'shiqing', 'shiqing', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285164420753858561', NULL, '2020-07-20 18:47:30', NULL, NULL, '1285164420728692737', 'name', 'name', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285164420758052866', NULL, '2020-07-20 18:47:30', NULL, NULL, '1285164420728692737', 'gdata', 'gdata', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285164420758052867', NULL, '2020-07-20 18:47:30', NULL, NULL, '1285164420728692737', 'value', 'value', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285164420758052868', NULL, '2020-07-20 18:47:30', NULL, NULL, '1285164420728692737', 'percent', 'percent', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285164420762247169', NULL, '2020-07-20 18:47:30', NULL, NULL, '1285164420728692737', 'tdata', 'tdata', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285178919124803585', NULL, '2020-07-20 19:45:06', NULL, NULL, '1285178919099637762', 'ktime', 'ktime', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285178919133192193', NULL, '2020-07-20 19:45:06', NULL, NULL, '1285178919099637762', 'danwei', 'danwei', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285178919133192194', NULL, '2020-07-20 19:45:06', NULL, NULL, '1285178919099637762', 'wtime', 'wtime', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285178919133192195', NULL, '2020-07-20 19:45:06', NULL, NULL, '1285178919099637762', 'yusuan', 'yusuan', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285178919133192196', NULL, '2020-07-20 19:45:06', NULL, NULL, '1285178919099637762', 'dshenhe', 'dshenhe', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285178919133192197', NULL, '2020-07-20 19:45:06', NULL, NULL, '1285178919099637762', 'zhuren', 'zhuren', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285178919137386498', NULL, '2020-07-20 19:45:06', NULL, NULL, '1285178919099637762', 'neirong', 'neirong', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285178919137386499', NULL, '2020-07-20 19:45:06', NULL, NULL, '1285178919099637762', 'yijian', 'yijian', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285178919137386500', NULL, '2020-07-20 19:45:06', NULL, NULL, '1285178919099637762', 'time1', 'time1', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285178919137386501', NULL, '2020-07-20 19:45:06', NULL, NULL, '1285178919099637762', 'time2', 'time2', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285178919137386502', NULL, '2020-07-20 19:45:06', NULL, NULL, '1285178919099637762', 'time3', 'time3', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285178919141580801', NULL, '2020-07-20 19:45:06', NULL, NULL, '1285178919099637762', 'time4', 'time4', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285178919141580802', NULL, '2020-07-20 19:45:06', NULL, NULL, '1285178919099637762', 'pingjia', 'pingjia', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285178919141580803', NULL, '2020-07-20 19:45:06', NULL, NULL, '1285178919099637762', 'name', 'name', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285178919141580804', NULL, '2020-07-20 19:45:06', NULL, NULL, '1285178919099637762', 'bianhao', 'bianhao', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285178919141580805', NULL, '2020-07-20 19:45:06', NULL, NULL, '1285178919099637762', 'zongjie', 'zongjie', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285178919145775105', NULL, '2020-07-20 19:45:06', NULL, NULL, '1285178919099637762', 'nengli', 'nengli', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285178919145775106', NULL, '2020-07-20 19:45:06', NULL, NULL, '1285178919099637762', 'time', 'time', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285473875810967553', NULL, '2020-07-21 15:17:10', NULL, NULL, '1273495682564534273', 'id', 'id', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285473875823550466', NULL, '2020-07-21 15:17:10', NULL, NULL, '1273495682564534273', 'gname', 'gname', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285473875823550467', NULL, '2020-07-21 15:17:10', NULL, NULL, '1273495682564534273', 'gdata', 'gdata', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285473875823550468', NULL, '2020-07-21 15:17:10', NULL, NULL, '1273495682564534273', 'tdata', 'tdata', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285473875827744769', NULL, '2020-07-21 15:17:10', NULL, NULL, '1273495682564534273', 'didian', 'didian', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285473875827744770', NULL, '2020-07-21 15:17:10', NULL, NULL, '1273495682564534273', 'zhaiyao', 'zhaiyao', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285473875827744771', NULL, '2020-07-21 15:17:10', NULL, NULL, '1273495682564534273', 'num', 'num', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1288038655394324482', 'admin', '2021-04-01 03:09:40', NULL, NULL, '1288038655293661186', 'ctotal', '库存量', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1288038655402713090', 'admin', '2021-04-01 03:09:40', NULL, NULL, '1288038655293661186', 'cname', '产品名称', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1288038655406907393', 'admin', '2021-04-01 03:09:40', NULL, NULL, '1288038655293661186', 'cprice', '单价', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1288038655411101697', 'admin', '2021-04-01 03:09:40', NULL, NULL, '1288038655293661186', 'dtotal', '订购量', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1288038655411101698', 'admin', '2021-04-01 03:09:40', NULL, NULL, '1288038655293661186', 'tp', '库存总值', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1288038655415296002', 'admin', '2021-04-01 03:09:40', NULL, NULL, '1288038655293661186', 'ztotal', '二次订购量', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1288038655415296003', 'admin', '2021-04-01 03:09:40', NULL, NULL, '1288038655293661186', 'cnum', '产品数量', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1288048290843074561', NULL, '2020-07-28 17:46:58', NULL, NULL, '1272858455908073473', 'id', 'id', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1288048290847268865', NULL, '2020-07-28 17:46:58', NULL, NULL, '1272858455908073473', 'hnum', 'hnum', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1288048290851463170', NULL, '2020-07-28 17:46:58', NULL, NULL, '1272858455908073473', 'hname', 'hname', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1288048290851463171', NULL, '2020-07-28 17:46:58', NULL, NULL, '1272858455908073473', 'xinghao', 'xinghao', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1288048290851463172', NULL, '2020-07-28 17:46:58', NULL, NULL, '1272858455908073473', 'fahuocangku', 'fahuocangku', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1288048290851463173', NULL, '2020-07-28 17:46:58', NULL, NULL, '1272858455908073473', 'danwei', 'danwei', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1288048290851463174', NULL, '2020-07-28 17:46:58', NULL, NULL, '1272858455908073473', 'num', 'num', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1288048290851463175', NULL, '2020-07-28 17:46:58', NULL, NULL, '1272858455908073473', 'danjia', 'danjia', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1288048290851463176', NULL, '2020-07-28 17:46:58', NULL, NULL, '1272858455908073473', 'zhekoulv', 'zhekoulv', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1288048290855657473', NULL, '2020-07-28 17:46:58', NULL, NULL, '1272858455908073473', 'xiaoshoujine', 'xiaoshoujine', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1288048290859851778', NULL, '2020-07-28 17:46:58', NULL, NULL, '1272858455908073473', 'beizhu', 'beizhu', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1288048290859851779', NULL, '2020-07-28 17:46:58', NULL, NULL, '1272858455908073473', 's_id', 's_id', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1290104038439886849', NULL, '2020-08-03 09:55:46', NULL, NULL, '1290104038414721025', 'id', 'id', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1290104038448275458', NULL, '2020-08-03 09:55:46', NULL, NULL, '1290104038414721025', 'gname', 'gname', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1290104038448275459', NULL, '2020-08-03 09:55:46', NULL, NULL, '1290104038414721025', 'gdata', 'gdata', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1290104038448275460', NULL, '2020-08-03 09:55:46', NULL, NULL, '1290104038414721025', 'tdata', 'tdata', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1290104038452469761', NULL, '2020-08-03 09:55:46', NULL, NULL, '1290104038414721025', 'didian', 'didian', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1290104038452469762', NULL, '2020-08-03 09:55:46', NULL, NULL, '1290104038414721025', 'zhaiyao', 'zhaiyao', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1290104038452469763', NULL, '2020-08-03 09:55:46', NULL, NULL, '1290104038414721025', 'num', 'num', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1317007979534479361', NULL, '2020-10-16 15:42:26', NULL, NULL, '1317007979484147714', 'zmphone', 'zmphone', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1317007979534479362', NULL, '2020-10-16 15:42:26', NULL, NULL, '1317007979484147714', 'jstudent', 'jstudent', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1317007979534479363', NULL, '2020-10-16 15:42:26', NULL, NULL, '1317007979484147714', 'kdate', 'kdate', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1317007979534479364', NULL, '2020-10-16 15:42:26', NULL, NULL, '1317007979484147714', 'jdate', 'jdate', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1317007979534479365', NULL, '2020-10-16 15:42:26', NULL, NULL, '1317007979484147714', 'zmname', 'zmname', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1317009166149218305', NULL, '2020-10-16 15:47:09', NULL, NULL, '1317009166140829698', 'zcname', 'zcname', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1317009166149218306', NULL, '2020-10-16 15:47:09', NULL, NULL, '1317009166140829698', 'danwei', 'danwei', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1317009166149218307', NULL, '2020-10-16 15:47:09', NULL, NULL, '1317009166140829698', 'fdate', 'fdate', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1317009166149218308', NULL, '2020-10-16 15:47:09', NULL, NULL, '1317009166140829698', 'jibie', 'jibie', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1317009166149218309', NULL, '2020-10-16 15:47:09', NULL, NULL, '1317009166140829698', 'beizhu', 'beizhu', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1317013474643144706', NULL, '2020-10-16 16:04:16', NULL, NULL, '1317013474634756097', 'danwei', 'danwei', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1317013474643144707', NULL, '2020-10-16 16:04:16', NULL, NULL, '1317013474634756097', 'phone', 'phone', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1317013474643144708', NULL, '2020-10-16 16:04:16', NULL, NULL, '1317013474634756097', 'name', 'name', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1317013474643144709', NULL, '2020-10-16 16:04:16', NULL, NULL, '1317013474634756097', 'zzmm', 'zzmm', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1317013474643144710', NULL, '2020-10-16 16:04:16', NULL, NULL, '1317013474634756097', 'guanxi', 'guanxi', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1317013474643144711', NULL, '2020-10-16 16:04:16', NULL, NULL, '1317013474634756097', 'age', 'age', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1317015169502670849', NULL, '2020-10-16 16:11:00', NULL, NULL, '1317015169494282241', 'date', 'date', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1317015169502670850', NULL, '2020-10-16 16:11:00', NULL, NULL, '1317015169494282241', 'mingcheng', 'mingcheng', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1317015169502670851', NULL, '2020-10-16 16:11:00', NULL, NULL, '1317015169494282241', 'didian', 'didian', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1331511745855926274', NULL, '2020-11-25 16:15:13', NULL, NULL, '1331511745851731969', 'name', 'name', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1331511745855926275', NULL, '2020-11-25 16:15:13', NULL, NULL, '1331511745851731969', 'value', 'value', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1331511745855926276', NULL, '2020-11-25 16:15:13', NULL, NULL, '1331511745851731969', 'type', 'type', 'String', NULL, 3, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1331514838215602178', NULL, '2020-11-25 16:27:30', NULL, NULL, '1331514838211407873', 'name', 'name', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1331514838215602179', NULL, '2020-11-25 16:27:30', NULL, NULL, '1331514838211407873', 'value', 'value', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1331514838215602180', NULL, '2020-11-25 16:27:30', NULL, NULL, '1331514838211407873', 'type', 'type', 'String', NULL, 3, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1331514935032721409', NULL, '2020-11-25 16:27:54', NULL, NULL, '1331514935028527106', 'name', 'name', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1331514935032721410', NULL, '2020-11-25 16:27:54', NULL, NULL, '1331514935028527106', 'value', 'value', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1331514935032721411', NULL, '2020-11-25 16:27:54', NULL, NULL, '1331514935028527106', 'type', 'type', 'String', NULL, 3, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1331872643539914754', NULL, '2020-11-26 16:09:18', NULL, NULL, '1331872643531526146', 'name', 'name', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1331872643539914755', NULL, '2020-11-26 16:09:18', NULL, NULL, '1331872643531526146', 'value', 'value', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1331872643539914756', NULL, '2020-11-26 16:09:18', NULL, NULL, '1331872643531526146', 'type', 'type', 'String', NULL, 3, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1331878107560398849', NULL, '2020-11-26 16:31:01', NULL, NULL, '1331878107552010242', 'name', 'name', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1331878107560398850', NULL, '2020-11-26 16:31:01', NULL, NULL, '1331878107552010242', 'value', 'value', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1331916030229991425', NULL, '2020-11-26 19:01:42', NULL, NULL, '1331916030221602818', 'name', 'name', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1331916030229991426', NULL, '2020-11-26 19:01:42', NULL, NULL, '1331916030221602818', 'value', 'value', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1331916030229991427', NULL, '2020-11-26 19:01:42', NULL, NULL, '1331916030221602818', 'type', 'type', 'String', NULL, 3, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1331919172480913409', NULL, '2020-11-26 19:14:11', NULL, NULL, '1331919172472524801', 'name', 'name', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1331919172480913410', NULL, '2020-11-26 19:14:11', NULL, NULL, '1331919172472524801', 'value', 'value', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1331922734942375938', NULL, '2020-11-26 19:28:21', NULL, NULL, '1331922734933987329', 'name', 'name', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1331922734942375939', NULL, '2020-11-26 19:28:21', NULL, NULL, '1331922734933987329', 'value', 'value', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1331926127605829634', NULL, '2020-11-26 19:41:49', NULL, NULL, '1331926127597441025', 'cjl', 'cjl', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1331926127605829635', NULL, '2020-11-26 19:41:49', NULL, NULL, '1331926127597441025', 'cjje', 'cjje', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1331926127605829636', NULL, '2020-11-26 19:41:49', NULL, NULL, '1331926127597441025', 'xsmj', 'xsmj', 'String', NULL, 3, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1331926127605829637', NULL, '2020-11-26 19:41:49', NULL, NULL, '1331926127597441025', 'cjjj', 'cjjj', 'String', NULL, 4, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1331926127605829638', NULL, '2020-11-26 19:41:49', NULL, NULL, '1331926127597441025', 'sfyj', 'sfyj', 'String', NULL, 5, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1331926127605829639', NULL, '2020-11-26 19:41:49', NULL, NULL, '1331926127597441025', 'ydkh', 'ydkh', 'String', NULL, 6, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334440263740825602', NULL, '2020-12-03 18:12:06', NULL, NULL, '1334440263732436994', 'class', 'class', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334440263740825603', NULL, '2020-12-03 18:12:06', NULL, NULL, '1334440263732436994', 'school', 'school', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334440263740825604', NULL, '2020-12-03 18:12:06', NULL, NULL, '1334440263732436994', 'lv', 'lv', 'String', NULL, 3, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334440263740825605', NULL, '2020-12-03 18:12:06', NULL, NULL, '1334440263732436994', 'renyuan_jy', 'renyuan_jy', 'String', NULL, 4, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334440263740825606', NULL, '2020-12-03 18:12:06', NULL, NULL, '1334440263732436994', 'richang_jy', 'richang_jy', 'String', NULL, 5, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334440263740825607', NULL, '2020-12-03 18:12:06', NULL, NULL, '1334440263732436994', 'biaozhun_jy', 'biaozhun_jy', 'String', NULL, 6, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334440263740825608', NULL, '2020-12-03 18:12:06', NULL, NULL, '1334440263732436994', 'xinxi_jy', 'xinxi_jy', 'String', NULL, 7, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334440263740825609', NULL, '2020-12-03 18:12:06', NULL, NULL, '1334440263732436994', 'jichubokuan_jy', 'jichubokuan_jy', 'String', NULL, 8, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334440263740825610', NULL, '2020-12-03 18:12:06', NULL, NULL, '1334440263732436994', 'renyuan_ct', 'renyuan_ct', 'String', NULL, 9, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334440263740825611', NULL, '2020-12-03 18:12:06', NULL, NULL, '1334440263732436994', 'richang_ct', 'richang_ct', 'String', NULL, 10, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334440263740825612', NULL, '2020-12-03 18:12:06', NULL, NULL, '1334440263732436994', 'xiangmu_ct', 'xiangmu_ct', 'String', NULL, 11, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334440263740825613', NULL, '2020-12-03 18:12:06', NULL, NULL, '1334440263732436994', 'jichubokuan_ct', 'jichubokuan_ct', 'String', NULL, 12, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334440263740825614', NULL, '2020-12-03 18:12:06', NULL, NULL, '1334440263732436994', 'xiangmu_sh', 'xiangmu_sh', 'String', NULL, 13, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334440263740825615', NULL, '2020-12-03 18:12:06', NULL, NULL, '1334440263732436994', 'jichubokuan_sh', 'jichubokuan_sh', 'String', NULL, 14, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334440263740825616', NULL, '2020-12-03 18:12:06', NULL, NULL, '1334440263732436994', 'diannao', 'diannao', 'String', NULL, 15, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334440263740825617', NULL, '2020-12-03 18:12:06', NULL, NULL, '1334440263732436994', 'xiaoyuanwang', 'xiaoyuanwang', 'String', NULL, 16, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334465135443451905', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'diqu', 'diqu', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334465135443451906', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'class', 'class', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334465135443451907', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'sales_11', 'sales_11', 'String', NULL, 3, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334465135443451908', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'sales_12', 'sales_12', 'String', NULL, 4, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334465135443451909', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'sales_13', 'sales_13', 'String', NULL, 5, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334465135443451910', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'sales_14', 'sales_14', 'String', NULL, 6, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334465135443451911', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'sales_15', 'sales_15', 'String', NULL, 7, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334465135443451912', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'sales_16', 'sales_16', 'String', NULL, 8, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334465135443451913', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'sales_17', 'sales_17', 'String', NULL, 9, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334465135447646210', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'sales_18', 'sales_18', 'String', NULL, 10, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334465135447646211', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'sales_19', 'sales_19', 'String', NULL, 11, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334465135447646212', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'sales_20', 'sales_20', 'String', NULL, 12, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334465135447646213', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'sales_21', 'sales_21', 'String', NULL, 13, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334465135447646214', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'sales_22', 'sales_22', 'String', NULL, 14, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334465135447646215', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'sales_31', 'sales_31', 'String', NULL, 15, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334465135447646216', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'sales_32', 'sales_32', 'String', NULL, 16, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334465135447646217', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'sales_33', 'sales_33', 'String', NULL, 17, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334465135447646218', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'sales_34', 'sales_34', 'String', NULL, 18, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334465135447646219', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'sales_35', 'sales_35', 'String', NULL, 19, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334465135447646220', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'sales_36', 'sales_36', 'String', NULL, 20, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334465135447646221', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'sales_37', 'sales_37', 'String', NULL, 21, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334465135447646222', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'sales_38', 'sales_38', 'String', NULL, 22, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334465135447646223', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'sales_39', 'sales_39', 'String', NULL, 23, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334465135447646224', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'sales_40', 'sales_40', 'String', NULL, 24, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334465135447646225', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'sales_41', 'sales_41', 'String', NULL, 25, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334465135447646226', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'sales_42', 'sales_42', 'String', NULL, 26, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334708015277879297', NULL, '2020-12-04 11:56:03', NULL, NULL, '1334708015269490689', 'city', 'city', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334708015282073601', NULL, '2020-12-04 11:56:03', NULL, NULL, '1334708015269490689', 'school', 'school', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334708015282073602', NULL, '2020-12-04 11:56:03', NULL, NULL, '1334708015269490689', 'ncnum', 'ncnum', 'String', NULL, 3, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334708015282073603', NULL, '2020-12-04 11:56:03', NULL, NULL, '1334708015269490689', 'num', 'num', 'String', NULL, 4, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334708015282073604', NULL, '2020-12-04 11:56:03', NULL, NULL, '1334708015269490689', 'name', 'name', 'String', NULL, 5, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334708015282073605', NULL, '2020-12-04 11:56:03', NULL, NULL, '1334708015269490689', 'class', 'class', 'String', NULL, 6, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334708015282073606', NULL, '2020-12-04 11:56:03', NULL, NULL, '1334708015269490689', 'pay', 'pay', 'String', NULL, 7, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334708015282073607', NULL, '2020-12-04 11:56:03', NULL, NULL, '1334708015269490689', 'paytime', 'paytime', 'String', NULL, 8, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334708015282073608', NULL, '2020-12-04 11:56:03', NULL, NULL, '1334708015269490689', 'payclass', 'payclass', 'String', NULL, 9, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334708015282073609', NULL, '2020-12-04 11:56:03', NULL, NULL, '1334708015269490689', 'pay1', 'pay1', 'String', NULL, 10, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334708015282073610', NULL, '2020-12-04 11:56:03', NULL, NULL, '1334708015269490689', 'paymoth', 'paymoth', 'String', NULL, 11, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334708015282073611', NULL, '2020-12-04 11:56:03', NULL, NULL, '1334708015269490689', 'pay2', 'pay2', 'String', NULL, 12, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334708015282073612', NULL, '2020-12-04 11:56:03', NULL, NULL, '1334708015269490689', 'tuition_09', 'tuition_09', 'String', NULL, 13, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334708015282073613', NULL, '2020-12-04 11:56:03', NULL, NULL, '1334708015269490689', 'meals_09', 'meals_09', 'String', NULL, 14, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334708015282073614', NULL, '2020-12-04 11:56:03', NULL, NULL, '1334708015269490689', 'busfee_09', 'busfee_09', 'String', NULL, 15, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334708015282073615', NULL, '2020-12-04 11:56:03', NULL, NULL, '1334708015269490689', 'tuition_10', 'tuition_10', 'String', NULL, 16, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334708015282073616', NULL, '2020-12-04 11:56:03', NULL, NULL, '1334708015269490689', 'meals_10', 'meals_10', 'String', NULL, 17, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334708015282073617', NULL, '2020-12-04 11:56:03', NULL, NULL, '1334708015269490689', 'busfee_10', 'busfee_10', 'String', NULL, 18, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334764504126402561', NULL, '2020-12-04 15:40:31', NULL, NULL, '1334763434197200897', 'city', 'city', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334764504130596866', NULL, '2020-12-04 15:40:31', NULL, NULL, '1334763434197200897', 'finish', 'finish', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334764504130596867', NULL, '2020-12-04 15:40:31', NULL, NULL, '1334763434197200897', 'semifinish', 'semifinish', 'String', NULL, 3, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334764504130596868', NULL, '2020-12-04 15:40:31', NULL, NULL, '1334763434197200897', 'time', 'time', 'String', NULL, 4, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334764504130596869', NULL, '2020-12-04 15:40:31', NULL, NULL, '1334763434197200897', 'state', 'state', 'String', NULL, 5, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334764504130596870', NULL, '2020-12-04 15:40:31', NULL, NULL, '1334763434197200897', 'attribute', 'attribute', 'String', NULL, 6, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334764504130596871', NULL, '2020-12-04 15:40:31', NULL, NULL, '1334763434197200897', 'num', 'num', 'String', NULL, 7, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334764504130596872', NULL, '2020-12-04 15:40:31', NULL, NULL, '1334763434197200897', 'gnum', 'gnum', 'String', NULL, 8, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334764504130596873', NULL, '2020-12-04 15:40:31', NULL, NULL, '1334763434197200897', 'jnum', 'jnum', 'String', NULL, 9, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334764504130596874', NULL, '2020-12-04 15:40:31', NULL, NULL, '1334763434197200897', 'wnum', 'wnum', 'String', NULL, 10, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334764504130596875', NULL, '2020-12-04 15:40:31', NULL, NULL, '1334763434197200897', 'uph', 'uph', 'String', NULL, 11, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334764504130596876', NULL, '2020-12-04 15:40:31', NULL, NULL, '1334763434197200897', 'hc', 'hc', 'String', NULL, 12, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334764504130596877', NULL, '2020-12-04 15:40:31', NULL, NULL, '1334763434197200897', 'jtime', 'jtime', 'String', NULL, 13, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334764504130596878', NULL, '2020-12-04 15:40:31', NULL, NULL, '1334763434197200897', 'yield', 'yield', 'String', NULL, 14, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334764504130596879', NULL, '2020-12-04 15:40:31', NULL, NULL, '1334763434197200897', 'beizhu', 'beizhu', 'String', NULL, 15, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334782903430754305', NULL, '2020-12-04 16:53:38', NULL, NULL, '1283730831482937345', 'name', 'name', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334782903430754306', NULL, '2020-12-04 16:53:38', NULL, NULL, '1283730831482937345', 'value', 'value', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334782903430754307', NULL, '2020-12-04 16:53:38', NULL, NULL, '1283730831482937345', 'key1', 'key1', 'String', NULL, 3, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334782903430754308', NULL, '2020-12-04 16:53:38', NULL, NULL, '1283730831482937345', 'key2', 'key2', 'String', NULL, 4, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334782903430754309', NULL, '2020-12-04 16:53:38', NULL, NULL, '1283730831482937345', 'key3', 'key3', 'String', NULL, 5, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334782903430754310', NULL, '2020-12-04 16:53:38', NULL, NULL, '1283730831482937345', 'key4', 'key4', 'String', NULL, 6, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334782903430754311', NULL, '2020-12-04 16:53:38', NULL, NULL, '1283730831482937345', 'key5', 'key5', 'String', NULL, 7, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334782903430754312', NULL, '2020-12-04 16:53:38', NULL, NULL, '1283730831482937345', 'key6', 'key6', 'String', NULL, 8, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334782903430754313', NULL, '2020-12-04 16:53:38', NULL, NULL, '1283730831482937345', 'key7', 'key7', 'String', NULL, 9, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334782903430754314', NULL, '2020-12-04 16:53:38', NULL, NULL, '1283730831482937345', 'percent', 'percent', 'String', NULL, 10, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('141dc952421a55e66fcddb94adddc48b', NULL, '2021-02-02 19:10:15', NULL, NULL, '9b7d28336b01f9a6b1a613957c3d7cda', 'sex', '性别', 'String', NULL, 10, 1, 1, 'sex', NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('15eb0c90635e9b9427a6e0a2d87f31b6', NULL, '2021-01-08 16:29:02', NULL, NULL, 'a543d8dd40f4d26839b78bd604be659e', 'chengbao_gz_money', 'chengbao_gz_money', 'String', NULL, 4, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('16cca55134a7951fe6724e5d98787498', NULL, '2021-01-05 15:09:15', NULL, NULL, '2324fac242b35938678a05bbbba345e2', 'yprice', 'yprice', 'String', NULL, 7, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('175e76d9da7c88d8c2c0d7708b308e6c', NULL, '2020-12-04 16:53:38', NULL, NULL, '28e0b01cc3e2b0d361107661527bfdff', 'key7', 'key7', 'String', NULL, 9, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('17a278c53299d1342c56a8eb1614a44e', 'admin', '2021-04-01 03:09:23', NULL, NULL, '1289140698221678593', 'ctime', 'ctime', 'String', NULL, 4, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('19e6fe3dc95b352d97f460648dc93e15', NULL, '2021-01-06 11:43:35', NULL, NULL, '1334390762455965697', 'proportion_z', 'proportion_z', 'String', NULL, 23, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1a1487eb23cc0008b933537c69d51bd9', NULL, '2021-01-05 15:09:15', NULL, NULL, '2324fac242b35938678a05bbbba345e2', 'cname', 'cname', 'String', NULL, 3, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1aee61147ee0eb946574db960bc77aec', NULL, '2021-01-08 10:47:52', NULL, NULL, 'bbc5d5ab143d59f0beab484682361aa5', 'name', 'name', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1b09540b3d8deddc06ebdbec26f6ae87', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'political', 'political', 'String', NULL, 7, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1b6fbe11728a1c4633eeea8ffb12bc25', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'update_by', 'update_by', 'String', NULL, 30, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1c649cbddf0506464e08ae84c20ea20d', NULL, '2021-01-21 18:00:57', NULL, NULL, '60b3feffadc55eb49baa5a48fdf1ff0e', 'key', 'key', 'String', NULL, 3, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1d21c72184f2e06ca1be3dc95fbcc259', NULL, '2021-01-11 14:38:14', NULL, NULL, '1317006713165049858', 'zhiwu', 'zhiwu', 'String', NULL, 5, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1d4cc138f277f5d78e1fe3f5241db7f2', NULL, '2021-01-08 16:29:02', NULL, NULL, 'a543d8dd40f4d26839b78bd604be659e', 'tb_zx_money', 'tb_zx_money', 'String', NULL, 6, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1ee3018b4d0c305e2c06f77e1e5f3c4c', NULL, '2021-01-06 11:43:35', NULL, NULL, '1334390762455965697', 'sales_3', 'sales_3', 'String', NULL, 9, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1fac3f8219222b8963dc6b85870ffd86', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'telphone', 'telphone', NULL, NULL, 16, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('21f7de0326129dbbbc03d64aceb4d3f7', 'admin', '2021-04-01 03:09:23', NULL, NULL, '1289140698221678593', 'yprice', 'yprice', 'String', NULL, 7, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('2309090975648b8765ef36ff16c09270', NULL, '2020-07-17 10:49:42', NULL, NULL, 'e0fe1d693625c906c1171d7de706a47c', 'danwei', 'danwei', NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('2330620c6a26ff9e2840fcdcb2fd22af', NULL, '2020-07-17 10:49:42', NULL, NULL, 'e0fe1d693625c906c1171d7de706a47c', 'yphone', 'yphone', NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('240f3415fa8e7b3876c0b422d468c90d', NULL, '2020-08-03 09:55:46', NULL, NULL, '6011955e58d89040fca52e7f962d0bf4', 'gname', 'gname', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('26ee0ad4aea9dcd4604f98ea168aa1be', NULL, '2020-07-28 17:46:58', NULL, NULL, '22f025b781ee9fe4746438621e82674f', 'xiaoshoujine', 'xiaoshoujine', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('27bd70e2e4a08009edf64fac0fba5119', NULL, '2020-07-17 10:49:42', NULL, NULL, 'e0fe1d693625c906c1171d7de706a47c', 'yizhu', 'yizhu', NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('284f03aead3848cf0994f71a64ce1eba', NULL, '2020-12-04 16:53:38', NULL, NULL, '28e0b01cc3e2b0d361107661527bfdff', 'key1', 'key1', 'String', NULL, 3, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('29fcb4292d4782888e9fd0496bd8ddc8', 'admin', '2021-04-01 03:09:23', NULL, NULL, '1289140698221678593', 'id', 'id', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('2a20af47c214fc8ad9570c9c6ba585c2', NULL, '2020-07-17 10:49:42', NULL, NULL, 'e0fe1d693625c906c1171d7de706a47c', 'yzhenliao', 'yzhenliao', NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('2a3b35b4830f1b1eff84a5a9bceed0b6', NULL, '2021-01-06 11:43:35', NULL, NULL, '1334390762455965697', 'gift_z', 'gift_z', 'String', NULL, 22, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('2a613408420925ed9cf9618eb77a05cf', NULL, '2020-07-17 10:49:42', NULL, NULL, 'e0fe1d693625c906c1171d7de706a47c', 'yage', 'yage', NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('2baefff331206f29a9c3bf895982473a', NULL, '2020-07-17 10:49:42', NULL, NULL, 'e0fe1d693625c906c1171d7de706a47c', 'kdata', 'kdata', NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('2be25d6c7e3ac28abec99854618d0e3d', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'birthday', 'birthday', 'String', NULL, 5, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('2f94a4be25426f3f4013c50103559969', NULL, '2021-01-06 11:43:35', NULL, NULL, '1334390762455965697', 'sales_4', 'sales_4', 'String', NULL, 12, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('30034c384d47b0193e04b19b3068b89b', NULL, '2020-12-04 16:53:38', NULL, NULL, '28e0b01cc3e2b0d361107661527bfdff', 'key4', 'key4', 'String', NULL, 6, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('30f8183ff4ec5a6b30724a1da7fbbed0', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'pworktime', 'pworktime', NULL, NULL, 18, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('30fc020c8d14776e96350edb479f40ac', NULL, '2021-02-02 19:30:23', NULL, NULL, '629609c4d540cb4675e9064af8955296', 'zhuzhi', 'zhuzhi', 'String', NULL, 5, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('31649efb1fbc69009bdbb41f388c7d7f', NULL, '2020-07-17 10:49:42', NULL, NULL, 'e0fe1d693625c906c1171d7de706a47c', 'ysex', 'ysex', NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('31bd06f8bc201628d8c9c56b29f0621e', NULL, '2020-07-17 10:49:42', NULL, NULL, 'e0fe1d693625c906c1171d7de706a47c', 'yjieguo', 'yjieguo', NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('32545e398eea7bf89791cc78dd16ab12', NULL, '2021-02-02 19:30:23', NULL, NULL, '629609c4d540cb4675e9064af8955296', 'yhnum', 'yhnum', 'String', NULL, 8, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('334ffa2aec9300ff712a1f3f3143a4cd', NULL, '2021-01-08 16:29:02', NULL, NULL, '4af57d343f1d6521b71b85097b580786', 'bx_gg_moeny', 'bx_gg_moeny', 'String', NULL, 5, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('34c933903ddf6ba5bad588d913c487c5', NULL, '2021-01-06 11:43:35', NULL, NULL, '1334390762455965697', 'gift_4', 'gift_4', 'String', NULL, 13, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('350be7312c299482acfe44fb086f91c1', NULL, '2021-01-06 11:43:35', NULL, NULL, '1334390762455965697', 'sales_5', 'sales_5', 'String', NULL, 15, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('35c224f8acfb063af6828b31e31f3967', NULL, '2020-12-04 16:53:38', NULL, NULL, '28e0b01cc3e2b0d361107661527bfdff', 'percent', 'percent', 'String', NULL, 10, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('35d9204189dd1d1f142a7587f89ab46c', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'email', 'email', 'String', NULL, 18, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('37868bf0bad09f6d2084340e0b05333d', NULL, '2021-02-02 19:30:23', NULL, NULL, '629609c4d540cb4675e9064af8955296', 'sf4', 'sf4', 'String', NULL, 18, 0, NULL, 'ttype', NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('38b2955e0ef75d384d0d9ff8417e4945', NULL, '2021-02-02 19:30:23', NULL, NULL, '629609c4d540cb4675e9064af8955296', 'sf3', 'sf3', 'String', NULL, 17, 0, NULL, 'ttype', NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('3c2a8313af79dbecba4c5687b65a66ab', 'admin', '2021-04-01 03:09:23', NULL, NULL, '1289140698221678593', 'cnum', 'cnum', 'String', NULL, 5, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('3c71c10a0d27796808cb201e30024fe8', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'school', 'school', 'String', NULL, 14, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('3c7597c1efa73ca9400cdc36a9a48e23', NULL, '2021-01-06 11:43:35', NULL, NULL, '1334390762455965697', 'gift_1', 'gift_1', 'String', NULL, 4, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('3cd9d09176d10d3225e4fe86b4538739', NULL, '2020-12-17 16:59:12', NULL, NULL, '7911bd189c2d53e182693bd599a315a2', 'type', 'type', 'String', NULL, 3, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('3d0f4b223f7ada50a7363235ae39e675', NULL, '2020-07-28 17:46:58', NULL, NULL, '22f025b781ee9fe4746438621e82674f', 'hnum', 'hnum', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('3ec76a981ff5353d4a65052963166477', NULL, '2020-12-17 17:13:21', NULL, NULL, '9b75c161322e0b7e29b3ffc84239a72c', 'value', 'value', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('3f5a04060285392287f4e7f6d59988c6', NULL, '2020-08-03 09:55:46', NULL, NULL, '6011955e58d89040fca52e7f962d0bf4', 'tdata', 'tdata', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('3f7ce1ee2ad20770e64016384f2c1cd5', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'homephone', 'homephone', NULL, NULL, 17, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('42225abb0677e51111a8e9e7b001332c', NULL, '2021-02-02 19:30:23', NULL, NULL, '629609c4d540cb4675e9064af8955296', 'yjine', 'yjine', 'String', NULL, 10, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('445c1d5a76a45fb0137425d1a51be6d7', NULL, '2021-01-08 16:10:28', NULL, NULL, '4dc208eb92fd1a84ef7b4723251e3e51', 'main_income', 'main_income', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('450316da5f9b7d8505944e16f1284a38', NULL, '2021-01-08 16:10:28', NULL, NULL, '7b20679054449c554cde856ef24126ab', 'monty', 'monty', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('467edbfc6ca934a7a4d600391ed0fb75', NULL, '2021-01-08 16:29:02', NULL, NULL, '4af57d343f1d6521b71b85097b580786', 'bx_jj_yongjin', 'bx_jj_yongjin', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('468acf3a75a559a283e8f424db3ac4a8', NULL, '2020-12-04 16:53:38', NULL, NULL, '28e0b01cc3e2b0d361107661527bfdff', 'value', 'value', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('46f68d27013cff9b09c5d059c79fbf28', NULL, '2021-02-02 19:10:15', NULL, NULL, '9b7d28336b01f9a6b1a613957c3d7cda', 'gtime', '雇佣时间', 'date', NULL, 3, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('472e430a024d9648a7ab8a125419b161', NULL, '2021-01-05 15:09:15', NULL, NULL, '2324fac242b35938678a05bbbba345e2', 'cprice', 'cprice', 'String', NULL, 6, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('48b03a60cab1f280d4b304da6b27dae2', NULL, '2021-01-05 15:09:15', NULL, NULL, '2324fac242b35938678a05bbbba345e2', 'ctime', 'ctime', 'String', NULL, 4, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('4942cc4d04ac7330799ecc3fec48ac8b', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'id_card', 'id_card', 'String', NULL, 12, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('49def4afc641cb52775ff03fdba3007a', NULL, '2021-01-08 16:10:28', NULL, NULL, '7b20679054449c554cde856ef24126ab', 'his_lowest', 'his_lowest', 'String', NULL, 4, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('49fa04e98f2ed62966d7f6141611dd7e', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'children', 'children', NULL, NULL, 24, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('49febadfe1eb3a59bfbe802d506aa590', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'data', 'data', NULL, NULL, 3, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('4b9e347c71a67de7a7a466b07109a101', NULL, '2020-07-21 15:17:10', NULL, NULL, 'c9bdb6b7ac68accfecb366718bf78f79', 'zhaiyao', 'zhaiyao', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('4d782de2bf10be3a79f04e8841053f00', NULL, '2021-01-08 10:47:52', NULL, NULL, 'f7649b77cfc9e0a9dacdac370cd4036b', 'pingjia', 'pingjia', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('4d7dd94ecf26b5fa69f9a1f811583340', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'address', 'address', 'String', NULL, 16, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('502a0a66b4dbf8689ed36e56ab272c2f', NULL, '2021-02-02 19:10:15', NULL, NULL, '9b7d28336b01f9a6b1a613957c3d7cda', 'birth', '出生日期', 'String', NULL, 6, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('52444b20f2fcdfe43461a5a49079e4dc', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'health', 'health', 'String', NULL, 11, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('537477711047733248', 'admin', '2021-04-01 05:54:42', NULL, NULL, '537477711022567424', 'id', 'id', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('537477711056121856', 'admin', '2021-04-01 05:54:42', NULL, NULL, '537477711022567424', 'name', 'name', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('537477711064510464', 'admin', '2021-04-01 05:54:42', NULL, NULL, '537477711022567424', 'gtime', 'gtime', 'String', NULL, 3, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('537477711072899072', 'admin', '2021-04-01 05:54:42', NULL, NULL, '537477711022567424', 'update_by', 'update_by', 'String', NULL, 4, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('537477711077093376', 'admin', '2021-04-01 05:54:42', NULL, NULL, '537477711022567424', 'jphone', 'jphone', 'String', NULL, 5, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('537477711085481984', 'admin', '2021-04-01 05:54:42', NULL, NULL, '537477711022567424', 'birth', 'birth', 'String', NULL, 6, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('537477711093870592', 'admin', '2021-04-01 05:54:42', NULL, NULL, '537477711022567424', 'hukou', 'hukou', 'String', NULL, 7, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('537477711102259200', 'admin', '2021-04-01 05:54:42', NULL, NULL, '537477711022567424', 'laddress', 'laddress', 'String', NULL, 8, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('537477711106453504', 'admin', '2021-04-01 05:54:42', NULL, NULL, '537477711022567424', 'jperson', 'jperson', 'String', NULL, 9, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('537477711110647808', 'admin', '2021-04-01 05:54:42', NULL, NULL, '537477711022567424', 'sex', 'sex', 'String', NULL, 10, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('537478337303457792', 'admin', '2021-04-01 05:54:37', NULL, NULL, '537478337278291968', 'id', 'id', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('537478337320235008', 'admin', '2021-04-01 05:54:37', NULL, NULL, '537478337278291968', 'create_by', 'create_by', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('537478337328623616', 'admin', '2021-04-01 05:54:37', NULL, NULL, '537478337278291968', 'create_time', 'create_time', 'String', NULL, 3, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('537478337332817920', 'admin', '2021-04-01 05:54:37', NULL, NULL, '537478337278291968', 'update_by', 'update_by', 'String', NULL, 4, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('537478337341206528', 'admin', '2021-04-01 05:54:37', NULL, NULL, '537478337278291968', 'update_time', 'update_time', 'String', NULL, 5, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('537478337349595136', 'admin', '2021-04-01 05:54:37', NULL, NULL, '537478337278291968', 'data_table', 'data_table', 'String', NULL, 6, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('537478337353789440', 'admin', '2021-04-01 05:54:37', NULL, NULL, '537478337278291968', 'data_id', 'data_id', 'String', NULL, 7, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('537478337362178048', 'admin', '2021-04-01 05:54:37', NULL, NULL, '537478337278291968', 'data_content', 'data_content', 'String', NULL, 8, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('537478337370566656', 'admin', '2021-04-01 05:54:37', NULL, NULL, '537478337278291968', 'data_version', 'data_version', 'String', NULL, 9, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('537478337378955264', 'admin', '2021-04-01 05:54:37', NULL, NULL, '537478337278291968', 'rownum_', 'rownum_', 'String', NULL, 10, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('537478706330906624', 'admin', '2021-04-01 05:56:44', NULL, NULL, '537478706314129408', 'id', 'id', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('537478706343489536', 'admin', '2021-04-01 05:56:44', NULL, NULL, '537478706314129408', 'cname', 'cname', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('537478706351878144', 'admin', '2021-04-01 05:56:44', NULL, NULL, '537478706314129408', 'cnum', 'cnum', 'String', NULL, 3, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('537478706356072448', 'admin', '2021-04-01 05:56:44', NULL, NULL, '537478706314129408', 'cprice', 'cprice', 'String', NULL, 4, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('537478706360266752', 'admin', '2021-04-01 05:56:44', NULL, NULL, '537478706314129408', 'ctotal', 'ctotal', 'String', NULL, 5, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('537478706368655360', 'admin', '2021-04-01 05:56:44', NULL, NULL, '537478706314129408', 'tp', 'tp', 'String', NULL, 6, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('537478706377043968', 'admin', '2021-04-01 05:56:44', NULL, NULL, '537478706314129408', 'dtotal', 'dtotal', 'String', NULL, 7, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('537478706381238272', 'admin', '2021-04-01 05:56:44', NULL, NULL, '537478706314129408', 'ztotal', 'ztotal', 'String', NULL, 8, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('537478706389626880', 'admin', '2021-04-01 05:56:44', NULL, NULL, '537478706314129408', 'd_id', 'd_id', 'String', NULL, 9, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('538563757aa1a49935824ce14568f27c', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'archivesdi', 'archivesdi', NULL, NULL, 34, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('53bb8b7ef4c8d8dc9b151f07929fb587', NULL, '2020-07-28 17:46:58', NULL, NULL, '22f025b781ee9fe4746438621e82674f', 'xinghao', 'xinghao', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('5406c33ff49384c2bcad5b85a9701355', NULL, '2021-01-06 11:43:35', NULL, NULL, '1334390762455965697', 'province', 'province', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('558e3bb304d51582f225ec1d911cb4b8', NULL, '2021-01-05 15:09:15', NULL, NULL, '2324fac242b35938678a05bbbba345e2', 'id', 'id', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574537851944955904', 'admin', '2021-07-12 12:15:09', NULL, NULL, '94bcd8202bc6bc467efd0d679dadd7bb', 'name', 'name', 'String', NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574537852028841984', 'admin', '2021-07-12 12:15:09', NULL, NULL, '94bcd8202bc6bc467efd0d679dadd7bb', 'sex', 'sex', 'String', NULL, 1, NULL, NULL, 'sex', NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574537852054007808', 'admin', '2021-07-12 12:15:09', NULL, NULL, '94bcd8202bc6bc467efd0d679dadd7bb', 'tp', 'tp', 'String', NULL, 2, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574537852070785024', 'admin', '2021-07-12 12:15:09', NULL, NULL, '94bcd8202bc6bc467efd0d679dadd7bb', 'tm', 'tm', 'String', NULL, 3, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574537852079173632', 'admin', '2021-07-12 12:15:09', NULL, NULL, '94bcd8202bc6bc467efd0d679dadd7bb', 'nation', 'nation', 'String', NULL, 4, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574537852095950848', 'admin', '2021-07-12 12:15:09', NULL, NULL, '94bcd8202bc6bc467efd0d679dadd7bb', 'birth', 'birth', 'String', NULL, 5, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574537852108533760', 'admin', '2021-07-12 12:15:09', NULL, NULL, '94bcd8202bc6bc467efd0d679dadd7bb', 'zhuzhi', 'zhuzhi', 'String', NULL, 6, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574537852125310976', 'admin', '2021-07-12 12:15:09', NULL, NULL, '94bcd8202bc6bc467efd0d679dadd7bb', 'card', 'card', 'String', NULL, 7, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574537852137893888', 'admin', '2021-07-12 12:15:09', NULL, NULL, '94bcd8202bc6bc467efd0d679dadd7bb', 'ydate', 'ydate', 'String', NULL, 8, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574537852150476800', 'admin', '2021-07-12 12:15:09', NULL, NULL, '94bcd8202bc6bc467efd0d679dadd7bb', 'qfjg', 'qfjg', 'String', NULL, 9, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574537852163059712', 'admin', '2021-07-12 12:15:09', NULL, NULL, '94bcd8202bc6bc467efd0d679dadd7bb', 'slyy', 'slyy', 'String', NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574537852175642624', 'admin', '2021-07-12 12:15:09', NULL, NULL, '94bcd8202bc6bc467efd0d679dadd7bb', 'sdate', 'sdate', 'String', NULL, 11, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574537852192419840', 'admin', '2021-07-12 12:15:09', NULL, NULL, '94bcd8202bc6bc467efd0d679dadd7bb', 'shao', 'shao', 'String', NULL, 12, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574537852209197056', 'admin', '2021-07-12 12:15:09', NULL, NULL, '94bcd8202bc6bc467efd0d679dadd7bb', 'cbr', 'cbr', 'String', NULL, 13, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574537852221779968', 'admin', '2021-07-12 12:15:09', NULL, NULL, '94bcd8202bc6bc467efd0d679dadd7bb', 'sld', 'sld', 'String', NULL, 14, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574537852238557184', 'admin', '2021-07-12 12:15:09', NULL, NULL, '94bcd8202bc6bc467efd0d679dadd7bb', 'sr', 'sr', 'String', NULL, 15, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574537852272111616', 'admin', '2021-07-12 12:15:09', NULL, NULL, '94bcd8202bc6bc467efd0d679dadd7bb', 'jphone', 'jphone', 'String', NULL, 16, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574537852288888832', 'admin', '2021-07-12 12:15:09', NULL, NULL, '94bcd8202bc6bc467efd0d679dadd7bb', 'lzr', 'lzr', 'String', NULL, 17, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574537852305666048', 'admin', '2021-07-12 12:15:09', NULL, NULL, '94bcd8202bc6bc467efd0d679dadd7bb', 'ldate', 'ldate', 'String', NULL, 18, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574537852318248960', 'admin', '2021-07-12 12:15:09', NULL, NULL, '94bcd8202bc6bc467efd0d679dadd7bb', 'sk', 'sk', 'String', NULL, 19, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574537852335026176', 'admin', '2021-07-12 12:15:09', NULL, NULL, '94bcd8202bc6bc467efd0d679dadd7bb', 'dizhi', 'dizhi', 'String', NULL, 20, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873662045417472', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873661957337088', 'department', 'department', NULL, NULL, 1, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873662129303552', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873661957337088', 'post', 'post', NULL, NULL, 2, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873662183829504', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873661957337088', 'data', 'data', NULL, NULL, 3, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873662238355456', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873661957337088', 'name', 'name', NULL, NULL, 4, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873662263521280', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873661957337088', 'sex', 'sex', NULL, NULL, 5, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873662368378880', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873661957337088', 'birth', 'birth', NULL, NULL, 6, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873662393544704', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873661957337088', 'political', 'political', NULL, NULL, 7, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873662418710528', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873661957337088', 'office', 'office', NULL, NULL, 8, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873662443876352', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873661957337088', 'nation', 'nation', NULL, NULL, 9, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873662464847872', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873661957337088', 'health', 'health', NULL, NULL, 10, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873662490013696', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873661957337088', 'register', 'register', NULL, NULL, 11, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873662510985216', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873661957337088', 'education', 'education', NULL, NULL, 12, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873662531956736', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873661957337088', 'major', 'major', NULL, NULL, 13, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873662557122560', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873661957337088', 'gdata', 'gdata', NULL, NULL, 14, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873662590676992', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873661957337088', 'mailbox', 'mailbox', NULL, NULL, 15, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873662611648512', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873661957337088', 'telphone', 'telphone', NULL, NULL, 16, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873662645202944', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873661957337088', 'homephone', 'homephone', NULL, NULL, 17, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873662661980160', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873661957337088', 'pworktime', 'pworktime', NULL, NULL, 18, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873662678757376', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873661957337088', 'entrytime', 'entrytime', NULL, NULL, 19, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873662695534592', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873661957337088', 'school', 'school', NULL, NULL, 20, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873662716506112', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873661957337088', 'idcard', 'idcard', NULL, NULL, 21, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873662733283328', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873661957337088', 'party', 'party', NULL, NULL, 22, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873662745866240', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873661957337088', 'marital', 'marital', NULL, NULL, 23, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873662762643456', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873661957337088', 'children', 'children', NULL, NULL, 24, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873662779420672', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873661957337088', 'hukoustreet', 'hukoustreet', NULL, NULL, 25, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873662796197888', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873661957337088', 'hukounum', 'hukounum', NULL, NULL, 26, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873662812975104', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873661957337088', 'hukoudi', 'hukoudi', NULL, NULL, 27, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873662829752320', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873661957337088', 'currentdi', 'currentdi', NULL, NULL, 28, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873662854918144', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873661957337088', 'currentnum', 'currentnum', NULL, NULL, 29, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873662884278272', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873661957337088', 'socialsecurity', 'socialsecurity', NULL, NULL, 30, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873662905249792', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873661957337088', 'providentfund', 'providentfund', NULL, NULL, 31, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873662926221312', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873661957337088', 'hobby', 'hobby', NULL, NULL, 32, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873662942998528', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873661957337088', 'sbtype', 'sbtype', NULL, NULL, 33, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873662959775744', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873661957337088', 'archivesdi', 'archivesdi', NULL, NULL, 34, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873663035273216', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873663005913088', 'kdate', 'kdate', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873663052050432', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873663005913088', 'jdate', 'jdate', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873663077216256', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873663005913088', 'jstudent', 'jstudent', 'String', NULL, 3, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873663093993472', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873663005913088', 'zhuanye', 'zhuanye', 'String', NULL, 4, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873663114964992', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873663005913088', 'zhiwu', 'zhiwu', 'String', NULL, 5, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873663194656768', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873663161102336', 'zmphone', 'zmphone', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873663211433984', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873663161102336', 'jstudent', 'jstudent', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873663236599808', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873663161102336', 'kdate', 'kdate', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873663261765632', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873663161102336', 'jdate', 'jdate', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873663291125760', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873663161102336', 'zmname', 'zmname', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873663370817536', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873663341457408', 'zcname', 'zcname', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873663391789056', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873663341457408', 'danwei', 'danwei', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873663408566272', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873663341457408', 'fdate', 'fdate', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873663429537792', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873663341457408', 'jibie', 'jibie', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873663450509312', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873663341457408', 'beizhu', 'beizhu', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873663538589696', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873663500840960', 'danwei', 'danwei', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873663563755520', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873663500840960', 'phone', 'phone', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873663584727040', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873663500840960', 'name', 'name', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873663609892864', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873663500840960', 'zzmm', 'zzmm', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873663626670080', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873663500840960', 'guanxi', 'guanxi', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873663656030208', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873663500840960', 'age', 'age', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873663714750464', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873663693778944', 'date', 'date', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873663731527680', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873663693778944', 'mingcheng', 'mingcheng', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873663756693504', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873663693778944', 'didian', 'didian', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875722493063168', 'admin', '2021-07-13 10:37:43', NULL, NULL, '574875722388205568', 'name', 'name', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875722530811904', 'admin', '2021-07-13 10:37:43', NULL, NULL, '574875722388205568', 'pingjia', 'pingjia', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875722551783424', 'admin', '2021-07-13 10:37:43', NULL, NULL, '574875722388205568', 'lingdao', 'lingdao', 'String', NULL, 3, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875722581143552', 'admin', '2021-07-13 10:37:43', NULL, NULL, '574875722388205568', 'shijian', 'shijian', 'String', NULL, 4, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875730747453440', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875730650984448', 'department', 'department', NULL, NULL, 1, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875730768424960', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875730650984448', 'post', 'post', NULL, NULL, 2, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875730785202176', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875730650984448', 'data', 'data', NULL, NULL, 3, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875730818756608', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875730650984448', 'name', 'name', NULL, NULL, 4, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875730835533824', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875730650984448', 'sex', 'sex', NULL, NULL, 5, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875730856505344', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875730650984448', 'birth', 'birth', NULL, NULL, 6, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875730885865472', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875730650984448', 'political', 'political', NULL, NULL, 7, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875730906836992', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875730650984448', 'office', 'office', NULL, NULL, 8, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875730932002816', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875730650984448', 'nation', 'nation', NULL, NULL, 9, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875730961362944', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875730650984448', 'health', 'health', NULL, NULL, 10, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875730986528768', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875730650984448', 'register', 'register', NULL, NULL, 11, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875731011694592', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875730650984448', 'education', 'education', NULL, NULL, 12, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875731070414848', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875730650984448', 'major', 'major', NULL, NULL, 13, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875731095580672', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875730650984448', 'gdata', 'gdata', NULL, NULL, 14, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875731116552192', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875730650984448', 'mailbox', 'mailbox', NULL, NULL, 15, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875731137523712', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875730650984448', 'telphone', 'telphone', NULL, NULL, 16, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875731166883840', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875730650984448', 'homephone', 'homephone', NULL, NULL, 17, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875731187855360', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875730650984448', 'pworktime', 'pworktime', NULL, NULL, 18, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875731213021184', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875730650984448', 'entrytime', 'entrytime', NULL, NULL, 19, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875731242381312', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875730650984448', 'school', 'school', NULL, NULL, 20, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875731259158528', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875730650984448', 'idcard', 'idcard', NULL, NULL, 21, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875731280130048', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875730650984448', 'party', 'party', NULL, NULL, 22, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875731305295872', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875730650984448', 'marital', 'marital', NULL, NULL, 23, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875731326267392', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875730650984448', 'children', 'children', NULL, NULL, 24, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875731343044608', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875730650984448', 'hukoustreet', 'hukoustreet', NULL, NULL, 25, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875731364016128', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875730650984448', 'hukounum', 'hukounum', NULL, NULL, 26, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875731389181952', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875730650984448', 'hukoudi', 'hukoudi', NULL, NULL, 27, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875731414347776', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875730650984448', 'currentdi', 'currentdi', NULL, NULL, 28, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875731443707904', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875730650984448', 'currentnum', 'currentnum', NULL, NULL, 29, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875731460485120', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875730650984448', 'socialsecurity', 'socialsecurity', NULL, NULL, 30, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875731489845248', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875730650984448', 'providentfund', 'providentfund', NULL, NULL, 31, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875731506622464', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875730650984448', 'hobby', 'hobby', NULL, NULL, 32, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875731527593984', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875730650984448', 'sbtype', 'sbtype', NULL, NULL, 33, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875731548565504', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875730650984448', 'archivesdi', 'archivesdi', NULL, NULL, 34, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875731619868672', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875731594702848', 'kdate', 'kdate', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875731640840192', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875731594702848', 'jdate', 'jdate', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875731661811712', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875731594702848', 'jstudent', 'jstudent', 'String', NULL, 3, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875731678588928', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875731594702848', 'zhuanye', 'zhuanye', 'String', NULL, 4, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875731699560448', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875731594702848', 'zhiwu', 'zhiwu', 'String', NULL, 5, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875731762475008', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875731737309184', 'zmphone', 'zmphone', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875731779252224', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875731737309184', 'jstudent', 'jstudent', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875731800223744', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875731737309184', 'kdate', 'kdate', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875731812806656', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875731737309184', 'jdate', 'jdate', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875731833778176', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875731737309184', 'zmname', 'zmname', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875731892498432', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875731867332608', 'zcname', 'zcname', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875731909275648', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875731867332608', 'danwei', 'danwei', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875731926052864', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875731867332608', 'fdate', 'fdate', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875731942830080', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875731867332608', 'jibie', 'jibie', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875731959607296', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875731867332608', 'beizhu', 'beizhu', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875732018327552', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875731997356032', 'danwei', 'danwei', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875732030910464', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875731997356032', 'phone', 'phone', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875732047687680', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875731997356032', 'name', 'name', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875732068659200', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875731997356032', 'zzmm', 'zzmm', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875732085436416', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875731997356032', 'guanxi', 'guanxi', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875732102213632', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875731997356032', 'age', 'age', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875732148350976', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875732131573760', 'date', 'date', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875732165128192', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875732131573760', 'mingcheng', 'mingcheng', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875732181905408', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875732131573760', 'didian', 'didian', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('57ee0e6ffe7135a943dde2408d424c97', NULL, '2021-01-06 11:43:35', NULL, NULL, '1334390762455965697', 'proportion_1', 'proportion_1', 'String', NULL, 5, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('589a5a4fe61fc71aa1bf45d3bd73974b', NULL, '2020-12-17 19:50:14', NULL, NULL, 'fb70a91730f087f8023afd88d24f9697', 'name', 'name', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('5a88459afcf01cc20ac5a50322b35fd6', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'hukounum', 'hukounum', NULL, NULL, 26, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('5b7f7bebf0c3951b891026e7c2ac90cb', NULL, '2020-08-03 09:55:46', NULL, NULL, '6011955e58d89040fca52e7f962d0bf4', 'didian', 'didian', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('5bc99af9cfddd240794167a6765a1517', NULL, '2021-01-08 16:29:02', NULL, NULL, '4af57d343f1d6521b71b85097b580786', 'neikong_zx_money', 'neikong_zx_money', 'String', NULL, 7, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('5bf6aee0bd8f676a218e0210e9e6fa0e', NULL, '2020-12-17 16:59:12', NULL, NULL, '7911bd189c2d53e182693bd599a315a2', 'name', 'name', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('5cf4a1ca15691d6340e522e1831dc3ac', NULL, '2021-01-06 11:43:35', NULL, NULL, '1334390762455965697', 'sales_6', 'sales_6', 'String', NULL, 18, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('5e4e8b7531a88f4db1a0d133de159494', NULL, '2020-08-03 09:55:46', NULL, NULL, '6011955e58d89040fca52e7f962d0bf4', 'num', 'num', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('6020e457162b86b75a2d335999ab06ec', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'nation', 'nation', 'String', NULL, 6, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('631632bc2243018788d11d4f8348bfd2', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'socialsecurity', 'socialsecurity', NULL, NULL, 30, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('6394ea45a090ca79cfbfdbbfe2016d95', NULL, '2020-07-17 10:49:42', NULL, NULL, 'e0fe1d693625c906c1171d7de706a47c', 'yprice', 'yprice', NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('64ff8b4e61a58a0ca3e34108c9bd97c0', NULL, '2021-01-08 16:29:02', NULL, NULL, 'a543d8dd40f4d26839b78bd604be659e', 'bx_gg_moeny', 'bx_gg_moeny', 'String', NULL, 5, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('665f13c7fcebac6c35c894d885c4b344', NULL, '2021-01-06 11:43:35', NULL, NULL, '1334390762455965697', 'proportion_6', 'proportion_6', 'String', NULL, 20, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('677bf4d6400fc465067b0d5bd6ad2a58', NULL, '2021-01-06 11:43:35', NULL, NULL, '1334390762455965697', 'gift_2', 'gift_2', 'String', NULL, 7, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('6a3544cc8c028e94692bb1b448620ec2', NULL, '2020-07-17 10:49:42', NULL, NULL, 'e0fe1d693625c906c1171d7de706a47c', 'yname', 'yname', NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('6c2b1c9e4cfd3f6b79d0fb26fea72cec', NULL, '2020-08-03 09:55:46', NULL, NULL, '6011955e58d89040fca52e7f962d0bf4', 'zhaiyao', 'zhaiyao', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('6c8250304aa25753f64c6f4723e6d2d8', NULL, '2020-07-28 17:46:58', NULL, NULL, '22f025b781ee9fe4746438621e82674f', 'fahuocangku', 'fahuocangku', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('6d4b24ab2f685556d6161a86658329c8', NULL, '2021-01-21 16:25:09', NULL, NULL, 'd4a29dfda94357308faf62be2b94db08', 'name', 'name', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('6dae70a5323b3d517c8f13278f0e1d5f', NULL, '2021-01-06 11:43:35', NULL, NULL, '1334390762455965697', 'proportion_5', 'proportion_5', 'String', NULL, 17, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('6ec41a06e2dee9ec8f07a894ddcaaae5', NULL, '2021-02-02 19:10:15', NULL, NULL, '9b7d28336b01f9a6b1a613957c3d7cda', 'jphone', 'jphone', 'String', NULL, 5, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('70abaf24c413f38ff6a3c315ad8824b2', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'height', 'height', 'String', NULL, 9, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('710104c3e0541602a151d5e00fc2ee29', NULL, '2020-12-17 16:42:21', NULL, NULL, '654609e4247a0469e0b2befbc69b00f9', 'type', 'type', 'String', NULL, 3, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('718a062a1e42276c1913c7d7836b1bee', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'hobby', 'hobby', NULL, NULL, 32, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('71cb567cd27fda05d55d80324c7b59e1', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'del_flag', 'del_flag', 'String', NULL, 32, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('729c2d2c70da0f3bc092f4aab4432244', NULL, '2020-12-17 16:42:21', NULL, NULL, '654609e4247a0469e0b2befbc69b00f9', 'name', 'name', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('732c8b168ade2e34974c9db6396df61f', NULL, '2021-02-02 19:30:23', NULL, NULL, '629609c4d540cb4675e9064af8955296', 'type', 'type', 'String', NULL, 12, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('742954cf518d8026db68cc87c017ad2a', NULL, '2021-02-02 19:30:23', NULL, NULL, '629609c4d540cb4675e9064af8955296', 'bz', 'bz', 'String', NULL, 19, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('765d95a760a36d0c853bec639af85302', NULL, '2021-01-05 15:09:15', NULL, NULL, '2324fac242b35938678a05bbbba345e2', 'bianma', 'bianma', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('768fb670937ab4aadde39842df36bfd3', 'admin', '2021-04-01 03:09:23', NULL, NULL, '1289140698221678593', 'cprice', 'cprice', 'String', NULL, 6, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('79f29ea3b1c7ec966077941fdd004e4d', NULL, '2021-01-08 16:29:02', NULL, NULL, 'a543d8dd40f4d26839b78bd604be659e', 'bx_zx_money', 'bx_zx_money', 'String', NULL, 3, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('7b794ecee6f61f64839eb1094a7c20bb', NULL, '2021-01-06 11:43:35', NULL, NULL, '1334390762455965697', 'region', 'region', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('7c2c06cc52978c4e5665deac1784535d', NULL, '2021-02-02 19:30:23', NULL, NULL, '629609c4d540cb4675e9064af8955296', 'yren', 'yren', 'String', NULL, 9, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('7df83cf21e083451a47f2f731a225a7e', NULL, '2020-07-28 17:46:58', NULL, NULL, '22f025b781ee9fe4746438621e82674f', 'num', 'num', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('7e564f212697079394030ac0563df496', NULL, '2020-06-16 18:14:25', NULL, NULL, 'e4cec9ff15bc0ea42f536a442a6d1335', 'id', 'id', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('7f5570e3056d82210d7d4e79b861560c', NULL, '2021-02-02 19:10:15', NULL, NULL, '9b7d28336b01f9a6b1a613957c3d7cda', 'laddress', 'laddress', 'String', NULL, 8, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('80017f23232ea91ae32e4718eb10e8c3', NULL, '2021-01-06 11:43:35', NULL, NULL, '1334390762455965697', 'proportion_4', 'proportion_4', 'String', NULL, 14, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('80b5e3fd550d9be1a8c8ea69a2a593f8', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'birth', 'birth', NULL, NULL, 6, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('81dea8f0ccba2b3530038ebcf92b36b1', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'name', 'name', 'String', NULL, 3, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('81f2de244fa1e6b5f28419f60c4db169', NULL, '2020-06-16 18:14:25', NULL, NULL, 'e4cec9ff15bc0ea42f536a442a6d1335', 'bnum', 'bnum', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('83da395758d9bca23b2c5b9f54e79eed', NULL, '2021-01-21 16:25:09', NULL, NULL, 'd4a29dfda94357308faf62be2b94db08', 'value', 'value', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('84391d55c9bd4185c4abbc0d9a8a3f9b', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'native_place', 'native_place', 'String', NULL, 8, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('85263a305fba4c7e7a991ed3b416e006', NULL, '2020-12-17 16:42:21', NULL, NULL, '654609e4247a0469e0b2befbc69b00f9', 'value', 'value', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('865ca077977b78934e5e82e733ef4e47', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'major', 'major', 'String', NULL, 15, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('8749d00c6c3cf873841a227a5206478a', NULL, '2021-01-06 11:43:35', NULL, NULL, '1334390762455965697', 'sales_1', 'sales_1', 'String', NULL, 3, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('87f43f4f5220c34a95d55ff3fa9de0c1', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'health', 'health', NULL, NULL, 10, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('8875e4280c1a62759ec4b3719b5f9566', NULL, '2021-01-08 10:47:52', NULL, NULL, 'bbc5d5ab143d59f0beab484682361aa5', 'lingdao', 'lingdao', 'String', NULL, 3, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('88b19703dac5a5ae8c01c68101cd8b5b', NULL, '2021-02-02 19:30:23', NULL, NULL, '629609c4d540cb4675e9064af8955296', 'cbz', 'cbz', 'String', NULL, 14, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('89bd5c1f5b37b82ab2d56d8c9e50a674', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'sex', 'sex', 'String', NULL, 4, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('8a122291db744a6109a93af5d289787f', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'computer_level', 'computer_level', 'String', NULL, 22, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('8ab8d51dfb792cdc767e68d7e9370f3d', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'num', 'num', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('8bfc84f6d610581d736fcccc5f04a863', NULL, '2021-02-02 19:30:23', NULL, NULL, '629609c4d540cb4675e9064af8955296', 'scard', 'scard', 'String', NULL, 7, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('8d186f249df9e1c1c549fbdc6a0a4d77', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'currentdi', 'currentdi', NULL, NULL, 28, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('8db810062e3a19eb83fca651691b848e', NULL, '2021-01-06 11:43:35', NULL, NULL, '1334390762455965697', 'sales_2', 'sales_2', 'String', NULL, 6, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('8e39d42a7fad183fe75ce1a56f148db1', 'admin', '2021-04-01 03:09:23', NULL, NULL, '1289140698221678593', 'bianma', 'bianma', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('8fb12c3929ea745f94cc4a90df9d5181', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'idcard', 'idcard', NULL, NULL, 21, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('9168272dc8fa019a861f11b81bea1dc2', NULL, '2021-01-08 16:29:02', NULL, NULL, 'a543d8dd40f4d26839b78bd604be659e', 'bx_jj_yongjin', 'bx_jj_yongjin', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('9238ae757fb73c0ef546d7e0e91aa662', NULL, '2020-07-28 17:46:58', NULL, NULL, '22f025b781ee9fe4746438621e82674f', 's_id', 's_id', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('9282683fd000d19b205ad6841f0f7b6e', NULL, '2021-01-08 16:29:02', NULL, NULL, '4af57d343f1d6521b71b85097b580786', 'total', 'total', 'String', NULL, 8, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('94fc5c2791e2e218383864b80095c89c', NULL, '2021-02-02 19:10:15', NULL, NULL, '9b7d28336b01f9a6b1a613957c3d7cda', 'id', 'id', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('95486ef4c7e0f3f3ac4ce249b1c761a1', NULL, '2020-07-28 17:46:58', NULL, NULL, '22f025b781ee9fe4746438621e82674f', 'id', 'id', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('95650b0335c6981bf0d657e11b1b2082', NULL, '2021-02-02 19:30:23', NULL, NULL, '629609c4d540cb4675e9064af8955296', 'hysr', 'hysr', 'String', NULL, 11, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('9a5f78c12595cb66d3b630962f7cd7bf', NULL, '2021-02-02 19:30:23', NULL, NULL, '629609c4d540cb4675e9064af8955296', 'sf1', 'sf1', 'String', NULL, 15, 0, NULL, 'ttype', NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('9b77e74bed080cbd798d223bb0177c5d', NULL, '2020-07-21 15:17:10', NULL, NULL, 'c9bdb6b7ac68accfecb366718bf78f79', 'didian', 'didian', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('9bb9b5329f79564ec030694a639ffd7f', NULL, '2021-01-08 16:29:02', NULL, NULL, '4af57d343f1d6521b71b85097b580786', 'bx_zx_money', 'bx_zx_money', 'String', NULL, 3, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('9bf1e9bc4e887eb0816365262d0e9c8e', NULL, '2020-07-28 17:46:58', NULL, NULL, '22f025b781ee9fe4746438621e82674f', 'zhekoulv', 'zhekoulv', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('9d3986d3a32e9b4672dc2b29174749f3', NULL, '2021-02-02 19:30:23', NULL, NULL, '629609c4d540cb4675e9064af8955296', 'rk', 'rk', 'String', NULL, 13, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('9d6a3a8b9cf5c659e7d752028b70da8b', NULL, '2021-02-02 19:30:23', NULL, NULL, '629609c4d540cb4675e9064af8955296', 'sf2', 'sf2', 'String', NULL, 16, 0, NULL, 'ttype', NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('9ddf87596d6701eda383c3d8d7853b2b', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'education', 'education', 'String', NULL, 13, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('9e28f1951ea83b6e6dae4e3892baea90', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'positional_titles', 'positional_titles', 'String', NULL, 25, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('a15e649faa93fbae15a66f5266bd9336', NULL, '2021-02-02 19:30:23', NULL, NULL, '629609c4d540cb4675e9064af8955296', 'phone', 'phone', 'String', NULL, 6, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('a17a61990a30e0cfbe4c7169dafcd85d', NULL, '2020-07-21 15:17:10', NULL, NULL, 'c9bdb6b7ac68accfecb366718bf78f79', 'id', 'id', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('a1b7ffeb00d30e7c0a1a1f466dd1fe06', NULL, '2020-12-04 16:53:38', NULL, NULL, '28e0b01cc3e2b0d361107661527bfdff', 'key2', 'key2', 'String', NULL, 4, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('a200ec7a67ded4302744ee7e4e156d13', NULL, '2021-01-08 16:10:28', NULL, NULL, '4dc208eb92fd1a84ef7b4723251e3e51', 'monty', 'monty', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('a2e680c356e712b43343d589539da011', NULL, '2021-01-08 10:47:52', NULL, NULL, 'f7649b77cfc9e0a9dacdac370cd4036b', 'name', 'name', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('a379ebc1ac4dd2d567eee55c403ab2a3', NULL, '2020-07-21 15:17:10', NULL, NULL, 'c9bdb6b7ac68accfecb366718bf78f79', 'gname', 'gname', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('a42eed89da67da0653650edcc1576f8c', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'currentnum', 'currentnum', NULL, NULL, 29, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('a93ce07361b9d6ec02a58cf7f6b94664', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'political', 'political', NULL, NULL, 7, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('a949c4beac3fec79e96309a6d2d8f5bb', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'entrytime', 'entrytime', NULL, NULL, 19, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('a9c7c96a412537b4da3df68ff8e93cc8', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'post', 'post', NULL, NULL, 2, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('a9e4bf3b458d821307e0749f6e119f8d', NULL, '2021-01-08 16:10:28', NULL, NULL, '4dc208eb92fd1a84ef7b4723251e3e51', 'total', 'total', 'String', NULL, 3, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('aa26aca6685baef7b24189214866f370', NULL, '2021-01-21 18:00:57', NULL, NULL, '60b3feffadc55eb49baa5a48fdf1ff0e', 'value', 'value', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('ab0aabf8cc08327a4510420bd553e6c0', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'providentfund', 'providentfund', NULL, NULL, 31, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('ab4ee4418e54c4a4fef3c14ad8e98fa5', NULL, '2021-01-08 16:29:02', NULL, NULL, 'a543d8dd40f4d26839b78bd604be659e', 'neikong_zx_money', 'neikong_zx_money', 'String', NULL, 7, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('ad0b3d410c53378134428afb1b063758', NULL, '2021-01-08 16:10:28', NULL, NULL, '4dc208eb92fd1a84ef7b4723251e3e51', 'his_average', 'his_average', 'String', NULL, 5, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('ad146af051ba273a480223d49f59358b', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'hukoustreet', 'hukoustreet', NULL, NULL, 25, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('ad1d1fe2ee182c2d3a263a127fea041e', NULL, '2021-01-06 11:43:35', NULL, NULL, '1334390762455965697', 'proportion_2', 'proportion_2', 'String', NULL, 8, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('ae5ec6e56478a098b36587e93b1d8908', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'arrival_time', 'arrival_time', 'String', NULL, 24, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('aee0188ab2bf9849607f6ef34b36713e', NULL, '2020-12-17 17:13:21', NULL, NULL, '9b75c161322e0b7e29b3ffc84239a72c', 'name', 'name', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('aee106a24b11b0f8ca10bc88b62189d7', NULL, '2020-08-03 09:55:46', NULL, NULL, '6011955e58d89040fca52e7f962d0bf4', 'gdata', 'gdata', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('aee31ce5eb6271601bc4e6f8affaceb0', NULL, '2020-06-16 18:14:25', NULL, NULL, 'e4cec9ff15bc0ea42f536a442a6d1335', 'hezairen', 'hezairen', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('b14588abed341d314a08d316dfde553f', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'work_experience', 'work_experience', 'String', NULL, 27, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('b1de05c2d02cdde59c1e2a93e45964f9', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'create_time', 'create_time', 'String', NULL, 29, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('b279ab8f7d20ebbeec67f5bf2109ba22', NULL, '2021-01-08 16:10:28', NULL, NULL, '7b20679054449c554cde856ef24126ab', 'his_average', 'his_average', 'String', NULL, 5, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('b2c01550c60da7b1babf36d8535fcaed', NULL, '2021-01-08 10:47:52', NULL, NULL, 'bbc5d5ab143d59f0beab484682361aa5', 'shijian', 'shijian', 'String', NULL, 4, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('b3c98ed9cb9e4a234273aa4921efd545', NULL, '2020-06-16 18:14:25', NULL, NULL, 'e4cec9ff15bc0ea42f536a442a6d1335', 'jpnum', 'jpnum', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('b450669f376fa9f075ac403c7d7f2ee9', NULL, '2021-01-06 11:43:35', NULL, NULL, '1334390762455965697', 'proportion_3', 'proportion_3', 'String', NULL, 11, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('b46d80bfe53372b6ff92a6f8e8bf38df', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'hukoudi', 'hukoudi', NULL, NULL, 27, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('b5afa6c7c63f649460d4d45b7d697098', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'zip_code', 'zip_code', 'String', NULL, 17, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('b5df568754994e67a15a8f5b8d4bc297', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'phone', 'phone', 'String', NULL, 19, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('b60fbeff0c77080cb73aa6aaf6dd8715', NULL, '2020-07-28 17:46:58', NULL, NULL, '22f025b781ee9fe4746438621e82674f', 'danjia', 'danjia', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('b6884ea117811c5161ff1eb11502cf19', NULL, '2020-07-21 15:17:10', NULL, NULL, 'c9bdb6b7ac68accfecb366718bf78f79', 'num', 'num', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('b81d3a495af538759aa6dbaf752c48db', NULL, '2020-12-04 16:53:38', NULL, NULL, '28e0b01cc3e2b0d361107661527bfdff', 'key6', 'key6', 'String', NULL, 8, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('b863f83ac64327d86f36c8796a00f777', NULL, '2020-06-16 18:14:25', NULL, NULL, 'e4cec9ff15bc0ea42f536a442a6d1335', 'jieshu', 'jieshu', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('b8aafd56ddcf6902909722c7d2529797', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'department', 'department', NULL, NULL, 1, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('ba83ad8a89105b198aa49798f2940c29', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'foreign_language', 'foreign_language', 'String', NULL, 20, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('bb8db85fed8034645c5517b6283addc7', NULL, '2020-12-04 16:53:38', NULL, NULL, '28e0b01cc3e2b0d361107661527bfdff', 'name', 'name', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('bd09800edb1343880b05b65974875597', NULL, '2020-07-21 15:17:10', NULL, NULL, 'c9bdb6b7ac68accfecb366718bf78f79', 'tdata', 'tdata', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('c17be48ad3705f848acdb28cbe3bc1b7', NULL, '2020-07-28 17:46:58', NULL, NULL, '22f025b781ee9fe4746438621e82674f', 'hname', 'hname', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('c1913cffe0a0a65b8f76ef280af93038', NULL, '2021-01-08 16:29:02', NULL, NULL, '4af57d343f1d6521b71b85097b580786', 'tb_zx_money', 'tb_zx_money', 'String', NULL, 6, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('c2b7ed56f87bc4cb95c8e1e0300e51ff', NULL, '2020-07-17 10:49:42', NULL, NULL, 'e0fe1d693625c906c1171d7de706a47c', 'ytotal', 'ytotal', NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('c357b23ae68c0ee6c9dab322507dce0b', NULL, '2021-01-11 14:38:14', NULL, NULL, '1317006713165049858', 'jdate', 'jdate', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('c3b0443ebecc7152343c5ea3ef32a38f', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'graduation_time', 'graduation_time', 'String', NULL, 23, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('c3d8cd6e68c605fd6d6ac217fed5c8d4', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'weight', 'weight', 'String', NULL, 10, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('c3fe8f62ea0c6ce9990bfa22dc0265b6', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'major', 'major', NULL, NULL, 13, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('c40fe2cf7a74a6e96575f73ef5e7d205', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'nation', 'nation', NULL, NULL, 9, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('c4d6132699dcdff382c93ab10d64551a', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'education_experience', 'education_experience', 'String', NULL, 26, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('c57bd36c25b13a8149268496e54052ae', NULL, '2020-12-17 19:50:14', NULL, NULL, 'fb70a91730f087f8023afd88d24f9697', 'value', 'value', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('c5a801ff78f2ca6b1b7a03b3222fdd61', NULL, '2021-01-08 16:29:02', NULL, NULL, '4af57d343f1d6521b71b85097b580786', 'biz_income', 'biz_income', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('c6144f2ca7422a71e951abea1bce6aaf', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'education', 'education', NULL, NULL, 12, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('c6820a1e3308badb60582998805a0645', NULL, '2020-06-16 18:14:25', NULL, NULL, 'e4cec9ff15bc0ea42f536a442a6d1335', 'shihelv', 'shihelv', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('c74ee42894f54c0ebc1a64a79395aa06', NULL, '2020-12-04 16:53:38', NULL, NULL, '28e0b01cc3e2b0d361107661527bfdff', 'key3', 'key3', 'String', NULL, 5, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('c8d1276d19bdd946e9fc18b83aacda15', 'admin', '2021-04-01 03:09:23', NULL, NULL, '1289140698221678593', 'cname', 'cname', 'String', NULL, 3, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('c904e40b35f065cbefd0b22fd5937b38', NULL, '2021-01-21 18:00:57', NULL, NULL, '60b3feffadc55eb49baa5a48fdf1ff0e', 'description', 'description', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('c98a41c7d5edcba47273e192b9d66b9b', NULL, '2020-07-28 17:46:58', NULL, NULL, '22f025b781ee9fe4746438621e82674f', 'beizhu', 'beizhu', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('cc91f43bf975f056944b5ec19266ec9c', NULL, '2020-12-17 16:59:12', NULL, NULL, '7911bd189c2d53e182693bd599a315a2', 'value', 'value', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('ce81562be14047bcbc29c0a66782fc42', NULL, '2021-01-21 17:07:16', NULL, NULL, '6a1d22ca4c95e8fab655d3ceed43a84d', 'name', 'name', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('cec893b2241134ba9b03ed6d4edf2919', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'marital', 'marital', NULL, NULL, 23, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('cf9d32fea2f67e4b11cd2823dbbefbad', NULL, '2020-08-03 09:55:46', NULL, NULL, '6011955e58d89040fca52e7f962d0bf4', 'id', 'id', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('d076942aecee8f5197b66eb382ba1995', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'sbtype', 'sbtype', NULL, NULL, 33, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('d1d67bf8aea628bba4d28dfede489d55', NULL, '2021-01-08 16:10:28', NULL, NULL, '4dc208eb92fd1a84ef7b4723251e3e51', 'his_highest', 'his_highest', 'String', NULL, 6, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('d3ef9876d3c56889157747be606f70fc', NULL, '2021-01-06 11:43:35', NULL, NULL, '1334390762455965697', 'gift_6', 'gift_6', 'String', NULL, 19, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('d5b7b92023a2fb09fed9d36a4ac7b3e3', NULL, '2021-01-06 11:43:35', NULL, NULL, '1334390762455965697', 'sales_z', 'sales_z', 'String', NULL, 21, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('d6accb7bb835271d1284d8a3dc394c1f', NULL, '2020-07-28 17:46:58', NULL, NULL, '22f025b781ee9fe4746438621e82674f', 'danwei', 'danwei', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('db503c31de99f35cbcb1f66a69f9964c', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'mailbox', 'mailbox', NULL, NULL, 15, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('dd56fbd98db5c1cda9dd77637ba1c7e6', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'create_by', 'create_by', 'String', NULL, 28, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('dfbc8bba6261dcd4ceb3da5f517a0d58', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'school', 'school', NULL, NULL, 20, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('e1fffff7030dd37d70d7b5a138046fac', NULL, '2020-12-04 16:53:38', NULL, NULL, '28e0b01cc3e2b0d361107661527bfdff', 'key5', 'key5', 'String', NULL, 7, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('e52e7896193ad09d700599d2ef6fa8ae', NULL, '2021-02-02 19:30:23', NULL, NULL, '629609c4d540cb4675e9064af8955296', 'knum', 'knum', 'String', NULL, 4, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('e757987004087de43f1ccab14092361f', NULL, '2020-07-17 10:49:42', NULL, NULL, 'e0fe1d693625c906c1171d7de706a47c', 'yishe', 'yishe', NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('e7f6104183a7b2408f72b91f4638e9e2', NULL, '2021-01-06 11:43:35', NULL, NULL, '1334390762455965697', 'gift_3', 'gift_3', 'String', NULL, 10, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('ea6018bdbd9fb192b1d3f9e832b5d382', NULL, '2021-02-02 19:10:15', NULL, NULL, '9b7d28336b01f9a6b1a613957c3d7cda', 'name', '姓名', 'string', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('ec6c6f56c64de5f4de16166000f31d19', NULL, '2020-06-16 18:14:25', NULL, NULL, 'e4cec9ff15bc0ea42f536a442a6d1335', 'ftime', 'ftime', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('ef685270770a69bddb4f24e37eed9dc0', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'office', 'office', NULL, NULL, 8, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('efe17d82b5daaa3f95364e9afaeffd1c', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'register', 'register', NULL, NULL, 11, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('efe4e0110a61d9791e18308aed422aa7', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'name', 'name', NULL, NULL, 4, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('f110f1f947e0f895b552f7edd133a60a', 'admin', '2021-04-01 03:09:23', NULL, NULL, '1289140698221678593', 'ctotal', 'ctotal', 'String', NULL, 8, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('f11af753ccbf495818e9c23c1b083ae2', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'foreign_language_level', 'foreign_language_level', 'String', NULL, 21, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('f1905f7a175f8e56afd8f6c2969582e6', NULL, '2021-01-06 11:43:35', NULL, NULL, '1334390762455965697', 'gift_5', 'gift_5', 'String', NULL, 16, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('f192c538d9cb0dc88e537b11a37551c8', NULL, '2021-01-08 16:10:28', NULL, NULL, '4dc208eb92fd1a84ef7b4723251e3e51', 'his_lowest', 'his_lowest', 'String', NULL, 4, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('f31715d024bad06ea8862ba383e87f5b', NULL, '2021-01-05 15:09:15', NULL, NULL, '2324fac242b35938678a05bbbba345e2', 'cnum', 'cnum', 'String', NULL, 5, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('f3b4e31c7ff6a365c4130cbc695e2621', NULL, '2021-02-02 19:30:23', NULL, NULL, '629609c4d540cb4675e9064af8955296', 'num', 'num', 'String', NULL, 3, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('f430837a3f4c08f425bcd1de46d3a2d3', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'sex', 'sex', NULL, NULL, 5, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('f53143608c570f9886861442be87b5ff', NULL, '2021-02-02 19:10:15', NULL, NULL, '9b7d28336b01f9a6b1a613957c3d7cda', 'update_by', '职务', 'String', NULL, 4, 1, 3, 'zhiwu', NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('f82904af04e557b12dcfe3562900597c', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'gdata', 'gdata', NULL, NULL, 14, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('f9154d882408b868253ed8fb87879220', NULL, '2021-02-02 19:30:23', NULL, NULL, '629609c4d540cb4675e9064af8955296', 'name', 'name', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('f95dd09a118b93cc7884b12118448ed4', NULL, '2021-02-02 19:10:15', NULL, NULL, '9b7d28336b01f9a6b1a613957c3d7cda', 'hukou', 'hukou', 'String', NULL, 7, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('f978117e8eda0daee2c00223f9df4b48', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'update_time', 'update_time', 'String', NULL, 31, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('f984ef26fe0a505b279a0e4a3b27201f', NULL, '2021-01-08 10:47:52', NULL, NULL, 'f7649b77cfc9e0a9dacdac370cd4036b', 'shijian', 'shijian', 'String', NULL, 4, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('fa6fce04eaee2480faa8a14393ffe15a', NULL, '2021-01-08 16:29:02', NULL, NULL, 'a543d8dd40f4d26839b78bd604be659e', 'total', 'total', 'String', NULL, 8, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('fac871f69237c6c25abe8c4332eabcbf', NULL, '2021-01-08 10:47:52', NULL, NULL, 'f7649b77cfc9e0a9dacdac370cd4036b', 'lingdao', 'lingdao', 'String', NULL, 3, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('fc07c053ed0ecbfcc45041640acf6cb1', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'party', 'party', NULL, NULL, 22, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('fe3b1449ce346836f47234ca65949aea', NULL, '2020-06-16 18:14:25', NULL, NULL, 'e4cec9ff15bc0ea42f536a442a6d1335', 'sfkong', 'sfkong', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('ffb5fbe81d2cf48ca45a815c676fd9eb', NULL, '2020-06-16 18:14:25', NULL, NULL, 'e4cec9ff15bc0ea42f536a442a6d1335', 'kaishi', 'kaishi', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); + +-- ---------------------------- +-- Table structure for jimu_report_db_param +-- ---------------------------- +DROP TABLE IF EXISTS `jimu_report_db_param`; +CREATE TABLE `jimu_report_db_param` ( + `id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `jimu_report_head_id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '动态报表ID', + `param_name` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '参数字段', + `param_txt` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '参数文本', + `param_value` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '参数默认值', + `order_num` int(0) NULL DEFAULT NULL COMMENT '排序', + `create_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建人登录名称', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建日期', + `update_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '更新人登录名称', + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新日期', + `search_flag` int(0) NULL DEFAULT NULL COMMENT '查询标识0否1是 默认0', + `widget_type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '查询控件类型', + `search_mode` int(0) NULL DEFAULT NULL COMMENT '查询模式1简单2范围', + `dict_code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '字典', + `search_format` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '查询时间格式化表达式', + `ext_json` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '参数配置', + PRIMARY KEY (`id`) USING BTREE, + INDEX `idx_jmrheadid`(`jimu_report_head_id`) USING BTREE, + INDEX `idx_jrdp_jimu_report_head_id`(`jimu_report_head_id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of jimu_report_db_param +-- ---------------------------- +INSERT INTO `jimu_report_db_param` VALUES ('078d99565feef91904c84b42b43f5174', '1273495682564534273', 'id', 'id', '1', 1, NULL, '2020-08-03 09:55:26', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_param` VALUES ('0d91170e4546cdbebbc3e9cc7879ce79', '22f025b781ee9fe4746438621e82674f', 'id', 'id', '1', 1, NULL, '2020-07-21 15:31:51', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_param` VALUES ('1324279360203526146', '1324279359998005250', 'pageSize', 'pageSize', '10', 2, NULL, '2020-08-03 15:19:54', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_param` VALUES ('1324279360220303361', '1324279359998005250', 'pageNo', 'pageNo', '1', 1, NULL, '2020-08-03 15:19:54', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_param` VALUES ('143f8c164072ddbdeafec5c5b1466827', '1272858455908073473', 'id', 'id', '1', 1, NULL, '2020-07-21 15:31:51', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_param` VALUES ('173c869cc45b683a9cfe25826110cead', '1272834687525482497', 'id', 'id', '1', 1, NULL, '2020-08-03 09:57:08', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_param` VALUES ('1805eb351a966dc3c039b5239b6faa49', '1291310198925840385', 'sex', 'sex', '男', 2, NULL, '2020-06-08 15:21:09', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_param` VALUES ('256eb2f8582ce4d74559b1fc1e2917ca', '1291310198925840385', 'id', 'id', '111', 1, NULL, '2020-06-08 15:21:09', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_param` VALUES ('3957799c20fcc696d680cca9649897bb', 'e4cec9ff15bc0ea42f536a442a6d1335', 'id', 'id', '1', 1, NULL, '2020-08-03 09:57:08', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_param` VALUES ('3a9efc51a6b6723d5a0ddf109aacb2b5', '1288038655293661186', 'pageNo', 'pageNo', '1', 1, 'admin', '2021-04-01 03:09:40', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_param` VALUES ('3ced36c7a2cce40c667cc485bf59cd11', '1291217511962902530', 'pageSize', 'pageSize', '10', 2, NULL, '2020-08-03 15:19:54', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_param` VALUES ('49bd3f212cd6c406c8584e6bb0d9cf93', '1291549569390243841', 'pageSize', 'pageSize', '10', 2, NULL, '2020-07-30 17:26:29', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_param` VALUES ('52db6da75ea733ae741c62cc54c85d92', '6011955e58d89040fca52e7f962d0bf4', 'id', 'id', '1', 1, NULL, '2020-08-03 09:55:46', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_param` VALUES ('57165a6fe5f2b700d4ef19518de4defd', '1290104038414721025', 'id', 'id', '1', 1, NULL, '2020-08-03 09:55:46', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_param` VALUES ('7569e95c1fa73d5438aceb19c1b85ef0', '1288038655293661186', 'pageSize', 'pageSize', '20', 2, 'admin', '2021-04-01 03:09:40', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_param` VALUES ('7d7765754aadaddab91bf1257447ae73', '1291549569390243841', 'pageNo', 'pageNo', '1', 1, NULL, '2020-07-30 17:26:29', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_param` VALUES ('8bff26e0c3fe48ddd41cf8d939ad4f2c', '2324fac242b35938678a05bbbba345e2', 'pageSize', 'pageSize', '10', 2, NULL, '2020-08-03 15:19:54', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_param` VALUES ('90b22a058cc331146b548bc93f09b5cd', '1289140698221678593', 'pageSize', 'pageSize', '20', 2, 'admin', '2021-04-01 03:09:23', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_param` VALUES ('944eaee4cb7639a435aadbf2ad7469a0', '2324fac242b35938678a05bbbba345e2', 'pageNo', 'pageNo', '1', 1, NULL, '2020-08-03 15:19:54', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_param` VALUES ('a29c10ed01c6608e899e1368f2d5d7e3', '1316997232402231298', 'id', 'id', '1', 1, NULL, '2021-01-13 14:31:13', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_param` VALUES ('a803707f3383dd9f4685fadc7efa07f4', '1224643501392728065', 'sex', 'sex', '男', 2, NULL, '2020-06-08 15:21:09', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_param` VALUES ('b7c34e8a3c2804715825af4bdbcf857a', '1224643501392728065', 'id', 'id', '111', 1, NULL, '2020-06-08 15:21:09', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_param` VALUES ('d8010a4ffbe567e6117e7f59641aeb7c', '1289140698221678593', 'pageNo', 'pageNo', '1', 1, 'admin', '2021-04-01 03:09:23', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_param` VALUES ('d9d94d6b09dd074f39af96d7a4696f9a', '1291217511962902530', 'pageNo', 'pageNo', '1', 1, NULL, '2020-08-03 15:19:54', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_param` VALUES ('ec09a8b27e7e9ec9dbc683fc5a38faec', 'c9bdb6b7ac68accfecb366718bf78f79', 'id', 'id', '1', 1, NULL, '2020-08-03 09:55:26', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); + +-- ---------------------------- +-- Table structure for jimu_report_link +-- ---------------------------- +DROP TABLE IF EXISTS `jimu_report_link`; +CREATE TABLE `jimu_report_link` ( + `id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '主键id', + `report_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '积木设计器id', + `parameter` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '参数', + `eject_type` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '弹出方式(0 当前页面 1 新窗口)', + `link_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '链接名称', + `api_method` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '请求方法0-get,1-post', + `link_type` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '链接方式(0 网络报表 1 网络连接 2 图表联动)', + `api_url` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '外网api', + `link_chart_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '联动图表的ID', + `expression` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '表达式', + `requirement` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '条件', + PRIMARY KEY (`id`) USING BTREE, + INDEX `uniq_link_reportid`(`report_id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '超链接配置表' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of jimu_report_link +-- ---------------------------- + +-- ---------------------------- +-- Table structure for jimu_report_map +-- ---------------------------- +DROP TABLE IF EXISTS `jimu_report_map`; +CREATE TABLE `jimu_report_map` ( + `id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '主键', + `label` varchar(125) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '地图名称', + `name` varchar(125) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '地图编码', + `data` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '地图数据', + `create_by` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '修改人', + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '修改时间', + `del_flag` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '0表示未删除,1表示删除', + `sys_org_code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '所属部门', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE INDEX `uniq_jmreport_map_name`(`name`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '地图配置表' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of jimu_report_map +-- ---------------------------- +INSERT INTO `jimu_report_map` VALUES ('1235103352843448322', '中国地图(大屏默认)', 'CHINA', '{\n \"type\": \"FeatureCollection\",\n \"features\": [\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 110000,\n \"name\": \"北京市\",\n \"center\": [\n 116.405285,\n 39.904989\n ],\n \"centroid\": [\n 116.41989,\n 40.189913\n ],\n \"childrenNum\": 16,\n \"level\": \"province\",\n \"subFeatureIndex\": 0,\n \"acroutes\": [\n 100000\n ],\n \"parent\": {\n \"adcode\": 100000\n }\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 117.210024,\n 40.082262\n ],\n [\n 117.105315,\n 40.074479\n ],\n [\n 117.105315,\n 40.074479\n ],\n [\n 117.102851,\n 40.073563\n ],\n [\n 117.102235,\n 40.073105\n ],\n [\n 117.102235,\n 40.073105\n ],\n [\n 117.102851,\n 40.073563\n ],\n [\n 116.999989,\n 40.030053\n ],\n [\n 116.927924,\n 40.054788\n ],\n [\n 116.783794,\n 40.035093\n ],\n [\n 116.757925,\n 39.968176\n ],\n [\n 116.786874,\n 39.886963\n ],\n [\n 116.926076,\n 39.835524\n ],\n [\n 116.949482,\n 39.778529\n ],\n [\n 116.902055,\n 39.763813\n ],\n [\n 116.90575,\n 39.687883\n ],\n [\n 116.812128,\n 39.616018\n ],\n [\n 116.717273,\n 39.603572\n ],\n [\n 116.717273,\n 39.603572\n ],\n [\n 116.720969,\n 39.599884\n ],\n [\n 116.720969,\n 39.599884\n ],\n [\n 116.726512,\n 39.595274\n ],\n [\n 116.726512,\n 39.595274\n ],\n [\n 116.703106,\n 39.588819\n ],\n [\n 116.703106,\n 39.588819\n ],\n [\n 116.607636,\n 39.619705\n ],\n [\n 116.524484,\n 39.596657\n ],\n [\n 116.440716,\n 39.527466\n ],\n [\n 116.433325,\n 39.44296\n ],\n [\n 116.332927,\n 39.457744\n ],\n [\n 116.245464,\n 39.515466\n ],\n [\n 116.204196,\n 39.588819\n ],\n [\n 116.10195,\n 39.576368\n ],\n [\n 116.10195,\n 39.576368\n ],\n [\n 115.957204,\n 39.561147\n ],\n [\n 115.910393,\n 39.600345\n ],\n [\n 115.910393,\n 39.600345\n ],\n [\n 115.855574,\n 39.554689\n ],\n [\n 115.855574,\n 39.554689\n ],\n [\n 115.846951,\n 39.550999\n ],\n [\n 115.846951,\n 39.550999\n ],\n [\n 115.821081,\n 39.517312\n ],\n [\n 115.821081,\n 39.517312\n ],\n [\n 115.752712,\n 39.512696\n ],\n [\n 115.752712,\n 39.512696\n ],\n [\n 115.738545,\n 39.539464\n ],\n [\n 115.738545,\n 39.539925\n ],\n [\n 115.738545,\n 39.539464\n ],\n [\n 115.738545,\n 39.539925\n ],\n [\n 115.737314,\n 39.544078\n ],\n [\n 115.737314,\n 39.544078\n ],\n [\n 115.723763,\n 39.544539\n ],\n [\n 115.723763,\n 39.544539\n ],\n [\n 115.721299,\n 39.543617\n ],\n [\n 115.721299,\n 39.543617\n ],\n [\n 115.721299,\n 39.55146\n ],\n [\n 115.721299,\n 39.55146\n ],\n [\n 115.716988,\n 39.560225\n ],\n [\n 115.716988,\n 39.560225\n ],\n [\n 115.699125,\n 39.577751\n ],\n [\n 115.698509,\n 39.577751\n ],\n [\n 115.698509,\n 39.577751\n ],\n [\n 115.699125,\n 39.577751\n ],\n [\n 115.698509,\n 39.577751\n ],\n [\n 115.69543,\n 39.579135\n ],\n [\n 115.69543,\n 39.579135\n ],\n [\n 115.586408,\n 39.58928\n ],\n [\n 115.478619,\n 39.650578\n ],\n [\n 115.478619,\n 39.650578\n ],\n [\n 115.498945,\n 39.69617\n ],\n [\n 115.498945,\n 39.69617\n ],\n [\n 115.443511,\n 39.785426\n ],\n [\n 115.443511,\n 39.785426\n ],\n [\n 115.567314,\n 39.816224\n ],\n [\n 115.514344,\n 39.837821\n ],\n [\n 115.522967,\n 39.898898\n ],\n [\n 115.426264,\n 39.95029\n ],\n [\n 115.454597,\n 40.029595\n ],\n [\n 115.599343,\n 40.11979\n ],\n [\n 115.73485,\n 40.129398\n ],\n [\n 115.773038,\n 40.176044\n ],\n [\n 115.85311,\n 40.148609\n ],\n [\n 115.89869,\n 40.234536\n ],\n [\n 115.968907,\n 40.264219\n ],\n [\n 115.9184,\n 40.354103\n ],\n [\n 115.861733,\n 40.364589\n ],\n [\n 115.861733,\n 40.364589\n ],\n [\n 115.779197,\n 40.442501\n ],\n [\n 115.755792,\n 40.540333\n ],\n [\n 115.907929,\n 40.617133\n ],\n [\n 116.005247,\n 40.58397\n ],\n [\n 116.088399,\n 40.62667\n ],\n [\n 116.22021,\n 40.744181\n ],\n [\n 116.247311,\n 40.791762\n ],\n [\n 116.464738,\n 40.771827\n ],\n [\n 116.334159,\n 40.90446\n ],\n [\n 116.473977,\n 40.895867\n ],\n [\n 116.455499,\n 40.98084\n ],\n [\n 116.519557,\n 40.981292\n ],\n [\n 116.519557,\n 40.981292\n ],\n [\n 116.599013,\n 40.974516\n ],\n [\n 116.615643,\n 41.053072\n ],\n [\n 116.688324,\n 41.044499\n ],\n [\n 116.677853,\n 40.970902\n ],\n [\n 116.730208,\n 40.897676\n ],\n [\n 116.858323,\n 40.833423\n ],\n [\n 116.964881,\n 40.70972\n ],\n [\n 117.110858,\n 40.70836\n ],\n [\n 117.286401,\n 40.660719\n ],\n [\n 117.386799,\n 40.684317\n ],\n [\n 117.49582,\n 40.674334\n ],\n [\n 117.389879,\n 40.5617\n ],\n [\n 117.344299,\n 40.582152\n ],\n [\n 117.213104,\n 40.512136\n ],\n [\n 117.225423,\n 40.369148\n ],\n [\n 117.309191,\n 40.279284\n ],\n [\n 117.309807,\n 40.279284\n ],\n [\n 117.309191,\n 40.279284\n ],\n [\n 117.309807,\n 40.279284\n ],\n [\n 117.389879,\n 40.228141\n ],\n [\n 117.367089,\n 40.172387\n ],\n [\n 117.367089,\n 40.172844\n ],\n [\n 117.367089,\n 40.173301\n ],\n [\n 117.367089,\n 40.173301\n ],\n [\n 117.367089,\n 40.172844\n ],\n [\n 117.367089,\n 40.172387\n ],\n [\n 117.344299,\n 40.13443\n ],\n [\n 117.210024,\n 40.082262\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 120000,\n \"name\": \"天津市\",\n \"center\": [\n 117.190182,\n 39.125596\n ],\n \"centroid\": [\n 117.351154,\n 39.28914\n ],\n \"childrenNum\": 16,\n \"level\": \"province\",\n \"subFeatureIndex\": 1,\n \"acroutes\": [\n 100000\n ],\n \"parent\": {\n \"adcode\": 100000\n }\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 117.210024,\n 40.082262\n ],\n [\n 117.344299,\n 40.13443\n ],\n [\n 117.367089,\n 40.172387\n ],\n [\n 117.367089,\n 40.172844\n ],\n [\n 117.367089,\n 40.173301\n ],\n [\n 117.367089,\n 40.173301\n ],\n [\n 117.367089,\n 40.172844\n ],\n [\n 117.367089,\n 40.172387\n ],\n [\n 117.389879,\n 40.228141\n ],\n [\n 117.450857,\n 40.252347\n ],\n [\n 117.571581,\n 40.21809\n ],\n [\n 117.652269,\n 40.12345\n ],\n [\n 117.652269,\n 40.12345\n ],\n [\n 117.651037,\n 40.122535\n ],\n [\n 117.651037,\n 40.122535\n ],\n [\n 117.71879,\n 40.082262\n ],\n [\n 117.71879,\n 40.082262\n ],\n [\n 117.75821,\n 40.073563\n ],\n [\n 117.75821,\n 40.073563\n ],\n [\n 117.782232,\n 39.968634\n ],\n [\n 117.614697,\n 39.972303\n ],\n [\n 117.589443,\n 39.997059\n ],\n [\n 117.513067,\n 39.910373\n ],\n [\n 117.513067,\n 39.910373\n ],\n [\n 117.537704,\n 39.835064\n ],\n [\n 117.537704,\n 39.835064\n ],\n [\n 117.540784,\n 39.822658\n ],\n [\n 117.540784,\n 39.822658\n ],\n [\n 117.57774,\n 39.727009\n ],\n [\n 117.644262,\n 39.702155\n ],\n [\n 117.66274,\n 39.636295\n ],\n [\n 117.619008,\n 39.603111\n ],\n [\n 117.736037,\n 39.560686\n ],\n [\n 117.736037,\n 39.560686\n ],\n [\n 117.74774,\n 39.58928\n ],\n [\n 117.866,\n 39.596657\n ],\n [\n 117.933753,\n 39.574062\n ],\n [\n 117.870311,\n 39.454972\n ],\n [\n 117.846906,\n 39.328274\n ],\n [\n 117.972557,\n 39.312536\n ],\n [\n 117.972557,\n 39.312536\n ],\n [\n 117.982412,\n 39.298647\n ],\n [\n 117.982412,\n 39.298647\n ],\n [\n 118.021833,\n 39.287071\n ],\n [\n 118.021833,\n 39.287071\n ],\n [\n 118.024296,\n 39.289386\n ],\n [\n 118.024296,\n 39.289386\n ],\n [\n 118.024912,\n 39.292164\n ],\n [\n 118.024912,\n 39.292164\n ],\n [\n 118.037231,\n 39.220353\n ],\n [\n 117.871543,\n 39.122479\n ],\n [\n 117.837667,\n 39.056999\n ],\n [\n 117.855529,\n 38.957502\n ],\n [\n 117.898029,\n 38.948661\n ],\n [\n 117.847522,\n 38.855535\n ],\n [\n 117.778536,\n 38.869046\n ],\n [\n 117.64611,\n 38.828972\n ],\n [\n 117.646725,\n 38.788875\n ],\n [\n 117.740964,\n 38.753888\n ],\n [\n 117.729261,\n 38.680127\n ],\n [\n 117.639334,\n 38.62686\n ],\n [\n 117.47919,\n 38.617043\n ],\n [\n 117.39419,\n 38.573553\n ],\n [\n 117.252524,\n 38.556711\n ],\n [\n 117.213104,\n 38.639947\n ],\n [\n 117.213104,\n 38.639947\n ],\n [\n 117.176764,\n 38.617978\n ],\n [\n 117.176764,\n 38.617978\n ],\n [\n 117.097924,\n 38.587118\n ],\n [\n 117.042489,\n 38.706279\n ],\n [\n 116.95133,\n 38.689468\n ],\n [\n 116.947634,\n 38.689468\n ],\n [\n 116.947634,\n 38.689468\n ],\n [\n 116.950714,\n 38.689468\n ],\n [\n 116.95133,\n 38.689468\n ],\n [\n 116.950714,\n 38.689468\n ],\n [\n 116.877417,\n 38.680594\n ],\n [\n 116.858939,\n 38.741289\n ],\n [\n 116.766548,\n 38.742222\n ],\n [\n 116.737599,\n 38.784677\n ],\n [\n 116.708034,\n 38.931907\n ],\n [\n 116.783179,\n 39.050959\n ],\n [\n 116.783179,\n 39.050959\n ],\n [\n 116.812744,\n 39.050959\n ],\n [\n 116.812744,\n 39.050959\n ],\n [\n 116.912526,\n 39.110873\n ],\n [\n 116.91191,\n 39.111338\n ],\n [\n 116.91191,\n 39.111338\n ],\n [\n 116.912526,\n 39.110873\n ],\n [\n 116.865714,\n 39.155428\n ],\n [\n 116.865714,\n 39.155428\n ],\n [\n 116.892816,\n 39.224061\n ],\n [\n 116.870642,\n 39.357426\n ],\n [\n 116.796113,\n 39.446656\n ],\n [\n 116.812128,\n 39.616018\n ],\n [\n 116.90575,\n 39.687883\n ],\n [\n 116.916837,\n 39.703996\n ],\n [\n 116.916837,\n 39.703996\n ],\n [\n 116.983975,\n 39.63906\n ],\n [\n 116.983975,\n 39.63906\n ],\n [\n 117.126873,\n 39.61694\n ],\n [\n 117.177996,\n 39.64551\n ],\n [\n 117.165061,\n 39.718725\n ],\n [\n 117.165061,\n 39.718725\n ],\n [\n 117.205713,\n 39.763813\n ],\n [\n 117.156438,\n 39.817603\n ],\n [\n 117.229735,\n 39.852981\n ],\n [\n 117.152126,\n 39.878239\n ],\n [\n 117.150894,\n 39.944785\n ],\n [\n 117.198322,\n 39.992933\n ],\n [\n 117.210024,\n 40.082262\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 130000,\n \"name\": \"河北省\",\n \"center\": [\n 114.502461,\n 38.045474\n ],\n \"childrenNum\": 11,\n \"level\": \"province\",\n \"subFeatureIndex\": 2,\n \"acroutes\": [\n 100000\n ],\n \"parent\": {\n \"adcode\": 100000\n }\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 117.389879,\n 40.228141\n ],\n [\n 117.309807,\n 40.279284\n ],\n [\n 117.309191,\n 40.279284\n ],\n [\n 117.309807,\n 40.279284\n ],\n [\n 117.309191,\n 40.279284\n ],\n [\n 117.225423,\n 40.369148\n ],\n [\n 117.213104,\n 40.512136\n ],\n [\n 117.344299,\n 40.582152\n ],\n [\n 117.389879,\n 40.5617\n ],\n [\n 117.49582,\n 40.674334\n ],\n [\n 117.386799,\n 40.684317\n ],\n [\n 117.286401,\n 40.660719\n ],\n [\n 117.110858,\n 40.70836\n ],\n [\n 116.964881,\n 40.70972\n ],\n [\n 116.858323,\n 40.833423\n ],\n [\n 116.730208,\n 40.897676\n ],\n [\n 116.677853,\n 40.970902\n ],\n [\n 116.688324,\n 41.044499\n ],\n [\n 116.615643,\n 41.053072\n ],\n [\n 116.599013,\n 40.974516\n ],\n [\n 116.519557,\n 40.981292\n ],\n [\n 116.519557,\n 40.981292\n ],\n [\n 116.455499,\n 40.98084\n ],\n [\n 116.473977,\n 40.895867\n ],\n [\n 116.334159,\n 40.90446\n ],\n [\n 116.464738,\n 40.771827\n ],\n [\n 116.247311,\n 40.791762\n ],\n [\n 116.22021,\n 40.744181\n ],\n [\n 116.088399,\n 40.62667\n ],\n [\n 116.005247,\n 40.58397\n ],\n [\n 115.907929,\n 40.617133\n ],\n [\n 115.755792,\n 40.540333\n ],\n [\n 115.779197,\n 40.442501\n ],\n [\n 115.861733,\n 40.364589\n ],\n [\n 115.861733,\n 40.364589\n ],\n [\n 115.9184,\n 40.354103\n ],\n [\n 115.968907,\n 40.264219\n ],\n [\n 115.89869,\n 40.234536\n ],\n [\n 115.85311,\n 40.148609\n ],\n [\n 115.773038,\n 40.176044\n ],\n [\n 115.73485,\n 40.129398\n ],\n [\n 115.599343,\n 40.11979\n ],\n [\n 115.454597,\n 40.029595\n ],\n [\n 115.426264,\n 39.95029\n ],\n [\n 115.522967,\n 39.898898\n ],\n [\n 115.514344,\n 39.837821\n ],\n [\n 115.567314,\n 39.816224\n ],\n [\n 115.443511,\n 39.785426\n ],\n [\n 115.443511,\n 39.785426\n ],\n [\n 115.498945,\n 39.69617\n ],\n [\n 115.498945,\n 39.69617\n ],\n [\n 115.478619,\n 39.650578\n ],\n [\n 115.478619,\n 39.650578\n ],\n [\n 115.586408,\n 39.58928\n ],\n [\n 115.69543,\n 39.579135\n ],\n [\n 115.69543,\n 39.579135\n ],\n [\n 115.698509,\n 39.577751\n ],\n [\n 115.699125,\n 39.577751\n ],\n [\n 115.698509,\n 39.577751\n ],\n [\n 115.698509,\n 39.577751\n ],\n [\n 115.699125,\n 39.577751\n ],\n [\n 115.716988,\n 39.560225\n ],\n [\n 115.716988,\n 39.560225\n ],\n [\n 115.721299,\n 39.55146\n ],\n [\n 115.721299,\n 39.55146\n ],\n [\n 115.721299,\n 39.543617\n ],\n [\n 115.721299,\n 39.543617\n ],\n [\n 115.723763,\n 39.544539\n ],\n [\n 115.723763,\n 39.544539\n ],\n [\n 115.737314,\n 39.544078\n ],\n [\n 115.737314,\n 39.544078\n ],\n [\n 115.738545,\n 39.539925\n ],\n [\n 115.738545,\n 39.539464\n ],\n [\n 115.738545,\n 39.539925\n ],\n [\n 115.738545,\n 39.539464\n ],\n [\n 115.752712,\n 39.512696\n ],\n [\n 115.752712,\n 39.512696\n ],\n [\n 115.821081,\n 39.517312\n ],\n [\n 115.821081,\n 39.517312\n ],\n [\n 115.846951,\n 39.550999\n ],\n [\n 115.846951,\n 39.550999\n ],\n [\n 115.855574,\n 39.554689\n ],\n [\n 115.855574,\n 39.554689\n ],\n [\n 115.910393,\n 39.600345\n ],\n [\n 115.910393,\n 39.600345\n ],\n [\n 115.957204,\n 39.561147\n ],\n [\n 116.10195,\n 39.576368\n ],\n [\n 116.10195,\n 39.576368\n ],\n [\n 116.204196,\n 39.588819\n ],\n [\n 116.245464,\n 39.515466\n ],\n [\n 116.332927,\n 39.457744\n ],\n [\n 116.433325,\n 39.44296\n ],\n [\n 116.440716,\n 39.527466\n ],\n [\n 116.524484,\n 39.596657\n ],\n [\n 116.607636,\n 39.619705\n ],\n [\n 116.703106,\n 39.588819\n ],\n [\n 116.703106,\n 39.588819\n ],\n [\n 116.726512,\n 39.595274\n ],\n [\n 116.726512,\n 39.595274\n ],\n [\n 116.720969,\n 39.599884\n ],\n [\n 116.720969,\n 39.599884\n ],\n [\n 116.717273,\n 39.603572\n ],\n [\n 116.717273,\n 39.603572\n ],\n [\n 116.812128,\n 39.616018\n ],\n [\n 116.796113,\n 39.446656\n ],\n [\n 116.870642,\n 39.357426\n ],\n [\n 116.892816,\n 39.224061\n ],\n [\n 116.865714,\n 39.155428\n ],\n [\n 116.865714,\n 39.155428\n ],\n [\n 116.912526,\n 39.110873\n ],\n [\n 116.91191,\n 39.111338\n ],\n [\n 116.91191,\n 39.111338\n ],\n [\n 116.912526,\n 39.110873\n ],\n [\n 116.812744,\n 39.050959\n ],\n [\n 116.812744,\n 39.050959\n ],\n [\n 116.783179,\n 39.050959\n ],\n [\n 116.783179,\n 39.050959\n ],\n [\n 116.708034,\n 38.931907\n ],\n [\n 116.737599,\n 38.784677\n ],\n [\n 116.766548,\n 38.742222\n ],\n [\n 116.858939,\n 38.741289\n ],\n [\n 116.877417,\n 38.680594\n ],\n [\n 116.950714,\n 38.689468\n ],\n [\n 116.95133,\n 38.689468\n ],\n [\n 116.950714,\n 38.689468\n ],\n [\n 116.947634,\n 38.689468\n ],\n [\n 116.947634,\n 38.689468\n ],\n [\n 116.95133,\n 38.689468\n ],\n [\n 117.042489,\n 38.706279\n ],\n [\n 117.097924,\n 38.587118\n ],\n [\n 117.176764,\n 38.617978\n ],\n [\n 117.176764,\n 38.617978\n ],\n [\n 117.213104,\n 38.639947\n ],\n [\n 117.213104,\n 38.639947\n ],\n [\n 117.252524,\n 38.556711\n ],\n [\n 117.39419,\n 38.573553\n ],\n [\n 117.47919,\n 38.617043\n ],\n [\n 117.639334,\n 38.62686\n ],\n [\n 117.638102,\n 38.545013\n ],\n [\n 117.781,\n 38.374004\n ],\n [\n 117.937449,\n 38.387606\n ],\n [\n 117.895565,\n 38.30173\n ],\n [\n 117.808718,\n 38.228445\n ],\n [\n 117.771761,\n 38.136734\n ],\n [\n 117.70216,\n 38.075529\n ],\n [\n 117.5839,\n 38.070819\n ],\n [\n 117.513067,\n 37.94353\n ],\n [\n 117.438538,\n 37.853823\n ],\n [\n 117.34122,\n 37.863271\n ],\n [\n 117.267923,\n 37.838704\n ],\n [\n 117.093612,\n 37.849571\n ],\n [\n 117.023395,\n 37.832561\n ],\n [\n 116.788106,\n 37.843429\n ],\n [\n 116.724664,\n 37.744139\n ],\n [\n 116.433941,\n 37.47349\n ],\n [\n 116.38097,\n 37.522858\n ],\n [\n 116.379738,\n 37.521909\n ],\n [\n 116.38097,\n 37.522858\n ],\n [\n 116.379738,\n 37.521909\n ],\n [\n 116.337238,\n 37.580255\n ],\n [\n 116.291659,\n 37.557966\n ],\n [\n 116.27626,\n 37.466841\n ],\n [\n 116.240536,\n 37.489633\n ],\n [\n 116.240536,\n 37.489633\n ],\n [\n 116.226369,\n 37.428365\n ],\n [\n 116.2855,\n 37.404604\n ],\n [\n 116.236224,\n 37.361816\n ],\n [\n 116.169087,\n 37.384164\n ],\n [\n 116.051443,\n 37.367998\n ],\n [\n 115.984921,\n 37.326616\n ],\n [\n 115.969523,\n 37.239497\n ],\n [\n 115.909777,\n 37.206622\n ],\n [\n 115.868509,\n 37.076414\n ],\n [\n 115.776734,\n 36.992829\n ],\n [\n 115.79706,\n 36.968931\n ],\n [\n 115.71206,\n 36.883313\n ],\n [\n 115.683727,\n 36.808139\n ],\n [\n 115.479851,\n 36.76022\n ],\n [\n 115.365902,\n 36.622043\n ],\n [\n 115.283366,\n 36.486505\n ],\n [\n 115.308004,\n 36.461967\n ],\n [\n 115.308004,\n 36.461967\n ],\n [\n 115.366518,\n 36.308793\n ],\n [\n 115.466916,\n 36.259115\n ],\n [\n 115.466916,\n 36.259115\n ],\n [\n 115.483547,\n 36.149036\n ],\n [\n 115.312931,\n 36.088137\n ],\n [\n 115.201446,\n 36.210371\n ],\n [\n 115.201446,\n 36.210371\n ],\n [\n 115.064092,\n 36.178985\n ],\n [\n 114.996955,\n 36.06831\n ],\n [\n 114.914419,\n 36.051865\n ],\n [\n 114.912571,\n 36.140339\n ],\n [\n 114.591666,\n 36.130192\n ],\n [\n 114.345291,\n 36.255738\n ],\n [\n 114.169132,\n 36.243675\n ],\n [\n 114.169132,\n 36.243675\n ],\n [\n 114.060727,\n 36.276482\n ],\n [\n 114.055799,\n 36.330005\n ],\n [\n 113.982502,\n 36.358921\n ],\n [\n 113.911054,\n 36.314578\n ],\n [\n 113.881488,\n 36.354102\n ],\n [\n 113.819894,\n 36.330969\n ],\n [\n 113.731199,\n 36.363257\n ],\n [\n 113.708409,\n 36.423461\n ],\n [\n 113.554425,\n 36.494682\n ],\n [\n 113.588301,\n 36.562955\n ],\n [\n 113.476816,\n 36.655171\n ],\n [\n 113.499606,\n 36.740564\n ],\n [\n 113.680692,\n 36.789933\n ],\n [\n 113.696707,\n 36.882356\n ],\n [\n 113.773083,\n 36.855072\n ],\n [\n 113.76138,\n 36.956022\n ],\n [\n 113.791561,\n 36.987572\n ],\n [\n 113.758301,\n 37.075459\n ],\n [\n 113.773083,\n 37.1518\n ],\n [\n 113.832213,\n 37.167536\n ],\n [\n 113.90243,\n 37.309962\n ],\n [\n 114.014531,\n 37.424564\n ],\n [\n 114.036705,\n 37.49438\n ],\n [\n 114.123553,\n 37.60159\n ],\n [\n 114.12848,\n 37.698231\n ],\n [\n 113.993589,\n 37.706752\n ],\n [\n 114.044712,\n 37.762116\n ],\n [\n 113.976959,\n 37.816965\n ],\n [\n 113.951706,\n 37.917573\n ],\n [\n 113.872249,\n 37.990228\n ],\n [\n 113.876561,\n 38.055273\n ],\n [\n 113.810039,\n 38.112729\n ],\n [\n 113.825438,\n 38.169199\n ],\n [\n 113.720728,\n 38.174843\n ],\n [\n 113.711489,\n 38.213873\n ],\n [\n 113.570439,\n 38.237375\n ],\n [\n 113.525475,\n 38.382916\n ],\n [\n 113.583374,\n 38.459793\n ],\n [\n 113.561816,\n 38.558115\n ],\n [\n 113.612939,\n 38.646022\n ],\n [\n 113.70225,\n 38.65163\n ],\n [\n 113.720728,\n 38.713283\n ],\n [\n 113.839605,\n 38.758554\n ],\n [\n 113.855619,\n 38.828972\n ],\n [\n 113.776163,\n 38.885814\n ],\n [\n 113.76754,\n 38.959828\n ],\n [\n 113.898119,\n 39.067684\n ],\n [\n 114.050872,\n 39.135939\n ],\n [\n 114.10877,\n 39.052352\n ],\n [\n 114.345907,\n 39.075116\n ],\n [\n 114.388406,\n 39.176767\n ],\n [\n 114.47587,\n 39.216181\n ],\n [\n 114.416124,\n 39.243063\n ],\n [\n 114.480797,\n 39.350023\n ],\n [\n 114.470942,\n 39.408759\n ],\n [\n 114.568877,\n 39.574062\n ],\n [\n 114.408117,\n 39.65196\n ],\n [\n 114.395182,\n 39.867218\n ],\n [\n 114.225183,\n 39.857114\n ],\n [\n 114.17406,\n 39.897521\n ],\n [\n 114.047176,\n 39.916339\n ],\n [\n 114.021307,\n 39.992017\n ],\n [\n 113.910438,\n 40.011725\n ],\n [\n 113.956017,\n 40.031428\n ],\n [\n 113.989278,\n 40.112469\n ],\n [\n 114.044712,\n 40.05662\n ],\n [\n 114.101995,\n 40.099655\n ],\n [\n 114.073046,\n 40.168729\n ],\n [\n 114.073046,\n 40.168729\n ],\n [\n 114.235654,\n 40.198442\n ],\n [\n 114.255364,\n 40.236363\n ],\n [\n 114.46971,\n 40.267872\n ],\n [\n 114.530688,\n 40.344983\n ],\n [\n 114.446305,\n 40.372795\n ],\n [\n 114.31203,\n 40.372795\n ],\n [\n 114.267066,\n 40.474369\n ],\n [\n 114.283081,\n 40.590785\n ],\n [\n 114.209168,\n 40.629848\n ],\n [\n 114.134639,\n 40.737381\n ],\n [\n 114.044712,\n 40.83116\n ],\n [\n 114.073661,\n 40.857412\n ],\n [\n 113.973263,\n 40.983099\n ],\n [\n 113.819279,\n 41.097726\n ],\n [\n 113.920293,\n 41.172081\n ],\n [\n 113.996669,\n 41.192345\n ],\n [\n 113.927068,\n 41.326829\n ],\n [\n 113.94493,\n 41.39105\n ],\n [\n 113.871017,\n 41.41349\n ],\n [\n 113.930764,\n 41.485693\n ],\n [\n 114.100147,\n 41.537218\n ],\n [\n 114.230726,\n 41.513477\n ],\n [\n 114.203009,\n 41.793334\n ],\n [\n 114.34837,\n 41.947049\n ],\n [\n 114.510978,\n 41.973299\n ],\n [\n 114.466015,\n 42.038656\n ],\n [\n 114.510978,\n 42.111047\n ],\n [\n 114.765361,\n 42.118593\n ],\n [\n 114.828803,\n 42.147434\n ],\n [\n 114.9021,\n 42.015544\n ],\n [\n 114.922426,\n 41.824999\n ],\n [\n 114.866991,\n 41.803147\n ],\n [\n 114.899636,\n 41.756299\n ],\n [\n 114.895325,\n 41.636567\n ],\n [\n 114.862064,\n 41.603915\n ],\n [\n 115.0992,\n 41.624045\n ],\n [\n 115.252569,\n 41.579303\n ],\n [\n 115.376989,\n 41.602126\n ],\n [\n 115.319091,\n 41.691546\n ],\n [\n 115.654162,\n 41.829011\n ],\n [\n 115.811226,\n 41.912328\n ],\n [\n 115.916552,\n 41.945269\n ],\n [\n 116.016334,\n 41.777273\n ],\n [\n 116.09887,\n 41.776381\n ],\n [\n 116.122892,\n 41.861995\n ],\n [\n 116.194341,\n 41.861995\n ],\n [\n 116.233145,\n 41.941263\n ],\n [\n 116.310137,\n 41.997316\n ],\n [\n 116.409303,\n 41.994203\n ],\n [\n 116.386514,\n 41.952389\n ],\n [\n 116.510933,\n 41.974189\n ],\n [\n 116.560209,\n 41.928356\n ],\n [\n 116.727744,\n 41.951054\n ],\n [\n 116.879881,\n 42.018211\n ],\n [\n 116.890352,\n 42.092846\n ],\n [\n 116.789338,\n 42.200202\n ],\n [\n 116.907598,\n 42.191337\n ],\n [\n 116.886656,\n 42.366641\n ],\n [\n 116.910062,\n 42.394928\n ],\n [\n 116.910062,\n 42.394928\n ],\n [\n 116.927308,\n 42.40509\n ],\n [\n 116.927308,\n 42.40509\n ],\n [\n 116.929156,\n 42.407741\n ],\n [\n 116.929156,\n 42.408182\n ],\n [\n 116.929156,\n 42.407741\n ],\n [\n 116.929156,\n 42.408182\n ],\n [\n 116.936547,\n 42.410833\n ],\n [\n 116.936547,\n 42.410833\n ],\n [\n 116.944555,\n 42.415251\n ],\n [\n 116.944555,\n 42.415251\n ],\n [\n 116.976583,\n 42.427618\n ],\n [\n 116.976583,\n 42.427618\n ],\n [\n 116.984591,\n 42.427176\n ],\n [\n 116.984591,\n 42.427176\n ],\n [\n 116.993214,\n 42.425851\n ],\n [\n 116.993214,\n 42.425851\n ],\n [\n 116.995678,\n 42.426734\n ],\n [\n 116.995678,\n 42.426734\n ],\n [\n 117.001837,\n 42.432476\n ],\n [\n 117.001837,\n 42.432476\n ],\n [\n 117.004301,\n 42.432476\n ],\n [\n 117.004301,\n 42.432476\n ],\n [\n 117.005533,\n 42.4338\n ],\n [\n 117.005533,\n 42.4338\n ],\n [\n 117.133648,\n 42.470443\n ],\n [\n 117.133648,\n 42.470443\n ],\n [\n 117.147815,\n 42.470443\n ],\n [\n 117.147815,\n 42.470443\n ],\n [\n 117.264227,\n 42.476621\n ],\n [\n 117.264227,\n 42.476621\n ],\n [\n 117.412669,\n 42.472649\n ],\n [\n 117.387415,\n 42.517648\n ],\n [\n 117.387415,\n 42.517648\n ],\n [\n 117.43669,\n 42.584205\n ],\n [\n 117.516146,\n 42.599622\n ],\n [\n 117.516146,\n 42.599622\n ],\n [\n 117.687377,\n 42.582884\n ],\n [\n 117.779768,\n 42.618558\n ],\n [\n 117.874007,\n 42.510151\n ],\n [\n 118.019369,\n 42.39537\n ],\n [\n 118.060021,\n 42.298083\n ],\n [\n 117.977485,\n 42.229892\n ],\n [\n 118.109296,\n 42.165176\n ],\n [\n 118.097593,\n 42.105277\n ],\n [\n 118.155491,\n 42.081301\n ],\n [\n 118.119767,\n 42.034656\n ],\n [\n 118.194296,\n 42.031545\n ],\n [\n 118.212774,\n 42.081301\n ],\n [\n 118.297157,\n 42.048876\n ],\n [\n 118.237411,\n 42.023101\n ],\n [\n 118.313788,\n 41.987977\n ],\n [\n 118.268824,\n 41.930136\n ],\n [\n 118.340273,\n 41.872688\n ],\n [\n 118.29223,\n 41.772811\n ],\n [\n 118.165962,\n 41.813405\n ],\n [\n 118.130854,\n 41.74246\n ],\n [\n 118.214006,\n 41.641933\n ],\n [\n 118.230636,\n 41.581989\n ],\n [\n 118.307012,\n 41.569008\n ],\n [\n 118.271904,\n 41.471349\n ],\n [\n 118.348896,\n 41.428296\n ],\n [\n 118.35136,\n 41.337163\n ],\n [\n 118.519511,\n 41.353783\n ],\n [\n 118.677192,\n 41.350639\n ],\n [\n 118.741866,\n 41.324133\n ],\n [\n 118.843496,\n 41.374439\n ],\n [\n 118.890923,\n 41.300764\n ],\n [\n 118.96422,\n 41.309303\n ],\n [\n 119.197661,\n 41.282781\n ],\n [\n 119.239545,\n 41.314696\n ],\n [\n 119.2494,\n 41.279634\n ],\n [\n 119.126212,\n 41.138744\n ],\n [\n 119.037516,\n 41.067509\n ],\n [\n 118.96422,\n 41.079236\n ],\n [\n 118.951901,\n 41.01832\n ],\n [\n 119.013495,\n 41.007485\n ],\n [\n 118.977154,\n 40.959155\n ],\n [\n 118.977154,\n 40.959155\n ],\n [\n 118.90201,\n 40.960963\n ],\n [\n 118.849039,\n 40.800821\n ],\n [\n 118.911249,\n 40.776811\n ],\n [\n 119.054147,\n 40.664804\n ],\n [\n 119.184726,\n 40.680233\n ],\n [\n 119.162552,\n 40.599872\n ],\n [\n 119.30237,\n 40.530329\n ],\n [\n 119.571536,\n 40.540333\n ],\n [\n 119.598637,\n 40.465266\n ],\n [\n 119.586934,\n 40.37553\n ],\n [\n 119.642369,\n 40.291151\n ],\n [\n 119.625123,\n 40.224029\n ],\n [\n 119.745847,\n 40.208038\n ],\n [\n 119.736608,\n 40.10469\n ],\n [\n 119.779723,\n 40.049293\n ],\n [\n 119.779723,\n 40.049293\n ],\n [\n 119.780339,\n 40.047002\n ],\n [\n 119.780339,\n 40.047002\n ],\n [\n 119.817296,\n 40.049751\n ],\n [\n 119.817296,\n 40.049751\n ],\n [\n 119.848093,\n 40.020432\n ],\n [\n 119.848093,\n 40.020432\n ],\n [\n 119.845629,\n 40.000726\n ],\n [\n 119.845629,\n 40.000726\n ],\n [\n 119.854252,\n 39.988349\n ],\n [\n 119.791426,\n 39.952124\n ],\n [\n 119.540739,\n 39.88834\n ],\n [\n 119.536427,\n 39.808871\n ],\n [\n 119.466826,\n 39.810709\n ],\n [\n 119.357805,\n 39.721946\n ],\n [\n 119.269726,\n 39.498385\n ],\n [\n 119.314689,\n 39.412457\n ],\n [\n 119.190885,\n 39.368528\n ],\n [\n 119.096031,\n 39.242136\n ],\n [\n 118.948821,\n 39.138259\n ],\n [\n 118.955597,\n 39.176303\n ],\n [\n 118.76096,\n 39.133618\n ],\n [\n 118.637156,\n 39.157284\n ],\n [\n 118.533062,\n 39.090907\n ],\n [\n 118.604511,\n 38.971458\n ],\n [\n 118.491178,\n 38.909097\n ],\n [\n 118.377845,\n 38.971923\n ],\n [\n 118.366143,\n 39.016101\n ],\n [\n 118.225092,\n 39.034694\n ],\n [\n 118.120999,\n 39.186043\n ],\n [\n 118.037231,\n 39.220353\n ],\n [\n 118.024912,\n 39.292164\n ],\n [\n 118.024912,\n 39.292164\n ],\n [\n 118.024296,\n 39.289386\n ],\n [\n 118.024296,\n 39.289386\n ],\n [\n 118.021833,\n 39.287071\n ],\n [\n 118.021833,\n 39.287071\n ],\n [\n 117.982412,\n 39.298647\n ],\n [\n 117.982412,\n 39.298647\n ],\n [\n 117.972557,\n 39.312536\n ],\n [\n 117.972557,\n 39.312536\n ],\n [\n 117.846906,\n 39.328274\n ],\n [\n 117.870311,\n 39.454972\n ],\n [\n 117.933753,\n 39.574062\n ],\n [\n 117.866,\n 39.596657\n ],\n [\n 117.74774,\n 39.58928\n ],\n [\n 117.736037,\n 39.560686\n ],\n [\n 117.736037,\n 39.560686\n ],\n [\n 117.619008,\n 39.603111\n ],\n [\n 117.66274,\n 39.636295\n ],\n [\n 117.644262,\n 39.702155\n ],\n [\n 117.57774,\n 39.727009\n ],\n [\n 117.540784,\n 39.822658\n ],\n [\n 117.540784,\n 39.822658\n ],\n [\n 117.537704,\n 39.835064\n ],\n [\n 117.537704,\n 39.835064\n ],\n [\n 117.513067,\n 39.910373\n ],\n [\n 117.513067,\n 39.910373\n ],\n [\n 117.589443,\n 39.997059\n ],\n [\n 117.614697,\n 39.972303\n ],\n [\n 117.782232,\n 39.968634\n ],\n [\n 117.75821,\n 40.073563\n ],\n [\n 117.75821,\n 40.073563\n ],\n [\n 117.71879,\n 40.082262\n ],\n [\n 117.71879,\n 40.082262\n ],\n [\n 117.651037,\n 40.122535\n ],\n [\n 117.651037,\n 40.122535\n ],\n [\n 117.652269,\n 40.12345\n ],\n [\n 117.652269,\n 40.12345\n ],\n [\n 117.571581,\n 40.21809\n ],\n [\n 117.450857,\n 40.252347\n ],\n [\n 117.389879,\n 40.228141\n ]\n ]\n ],\n [\n [\n [\n 116.90575,\n 39.687883\n ],\n [\n 116.902055,\n 39.763813\n ],\n [\n 116.949482,\n 39.778529\n ],\n [\n 116.926076,\n 39.835524\n ],\n [\n 116.786874,\n 39.886963\n ],\n [\n 116.757925,\n 39.968176\n ],\n [\n 116.783794,\n 40.035093\n ],\n [\n 116.927924,\n 40.054788\n ],\n [\n 116.999989,\n 40.030053\n ],\n [\n 117.102851,\n 40.073563\n ],\n [\n 117.102235,\n 40.073105\n ],\n [\n 117.102235,\n 40.073105\n ],\n [\n 117.102851,\n 40.073563\n ],\n [\n 117.105315,\n 40.074479\n ],\n [\n 117.105315,\n 40.074479\n ],\n [\n 117.210024,\n 40.082262\n ],\n [\n 117.198322,\n 39.992933\n ],\n [\n 117.150894,\n 39.944785\n ],\n [\n 117.152126,\n 39.878239\n ],\n [\n 117.229735,\n 39.852981\n ],\n [\n 117.156438,\n 39.817603\n ],\n [\n 117.205713,\n 39.763813\n ],\n [\n 117.165061,\n 39.718725\n ],\n [\n 117.165061,\n 39.718725\n ],\n [\n 117.177996,\n 39.64551\n ],\n [\n 117.126873,\n 39.61694\n ],\n [\n 116.983975,\n 39.63906\n ],\n [\n 116.983975,\n 39.63906\n ],\n [\n 116.916837,\n 39.703996\n ],\n [\n 116.916837,\n 39.703996\n ],\n [\n 116.90575,\n 39.687883\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 140000,\n \"name\": \"山西省\",\n \"center\": [\n 112.549248,\n 37.857014\n ],\n \"centroid\": [\n 112.305144,\n 37.619053\n ],\n \"childrenNum\": 11,\n \"level\": \"province\",\n \"subFeatureIndex\": 3,\n \"acroutes\": [\n 100000\n ],\n \"parent\": {\n \"adcode\": 100000\n }\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 113.731199,\n 36.363257\n ],\n [\n 113.716417,\n 36.262492\n ],\n [\n 113.651743,\n 36.172224\n ],\n [\n 113.694859,\n 36.026707\n ],\n [\n 113.637576,\n 35.98847\n ],\n [\n 113.656671,\n 35.836792\n ],\n [\n 113.604316,\n 35.797008\n ],\n [\n 113.578446,\n 35.63378\n ],\n [\n 113.485439,\n 35.520879\n ],\n [\n 113.31236,\n 35.481424\n ],\n [\n 113.298194,\n 35.427325\n ],\n [\n 113.189789,\n 35.449261\n ],\n [\n 113.126347,\n 35.332197\n ],\n [\n 112.997,\n 35.362455\n ],\n [\n 112.992072,\n 35.296068\n ],\n [\n 112.911384,\n 35.24673\n ],\n [\n 112.818377,\n 35.258457\n ],\n [\n 112.766022,\n 35.203718\n ],\n [\n 112.628052,\n 35.263342\n ],\n [\n 112.637291,\n 35.225716\n ],\n [\n 112.513487,\n 35.218384\n ],\n [\n 112.058924,\n 35.279951\n ],\n [\n 112.078634,\n 35.219362\n ],\n [\n 112.062004,\n 35.055937\n ],\n [\n 111.900012,\n 35.079933\n ],\n [\n 111.66965,\n 34.988319\n ],\n [\n 111.570484,\n 34.843094\n ],\n [\n 111.346282,\n 34.831798\n ],\n [\n 111.232949,\n 34.789551\n ],\n [\n 111.148566,\n 34.80773\n ],\n [\n 111.118385,\n 34.756622\n ],\n [\n 110.966248,\n 34.70499\n ],\n [\n 110.929907,\n 34.731548\n ],\n [\n 110.883712,\n 34.642498\n ],\n [\n 110.749437,\n 34.652342\n ],\n [\n 110.710017,\n 34.605078\n ],\n [\n 110.533242,\n 34.583406\n ],\n [\n 110.474728,\n 34.617389\n ],\n [\n 110.379257,\n 34.600646\n ],\n [\n 110.310272,\n 34.608033\n ],\n [\n 110.241287,\n 34.682361\n ],\n [\n 110.232664,\n 34.803308\n ],\n [\n 110.257301,\n 34.93487\n ],\n [\n 110.325671,\n 35.014785\n ],\n [\n 110.39404,\n 35.271647\n ],\n [\n 110.45009,\n 35.327803\n ],\n [\n 110.477808,\n 35.413672\n ],\n [\n 110.525851,\n 35.44195\n ],\n [\n 110.609619,\n 35.632321\n ],\n [\n 110.57759,\n 35.701346\n ],\n [\n 110.549257,\n 35.877527\n ],\n [\n 110.511684,\n 35.879951\n ],\n [\n 110.447011,\n 36.164495\n ],\n [\n 110.474112,\n 36.248018\n ],\n [\n 110.45933,\n 36.330969\n ],\n [\n 110.503677,\n 36.487948\n ],\n [\n 110.496902,\n 36.582175\n ],\n [\n 110.394656,\n 36.676768\n ],\n [\n 110.447011,\n 36.737687\n ],\n [\n 110.416214,\n 36.790892\n ],\n [\n 110.425453,\n 36.960325\n ],\n [\n 110.382953,\n 37.021975\n ],\n [\n 110.444547,\n 37.007164\n ],\n [\n 110.53509,\n 37.137969\n ],\n [\n 110.690307,\n 37.287115\n ],\n [\n 110.695234,\n 37.34945\n ],\n [\n 110.630561,\n 37.373228\n ],\n [\n 110.644111,\n 37.435017\n ],\n [\n 110.745125,\n 37.450693\n ],\n [\n 110.795017,\n 37.566029\n ],\n [\n 110.796248,\n 37.66319\n ],\n [\n 110.706321,\n 37.705332\n ],\n [\n 110.758676,\n 37.744139\n ],\n [\n 110.663821,\n 37.803256\n ],\n [\n 110.59422,\n 37.921821\n ],\n [\n 110.522771,\n 37.954853\n ],\n [\n 110.501213,\n 38.031713\n ],\n [\n 110.509221,\n 38.192245\n ],\n [\n 110.565887,\n 38.215283\n ],\n [\n 110.57759,\n 38.297035\n ],\n [\n 110.661358,\n 38.308773\n ],\n [\n 110.746973,\n 38.366029\n ],\n [\n 110.77777,\n 38.44105\n ],\n [\n 110.874473,\n 38.453702\n ],\n [\n 110.920052,\n 38.581973\n ],\n [\n 110.880016,\n 38.618446\n ],\n [\n 111.009363,\n 38.847614\n ],\n [\n 110.980414,\n 38.970063\n ],\n [\n 111.138711,\n 39.064897\n ],\n [\n 111.163348,\n 39.152644\n ],\n [\n 111.247732,\n 39.302351\n ],\n [\n 111.125776,\n 39.366678\n ],\n [\n 111.171971,\n 39.42355\n ],\n [\n 111.337043,\n 39.420777\n ],\n [\n 111.418963,\n 39.500232\n ],\n [\n 111.462079,\n 39.626157\n ],\n [\n 111.502115,\n 39.663015\n ],\n [\n 111.646245,\n 39.644128\n ],\n [\n 111.783599,\n 39.588819\n ],\n [\n 111.842729,\n 39.620166\n ],\n [\n 111.93204,\n 39.61233\n ],\n [\n 111.970229,\n 39.79646\n ],\n [\n 112.28559,\n 40.197985\n ],\n [\n 112.310227,\n 40.256457\n ],\n [\n 112.456205,\n 40.300278\n ],\n [\n 112.6299,\n 40.235906\n ],\n [\n 112.72845,\n 40.168272\n ],\n [\n 112.844863,\n 40.203926\n ],\n [\n 112.892906,\n 40.326284\n ],\n [\n 113.251382,\n 40.413352\n ],\n [\n 113.316056,\n 40.319898\n ],\n [\n 113.559968,\n 40.348631\n ],\n [\n 113.794641,\n 40.518049\n ],\n [\n 113.855619,\n 40.457071\n ],\n [\n 113.948626,\n 40.514865\n ],\n [\n 114.061959,\n 40.528964\n ],\n [\n 114.041633,\n 40.608503\n ],\n [\n 114.074277,\n 40.723325\n ],\n [\n 114.134639,\n 40.737381\n ],\n [\n 114.209168,\n 40.629848\n ],\n [\n 114.283081,\n 40.590785\n ],\n [\n 114.267066,\n 40.474369\n ],\n [\n 114.31203,\n 40.372795\n ],\n [\n 114.446305,\n 40.372795\n ],\n [\n 114.530688,\n 40.344983\n ],\n [\n 114.46971,\n 40.267872\n ],\n [\n 114.255364,\n 40.236363\n ],\n [\n 114.235654,\n 40.198442\n ],\n [\n 114.073046,\n 40.168729\n ],\n [\n 114.073046,\n 40.168729\n ],\n [\n 114.101995,\n 40.099655\n ],\n [\n 114.044712,\n 40.05662\n ],\n [\n 113.989278,\n 40.112469\n ],\n [\n 113.956017,\n 40.031428\n ],\n [\n 113.910438,\n 40.011725\n ],\n [\n 114.021307,\n 39.992017\n ],\n [\n 114.047176,\n 39.916339\n ],\n [\n 114.17406,\n 39.897521\n ],\n [\n 114.225183,\n 39.857114\n ],\n [\n 114.395182,\n 39.867218\n ],\n [\n 114.408117,\n 39.65196\n ],\n [\n 114.568877,\n 39.574062\n ],\n [\n 114.470942,\n 39.408759\n ],\n [\n 114.480797,\n 39.350023\n ],\n [\n 114.416124,\n 39.243063\n ],\n [\n 114.47587,\n 39.216181\n ],\n [\n 114.388406,\n 39.176767\n ],\n [\n 114.345907,\n 39.075116\n ],\n [\n 114.10877,\n 39.052352\n ],\n [\n 114.050872,\n 39.135939\n ],\n [\n 113.898119,\n 39.067684\n ],\n [\n 113.76754,\n 38.959828\n ],\n [\n 113.776163,\n 38.885814\n ],\n [\n 113.855619,\n 38.828972\n ],\n [\n 113.839605,\n 38.758554\n ],\n [\n 113.720728,\n 38.713283\n ],\n [\n 113.70225,\n 38.65163\n ],\n [\n 113.612939,\n 38.646022\n ],\n [\n 113.561816,\n 38.558115\n ],\n [\n 113.583374,\n 38.459793\n ],\n [\n 113.525475,\n 38.382916\n ],\n [\n 113.570439,\n 38.237375\n ],\n [\n 113.711489,\n 38.213873\n ],\n [\n 113.720728,\n 38.174843\n ],\n [\n 113.825438,\n 38.169199\n ],\n [\n 113.810039,\n 38.112729\n ],\n [\n 113.876561,\n 38.055273\n ],\n [\n 113.872249,\n 37.990228\n ],\n [\n 113.951706,\n 37.917573\n ],\n [\n 113.976959,\n 37.816965\n ],\n [\n 114.044712,\n 37.762116\n ],\n [\n 113.993589,\n 37.706752\n ],\n [\n 114.12848,\n 37.698231\n ],\n [\n 114.123553,\n 37.60159\n ],\n [\n 114.036705,\n 37.49438\n ],\n [\n 114.014531,\n 37.424564\n ],\n [\n 113.90243,\n 37.309962\n ],\n [\n 113.832213,\n 37.167536\n ],\n [\n 113.773083,\n 37.1518\n ],\n [\n 113.758301,\n 37.075459\n ],\n [\n 113.791561,\n 36.987572\n ],\n [\n 113.76138,\n 36.956022\n ],\n [\n 113.773083,\n 36.855072\n ],\n [\n 113.696707,\n 36.882356\n ],\n [\n 113.680692,\n 36.789933\n ],\n [\n 113.499606,\n 36.740564\n ],\n [\n 113.476816,\n 36.655171\n ],\n [\n 113.588301,\n 36.562955\n ],\n [\n 113.554425,\n 36.494682\n ],\n [\n 113.708409,\n 36.423461\n ],\n [\n 113.731199,\n 36.363257\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 150000,\n \"name\": \"内蒙古自治区\",\n \"center\": [\n 111.670801,\n 40.818311\n ],\n \"centroid\": [\n 114.059024,\n 44.315561\n ],\n \"childrenNum\": 12,\n \"level\": \"province\",\n \"subFeatureIndex\": 4,\n \"acroutes\": [\n 100000\n ],\n \"parent\": {\n \"adcode\": 100000\n }\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 123.703873,\n 43.370824\n ],\n [\n 123.664453,\n 43.264606\n ],\n [\n 123.666916,\n 43.179585\n ],\n [\n 123.572678,\n 43.0035\n ],\n [\n 123.515395,\n 43.027561\n ],\n [\n 123.515395,\n 43.027561\n ],\n [\n 123.474743,\n 43.04243\n ],\n [\n 123.259165,\n 42.992997\n ],\n [\n 123.18402,\n 42.926002\n ],\n [\n 123.169853,\n 42.859811\n ],\n [\n 123.227752,\n 42.831735\n ],\n [\n 123.058368,\n 42.768957\n ],\n [\n 122.887137,\n 42.770275\n ],\n [\n 122.831087,\n 42.722381\n ],\n [\n 122.786123,\n 42.756218\n ],\n [\n 122.786123,\n 42.756218\n ],\n [\n 122.732536,\n 42.786524\n ],\n [\n 122.624747,\n 42.773349\n ],\n [\n 122.563769,\n 42.826031\n ],\n [\n 122.436886,\n 42.843142\n ],\n [\n 122.35127,\n 42.830419\n ],\n [\n 122.374676,\n 42.774667\n ],\n [\n 122.457212,\n 42.774227\n ],\n [\n 122.395002,\n 42.683687\n ],\n [\n 122.338951,\n 42.670051\n ],\n [\n 122.203445,\n 42.731171\n ],\n [\n 122.20406,\n 42.683687\n ],\n [\n 122.071634,\n 42.711391\n ],\n [\n 121.940438,\n 42.688525\n ],\n [\n 121.904714,\n 42.569666\n ],\n [\n 121.66573,\n 42.437333\n ],\n [\n 121.604752,\n 42.494271\n ],\n [\n 121.388557,\n 42.475297\n ],\n [\n 121.304789,\n 42.435567\n ],\n [\n 121.304789,\n 42.435567\n ],\n [\n 121.285079,\n 42.387857\n ],\n [\n 121.068884,\n 42.252483\n ],\n [\n 120.933378,\n 42.279493\n ],\n [\n 120.79048,\n 42.218372\n ],\n [\n 120.745516,\n 42.223689\n ],\n [\n 120.624792,\n 42.154532\n ],\n [\n 120.58414,\n 42.167394\n ],\n [\n 120.466496,\n 42.105277\n ],\n [\n 120.456641,\n 42.016433\n ],\n [\n 120.373489,\n 41.994648\n ],\n [\n 120.188707,\n 41.848179\n ],\n [\n 120.096316,\n 41.696907\n ],\n [\n 120.035954,\n 41.708075\n ],\n [\n 120.051968,\n 41.775935\n ],\n [\n 119.989759,\n 41.898969\n ],\n [\n 119.837622,\n 42.135455\n ],\n [\n 119.846861,\n 42.21527\n ],\n [\n 119.744615,\n 42.211725\n ],\n [\n 119.541971,\n 42.292329\n ],\n [\n 119.572152,\n 42.359568\n ],\n [\n 119.502551,\n 42.387857\n ],\n [\n 119.415703,\n 42.309588\n ],\n [\n 119.284508,\n 42.265325\n ],\n [\n 119.237697,\n 42.201088\n ],\n [\n 119.315921,\n 42.119037\n ],\n [\n 119.384906,\n 42.089738\n ],\n [\n 119.324544,\n 41.969296\n ],\n [\n 119.334399,\n 41.869569\n ],\n [\n 119.294363,\n 41.775935\n ],\n [\n 119.307914,\n 41.657581\n ],\n [\n 119.415703,\n 41.590044\n ],\n [\n 119.361501,\n 41.56498\n ],\n [\n 119.405848,\n 41.508548\n ],\n [\n 119.376283,\n 41.422015\n ],\n [\n 119.30545,\n 41.402271\n ],\n [\n 119.326392,\n 41.329525\n ],\n [\n 119.239545,\n 41.314696\n ],\n [\n 119.197661,\n 41.282781\n ],\n [\n 118.96422,\n 41.309303\n ],\n [\n 118.890923,\n 41.300764\n ],\n [\n 118.843496,\n 41.374439\n ],\n [\n 118.741866,\n 41.324133\n ],\n [\n 118.677192,\n 41.350639\n ],\n [\n 118.519511,\n 41.353783\n ],\n [\n 118.35136,\n 41.337163\n ],\n [\n 118.348896,\n 41.428296\n ],\n [\n 118.271904,\n 41.471349\n ],\n [\n 118.307012,\n 41.569008\n ],\n [\n 118.230636,\n 41.581989\n ],\n [\n 118.214006,\n 41.641933\n ],\n [\n 118.130854,\n 41.74246\n ],\n [\n 118.165962,\n 41.813405\n ],\n [\n 118.29223,\n 41.772811\n ],\n [\n 118.340273,\n 41.872688\n ],\n [\n 118.268824,\n 41.930136\n ],\n [\n 118.313788,\n 41.987977\n ],\n [\n 118.237411,\n 42.023101\n ],\n [\n 118.297157,\n 42.048876\n ],\n [\n 118.212774,\n 42.081301\n ],\n [\n 118.194296,\n 42.031545\n ],\n [\n 118.119767,\n 42.034656\n ],\n [\n 118.155491,\n 42.081301\n ],\n [\n 118.097593,\n 42.105277\n ],\n [\n 118.109296,\n 42.165176\n ],\n [\n 117.977485,\n 42.229892\n ],\n [\n 118.060021,\n 42.298083\n ],\n [\n 118.019369,\n 42.39537\n ],\n [\n 117.874007,\n 42.510151\n ],\n [\n 117.779768,\n 42.618558\n ],\n [\n 117.687377,\n 42.582884\n ],\n [\n 117.516146,\n 42.599622\n ],\n [\n 117.516146,\n 42.599622\n ],\n [\n 117.43669,\n 42.584205\n ],\n [\n 117.387415,\n 42.517648\n ],\n [\n 117.387415,\n 42.517648\n ],\n [\n 117.412669,\n 42.472649\n ],\n [\n 117.264227,\n 42.476621\n ],\n [\n 117.264227,\n 42.476621\n ],\n [\n 117.147815,\n 42.470443\n ],\n [\n 117.147815,\n 42.470443\n ],\n [\n 117.133648,\n 42.470443\n ],\n [\n 117.133648,\n 42.470443\n ],\n [\n 117.005533,\n 42.4338\n ],\n [\n 117.005533,\n 42.4338\n ],\n [\n 117.004301,\n 42.432476\n ],\n [\n 117.004301,\n 42.432476\n ],\n [\n 117.001837,\n 42.432476\n ],\n [\n 117.001837,\n 42.432476\n ],\n [\n 116.995678,\n 42.426734\n ],\n [\n 116.995678,\n 42.426734\n ],\n [\n 116.993214,\n 42.425851\n ],\n [\n 116.993214,\n 42.425851\n ],\n [\n 116.984591,\n 42.427176\n ],\n [\n 116.984591,\n 42.427176\n ],\n [\n 116.976583,\n 42.427618\n ],\n [\n 116.976583,\n 42.427618\n ],\n [\n 116.944555,\n 42.415251\n ],\n [\n 116.944555,\n 42.415251\n ],\n [\n 116.936547,\n 42.410833\n ],\n [\n 116.936547,\n 42.410833\n ],\n [\n 116.929156,\n 42.408182\n ],\n [\n 116.929156,\n 42.407741\n ],\n [\n 116.929156,\n 42.408182\n ],\n [\n 116.929156,\n 42.407741\n ],\n [\n 116.927308,\n 42.40509\n ],\n [\n 116.927308,\n 42.40509\n ],\n [\n 116.910062,\n 42.394928\n ],\n [\n 116.910062,\n 42.394928\n ],\n [\n 116.886656,\n 42.366641\n ],\n [\n 116.907598,\n 42.191337\n ],\n [\n 116.789338,\n 42.200202\n ],\n [\n 116.890352,\n 42.092846\n ],\n [\n 116.879881,\n 42.018211\n ],\n [\n 116.727744,\n 41.951054\n ],\n [\n 116.560209,\n 41.928356\n ],\n [\n 116.510933,\n 41.974189\n ],\n [\n 116.386514,\n 41.952389\n ],\n [\n 116.409303,\n 41.994203\n ],\n [\n 116.310137,\n 41.997316\n ],\n [\n 116.233145,\n 41.941263\n ],\n [\n 116.194341,\n 41.861995\n ],\n [\n 116.122892,\n 41.861995\n ],\n [\n 116.09887,\n 41.776381\n ],\n [\n 116.016334,\n 41.777273\n ],\n [\n 115.916552,\n 41.945269\n ],\n [\n 115.811226,\n 41.912328\n ],\n [\n 115.654162,\n 41.829011\n ],\n [\n 115.319091,\n 41.691546\n ],\n [\n 115.376989,\n 41.602126\n ],\n [\n 115.252569,\n 41.579303\n ],\n [\n 115.0992,\n 41.624045\n ],\n [\n 114.862064,\n 41.603915\n ],\n [\n 114.895325,\n 41.636567\n ],\n [\n 114.899636,\n 41.756299\n ],\n [\n 114.866991,\n 41.803147\n ],\n [\n 114.922426,\n 41.824999\n ],\n [\n 114.9021,\n 42.015544\n ],\n [\n 114.828803,\n 42.147434\n ],\n [\n 114.765361,\n 42.118593\n ],\n [\n 114.510978,\n 42.111047\n ],\n [\n 114.466015,\n 42.038656\n ],\n [\n 114.510978,\n 41.973299\n ],\n [\n 114.34837,\n 41.947049\n ],\n [\n 114.203009,\n 41.793334\n ],\n [\n 114.230726,\n 41.513477\n ],\n [\n 114.100147,\n 41.537218\n ],\n [\n 113.930764,\n 41.485693\n ],\n [\n 113.871017,\n 41.41349\n ],\n [\n 113.94493,\n 41.39105\n ],\n [\n 113.927068,\n 41.326829\n ],\n [\n 113.996669,\n 41.192345\n ],\n [\n 113.920293,\n 41.172081\n ],\n [\n 113.819279,\n 41.097726\n ],\n [\n 113.973263,\n 40.983099\n ],\n [\n 114.073661,\n 40.857412\n ],\n [\n 114.044712,\n 40.83116\n ],\n [\n 114.134639,\n 40.737381\n ],\n [\n 114.074277,\n 40.723325\n ],\n [\n 114.041633,\n 40.608503\n ],\n [\n 114.061959,\n 40.528964\n ],\n [\n 113.948626,\n 40.514865\n ],\n [\n 113.855619,\n 40.457071\n ],\n [\n 113.794641,\n 40.518049\n ],\n [\n 113.559968,\n 40.348631\n ],\n [\n 113.316056,\n 40.319898\n ],\n [\n 113.251382,\n 40.413352\n ],\n [\n 112.892906,\n 40.326284\n ],\n [\n 112.844863,\n 40.203926\n ],\n [\n 112.72845,\n 40.168272\n ],\n [\n 112.6299,\n 40.235906\n ],\n [\n 112.456205,\n 40.300278\n ],\n [\n 112.310227,\n 40.256457\n ],\n [\n 112.28559,\n 40.197985\n ],\n [\n 111.970229,\n 39.79646\n ],\n [\n 111.93204,\n 39.61233\n ],\n [\n 111.842729,\n 39.620166\n ],\n [\n 111.783599,\n 39.588819\n ],\n [\n 111.646245,\n 39.644128\n ],\n [\n 111.502115,\n 39.663015\n ],\n [\n 111.462079,\n 39.626157\n ],\n [\n 111.418963,\n 39.500232\n ],\n [\n 111.337043,\n 39.420777\n ],\n [\n 111.171971,\n 39.42355\n ],\n [\n 111.125776,\n 39.366678\n ],\n [\n 111.064182,\n 39.400899\n ],\n [\n 111.148566,\n 39.531619\n ],\n [\n 111.134399,\n 39.586513\n ],\n [\n 110.892335,\n 39.509927\n ],\n [\n 110.740198,\n 39.351874\n ],\n [\n 110.702626,\n 39.27364\n ],\n [\n 110.604075,\n 39.277345\n ],\n [\n 110.528315,\n 39.380091\n ],\n [\n 110.434692,\n 39.381016\n ],\n [\n 110.39096,\n 39.31161\n ],\n [\n 110.243751,\n 39.42355\n ],\n [\n 110.146432,\n 39.455434\n ],\n [\n 110.217881,\n 39.28105\n ],\n [\n 109.961035,\n 39.191608\n ],\n [\n 109.665384,\n 38.981691\n ],\n [\n 109.683862,\n 38.935631\n ],\n [\n 109.624116,\n 38.854603\n ],\n [\n 109.549587,\n 38.805662\n ],\n [\n 109.511399,\n 38.833633\n ],\n [\n 109.404226,\n 38.720752\n ],\n [\n 109.338936,\n 38.70161\n ],\n [\n 109.367269,\n 38.627328\n ],\n [\n 109.276726,\n 38.623121\n ],\n [\n 109.178792,\n 38.520675\n ],\n [\n 109.051908,\n 38.432146\n ],\n [\n 108.938575,\n 38.207291\n ],\n [\n 108.963829,\n 38.155085\n ],\n [\n 109.069155,\n 38.091071\n ],\n [\n 109.017416,\n 37.969949\n ],\n [\n 108.938575,\n 37.920877\n ],\n [\n 108.871438,\n 38.027471\n ],\n [\n 108.797525,\n 38.047735\n ],\n [\n 108.82709,\n 37.989285\n ],\n [\n 108.798141,\n 37.93362\n ],\n [\n 108.799989,\n 37.783871\n ],\n [\n 108.777815,\n 37.683554\n ],\n [\n 108.611512,\n 37.65419\n ],\n [\n 108.532671,\n 37.690656\n ],\n [\n 108.440896,\n 37.654663\n ],\n [\n 108.304158,\n 37.638556\n ],\n [\n 108.219158,\n 37.661295\n ],\n [\n 108.134159,\n 37.621971\n ],\n [\n 108.025137,\n 37.649926\n ],\n [\n 107.982022,\n 37.787181\n ],\n [\n 107.65003,\n 37.864688\n ],\n [\n 107.49235,\n 37.944945\n ],\n [\n 107.419669,\n 37.940699\n ],\n [\n 107.438147,\n 37.992586\n ],\n [\n 107.329742,\n 38.087774\n ],\n [\n 107.19054,\n 38.154144\n ],\n [\n 107.014997,\n 38.120261\n ],\n [\n 106.768621,\n 38.174843\n ],\n [\n 106.546883,\n 38.269794\n ],\n [\n 106.482825,\n 38.319571\n ],\n [\n 106.601702,\n 38.392295\n ],\n [\n 106.647897,\n 38.470569\n ],\n [\n 106.66268,\n 38.601614\n ],\n [\n 106.709491,\n 38.718885\n ],\n [\n 106.954019,\n 38.941215\n ],\n [\n 106.96757,\n 39.054676\n ],\n [\n 106.859164,\n 39.107623\n ],\n [\n 106.795723,\n 39.214327\n ],\n [\n 106.806809,\n 39.318554\n ],\n [\n 106.751375,\n 39.381478\n ],\n [\n 106.683622,\n 39.357426\n ],\n [\n 106.602318,\n 39.375466\n ],\n [\n 106.506231,\n 39.269934\n ],\n [\n 106.402753,\n 39.291701\n ],\n [\n 106.284493,\n 39.270397\n ],\n [\n 106.283877,\n 39.14522\n ],\n [\n 106.145907,\n 39.153108\n ],\n [\n 106.096631,\n 39.08487\n ],\n [\n 106.060907,\n 38.968667\n ],\n [\n 105.97098,\n 38.909097\n ],\n [\n 106.003625,\n 38.874636\n ],\n [\n 105.897683,\n 38.788875\n ],\n [\n 105.90569,\n 38.731488\n ],\n [\n 105.852719,\n 38.641349\n ],\n [\n 105.874277,\n 38.593197\n ],\n [\n 105.821307,\n 38.366967\n ],\n [\n 105.86627,\n 38.296565\n ],\n [\n 105.775111,\n 38.186601\n ],\n [\n 105.780655,\n 38.084949\n ],\n [\n 105.840401,\n 38.003902\n ],\n [\n 105.799749,\n 37.940227\n ],\n [\n 105.80406,\n 37.861854\n ],\n [\n 105.760944,\n 37.799947\n ],\n [\n 105.622974,\n 37.778669\n ],\n [\n 105.598952,\n 37.699178\n ],\n [\n 105.315004,\n 37.702018\n ],\n [\n 105.111128,\n 37.633818\n ],\n [\n 105.024281,\n 37.579781\n ],\n [\n 104.866601,\n 37.566503\n ],\n [\n 104.801311,\n 37.538516\n ],\n [\n 104.419429,\n 37.511943\n ],\n [\n 104.407726,\n 37.464467\n ],\n [\n 104.287002,\n 37.42789\n ],\n [\n 104.183524,\n 37.406981\n ],\n [\n 103.948235,\n 37.564606\n ],\n [\n 103.676606,\n 37.783871\n ],\n [\n 103.401897,\n 37.861854\n ],\n [\n 103.362477,\n 38.037368\n ],\n [\n 103.369868,\n 38.089658\n ],\n [\n 103.53494,\n 38.156497\n ],\n [\n 103.507838,\n 38.281068\n ],\n [\n 103.416063,\n 38.404956\n ],\n [\n 103.85954,\n 38.64462\n ],\n [\n 104.044322,\n 38.895128\n ],\n [\n 104.168125,\n 38.940285\n ],\n [\n 104.207546,\n 39.083941\n ],\n [\n 104.177364,\n 39.15218\n ],\n [\n 104.047401,\n 39.297721\n ],\n [\n 104.091133,\n 39.418466\n ],\n [\n 103.964865,\n 39.455434\n ],\n [\n 103.839214,\n 39.460516\n ],\n [\n 103.595302,\n 39.386565\n ],\n [\n 103.344615,\n 39.331514\n ],\n [\n 103.007696,\n 39.09973\n ],\n [\n 102.601792,\n 39.172129\n ],\n [\n 102.45335,\n 39.25511\n ],\n [\n 102.280887,\n 39.190217\n ],\n [\n 101.830636,\n 39.093229\n ],\n [\n 101.926106,\n 39.000758\n ],\n [\n 102.075164,\n 38.891403\n ],\n [\n 101.941505,\n 38.808926\n ],\n [\n 101.777049,\n 38.660507\n ],\n [\n 101.679115,\n 38.690869\n ],\n [\n 101.601506,\n 38.6549\n ],\n [\n 101.562702,\n 38.712816\n ],\n [\n 101.307087,\n 38.802865\n ],\n [\n 101.334189,\n 38.848545\n ],\n [\n 101.24303,\n 38.86066\n ],\n [\n 101.198682,\n 38.943077\n ],\n [\n 101.228863,\n 39.02075\n ],\n [\n 101.117378,\n 38.97518\n ],\n [\n 100.969553,\n 38.9468\n ],\n [\n 100.961545,\n 39.005873\n ],\n [\n 100.835278,\n 39.025863\n ],\n [\n 100.864227,\n 39.106695\n ],\n [\n 100.842669,\n 39.199955\n ],\n [\n 100.842053,\n 39.405523\n ],\n [\n 100.619699,\n 39.38749\n ],\n [\n 100.498975,\n 39.400437\n ],\n [\n 100.500823,\n 39.4813\n ],\n [\n 100.326512,\n 39.509003\n ],\n [\n 100.314193,\n 39.606799\n ],\n [\n 100.250135,\n 39.68512\n ],\n [\n 100.128179,\n 39.702155\n ],\n [\n 100.040716,\n 39.756913\n ],\n [\n 99.904593,\n 39.785886\n ],\n [\n 99.822058,\n 39.85987\n ],\n [\n 99.672384,\n 39.887881\n ],\n [\n 99.488218,\n 39.875943\n ],\n [\n 99.927383,\n 40.063947\n ],\n [\n 100.002528,\n 40.197528\n ],\n [\n 100.169447,\n 40.277458\n ],\n [\n 100.169447,\n 40.541242\n ],\n [\n 100.242744,\n 40.618495\n ],\n [\n 100.237201,\n 40.716977\n ],\n [\n 100.107853,\n 40.875511\n ],\n [\n 100.057346,\n 40.908077\n ],\n [\n 99.673,\n 40.932943\n ],\n [\n 99.565827,\n 40.846551\n ],\n [\n 99.174705,\n 40.858317\n ],\n [\n 99.172858,\n 40.747354\n ],\n [\n 99.102025,\n 40.676603\n ],\n [\n 99.041662,\n 40.693844\n ],\n [\n 98.984996,\n 40.782701\n ],\n [\n 98.790975,\n 40.705185\n ],\n [\n 98.801446,\n 40.609411\n ],\n [\n 98.689345,\n 40.691576\n ],\n [\n 98.668403,\n 40.772734\n ],\n [\n 98.569853,\n 40.746901\n ],\n [\n 98.627751,\n 40.677965\n ],\n [\n 98.344419,\n 40.568518\n ],\n [\n 98.333332,\n 40.918929\n ],\n [\n 98.25018,\n 40.939271\n ],\n [\n 97.971776,\n 41.097726\n ],\n [\n 97.629314,\n 41.440407\n ],\n [\n 97.613915,\n 41.477176\n ],\n [\n 97.84674,\n 41.656687\n ],\n [\n 97.307177,\n 42.565259\n ],\n [\n 97.172903,\n 42.795305\n ],\n [\n 98.195362,\n 42.653331\n ],\n [\n 98.546447,\n 42.638368\n ],\n [\n 99.503001,\n 42.568344\n ],\n [\n 99.969267,\n 42.648051\n ],\n [\n 100.272309,\n 42.636167\n ],\n [\n 100.32528,\n 42.689845\n ],\n [\n 100.826655,\n 42.67533\n ],\n [\n 101.23995,\n 42.59698\n ],\n [\n 101.581796,\n 42.525145\n ],\n [\n 101.803534,\n 42.503534\n ],\n [\n 102.070236,\n 42.232107\n ],\n [\n 102.449039,\n 42.143885\n ],\n [\n 102.540814,\n 42.162072\n ],\n [\n 102.712045,\n 42.152757\n ],\n [\n 103.021862,\n 42.02799\n ],\n [\n 103.418527,\n 41.882489\n ],\n [\n 103.868779,\n 41.802701\n ],\n [\n 104.080046,\n 41.804931\n ],\n [\n 104.530298,\n 41.874916\n ],\n [\n 104.524138,\n 41.662051\n ],\n [\n 104.68613,\n 41.64551\n ],\n [\n 104.923267,\n 41.654005\n ],\n [\n 105.009498,\n 41.583331\n ],\n [\n 105.230621,\n 41.750942\n ],\n [\n 105.291599,\n 41.750049\n ],\n [\n 105.74185,\n 41.949274\n ],\n [\n 106.01348,\n 42.03199\n ],\n [\n 106.619564,\n 42.243625\n ],\n [\n 106.785867,\n 42.291444\n ],\n [\n 107.051337,\n 42.319322\n ],\n [\n 107.269996,\n 42.363547\n ],\n [\n 107.303872,\n 42.4126\n ],\n [\n 107.46648,\n 42.458967\n ],\n [\n 107.57427,\n 42.413042\n ],\n [\n 107.939522,\n 42.403764\n ],\n [\n 108.022058,\n 42.433359\n ],\n [\n 108.238252,\n 42.460291\n ],\n [\n 108.298614,\n 42.438216\n ],\n [\n 108.532671,\n 42.443073\n ],\n [\n 108.845569,\n 42.395811\n ],\n [\n 109.026039,\n 42.458525\n ],\n [\n 109.291509,\n 42.435567\n ],\n [\n 109.544044,\n 42.472208\n ],\n [\n 109.683862,\n 42.559089\n ],\n [\n 109.906216,\n 42.635727\n ],\n [\n 110.108244,\n 42.642769\n ],\n [\n 110.139657,\n 42.67489\n ],\n [\n 110.437156,\n 42.781254\n ],\n [\n 110.469801,\n 42.839194\n ],\n [\n 110.631177,\n 42.936078\n ],\n [\n 110.736502,\n 43.089639\n ],\n [\n 110.769763,\n 43.099251\n ],\n [\n 111.02045,\n 43.329926\n ],\n [\n 111.183674,\n 43.396045\n ],\n [\n 111.354289,\n 43.436029\n ],\n [\n 111.456535,\n 43.49422\n ],\n [\n 111.564325,\n 43.490314\n ],\n [\n 111.79407,\n 43.67192\n ],\n [\n 111.951135,\n 43.693122\n ],\n [\n 111.959758,\n 43.8232\n ],\n [\n 111.870447,\n 43.940071\n ],\n [\n 111.773128,\n 44.010686\n ],\n [\n 111.662875,\n 44.061012\n ],\n [\n 111.559397,\n 44.171408\n ],\n [\n 111.507042,\n 44.294019\n ],\n [\n 111.415883,\n 44.357368\n ],\n [\n 111.478709,\n 44.488982\n ],\n [\n 111.569868,\n 44.576418\n ],\n [\n 111.560629,\n 44.647124\n ],\n [\n 111.624687,\n 44.778509\n ],\n [\n 111.764505,\n 44.969314\n ],\n [\n 111.889541,\n 45.045459\n ],\n [\n 112.002874,\n 45.090675\n ],\n [\n 112.113743,\n 45.072931\n ],\n [\n 112.438959,\n 45.071663\n ],\n [\n 112.540589,\n 45.001054\n ],\n [\n 112.599719,\n 44.93078\n ],\n [\n 112.850406,\n 44.840484\n ],\n [\n 112.937869,\n 44.84006\n ],\n [\n 113.11526,\n 44.799741\n ],\n [\n 113.503918,\n 44.77766\n ],\n [\n 113.631417,\n 44.745372\n ],\n [\n 113.907358,\n 44.915105\n ],\n [\n 114.065038,\n 44.931204\n ],\n [\n 114.19069,\n 45.036581\n ],\n [\n 114.347139,\n 45.119392\n ],\n [\n 114.519602,\n 45.283812\n ],\n [\n 114.551014,\n 45.387699\n ],\n [\n 114.745035,\n 45.438521\n ],\n [\n 114.974165,\n 45.377193\n ],\n [\n 115.153403,\n 45.395682\n ],\n [\n 115.36467,\n 45.392321\n ],\n [\n 115.699741,\n 45.459509\n ],\n [\n 115.936878,\n 45.632987\n ],\n [\n 116.035428,\n 45.68526\n ],\n [\n 116.17463,\n 45.688604\n ],\n [\n 116.286731,\n 45.775056\n ],\n [\n 116.288579,\n 45.838869\n ],\n [\n 116.243,\n 45.875956\n ],\n [\n 116.271949,\n 45.966692\n ],\n [\n 116.414231,\n 46.13404\n ],\n [\n 116.439484,\n 46.137771\n ],\n [\n 116.585462,\n 46.292199\n ],\n [\n 116.745606,\n 46.327743\n ],\n [\n 116.826294,\n 46.380602\n ],\n [\n 117.097308,\n 46.35707\n ],\n [\n 117.372017,\n 46.360373\n ],\n [\n 117.392343,\n 46.463093\n ],\n [\n 117.447777,\n 46.528172\n ],\n [\n 117.42006,\n 46.582071\n ],\n [\n 117.49582,\n 46.600574\n ],\n [\n 117.622704,\n 46.596052\n ],\n [\n 117.704008,\n 46.516645\n ],\n [\n 117.870927,\n 46.549985\n ],\n [\n 117.914659,\n 46.607973\n ],\n [\n 118.04647,\n 46.631398\n ],\n [\n 118.124078,\n 46.678216\n ],\n [\n 118.192448,\n 46.682731\n ],\n [\n 118.316252,\n 46.739347\n ],\n [\n 118.446831,\n 46.704482\n ],\n [\n 118.586033,\n 46.692992\n ],\n [\n 118.639004,\n 46.721302\n ],\n [\n 118.788061,\n 46.687246\n ],\n [\n 118.845343,\n 46.771731\n ],\n [\n 118.914329,\n 46.775009\n ],\n [\n 118.912481,\n 46.733196\n ],\n [\n 119.011647,\n 46.745498\n ],\n [\n 119.123132,\n 46.642901\n ],\n [\n 119.26295,\n 46.649062\n ],\n [\n 119.374435,\n 46.60304\n ],\n [\n 119.431718,\n 46.638793\n ],\n [\n 119.656535,\n 46.625645\n ],\n [\n 119.677477,\n 46.584539\n ],\n [\n 119.783419,\n 46.626056\n ],\n [\n 119.8136,\n 46.668363\n ],\n [\n 119.911534,\n 46.669595\n ],\n [\n 119.93494,\n 46.712688\n ],\n [\n 119.928781,\n 46.903933\n ],\n [\n 119.859795,\n 46.917013\n ],\n [\n 119.795122,\n 47.01297\n ],\n [\n 119.806825,\n 47.054973\n ],\n [\n 119.716282,\n 47.195829\n ],\n [\n 119.56784,\n 47.24825\n ],\n [\n 119.559833,\n 47.303053\n ],\n [\n 119.487152,\n 47.329419\n ],\n [\n 119.353493,\n 47.43192\n ],\n [\n 119.365812,\n 47.477232\n ],\n [\n 119.152081,\n 47.540685\n ],\n [\n 119.134219,\n 47.664539\n ],\n [\n 118.773278,\n 47.771213\n ],\n [\n 118.568171,\n 47.992315\n ],\n [\n 118.424041,\n 48.014734\n ],\n [\n 118.299621,\n 48.005127\n ],\n [\n 118.231252,\n 48.043943\n ],\n [\n 117.96147,\n 48.011132\n ],\n [\n 117.813645,\n 48.016335\n ],\n [\n 117.493357,\n 47.758343\n ],\n [\n 117.384335,\n 47.641162\n ],\n [\n 117.094844,\n 47.823865\n ],\n [\n 116.879265,\n 47.893718\n ],\n [\n 116.669846,\n 47.890509\n ],\n [\n 116.453035,\n 47.837522\n ],\n [\n 116.26579,\n 47.876866\n ],\n [\n 116.111189,\n 47.811812\n ],\n [\n 115.939342,\n 47.683071\n ],\n [\n 115.580249,\n 47.921793\n ],\n [\n 115.529126,\n 48.155029\n ],\n [\n 115.822929,\n 48.2595\n ],\n [\n 115.799523,\n 48.514993\n ],\n [\n 115.83032,\n 48.560156\n ],\n [\n 116.077928,\n 48.822412\n ],\n [\n 116.048363,\n 48.873598\n ],\n [\n 116.717889,\n 49.847388\n ],\n [\n 116.736367,\n 49.847388\n ],\n [\n 117.068974,\n 49.695524\n ],\n [\n 117.278394,\n 49.636272\n ],\n [\n 117.485349,\n 49.633172\n ],\n [\n 117.809333,\n 49.521049\n ],\n [\n 117.867848,\n 49.592853\n ],\n [\n 117.980565,\n 49.621158\n ],\n [\n 118.084658,\n 49.618057\n ],\n [\n 118.122231,\n 49.669586\n ],\n [\n 118.205998,\n 49.684686\n ],\n [\n 118.225708,\n 49.734211\n ],\n [\n 118.388316,\n 49.786004\n ],\n [\n 118.395092,\n 49.819601\n ],\n [\n 118.49549,\n 49.843144\n ],\n [\n 118.485635,\n 49.86706\n ],\n [\n 118.574946,\n 49.931423\n ],\n [\n 118.741866,\n 49.946441\n ],\n [\n 118.929111,\n 49.989545\n ],\n [\n 119.092335,\n 49.986082\n ],\n [\n 119.163168,\n 50.027613\n ],\n [\n 119.190269,\n 50.087538\n ],\n [\n 119.243856,\n 50.078324\n ],\n [\n 119.360269,\n 50.196441\n ],\n [\n 119.319001,\n 50.220948\n ],\n [\n 119.358421,\n 50.358949\n ],\n [\n 119.259871,\n 50.345205\n ],\n [\n 119.125596,\n 50.389095\n ],\n [\n 119.250631,\n 50.448568\n ],\n [\n 119.28266,\n 50.604899\n ],\n [\n 119.361501,\n 50.632611\n ],\n [\n 119.383674,\n 50.682301\n ],\n [\n 119.450196,\n 50.695569\n ],\n [\n 119.506862,\n 50.764118\n ],\n [\n 119.491464,\n 50.879026\n ],\n [\n 119.633746,\n 51.010218\n ],\n [\n 119.726137,\n 51.050105\n ],\n [\n 119.788346,\n 51.16656\n ],\n [\n 119.760629,\n 51.21231\n ],\n [\n 119.944795,\n 51.366848\n ],\n [\n 120.002693,\n 51.459396\n ],\n [\n 119.985447,\n 51.505227\n ],\n [\n 120.051968,\n 51.553245\n ],\n [\n 120.035338,\n 51.586343\n ],\n [\n 120.087077,\n 51.678076\n ],\n [\n 120.172693,\n 51.679931\n ],\n [\n 120.363634,\n 51.789982\n ],\n [\n 120.398742,\n 51.832153\n ],\n [\n 120.480046,\n 51.855072\n ],\n [\n 120.481278,\n 51.885735\n ],\n [\n 120.656821,\n 51.92634\n ],\n [\n 120.719031,\n 52.014438\n ],\n [\n 120.68577,\n 52.036896\n ],\n [\n 120.747364,\n 52.076996\n ],\n [\n 120.786784,\n 52.157824\n ],\n [\n 120.7449,\n 52.206984\n ],\n [\n 120.755371,\n 52.258287\n ],\n [\n 120.627256,\n 52.324161\n ],\n [\n 120.62356,\n 52.361081\n ],\n [\n 120.688234,\n 52.427531\n ],\n [\n 120.689466,\n 52.516098\n ],\n [\n 120.727654,\n 52.529568\n ],\n [\n 120.467728,\n 52.644076\n ],\n [\n 120.40367,\n 52.617929\n ],\n [\n 120.287873,\n 52.623378\n ],\n [\n 120.196714,\n 52.579043\n ],\n [\n 120.049505,\n 52.598672\n ],\n [\n 120.035338,\n 52.646255\n ],\n [\n 120.071063,\n 52.706113\n ],\n [\n 120.038418,\n 52.780006\n ],\n [\n 120.222584,\n 52.842934\n ],\n [\n 120.350699,\n 52.906131\n ],\n [\n 120.455409,\n 53.011376\n ],\n [\n 120.549647,\n 53.076125\n ],\n [\n 120.643886,\n 53.106667\n ],\n [\n 120.736277,\n 53.204615\n ],\n [\n 120.840371,\n 53.24724\n ],\n [\n 120.882871,\n 53.294472\n ],\n [\n 121.129246,\n 53.277303\n ],\n [\n 121.285695,\n 53.291253\n ],\n [\n 121.347289,\n 53.327003\n ],\n [\n 121.499426,\n 53.337008\n ],\n [\n 121.612143,\n 53.260484\n ],\n [\n 121.679896,\n 53.240437\n ],\n [\n 121.665114,\n 53.170556\n ],\n [\n 121.754425,\n 53.146519\n ],\n [\n 121.817867,\n 53.061744\n ],\n [\n 121.785838,\n 53.018575\n ],\n [\n 121.715621,\n 52.998054\n ],\n [\n 121.66265,\n 52.912626\n ],\n [\n 121.610295,\n 52.892416\n ],\n [\n 121.591201,\n 52.824499\n ],\n [\n 121.476636,\n 52.772043\n ],\n [\n 121.373158,\n 52.683268\n ],\n [\n 121.182217,\n 52.599399\n ],\n [\n 121.325731,\n 52.572498\n ],\n [\n 121.416274,\n 52.499346\n ],\n [\n 121.519136,\n 52.456709\n ],\n [\n 121.63986,\n 52.444311\n ],\n [\n 121.714389,\n 52.317944\n ],\n [\n 121.841272,\n 52.282818\n ],\n [\n 121.94783,\n 52.298555\n ],\n [\n 122.091344,\n 52.427167\n ],\n [\n 122.168952,\n 52.513549\n ],\n [\n 122.207756,\n 52.469103\n ],\n [\n 122.310618,\n 52.475299\n ],\n [\n 122.342031,\n 52.41403\n ],\n [\n 122.484313,\n 52.341711\n ],\n [\n 122.478153,\n 52.29636\n ],\n [\n 122.585943,\n 52.266344\n ],\n [\n 122.76087,\n 52.26671\n ],\n [\n 122.769493,\n 52.179843\n ],\n [\n 122.629059,\n 52.136529\n ],\n [\n 122.683877,\n 51.974649\n ],\n [\n 122.726377,\n 51.978704\n ],\n [\n 122.706051,\n 51.890166\n ],\n [\n 122.771957,\n 51.779619\n ],\n [\n 122.749167,\n 51.746661\n ],\n [\n 122.85634,\n 51.606786\n ],\n [\n 122.854492,\n 51.477659\n ],\n [\n 122.903768,\n 51.415384\n ],\n [\n 122.965977,\n 51.387015\n ],\n [\n 122.978296,\n 51.331346\n ],\n [\n 123.058984,\n 51.321999\n ],\n [\n 123.294273,\n 51.25427\n ],\n [\n 123.465504,\n 51.287212\n ],\n [\n 123.736517,\n 50.974064\n ],\n [\n 123.825829,\n 50.813669\n ],\n [\n 124.076516,\n 50.564249\n ],\n [\n 123.983509,\n 50.510249\n ],\n [\n 124.005067,\n 50.434469\n ],\n [\n 123.920067,\n 50.37307\n ],\n [\n 123.800575,\n 50.455806\n ],\n [\n 123.777785,\n 50.344441\n ],\n [\n 123.870792,\n 50.270307\n ],\n [\n 123.878799,\n 50.208696\n ],\n [\n 123.953944,\n 50.186865\n ],\n [\n 124.007531,\n 50.219417\n ],\n [\n 124.061733,\n 50.199122\n ],\n [\n 124.103001,\n 50.238555\n ],\n [\n 124.189233,\n 50.216737\n ],\n [\n 124.278544,\n 50.231284\n ],\n [\n 124.32474,\n 50.178436\n ],\n [\n 124.368471,\n 50.258068\n ],\n [\n 124.36416,\n 50.360857\n ],\n [\n 124.43992,\n 50.388713\n ],\n [\n 124.499666,\n 50.397868\n ],\n [\n 124.504594,\n 50.342532\n ],\n [\n 124.578507,\n 50.294777\n ],\n [\n 124.619774,\n 50.229753\n ],\n [\n 124.575427,\n 50.179585\n ],\n [\n 124.508289,\n 50.162723\n ],\n [\n 124.604992,\n 50.070644\n ],\n [\n 124.680752,\n 50.031841\n ],\n [\n 124.650571,\n 49.99493\n ],\n [\n 124.66597,\n 49.868217\n ],\n [\n 124.730644,\n 49.817671\n ],\n [\n 124.74173,\n 49.761274\n ],\n [\n 124.824266,\n 49.849703\n ],\n [\n 124.972708,\n 49.834654\n ],\n [\n 124.935135,\n 49.866675\n ],\n [\n 124.977635,\n 49.900601\n ],\n [\n 125.095896,\n 49.795661\n ],\n [\n 125.177815,\n 49.829637\n ],\n [\n 125.222779,\n 49.799137\n ],\n [\n 125.219699,\n 49.669199\n ],\n [\n 125.132236,\n 49.671909\n ],\n [\n 125.234482,\n 49.592077\n ],\n [\n 125.228323,\n 49.486857\n ],\n [\n 125.264047,\n 49.461585\n ],\n [\n 125.261583,\n 49.318656\n ],\n [\n 125.219699,\n 49.188999\n ],\n [\n 125.117453,\n 49.126\n ],\n [\n 124.906802,\n 49.183915\n ],\n [\n 124.807636,\n 49.108769\n ],\n [\n 124.808252,\n 49.020563\n ],\n [\n 124.709086,\n 48.920406\n ],\n [\n 124.697383,\n 48.841711\n ],\n [\n 124.653651,\n 48.777089\n ],\n [\n 124.579122,\n 48.596574\n ],\n [\n 124.520608,\n 48.556196\n ],\n [\n 124.555717,\n 48.467805\n ],\n [\n 124.507674,\n 48.445584\n ],\n [\n 124.51876,\n 48.378068\n ],\n [\n 124.579738,\n 48.304095\n ],\n [\n 124.578507,\n 48.251931\n ],\n [\n 124.463942,\n 48.097518\n ],\n [\n 124.467637,\n 48.178972\n ],\n [\n 124.418978,\n 48.181765\n ],\n [\n 124.404812,\n 48.264679\n ],\n [\n 124.317964,\n 48.347856\n ],\n [\n 124.314269,\n 48.503894\n ],\n [\n 124.25945,\n 48.536391\n ],\n [\n 124.25945,\n 48.536391\n ],\n [\n 124.07898,\n 48.436058\n ],\n [\n 123.873256,\n 48.281006\n ],\n [\n 123.746373,\n 48.19772\n ],\n [\n 123.537569,\n 48.021938\n ],\n [\n 123.300432,\n 47.953861\n ],\n [\n 123.228983,\n 47.840735\n ],\n [\n 123.166158,\n 47.783677\n ],\n [\n 122.855108,\n 47.677432\n ],\n [\n 122.763333,\n 47.613338\n ],\n [\n 122.59395,\n 47.547551\n ],\n [\n 122.543443,\n 47.495427\n ],\n [\n 122.507103,\n 47.401555\n ],\n [\n 122.418407,\n 47.350503\n ],\n [\n 122.556378,\n 47.17265\n ],\n [\n 122.679566,\n 47.094092\n ],\n [\n 122.845869,\n 47.046819\n ],\n [\n 122.778116,\n 47.00277\n ],\n [\n 122.796594,\n 46.938261\n ],\n [\n 122.895144,\n 46.960317\n ],\n [\n 122.906847,\n 46.807372\n ],\n [\n 123.026339,\n 46.718841\n ],\n [\n 123.163694,\n 46.740167\n ],\n [\n 123.221592,\n 46.850355\n ],\n [\n 123.309056,\n 46.86222\n ],\n [\n 123.374345,\n 46.837668\n ],\n [\n 123.404526,\n 46.935401\n ],\n [\n 123.52833,\n 46.944797\n ],\n [\n 123.483366,\n 46.845854\n ],\n [\n 123.562823,\n 46.825797\n ],\n [\n 123.576989,\n 46.891259\n ],\n [\n 123.625648,\n 46.84749\n ],\n [\n 123.631808,\n 46.728685\n ],\n [\n 123.603475,\n 46.689299\n ],\n [\n 123.366338,\n 46.677805\n ],\n [\n 123.276411,\n 46.660972\n ],\n [\n 123.228368,\n 46.58824\n ],\n [\n 123.18094,\n 46.614138\n ],\n [\n 123.04605,\n 46.617426\n ],\n [\n 123.002318,\n 46.574257\n ],\n [\n 123.011557,\n 46.43506\n ],\n [\n 123.178476,\n 46.247944\n ],\n [\n 123.102716,\n 46.172172\n ],\n [\n 123.112571,\n 46.129894\n ],\n [\n 123.04605,\n 46.10003\n ],\n [\n 122.792898,\n 46.073056\n ],\n [\n 122.828623,\n 45.912185\n ],\n [\n 122.752246,\n 45.834701\n ],\n [\n 122.792283,\n 45.766291\n ],\n [\n 122.741775,\n 45.70532\n ],\n [\n 122.671558,\n 45.700723\n ],\n [\n 122.640761,\n 45.7713\n ],\n [\n 122.555146,\n 45.821359\n ],\n [\n 122.504639,\n 45.787157\n ],\n [\n 122.496016,\n 45.858041\n ],\n [\n 122.446125,\n 45.916764\n ],\n [\n 122.362357,\n 45.917597\n ],\n [\n 122.372828,\n 45.855957\n ],\n [\n 122.258879,\n 45.794666\n ],\n [\n 122.200981,\n 45.85679\n ],\n [\n 122.091344,\n 45.881787\n ],\n [\n 122.040221,\n 45.95879\n ],\n [\n 121.84312,\n 46.02447\n ],\n [\n 121.762432,\n 45.999538\n ],\n [\n 121.809243,\n 45.96087\n ],\n [\n 121.817251,\n 45.875539\n ],\n [\n 121.754425,\n 45.795084\n ],\n [\n 121.644172,\n 45.752516\n ],\n [\n 121.713773,\n 45.701977\n ],\n [\n 121.811091,\n 45.686932\n ],\n [\n 121.867142,\n 45.719942\n ],\n [\n 121.949062,\n 45.711169\n ],\n [\n 122.003264,\n 45.623363\n ],\n [\n 121.966308,\n 45.596157\n ],\n [\n 122.02359,\n 45.490137\n ],\n [\n 122.163408,\n 45.443979\n ],\n [\n 122.147394,\n 45.295598\n ],\n [\n 122.239169,\n 45.276234\n ],\n [\n 122.22993,\n 45.20672\n ],\n [\n 122.143082,\n 45.183108\n ],\n [\n 122.109822,\n 45.142186\n ],\n [\n 122.119677,\n 45.068705\n ],\n [\n 122.074713,\n 45.006553\n ],\n [\n 122.079025,\n 44.914258\n ],\n [\n 122.04946,\n 44.912987\n ],\n [\n 122.114749,\n 44.776386\n ],\n [\n 122.161561,\n 44.728371\n ],\n [\n 122.103046,\n 44.673935\n ],\n [\n 122.13138,\n 44.577697\n ],\n [\n 122.196053,\n 44.559794\n ],\n [\n 122.228082,\n 44.480017\n ],\n [\n 122.28598,\n 44.477883\n ],\n [\n 122.291524,\n 44.310291\n ],\n [\n 122.271198,\n 44.255463\n ],\n [\n 122.319241,\n 44.232745\n ],\n [\n 122.483697,\n 44.237032\n ],\n [\n 122.676486,\n 44.28631\n ],\n [\n 122.76087,\n 44.369772\n ],\n [\n 122.85634,\n 44.398422\n ],\n [\n 123.025108,\n 44.492823\n ],\n [\n 123.125506,\n 44.509466\n ],\n [\n 123.128585,\n 44.366778\n ],\n [\n 123.196955,\n 44.34496\n ],\n [\n 123.323838,\n 44.179991\n ],\n [\n 123.386664,\n 44.161966\n ],\n [\n 123.32815,\n 44.083795\n ],\n [\n 123.332461,\n 44.028326\n ],\n [\n 123.400831,\n 43.979264\n ],\n [\n 123.52525,\n 43.695718\n ],\n [\n 123.5117,\n 43.59267\n ],\n [\n 123.439019,\n 43.577501\n ],\n [\n 123.439019,\n 43.577501\n ],\n [\n 123.304744,\n 43.551055\n ],\n [\n 123.315831,\n 43.49205\n ],\n [\n 123.382968,\n 43.46904\n ],\n [\n 123.419925,\n 43.409955\n ],\n [\n 123.486446,\n 43.445587\n ],\n [\n 123.608402,\n 43.366474\n ],\n [\n 123.703873,\n 43.370824\n ]\n ]\n ],\n [\n [\n [\n 124.076516,\n 50.564249\n ],\n [\n 123.825829,\n 50.813669\n ],\n [\n 123.736517,\n 50.974064\n ],\n [\n 123.465504,\n 51.287212\n ],\n [\n 123.661989,\n 51.319008\n ],\n [\n 123.711264,\n 51.398216\n ],\n [\n 123.842459,\n 51.367595\n ],\n [\n 123.926227,\n 51.300681\n ],\n [\n 124.071588,\n 51.320878\n ],\n [\n 124.128255,\n 51.347419\n ],\n [\n 124.239124,\n 51.344429\n ],\n [\n 124.271769,\n 51.308162\n ],\n [\n 124.406659,\n 51.271867\n ],\n [\n 124.43684,\n 51.353772\n ],\n [\n 124.490427,\n 51.380294\n ],\n [\n 124.58713,\n 51.363486\n ],\n [\n 124.62655,\n 51.327608\n ],\n [\n 124.693687,\n 51.332842\n ],\n [\n 124.783614,\n 51.392243\n ],\n [\n 124.864302,\n 51.379547\n ],\n [\n 124.942527,\n 51.447465\n ],\n [\n 124.928976,\n 51.498523\n ],\n [\n 125.047236,\n 51.529801\n ],\n [\n 125.098975,\n 51.658408\n ],\n [\n 125.130388,\n 51.635389\n ],\n [\n 125.35151,\n 51.623876\n ],\n [\n 125.567089,\n 51.455668\n ],\n [\n 125.567089,\n 51.455668\n ],\n [\n 125.595422,\n 51.416877\n ],\n [\n 125.595422,\n 51.416877\n ],\n [\n 125.597886,\n 51.414638\n ],\n [\n 125.597886,\n 51.414638\n ],\n [\n 125.600966,\n 51.413518\n ],\n [\n 125.600966,\n 51.413518\n ],\n [\n 125.623756,\n 51.387762\n ],\n [\n 125.623756,\n 51.387762\n ],\n [\n 125.63977,\n 51.372451\n ],\n [\n 125.63977,\n 51.372451\n ],\n [\n 125.668103,\n 51.347419\n ],\n [\n 125.668103,\n 51.347419\n ],\n [\n 125.670567,\n 51.34555\n ],\n [\n 125.670567,\n 51.34555\n ],\n [\n 125.743248,\n 51.275984\n ],\n [\n 125.743248,\n 51.275984\n ],\n [\n 125.756798,\n 51.227675\n ],\n [\n 125.840566,\n 51.220555\n ],\n [\n 125.878138,\n 51.159431\n ],\n [\n 126.059225,\n 51.043711\n ],\n [\n 126.033971,\n 51.010971\n ],\n [\n 126.073391,\n 50.963514\n ],\n [\n 125.890457,\n 50.805729\n ],\n [\n 125.758646,\n 50.746706\n ],\n [\n 125.825784,\n 50.703906\n ],\n [\n 125.787595,\n 50.677373\n ],\n [\n 125.829479,\n 50.561589\n ],\n [\n 125.740784,\n 50.523184\n ],\n [\n 125.632379,\n 50.443996\n ],\n [\n 125.590495,\n 50.452378\n ],\n [\n 125.519662,\n 50.315795\n ],\n [\n 125.466075,\n 50.297452\n ],\n [\n 125.448829,\n 50.216354\n ],\n [\n 125.334264,\n 50.165023\n ],\n [\n 125.258504,\n 50.103659\n ],\n [\n 125.294228,\n 50.029151\n ],\n [\n 125.231402,\n 49.957606\n ],\n [\n 125.239409,\n 49.844687\n ],\n [\n 125.177815,\n 49.829637\n ],\n [\n 125.095896,\n 49.795661\n ],\n [\n 124.977635,\n 49.900601\n ],\n [\n 124.935135,\n 49.866675\n ],\n [\n 124.972708,\n 49.834654\n ],\n [\n 124.824266,\n 49.849703\n ],\n [\n 124.74173,\n 49.761274\n ],\n [\n 124.730644,\n 49.817671\n ],\n [\n 124.66597,\n 49.868217\n ],\n [\n 124.650571,\n 49.99493\n ],\n [\n 124.680752,\n 50.031841\n ],\n [\n 124.604992,\n 50.070644\n ],\n [\n 124.508289,\n 50.162723\n ],\n [\n 124.575427,\n 50.179585\n ],\n [\n 124.619774,\n 50.229753\n ],\n [\n 124.578507,\n 50.294777\n ],\n [\n 124.504594,\n 50.342532\n ],\n [\n 124.499666,\n 50.397868\n ],\n [\n 124.43992,\n 50.388713\n ],\n [\n 124.43992,\n 50.539919\n ],\n [\n 124.322892,\n 50.532693\n ],\n [\n 124.289015,\n 50.553226\n ],\n [\n 124.076516,\n 50.564249\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 210000,\n \"name\": \"辽宁省\",\n \"center\": [\n 123.429096,\n 41.796767\n ],\n \"centroid\": [\n 122.606135,\n 41.300702\n ],\n \"childrenNum\": 14,\n \"level\": \"province\",\n \"subFeatureIndex\": 5,\n \"acroutes\": [\n 100000\n ],\n \"parent\": {\n \"adcode\": 100000\n }\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 119.239545,\n 41.314696\n ],\n [\n 119.326392,\n 41.329525\n ],\n [\n 119.30545,\n 41.402271\n ],\n [\n 119.376283,\n 41.422015\n ],\n [\n 119.405848,\n 41.508548\n ],\n [\n 119.361501,\n 41.56498\n ],\n [\n 119.415703,\n 41.590044\n ],\n [\n 119.307914,\n 41.657581\n ],\n [\n 119.294363,\n 41.775935\n ],\n [\n 119.334399,\n 41.869569\n ],\n [\n 119.324544,\n 41.969296\n ],\n [\n 119.384906,\n 42.089738\n ],\n [\n 119.315921,\n 42.119037\n ],\n [\n 119.237697,\n 42.201088\n ],\n [\n 119.284508,\n 42.265325\n ],\n [\n 119.415703,\n 42.309588\n ],\n [\n 119.502551,\n 42.387857\n ],\n [\n 119.572152,\n 42.359568\n ],\n [\n 119.541971,\n 42.292329\n ],\n [\n 119.744615,\n 42.211725\n ],\n [\n 119.846861,\n 42.21527\n ],\n [\n 119.837622,\n 42.135455\n ],\n [\n 119.989759,\n 41.898969\n ],\n [\n 120.051968,\n 41.775935\n ],\n [\n 120.035954,\n 41.708075\n ],\n [\n 120.096316,\n 41.696907\n ],\n [\n 120.188707,\n 41.848179\n ],\n [\n 120.373489,\n 41.994648\n ],\n [\n 120.456641,\n 42.016433\n ],\n [\n 120.466496,\n 42.105277\n ],\n [\n 120.58414,\n 42.167394\n ],\n [\n 120.624792,\n 42.154532\n ],\n [\n 120.745516,\n 42.223689\n ],\n [\n 120.79048,\n 42.218372\n ],\n [\n 120.933378,\n 42.279493\n ],\n [\n 121.068884,\n 42.252483\n ],\n [\n 121.285079,\n 42.387857\n ],\n [\n 121.304789,\n 42.435567\n ],\n [\n 121.304789,\n 42.435567\n ],\n [\n 121.388557,\n 42.475297\n ],\n [\n 121.604752,\n 42.494271\n ],\n [\n 121.66573,\n 42.437333\n ],\n [\n 121.904714,\n 42.569666\n ],\n [\n 121.940438,\n 42.688525\n ],\n [\n 122.071634,\n 42.711391\n ],\n [\n 122.20406,\n 42.683687\n ],\n [\n 122.203445,\n 42.731171\n ],\n [\n 122.338951,\n 42.670051\n ],\n [\n 122.395002,\n 42.683687\n ],\n [\n 122.457212,\n 42.774227\n ],\n [\n 122.374676,\n 42.774667\n ],\n [\n 122.35127,\n 42.830419\n ],\n [\n 122.436886,\n 42.843142\n ],\n [\n 122.563769,\n 42.826031\n ],\n [\n 122.624747,\n 42.773349\n ],\n [\n 122.732536,\n 42.786524\n ],\n [\n 122.786123,\n 42.756218\n ],\n [\n 122.786123,\n 42.756218\n ],\n [\n 122.831087,\n 42.722381\n ],\n [\n 122.887137,\n 42.770275\n ],\n [\n 123.058368,\n 42.768957\n ],\n [\n 123.227752,\n 42.831735\n ],\n [\n 123.169853,\n 42.859811\n ],\n [\n 123.18402,\n 42.926002\n ],\n [\n 123.259165,\n 42.992997\n ],\n [\n 123.474743,\n 43.04243\n ],\n [\n 123.515395,\n 43.027561\n ],\n [\n 123.515395,\n 43.027561\n ],\n [\n 123.572678,\n 43.0035\n ],\n [\n 123.666916,\n 43.179585\n ],\n [\n 123.664453,\n 43.264606\n ],\n [\n 123.703873,\n 43.370824\n ],\n [\n 123.710032,\n 43.417344\n ],\n [\n 123.791952,\n 43.491182\n ],\n [\n 123.87264,\n 43.451234\n ],\n [\n 123.84985,\n 43.415606\n ],\n [\n 123.896046,\n 43.361689\n ],\n [\n 124.032784,\n 43.280724\n ],\n [\n 124.098074,\n 43.29292\n ],\n [\n 124.114704,\n 43.247175\n ],\n [\n 124.226805,\n 43.241945\n ],\n [\n 124.226805,\n 43.241945\n ],\n [\n 124.282856,\n 43.230176\n ],\n [\n 124.284088,\n 43.166058\n ],\n [\n 124.425754,\n 43.076092\n ],\n [\n 124.333363,\n 42.997373\n ],\n [\n 124.422674,\n 42.975927\n ],\n [\n 124.431913,\n 42.930821\n ],\n [\n 124.369087,\n 42.882613\n ],\n [\n 124.435609,\n 42.88086\n ],\n [\n 124.454703,\n 42.823836\n ],\n [\n 124.514449,\n 42.873406\n ],\n [\n 124.514449,\n 42.873406\n ],\n [\n 124.539086,\n 42.867266\n ],\n [\n 124.659195,\n 42.972862\n ],\n [\n 124.686912,\n 43.051176\n ],\n [\n 124.785462,\n 43.117161\n ],\n [\n 124.896331,\n 43.129826\n ],\n [\n 124.840897,\n 43.032372\n ],\n [\n 124.869846,\n 42.988183\n ],\n [\n 124.859375,\n 42.822959\n ],\n [\n 124.897563,\n 42.787841\n ],\n [\n 124.975171,\n 42.802768\n ],\n [\n 124.996113,\n 42.745234\n ],\n [\n 124.996113,\n 42.745234\n ],\n [\n 124.968396,\n 42.72282\n ],\n [\n 125.038613,\n 42.615476\n ],\n [\n 125.097127,\n 42.62252\n ],\n [\n 125.068794,\n 42.499564\n ],\n [\n 125.186439,\n 42.428059\n ],\n [\n 125.175352,\n 42.308261\n ],\n [\n 125.29854,\n 42.290116\n ],\n [\n 125.305931,\n 42.146103\n ],\n [\n 125.353358,\n 42.178923\n ],\n [\n 125.490097,\n 42.136343\n ],\n [\n 125.369989,\n 42.003096\n ],\n [\n 125.291764,\n 41.958618\n ],\n [\n 125.299156,\n 41.872243\n ],\n [\n 125.299156,\n 41.872243\n ],\n [\n 125.297308,\n 41.861995\n ],\n [\n 125.297308,\n 41.861995\n ],\n [\n 125.29238,\n 41.83971\n ],\n [\n 125.29238,\n 41.83971\n ],\n [\n 125.29238,\n 41.83971\n ],\n [\n 125.319482,\n 41.777273\n ],\n [\n 125.319482,\n 41.777273\n ],\n [\n 125.323793,\n 41.771026\n ],\n [\n 125.323793,\n 41.771026\n ],\n [\n 125.325025,\n 41.670097\n ],\n [\n 125.450677,\n 41.674119\n ],\n [\n 125.450061,\n 41.598099\n ],\n [\n 125.534444,\n 41.478073\n ],\n [\n 125.547995,\n 41.401373\n ],\n [\n 125.637306,\n 41.34435\n ],\n [\n 125.646545,\n 41.264344\n ],\n [\n 125.758646,\n 41.232404\n ],\n [\n 125.737088,\n 41.179737\n ],\n [\n 125.791291,\n 41.167577\n ],\n [\n 125.712451,\n 41.095471\n ],\n [\n 125.726617,\n 41.055328\n ],\n [\n 125.674879,\n 40.974516\n ],\n [\n 125.589263,\n 40.931135\n ],\n [\n 125.707523,\n 40.866915\n ],\n [\n 125.544915,\n 40.72922\n ],\n [\n 125.49564,\n 40.728767\n ],\n [\n 125.422343,\n 40.635297\n ],\n [\n 125.279445,\n 40.655273\n ],\n [\n 125.018287,\n 40.53624\n ],\n [\n 124.985642,\n 40.475279\n ],\n [\n 124.897563,\n 40.47892\n ],\n [\n 124.851368,\n 40.427017\n ],\n [\n 124.74481,\n 40.375074\n ],\n [\n 124.718325,\n 40.319441\n ],\n [\n 124.62039,\n 40.290695\n ],\n [\n 124.388797,\n 40.113384\n ],\n [\n 124.38079,\n 40.108808\n ],\n [\n 124.336442,\n 40.049751\n ],\n [\n 124.372167,\n 40.021348\n ],\n [\n 124.239124,\n 39.927352\n ],\n [\n 124.173218,\n 39.841496\n ],\n [\n 124.144885,\n 39.745413\n ],\n [\n 124.103001,\n 39.823577\n ],\n [\n 124.002603,\n 39.800137\n ],\n [\n 123.828908,\n 39.831389\n ],\n [\n 123.697097,\n 39.807032\n ],\n [\n 123.665684,\n 39.831389\n ],\n [\n 123.612714,\n 39.77485\n ],\n [\n 123.536337,\n 39.788644\n ],\n [\n 123.392823,\n 39.723787\n ],\n [\n 123.383584,\n 39.766572\n ],\n [\n 123.274563,\n 39.753693\n ],\n [\n 123.253005,\n 39.689724\n ],\n [\n 123.010941,\n 39.655184\n ],\n [\n 122.972753,\n 39.594813\n ],\n [\n 122.85634,\n 39.606799\n ],\n [\n 122.808913,\n 39.559764\n ],\n [\n 122.581631,\n 39.464211\n ],\n [\n 122.489856,\n 39.403673\n ],\n [\n 122.412864,\n 39.411995\n ],\n [\n 122.274893,\n 39.322257\n ],\n [\n 122.242865,\n 39.267618\n ],\n [\n 122.117213,\n 39.213863\n ],\n [\n 122.167104,\n 39.158676\n ],\n [\n 122.048228,\n 39.101123\n ],\n [\n 121.963228,\n 39.030046\n ],\n [\n 121.864062,\n 39.037018\n ],\n [\n 121.920728,\n 38.969598\n ],\n [\n 121.863446,\n 38.942611\n ],\n [\n 121.790149,\n 39.022609\n ],\n [\n 121.671273,\n 39.010057\n ],\n [\n 121.655874,\n 38.9468\n ],\n [\n 121.719316,\n 38.92027\n ],\n [\n 121.708845,\n 38.872772\n ],\n [\n 121.565331,\n 38.875101\n ],\n [\n 121.509897,\n 38.817784\n ],\n [\n 121.359608,\n 38.822446\n ],\n [\n 121.259825,\n 38.786543\n ],\n [\n 121.198848,\n 38.721686\n ],\n [\n 121.13479,\n 38.72402\n ],\n [\n 121.128014,\n 38.958897\n ],\n [\n 121.204391,\n 38.941215\n ],\n [\n 121.341129,\n 38.980761\n ],\n [\n 121.370695,\n 39.060251\n ],\n [\n 121.508049,\n 39.034229\n ],\n [\n 121.68236,\n 39.117837\n ],\n [\n 121.604136,\n 39.166098\n ],\n [\n 121.598592,\n 39.279198\n ],\n [\n 121.668193,\n 39.276419\n ],\n [\n 121.723628,\n 39.367603\n ],\n [\n 121.621382,\n 39.32596\n ],\n [\n 121.474788,\n 39.296332\n ],\n [\n 121.432904,\n 39.357426\n ],\n [\n 121.246891,\n 39.421702\n ],\n [\n 121.304173,\n 39.481762\n ],\n [\n 121.224717,\n 39.51962\n ],\n [\n 121.297398,\n 39.605877\n ],\n [\n 121.450151,\n 39.625235\n ],\n [\n 121.501274,\n 39.706758\n ],\n [\n 121.45939,\n 39.747713\n ],\n [\n 121.530223,\n 39.851603\n ],\n [\n 121.626925,\n 39.882831\n ],\n [\n 121.699606,\n 39.937445\n ],\n [\n 121.76428,\n 39.933316\n ],\n [\n 121.82341,\n 40.036467\n ],\n [\n 121.884388,\n 40.053415\n ],\n [\n 122.01004,\n 40.149067\n ],\n [\n 121.940438,\n 40.2423\n ],\n [\n 122.02667,\n 40.245041\n ],\n [\n 122.040221,\n 40.322178\n ],\n [\n 122.198517,\n 40.382367\n ],\n [\n 122.245944,\n 40.519868\n ],\n [\n 122.133843,\n 40.614408\n ],\n [\n 122.148626,\n 40.671612\n ],\n [\n 122.06609,\n 40.648464\n ],\n [\n 121.951525,\n 40.680687\n ],\n [\n 121.934279,\n 40.798103\n ],\n [\n 121.852359,\n 40.821199\n ],\n [\n 121.816019,\n 40.894962\n ],\n [\n 121.682976,\n 40.829802\n ],\n [\n 121.526527,\n 40.851529\n ],\n [\n 121.499426,\n 40.880035\n ],\n [\n 121.335586,\n 40.900842\n ],\n [\n 121.23642,\n 40.851077\n ],\n [\n 121.126167,\n 40.869177\n ],\n [\n 121.086747,\n 40.798103\n ],\n [\n 120.991276,\n 40.744181\n ],\n [\n 121.033776,\n 40.70972\n ],\n [\n 120.8299,\n 40.671158\n ],\n [\n 120.822509,\n 40.593966\n ],\n [\n 120.72827,\n 40.539423\n ],\n [\n 120.674683,\n 40.471183\n ],\n [\n 120.616169,\n 40.457071\n ],\n [\n 120.599539,\n 40.355471\n ],\n [\n 120.537329,\n 40.325372\n ],\n [\n 120.523778,\n 40.256914\n ],\n [\n 120.465264,\n 40.178787\n ],\n [\n 120.371641,\n 40.174673\n ],\n [\n 120.273091,\n 40.127111\n ],\n [\n 119.955882,\n 40.046544\n ],\n [\n 119.913998,\n 39.988349\n ],\n [\n 119.854252,\n 39.988349\n ],\n [\n 119.845629,\n 40.000726\n ],\n [\n 119.845629,\n 40.000726\n ],\n [\n 119.848093,\n 40.020432\n ],\n [\n 119.848093,\n 40.020432\n ],\n [\n 119.817296,\n 40.049751\n ],\n [\n 119.817296,\n 40.049751\n ],\n [\n 119.780339,\n 40.047002\n ],\n [\n 119.780339,\n 40.047002\n ],\n [\n 119.779723,\n 40.049293\n ],\n [\n 119.779723,\n 40.049293\n ],\n [\n 119.736608,\n 40.10469\n ],\n [\n 119.745847,\n 40.208038\n ],\n [\n 119.625123,\n 40.224029\n ],\n [\n 119.642369,\n 40.291151\n ],\n [\n 119.586934,\n 40.37553\n ],\n [\n 119.598637,\n 40.465266\n ],\n [\n 119.571536,\n 40.540333\n ],\n [\n 119.30237,\n 40.530329\n ],\n [\n 119.162552,\n 40.599872\n ],\n [\n 119.184726,\n 40.680233\n ],\n [\n 119.054147,\n 40.664804\n ],\n [\n 118.911249,\n 40.776811\n ],\n [\n 118.849039,\n 40.800821\n ],\n [\n 118.90201,\n 40.960963\n ],\n [\n 118.977154,\n 40.959155\n ],\n [\n 118.977154,\n 40.959155\n ],\n [\n 119.013495,\n 41.007485\n ],\n [\n 118.951901,\n 41.01832\n ],\n [\n 118.96422,\n 41.079236\n ],\n [\n 119.037516,\n 41.067509\n ],\n [\n 119.126212,\n 41.138744\n ],\n [\n 119.2494,\n 41.279634\n ],\n [\n 119.239545,\n 41.314696\n ]\n ]\n ],\n [\n [\n [\n 122.969057,\n 39.513158\n ],\n [\n 122.978912,\n 39.561609\n ],\n [\n 123.036194,\n 39.533004\n ],\n [\n 122.969057,\n 39.513158\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 220000,\n \"name\": \"吉林省\",\n \"center\": [\n 125.3245,\n 43.886841\n ],\n \"centroid\": [\n 126.171246,\n 43.703944\n ],\n \"childrenNum\": 9,\n \"level\": \"province\",\n \"subFeatureIndex\": 6,\n \"acroutes\": [\n 100000\n ],\n \"parent\": {\n \"adcode\": 100000\n }\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 125.707523,\n 40.866915\n ],\n [\n 125.589263,\n 40.931135\n ],\n [\n 125.674879,\n 40.974516\n ],\n [\n 125.726617,\n 41.055328\n ],\n [\n 125.712451,\n 41.095471\n ],\n [\n 125.791291,\n 41.167577\n ],\n [\n 125.737088,\n 41.179737\n ],\n [\n 125.758646,\n 41.232404\n ],\n [\n 125.646545,\n 41.264344\n ],\n [\n 125.637306,\n 41.34435\n ],\n [\n 125.547995,\n 41.401373\n ],\n [\n 125.534444,\n 41.478073\n ],\n [\n 125.450061,\n 41.598099\n ],\n [\n 125.450677,\n 41.674119\n ],\n [\n 125.325025,\n 41.670097\n ],\n [\n 125.323793,\n 41.771026\n ],\n [\n 125.323793,\n 41.771026\n ],\n [\n 125.319482,\n 41.777273\n ],\n [\n 125.319482,\n 41.777273\n ],\n [\n 125.29238,\n 41.83971\n ],\n [\n 125.29238,\n 41.83971\n ],\n [\n 125.29238,\n 41.83971\n ],\n [\n 125.297308,\n 41.861995\n ],\n [\n 125.297308,\n 41.861995\n ],\n [\n 125.299156,\n 41.872243\n ],\n [\n 125.299156,\n 41.872243\n ],\n [\n 125.291764,\n 41.958618\n ],\n [\n 125.369989,\n 42.003096\n ],\n [\n 125.490097,\n 42.136343\n ],\n [\n 125.353358,\n 42.178923\n ],\n [\n 125.305931,\n 42.146103\n ],\n [\n 125.29854,\n 42.290116\n ],\n [\n 125.175352,\n 42.308261\n ],\n [\n 125.186439,\n 42.428059\n ],\n [\n 125.068794,\n 42.499564\n ],\n [\n 125.097127,\n 42.62252\n ],\n [\n 125.038613,\n 42.615476\n ],\n [\n 124.968396,\n 42.72282\n ],\n [\n 124.996113,\n 42.745234\n ],\n [\n 124.996113,\n 42.745234\n ],\n [\n 124.975171,\n 42.802768\n ],\n [\n 124.897563,\n 42.787841\n ],\n [\n 124.859375,\n 42.822959\n ],\n [\n 124.869846,\n 42.988183\n ],\n [\n 124.840897,\n 43.032372\n ],\n [\n 124.896331,\n 43.129826\n ],\n [\n 124.785462,\n 43.117161\n ],\n [\n 124.686912,\n 43.051176\n ],\n [\n 124.659195,\n 42.972862\n ],\n [\n 124.539086,\n 42.867266\n ],\n [\n 124.514449,\n 42.873406\n ],\n [\n 124.514449,\n 42.873406\n ],\n [\n 124.454703,\n 42.823836\n ],\n [\n 124.435609,\n 42.88086\n ],\n [\n 124.369087,\n 42.882613\n ],\n [\n 124.431913,\n 42.930821\n ],\n [\n 124.422674,\n 42.975927\n ],\n [\n 124.333363,\n 42.997373\n ],\n [\n 124.425754,\n 43.076092\n ],\n [\n 124.284088,\n 43.166058\n ],\n [\n 124.282856,\n 43.230176\n ],\n [\n 124.226805,\n 43.241945\n ],\n [\n 124.226805,\n 43.241945\n ],\n [\n 124.114704,\n 43.247175\n ],\n [\n 124.098074,\n 43.29292\n ],\n [\n 124.032784,\n 43.280724\n ],\n [\n 123.896046,\n 43.361689\n ],\n [\n 123.84985,\n 43.415606\n ],\n [\n 123.87264,\n 43.451234\n ],\n [\n 123.791952,\n 43.491182\n ],\n [\n 123.710032,\n 43.417344\n ],\n [\n 123.703873,\n 43.370824\n ],\n [\n 123.608402,\n 43.366474\n ],\n [\n 123.486446,\n 43.445587\n ],\n [\n 123.419925,\n 43.409955\n ],\n [\n 123.382968,\n 43.46904\n ],\n [\n 123.315831,\n 43.49205\n ],\n [\n 123.304744,\n 43.551055\n ],\n [\n 123.439019,\n 43.577501\n ],\n [\n 123.439019,\n 43.577501\n ],\n [\n 123.5117,\n 43.59267\n ],\n [\n 123.52525,\n 43.695718\n ],\n [\n 123.400831,\n 43.979264\n ],\n [\n 123.332461,\n 44.028326\n ],\n [\n 123.32815,\n 44.083795\n ],\n [\n 123.386664,\n 44.161966\n ],\n [\n 123.323838,\n 44.179991\n ],\n [\n 123.196955,\n 44.34496\n ],\n [\n 123.128585,\n 44.366778\n ],\n [\n 123.125506,\n 44.509466\n ],\n [\n 123.025108,\n 44.492823\n ],\n [\n 122.85634,\n 44.398422\n ],\n [\n 122.76087,\n 44.369772\n ],\n [\n 122.676486,\n 44.28631\n ],\n [\n 122.483697,\n 44.237032\n ],\n [\n 122.319241,\n 44.232745\n ],\n [\n 122.271198,\n 44.255463\n ],\n [\n 122.291524,\n 44.310291\n ],\n [\n 122.28598,\n 44.477883\n ],\n [\n 122.228082,\n 44.480017\n ],\n [\n 122.196053,\n 44.559794\n ],\n [\n 122.13138,\n 44.577697\n ],\n [\n 122.103046,\n 44.673935\n ],\n [\n 122.161561,\n 44.728371\n ],\n [\n 122.114749,\n 44.776386\n ],\n [\n 122.04946,\n 44.912987\n ],\n [\n 122.079025,\n 44.914258\n ],\n [\n 122.074713,\n 45.006553\n ],\n [\n 122.119677,\n 45.068705\n ],\n [\n 122.109822,\n 45.142186\n ],\n [\n 122.143082,\n 45.183108\n ],\n [\n 122.22993,\n 45.20672\n ],\n [\n 122.239169,\n 45.276234\n ],\n [\n 122.147394,\n 45.295598\n ],\n [\n 122.163408,\n 45.443979\n ],\n [\n 122.02359,\n 45.490137\n ],\n [\n 121.966308,\n 45.596157\n ],\n [\n 122.003264,\n 45.623363\n ],\n [\n 121.949062,\n 45.711169\n ],\n [\n 121.867142,\n 45.719942\n ],\n [\n 121.811091,\n 45.686932\n ],\n [\n 121.713773,\n 45.701977\n ],\n [\n 121.644172,\n 45.752516\n ],\n [\n 121.754425,\n 45.795084\n ],\n [\n 121.817251,\n 45.875539\n ],\n [\n 121.809243,\n 45.96087\n ],\n [\n 121.762432,\n 45.999538\n ],\n [\n 121.84312,\n 46.02447\n ],\n [\n 122.040221,\n 45.95879\n ],\n [\n 122.091344,\n 45.881787\n ],\n [\n 122.200981,\n 45.85679\n ],\n [\n 122.258879,\n 45.794666\n ],\n [\n 122.372828,\n 45.855957\n ],\n [\n 122.362357,\n 45.917597\n ],\n [\n 122.446125,\n 45.916764\n ],\n [\n 122.496016,\n 45.858041\n ],\n [\n 122.504639,\n 45.787157\n ],\n [\n 122.555146,\n 45.821359\n ],\n [\n 122.640761,\n 45.7713\n ],\n [\n 122.671558,\n 45.700723\n ],\n [\n 122.741775,\n 45.70532\n ],\n [\n 122.792283,\n 45.766291\n ],\n [\n 122.752246,\n 45.834701\n ],\n [\n 122.828623,\n 45.912185\n ],\n [\n 122.792898,\n 46.073056\n ],\n [\n 123.04605,\n 46.10003\n ],\n [\n 123.112571,\n 46.129894\n ],\n [\n 123.102716,\n 46.172172\n ],\n [\n 123.178476,\n 46.247944\n ],\n [\n 123.248078,\n 46.273178\n ],\n [\n 123.319527,\n 46.253736\n ],\n [\n 123.319527,\n 46.253736\n ],\n [\n 123.373113,\n 46.223112\n ],\n [\n 123.498765,\n 46.259528\n ],\n [\n 123.565902,\n 46.22601\n ],\n [\n 123.610866,\n 46.252909\n ],\n [\n 123.779633,\n 46.264078\n ],\n [\n 123.896046,\n 46.303774\n ],\n [\n 123.982893,\n 46.22601\n ],\n [\n 123.99398,\n 46.101275\n ],\n [\n 124.040176,\n 46.019484\n ],\n [\n 123.970574,\n 45.971267\n ],\n [\n 123.996444,\n 45.907189\n ],\n [\n 124.061118,\n 45.886369\n ],\n [\n 124.064813,\n 45.797586\n ],\n [\n 124.009379,\n 45.78215\n ],\n [\n 124.13811,\n 45.68735\n ],\n [\n 124.129487,\n 45.637589\n ],\n [\n 124.273001,\n 45.584014\n ],\n [\n 124.287783,\n 45.539191\n ],\n [\n 124.354305,\n 45.546734\n ],\n [\n 124.398652,\n 45.44062\n ],\n [\n 124.480572,\n 45.456151\n ],\n [\n 124.544014,\n 45.412066\n ],\n [\n 124.625318,\n 45.437262\n ],\n [\n 124.886476,\n 45.442719\n ],\n [\n 124.923433,\n 45.541286\n ],\n [\n 124.961005,\n 45.49517\n ],\n [\n 125.025678,\n 45.493492\n ],\n [\n 125.06941,\n 45.384757\n ],\n [\n 125.248649,\n 45.417526\n ],\n [\n 125.347815,\n 45.395262\n ],\n [\n 125.398322,\n 45.416686\n ],\n [\n 125.424807,\n 45.485523\n ],\n [\n 125.497488,\n 45.469161\n ],\n [\n 125.628067,\n 45.522006\n ],\n [\n 125.687813,\n 45.51404\n ],\n [\n 125.716146,\n 45.421725\n ],\n [\n 125.697052,\n 45.349447\n ],\n [\n 125.760494,\n 45.291389\n ],\n [\n 125.915095,\n 45.196602\n ],\n [\n 126.166398,\n 45.133323\n ],\n [\n 126.321615,\n 45.178891\n ],\n [\n 126.428172,\n 45.2358\n ],\n [\n 126.567375,\n 45.252651\n ],\n [\n 126.831613,\n 45.146406\n ],\n [\n 126.96404,\n 45.132056\n ],\n [\n 126.968351,\n 45.074621\n ],\n [\n 127.085995,\n 44.944757\n ],\n [\n 127.021938,\n 44.899002\n ],\n [\n 126.984366,\n 44.823936\n ],\n [\n 127.037336,\n 44.72157\n ],\n [\n 127.049039,\n 44.567041\n ],\n [\n 127.094003,\n 44.615189\n ],\n [\n 127.182082,\n 44.644144\n ],\n [\n 127.392733,\n 44.632223\n ],\n [\n 127.557189,\n 44.575566\n ],\n [\n 127.536247,\n 44.522266\n ],\n [\n 127.463566,\n 44.484713\n ],\n [\n 127.50853,\n 44.437312\n ],\n [\n 127.483892,\n 44.401842\n ],\n [\n 127.483892,\n 44.401842\n ],\n [\n 127.623095,\n 44.277743\n ],\n [\n 127.591066,\n 44.227601\n ],\n [\n 127.681609,\n 44.167116\n ],\n [\n 127.724109,\n 44.196723\n ],\n [\n 127.729036,\n 44.098836\n ],\n [\n 127.862079,\n 44.063162\n ],\n [\n 128.059796,\n 44.110007\n ],\n [\n 128.089977,\n 44.132342\n ],\n [\n 128.101679,\n 44.290593\n ],\n [\n 128.049941,\n 44.349239\n ],\n [\n 128.190375,\n 44.367206\n ],\n [\n 128.211317,\n 44.431757\n ],\n [\n 128.373309,\n 44.51416\n ],\n [\n 128.46262,\n 44.433894\n ],\n [\n 128.481714,\n 44.375332\n ],\n [\n 128.450301,\n 44.203157\n ],\n [\n 128.574721,\n 44.047682\n ],\n [\n 128.584576,\n 43.990887\n ],\n [\n 128.644938,\n 43.936193\n ],\n [\n 128.636315,\n 43.891366\n ],\n [\n 128.723778,\n 43.894816\n ],\n [\n 128.760734,\n 43.857724\n ],\n [\n 128.719467,\n 43.816724\n ],\n [\n 128.877763,\n 43.540213\n ],\n [\n 128.949212,\n 43.55409\n ],\n [\n 129.014501,\n 43.523295\n ],\n [\n 129.230696,\n 43.59527\n ],\n [\n 129.211602,\n 43.784336\n ],\n [\n 129.406855,\n 43.819314\n ],\n [\n 129.467833,\n 43.874548\n ],\n [\n 129.742542,\n 43.875841\n ],\n [\n 129.784426,\n 43.964623\n ],\n [\n 129.869425,\n 44.005521\n ],\n [\n 129.869425,\n 44.005521\n ],\n [\n 129.880512,\n 44.000357\n ],\n [\n 129.880512,\n 44.000357\n ],\n [\n 129.98091,\n 44.014128\n ],\n [\n 130.017251,\n 43.962039\n ],\n [\n 130.027106,\n 43.851684\n ],\n [\n 130.079461,\n 43.835285\n ],\n [\n 130.079461,\n 43.835285\n ],\n [\n 130.189098,\n 43.940501\n ],\n [\n 130.260547,\n 43.948256\n ],\n [\n 130.353554,\n 44.050262\n ],\n [\n 130.338155,\n 43.949979\n ],\n [\n 130.338155,\n 43.949979\n ],\n [\n 130.383119,\n 43.906025\n ],\n [\n 130.380039,\n 43.783904\n ],\n [\n 130.423771,\n 43.742853\n ],\n [\n 130.4133,\n 43.652009\n ],\n [\n 130.488444,\n 43.655905\n ],\n [\n 130.823515,\n 43.502901\n ],\n [\n 130.841378,\n 43.454274\n ],\n [\n 130.907283,\n 43.434291\n ],\n [\n 131.026775,\n 43.508542\n ],\n [\n 131.134565,\n 43.428643\n ],\n [\n 131.134565,\n 43.428643\n ],\n [\n 131.294093,\n 43.469909\n ],\n [\n 131.304564,\n 43.502033\n ],\n [\n 131.314419,\n 43.392567\n ],\n [\n 131.275615,\n 43.369084\n ],\n [\n 131.255289,\n 43.265041\n ],\n [\n 131.206014,\n 43.23715\n ],\n [\n 131.218332,\n 43.146853\n ],\n [\n 131.171521,\n 43.069536\n ],\n [\n 131.102536,\n 43.021\n ],\n [\n 131.151195,\n 42.968485\n ],\n [\n 131.114855,\n 42.915048\n ],\n [\n 131.034167,\n 42.929069\n ],\n [\n 131.045869,\n 42.866828\n ],\n [\n 130.949167,\n 42.876913\n ],\n [\n 130.890653,\n 42.852793\n ],\n [\n 130.801957,\n 42.879544\n ],\n [\n 130.784095,\n 42.842265\n ],\n [\n 130.666451,\n 42.847968\n ],\n [\n 130.40714,\n 42.731611\n ],\n [\n 130.464423,\n 42.688525\n ],\n [\n 130.586995,\n 42.67621\n ],\n [\n 130.633806,\n 42.603586\n ],\n [\n 130.570364,\n 42.557327\n ],\n [\n 130.558661,\n 42.496035\n ],\n [\n 130.482285,\n 42.626483\n ],\n [\n 130.388046,\n 42.603145\n ],\n [\n 130.242069,\n 42.738643\n ],\n [\n 130.265474,\n 42.904092\n ],\n [\n 130.10225,\n 42.922935\n ],\n [\n 130.144134,\n 42.976365\n ],\n [\n 129.994461,\n 42.980304\n ],\n [\n 129.98707,\n 42.977678\n ],\n [\n 129.939642,\n 43.01225\n ],\n [\n 129.899606,\n 43.002187\n ],\n [\n 129.85957,\n 42.966295\n ],\n [\n 129.858338,\n 42.964544\n ],\n [\n 129.839244,\n 42.879983\n ],\n [\n 129.835549,\n 42.866828\n ],\n [\n 129.821382,\n 42.854109\n ],\n [\n 129.816454,\n 42.851039\n ],\n [\n 129.7641,\n 42.716227\n ],\n [\n 129.764716,\n 42.713149\n ],\n [\n 129.776418,\n 42.69908\n ],\n [\n 129.794281,\n 42.684127\n ],\n [\n 129.741926,\n 42.580681\n ],\n [\n 129.748701,\n 42.470884\n ],\n [\n 129.704354,\n 42.427176\n ],\n [\n 129.612579,\n 42.436892\n ],\n [\n 129.601492,\n 42.42276\n ],\n [\n 129.546057,\n 42.361336\n ],\n [\n 129.452434,\n 42.440866\n ],\n [\n 129.344029,\n 42.451462\n ],\n [\n 129.239935,\n 42.36841\n ],\n [\n 129.231928,\n 42.36001\n ],\n [\n 129.260261,\n 42.335689\n ],\n [\n 129.183269,\n 42.262225\n ],\n [\n 129.215914,\n 42.20818\n ],\n [\n 129.120443,\n 42.142111\n ],\n [\n 128.954755,\n 42.083966\n ],\n [\n 128.930734,\n 42.014211\n ],\n [\n 128.737945,\n 42.050209\n ],\n [\n 128.70222,\n 42.020434\n ],\n [\n 128.60675,\n 42.030212\n ],\n [\n 128.569177,\n 41.996426\n ],\n [\n 128.466316,\n 42.020878\n ],\n [\n 128.090593,\n 42.022656\n ],\n [\n 128.033926,\n 42.000428\n ],\n [\n 128.106607,\n 41.950164\n ],\n [\n 128.112766,\n 41.79378\n ],\n [\n 128.171897,\n 41.713882\n ],\n [\n 128.278454,\n 41.658922\n ],\n [\n 128.317258,\n 41.593177\n ],\n [\n 128.242114,\n 41.501827\n ],\n [\n 128.203309,\n 41.411246\n ],\n [\n 128.113998,\n 41.364561\n ],\n [\n 127.932296,\n 41.446686\n ],\n [\n 127.850376,\n 41.422912\n ],\n [\n 127.636645,\n 41.41349\n ],\n [\n 127.547334,\n 41.477176\n ],\n [\n 127.40998,\n 41.463278\n ],\n [\n 127.294183,\n 41.48659\n ],\n [\n 127.283096,\n 41.513925\n ],\n [\n 127.115561,\n 41.540353\n ],\n [\n 127.179618,\n 41.599888\n ],\n [\n 127.039184,\n 41.671884\n ],\n [\n 127.051503,\n 41.744693\n ],\n [\n 126.943714,\n 41.772365\n ],\n [\n 126.931395,\n 41.812959\n ],\n [\n 126.808207,\n 41.748264\n ],\n [\n 126.798968,\n 41.697354\n ],\n [\n 126.726903,\n 41.751389\n ],\n [\n 126.688099,\n 41.674119\n ],\n [\n 126.608643,\n 41.670543\n ],\n [\n 126.569838,\n 41.621809\n ],\n [\n 126.497158,\n 41.406758\n ],\n [\n 126.539041,\n 41.366806\n ],\n [\n 126.435564,\n 41.351088\n ],\n [\n 126.322847,\n 41.231054\n ],\n [\n 126.293282,\n 41.17073\n ],\n [\n 126.157775,\n 41.091413\n ],\n [\n 126.031507,\n 40.927067\n ],\n [\n 125.959442,\n 40.881845\n ],\n [\n 125.875059,\n 40.90853\n ],\n [\n 125.817161,\n 40.866915\n ],\n [\n 125.785132,\n 40.895867\n ],\n [\n 125.707523,\n 40.866915\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 230000,\n \"name\": \"黑龙江省\",\n \"center\": [\n 126.642464,\n 45.756967\n ],\n \"centroid\": [\n 127.693002,\n 48.040469\n ],\n \"childrenNum\": 13,\n \"level\": \"province\",\n \"subFeatureIndex\": 7,\n \"acroutes\": [\n 100000\n ],\n \"parent\": {\n \"adcode\": 100000\n }\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 123.319527,\n 46.253736\n ],\n [\n 123.319527,\n 46.253736\n ],\n [\n 123.248078,\n 46.273178\n ],\n [\n 123.178476,\n 46.247944\n ],\n [\n 123.011557,\n 46.43506\n ],\n [\n 123.002318,\n 46.574257\n ],\n [\n 123.04605,\n 46.617426\n ],\n [\n 123.18094,\n 46.614138\n ],\n [\n 123.228368,\n 46.58824\n ],\n [\n 123.276411,\n 46.660972\n ],\n [\n 123.366338,\n 46.677805\n ],\n [\n 123.603475,\n 46.689299\n ],\n [\n 123.631808,\n 46.728685\n ],\n [\n 123.625648,\n 46.84749\n ],\n [\n 123.576989,\n 46.891259\n ],\n [\n 123.562823,\n 46.825797\n ],\n [\n 123.483366,\n 46.845854\n ],\n [\n 123.52833,\n 46.944797\n ],\n [\n 123.404526,\n 46.935401\n ],\n [\n 123.374345,\n 46.837668\n ],\n [\n 123.309056,\n 46.86222\n ],\n [\n 123.221592,\n 46.850355\n ],\n [\n 123.163694,\n 46.740167\n ],\n [\n 123.026339,\n 46.718841\n ],\n [\n 122.906847,\n 46.807372\n ],\n [\n 122.895144,\n 46.960317\n ],\n [\n 122.796594,\n 46.938261\n ],\n [\n 122.778116,\n 47.00277\n ],\n [\n 122.845869,\n 47.046819\n ],\n [\n 122.679566,\n 47.094092\n ],\n [\n 122.556378,\n 47.17265\n ],\n [\n 122.418407,\n 47.350503\n ],\n [\n 122.507103,\n 47.401555\n ],\n [\n 122.543443,\n 47.495427\n ],\n [\n 122.59395,\n 47.547551\n ],\n [\n 122.763333,\n 47.613338\n ],\n [\n 122.855108,\n 47.677432\n ],\n [\n 123.166158,\n 47.783677\n ],\n [\n 123.228983,\n 47.840735\n ],\n [\n 123.300432,\n 47.953861\n ],\n [\n 123.537569,\n 48.021938\n ],\n [\n 123.746373,\n 48.19772\n ],\n [\n 123.873256,\n 48.281006\n ],\n [\n 124.07898,\n 48.436058\n ],\n [\n 124.25945,\n 48.536391\n ],\n [\n 124.25945,\n 48.536391\n ],\n [\n 124.314269,\n 48.503894\n ],\n [\n 124.317964,\n 48.347856\n ],\n [\n 124.404812,\n 48.264679\n ],\n [\n 124.418978,\n 48.181765\n ],\n [\n 124.467637,\n 48.178972\n ],\n [\n 124.463942,\n 48.097518\n ],\n [\n 124.578507,\n 48.251931\n ],\n [\n 124.579738,\n 48.304095\n ],\n [\n 124.51876,\n 48.378068\n ],\n [\n 124.507674,\n 48.445584\n ],\n [\n 124.555717,\n 48.467805\n ],\n [\n 124.520608,\n 48.556196\n ],\n [\n 124.579122,\n 48.596574\n ],\n [\n 124.653651,\n 48.777089\n ],\n [\n 124.697383,\n 48.841711\n ],\n [\n 124.709086,\n 48.920406\n ],\n [\n 124.808252,\n 49.020563\n ],\n [\n 124.807636,\n 49.108769\n ],\n [\n 124.906802,\n 49.183915\n ],\n [\n 125.117453,\n 49.126\n ],\n [\n 125.219699,\n 49.188999\n ],\n [\n 125.261583,\n 49.318656\n ],\n [\n 125.264047,\n 49.461585\n ],\n [\n 125.228323,\n 49.486857\n ],\n [\n 125.234482,\n 49.592077\n ],\n [\n 125.132236,\n 49.671909\n ],\n [\n 125.219699,\n 49.669199\n ],\n [\n 125.222779,\n 49.799137\n ],\n [\n 125.177815,\n 49.829637\n ],\n [\n 125.239409,\n 49.844687\n ],\n [\n 125.231402,\n 49.957606\n ],\n [\n 125.294228,\n 50.029151\n ],\n [\n 125.258504,\n 50.103659\n ],\n [\n 125.334264,\n 50.165023\n ],\n [\n 125.448829,\n 50.216354\n ],\n [\n 125.466075,\n 50.297452\n ],\n [\n 125.519662,\n 50.315795\n ],\n [\n 125.590495,\n 50.452378\n ],\n [\n 125.632379,\n 50.443996\n ],\n [\n 125.740784,\n 50.523184\n ],\n [\n 125.829479,\n 50.561589\n ],\n [\n 125.787595,\n 50.677373\n ],\n [\n 125.825784,\n 50.703906\n ],\n [\n 125.758646,\n 50.746706\n ],\n [\n 125.890457,\n 50.805729\n ],\n [\n 126.073391,\n 50.963514\n ],\n [\n 126.033971,\n 51.010971\n ],\n [\n 126.059225,\n 51.043711\n ],\n [\n 125.878138,\n 51.159431\n ],\n [\n 125.840566,\n 51.220555\n ],\n [\n 125.756798,\n 51.227675\n ],\n [\n 125.743248,\n 51.275984\n ],\n [\n 125.743248,\n 51.275984\n ],\n [\n 125.670567,\n 51.34555\n ],\n [\n 125.670567,\n 51.34555\n ],\n [\n 125.668103,\n 51.347419\n ],\n [\n 125.668103,\n 51.347419\n ],\n [\n 125.63977,\n 51.372451\n ],\n [\n 125.63977,\n 51.372451\n ],\n [\n 125.623756,\n 51.387762\n ],\n [\n 125.623756,\n 51.387762\n ],\n [\n 125.600966,\n 51.413518\n ],\n [\n 125.600966,\n 51.413518\n ],\n [\n 125.597886,\n 51.414638\n ],\n [\n 125.597886,\n 51.414638\n ],\n [\n 125.595422,\n 51.416877\n ],\n [\n 125.595422,\n 51.416877\n ],\n [\n 125.567089,\n 51.455668\n ],\n [\n 125.567089,\n 51.455668\n ],\n [\n 125.35151,\n 51.623876\n ],\n [\n 125.130388,\n 51.635389\n ],\n [\n 125.098975,\n 51.658408\n ],\n [\n 125.047236,\n 51.529801\n ],\n [\n 124.928976,\n 51.498523\n ],\n [\n 124.942527,\n 51.447465\n ],\n [\n 124.864302,\n 51.379547\n ],\n [\n 124.783614,\n 51.392243\n ],\n [\n 124.693687,\n 51.332842\n ],\n [\n 124.62655,\n 51.327608\n ],\n [\n 124.58713,\n 51.363486\n ],\n [\n 124.490427,\n 51.380294\n ],\n [\n 124.43684,\n 51.353772\n ],\n [\n 124.406659,\n 51.271867\n ],\n [\n 124.271769,\n 51.308162\n ],\n [\n 124.239124,\n 51.344429\n ],\n [\n 124.128255,\n 51.347419\n ],\n [\n 124.071588,\n 51.320878\n ],\n [\n 123.926227,\n 51.300681\n ],\n [\n 123.842459,\n 51.367595\n ],\n [\n 123.711264,\n 51.398216\n ],\n [\n 123.661989,\n 51.319008\n ],\n [\n 123.465504,\n 51.287212\n ],\n [\n 123.294273,\n 51.25427\n ],\n [\n 123.058984,\n 51.321999\n ],\n [\n 122.978296,\n 51.331346\n ],\n [\n 122.965977,\n 51.387015\n ],\n [\n 122.903768,\n 51.415384\n ],\n [\n 122.854492,\n 51.477659\n ],\n [\n 122.85634,\n 51.606786\n ],\n [\n 122.749167,\n 51.746661\n ],\n [\n 122.771957,\n 51.779619\n ],\n [\n 122.706051,\n 51.890166\n ],\n [\n 122.726377,\n 51.978704\n ],\n [\n 122.683877,\n 51.974649\n ],\n [\n 122.629059,\n 52.136529\n ],\n [\n 122.769493,\n 52.179843\n ],\n [\n 122.76087,\n 52.26671\n ],\n [\n 122.585943,\n 52.266344\n ],\n [\n 122.478153,\n 52.29636\n ],\n [\n 122.484313,\n 52.341711\n ],\n [\n 122.342031,\n 52.41403\n ],\n [\n 122.310618,\n 52.475299\n ],\n [\n 122.207756,\n 52.469103\n ],\n [\n 122.168952,\n 52.513549\n ],\n [\n 122.091344,\n 52.427167\n ],\n [\n 121.94783,\n 52.298555\n ],\n [\n 121.841272,\n 52.282818\n ],\n [\n 121.714389,\n 52.317944\n ],\n [\n 121.63986,\n 52.444311\n ],\n [\n 121.519136,\n 52.456709\n ],\n [\n 121.416274,\n 52.499346\n ],\n [\n 121.325731,\n 52.572498\n ],\n [\n 121.182217,\n 52.599399\n ],\n [\n 121.373158,\n 52.683268\n ],\n [\n 121.476636,\n 52.772043\n ],\n [\n 121.591201,\n 52.824499\n ],\n [\n 121.610295,\n 52.892416\n ],\n [\n 121.66265,\n 52.912626\n ],\n [\n 121.715621,\n 52.998054\n ],\n [\n 121.785838,\n 53.018575\n ],\n [\n 121.817867,\n 53.061744\n ],\n [\n 121.754425,\n 53.146519\n ],\n [\n 121.665114,\n 53.170556\n ],\n [\n 121.679896,\n 53.240437\n ],\n [\n 121.612143,\n 53.260484\n ],\n [\n 121.499426,\n 53.337008\n ],\n [\n 121.596128,\n 53.352368\n ],\n [\n 121.697758,\n 53.392705\n ],\n [\n 121.754425,\n 53.389494\n ],\n [\n 121.875765,\n 53.426587\n ],\n [\n 122.111054,\n 53.426944\n ],\n [\n 122.161561,\n 53.468635\n ],\n [\n 122.227466,\n 53.461868\n ],\n [\n 122.350038,\n 53.50566\n ],\n [\n 122.435038,\n 53.444766\n ],\n [\n 122.608117,\n 53.46543\n ],\n [\n 122.894528,\n 53.462936\n ],\n [\n 123.052209,\n 53.506727\n ],\n [\n 123.137209,\n 53.498186\n ],\n [\n 123.274563,\n 53.563269\n ],\n [\n 123.454417,\n 53.536608\n ],\n [\n 123.510468,\n 53.509218\n ],\n [\n 123.517243,\n 53.558293\n ],\n [\n 123.569598,\n 53.505304\n ],\n [\n 123.58746,\n 53.546919\n ],\n [\n 123.668764,\n 53.533763\n ],\n [\n 123.698329,\n 53.498542\n ],\n [\n 123.865249,\n 53.489644\n ],\n [\n 124.058038,\n 53.404121\n ],\n [\n 124.125791,\n 53.348082\n ],\n [\n 124.239124,\n 53.379501\n ],\n [\n 124.327819,\n 53.332006\n ],\n [\n 124.375863,\n 53.259053\n ],\n [\n 124.435609,\n 53.223962\n ],\n [\n 124.563108,\n 53.201389\n ],\n [\n 124.683832,\n 53.206406\n ],\n [\n 124.734339,\n 53.146519\n ],\n [\n 124.832889,\n 53.145083\n ],\n [\n 124.87231,\n 53.099123\n ],\n [\n 124.887708,\n 53.164458\n ],\n [\n 124.970244,\n 53.194221\n ],\n [\n 125.195062,\n 53.198522\n ],\n [\n 125.315786,\n 53.145083\n ],\n [\n 125.503647,\n 53.095171\n ],\n [\n 125.530749,\n 53.050956\n ],\n [\n 125.613901,\n 53.083313\n ],\n [\n 125.684118,\n 53.008136\n ],\n [\n 125.742632,\n 52.993733\n ],\n [\n 125.737704,\n 52.945087\n ],\n [\n 125.665023,\n 52.913348\n ],\n [\n 125.678574,\n 52.860999\n ],\n [\n 125.772197,\n 52.89783\n ],\n [\n 125.855349,\n 52.866418\n ],\n [\n 125.985312,\n 52.758648\n ],\n [\n 126.058609,\n 52.798098\n ],\n [\n 126.115275,\n 52.757924\n ],\n [\n 126.045058,\n 52.738366\n ],\n [\n 126.061688,\n 52.673473\n ],\n [\n 125.995783,\n 52.675287\n ],\n [\n 125.968682,\n 52.630279\n ],\n [\n 126.030891,\n 52.576135\n ],\n [\n 126.066616,\n 52.60376\n ],\n [\n 126.213209,\n 52.5252\n ],\n [\n 126.205202,\n 52.466187\n ],\n [\n 126.266796,\n 52.475664\n ],\n [\n 126.353644,\n 52.389207\n ],\n [\n 126.327774,\n 52.310628\n ],\n [\n 126.4331,\n 52.298555\n ],\n [\n 126.300673,\n 52.220915\n ],\n [\n 126.34502,\n 52.192315\n ],\n [\n 126.499005,\n 52.160394\n ],\n [\n 126.563679,\n 52.119266\n ],\n [\n 126.514404,\n 52.037264\n ],\n [\n 126.450962,\n 52.027693\n ],\n [\n 126.462665,\n 51.948473\n ],\n [\n 126.510092,\n 51.922281\n ],\n [\n 126.622809,\n 51.777397\n ],\n [\n 126.734294,\n 51.711454\n ],\n [\n 126.741069,\n 51.642073\n ],\n [\n 126.69549,\n 51.578536\n ],\n [\n 126.837156,\n 51.536128\n ],\n [\n 126.784185,\n 51.44821\n ],\n [\n 126.908605,\n 51.407174\n ],\n [\n 126.930163,\n 51.359376\n ],\n [\n 126.837156,\n 51.345177\n ],\n [\n 126.841468,\n 51.258763\n ],\n [\n 126.92154,\n 51.259512\n ],\n [\n 126.887047,\n 51.321999\n ],\n [\n 126.978822,\n 51.329477\n ],\n [\n 126.976358,\n 51.291702\n ],\n [\n 126.899982,\n 51.200689\n ],\n [\n 126.922772,\n 51.061764\n ],\n [\n 127.143894,\n 50.91035\n ],\n [\n 127.236285,\n 50.781524\n ],\n [\n 127.295415,\n 50.755035\n ],\n [\n 127.294799,\n 50.663721\n ],\n [\n 127.370559,\n 50.581349\n ],\n [\n 127.293567,\n 50.46571\n ],\n [\n 127.3644,\n 50.43828\n ],\n [\n 127.332371,\n 50.340623\n ],\n [\n 127.371791,\n 50.296688\n ],\n [\n 127.603385,\n 50.23932\n ],\n [\n 127.58737,\n 50.137802\n ],\n [\n 127.501755,\n 50.056817\n ],\n [\n 127.495595,\n 49.994545\n ],\n [\n 127.543638,\n 49.944131\n ],\n [\n 127.531936,\n 49.825777\n ],\n [\n 127.563964,\n 49.793343\n ],\n [\n 127.660051,\n 49.77905\n ],\n [\n 127.677913,\n 49.697846\n ],\n [\n 127.815268,\n 49.594017\n ],\n [\n 127.897804,\n 49.578889\n ],\n [\n 128.001281,\n 49.592465\n ],\n [\n 128.070882,\n 49.55677\n ],\n [\n 128.185447,\n 49.539301\n ],\n [\n 128.287077,\n 49.566473\n ],\n [\n 128.343128,\n 49.545125\n ],\n [\n 128.389939,\n 49.590138\n ],\n [\n 128.537764,\n 49.604487\n ],\n [\n 128.715155,\n 49.56492\n ],\n [\n 128.744104,\n 49.594792\n ],\n [\n 128.813089,\n 49.558323\n ],\n [\n 128.754575,\n 49.506676\n ],\n [\n 128.792147,\n 49.473251\n ],\n [\n 128.871604,\n 49.492298\n ],\n [\n 129.013886,\n 49.457307\n ],\n [\n 129.055769,\n 49.382188\n ],\n [\n 129.143849,\n 49.357253\n ],\n [\n 129.215298,\n 49.398935\n ],\n [\n 129.320623,\n 49.358422\n ],\n [\n 129.379138,\n 49.366995\n ],\n [\n 129.390224,\n 49.432799\n ],\n [\n 129.448739,\n 49.441359\n ],\n [\n 129.546057,\n 49.395041\n ],\n [\n 129.562687,\n 49.299541\n ],\n [\n 129.604571,\n 49.278858\n ],\n [\n 129.714209,\n 49.296029\n ],\n [\n 129.761636,\n 49.257384\n ],\n [\n 129.753629,\n 49.208547\n ],\n [\n 129.847867,\n 49.181177\n ],\n [\n 129.866962,\n 49.114252\n ],\n [\n 129.913157,\n 49.108377\n ],\n [\n 129.937179,\n 49.04057\n ],\n [\n 130.020946,\n 49.020955\n ],\n [\n 130.059135,\n 48.978954\n ],\n [\n 130.211272,\n 48.901137\n ],\n [\n 130.245148,\n 48.866514\n ],\n [\n 130.471198,\n 48.905464\n ],\n [\n 130.501995,\n 48.86612\n ],\n [\n 130.680617,\n 48.881074\n ],\n [\n 130.689856,\n 48.849586\n ],\n [\n 130.622103,\n 48.783792\n ],\n [\n 130.538335,\n 48.612004\n ],\n [\n 130.605473,\n 48.5942\n ],\n [\n 130.620871,\n 48.495964\n ],\n [\n 130.767465,\n 48.507858\n ],\n [\n 130.740363,\n 48.425339\n ],\n [\n 130.845073,\n 48.296533\n ],\n [\n 130.769313,\n 48.23121\n ],\n [\n 130.765617,\n 48.189344\n ],\n [\n 130.673842,\n 48.128278\n ],\n [\n 130.699711,\n 48.044344\n ],\n [\n 130.891269,\n 47.927006\n ],\n [\n 130.961486,\n 47.827882\n ],\n [\n 130.966413,\n 47.732996\n ],\n [\n 131.029855,\n 47.694752\n ],\n [\n 131.115471,\n 47.689919\n ],\n [\n 131.273767,\n 47.739032\n ],\n [\n 131.456085,\n 47.747079\n ],\n [\n 131.543548,\n 47.735813\n ],\n [\n 131.59036,\n 47.660912\n ],\n [\n 131.695685,\n 47.709248\n ],\n [\n 131.825649,\n 47.677432\n ],\n [\n 131.970394,\n 47.671388\n ],\n [\n 132.000575,\n 47.712066\n ],\n [\n 132.086191,\n 47.703208\n ],\n [\n 132.272205,\n 47.718507\n ],\n [\n 132.371987,\n 47.76518\n ],\n [\n 132.469305,\n 47.726154\n ],\n [\n 132.570319,\n 47.720922\n ],\n [\n 132.599268,\n 47.792521\n ],\n [\n 132.687348,\n 47.885293\n ],\n [\n 132.661478,\n 47.944643\n ],\n [\n 132.723072,\n 47.963076\n ],\n [\n 132.819159,\n 47.937028\n ],\n [\n 132.883216,\n 48.002325\n ],\n [\n 132.992238,\n 48.035142\n ],\n [\n 133.041513,\n 48.102313\n ],\n [\n 133.15423,\n 48.137063\n ],\n [\n 133.302055,\n 48.103112\n ],\n [\n 133.407997,\n 48.124684\n ],\n [\n 133.536728,\n 48.117494\n ],\n [\n 133.59709,\n 48.194928\n ],\n [\n 133.693177,\n 48.186951\n ],\n [\n 133.740604,\n 48.25472\n ],\n [\n 134.0689,\n 48.338311\n ],\n [\n 134.131109,\n 48.335527\n ],\n [\n 134.20379,\n 48.38244\n ],\n [\n 134.350384,\n 48.378466\n ],\n [\n 134.501905,\n 48.418986\n ],\n [\n 134.696542,\n 48.407072\n ],\n [\n 134.820961,\n 48.376081\n ],\n [\n 134.927519,\n 48.451537\n ],\n [\n 135.09567,\n 48.437646\n ],\n [\n 135.082736,\n 48.396346\n ],\n [\n 134.864077,\n 48.332345\n ],\n [\n 134.679295,\n 48.256314\n ],\n [\n 134.67252,\n 48.170593\n ],\n [\n 134.632484,\n 48.099516\n ],\n [\n 134.551796,\n 48.032742\n ],\n [\n 134.607846,\n 47.909362\n ],\n [\n 134.660201,\n 47.900538\n ],\n [\n 134.678679,\n 47.819446\n ],\n [\n 134.772918,\n 47.763572\n ],\n [\n 134.779694,\n 47.716091\n ],\n [\n 134.684223,\n 47.631889\n ],\n [\n 134.685455,\n 47.603253\n ],\n [\n 134.576434,\n 47.519273\n ],\n [\n 134.568426,\n 47.478445\n ],\n [\n 134.493898,\n 47.446894\n ],\n [\n 134.339297,\n 47.43961\n ],\n [\n 134.177305,\n 47.32658\n ],\n [\n 134.156979,\n 47.248656\n ],\n [\n 134.230276,\n 47.182411\n ],\n [\n 134.222268,\n 47.105496\n ],\n [\n 134.142812,\n 47.093277\n ],\n [\n 134.042414,\n 46.886761\n ],\n [\n 134.011001,\n 46.637971\n ],\n [\n 133.919842,\n 46.596052\n ],\n [\n 133.852089,\n 46.449903\n ],\n [\n 133.950023,\n 46.394634\n ],\n [\n 133.876726,\n 46.362438\n ],\n [\n 133.922922,\n 46.330635\n ],\n [\n 133.904444,\n 46.25084\n ],\n [\n 133.83977,\n 46.202825\n ],\n [\n 133.706111,\n 46.163056\n ],\n [\n 133.745531,\n 46.075547\n ],\n [\n 133.676546,\n 45.942982\n ],\n [\n 133.616184,\n 45.943398\n ],\n [\n 133.576148,\n 45.870957\n ],\n [\n 133.51209,\n 45.886785\n ],\n [\n 133.470822,\n 45.838035\n ],\n [\n 133.484373,\n 45.738737\n ],\n [\n 133.445569,\n 45.70532\n ],\n [\n 133.491764,\n 45.672301\n ],\n [\n 133.371656,\n 45.576895\n ],\n [\n 133.21028,\n 45.516975\n ],\n [\n 133.141295,\n 45.427605\n ],\n [\n 133.095715,\n 45.246753\n ],\n [\n 133.138215,\n 45.178469\n ],\n [\n 133.103107,\n 45.107147\n ],\n [\n 132.945426,\n 45.020512\n ],\n [\n 132.867202,\n 45.061944\n ],\n [\n 132.394161,\n 45.163706\n ],\n [\n 132.025829,\n 45.250545\n ],\n [\n 131.93159,\n 45.288442\n ],\n [\n 131.917423,\n 45.339354\n ],\n [\n 131.82996,\n 45.31159\n ],\n [\n 131.79362,\n 45.211778\n ],\n [\n 131.721555,\n 45.234536\n ],\n [\n 131.650722,\n 45.159909\n ],\n [\n 131.695685,\n 45.132056\n ],\n [\n 131.632244,\n 45.074621\n ],\n [\n 131.484418,\n 44.995553\n ],\n [\n 131.464708,\n 44.963388\n ],\n [\n 131.355687,\n 44.98963\n ],\n [\n 131.274999,\n 44.919766\n ],\n [\n 131.16105,\n 44.948145\n ],\n [\n 131.090217,\n 44.924426\n ],\n [\n 131.07913,\n 44.881623\n ],\n [\n 130.967029,\n 44.854059\n ],\n [\n 131.016304,\n 44.789551\n ],\n [\n 131.064348,\n 44.787003\n ],\n [\n 131.111775,\n 44.71009\n ],\n [\n 131.310723,\n 44.046392\n ],\n [\n 131.263912,\n 44.030047\n ],\n [\n 131.267608,\n 43.938778\n ],\n [\n 131.211557,\n 43.826221\n ],\n [\n 131.244818,\n 43.604369\n ],\n [\n 131.20047,\n 43.531971\n ],\n [\n 131.304564,\n 43.502033\n ],\n [\n 131.294093,\n 43.469909\n ],\n [\n 131.134565,\n 43.428643\n ],\n [\n 131.134565,\n 43.428643\n ],\n [\n 131.026775,\n 43.508542\n ],\n [\n 130.907283,\n 43.434291\n ],\n [\n 130.841378,\n 43.454274\n ],\n [\n 130.823515,\n 43.502901\n ],\n [\n 130.488444,\n 43.655905\n ],\n [\n 130.4133,\n 43.652009\n ],\n [\n 130.423771,\n 43.742853\n ],\n [\n 130.380039,\n 43.783904\n ],\n [\n 130.383119,\n 43.906025\n ],\n [\n 130.338155,\n 43.949979\n ],\n [\n 130.338155,\n 43.949979\n ],\n [\n 130.353554,\n 44.050262\n ],\n [\n 130.260547,\n 43.948256\n ],\n [\n 130.189098,\n 43.940501\n ],\n [\n 130.079461,\n 43.835285\n ],\n [\n 130.079461,\n 43.835285\n ],\n [\n 130.027106,\n 43.851684\n ],\n [\n 130.017251,\n 43.962039\n ],\n [\n 129.98091,\n 44.014128\n ],\n [\n 129.880512,\n 44.000357\n ],\n [\n 129.880512,\n 44.000357\n ],\n [\n 129.869425,\n 44.005521\n ],\n [\n 129.869425,\n 44.005521\n ],\n [\n 129.784426,\n 43.964623\n ],\n [\n 129.742542,\n 43.875841\n ],\n [\n 129.467833,\n 43.874548\n ],\n [\n 129.406855,\n 43.819314\n ],\n [\n 129.211602,\n 43.784336\n ],\n [\n 129.230696,\n 43.59527\n ],\n [\n 129.014501,\n 43.523295\n ],\n [\n 128.949212,\n 43.55409\n ],\n [\n 128.877763,\n 43.540213\n ],\n [\n 128.719467,\n 43.816724\n ],\n [\n 128.760734,\n 43.857724\n ],\n [\n 128.723778,\n 43.894816\n ],\n [\n 128.636315,\n 43.891366\n ],\n [\n 128.644938,\n 43.936193\n ],\n [\n 128.584576,\n 43.990887\n ],\n [\n 128.574721,\n 44.047682\n ],\n [\n 128.450301,\n 44.203157\n ],\n [\n 128.481714,\n 44.375332\n ],\n [\n 128.46262,\n 44.433894\n ],\n [\n 128.373309,\n 44.51416\n ],\n [\n 128.211317,\n 44.431757\n ],\n [\n 128.190375,\n 44.367206\n ],\n [\n 128.049941,\n 44.349239\n ],\n [\n 128.101679,\n 44.290593\n ],\n [\n 128.089977,\n 44.132342\n ],\n [\n 128.059796,\n 44.110007\n ],\n [\n 127.862079,\n 44.063162\n ],\n [\n 127.729036,\n 44.098836\n ],\n [\n 127.724109,\n 44.196723\n ],\n [\n 127.681609,\n 44.167116\n ],\n [\n 127.591066,\n 44.227601\n ],\n [\n 127.623095,\n 44.277743\n ],\n [\n 127.483892,\n 44.401842\n ],\n [\n 127.483892,\n 44.401842\n ],\n [\n 127.50853,\n 44.437312\n ],\n [\n 127.463566,\n 44.484713\n ],\n [\n 127.536247,\n 44.522266\n ],\n [\n 127.557189,\n 44.575566\n ],\n [\n 127.392733,\n 44.632223\n ],\n [\n 127.182082,\n 44.644144\n ],\n [\n 127.094003,\n 44.615189\n ],\n [\n 127.049039,\n 44.567041\n ],\n [\n 127.037336,\n 44.72157\n ],\n [\n 126.984366,\n 44.823936\n ],\n [\n 127.021938,\n 44.899002\n ],\n [\n 127.085995,\n 44.944757\n ],\n [\n 126.968351,\n 45.074621\n ],\n [\n 126.96404,\n 45.132056\n ],\n [\n 126.831613,\n 45.146406\n ],\n [\n 126.567375,\n 45.252651\n ],\n [\n 126.428172,\n 45.2358\n ],\n [\n 126.321615,\n 45.178891\n ],\n [\n 126.166398,\n 45.133323\n ],\n [\n 125.915095,\n 45.196602\n ],\n [\n 125.760494,\n 45.291389\n ],\n [\n 125.697052,\n 45.349447\n ],\n [\n 125.716146,\n 45.421725\n ],\n [\n 125.687813,\n 45.51404\n ],\n [\n 125.628067,\n 45.522006\n ],\n [\n 125.497488,\n 45.469161\n ],\n [\n 125.424807,\n 45.485523\n ],\n [\n 125.398322,\n 45.416686\n ],\n [\n 125.347815,\n 45.395262\n ],\n [\n 125.248649,\n 45.417526\n ],\n [\n 125.06941,\n 45.384757\n ],\n [\n 125.025678,\n 45.493492\n ],\n [\n 124.961005,\n 45.49517\n ],\n [\n 124.923433,\n 45.541286\n ],\n [\n 124.886476,\n 45.442719\n ],\n [\n 124.625318,\n 45.437262\n ],\n [\n 124.544014,\n 45.412066\n ],\n [\n 124.480572,\n 45.456151\n ],\n [\n 124.398652,\n 45.44062\n ],\n [\n 124.354305,\n 45.546734\n ],\n [\n 124.287783,\n 45.539191\n ],\n [\n 124.273001,\n 45.584014\n ],\n [\n 124.129487,\n 45.637589\n ],\n [\n 124.13811,\n 45.68735\n ],\n [\n 124.009379,\n 45.78215\n ],\n [\n 124.064813,\n 45.797586\n ],\n [\n 124.061118,\n 45.886369\n ],\n [\n 123.996444,\n 45.907189\n ],\n [\n 123.970574,\n 45.971267\n ],\n [\n 124.040176,\n 46.019484\n ],\n [\n 123.99398,\n 46.101275\n ],\n [\n 123.982893,\n 46.22601\n ],\n [\n 123.896046,\n 46.303774\n ],\n [\n 123.779633,\n 46.264078\n ],\n [\n 123.610866,\n 46.252909\n ],\n [\n 123.565902,\n 46.22601\n ],\n [\n 123.498765,\n 46.259528\n ],\n [\n 123.373113,\n 46.223112\n ],\n [\n 123.319527,\n 46.253736\n ]\n ]\n ],\n [\n [\n [\n 124.43992,\n 50.388713\n ],\n [\n 124.36416,\n 50.360857\n ],\n [\n 124.368471,\n 50.258068\n ],\n [\n 124.32474,\n 50.178436\n ],\n [\n 124.278544,\n 50.231284\n ],\n [\n 124.189233,\n 50.216737\n ],\n [\n 124.103001,\n 50.238555\n ],\n [\n 124.061733,\n 50.199122\n ],\n [\n 124.007531,\n 50.219417\n ],\n [\n 123.953944,\n 50.186865\n ],\n [\n 123.878799,\n 50.208696\n ],\n [\n 123.870792,\n 50.270307\n ],\n [\n 123.777785,\n 50.344441\n ],\n [\n 123.800575,\n 50.455806\n ],\n [\n 123.920067,\n 50.37307\n ],\n [\n 124.005067,\n 50.434469\n ],\n [\n 123.983509,\n 50.510249\n ],\n [\n 124.076516,\n 50.564249\n ],\n [\n 124.289015,\n 50.553226\n ],\n [\n 124.322892,\n 50.532693\n ],\n [\n 124.43992,\n 50.539919\n ],\n [\n 124.43992,\n 50.388713\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 310000,\n \"name\": \"上海市\",\n \"center\": [\n 121.472644,\n 31.231706\n ],\n \"centroid\": [\n 121.438732,\n 31.072508\n ],\n \"childrenNum\": 16,\n \"level\": \"province\",\n \"subFeatureIndex\": 8,\n \"acroutes\": [\n 100000\n ],\n \"parent\": {\n \"adcode\": 100000\n }\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 121.970004,\n 30.789217\n ],\n [\n 121.943518,\n 30.77688\n ],\n [\n 121.904714,\n 30.814399\n ],\n [\n 121.601056,\n 30.805149\n ],\n [\n 121.426129,\n 30.730089\n ],\n [\n 121.362071,\n 30.679673\n ],\n [\n 121.274608,\n 30.677615\n ],\n [\n 121.217942,\n 30.785105\n ],\n [\n 121.123087,\n 30.778936\n ],\n [\n 121.097218,\n 30.85704\n ],\n [\n 120.989428,\n 30.833924\n ],\n [\n 120.991892,\n 31.00793\n ],\n [\n 120.901349,\n 31.017673\n ],\n [\n 120.881023,\n 31.134513\n ],\n [\n 121.076892,\n 31.158581\n ],\n [\n 121.063341,\n 31.268088\n ],\n [\n 121.150188,\n 31.275247\n ],\n [\n 121.106457,\n 31.364697\n ],\n [\n 121.173594,\n 31.448956\n ],\n [\n 121.25613,\n 31.478047\n ],\n [\n 121.25613,\n 31.478047\n ],\n [\n 121.302325,\n 31.498966\n ],\n [\n 121.302325,\n 31.498966\n ],\n [\n 121.343593,\n 31.512229\n ],\n [\n 121.520984,\n 31.394835\n ],\n [\n 121.713773,\n 31.308992\n ],\n [\n 121.946598,\n 31.065861\n ],\n [\n 121.990945,\n 30.968434\n ],\n [\n 121.970004,\n 30.789217\n ]\n ]\n ],\n [\n [\n [\n 121.371926,\n 31.553028\n ],\n [\n 121.145261,\n 31.753699\n ],\n [\n 121.200079,\n 31.835066\n ],\n [\n 121.323267,\n 31.86861\n ],\n [\n 121.43352,\n 31.768452\n ],\n [\n 121.715005,\n 31.673788\n ],\n [\n 121.974931,\n 31.617249\n ],\n [\n 121.995873,\n 31.493354\n ],\n [\n 121.890547,\n 31.428537\n ],\n [\n 121.819098,\n 31.438237\n ],\n [\n 121.547469,\n 31.531101\n ],\n [\n 121.434136,\n 31.59024\n ],\n [\n 121.371926,\n 31.553028\n ]\n ]\n ],\n [\n [\n [\n 121.74149,\n 31.345792\n ],\n [\n 121.509897,\n 31.482639\n ],\n [\n 121.742106,\n 31.407091\n ],\n [\n 121.74149,\n 31.345792\n ]\n ]\n ],\n [\n [\n [\n 121.844352,\n 31.294678\n ],\n [\n 121.792613,\n 31.377468\n ],\n [\n 121.914569,\n 31.343236\n ],\n [\n 121.844352,\n 31.294678\n ]\n ]\n ],\n [\n [\n [\n 121.943518,\n 31.215397\n ],\n [\n 122.008808,\n 31.221026\n ],\n [\n 121.995873,\n 31.160629\n ],\n [\n 121.943518,\n 31.215397\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 320000,\n \"name\": \"江苏省\",\n \"center\": [\n 118.767413,\n 32.041544\n ],\n \"centroid\": [\n 119.48196,\n 32.985864\n ],\n \"childrenNum\": 13,\n \"level\": \"province\",\n \"subFeatureIndex\": 9,\n \"acroutes\": [\n 100000\n ],\n \"parent\": {\n \"adcode\": 100000\n }\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 121.974931,\n 31.617249\n ],\n [\n 121.715005,\n 31.673788\n ],\n [\n 121.43352,\n 31.768452\n ],\n [\n 121.323267,\n 31.86861\n ],\n [\n 121.200079,\n 31.835066\n ],\n [\n 121.145261,\n 31.753699\n ],\n [\n 121.371926,\n 31.553028\n ],\n [\n 121.343593,\n 31.512229\n ],\n [\n 121.302325,\n 31.498966\n ],\n [\n 121.302325,\n 31.498966\n ],\n [\n 121.25613,\n 31.478047\n ],\n [\n 121.25613,\n 31.478047\n ],\n [\n 121.173594,\n 31.448956\n ],\n [\n 121.106457,\n 31.364697\n ],\n [\n 121.150188,\n 31.275247\n ],\n [\n 121.063341,\n 31.268088\n ],\n [\n 121.076892,\n 31.158581\n ],\n [\n 120.881023,\n 31.134513\n ],\n [\n 120.901349,\n 31.017673\n ],\n [\n 120.698089,\n 30.970999\n ],\n [\n 120.713487,\n 30.885286\n ],\n [\n 120.589068,\n 30.854472\n ],\n [\n 120.504684,\n 30.757858\n ],\n [\n 120.423996,\n 30.900689\n ],\n [\n 120.35809,\n 30.88734\n ],\n [\n 120.371025,\n 30.948424\n ],\n [\n 120.226279,\n 30.926356\n ],\n [\n 120.13512,\n 30.941752\n ],\n [\n 120.001461,\n 31.026902\n ],\n [\n 119.919542,\n 31.170868\n ],\n [\n 119.678093,\n 31.168308\n ],\n [\n 119.623891,\n 31.130416\n ],\n [\n 119.460051,\n 31.156533\n ],\n [\n 119.388602,\n 31.194415\n ],\n [\n 119.388602,\n 31.194415\n ],\n [\n 119.379979,\n 31.269622\n ],\n [\n 119.267878,\n 31.250698\n ],\n [\n 119.199508,\n 31.293655\n ],\n [\n 119.075089,\n 31.232282\n ],\n [\n 118.781286,\n 31.239956\n ],\n [\n 118.728931,\n 31.281384\n ],\n [\n 118.745561,\n 31.37287\n ],\n [\n 118.853967,\n 31.39841\n ],\n [\n 118.876756,\n 31.532631\n ],\n [\n 118.873061,\n 31.53569\n ],\n [\n 118.858278,\n 31.624382\n ],\n [\n 118.804691,\n 31.618268\n ],\n [\n 118.77451,\n 31.682444\n ],\n [\n 118.736938,\n 31.634061\n ],\n [\n 118.643931,\n 31.65138\n ],\n [\n 118.697518,\n 31.709935\n ],\n [\n 118.638388,\n 31.759295\n ],\n [\n 118.552772,\n 31.729275\n ],\n [\n 118.481939,\n 31.778117\n ],\n [\n 118.504729,\n 31.841674\n ],\n [\n 118.363679,\n 31.930581\n ],\n [\n 118.400019,\n 32.077724\n ],\n [\n 118.499801,\n 32.1203\n ],\n [\n 118.522591,\n 32.188178\n ],\n [\n 118.642083,\n 32.208937\n ],\n [\n 118.69567,\n 32.31721\n ],\n [\n 118.69259,\n 32.463224\n ],\n [\n 118.592192,\n 32.481396\n ],\n [\n 118.563859,\n 32.56363\n ],\n [\n 118.719076,\n 32.614042\n ],\n [\n 118.719076,\n 32.614042\n ],\n [\n 118.92172,\n 32.557074\n ],\n [\n 118.922336,\n 32.557074\n ],\n [\n 118.92172,\n 32.557074\n ],\n [\n 118.922336,\n 32.557074\n ],\n [\n 118.978386,\n 32.504106\n ],\n [\n 119.041212,\n 32.515207\n ],\n [\n 119.084944,\n 32.452622\n ],\n [\n 119.22045,\n 32.57674\n ],\n [\n 119.184726,\n 32.825465\n ],\n [\n 119.104038,\n 32.82647\n ],\n [\n 118.995017,\n 32.958604\n ],\n [\n 118.849039,\n 32.956596\n ],\n [\n 118.811467,\n 32.854622\n ],\n [\n 118.74125,\n 32.850601\n ],\n [\n 118.756648,\n 32.737433\n ],\n [\n 118.707373,\n 32.720319\n ],\n [\n 118.375382,\n 32.718809\n ],\n [\n 118.250346,\n 32.84859\n ],\n [\n 118.2331,\n 32.914414\n ],\n [\n 118.293462,\n 32.947056\n ],\n [\n 118.244803,\n 32.998256\n ],\n [\n 118.221397,\n 33.182228\n ],\n [\n 118.038463,\n 33.134642\n ],\n [\n 117.939297,\n 33.262813\n ],\n [\n 117.971941,\n 33.277821\n ],\n [\n 118.050782,\n 33.492148\n ],\n [\n 118.108064,\n 33.475181\n ],\n [\n 118.112376,\n 33.617302\n ],\n [\n 118.16781,\n 33.66313\n ],\n [\n 118.116071,\n 33.767645\n ],\n [\n 117.901724,\n 33.719883\n ],\n [\n 117.805638,\n 33.736304\n ],\n [\n 117.752667,\n 33.711422\n ],\n [\n 117.758826,\n 33.885445\n ],\n [\n 117.715095,\n 33.879485\n ],\n [\n 117.629479,\n 34.028872\n ],\n [\n 117.575892,\n 33.982744\n ],\n [\n 117.514914,\n 34.061097\n ],\n [\n 117.410205,\n 34.026888\n ],\n [\n 117.352922,\n 34.089842\n ],\n [\n 117.192778,\n 34.068532\n ],\n [\n 117.025243,\n 34.167106\n ],\n [\n 117.04988,\n 34.242321\n ],\n [\n 116.971656,\n 34.279409\n ],\n [\n 116.969192,\n 34.387613\n ],\n [\n 116.828142,\n 34.389094\n ],\n [\n 116.774555,\n 34.452764\n ],\n [\n 116.574991,\n 34.488773\n ],\n [\n 116.595933,\n 34.510469\n ],\n [\n 116.491839,\n 34.57109\n ],\n [\n 116.429629,\n 34.652834\n ],\n [\n 116.374195,\n 34.640036\n ],\n [\n 116.408071,\n 34.85095\n ],\n [\n 116.445028,\n 34.89562\n ],\n [\n 116.677853,\n 34.939285\n ],\n [\n 116.821983,\n 34.929475\n ],\n [\n 116.966728,\n 34.875497\n ],\n [\n 117.000605,\n 34.793482\n ],\n [\n 117.088069,\n 34.702039\n ],\n [\n 117.07575,\n 34.637575\n ],\n [\n 117.137344,\n 34.633144\n ],\n [\n 117.175532,\n 34.47003\n ],\n [\n 117.242669,\n 34.445856\n ],\n [\n 117.301184,\n 34.557294\n ],\n [\n 117.301184,\n 34.557294\n ],\n [\n 117.322125,\n 34.566656\n ],\n [\n 117.322125,\n 34.566656\n ],\n [\n 117.32151,\n 34.566656\n ],\n [\n 117.32151,\n 34.566656\n ],\n [\n 117.322125,\n 34.574046\n ],\n [\n 117.322125,\n 34.574046\n ],\n [\n 117.402813,\n 34.569612\n ],\n [\n 117.465023,\n 34.484827\n ],\n [\n 117.592523,\n 34.462631\n ],\n [\n 117.684298,\n 34.547439\n ],\n [\n 117.801942,\n 34.51885\n ],\n [\n 117.793935,\n 34.65185\n ],\n [\n 117.902956,\n 34.644467\n ],\n [\n 117.951615,\n 34.678424\n ],\n [\n 118.084042,\n 34.655788\n ],\n [\n 118.079115,\n 34.569612\n ],\n [\n 118.185056,\n 34.543989\n ],\n [\n 118.132702,\n 34.483348\n ],\n [\n 118.177665,\n 34.453257\n ],\n [\n 118.179513,\n 34.379218\n ],\n [\n 118.290382,\n 34.424637\n ],\n [\n 118.404947,\n 34.427598\n ],\n [\n 118.440671,\n 34.527724\n ],\n [\n 118.424657,\n 34.595228\n ],\n [\n 118.460997,\n 34.65628\n ],\n [\n 118.601431,\n 34.714336\n ],\n [\n 118.690127,\n 34.678424\n ],\n [\n 118.783749,\n 34.723188\n ],\n [\n 118.719076,\n 34.745315\n ],\n [\n 118.772047,\n 34.794464\n ],\n [\n 118.860742,\n 34.94419\n ],\n [\n 118.865053,\n 35.029974\n ],\n [\n 118.928495,\n 35.051039\n ],\n [\n 119.114509,\n 35.054958\n ],\n [\n 119.137915,\n 35.09609\n ],\n [\n 119.286972,\n 35.11518\n ],\n [\n 119.306066,\n 35.076506\n ],\n [\n 119.238929,\n 35.04908\n ],\n [\n 119.202588,\n 34.890222\n ],\n [\n 119.238313,\n 34.799378\n ],\n [\n 119.378747,\n 34.764487\n ],\n [\n 119.459435,\n 34.770876\n ],\n [\n 119.50871,\n 34.729089\n ],\n [\n 119.465594,\n 34.673012\n ],\n [\n 119.582623,\n 34.598676\n ],\n [\n 119.781571,\n 34.515892\n ],\n [\n 119.811752,\n 34.48532\n ],\n [\n 119.962657,\n 34.458684\n ],\n [\n 120.311895,\n 34.307091\n ],\n [\n 120.367329,\n 34.091328\n ],\n [\n 120.583524,\n 33.668608\n ],\n [\n 120.651277,\n 33.575937\n ],\n [\n 120.741205,\n 33.337826\n ],\n [\n 120.821893,\n 33.298327\n ],\n [\n 120.90566,\n 33.030366\n ],\n [\n 120.929682,\n 32.876232\n ],\n [\n 120.974646,\n 32.874724\n ],\n [\n 120.966638,\n 32.770141\n ],\n [\n 120.900733,\n 32.72334\n ],\n [\n 120.916131,\n 32.642261\n ],\n [\n 121.153268,\n 32.529333\n ],\n [\n 121.352216,\n 32.47433\n ],\n [\n 121.425513,\n 32.430909\n ],\n [\n 121.472941,\n 32.138034\n ],\n [\n 121.524063,\n 32.137528\n ],\n [\n 121.759352,\n 32.059471\n ],\n [\n 121.856055,\n 31.95546\n ],\n [\n 121.970004,\n 31.719096\n ],\n [\n 121.974931,\n 31.617249\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 330000,\n \"name\": \"浙江省\",\n \"center\": [\n 120.153576,\n 30.287459\n ],\n \"centroid\": [\n 120.109522,\n 29.181876\n ],\n \"childrenNum\": 11,\n \"level\": \"province\",\n \"subFeatureIndex\": 10,\n \"acroutes\": [\n 100000\n ],\n \"parent\": {\n \"adcode\": 100000\n }\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 120.461568,\n 27.14259\n ],\n [\n 120.401206,\n 27.211253\n ],\n [\n 120.430155,\n 27.258601\n ],\n [\n 120.34146,\n 27.39946\n ],\n [\n 120.26262,\n 27.432921\n ],\n [\n 120.13512,\n 27.420175\n ],\n [\n 120.052584,\n 27.338886\n ],\n [\n 120.007005,\n 27.376084\n ],\n [\n 119.843165,\n 27.300611\n ],\n [\n 119.770484,\n 27.305928\n ],\n [\n 119.685485,\n 27.438762\n ],\n [\n 119.70889,\n 27.514141\n ],\n [\n 119.630666,\n 27.582574\n ],\n [\n 119.644217,\n 27.663684\n ],\n [\n 119.501319,\n 27.649905\n ],\n [\n 119.474833,\n 27.539079\n ],\n [\n 119.376899,\n 27.534835\n ],\n [\n 119.267878,\n 27.421237\n ],\n [\n 119.194581,\n 27.418582\n ],\n [\n 118.983314,\n 27.498751\n ],\n [\n 118.903858,\n 27.462125\n ],\n [\n 118.869365,\n 27.54014\n ],\n [\n 118.913713,\n 27.61651\n ],\n [\n 118.818242,\n 27.916697\n ],\n [\n 118.730163,\n 27.970611\n ],\n [\n 118.719076,\n 28.063576\n ],\n [\n 118.802228,\n 28.117416\n ],\n [\n 118.771431,\n 28.188634\n ],\n [\n 118.802228,\n 28.240303\n ],\n [\n 118.700598,\n 28.310912\n ],\n [\n 118.674728,\n 28.271398\n ],\n [\n 118.587881,\n 28.28299\n ],\n [\n 118.444367,\n 28.25348\n ],\n [\n 118.433896,\n 28.288786\n ],\n [\n 118.486867,\n 28.328821\n ],\n [\n 118.432048,\n 28.402003\n ],\n [\n 118.472084,\n 28.482497\n ],\n [\n 118.426505,\n 28.532447\n ],\n [\n 118.425273,\n 28.537177\n ],\n [\n 118.426505,\n 28.532447\n ],\n [\n 118.425273,\n 28.537177\n ],\n [\n 118.421577,\n 28.540331\n ],\n [\n 118.421577,\n 28.541908\n ],\n [\n 118.423425,\n 28.587626\n ],\n [\n 118.423425,\n 28.587626\n ],\n [\n 118.431432,\n 28.679528\n ],\n [\n 118.379077,\n 28.785509\n ],\n [\n 118.379077,\n 28.785509\n ],\n [\n 118.306396,\n 28.823782\n ],\n [\n 118.270056,\n 28.918619\n ],\n [\n 118.111144,\n 28.997671\n ],\n [\n 118.111144,\n 28.997671\n ],\n [\n 118.037847,\n 29.097054\n ],\n [\n 118.027992,\n 29.168132\n ],\n [\n 118.077883,\n 29.290836\n ],\n [\n 118.136397,\n 29.284052\n ],\n [\n 118.20723,\n 29.346135\n ],\n [\n 118.193064,\n 29.395149\n ],\n [\n 118.316252,\n 29.422774\n ],\n [\n 118.310708,\n 29.49623\n ],\n [\n 118.496106,\n 29.519662\n ],\n [\n 118.500417,\n 29.575877\n ],\n [\n 118.573714,\n 29.638302\n ],\n [\n 118.644547,\n 29.641942\n ],\n [\n 118.744945,\n 29.738621\n ],\n [\n 118.755416,\n 29.845586\n ],\n [\n 118.894619,\n 29.93792\n ],\n [\n 118.902626,\n 30.029133\n ],\n [\n 118.847807,\n 30.163208\n ],\n [\n 118.929727,\n 30.202515\n ],\n [\n 118.880452,\n 30.31518\n ],\n [\n 118.954365,\n 30.360106\n ],\n [\n 119.06277,\n 30.304849\n ],\n [\n 119.201356,\n 30.290901\n ],\n [\n 119.246936,\n 30.341002\n ],\n [\n 119.36766,\n 30.384885\n ],\n [\n 119.326392,\n 30.532906\n ],\n [\n 119.237081,\n 30.54682\n ],\n [\n 119.238929,\n 30.60915\n ],\n [\n 119.312225,\n 30.620993\n ],\n [\n 119.386754,\n 30.685333\n ],\n [\n 119.416935,\n 30.642101\n ],\n [\n 119.482841,\n 30.70437\n ],\n [\n 119.479761,\n 30.772253\n ],\n [\n 119.575847,\n 30.829814\n ],\n [\n 119.585702,\n 30.976642\n ],\n [\n 119.633746,\n 31.019724\n ],\n [\n 119.623891,\n 31.130416\n ],\n [\n 119.678093,\n 31.168308\n ],\n [\n 119.919542,\n 31.170868\n ],\n [\n 120.001461,\n 31.026902\n ],\n [\n 120.13512,\n 30.941752\n ],\n [\n 120.226279,\n 30.926356\n ],\n [\n 120.371025,\n 30.948424\n ],\n [\n 120.35809,\n 30.88734\n ],\n [\n 120.423996,\n 30.900689\n ],\n [\n 120.504684,\n 30.757858\n ],\n [\n 120.589068,\n 30.854472\n ],\n [\n 120.713487,\n 30.885286\n ],\n [\n 120.698089,\n 30.970999\n ],\n [\n 120.901349,\n 31.017673\n ],\n [\n 120.991892,\n 31.00793\n ],\n [\n 120.989428,\n 30.833924\n ],\n [\n 121.097218,\n 30.85704\n ],\n [\n 121.123087,\n 30.778936\n ],\n [\n 121.217942,\n 30.785105\n ],\n [\n 121.274608,\n 30.677615\n ],\n [\n 121.058413,\n 30.563823\n ],\n [\n 121.225333,\n 30.404496\n ],\n [\n 121.328195,\n 30.397271\n ],\n [\n 121.497578,\n 30.258864\n ],\n [\n 121.632469,\n 30.072119\n ],\n [\n 121.721164,\n 29.992865\n ],\n [\n 121.78399,\n 29.993383\n ],\n [\n 121.919497,\n 29.920808\n ],\n [\n 121.968156,\n 29.956584\n ],\n [\n 122.00696,\n 29.891764\n ],\n [\n 122.140003,\n 29.901619\n ],\n [\n 122.10243,\n 29.859597\n ],\n [\n 121.997721,\n 29.759919\n ],\n [\n 121.937359,\n 29.748491\n ],\n [\n 121.833265,\n 29.653382\n ],\n [\n 121.966308,\n 29.635702\n ],\n [\n 122.000185,\n 29.582642\n ],\n [\n 121.968772,\n 29.515497\n ],\n [\n 121.993409,\n 29.451954\n ],\n [\n 121.937975,\n 29.384201\n ],\n [\n 121.986634,\n 29.15507\n ],\n [\n 121.966308,\n 29.053128\n ],\n [\n 121.884388,\n 29.105419\n ],\n [\n 121.780294,\n 29.109601\n ],\n [\n 121.767975,\n 29.166565\n ],\n [\n 121.660186,\n 29.118487\n ],\n [\n 121.774751,\n 28.864138\n ],\n [\n 121.668193,\n 28.873046\n ],\n [\n 121.704534,\n 28.816443\n ],\n [\n 121.689135,\n 28.719415\n ],\n [\n 121.540694,\n 28.655379\n ],\n [\n 121.634317,\n 28.56293\n ],\n [\n 121.687287,\n 28.40095\n ],\n [\n 121.627541,\n 28.251899\n ],\n [\n 121.499426,\n 28.306171\n ],\n [\n 121.373774,\n 28.133246\n ],\n [\n 121.288159,\n 28.144854\n ],\n [\n 121.261057,\n 28.034533\n ],\n [\n 121.140949,\n 28.031364\n ],\n [\n 121.108304,\n 28.13905\n ],\n [\n 121.059029,\n 28.096305\n ],\n [\n 120.991892,\n 27.95\n ],\n [\n 121.05595,\n 27.900306\n ],\n [\n 121.162507,\n 27.90718\n ],\n [\n 121.152652,\n 27.810376\n ],\n [\n 121.153268,\n 27.809847\n ],\n [\n 121.149572,\n 27.801908\n ],\n [\n 121.149572,\n 27.801379\n ],\n [\n 121.149572,\n 27.80085\n ],\n [\n 121.13479,\n 27.787088\n ],\n [\n 121.134174,\n 27.787088\n ],\n [\n 121.152036,\n 27.815139\n ],\n [\n 121.027616,\n 27.832601\n ],\n [\n 120.942001,\n 27.896605\n ],\n [\n 120.797871,\n 27.779677\n ],\n [\n 120.634647,\n 27.577271\n ],\n [\n 120.703016,\n 27.478581\n ],\n [\n 120.673451,\n 27.369708\n ],\n [\n 120.572437,\n 27.313903\n ],\n [\n 120.544104,\n 27.154303\n ],\n [\n 120.461568,\n 27.14259\n ]\n ]\n ],\n [\n [\n [\n 122.301379,\n 29.942068\n ],\n [\n 122.163408,\n 29.988201\n ],\n [\n 122.038989,\n 29.989756\n ],\n [\n 121.991561,\n 30.075743\n ],\n [\n 121.990945,\n 30.076261\n ],\n [\n 121.952757,\n 30.183898\n ],\n [\n 122.152938,\n 30.113015\n ],\n [\n 122.293988,\n 30.100075\n ],\n [\n 122.347574,\n 30.014109\n ],\n [\n 122.301379,\n 29.942068\n ]\n ]\n ],\n [\n [\n [\n 122.100583,\n 30.304333\n ],\n [\n 122.228082,\n 30.329641\n ],\n [\n 122.22993,\n 30.232503\n ],\n [\n 122.058083,\n 30.291934\n ],\n [\n 122.100583,\n 30.304333\n ]\n ]\n ],\n [\n [\n [\n 122.317393,\n 30.249561\n ],\n [\n 122.40732,\n 30.272817\n ],\n [\n 122.397465,\n 30.225266\n ],\n [\n 122.317393,\n 30.249561\n ]\n ]\n ],\n [\n [\n [\n 122.435038,\n 29.906287\n ],\n [\n 122.391922,\n 29.831573\n ],\n [\n 122.327248,\n 29.922883\n ],\n [\n 122.411632,\n 29.951918\n ],\n [\n 122.435038,\n 29.906287\n ]\n ]\n ],\n [\n [\n [\n 122.353734,\n 30.464339\n ],\n [\n 122.423335,\n 30.408624\n ],\n [\n 122.281669,\n 30.418944\n ],\n [\n 122.277973,\n 30.471558\n ],\n [\n 122.353734,\n 30.464339\n ]\n ]\n ],\n [\n [\n [\n 122.303843,\n 29.832611\n ],\n [\n 122.310002,\n 29.766671\n ],\n [\n 122.221307,\n 29.832611\n ],\n [\n 122.303843,\n 29.832611\n ]\n ]\n ],\n [\n [\n [\n 122.13138,\n 29.673659\n ],\n [\n 122.047612,\n 29.719396\n ],\n [\n 122.130148,\n 29.79056\n ],\n [\n 122.200981,\n 29.711082\n ],\n [\n 122.192358,\n 29.655462\n ],\n [\n 122.13138,\n 29.673659\n ]\n ]\n ],\n [\n [\n [\n 121.943518,\n 30.77688\n ],\n [\n 121.970004,\n 30.789217\n ],\n [\n 122.011271,\n 30.669381\n ],\n [\n 121.968156,\n 30.68842\n ],\n [\n 121.943518,\n 30.77688\n ]\n ]\n ],\n [\n [\n [\n 121.874533,\n 29.964878\n ],\n [\n 121.835113,\n 29.992865\n ],\n [\n 121.855439,\n 30.085062\n ],\n [\n 121.924424,\n 30.052441\n ],\n [\n 121.933047,\n 29.994938\n ],\n [\n 121.874533,\n 29.964878\n ]\n ]\n ],\n [\n [\n [\n 122.155401,\n 29.97058\n ],\n [\n 122.154169,\n 29.971098\n ],\n [\n 122.152322,\n 29.971098\n ],\n [\n 122.163408,\n 29.988201\n ],\n [\n 122.155401,\n 29.97058\n ]\n ]\n ],\n [\n [\n [\n 121.136638,\n 27.948414\n ],\n [\n 121.041783,\n 27.943657\n ],\n [\n 121.0695,\n 27.984349\n ],\n [\n 121.136638,\n 27.948414\n ]\n ]\n ],\n [\n [\n [\n 121.134174,\n 27.786029\n ],\n [\n 121.134174,\n 27.787088\n ],\n [\n 121.13479,\n 27.787088\n ],\n [\n 121.134174,\n 27.786029\n ]\n ]\n ],\n [\n [\n [\n 122.152322,\n 29.971098\n ],\n [\n 122.154169,\n 29.971098\n ],\n [\n 122.155401,\n 29.97058\n ],\n [\n 122.152322,\n 29.971098\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 340000,\n \"name\": \"安徽省\",\n \"center\": [\n 117.283042,\n 31.86119\n ],\n \"centroid\": [\n 117.226894,\n 31.849585\n ],\n \"childrenNum\": 16,\n \"level\": \"province\",\n \"subFeatureIndex\": 11,\n \"acroutes\": [\n 100000\n ],\n \"parent\": {\n \"adcode\": 100000\n }\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 115.5088,\n 32.468777\n ],\n [\n 115.409018,\n 32.549005\n ],\n [\n 115.304924,\n 32.553039\n ],\n [\n 115.20083,\n 32.591864\n ],\n [\n 115.183584,\n 32.665937\n ],\n [\n 115.197135,\n 32.85613\n ],\n [\n 115.139237,\n 32.897837\n ],\n [\n 114.943368,\n 32.935005\n ],\n [\n 114.883006,\n 32.990227\n ],\n [\n 114.925506,\n 33.016821\n ],\n [\n 114.902716,\n 33.129632\n ],\n [\n 114.966158,\n 33.147167\n ],\n [\n 115.042534,\n 33.08653\n ],\n [\n 115.168186,\n 33.088535\n ],\n [\n 115.301229,\n 33.141657\n ],\n [\n 115.365286,\n 33.335826\n ],\n [\n 115.312931,\n 33.376307\n ],\n [\n 115.345576,\n 33.503125\n ],\n [\n 115.421953,\n 33.556992\n ],\n [\n 115.639995,\n 33.584909\n ],\n [\n 115.563003,\n 33.771624\n ],\n [\n 115.614126,\n 33.775603\n ],\n [\n 115.629524,\n 33.871536\n ],\n [\n 115.546988,\n 33.875014\n ],\n [\n 115.60735,\n 34.030359\n ],\n [\n 115.736082,\n 34.076957\n ],\n [\n 115.877132,\n 34.003083\n ],\n [\n 115.95782,\n 34.007547\n ],\n [\n 116.00032,\n 33.964881\n ],\n [\n 115.987385,\n 33.900842\n ],\n [\n 116.05945,\n 33.861103\n ],\n [\n 116.074232,\n 33.781571\n ],\n [\n 116.155536,\n 33.709929\n ],\n [\n 116.263326,\n 33.729835\n ],\n [\n 116.316297,\n 33.771127\n ],\n [\n 116.437021,\n 33.801461\n ],\n [\n 116.437637,\n 33.846694\n ],\n [\n 116.64336,\n 33.896869\n ],\n [\n 116.648288,\n 33.973317\n ],\n [\n 116.575607,\n 34.069028\n ],\n [\n 116.575607,\n 34.069028\n ],\n [\n 116.530643,\n 34.107183\n ],\n [\n 116.565752,\n 34.173541\n ],\n [\n 116.516477,\n 34.296217\n ],\n [\n 116.409303,\n 34.273971\n ],\n [\n 116.409303,\n 34.273971\n ],\n [\n 116.26271,\n 34.375762\n ],\n [\n 116.213435,\n 34.382181\n ],\n [\n 116.162312,\n 34.459178\n ],\n [\n 116.204196,\n 34.508497\n ],\n [\n 116.196804,\n 34.576017\n ],\n [\n 116.240536,\n 34.552367\n ],\n [\n 116.281188,\n 34.60754\n ],\n [\n 116.374195,\n 34.640036\n ],\n [\n 116.429629,\n 34.652834\n ],\n [\n 116.491839,\n 34.57109\n ],\n [\n 116.595933,\n 34.510469\n ],\n [\n 116.574991,\n 34.488773\n ],\n [\n 116.774555,\n 34.452764\n ],\n [\n 116.828142,\n 34.389094\n ],\n [\n 116.969192,\n 34.387613\n ],\n [\n 116.971656,\n 34.279409\n ],\n [\n 117.04988,\n 34.242321\n ],\n [\n 117.025243,\n 34.167106\n ],\n [\n 117.192778,\n 34.068532\n ],\n [\n 117.352922,\n 34.089842\n ],\n [\n 117.410205,\n 34.026888\n ],\n [\n 117.514914,\n 34.061097\n ],\n [\n 117.575892,\n 33.982744\n ],\n [\n 117.629479,\n 34.028872\n ],\n [\n 117.715095,\n 33.879485\n ],\n [\n 117.758826,\n 33.885445\n ],\n [\n 117.752667,\n 33.711422\n ],\n [\n 117.805638,\n 33.736304\n ],\n [\n 117.901724,\n 33.719883\n ],\n [\n 118.116071,\n 33.767645\n ],\n [\n 118.16781,\n 33.66313\n ],\n [\n 118.112376,\n 33.617302\n ],\n [\n 118.108064,\n 33.475181\n ],\n [\n 118.050782,\n 33.492148\n ],\n [\n 117.971941,\n 33.277821\n ],\n [\n 117.939297,\n 33.262813\n ],\n [\n 118.038463,\n 33.134642\n ],\n [\n 118.221397,\n 33.182228\n ],\n [\n 118.244803,\n 32.998256\n ],\n [\n 118.293462,\n 32.947056\n ],\n [\n 118.2331,\n 32.914414\n ],\n [\n 118.250346,\n 32.84859\n ],\n [\n 118.375382,\n 32.718809\n ],\n [\n 118.707373,\n 32.720319\n ],\n [\n 118.756648,\n 32.737433\n ],\n [\n 118.74125,\n 32.850601\n ],\n [\n 118.811467,\n 32.854622\n ],\n [\n 118.849039,\n 32.956596\n ],\n [\n 118.995017,\n 32.958604\n ],\n [\n 119.104038,\n 32.82647\n ],\n [\n 119.184726,\n 32.825465\n ],\n [\n 119.22045,\n 32.57674\n ],\n [\n 119.084944,\n 32.452622\n ],\n [\n 119.041212,\n 32.515207\n ],\n [\n 118.978386,\n 32.504106\n ],\n [\n 118.922336,\n 32.557074\n ],\n [\n 118.92172,\n 32.557074\n ],\n [\n 118.922336,\n 32.557074\n ],\n [\n 118.92172,\n 32.557074\n ],\n [\n 118.719076,\n 32.614042\n ],\n [\n 118.719076,\n 32.614042\n ],\n [\n 118.563859,\n 32.56363\n ],\n [\n 118.592192,\n 32.481396\n ],\n [\n 118.69259,\n 32.463224\n ],\n [\n 118.69567,\n 32.31721\n ],\n [\n 118.642083,\n 32.208937\n ],\n [\n 118.522591,\n 32.188178\n ],\n [\n 118.499801,\n 32.1203\n ],\n [\n 118.400019,\n 32.077724\n ],\n [\n 118.363679,\n 31.930581\n ],\n [\n 118.504729,\n 31.841674\n ],\n [\n 118.481939,\n 31.778117\n ],\n [\n 118.552772,\n 31.729275\n ],\n [\n 118.638388,\n 31.759295\n ],\n [\n 118.697518,\n 31.709935\n ],\n [\n 118.643931,\n 31.65138\n ],\n [\n 118.736938,\n 31.634061\n ],\n [\n 118.77451,\n 31.682444\n ],\n [\n 118.804691,\n 31.618268\n ],\n [\n 118.858278,\n 31.624382\n ],\n [\n 118.873061,\n 31.53569\n ],\n [\n 118.866285,\n 31.527021\n ],\n [\n 118.870597,\n 31.526001\n ],\n [\n 118.876756,\n 31.532631\n ],\n [\n 118.853967,\n 31.39841\n ],\n [\n 118.745561,\n 31.37287\n ],\n [\n 118.728931,\n 31.281384\n ],\n [\n 118.781286,\n 31.239956\n ],\n [\n 119.075089,\n 31.232282\n ],\n [\n 119.199508,\n 31.293655\n ],\n [\n 119.267878,\n 31.250698\n ],\n [\n 119.379979,\n 31.269622\n ],\n [\n 119.388602,\n 31.194415\n ],\n [\n 119.388602,\n 31.194415\n ],\n [\n 119.460051,\n 31.156533\n ],\n [\n 119.623891,\n 31.130416\n ],\n [\n 119.633746,\n 31.019724\n ],\n [\n 119.585702,\n 30.976642\n ],\n [\n 119.575847,\n 30.829814\n ],\n [\n 119.479761,\n 30.772253\n ],\n [\n 119.482841,\n 30.70437\n ],\n [\n 119.416935,\n 30.642101\n ],\n [\n 119.386754,\n 30.685333\n ],\n [\n 119.312225,\n 30.620993\n ],\n [\n 119.238929,\n 30.60915\n ],\n [\n 119.237081,\n 30.54682\n ],\n [\n 119.326392,\n 30.532906\n ],\n [\n 119.36766,\n 30.384885\n ],\n [\n 119.246936,\n 30.341002\n ],\n [\n 119.201356,\n 30.290901\n ],\n [\n 119.06277,\n 30.304849\n ],\n [\n 118.954365,\n 30.360106\n ],\n [\n 118.880452,\n 30.31518\n ],\n [\n 118.929727,\n 30.202515\n ],\n [\n 118.847807,\n 30.163208\n ],\n [\n 118.902626,\n 30.029133\n ],\n [\n 118.894619,\n 29.93792\n ],\n [\n 118.755416,\n 29.845586\n ],\n [\n 118.744945,\n 29.738621\n ],\n [\n 118.644547,\n 29.641942\n ],\n [\n 118.573714,\n 29.638302\n ],\n [\n 118.500417,\n 29.575877\n ],\n [\n 118.496106,\n 29.519662\n ],\n [\n 118.310708,\n 29.49623\n ],\n [\n 118.316252,\n 29.422774\n ],\n [\n 118.193064,\n 29.395149\n ],\n [\n 118.136397,\n 29.419125\n ],\n [\n 118.134549,\n 29.508728\n ],\n [\n 118.008282,\n 29.578479\n ],\n [\n 117.872775,\n 29.547774\n ],\n [\n 117.807486,\n 29.573796\n ],\n [\n 117.707703,\n 29.548815\n ],\n [\n 117.647957,\n 29.614897\n ],\n [\n 117.545711,\n 29.594089\n ],\n [\n 117.532161,\n 29.651822\n ],\n [\n 117.453936,\n 29.688214\n ],\n [\n 117.455168,\n 29.749011\n ],\n [\n 117.384335,\n 29.84351\n ],\n [\n 117.29256,\n 29.822749\n ],\n [\n 117.246365,\n 29.915104\n ],\n [\n 117.17738,\n 29.921846\n ],\n [\n 117.073286,\n 29.832092\n ],\n [\n 117.136728,\n 29.7755\n ],\n [\n 117.112706,\n 29.712121\n ],\n [\n 116.780715,\n 29.570153\n ],\n [\n 116.651983,\n 29.637262\n ],\n [\n 116.677237,\n 29.66898\n ],\n [\n 116.694483,\n 29.672099\n ],\n [\n 116.694483,\n 29.672099\n ],\n [\n 116.717273,\n 29.690813\n ],\n [\n 116.710498,\n 29.69705\n ],\n [\n 116.709882,\n 29.69757\n ],\n [\n 116.706186,\n 29.69809\n ],\n [\n 116.698795,\n 29.707964\n ],\n [\n 116.684012,\n 29.72823\n ],\n [\n 116.789954,\n 29.795233\n ],\n [\n 116.882961,\n 29.89332\n ],\n [\n 116.900207,\n 29.949326\n ],\n [\n 116.83307,\n 29.957621\n ],\n [\n 116.747454,\n 30.057101\n ],\n [\n 116.666766,\n 30.076779\n ],\n [\n 116.586078,\n 30.046226\n ],\n [\n 116.552201,\n 29.909918\n ],\n [\n 116.473361,\n 29.89747\n ],\n [\n 116.26271,\n 29.782251\n ],\n [\n 116.207891,\n 29.82742\n ],\n [\n 116.13521,\n 29.819634\n ],\n [\n 116.127203,\n 29.899544\n ],\n [\n 116.073616,\n 29.970061\n ],\n [\n 116.091479,\n 30.036385\n ],\n [\n 116.065609,\n 30.204584\n ],\n [\n 115.985537,\n 30.290901\n ],\n [\n 115.903001,\n 30.313631\n ],\n [\n 115.921479,\n 30.416364\n ],\n [\n 115.876516,\n 30.582368\n ],\n [\n 115.819234,\n 30.59782\n ],\n [\n 115.762567,\n 30.685848\n ],\n [\n 115.782893,\n 30.751687\n ],\n [\n 115.851262,\n 30.756829\n ],\n [\n 115.865429,\n 30.864231\n ],\n [\n 115.976298,\n 30.931488\n ],\n [\n 116.071769,\n 30.956633\n ],\n [\n 116.058834,\n 31.012545\n ],\n [\n 115.938726,\n 31.047409\n ],\n [\n 115.869125,\n 31.147828\n ],\n [\n 115.763799,\n 31.118123\n ],\n [\n 115.700973,\n 31.201068\n ],\n [\n 115.646155,\n 31.209768\n ],\n [\n 115.559307,\n 31.160117\n ],\n [\n 115.516191,\n 31.263485\n ],\n [\n 115.457677,\n 31.281384\n ],\n [\n 115.442279,\n 31.346303\n ],\n [\n 115.372062,\n 31.349368\n ],\n [\n 115.373909,\n 31.405559\n ],\n [\n 115.371446,\n 31.495905\n ],\n [\n 115.496481,\n 31.674297\n ],\n [\n 115.660937,\n 31.760822\n ],\n [\n 115.767495,\n 31.787272\n ],\n [\n 115.816154,\n 31.762348\n ],\n [\n 115.909777,\n 31.791849\n ],\n [\n 115.893146,\n 31.833033\n ],\n [\n 115.931334,\n 31.994541\n ],\n [\n 115.941805,\n 32.166402\n ],\n [\n 115.912856,\n 32.227666\n ],\n [\n 115.899306,\n 32.391005\n ],\n [\n 115.845719,\n 32.501583\n ],\n [\n 115.789052,\n 32.468777\n ],\n [\n 115.706517,\n 32.494014\n ],\n [\n 115.667712,\n 32.409696\n ],\n [\n 115.567314,\n 32.421819\n ],\n [\n 115.509416,\n 32.466758\n ],\n [\n 115.510648,\n 32.467768\n ],\n [\n 115.510648,\n 32.468272\n ],\n [\n 115.510648,\n 32.468777\n ],\n [\n 115.5088,\n 32.468777\n ]\n ]\n ],\n [\n [\n [\n 116.717273,\n 29.690813\n ],\n [\n 116.694483,\n 29.672099\n ],\n [\n 116.694483,\n 29.672099\n ],\n [\n 116.677237,\n 29.66898\n ],\n [\n 116.684012,\n 29.72823\n ],\n [\n 116.698795,\n 29.707964\n ],\n [\n 116.706186,\n 29.69809\n ],\n [\n 116.709882,\n 29.69757\n ],\n [\n 116.710498,\n 29.69705\n ],\n [\n 116.709882,\n 29.69757\n ],\n [\n 116.717273,\n 29.690813\n ]\n ]\n ],\n [\n [\n [\n 118.873061,\n 31.53569\n ],\n [\n 118.876756,\n 31.532631\n ],\n [\n 118.870597,\n 31.526001\n ],\n [\n 118.866285,\n 31.527021\n ],\n [\n 118.873061,\n 31.53569\n ]\n ]\n ],\n [\n [\n [\n 115.510648,\n 32.468777\n ],\n [\n 115.510648,\n 32.468272\n ],\n [\n 115.510648,\n 32.467768\n ],\n [\n 115.509416,\n 32.466758\n ],\n [\n 115.5088,\n 32.468777\n ],\n [\n 115.510648,\n 32.468777\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 350000,\n \"name\": \"福建省\",\n \"center\": [\n 119.306239,\n 26.075302\n ],\n \"centroid\": [\n 118.005928,\n 26.070282\n ],\n \"childrenNum\": 9,\n \"level\": \"province\",\n \"subFeatureIndex\": 12,\n \"acroutes\": [\n 100000\n ],\n \"parent\": {\n \"adcode\": 100000\n }\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 120.461568,\n 27.14259\n ],\n [\n 120.393199,\n 27.081343\n ],\n [\n 120.287257,\n 27.094128\n ],\n [\n 120.29588,\n 27.035519\n ],\n [\n 120.231823,\n 26.907006\n ],\n [\n 120.117258,\n 26.916609\n ],\n [\n 120.047041,\n 26.824809\n ],\n [\n 120.1382,\n 26.79704\n ],\n [\n 120.165917,\n 26.73133\n ],\n [\n 120.110483,\n 26.692848\n ],\n [\n 120.1382,\n 26.637775\n ],\n [\n 119.967585,\n 26.597657\n ],\n [\n 119.896136,\n 26.516306\n ],\n [\n 119.827767,\n 26.524872\n ],\n [\n 119.851788,\n 26.595516\n ],\n [\n 119.949107,\n 26.624404\n ],\n [\n 120.052584,\n 26.786892\n ],\n [\n 119.942947,\n 26.784756\n ],\n [\n 119.86965,\n 26.642588\n ],\n [\n 119.83023,\n 26.69071\n ],\n [\n 119.711354,\n 26.686433\n ],\n [\n 119.665159,\n 26.725986\n ],\n [\n 119.577695,\n 26.622264\n ],\n [\n 119.788346,\n 26.58321\n ],\n [\n 119.876426,\n 26.359867\n ],\n [\n 119.962657,\n 26.373269\n ],\n [\n 119.8986,\n 26.308388\n ],\n [\n 119.841317,\n 26.322333\n ],\n [\n 119.668854,\n 26.256887\n ],\n [\n 119.604181,\n 26.168853\n ],\n [\n 119.668854,\n 26.025924\n ],\n [\n 119.723673,\n 26.011406\n ],\n [\n 119.688564,\n 25.897892\n ],\n [\n 119.632514,\n 25.884436\n ],\n [\n 119.635594,\n 25.746011\n ],\n [\n 119.601101,\n 25.683479\n ],\n [\n 119.472986,\n 25.662448\n ],\n [\n 119.586934,\n 25.592317\n ],\n [\n 119.634362,\n 25.475161\n ],\n [\n 119.716898,\n 25.550758\n ],\n [\n 119.716898,\n 25.551838\n ],\n [\n 119.683637,\n 25.592856\n ],\n [\n 119.785883,\n 25.667841\n ],\n [\n 119.790194,\n 25.614439\n ],\n [\n 119.883817,\n 25.54644\n ],\n [\n 119.812368,\n 25.523225\n ],\n [\n 119.864107,\n 25.479482\n ],\n [\n 119.764325,\n 25.433562\n ],\n [\n 119.773564,\n 25.395732\n ],\n [\n 119.646064,\n 25.460576\n ],\n [\n 119.649144,\n 25.34275\n ],\n [\n 119.549362,\n 25.367082\n ],\n [\n 119.48592,\n 25.364919\n ],\n [\n 119.490232,\n 25.447069\n ],\n [\n 119.438493,\n 25.412487\n ],\n [\n 119.452044,\n 25.490824\n ],\n [\n 119.36458,\n 25.521065\n ],\n [\n 119.354725,\n 25.427077\n ],\n [\n 119.288204,\n 25.410865\n ],\n [\n 119.256175,\n 25.488664\n ],\n [\n 119.14469,\n 25.388165\n ],\n [\n 119.299291,\n 25.32869\n ],\n [\n 119.380595,\n 25.250247\n ],\n [\n 119.293131,\n 25.23347\n ],\n [\n 119.26911,\n 25.15984\n ],\n [\n 119.131755,\n 25.223187\n ],\n [\n 119.165632,\n 25.145217\n ],\n [\n 119.119436,\n 25.012447\n ],\n [\n 119.107118,\n 25.075327\n ],\n [\n 119.035669,\n 25.125717\n ],\n [\n 119.081248,\n 25.218856\n ],\n [\n 118.989473,\n 25.202075\n ],\n [\n 118.996864,\n 25.266481\n ],\n [\n 118.911249,\n 25.241589\n ],\n [\n 118.981466,\n 25.19612\n ],\n [\n 118.975923,\n 25.118133\n ],\n [\n 118.868133,\n 25.082372\n ],\n [\n 118.928495,\n 25.025459\n ],\n [\n 119.02335,\n 25.04877\n ],\n [\n 118.989473,\n 24.973944\n ],\n [\n 119.032589,\n 24.962011\n ],\n [\n 119.032589,\n 24.961468\n ],\n [\n 118.918024,\n 24.924034\n ],\n [\n 118.96114,\n 24.871933\n ],\n [\n 118.86259,\n 24.886589\n ],\n [\n 118.650707,\n 24.808949\n ],\n [\n 118.786213,\n 24.776358\n ],\n [\n 118.703677,\n 24.665485\n ],\n [\n 118.675344,\n 24.57628\n ],\n [\n 118.558316,\n 24.512602\n ],\n [\n 118.557084,\n 24.573016\n ],\n [\n 118.444367,\n 24.614907\n ],\n [\n 118.355056,\n 24.534376\n ],\n [\n 118.242955,\n 24.512602\n ],\n [\n 118.134549,\n 24.575736\n ],\n [\n 118.12531,\n 24.571927\n ],\n [\n 118.048934,\n 24.418385\n ],\n [\n 118.088354,\n 24.409123\n ],\n [\n 118.158571,\n 24.270111\n ],\n [\n 118.001507,\n 24.176805\n ],\n [\n 117.762522,\n 23.88718\n ],\n [\n 117.671979,\n 23.877879\n ],\n [\n 117.612849,\n 23.71364\n ],\n [\n 117.500132,\n 23.703232\n ],\n [\n 117.463791,\n 23.58539\n ],\n [\n 117.387415,\n 23.555228\n ],\n [\n 117.192778,\n 23.561809\n ],\n [\n 117.192778,\n 23.629799\n ],\n [\n 117.053576,\n 23.696657\n ],\n [\n 117.012308,\n 23.855446\n ],\n [\n 116.980279,\n 23.881709\n ],\n [\n 116.981511,\n 23.999282\n ],\n [\n 116.939627,\n 24.033713\n ],\n [\n 116.9347,\n 24.127123\n ],\n [\n 116.998757,\n 24.178988\n ],\n [\n 116.933468,\n 24.21992\n ],\n [\n 116.903903,\n 24.369888\n ],\n [\n 116.860787,\n 24.462507\n ],\n [\n 116.789338,\n 24.50988\n ],\n [\n 116.761005,\n 24.58281\n ],\n [\n 116.815207,\n 24.655154\n ],\n [\n 116.778867,\n 24.680165\n ],\n [\n 116.597165,\n 24.65461\n ],\n [\n 116.525716,\n 24.604572\n ],\n [\n 116.486912,\n 24.71876\n ],\n [\n 116.44626,\n 24.714412\n ],\n [\n 116.376659,\n 24.820353\n ],\n [\n 116.245464,\n 24.793197\n ],\n [\n 116.18079,\n 24.87519\n ],\n [\n 116.068073,\n 24.849675\n ],\n [\n 116.014486,\n 24.905584\n ],\n [\n 115.89253,\n 24.937056\n ],\n [\n 115.873436,\n 25.020038\n ],\n [\n 115.928255,\n 25.050396\n ],\n [\n 115.880212,\n 25.092126\n ],\n [\n 115.855574,\n 25.209654\n ],\n [\n 115.929487,\n 25.234553\n ],\n [\n 116.008327,\n 25.319496\n ],\n [\n 116.005247,\n 25.490284\n ],\n [\n 116.063145,\n 25.563173\n ],\n [\n 116.067457,\n 25.703967\n ],\n [\n 116.18079,\n 25.774571\n ],\n [\n 116.131515,\n 25.82413\n ],\n [\n 116.176478,\n 25.893048\n ],\n [\n 116.258398,\n 25.902736\n ],\n [\n 116.36434,\n 25.960312\n ],\n [\n 116.383434,\n 26.029687\n ],\n [\n 116.489375,\n 26.113529\n ],\n [\n 116.471513,\n 26.175296\n ],\n [\n 116.396985,\n 26.166168\n ],\n [\n 116.412999,\n 26.298197\n ],\n [\n 116.519557,\n 26.410251\n ],\n [\n 116.601476,\n 26.372733\n ],\n [\n 116.610716,\n 26.477216\n ],\n [\n 116.539267,\n 26.559129\n ],\n [\n 116.566368,\n 26.650075\n ],\n [\n 116.516477,\n 26.69071\n ],\n [\n 116.557745,\n 26.774073\n ],\n [\n 116.548506,\n 26.839758\n ],\n [\n 116.679085,\n 26.978479\n ],\n [\n 116.910062,\n 27.034453\n ],\n [\n 117.05296,\n 27.100519\n ],\n [\n 117.043721,\n 27.139928\n ],\n [\n 117.171836,\n 27.290509\n ],\n [\n 117.100387,\n 27.338886\n ],\n [\n 117.133032,\n 27.4223\n ],\n [\n 117.084989,\n 27.564011\n ],\n [\n 117.01662,\n 27.563481\n ],\n [\n 117.040641,\n 27.670043\n ],\n [\n 117.096692,\n 27.626582\n ],\n [\n 117.118865,\n 27.694416\n ],\n [\n 117.204481,\n 27.683819\n ],\n [\n 117.296872,\n 27.764854\n ],\n [\n 117.27901,\n 27.870161\n ],\n [\n 117.341836,\n 27.855879\n ],\n [\n 117.52169,\n 27.982236\n ],\n [\n 117.608537,\n 27.863814\n ],\n [\n 117.740348,\n 27.800321\n ],\n [\n 117.78716,\n 27.896076\n ],\n [\n 117.856145,\n 27.945772\n ],\n [\n 117.999043,\n 27.991218\n ],\n [\n 118.096977,\n 27.96744\n ],\n [\n 118.155491,\n 28.061992\n ],\n [\n 118.356288,\n 28.091555\n ],\n [\n 118.37415,\n 28.188106\n ],\n [\n 118.314404,\n 28.22238\n ],\n [\n 118.433896,\n 28.288786\n ],\n [\n 118.444367,\n 28.25348\n ],\n [\n 118.587881,\n 28.28299\n ],\n [\n 118.674728,\n 28.271398\n ],\n [\n 118.700598,\n 28.310912\n ],\n [\n 118.802228,\n 28.240303\n ],\n [\n 118.771431,\n 28.188634\n ],\n [\n 118.802228,\n 28.117416\n ],\n [\n 118.719076,\n 28.063576\n ],\n [\n 118.730163,\n 27.970611\n ],\n [\n 118.818242,\n 27.916697\n ],\n [\n 118.913713,\n 27.61651\n ],\n [\n 118.869365,\n 27.54014\n ],\n [\n 118.903858,\n 27.462125\n ],\n [\n 118.983314,\n 27.498751\n ],\n [\n 119.194581,\n 27.418582\n ],\n [\n 119.267878,\n 27.421237\n ],\n [\n 119.376899,\n 27.534835\n ],\n [\n 119.474833,\n 27.539079\n ],\n [\n 119.501319,\n 27.649905\n ],\n [\n 119.644217,\n 27.663684\n ],\n [\n 119.630666,\n 27.582574\n ],\n [\n 119.70889,\n 27.514141\n ],\n [\n 119.685485,\n 27.438762\n ],\n [\n 119.770484,\n 27.305928\n ],\n [\n 119.843165,\n 27.300611\n ],\n [\n 120.007005,\n 27.376084\n ],\n [\n 120.052584,\n 27.338886\n ],\n [\n 120.13512,\n 27.420175\n ],\n [\n 120.26262,\n 27.432921\n ],\n [\n 120.34146,\n 27.39946\n ],\n [\n 120.430155,\n 27.258601\n ],\n [\n 120.401206,\n 27.211253\n ],\n [\n 120.461568,\n 27.14259\n ]\n ]\n ],\n [\n [\n [\n 118.412338,\n 24.514235\n ],\n [\n 118.477012,\n 24.437452\n ],\n [\n 118.335962,\n 24.385148\n ],\n [\n 118.316252,\n 24.487557\n ],\n [\n 118.374766,\n 24.458695\n ],\n [\n 118.412338,\n 24.514235\n ]\n ]\n ],\n [\n [\n [\n 119.532116,\n 25.203158\n ],\n [\n 119.549362,\n 25.162007\n ],\n [\n 119.444036,\n 25.202075\n ],\n [\n 119.473601,\n 25.259988\n ],\n [\n 119.532116,\n 25.203158\n ]\n ]\n ],\n [\n [\n [\n 118.079115,\n 24.444533\n ],\n [\n 118.093281,\n 24.540907\n ],\n [\n 118.142557,\n 24.561588\n ],\n [\n 118.20723,\n 24.487012\n ],\n [\n 118.143173,\n 24.421109\n ],\n [\n 118.079115,\n 24.444533\n ]\n ]\n ],\n [\n [\n [\n 119.737224,\n 26.646332\n ],\n [\n 119.668238,\n 26.628683\n ],\n [\n 119.673782,\n 26.681087\n ],\n [\n 119.737224,\n 26.646332\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 360000,\n \"name\": \"江西省\",\n \"center\": [\n 115.892151,\n 28.676493\n ],\n \"centroid\": [\n 115.732937,\n 27.636129\n ],\n \"childrenNum\": 11,\n \"level\": \"province\",\n \"subFeatureIndex\": 13,\n \"acroutes\": [\n 100000\n ],\n \"parent\": {\n \"adcode\": 100000\n }\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 113.94185,\n 29.047374\n ],\n [\n 113.952321,\n 29.092871\n ],\n [\n 114.061959,\n 29.204176\n ],\n [\n 114.252284,\n 29.234985\n ],\n [\n 114.259059,\n 29.344049\n ],\n [\n 114.519602,\n 29.325271\n ],\n [\n 114.660652,\n 29.393585\n ],\n [\n 114.759818,\n 29.363345\n ],\n [\n 114.931049,\n 29.422252\n ],\n [\n 114.860216,\n 29.475917\n ],\n [\n 114.940904,\n 29.494147\n ],\n [\n 115.00065,\n 29.572235\n ],\n [\n 115.154019,\n 29.51029\n ],\n [\n 115.142316,\n 29.651822\n ],\n [\n 115.359127,\n 29.646623\n ],\n [\n 115.471844,\n 29.742777\n ],\n [\n 115.511264,\n 29.839877\n ],\n [\n 115.667712,\n 29.850257\n ],\n [\n 115.837096,\n 29.748491\n ],\n [\n 115.965827,\n 29.724593\n ],\n [\n 116.13521,\n 29.819634\n ],\n [\n 116.207891,\n 29.82742\n ],\n [\n 116.26271,\n 29.782251\n ],\n [\n 116.473361,\n 29.89747\n ],\n [\n 116.552201,\n 29.909918\n ],\n [\n 116.586078,\n 30.046226\n ],\n [\n 116.666766,\n 30.076779\n ],\n [\n 116.747454,\n 30.057101\n ],\n [\n 116.83307,\n 29.957621\n ],\n [\n 116.900207,\n 29.949326\n ],\n [\n 116.882961,\n 29.89332\n ],\n [\n 116.789954,\n 29.795233\n ],\n [\n 116.684012,\n 29.72823\n ],\n [\n 116.677237,\n 29.66898\n ],\n [\n 116.651983,\n 29.637262\n ],\n [\n 116.780715,\n 29.570153\n ],\n [\n 117.112706,\n 29.712121\n ],\n [\n 117.136728,\n 29.7755\n ],\n [\n 117.073286,\n 29.832092\n ],\n [\n 117.17738,\n 29.921846\n ],\n [\n 117.246365,\n 29.915104\n ],\n [\n 117.29256,\n 29.822749\n ],\n [\n 117.384335,\n 29.84351\n ],\n [\n 117.455168,\n 29.749011\n ],\n [\n 117.453936,\n 29.688214\n ],\n [\n 117.532161,\n 29.651822\n ],\n [\n 117.545711,\n 29.594089\n ],\n [\n 117.647957,\n 29.614897\n ],\n [\n 117.707703,\n 29.548815\n ],\n [\n 117.807486,\n 29.573796\n ],\n [\n 117.872775,\n 29.547774\n ],\n [\n 118.008282,\n 29.578479\n ],\n [\n 118.134549,\n 29.508728\n ],\n [\n 118.136397,\n 29.419125\n ],\n [\n 118.193064,\n 29.395149\n ],\n [\n 118.20723,\n 29.346135\n ],\n [\n 118.136397,\n 29.284052\n ],\n [\n 118.077883,\n 29.290836\n ],\n [\n 118.027992,\n 29.168132\n ],\n [\n 118.037847,\n 29.097054\n ],\n [\n 118.111144,\n 28.997671\n ],\n [\n 118.111144,\n 28.997671\n ],\n [\n 118.270056,\n 28.918619\n ],\n [\n 118.306396,\n 28.823782\n ],\n [\n 118.379077,\n 28.785509\n ],\n [\n 118.379077,\n 28.785509\n ],\n [\n 118.431432,\n 28.679528\n ],\n [\n 118.423425,\n 28.587626\n ],\n [\n 118.423425,\n 28.587626\n ],\n [\n 118.421577,\n 28.541908\n ],\n [\n 118.421577,\n 28.540331\n ],\n [\n 118.425273,\n 28.537177\n ],\n [\n 118.426505,\n 28.532447\n ],\n [\n 118.425273,\n 28.537177\n ],\n [\n 118.426505,\n 28.532447\n ],\n [\n 118.472084,\n 28.482497\n ],\n [\n 118.432048,\n 28.402003\n ],\n [\n 118.486867,\n 28.328821\n ],\n [\n 118.433896,\n 28.288786\n ],\n [\n 118.314404,\n 28.22238\n ],\n [\n 118.37415,\n 28.188106\n ],\n [\n 118.356288,\n 28.091555\n ],\n [\n 118.155491,\n 28.061992\n ],\n [\n 118.096977,\n 27.96744\n ],\n [\n 117.999043,\n 27.991218\n ],\n [\n 117.856145,\n 27.945772\n ],\n [\n 117.78716,\n 27.896076\n ],\n [\n 117.740348,\n 27.800321\n ],\n [\n 117.608537,\n 27.863814\n ],\n [\n 117.52169,\n 27.982236\n ],\n [\n 117.341836,\n 27.855879\n ],\n [\n 117.27901,\n 27.870161\n ],\n [\n 117.296872,\n 27.764854\n ],\n [\n 117.204481,\n 27.683819\n ],\n [\n 117.118865,\n 27.694416\n ],\n [\n 117.096692,\n 27.626582\n ],\n [\n 117.040641,\n 27.670043\n ],\n [\n 117.01662,\n 27.563481\n ],\n [\n 117.084989,\n 27.564011\n ],\n [\n 117.133032,\n 27.4223\n ],\n [\n 117.100387,\n 27.338886\n ],\n [\n 117.171836,\n 27.290509\n ],\n [\n 117.043721,\n 27.139928\n ],\n [\n 117.05296,\n 27.100519\n ],\n [\n 116.910062,\n 27.034453\n ],\n [\n 116.679085,\n 26.978479\n ],\n [\n 116.548506,\n 26.839758\n ],\n [\n 116.557745,\n 26.774073\n ],\n [\n 116.516477,\n 26.69071\n ],\n [\n 116.566368,\n 26.650075\n ],\n [\n 116.539267,\n 26.559129\n ],\n [\n 116.610716,\n 26.477216\n ],\n [\n 116.601476,\n 26.372733\n ],\n [\n 116.519557,\n 26.410251\n ],\n [\n 116.412999,\n 26.298197\n ],\n [\n 116.396985,\n 26.166168\n ],\n [\n 116.471513,\n 26.175296\n ],\n [\n 116.489375,\n 26.113529\n ],\n [\n 116.383434,\n 26.029687\n ],\n [\n 116.36434,\n 25.960312\n ],\n [\n 116.258398,\n 25.902736\n ],\n [\n 116.176478,\n 25.893048\n ],\n [\n 116.131515,\n 25.82413\n ],\n [\n 116.18079,\n 25.774571\n ],\n [\n 116.067457,\n 25.703967\n ],\n [\n 116.063145,\n 25.563173\n ],\n [\n 116.005247,\n 25.490284\n ],\n [\n 116.008327,\n 25.319496\n ],\n [\n 115.929487,\n 25.234553\n ],\n [\n 115.855574,\n 25.209654\n ],\n [\n 115.880212,\n 25.092126\n ],\n [\n 115.928255,\n 25.050396\n ],\n [\n 115.873436,\n 25.020038\n ],\n [\n 115.89253,\n 24.937056\n ],\n [\n 115.907313,\n 24.880075\n ],\n [\n 115.822313,\n 24.90884\n ],\n [\n 115.756408,\n 24.749192\n ],\n [\n 115.845103,\n 24.563221\n ],\n [\n 115.688038,\n 24.545261\n ],\n [\n 115.67264,\n 24.604028\n ],\n [\n 115.573474,\n 24.617083\n ],\n [\n 115.556227,\n 24.682883\n ],\n [\n 115.412714,\n 24.792654\n ],\n [\n 115.358511,\n 24.735064\n ],\n [\n 115.308004,\n 24.758429\n ],\n [\n 115.095505,\n 24.674184\n ],\n [\n 115.056701,\n 24.703541\n ],\n [\n 114.909491,\n 24.661679\n ],\n [\n 114.868839,\n 24.562132\n ],\n [\n 114.729637,\n 24.608924\n ],\n [\n 114.704999,\n 24.526211\n ],\n [\n 114.664963,\n 24.583898\n ],\n [\n 114.589819,\n 24.537642\n ],\n [\n 114.534384,\n 24.558867\n ],\n [\n 114.428443,\n 24.486468\n ],\n [\n 114.391486,\n 24.562677\n ],\n [\n 114.308334,\n 24.574104\n ],\n [\n 114.258443,\n 24.641558\n ],\n [\n 114.169132,\n 24.689407\n ],\n [\n 114.27261,\n 24.700279\n ],\n [\n 114.33482,\n 24.747562\n ],\n [\n 114.403189,\n 24.877361\n ],\n [\n 114.395798,\n 24.951161\n ],\n [\n 114.506051,\n 24.999975\n ],\n [\n 114.561485,\n 25.077495\n ],\n [\n 114.640326,\n 25.073702\n ],\n [\n 114.735796,\n 25.121925\n ],\n [\n 114.679746,\n 25.194495\n ],\n [\n 114.743188,\n 25.274597\n ],\n [\n 114.63663,\n 25.324364\n ],\n [\n 114.535616,\n 25.41681\n ],\n [\n 114.381015,\n 25.31571\n ],\n [\n 114.31511,\n 25.338424\n ],\n [\n 114.262755,\n 25.29191\n ],\n [\n 114.13156,\n 25.30922\n ],\n [\n 114.039785,\n 25.250789\n ],\n [\n 114.051488,\n 25.348699\n ],\n [\n 113.94493,\n 25.441667\n ],\n [\n 113.983118,\n 25.599332\n ],\n [\n 113.913517,\n 25.701272\n ],\n [\n 113.971416,\n 25.835979\n ],\n [\n 114.028082,\n 25.893586\n ],\n [\n 114.007756,\n 26.007104\n ],\n [\n 114.044096,\n 26.076452\n ],\n [\n 114.237501,\n 26.152204\n ],\n [\n 114.181451,\n 26.214489\n ],\n [\n 114.088444,\n 26.168316\n ],\n [\n 113.944314,\n 26.16402\n ],\n [\n 114.029314,\n 26.266545\n ],\n [\n 114.030546,\n 26.376485\n ],\n [\n 114.085364,\n 26.4065\n ],\n [\n 114.073046,\n 26.480965\n ],\n [\n 114.106306,\n 26.576254\n ],\n [\n 113.915365,\n 26.613706\n ],\n [\n 113.860546,\n 26.663978\n ],\n [\n 113.834677,\n 26.803983\n ],\n [\n 113.927068,\n 26.949149\n ],\n [\n 113.821126,\n 27.037651\n ],\n [\n 113.779242,\n 27.137265\n ],\n [\n 113.848844,\n 27.225087\n ],\n [\n 113.872865,\n 27.385116\n ],\n [\n 113.616635,\n 27.345264\n ],\n [\n 113.632033,\n 27.405303\n ],\n [\n 113.583374,\n 27.524754\n ],\n [\n 113.607395,\n 27.625522\n ],\n [\n 113.763228,\n 27.799262\n ],\n [\n 113.729967,\n 27.887086\n ],\n [\n 113.752141,\n 27.933614\n ],\n [\n 113.864242,\n 28.004954\n ],\n [\n 113.914133,\n 27.991218\n ],\n [\n 114.047176,\n 28.05724\n ],\n [\n 113.992357,\n 28.161207\n ],\n [\n 114.107538,\n 28.182833\n ],\n [\n 114.25598,\n 28.323554\n ],\n [\n 114.252284,\n 28.395687\n ],\n [\n 114.172212,\n 28.432524\n ],\n [\n 114.218407,\n 28.484601\n ],\n [\n 114.08598,\n 28.558201\n ],\n [\n 114.157429,\n 28.761384\n ],\n [\n 114.152502,\n 28.83479\n ],\n [\n 114.076741,\n 28.834266\n ],\n [\n 114.008988,\n 28.955273\n ],\n [\n 113.966488,\n 28.945326\n ],\n [\n 113.94185,\n 29.047374\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 370000,\n \"name\": \"山东省\",\n \"center\": [\n 117.000923,\n 36.675807\n ],\n \"centroid\": [\n 118.186283,\n 36.374485\n ],\n \"childrenNum\": 17,\n \"level\": \"province\",\n \"subFeatureIndex\": 14,\n \"acroutes\": [\n 100000\n ],\n \"parent\": {\n \"adcode\": 100000\n }\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 121.362071,\n 37.634292\n ],\n [\n 121.4791,\n 37.474914\n ],\n [\n 121.565331,\n 37.440242\n ],\n [\n 121.635548,\n 37.49438\n ],\n [\n 121.66573,\n 37.47349\n ],\n [\n 121.923808,\n 37.473015\n ],\n [\n 122.08888,\n 37.554171\n ],\n [\n 122.166488,\n 37.439292\n ],\n [\n 122.234857,\n 37.469216\n ],\n [\n 122.284133,\n 37.426464\n ],\n [\n 122.41656,\n 37.414585\n ],\n [\n 122.487393,\n 37.434541\n ],\n [\n 122.553914,\n 37.406981\n ],\n [\n 122.670942,\n 37.429315\n ],\n [\n 122.573624,\n 37.296159\n ],\n [\n 122.629059,\n 37.194708\n ],\n [\n 122.581015,\n 37.147508\n ],\n [\n 122.505871,\n 37.149892\n ],\n [\n 122.467067,\n 37.03726\n ],\n [\n 122.575472,\n 37.054452\n ],\n [\n 122.532356,\n 36.901497\n ],\n [\n 122.344495,\n 36.828257\n ],\n [\n 122.174495,\n 36.842623\n ],\n [\n 122.141235,\n 36.93833\n ],\n [\n 122.051923,\n 36.904846\n ],\n [\n 122.008808,\n 36.962238\n ],\n [\n 121.767975,\n 36.874698\n ],\n [\n 121.762432,\n 36.846454\n ],\n [\n 121.627541,\n 36.795683\n ],\n [\n 121.647867,\n 36.723301\n ],\n [\n 121.492035,\n 36.789933\n ],\n [\n 121.454462,\n 36.75255\n ],\n [\n 121.209318,\n 36.671489\n ],\n [\n 121.028848,\n 36.573046\n ],\n [\n 120.847146,\n 36.618682\n ],\n [\n 120.983269,\n 36.546133\n ],\n [\n 120.890878,\n 36.373375\n ],\n [\n 120.828668,\n 36.466779\n ],\n [\n 120.759683,\n 36.462448\n ],\n [\n 120.694393,\n 36.390234\n ],\n [\n 120.7449,\n 36.330969\n ],\n [\n 120.66298,\n 36.331933\n ],\n [\n 120.712255,\n 36.126809\n ],\n [\n 120.478199,\n 36.091522\n ],\n [\n 120.343308,\n 36.04219\n ],\n [\n 120.290337,\n 36.061539\n ],\n [\n 120.362402,\n 36.19637\n ],\n [\n 120.181316,\n 36.204095\n ],\n [\n 120.108635,\n 36.127292\n ],\n [\n 120.241062,\n 36.047995\n ],\n [\n 120.213345,\n 35.998152\n ],\n [\n 120.292801,\n 36.017512\n ],\n [\n 120.262004,\n 35.965712\n ],\n [\n 120.062439,\n 35.870739\n ],\n [\n 120.011317,\n 35.713006\n ],\n [\n 119.926317,\n 35.759631\n ],\n [\n 119.923237,\n 35.635238\n ],\n [\n 119.718129,\n 35.615785\n ],\n [\n 119.665775,\n 35.57005\n ],\n [\n 119.543819,\n 35.347815\n ],\n [\n 119.411392,\n 35.231581\n ],\n [\n 119.373819,\n 35.078464\n ],\n [\n 119.306066,\n 35.076506\n ],\n [\n 119.286972,\n 35.11518\n ],\n [\n 119.137915,\n 35.09609\n ],\n [\n 119.114509,\n 35.054958\n ],\n [\n 118.928495,\n 35.051039\n ],\n [\n 118.865053,\n 35.029974\n ],\n [\n 118.860742,\n 34.94419\n ],\n [\n 118.772047,\n 34.794464\n ],\n [\n 118.719076,\n 34.745315\n ],\n [\n 118.783749,\n 34.723188\n ],\n [\n 118.690127,\n 34.678424\n ],\n [\n 118.601431,\n 34.714336\n ],\n [\n 118.460997,\n 34.65628\n ],\n [\n 118.424657,\n 34.595228\n ],\n [\n 118.440671,\n 34.527724\n ],\n [\n 118.404947,\n 34.427598\n ],\n [\n 118.290382,\n 34.424637\n ],\n [\n 118.179513,\n 34.379218\n ],\n [\n 118.177665,\n 34.453257\n ],\n [\n 118.132702,\n 34.483348\n ],\n [\n 118.185056,\n 34.543989\n ],\n [\n 118.079115,\n 34.569612\n ],\n [\n 118.084042,\n 34.655788\n ],\n [\n 117.951615,\n 34.678424\n ],\n [\n 117.902956,\n 34.644467\n ],\n [\n 117.793935,\n 34.65185\n ],\n [\n 117.801942,\n 34.51885\n ],\n [\n 117.684298,\n 34.547439\n ],\n [\n 117.592523,\n 34.462631\n ],\n [\n 117.465023,\n 34.484827\n ],\n [\n 117.402813,\n 34.569612\n ],\n [\n 117.322125,\n 34.574046\n ],\n [\n 117.322125,\n 34.574046\n ],\n [\n 117.32151,\n 34.566656\n ],\n [\n 117.32151,\n 34.566656\n ],\n [\n 117.322125,\n 34.566656\n ],\n [\n 117.322125,\n 34.566656\n ],\n [\n 117.301184,\n 34.557294\n ],\n [\n 117.301184,\n 34.557294\n ],\n [\n 117.242669,\n 34.445856\n ],\n [\n 117.175532,\n 34.47003\n ],\n [\n 117.137344,\n 34.633144\n ],\n [\n 117.07575,\n 34.637575\n ],\n [\n 117.088069,\n 34.702039\n ],\n [\n 117.000605,\n 34.793482\n ],\n [\n 116.966728,\n 34.875497\n ],\n [\n 116.821983,\n 34.929475\n ],\n [\n 116.677853,\n 34.939285\n ],\n [\n 116.445028,\n 34.89562\n ],\n [\n 116.408071,\n 34.85095\n ],\n [\n 116.374195,\n 34.640036\n ],\n [\n 116.281188,\n 34.60754\n ],\n [\n 116.240536,\n 34.552367\n ],\n [\n 116.196804,\n 34.576017\n ],\n [\n 116.134594,\n 34.559758\n ],\n [\n 116.101334,\n 34.605571\n ],\n [\n 115.83032,\n 34.562714\n ],\n [\n 115.697278,\n 34.594243\n ],\n [\n 115.667096,\n 34.557294\n ],\n [\n 115.515575,\n 34.582421\n ],\n [\n 115.461373,\n 34.637083\n ],\n [\n 115.42688,\n 34.805273\n ],\n [\n 115.317243,\n 34.859297\n ],\n [\n 115.256265,\n 34.845549\n ],\n [\n 115.251953,\n 34.906416\n ],\n [\n 115.189128,\n 34.914757\n ],\n [\n 115.12815,\n 35.004493\n ],\n [\n 115.028983,\n 34.97165\n ],\n [\n 114.923658,\n 34.968709\n ],\n [\n 114.824492,\n 35.012335\n ],\n [\n 114.883006,\n 35.098537\n ],\n [\n 114.841738,\n 35.151389\n ],\n [\n 114.932281,\n 35.197362\n ],\n [\n 114.929817,\n 35.248196\n ],\n [\n 115.02036,\n 35.364406\n ],\n [\n 115.093657,\n 35.41611\n ],\n [\n 115.237171,\n 35.422937\n ],\n [\n 115.357895,\n 35.498475\n ],\n [\n 115.383148,\n 35.569076\n ],\n [\n 115.48601,\n 35.710091\n ],\n [\n 115.693582,\n 35.75429\n ],\n [\n 115.773654,\n 35.854252\n ],\n [\n 115.875284,\n 35.859102\n ],\n [\n 115.911624,\n 35.960385\n ],\n [\n 116.048979,\n 35.970071\n ],\n [\n 116.099486,\n 36.111826\n ],\n [\n 115.989849,\n 36.045576\n ],\n [\n 115.646155,\n 35.920663\n ],\n [\n 115.496481,\n 35.885283\n ],\n [\n 115.498329,\n 35.897401\n ],\n [\n 115.503257,\n 35.91194\n ],\n [\n 115.503257,\n 35.91194\n ],\n [\n 115.487242,\n 35.903702\n ],\n [\n 115.473692,\n 35.896917\n ],\n [\n 115.473692,\n 35.896917\n ],\n [\n 115.467532,\n 35.889646\n ],\n [\n 115.467532,\n 35.889646\n ],\n [\n 115.464452,\n 35.882859\n ],\n [\n 115.464452,\n 35.88092\n ],\n [\n 115.464452,\n 35.882859\n ],\n [\n 115.463837,\n 35.882859\n ],\n [\n 115.464452,\n 35.88092\n ],\n [\n 115.463837,\n 35.88092\n ],\n [\n 115.463837,\n 35.882859\n ],\n [\n 115.463837,\n 35.88092\n ],\n [\n 115.460141,\n 35.86783\n ],\n [\n 115.363438,\n 35.78002\n ],\n [\n 115.335105,\n 35.796522\n ],\n [\n 115.362822,\n 35.972008\n ],\n [\n 115.447822,\n 36.012672\n ],\n [\n 115.483547,\n 36.149036\n ],\n [\n 115.466916,\n 36.259115\n ],\n [\n 115.466916,\n 36.259115\n ],\n [\n 115.366518,\n 36.308793\n ],\n [\n 115.308004,\n 36.461967\n ],\n [\n 115.308004,\n 36.461967\n ],\n [\n 115.283366,\n 36.486505\n ],\n [\n 115.365902,\n 36.622043\n ],\n [\n 115.479851,\n 36.76022\n ],\n [\n 115.683727,\n 36.808139\n ],\n [\n 115.71206,\n 36.883313\n ],\n [\n 115.79706,\n 36.968931\n ],\n [\n 115.776734,\n 36.992829\n ],\n [\n 115.868509,\n 37.076414\n ],\n [\n 115.909777,\n 37.206622\n ],\n [\n 115.969523,\n 37.239497\n ],\n [\n 115.984921,\n 37.326616\n ],\n [\n 116.051443,\n 37.367998\n ],\n [\n 116.169087,\n 37.384164\n ],\n [\n 116.236224,\n 37.361816\n ],\n [\n 116.2855,\n 37.404604\n ],\n [\n 116.226369,\n 37.428365\n ],\n [\n 116.240536,\n 37.489633\n ],\n [\n 116.240536,\n 37.489633\n ],\n [\n 116.27626,\n 37.466841\n ],\n [\n 116.291659,\n 37.557966\n ],\n [\n 116.337238,\n 37.580255\n ],\n [\n 116.379738,\n 37.521909\n ],\n [\n 116.38097,\n 37.522858\n ],\n [\n 116.379738,\n 37.521909\n ],\n [\n 116.38097,\n 37.522858\n ],\n [\n 116.433941,\n 37.47349\n ],\n [\n 116.724664,\n 37.744139\n ],\n [\n 116.788106,\n 37.843429\n ],\n [\n 117.023395,\n 37.832561\n ],\n [\n 117.093612,\n 37.849571\n ],\n [\n 117.267923,\n 37.838704\n ],\n [\n 117.34122,\n 37.863271\n ],\n [\n 117.438538,\n 37.853823\n ],\n [\n 117.513067,\n 37.94353\n ],\n [\n 117.5839,\n 38.070819\n ],\n [\n 117.70216,\n 38.075529\n ],\n [\n 117.771761,\n 38.136734\n ],\n [\n 117.808718,\n 38.228445\n ],\n [\n 117.895565,\n 38.30173\n ],\n [\n 117.997811,\n 38.211992\n ],\n [\n 118.045238,\n 38.207761\n ],\n [\n 118.143788,\n 38.297035\n ],\n [\n 118.07234,\n 38.170139\n ],\n [\n 118.331034,\n 38.124968\n ],\n [\n 118.504729,\n 38.114141\n ],\n [\n 118.552156,\n 38.055744\n ],\n [\n 118.607591,\n 38.129204\n ],\n [\n 118.726467,\n 38.154144\n ],\n [\n 118.853967,\n 38.155085\n ],\n [\n 118.974075,\n 38.094367\n ],\n [\n 119.004872,\n 37.992114\n ],\n [\n 119.110813,\n 37.921349\n ],\n [\n 119.12806,\n 37.814601\n ],\n [\n 119.217371,\n 37.810347\n ],\n [\n 119.259871,\n 37.702492\n ],\n [\n 119.080016,\n 37.696337\n ],\n [\n 118.99748,\n 37.632396\n ],\n [\n 118.939582,\n 37.527129\n ],\n [\n 118.983314,\n 37.349926\n ],\n [\n 119.054147,\n 37.254738\n ],\n [\n 119.12806,\n 37.254738\n ],\n [\n 119.298675,\n 37.197567\n ],\n [\n 119.329472,\n 37.115548\n ],\n [\n 119.489616,\n 37.13463\n ],\n [\n 119.566608,\n 37.100755\n ],\n [\n 119.744615,\n 37.135107\n ],\n [\n 119.89244,\n 37.263786\n ],\n [\n 119.843781,\n 37.376557\n ],\n [\n 120.144359,\n 37.482036\n ],\n [\n 120.246605,\n 37.556543\n ],\n [\n 120.215192,\n 37.621023\n ],\n [\n 120.272475,\n 37.636661\n ],\n [\n 120.227511,\n 37.693497\n ],\n [\n 120.367945,\n 37.697758\n ],\n [\n 120.466496,\n 37.757858\n ],\n [\n 120.595227,\n 37.767318\n ],\n [\n 120.733197,\n 37.833506\n ],\n [\n 120.938305,\n 37.821219\n ],\n [\n 121.037471,\n 37.718585\n ],\n [\n 121.136022,\n 37.723318\n ],\n [\n 121.153884,\n 37.613914\n ],\n [\n 121.217326,\n 37.582626\n ],\n [\n 121.354064,\n 37.595901\n ],\n [\n 121.362071,\n 37.634292\n ]\n ]\n ],\n [\n [\n [\n 115.498329,\n 35.897401\n ],\n [\n 115.496481,\n 35.885283\n ],\n [\n 115.460141,\n 35.86783\n ],\n [\n 115.463837,\n 35.88092\n ],\n [\n 115.463837,\n 35.882859\n ],\n [\n 115.463837,\n 35.88092\n ],\n [\n 115.464452,\n 35.88092\n ],\n [\n 115.463837,\n 35.882859\n ],\n [\n 115.464452,\n 35.882859\n ],\n [\n 115.464452,\n 35.88092\n ],\n [\n 115.464452,\n 35.882859\n ],\n [\n 115.467532,\n 35.889646\n ],\n [\n 115.467532,\n 35.889646\n ],\n [\n 115.473692,\n 35.896917\n ],\n [\n 115.473692,\n 35.896917\n ],\n [\n 115.487242,\n 35.903702\n ],\n [\n 115.498329,\n 35.897401\n ]\n ]\n ],\n [\n [\n [\n 121.487723,\n 37.578833\n ],\n [\n 121.487723,\n 37.577884\n ],\n [\n 121.487107,\n 37.577884\n ],\n [\n 121.485875,\n 37.578359\n ],\n [\n 121.485875,\n 37.578833\n ],\n [\n 121.487723,\n 37.578833\n ]\n ]\n ],\n [\n [\n [\n 121.487723,\n 37.578833\n ],\n [\n 121.488339,\n 37.578833\n ],\n [\n 121.488339,\n 37.578833\n ],\n [\n 121.487723,\n 37.57741\n ],\n [\n 121.487723,\n 37.577884\n ],\n [\n 121.487723,\n 37.578833\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 410000,\n \"name\": \"河南省\",\n \"center\": [\n 113.665412,\n 34.757975\n ],\n \"centroid\": [\n 113.619918,\n 33.902738\n ],\n \"childrenNum\": 18,\n \"level\": \"province\",\n \"subFeatureIndex\": 15,\n \"acroutes\": [\n 100000\n ],\n \"parent\": {\n \"adcode\": 100000\n }\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 116.196804,\n 34.576017\n ],\n [\n 116.204196,\n 34.508497\n ],\n [\n 116.162312,\n 34.459178\n ],\n [\n 116.213435,\n 34.382181\n ],\n [\n 116.26271,\n 34.375762\n ],\n [\n 116.409303,\n 34.273971\n ],\n [\n 116.409303,\n 34.273971\n ],\n [\n 116.516477,\n 34.296217\n ],\n [\n 116.565752,\n 34.173541\n ],\n [\n 116.530643,\n 34.107183\n ],\n [\n 116.575607,\n 34.069028\n ],\n [\n 116.575607,\n 34.069028\n ],\n [\n 116.648288,\n 33.973317\n ],\n [\n 116.64336,\n 33.896869\n ],\n [\n 116.437637,\n 33.846694\n ],\n [\n 116.437021,\n 33.801461\n ],\n [\n 116.316297,\n 33.771127\n ],\n [\n 116.263326,\n 33.729835\n ],\n [\n 116.155536,\n 33.709929\n ],\n [\n 116.074232,\n 33.781571\n ],\n [\n 116.05945,\n 33.861103\n ],\n [\n 115.987385,\n 33.900842\n ],\n [\n 116.00032,\n 33.964881\n ],\n [\n 115.95782,\n 34.007547\n ],\n [\n 115.877132,\n 34.003083\n ],\n [\n 115.736082,\n 34.076957\n ],\n [\n 115.60735,\n 34.030359\n ],\n [\n 115.546988,\n 33.875014\n ],\n [\n 115.629524,\n 33.871536\n ],\n [\n 115.614126,\n 33.775603\n ],\n [\n 115.563003,\n 33.771624\n ],\n [\n 115.639995,\n 33.584909\n ],\n [\n 115.421953,\n 33.556992\n ],\n [\n 115.345576,\n 33.503125\n ],\n [\n 115.312931,\n 33.376307\n ],\n [\n 115.365286,\n 33.335826\n ],\n [\n 115.301229,\n 33.141657\n ],\n [\n 115.168186,\n 33.088535\n ],\n [\n 115.042534,\n 33.08653\n ],\n [\n 114.966158,\n 33.147167\n ],\n [\n 114.902716,\n 33.129632\n ],\n [\n 114.925506,\n 33.016821\n ],\n [\n 114.883006,\n 32.990227\n ],\n [\n 114.943368,\n 32.935005\n ],\n [\n 115.139237,\n 32.897837\n ],\n [\n 115.197135,\n 32.85613\n ],\n [\n 115.183584,\n 32.665937\n ],\n [\n 115.20083,\n 32.591864\n ],\n [\n 115.304924,\n 32.553039\n ],\n [\n 115.409018,\n 32.549005\n ],\n [\n 115.5088,\n 32.468777\n ],\n [\n 115.509416,\n 32.466758\n ],\n [\n 115.567314,\n 32.421819\n ],\n [\n 115.667712,\n 32.409696\n ],\n [\n 115.706517,\n 32.494014\n ],\n [\n 115.789052,\n 32.468777\n ],\n [\n 115.845719,\n 32.501583\n ],\n [\n 115.899306,\n 32.391005\n ],\n [\n 115.912856,\n 32.227666\n ],\n [\n 115.941805,\n 32.166402\n ],\n [\n 115.931334,\n 31.994541\n ],\n [\n 115.893146,\n 31.833033\n ],\n [\n 115.909777,\n 31.791849\n ],\n [\n 115.816154,\n 31.762348\n ],\n [\n 115.767495,\n 31.787272\n ],\n [\n 115.660937,\n 31.760822\n ],\n [\n 115.496481,\n 31.674297\n ],\n [\n 115.371446,\n 31.495905\n ],\n [\n 115.373909,\n 31.405559\n ],\n [\n 115.301229,\n 31.384109\n ],\n [\n 115.22054,\n 31.426494\n ],\n [\n 115.235323,\n 31.556597\n ],\n [\n 115.12507,\n 31.598904\n ],\n [\n 115.088729,\n 31.507638\n ],\n [\n 115.024056,\n 31.528551\n ],\n [\n 114.830035,\n 31.458654\n ],\n [\n 114.778912,\n 31.5209\n ],\n [\n 114.696376,\n 31.526001\n ],\n [\n 114.641558,\n 31.582085\n ],\n [\n 114.560869,\n 31.561185\n ],\n [\n 114.549783,\n 31.642721\n ],\n [\n 114.586123,\n 31.762348\n ],\n [\n 114.448769,\n 31.728257\n ],\n [\n 114.292936,\n 31.752173\n ],\n [\n 114.195002,\n 31.850315\n ],\n [\n 114.135871,\n 31.843707\n ],\n [\n 114.088444,\n 31.781677\n ],\n [\n 113.988662,\n 31.750138\n ],\n [\n 113.954785,\n 31.856413\n ],\n [\n 113.838373,\n 31.854889\n ],\n [\n 113.791561,\n 32.036142\n ],\n [\n 113.728735,\n 32.0833\n ],\n [\n 113.783554,\n 32.186153\n ],\n [\n 113.749677,\n 32.272196\n ],\n [\n 113.761996,\n 32.268149\n ],\n [\n 113.757069,\n 32.29243\n ],\n [\n 113.758301,\n 32.296476\n ],\n [\n 113.752757,\n 32.388478\n ],\n [\n 113.664062,\n 32.422324\n ],\n [\n 113.624642,\n 32.361191\n ],\n [\n 113.425693,\n 32.269161\n ],\n [\n 113.211962,\n 32.431919\n ],\n [\n 113.118956,\n 32.375846\n ],\n [\n 113.025949,\n 32.425354\n ],\n [\n 112.992072,\n 32.378373\n ],\n [\n 112.860877,\n 32.395552\n ],\n [\n 112.733993,\n 32.363718\n ],\n [\n 112.729066,\n 32.366245\n ],\n [\n 112.544284,\n 32.403635\n ],\n [\n 112.451893,\n 32.344511\n ],\n [\n 112.390915,\n 32.371298\n ],\n [\n 112.328089,\n 32.321761\n ],\n [\n 112.228923,\n 32.385447\n ],\n [\n 112.014576,\n 32.450098\n ],\n [\n 111.948671,\n 32.517225\n ],\n [\n 111.890157,\n 32.503097\n ],\n [\n 111.640701,\n 32.634703\n ],\n [\n 111.577875,\n 32.593376\n ],\n [\n 111.380159,\n 32.828984\n ],\n [\n 111.293311,\n 32.859145\n ],\n [\n 111.242804,\n 32.930486\n ],\n [\n 111.273601,\n 32.971656\n ],\n [\n 111.238493,\n 33.040899\n ],\n [\n 111.151029,\n 33.053438\n ],\n [\n 111.179363,\n 33.115601\n ],\n [\n 111.056791,\n 33.192743\n ],\n [\n 111.032769,\n 33.209265\n ],\n [\n 110.984726,\n 33.255308\n ],\n [\n 111.025994,\n 33.330327\n ],\n [\n 110.996429,\n 33.435745\n ],\n [\n 111.02661,\n 33.474183\n ],\n [\n 111.02661,\n 33.478675\n ],\n [\n 111.00382,\n 33.578429\n ],\n [\n 110.877552,\n 33.635238\n ],\n [\n 110.782698,\n 33.795494\n ],\n [\n 110.587445,\n 33.887929\n ],\n [\n 110.669365,\n 33.939072\n ],\n [\n 110.590525,\n 34.096778\n ],\n [\n 110.642264,\n 34.16067\n ],\n [\n 110.43962,\n 34.24331\n ],\n [\n 110.426685,\n 34.275454\n ],\n [\n 110.503677,\n 34.337234\n ],\n [\n 110.403279,\n 34.43352\n ],\n [\n 110.403279,\n 34.43352\n ],\n [\n 110.360779,\n 34.516878\n ],\n [\n 110.379257,\n 34.600646\n ],\n [\n 110.474728,\n 34.617389\n ],\n [\n 110.533242,\n 34.583406\n ],\n [\n 110.710017,\n 34.605078\n ],\n [\n 110.749437,\n 34.652342\n ],\n [\n 110.883712,\n 34.642498\n ],\n [\n 110.929907,\n 34.731548\n ],\n [\n 110.966248,\n 34.70499\n ],\n [\n 111.118385,\n 34.756622\n ],\n [\n 111.148566,\n 34.80773\n ],\n [\n 111.232949,\n 34.789551\n ],\n [\n 111.346282,\n 34.831798\n ],\n [\n 111.570484,\n 34.843094\n ],\n [\n 111.66965,\n 34.988319\n ],\n [\n 111.900012,\n 35.079933\n ],\n [\n 112.062004,\n 35.055937\n ],\n [\n 112.078634,\n 35.219362\n ],\n [\n 112.058924,\n 35.279951\n ],\n [\n 112.513487,\n 35.218384\n ],\n [\n 112.637291,\n 35.225716\n ],\n [\n 112.628052,\n 35.263342\n ],\n [\n 112.766022,\n 35.203718\n ],\n [\n 112.818377,\n 35.258457\n ],\n [\n 112.911384,\n 35.24673\n ],\n [\n 112.992072,\n 35.296068\n ],\n [\n 112.997,\n 35.362455\n ],\n [\n 113.126347,\n 35.332197\n ],\n [\n 113.189789,\n 35.449261\n ],\n [\n 113.298194,\n 35.427325\n ],\n [\n 113.31236,\n 35.481424\n ],\n [\n 113.485439,\n 35.520879\n ],\n [\n 113.578446,\n 35.63378\n ],\n [\n 113.604316,\n 35.797008\n ],\n [\n 113.656671,\n 35.836792\n ],\n [\n 113.637576,\n 35.98847\n ],\n [\n 113.694859,\n 36.026707\n ],\n [\n 113.651743,\n 36.172224\n ],\n [\n 113.716417,\n 36.262492\n ],\n [\n 113.731199,\n 36.363257\n ],\n [\n 113.819894,\n 36.330969\n ],\n [\n 113.881488,\n 36.354102\n ],\n [\n 113.911054,\n 36.314578\n ],\n [\n 113.982502,\n 36.358921\n ],\n [\n 114.055799,\n 36.330005\n ],\n [\n 114.060727,\n 36.276482\n ],\n [\n 114.169132,\n 36.243675\n ],\n [\n 114.169132,\n 36.243675\n ],\n [\n 114.345291,\n 36.255738\n ],\n [\n 114.591666,\n 36.130192\n ],\n [\n 114.912571,\n 36.140339\n ],\n [\n 114.914419,\n 36.051865\n ],\n [\n 114.996955,\n 36.06831\n ],\n [\n 115.064092,\n 36.178985\n ],\n [\n 115.201446,\n 36.210371\n ],\n [\n 115.201446,\n 36.210371\n ],\n [\n 115.312931,\n 36.088137\n ],\n [\n 115.483547,\n 36.149036\n ],\n [\n 115.447822,\n 36.012672\n ],\n [\n 115.362822,\n 35.972008\n ],\n [\n 115.335105,\n 35.796522\n ],\n [\n 115.363438,\n 35.78002\n ],\n [\n 115.460141,\n 35.86783\n ],\n [\n 115.496481,\n 35.885283\n ],\n [\n 115.646155,\n 35.920663\n ],\n [\n 115.989849,\n 36.045576\n ],\n [\n 116.099486,\n 36.111826\n ],\n [\n 116.048979,\n 35.970071\n ],\n [\n 115.911624,\n 35.960385\n ],\n [\n 115.875284,\n 35.859102\n ],\n [\n 115.773654,\n 35.854252\n ],\n [\n 115.693582,\n 35.75429\n ],\n [\n 115.48601,\n 35.710091\n ],\n [\n 115.383148,\n 35.569076\n ],\n [\n 115.357895,\n 35.498475\n ],\n [\n 115.237171,\n 35.422937\n ],\n [\n 115.093657,\n 35.41611\n ],\n [\n 115.02036,\n 35.364406\n ],\n [\n 114.929817,\n 35.248196\n ],\n [\n 114.932281,\n 35.197362\n ],\n [\n 114.841738,\n 35.151389\n ],\n [\n 114.883006,\n 35.098537\n ],\n [\n 114.824492,\n 35.012335\n ],\n [\n 114.923658,\n 34.968709\n ],\n [\n 115.028983,\n 34.97165\n ],\n [\n 115.12815,\n 35.004493\n ],\n [\n 115.189128,\n 34.914757\n ],\n [\n 115.251953,\n 34.906416\n ],\n [\n 115.256265,\n 34.845549\n ],\n [\n 115.317243,\n 34.859297\n ],\n [\n 115.42688,\n 34.805273\n ],\n [\n 115.461373,\n 34.637083\n ],\n [\n 115.515575,\n 34.582421\n ],\n [\n 115.667096,\n 34.557294\n ],\n [\n 115.697278,\n 34.594243\n ],\n [\n 115.83032,\n 34.562714\n ],\n [\n 116.101334,\n 34.605571\n ],\n [\n 116.134594,\n 34.559758\n ],\n [\n 116.196804,\n 34.576017\n ]\n ]\n ],\n [\n [\n [\n 115.498329,\n 35.897401\n ],\n [\n 115.487242,\n 35.903702\n ],\n [\n 115.503257,\n 35.91194\n ],\n [\n 115.503257,\n 35.91194\n ],\n [\n 115.498329,\n 35.897401\n ]\n ]\n ],\n [\n [\n [\n 113.749677,\n 32.272196\n ],\n [\n 113.758301,\n 32.296476\n ],\n [\n 113.757069,\n 32.29243\n ],\n [\n 113.761996,\n 32.268149\n ],\n [\n 113.749677,\n 32.272196\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 420000,\n \"name\": \"湖北省\",\n \"center\": [\n 114.298572,\n 30.584355\n ],\n \"centroid\": [\n 112.271042,\n 30.98802\n ],\n \"childrenNum\": 17,\n \"level\": \"province\",\n \"subFeatureIndex\": 16,\n \"acroutes\": [\n 100000\n ],\n \"parent\": {\n \"adcode\": 100000\n }\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 109.232378,\n 29.119533\n ],\n [\n 109.110422,\n 29.215143\n ],\n [\n 109.11227,\n 29.360737\n ],\n [\n 108.919481,\n 29.326314\n ],\n [\n 108.927488,\n 29.435281\n ],\n [\n 108.880677,\n 29.442576\n ],\n [\n 108.91209,\n 29.571714\n ],\n [\n 108.844337,\n 29.658582\n ],\n [\n 108.785822,\n 29.633622\n ],\n [\n 108.690968,\n 29.689773\n ],\n [\n 108.666946,\n 29.842472\n ],\n [\n 108.602273,\n 29.865824\n ],\n [\n 108.504338,\n 29.707964\n ],\n [\n 108.437201,\n 29.741218\n ],\n [\n 108.424266,\n 29.816\n ],\n [\n 108.371295,\n 29.841434\n ],\n [\n 108.516041,\n 29.885539\n ],\n [\n 108.542526,\n 29.998047\n ],\n [\n 108.513577,\n 30.057619\n ],\n [\n 108.56778,\n 30.157517\n ],\n [\n 108.581947,\n 30.255763\n ],\n [\n 108.460606,\n 30.35959\n ],\n [\n 108.402092,\n 30.376626\n ],\n [\n 108.42673,\n 30.492184\n ],\n [\n 108.56778,\n 30.468464\n ],\n [\n 108.688504,\n 30.587519\n ],\n [\n 108.743939,\n 30.494762\n ],\n [\n 108.808612,\n 30.491153\n ],\n [\n 108.971836,\n 30.627686\n ],\n [\n 109.114734,\n 30.64416\n ],\n [\n 109.09256,\n 30.578762\n ],\n [\n 109.103647,\n 30.565883\n ],\n [\n 109.143683,\n 30.521052\n ],\n [\n 109.299516,\n 30.630775\n ],\n [\n 109.36111,\n 30.550942\n ],\n [\n 109.35495,\n 30.487028\n ],\n [\n 109.435638,\n 30.59576\n ],\n [\n 109.590855,\n 30.693566\n ],\n [\n 109.780564,\n 30.848822\n ],\n [\n 109.893897,\n 30.899662\n ],\n [\n 110.008462,\n 30.883746\n ],\n [\n 110.082375,\n 30.799496\n ],\n [\n 110.172918,\n 30.978694\n ],\n [\n 110.135961,\n 30.986902\n ],\n [\n 110.119947,\n 31.088409\n ],\n [\n 110.189548,\n 31.129391\n ],\n [\n 110.140273,\n 31.390238\n ],\n [\n 110.054042,\n 31.410666\n ],\n [\n 109.946252,\n 31.506108\n ],\n [\n 109.848934,\n 31.552008\n ],\n [\n 109.719586,\n 31.555067\n ],\n [\n 109.76455,\n 31.602981\n ],\n [\n 109.731289,\n 31.700263\n ],\n [\n 109.585928,\n 31.726731\n ],\n [\n 109.638282,\n 31.811172\n ],\n [\n 109.584696,\n 31.900617\n ],\n [\n 109.631507,\n 31.962059\n ],\n [\n 109.590855,\n 32.012807\n ],\n [\n 109.621652,\n 32.106617\n ],\n [\n 109.592703,\n 32.219568\n ],\n [\n 109.495385,\n 32.300522\n ],\n [\n 109.502776,\n 32.389489\n ],\n [\n 109.575457,\n 32.506629\n ],\n [\n 109.637051,\n 32.540935\n ],\n [\n 109.631507,\n 32.599929\n ],\n [\n 109.726978,\n 32.608498\n ],\n [\n 109.816905,\n 32.577244\n ],\n [\n 109.910528,\n 32.592872\n ],\n [\n 110.017701,\n 32.546987\n ],\n [\n 110.085454,\n 32.613034\n ],\n [\n 110.153824,\n 32.593376\n ],\n [\n 110.206179,\n 32.633191\n ],\n [\n 110.156903,\n 32.683061\n ],\n [\n 110.159367,\n 32.767122\n ],\n [\n 110.10886,\n 32.82999\n ],\n [\n 109.988752,\n 32.886281\n ],\n [\n 109.76455,\n 32.909391\n ],\n [\n 109.794731,\n 33.066977\n ],\n [\n 109.688174,\n 33.116603\n ],\n [\n 109.576073,\n 33.110088\n ],\n [\n 109.438718,\n 33.152177\n ],\n [\n 109.537268,\n 33.2438\n ],\n [\n 109.619804,\n 33.27532\n ],\n [\n 109.732521,\n 33.231288\n ],\n [\n 109.852013,\n 33.247803\n ],\n [\n 110.031252,\n 33.191742\n ],\n [\n 110.164911,\n 33.209265\n ],\n [\n 110.218497,\n 33.163197\n ],\n [\n 110.468569,\n 33.181226\n ],\n [\n 110.54125,\n 33.255809\n ],\n [\n 110.59422,\n 33.168706\n ],\n [\n 110.702626,\n 33.097057\n ],\n [\n 110.745741,\n 33.147167\n ],\n [\n 110.824582,\n 33.158188\n ],\n [\n 110.984726,\n 33.255308\n ],\n [\n 111.032769,\n 33.209265\n ],\n [\n 111.037081,\n 33.187235\n ],\n [\n 111.031537,\n 33.17722\n ],\n [\n 111.056791,\n 33.192743\n ],\n [\n 111.179363,\n 33.115601\n ],\n [\n 111.151029,\n 33.053438\n ],\n [\n 111.238493,\n 33.040899\n ],\n [\n 111.273601,\n 32.971656\n ],\n [\n 111.242804,\n 32.930486\n ],\n [\n 111.293311,\n 32.859145\n ],\n [\n 111.380159,\n 32.828984\n ],\n [\n 111.577875,\n 32.593376\n ],\n [\n 111.640701,\n 32.634703\n ],\n [\n 111.890157,\n 32.503097\n ],\n [\n 111.948671,\n 32.517225\n ],\n [\n 112.014576,\n 32.450098\n ],\n [\n 112.228923,\n 32.385447\n ],\n [\n 112.328089,\n 32.321761\n ],\n [\n 112.390915,\n 32.371298\n ],\n [\n 112.451893,\n 32.344511\n ],\n [\n 112.544284,\n 32.403635\n ],\n [\n 112.729066,\n 32.366245\n ],\n [\n 112.730914,\n 32.363212\n ],\n [\n 112.732146,\n 32.362707\n ],\n [\n 112.733993,\n 32.363718\n ],\n [\n 112.860877,\n 32.395552\n ],\n [\n 112.992072,\n 32.378373\n ],\n [\n 113.025949,\n 32.425354\n ],\n [\n 113.118956,\n 32.375846\n ],\n [\n 113.211962,\n 32.431919\n ],\n [\n 113.425693,\n 32.269161\n ],\n [\n 113.624642,\n 32.361191\n ],\n [\n 113.664062,\n 32.422324\n ],\n [\n 113.752757,\n 32.388478\n ],\n [\n 113.758301,\n 32.296476\n ],\n [\n 113.749677,\n 32.272196\n ],\n [\n 113.783554,\n 32.186153\n ],\n [\n 113.728735,\n 32.0833\n ],\n [\n 113.791561,\n 32.036142\n ],\n [\n 113.838373,\n 31.854889\n ],\n [\n 113.954785,\n 31.856413\n ],\n [\n 113.988662,\n 31.750138\n ],\n [\n 114.088444,\n 31.781677\n ],\n [\n 114.135871,\n 31.843707\n ],\n [\n 114.195002,\n 31.850315\n ],\n [\n 114.292936,\n 31.752173\n ],\n [\n 114.448769,\n 31.728257\n ],\n [\n 114.586123,\n 31.762348\n ],\n [\n 114.549783,\n 31.642721\n ],\n [\n 114.560869,\n 31.561185\n ],\n [\n 114.641558,\n 31.582085\n ],\n [\n 114.696376,\n 31.526001\n ],\n [\n 114.778912,\n 31.5209\n ],\n [\n 114.830035,\n 31.458654\n ],\n [\n 115.024056,\n 31.528551\n ],\n [\n 115.088729,\n 31.507638\n ],\n [\n 115.12507,\n 31.598904\n ],\n [\n 115.235323,\n 31.556597\n ],\n [\n 115.22054,\n 31.426494\n ],\n [\n 115.301229,\n 31.384109\n ],\n [\n 115.373909,\n 31.405559\n ],\n [\n 115.372062,\n 31.349368\n ],\n [\n 115.442279,\n 31.346303\n ],\n [\n 115.457677,\n 31.281384\n ],\n [\n 115.516191,\n 31.263485\n ],\n [\n 115.559307,\n 31.160117\n ],\n [\n 115.646155,\n 31.209768\n ],\n [\n 115.700973,\n 31.201068\n ],\n [\n 115.763799,\n 31.118123\n ],\n [\n 115.869125,\n 31.147828\n ],\n [\n 115.938726,\n 31.047409\n ],\n [\n 116.058834,\n 31.012545\n ],\n [\n 116.071769,\n 30.956633\n ],\n [\n 115.976298,\n 30.931488\n ],\n [\n 115.865429,\n 30.864231\n ],\n [\n 115.851262,\n 30.756829\n ],\n [\n 115.782893,\n 30.751687\n ],\n [\n 115.762567,\n 30.685848\n ],\n [\n 115.819234,\n 30.59782\n ],\n [\n 115.876516,\n 30.582368\n ],\n [\n 115.921479,\n 30.416364\n ],\n [\n 115.903001,\n 30.313631\n ],\n [\n 115.985537,\n 30.290901\n ],\n [\n 116.065609,\n 30.204584\n ],\n [\n 116.091479,\n 30.036385\n ],\n [\n 116.073616,\n 29.970061\n ],\n [\n 116.127203,\n 29.899544\n ],\n [\n 116.13521,\n 29.819634\n ],\n [\n 115.965827,\n 29.724593\n ],\n [\n 115.837096,\n 29.748491\n ],\n [\n 115.667712,\n 29.850257\n ],\n [\n 115.511264,\n 29.839877\n ],\n [\n 115.471844,\n 29.742777\n ],\n [\n 115.359127,\n 29.646623\n ],\n [\n 115.142316,\n 29.651822\n ],\n [\n 115.154019,\n 29.51029\n ],\n [\n 115.00065,\n 29.572235\n ],\n [\n 114.940904,\n 29.494147\n ],\n [\n 114.860216,\n 29.475917\n ],\n [\n 114.931049,\n 29.422252\n ],\n [\n 114.759818,\n 29.363345\n ],\n [\n 114.660652,\n 29.393585\n ],\n [\n 114.519602,\n 29.325271\n ],\n [\n 114.259059,\n 29.344049\n ],\n [\n 114.252284,\n 29.234985\n ],\n [\n 114.061959,\n 29.204176\n ],\n [\n 113.952321,\n 29.092871\n ],\n [\n 113.94185,\n 29.047374\n ],\n [\n 113.877793,\n 29.035343\n ],\n [\n 113.816199,\n 29.105419\n ],\n [\n 113.749677,\n 29.060973\n ],\n [\n 113.66283,\n 29.1697\n ],\n [\n 113.689931,\n 29.230808\n ],\n [\n 113.606779,\n 29.253779\n ],\n [\n 113.686236,\n 29.392021\n ],\n [\n 113.753373,\n 29.43997\n ],\n [\n 113.630801,\n 29.523307\n ],\n [\n 113.736743,\n 29.576918\n ],\n [\n 113.664678,\n 29.683536\n ],\n [\n 113.547033,\n 29.675219\n ],\n [\n 113.566127,\n 29.846105\n ],\n [\n 113.37765,\n 29.703287\n ],\n [\n 113.145441,\n 29.449349\n ],\n [\n 113.078304,\n 29.438407\n ],\n [\n 113.057362,\n 29.522265\n ],\n [\n 112.950188,\n 29.472792\n ],\n [\n 112.912,\n 29.607095\n ],\n [\n 113.004391,\n 29.692892\n ],\n [\n 113.020405,\n 29.772384\n ],\n [\n 112.937869,\n 29.783809\n ],\n [\n 112.939101,\n 29.768229\n ],\n [\n 112.926782,\n 29.763036\n ],\n [\n 112.861493,\n 29.78329\n ],\n [\n 112.79374,\n 29.736023\n ],\n [\n 112.788812,\n 29.681457\n ],\n [\n 112.687182,\n 29.592528\n ],\n [\n 112.439574,\n 29.633622\n ],\n [\n 112.369973,\n 29.542048\n ],\n [\n 112.281278,\n 29.536842\n ],\n [\n 112.303452,\n 29.585244\n ],\n [\n 112.111279,\n 29.659622\n ],\n [\n 112.07617,\n 29.740179\n ],\n [\n 111.95483,\n 29.796791\n ],\n [\n 111.962222,\n 29.837282\n ],\n [\n 111.862439,\n 29.856484\n ],\n [\n 111.807005,\n 29.904213\n ],\n [\n 111.723853,\n 29.909399\n ],\n [\n 111.723853,\n 29.909399\n ],\n [\n 111.709686,\n 29.897988\n ],\n [\n 111.709686,\n 29.897988\n ],\n [\n 111.39063,\n 29.914585\n ],\n [\n 111.244036,\n 30.039492\n ],\n [\n 110.929907,\n 30.063316\n ],\n [\n 110.924364,\n 30.111463\n ],\n [\n 110.746973,\n 30.113015\n ],\n [\n 110.712481,\n 30.033277\n ],\n [\n 110.650887,\n 30.077814\n ],\n [\n 110.497518,\n 30.05503\n ],\n [\n 110.557264,\n 29.988201\n ],\n [\n 110.498134,\n 29.910955\n ],\n [\n 110.60038,\n 29.839877\n ],\n [\n 110.642264,\n 29.777578\n ],\n [\n 110.507373,\n 29.691853\n ],\n [\n 110.360779,\n 29.635702\n ],\n [\n 110.219729,\n 29.746413\n ],\n [\n 110.113788,\n 29.789521\n ],\n [\n 110.02386,\n 29.769788\n ],\n [\n 109.869876,\n 29.774462\n ],\n [\n 109.775637,\n 29.755244\n ],\n [\n 109.714043,\n 29.673139\n ],\n [\n 109.717739,\n 29.614897\n ],\n [\n 109.516326,\n 29.62582\n ],\n [\n 109.458428,\n 29.513414\n ],\n [\n 109.343863,\n 29.369602\n ],\n [\n 109.352487,\n 29.284574\n ],\n [\n 109.258248,\n 29.21932\n ],\n [\n 109.274262,\n 29.122146\n ],\n [\n 109.232378,\n 29.119533\n ]\n ]\n ],\n [\n [\n [\n 113.020405,\n 29.772384\n ],\n [\n 112.926782,\n 29.692372\n ],\n [\n 112.926782,\n 29.763036\n ],\n [\n 112.939101,\n 29.768229\n ],\n [\n 112.937869,\n 29.783809\n ],\n [\n 113.020405,\n 29.772384\n ]\n ]\n ],\n [\n [\n [\n 111.032769,\n 33.209265\n ],\n [\n 111.056791,\n 33.192743\n ],\n [\n 111.031537,\n 33.17722\n ],\n [\n 111.037081,\n 33.187235\n ],\n [\n 111.032769,\n 33.209265\n ]\n ]\n ],\n [\n [\n [\n 109.106111,\n 30.57052\n ],\n [\n 109.09872,\n 30.579277\n ],\n [\n 109.100567,\n 30.580823\n ],\n [\n 109.106727,\n 30.572066\n ],\n [\n 109.106111,\n 30.57052\n ]\n ]\n ],\n [\n [\n [\n 112.732146,\n 32.362707\n ],\n [\n 112.730914,\n 32.363212\n ],\n [\n 112.729066,\n 32.366245\n ],\n [\n 112.733993,\n 32.363718\n ],\n [\n 112.732146,\n 32.362707\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 430000,\n \"name\": \"湖南省\",\n \"center\": [\n 112.982279,\n 28.19409\n ],\n \"centroid\": [\n 111.754313,\n 27.655081\n ],\n \"childrenNum\": 14,\n \"level\": \"province\",\n \"subFeatureIndex\": 17,\n \"acroutes\": [\n 100000\n ],\n \"parent\": {\n \"adcode\": 100000\n }\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 109.965962,\n 26.195699\n ],\n [\n 110.017701,\n 26.343246\n ],\n [\n 109.932701,\n 26.476145\n ],\n [\n 109.856325,\n 26.465433\n ],\n [\n 109.892665,\n 26.525408\n ],\n [\n 109.82676,\n 26.605681\n ],\n [\n 109.946252,\n 26.685899\n ],\n [\n 109.838463,\n 26.72759\n ],\n [\n 109.821216,\n 26.781017\n ],\n [\n 109.652449,\n 26.76232\n ],\n [\n 109.660456,\n 26.709419\n ],\n [\n 109.590855,\n 26.686433\n ],\n [\n 109.529261,\n 26.740414\n ],\n [\n 109.548971,\n 26.737208\n ],\n [\n 109.548971,\n 26.737208\n ],\n [\n 109.528029,\n 26.744689\n ],\n [\n 109.52187,\n 26.748964\n ],\n [\n 109.504624,\n 26.805051\n ],\n [\n 109.500928,\n 26.828546\n ],\n [\n 109.486761,\n 26.895267\n ],\n [\n 109.555131,\n 26.947015\n ],\n [\n 109.520022,\n 27.058433\n ],\n [\n 109.454733,\n 27.069622\n ],\n [\n 109.472595,\n 27.135136\n ],\n [\n 109.415928,\n 27.15377\n ],\n [\n 109.267487,\n 27.128746\n ],\n [\n 109.164625,\n 27.065893\n ],\n [\n 109.07901,\n 27.115965\n ],\n [\n 108.87575,\n 26.999273\n ],\n [\n 108.791366,\n 27.084539\n ],\n [\n 108.878829,\n 27.106378\n ],\n [\n 108.907162,\n 27.2054\n ],\n [\n 109.040821,\n 27.276151\n ],\n [\n 109.142451,\n 27.418051\n ],\n [\n 109.202197,\n 27.449913\n ],\n [\n 109.300132,\n 27.423893\n ],\n [\n 109.303211,\n 27.475396\n ],\n [\n 109.461508,\n 27.567724\n ],\n [\n 109.470747,\n 27.68011\n ],\n [\n 109.332777,\n 27.782853\n ],\n [\n 109.345711,\n 27.840537\n ],\n [\n 109.30198,\n 27.956342\n ],\n [\n 109.378972,\n 28.032948\n ],\n [\n 109.298284,\n 28.036117\n ],\n [\n 109.340168,\n 28.190216\n ],\n [\n 109.388211,\n 28.268236\n ],\n [\n 109.27303,\n 28.310386\n ],\n [\n 109.274262,\n 28.494592\n ],\n [\n 109.321074,\n 28.581322\n ],\n [\n 109.304443,\n 28.623871\n ],\n [\n 109.201581,\n 28.598133\n ],\n [\n 109.2989,\n 28.747221\n ],\n [\n 109.241002,\n 28.776594\n ],\n [\n 109.235458,\n 28.882476\n ],\n [\n 109.319842,\n 29.042667\n ],\n [\n 109.232378,\n 29.119533\n ],\n [\n 109.274262,\n 29.122146\n ],\n [\n 109.258248,\n 29.21932\n ],\n [\n 109.352487,\n 29.284574\n ],\n [\n 109.343863,\n 29.369602\n ],\n [\n 109.458428,\n 29.513414\n ],\n [\n 109.516326,\n 29.62582\n ],\n [\n 109.717739,\n 29.614897\n ],\n [\n 109.714043,\n 29.673139\n ],\n [\n 109.775637,\n 29.755244\n ],\n [\n 109.869876,\n 29.774462\n ],\n [\n 110.02386,\n 29.769788\n ],\n [\n 110.113788,\n 29.789521\n ],\n [\n 110.219729,\n 29.746413\n ],\n [\n 110.360779,\n 29.635702\n ],\n [\n 110.507373,\n 29.691853\n ],\n [\n 110.642264,\n 29.777578\n ],\n [\n 110.60038,\n 29.839877\n ],\n [\n 110.498134,\n 29.910955\n ],\n [\n 110.557264,\n 29.988201\n ],\n [\n 110.497518,\n 30.05503\n ],\n [\n 110.650887,\n 30.077814\n ],\n [\n 110.712481,\n 30.033277\n ],\n [\n 110.746973,\n 30.113015\n ],\n [\n 110.924364,\n 30.111463\n ],\n [\n 110.929907,\n 30.063316\n ],\n [\n 111.244036,\n 30.039492\n ],\n [\n 111.39063,\n 29.914585\n ],\n [\n 111.709686,\n 29.897988\n ],\n [\n 111.709686,\n 29.897988\n ],\n [\n 111.723853,\n 29.909399\n ],\n [\n 111.723853,\n 29.909399\n ],\n [\n 111.807005,\n 29.904213\n ],\n [\n 111.862439,\n 29.856484\n ],\n [\n 111.962222,\n 29.837282\n ],\n [\n 111.95483,\n 29.796791\n ],\n [\n 112.07617,\n 29.740179\n ],\n [\n 112.111279,\n 29.659622\n ],\n [\n 112.303452,\n 29.585244\n ],\n [\n 112.281278,\n 29.536842\n ],\n [\n 112.369973,\n 29.542048\n ],\n [\n 112.439574,\n 29.633622\n ],\n [\n 112.687182,\n 29.592528\n ],\n [\n 112.788812,\n 29.681457\n ],\n [\n 112.79374,\n 29.736023\n ],\n [\n 112.861493,\n 29.78329\n ],\n [\n 112.926782,\n 29.763036\n ],\n [\n 112.926782,\n 29.692372\n ],\n [\n 113.020405,\n 29.772384\n ],\n [\n 113.004391,\n 29.692892\n ],\n [\n 112.912,\n 29.607095\n ],\n [\n 112.950188,\n 29.472792\n ],\n [\n 113.057362,\n 29.522265\n ],\n [\n 113.078304,\n 29.438407\n ],\n [\n 113.145441,\n 29.449349\n ],\n [\n 113.37765,\n 29.703287\n ],\n [\n 113.566127,\n 29.846105\n ],\n [\n 113.547033,\n 29.675219\n ],\n [\n 113.664678,\n 29.683536\n ],\n [\n 113.736743,\n 29.576918\n ],\n [\n 113.630801,\n 29.523307\n ],\n [\n 113.753373,\n 29.43997\n ],\n [\n 113.686236,\n 29.392021\n ],\n [\n 113.606779,\n 29.253779\n ],\n [\n 113.689931,\n 29.230808\n ],\n [\n 113.66283,\n 29.1697\n ],\n [\n 113.749677,\n 29.060973\n ],\n [\n 113.816199,\n 29.105419\n ],\n [\n 113.877793,\n 29.035343\n ],\n [\n 113.94185,\n 29.047374\n ],\n [\n 113.966488,\n 28.945326\n ],\n [\n 114.008988,\n 28.955273\n ],\n [\n 114.076741,\n 28.834266\n ],\n [\n 114.152502,\n 28.83479\n ],\n [\n 114.157429,\n 28.761384\n ],\n [\n 114.08598,\n 28.558201\n ],\n [\n 114.218407,\n 28.484601\n ],\n [\n 114.172212,\n 28.432524\n ],\n [\n 114.252284,\n 28.395687\n ],\n [\n 114.25598,\n 28.323554\n ],\n [\n 114.107538,\n 28.182833\n ],\n [\n 113.992357,\n 28.161207\n ],\n [\n 114.047176,\n 28.05724\n ],\n [\n 113.914133,\n 27.991218\n ],\n [\n 113.864242,\n 28.004954\n ],\n [\n 113.752141,\n 27.933614\n ],\n [\n 113.729967,\n 27.887086\n ],\n [\n 113.763228,\n 27.799262\n ],\n [\n 113.607395,\n 27.625522\n ],\n [\n 113.583374,\n 27.524754\n ],\n [\n 113.632033,\n 27.405303\n ],\n [\n 113.616635,\n 27.345264\n ],\n [\n 113.872865,\n 27.385116\n ],\n [\n 113.848844,\n 27.225087\n ],\n [\n 113.779242,\n 27.137265\n ],\n [\n 113.821126,\n 27.037651\n ],\n [\n 113.927068,\n 26.949149\n ],\n [\n 113.834677,\n 26.803983\n ],\n [\n 113.860546,\n 26.663978\n ],\n [\n 113.915365,\n 26.613706\n ],\n [\n 114.106306,\n 26.576254\n ],\n [\n 114.073046,\n 26.480965\n ],\n [\n 114.085364,\n 26.4065\n ],\n [\n 114.030546,\n 26.376485\n ],\n [\n 114.029314,\n 26.266545\n ],\n [\n 113.944314,\n 26.16402\n ],\n [\n 114.088444,\n 26.168316\n ],\n [\n 114.181451,\n 26.214489\n ],\n [\n 114.237501,\n 26.152204\n ],\n [\n 114.044096,\n 26.076452\n ],\n [\n 114.007756,\n 26.007104\n ],\n [\n 114.028082,\n 25.893586\n ],\n [\n 113.971416,\n 25.835979\n ],\n [\n 113.913517,\n 25.701272\n ],\n [\n 113.983118,\n 25.599332\n ],\n [\n 113.94493,\n 25.441667\n ],\n [\n 113.887032,\n 25.436804\n ],\n [\n 113.822974,\n 25.331935\n ],\n [\n 113.753373,\n 25.362756\n ],\n [\n 113.611707,\n 25.326527\n ],\n [\n 113.611707,\n 25.326527\n ],\n [\n 113.535946,\n 25.368704\n ],\n [\n 113.449715,\n 25.359512\n ],\n [\n 113.373338,\n 25.402758\n ],\n [\n 113.311129,\n 25.490284\n ],\n [\n 113.248919,\n 25.514045\n ],\n [\n 113.11834,\n 25.445449\n ],\n [\n 113.080151,\n 25.3833\n ],\n [\n 112.900297,\n 25.311383\n ],\n [\n 112.867036,\n 25.249706\n ],\n [\n 112.992688,\n 25.247\n ],\n [\n 113.034572,\n 25.198285\n ],\n [\n 112.96805,\n 25.141426\n ],\n [\n 113.018557,\n 25.082914\n ],\n [\n 112.979137,\n 25.034133\n ],\n [\n 113.011782,\n 24.946279\n ],\n [\n 112.871348,\n 24.895816\n ],\n [\n 112.780805,\n 24.896901\n ],\n [\n 112.712436,\n 25.083456\n ],\n [\n 112.660081,\n 25.132759\n ],\n [\n 112.414937,\n 25.142509\n ],\n [\n 112.369357,\n 25.189081\n ],\n [\n 112.3053,\n 25.157132\n ],\n [\n 112.187039,\n 25.182584\n ],\n [\n 112.155626,\n 25.026544\n ],\n [\n 112.119902,\n 24.963638\n ],\n [\n 112.175337,\n 24.92729\n ],\n [\n 112.171025,\n 24.86379\n ],\n [\n 112.097112,\n 24.826327\n ],\n [\n 112.024431,\n 24.739955\n ],\n [\n 111.951135,\n 24.769839\n ],\n [\n 111.68936,\n 24.778531\n ],\n [\n 111.570484,\n 24.644821\n ],\n [\n 111.431282,\n 24.687776\n ],\n [\n 111.479325,\n 24.797543\n ],\n [\n 111.470086,\n 24.928917\n ],\n [\n 111.43313,\n 24.97991\n ],\n [\n 111.435593,\n 25.09321\n ],\n [\n 111.321645,\n 25.10513\n ],\n [\n 111.274833,\n 25.151175\n ],\n [\n 111.200921,\n 25.074786\n ],\n [\n 111.101754,\n 25.035218\n ],\n [\n 111.100522,\n 24.945736\n ],\n [\n 110.991501,\n 24.924034\n ],\n [\n 110.951465,\n 25.043891\n ],\n [\n 110.998892,\n 25.161465\n ],\n [\n 111.112841,\n 25.217232\n ],\n [\n 111.103602,\n 25.284877\n ],\n [\n 111.301319,\n 25.450851\n ],\n [\n 111.343202,\n 25.602569\n ],\n [\n 111.30871,\n 25.72014\n ],\n [\n 111.442369,\n 25.771877\n ],\n [\n 111.43313,\n 25.84621\n ],\n [\n 111.49226,\n 25.868824\n ],\n [\n 111.346282,\n 25.906504\n ],\n [\n 111.252043,\n 25.864517\n ],\n [\n 111.189834,\n 25.953318\n ],\n [\n 111.267442,\n 26.058716\n ],\n [\n 111.279761,\n 26.271911\n ],\n [\n 111.204616,\n 26.307852\n ],\n [\n 111.092515,\n 26.306779\n ],\n [\n 110.94469,\n 26.373805\n ],\n [\n 110.939146,\n 26.28425\n ],\n [\n 110.76114,\n 26.248838\n ],\n [\n 110.612083,\n 26.333594\n ],\n [\n 110.555416,\n 26.286396\n ],\n [\n 110.516612,\n 26.186035\n ],\n [\n 110.373098,\n 26.08935\n ],\n [\n 110.325671,\n 25.975373\n ],\n [\n 110.257301,\n 25.961388\n ],\n [\n 110.201251,\n 26.066241\n ],\n [\n 110.165527,\n 26.023773\n ],\n [\n 110.065128,\n 26.051191\n ],\n [\n 110.099005,\n 26.16939\n ],\n [\n 109.965962,\n 26.195699\n ]\n ]\n ],\n [\n [\n [\n 109.48245,\n 26.029687\n ],\n [\n 109.449805,\n 26.101709\n ],\n [\n 109.486761,\n 26.148445\n ],\n [\n 109.486761,\n 26.148445\n ],\n [\n 109.439334,\n 26.238641\n ],\n [\n 109.466435,\n 26.314288\n ],\n [\n 109.340784,\n 26.264399\n ],\n [\n 109.285965,\n 26.296052\n ],\n [\n 109.326001,\n 26.427398\n ],\n [\n 109.407305,\n 26.532902\n ],\n [\n 109.35495,\n 26.693383\n ],\n [\n 109.454117,\n 26.761252\n ],\n [\n 109.52187,\n 26.748964\n ],\n [\n 109.528029,\n 26.744689\n ],\n [\n 109.529261,\n 26.740414\n ],\n [\n 109.590855,\n 26.686433\n ],\n [\n 109.660456,\n 26.709419\n ],\n [\n 109.652449,\n 26.76232\n ],\n [\n 109.821216,\n 26.781017\n ],\n [\n 109.838463,\n 26.72759\n ],\n [\n 109.946252,\n 26.685899\n ],\n [\n 109.82676,\n 26.605681\n ],\n [\n 109.892665,\n 26.525408\n ],\n [\n 109.856325,\n 26.465433\n ],\n [\n 109.932701,\n 26.476145\n ],\n [\n 110.017701,\n 26.343246\n ],\n [\n 109.965962,\n 26.195699\n ],\n [\n 109.906832,\n 26.143611\n ],\n [\n 109.864332,\n 26.027537\n ],\n [\n 109.783028,\n 25.988282\n ],\n [\n 109.806434,\n 25.874746\n ],\n [\n 109.685094,\n 25.880129\n ],\n [\n 109.730057,\n 25.989895\n ],\n [\n 109.635203,\n 26.047428\n ],\n [\n 109.513247,\n 25.997962\n ],\n [\n 109.48245,\n 26.029687\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 440000,\n \"name\": \"广东省\",\n \"center\": [\n 113.280637,\n 23.125178\n ],\n \"centroid\": [\n 113.429877,\n 23.334664\n ],\n \"childrenNum\": 22,\n \"level\": \"province\",\n \"subFeatureIndex\": 18,\n \"acroutes\": [\n 100000\n ],\n \"parent\": {\n \"adcode\": 100000\n }\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 109.785492,\n 21.457116\n ],\n [\n 109.742992,\n 21.61629\n ],\n [\n 109.898209,\n 21.649661\n ],\n [\n 109.940709,\n 21.734723\n ],\n [\n 109.94502,\n 21.844172\n ],\n [\n 110.051578,\n 21.856945\n ],\n [\n 110.119947,\n 21.901918\n ],\n [\n 110.200019,\n 21.898587\n ],\n [\n 110.200019,\n 21.898587\n ],\n [\n 110.388497,\n 21.89026\n ],\n [\n 110.355236,\n 22.061709\n ],\n [\n 110.355236,\n 22.061709\n ],\n [\n 110.350924,\n 22.072799\n ],\n [\n 110.350924,\n 22.072799\n ],\n [\n 110.414366,\n 22.20858\n ],\n [\n 110.488895,\n 22.144863\n ],\n [\n 110.560344,\n 22.196393\n ],\n [\n 110.629329,\n 22.149296\n ],\n [\n 110.646575,\n 22.222982\n ],\n [\n 110.725415,\n 22.295522\n ],\n [\n 110.785777,\n 22.294415\n ],\n [\n 110.711249,\n 22.369684\n ],\n [\n 110.778386,\n 22.585304\n ],\n [\n 111.055559,\n 22.648268\n ],\n [\n 111.056791,\n 22.72776\n ],\n [\n 111.202152,\n 22.740452\n ],\n [\n 111.358601,\n 22.889362\n ],\n [\n 111.363528,\n 22.968713\n ],\n [\n 111.433746,\n 23.036456\n ],\n [\n 111.377695,\n 23.082149\n ],\n [\n 111.388782,\n 23.210337\n ],\n [\n 111.353673,\n 23.28895\n ],\n [\n 111.399869,\n 23.469638\n ],\n [\n 111.479941,\n 23.532738\n ],\n [\n 111.487332,\n 23.62651\n ],\n [\n 111.615448,\n 23.639117\n ],\n [\n 111.667187,\n 23.718023\n ],\n [\n 111.621607,\n 23.725692\n ],\n [\n 111.664723,\n 23.83465\n ],\n [\n 111.8107,\n 23.806735\n ],\n [\n 111.812548,\n 23.887727\n ],\n [\n 111.940664,\n 23.987803\n ],\n [\n 111.878454,\n 24.110195\n ],\n [\n 111.877838,\n 24.229196\n ],\n [\n 111.939432,\n 24.230287\n ],\n [\n 112.029975,\n 24.297925\n ],\n [\n 112.057692,\n 24.387327\n ],\n [\n 111.985011,\n 24.467953\n ],\n [\n 112.007185,\n 24.534376\n ],\n [\n 111.937584,\n 24.595323\n ],\n [\n 111.961606,\n 24.720934\n ],\n [\n 112.024431,\n 24.739955\n ],\n [\n 112.097112,\n 24.826327\n ],\n [\n 112.171025,\n 24.86379\n ],\n [\n 112.175337,\n 24.92729\n ],\n [\n 112.119902,\n 24.963638\n ],\n [\n 112.155626,\n 25.026544\n ],\n [\n 112.187039,\n 25.182584\n ],\n [\n 112.3053,\n 25.157132\n ],\n [\n 112.369357,\n 25.189081\n ],\n [\n 112.414937,\n 25.142509\n ],\n [\n 112.660081,\n 25.132759\n ],\n [\n 112.712436,\n 25.083456\n ],\n [\n 112.780805,\n 24.896901\n ],\n [\n 112.871348,\n 24.895816\n ],\n [\n 113.011782,\n 24.946279\n ],\n [\n 112.979137,\n 25.034133\n ],\n [\n 113.018557,\n 25.082914\n ],\n [\n 112.96805,\n 25.141426\n ],\n [\n 113.034572,\n 25.198285\n ],\n [\n 112.992688,\n 25.247\n ],\n [\n 112.867036,\n 25.249706\n ],\n [\n 112.900297,\n 25.311383\n ],\n [\n 113.080151,\n 25.3833\n ],\n [\n 113.11834,\n 25.445449\n ],\n [\n 113.248919,\n 25.514045\n ],\n [\n 113.311129,\n 25.490284\n ],\n [\n 113.373338,\n 25.402758\n ],\n [\n 113.449715,\n 25.359512\n ],\n [\n 113.535946,\n 25.368704\n ],\n [\n 113.611707,\n 25.326527\n ],\n [\n 113.611707,\n 25.326527\n ],\n [\n 113.753373,\n 25.362756\n ],\n [\n 113.822974,\n 25.331935\n ],\n [\n 113.887032,\n 25.436804\n ],\n [\n 113.94493,\n 25.441667\n ],\n [\n 114.051488,\n 25.348699\n ],\n [\n 114.039785,\n 25.250789\n ],\n [\n 114.13156,\n 25.30922\n ],\n [\n 114.262755,\n 25.29191\n ],\n [\n 114.31511,\n 25.338424\n ],\n [\n 114.381015,\n 25.31571\n ],\n [\n 114.535616,\n 25.41681\n ],\n [\n 114.63663,\n 25.324364\n ],\n [\n 114.743188,\n 25.274597\n ],\n [\n 114.679746,\n 25.194495\n ],\n [\n 114.735796,\n 25.121925\n ],\n [\n 114.640326,\n 25.073702\n ],\n [\n 114.561485,\n 25.077495\n ],\n [\n 114.506051,\n 24.999975\n ],\n [\n 114.395798,\n 24.951161\n ],\n [\n 114.403189,\n 24.877361\n ],\n [\n 114.33482,\n 24.747562\n ],\n [\n 114.27261,\n 24.700279\n ],\n [\n 114.169132,\n 24.689407\n ],\n [\n 114.258443,\n 24.641558\n ],\n [\n 114.308334,\n 24.574104\n ],\n [\n 114.391486,\n 24.562677\n ],\n [\n 114.428443,\n 24.486468\n ],\n [\n 114.534384,\n 24.558867\n ],\n [\n 114.589819,\n 24.537642\n ],\n [\n 114.664963,\n 24.583898\n ],\n [\n 114.704999,\n 24.526211\n ],\n [\n 114.729637,\n 24.608924\n ],\n [\n 114.868839,\n 24.562132\n ],\n [\n 114.909491,\n 24.661679\n ],\n [\n 115.056701,\n 24.703541\n ],\n [\n 115.095505,\n 24.674184\n ],\n [\n 115.308004,\n 24.758429\n ],\n [\n 115.358511,\n 24.735064\n ],\n [\n 115.412714,\n 24.792654\n ],\n [\n 115.556227,\n 24.682883\n ],\n [\n 115.573474,\n 24.617083\n ],\n [\n 115.67264,\n 24.604028\n ],\n [\n 115.688038,\n 24.545261\n ],\n [\n 115.845103,\n 24.563221\n ],\n [\n 115.756408,\n 24.749192\n ],\n [\n 115.822313,\n 24.90884\n ],\n [\n 115.907313,\n 24.880075\n ],\n [\n 115.89253,\n 24.937056\n ],\n [\n 116.014486,\n 24.905584\n ],\n [\n 116.068073,\n 24.849675\n ],\n [\n 116.18079,\n 24.87519\n ],\n [\n 116.245464,\n 24.793197\n ],\n [\n 116.376659,\n 24.820353\n ],\n [\n 116.44626,\n 24.714412\n ],\n [\n 116.486912,\n 24.71876\n ],\n [\n 116.525716,\n 24.604572\n ],\n [\n 116.597165,\n 24.65461\n ],\n [\n 116.778867,\n 24.680165\n ],\n [\n 116.815207,\n 24.655154\n ],\n [\n 116.761005,\n 24.58281\n ],\n [\n 116.789338,\n 24.50988\n ],\n [\n 116.860787,\n 24.462507\n ],\n [\n 116.903903,\n 24.369888\n ],\n [\n 116.933468,\n 24.21992\n ],\n [\n 116.998757,\n 24.178988\n ],\n [\n 116.9347,\n 24.127123\n ],\n [\n 116.939627,\n 24.033713\n ],\n [\n 116.981511,\n 23.999282\n ],\n [\n 116.980279,\n 23.881709\n ],\n [\n 117.012308,\n 23.855446\n ],\n [\n 117.053576,\n 23.696657\n ],\n [\n 117.192778,\n 23.629799\n ],\n [\n 117.192778,\n 23.561809\n ],\n [\n 117.054192,\n 23.542064\n ],\n [\n 117.01046,\n 23.502564\n ],\n [\n 116.921765,\n 23.53219\n ],\n [\n 116.874953,\n 23.447683\n ],\n [\n 116.874338,\n 23.447683\n ],\n [\n 116.871258,\n 23.416391\n ],\n [\n 116.871874,\n 23.415842\n ],\n [\n 116.782563,\n 23.313679\n ],\n [\n 116.806584,\n 23.200989\n ],\n [\n 116.74499,\n 23.215286\n ],\n [\n 116.550969,\n 23.109668\n ],\n [\n 116.576839,\n 23.014429\n ],\n [\n 116.50539,\n 22.930696\n ],\n [\n 116.382818,\n 22.919124\n ],\n [\n 116.317528,\n 22.952736\n ],\n [\n 116.226985,\n 22.914715\n ],\n [\n 116.106877,\n 22.817685\n ],\n [\n 116.073616,\n 22.8425\n ],\n [\n 115.883291,\n 22.785142\n ],\n [\n 115.796444,\n 22.739349\n ],\n [\n 115.788437,\n 22.809964\n ],\n [\n 115.654162,\n 22.865657\n ],\n [\n 115.542677,\n 22.76142\n ],\n [\n 115.606119,\n 22.754799\n ],\n [\n 115.57409,\n 22.650477\n ],\n [\n 115.471844,\n 22.697956\n ],\n [\n 115.381301,\n 22.684156\n ],\n [\n 115.338185,\n 22.776867\n ],\n [\n 115.230396,\n 22.776867\n ],\n [\n 115.236555,\n 22.825406\n ],\n [\n 115.054853,\n 22.777419\n ],\n [\n 115.04007,\n 22.712307\n ],\n [\n 114.87623,\n 22.589724\n ],\n [\n 114.747499,\n 22.581437\n ],\n [\n 114.728405,\n 22.651029\n ],\n [\n 114.749963,\n 22.764179\n ],\n [\n 114.709927,\n 22.7879\n ],\n [\n 114.512826,\n 22.655446\n ],\n [\n 114.603369,\n 22.63888\n ],\n [\n 114.559022,\n 22.583094\n ],\n [\n 114.616304,\n 22.54276\n ],\n [\n 114.611377,\n 22.481959\n ],\n [\n 114.485109,\n 22.446572\n ],\n [\n 114.467863,\n 22.533365\n ],\n [\n 114.41058,\n 22.599667\n ],\n [\n 114.232574,\n 22.539997\n ],\n [\n 114.185762,\n 22.551601\n ],\n [\n 114.185762,\n 22.551601\n ],\n [\n 114.045944,\n 22.502413\n ],\n [\n 114.044096,\n 22.502413\n ],\n [\n 114.031778,\n 22.504071\n ],\n [\n 113.959097,\n 22.505177\n ],\n [\n 113.891959,\n 22.442701\n ],\n [\n 113.733663,\n 22.73659\n ],\n [\n 113.678228,\n 22.726104\n ],\n [\n 113.740438,\n 22.53447\n ],\n [\n 113.631417,\n 22.475877\n ],\n [\n 113.669605,\n 22.416154\n ],\n [\n 113.558736,\n 22.213012\n ],\n [\n 113.553809,\n 22.107727\n ],\n [\n 113.442324,\n 22.009575\n ],\n [\n 113.330223,\n 21.961861\n ],\n [\n 113.246455,\n 21.880266\n ],\n [\n 113.091854,\n 22.065591\n ],\n [\n 113.032724,\n 22.072799\n ],\n [\n 113.037652,\n 21.935223\n ],\n [\n 112.944645,\n 21.84195\n ],\n [\n 112.795587,\n 21.923567\n ],\n [\n 112.651458,\n 21.761954\n ],\n [\n 112.523342,\n 21.760842\n ],\n [\n 112.439574,\n 21.803624\n ],\n [\n 112.415553,\n 21.734723\n ],\n [\n 112.24001,\n 21.701371\n ],\n [\n 112.192583,\n 21.78918\n ],\n [\n 112.036134,\n 21.761398\n ],\n [\n 111.951135,\n 21.671904\n ],\n [\n 112.026895,\n 21.633533\n ],\n [\n 111.811316,\n 21.558985\n ],\n [\n 111.810084,\n 21.604609\n ],\n [\n 111.693672,\n 21.590144\n ],\n [\n 111.677658,\n 21.52949\n ],\n [\n 111.382623,\n 21.495534\n ],\n [\n 111.257587,\n 21.413675\n ],\n [\n 111.28284,\n 21.485513\n ],\n [\n 111.061102,\n 21.44932\n ],\n [\n 110.929291,\n 21.375792\n ],\n [\n 110.799328,\n 21.374678\n ],\n [\n 110.626249,\n 21.215797\n ],\n [\n 110.422373,\n 21.190695\n ],\n [\n 110.388497,\n 21.125968\n ],\n [\n 110.296722,\n 21.093594\n ],\n [\n 110.180925,\n 20.981905\n ],\n [\n 110.201251,\n 20.867337\n ],\n [\n 110.390344,\n 20.820367\n ],\n [\n 110.392192,\n 20.682727\n ],\n [\n 110.466105,\n 20.680488\n ],\n [\n 110.548025,\n 20.477715\n ],\n [\n 110.545561,\n 20.42726\n ],\n [\n 110.452554,\n 20.311151\n ],\n [\n 110.349076,\n 20.258958\n ],\n [\n 110.118099,\n 20.219661\n ],\n [\n 110.082375,\n 20.258958\n ],\n [\n 109.910528,\n 20.224152\n ],\n [\n 109.916071,\n 20.316762\n ],\n [\n 109.861252,\n 20.376789\n ],\n [\n 109.888354,\n 20.475473\n ],\n [\n 109.839695,\n 20.489485\n ],\n [\n 109.793499,\n 20.61554\n ],\n [\n 109.74484,\n 20.62114\n ],\n [\n 109.730057,\n 20.719667\n ],\n [\n 109.654913,\n 20.903673\n ],\n [\n 109.674623,\n 21.136572\n ],\n [\n 109.763934,\n 21.226395\n ],\n [\n 109.757775,\n 21.346816\n ],\n [\n 109.868644,\n 21.365763\n ],\n [\n 109.894513,\n 21.44208\n ],\n [\n 109.785492,\n 21.457116\n ]\n ]\n ],\n [\n [\n [\n 117.100387,\n 23.401566\n ],\n [\n 116.946402,\n 23.421881\n ],\n [\n 117.129336,\n 23.483358\n ],\n [\n 117.100387,\n 23.401566\n ]\n ]\n ],\n [\n [\n [\n 112.853486,\n 21.74028\n ],\n [\n 112.804826,\n 21.686361\n ],\n [\n 112.817145,\n 21.590144\n ],\n [\n 112.730914,\n 21.613509\n ],\n [\n 112.782037,\n 21.665788\n ],\n [\n 112.70566,\n 21.679133\n ],\n [\n 112.831312,\n 21.77529\n ],\n [\n 112.853486,\n 21.74028\n ]\n ]\n ],\n [\n [\n [\n 112.625588,\n 21.616847\n ],\n [\n 112.535045,\n 21.628527\n ],\n [\n 112.663776,\n 21.714157\n ],\n [\n 112.625588,\n 21.616847\n ]\n ]\n ],\n [\n [\n [\n 110.495054,\n 21.075171\n ],\n [\n 110.560344,\n 21.061213\n ],\n [\n 110.535706,\n 20.923235\n ],\n [\n 110.47288,\n 20.983022\n ],\n [\n 110.347845,\n 20.984698\n ],\n [\n 110.201251,\n 20.938324\n ],\n [\n 110.211106,\n 20.986933\n ],\n [\n 110.305961,\n 21.088012\n ],\n [\n 110.495054,\n 21.075171\n ]\n ]\n ],\n [\n [\n [\n 110.501829,\n 21.142711\n ],\n [\n 110.431612,\n 21.181211\n ],\n [\n 110.634256,\n 21.21022\n ],\n [\n 110.582517,\n 21.094711\n ],\n [\n 110.501829,\n 21.142711\n ]\n ]\n ],\n [\n [\n [\n 116.769628,\n 20.771704\n ],\n [\n 116.88604,\n 20.77562\n ],\n [\n 116.934084,\n 20.67657\n ],\n [\n 116.862635,\n 20.588657\n ],\n [\n 116.749302,\n 20.600979\n ],\n [\n 116.849084,\n 20.62842\n ],\n [\n 116.87249,\n 20.738134\n ],\n [\n 116.769628,\n 20.771704\n ]\n ]\n ],\n [\n [\n [\n 110.598532,\n 20.857273\n ],\n [\n 110.548641,\n 20.908703\n ],\n [\n 110.584365,\n 20.948941\n ],\n [\n 110.646575,\n 20.917087\n ],\n [\n 110.598532,\n 20.857273\n ]\n ]\n ],\n [\n [\n [\n 115.943037,\n 21.097502\n ],\n [\n 116.044051,\n 21.11034\n ],\n [\n 116.067457,\n 21.040552\n ],\n [\n 115.989233,\n 21.035526\n ],\n [\n 115.943037,\n 21.097502\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 450000,\n \"name\": \"广西壮族自治区\",\n \"center\": [\n 108.320004,\n 22.82402\n ],\n \"centroid\": [\n 108.794237,\n 23.833575\n ],\n \"childrenNum\": 14,\n \"level\": \"province\",\n \"subFeatureIndex\": 19,\n \"acroutes\": [\n 100000\n ],\n \"parent\": {\n \"adcode\": 100000\n }\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 112.024431,\n 24.739955\n ],\n [\n 111.961606,\n 24.720934\n ],\n [\n 111.937584,\n 24.595323\n ],\n [\n 112.007185,\n 24.534376\n ],\n [\n 111.985011,\n 24.467953\n ],\n [\n 112.057692,\n 24.387327\n ],\n [\n 112.029975,\n 24.297925\n ],\n [\n 111.939432,\n 24.230287\n ],\n [\n 111.877838,\n 24.229196\n ],\n [\n 111.878454,\n 24.110195\n ],\n [\n 111.940664,\n 23.987803\n ],\n [\n 111.812548,\n 23.887727\n ],\n [\n 111.8107,\n 23.806735\n ],\n [\n 111.664723,\n 23.83465\n ],\n [\n 111.621607,\n 23.725692\n ],\n [\n 111.667187,\n 23.718023\n ],\n [\n 111.615448,\n 23.639117\n ],\n [\n 111.487332,\n 23.62651\n ],\n [\n 111.479941,\n 23.532738\n ],\n [\n 111.399869,\n 23.469638\n ],\n [\n 111.353673,\n 23.28895\n ],\n [\n 111.388782,\n 23.210337\n ],\n [\n 111.377695,\n 23.082149\n ],\n [\n 111.433746,\n 23.036456\n ],\n [\n 111.363528,\n 22.968713\n ],\n [\n 111.358601,\n 22.889362\n ],\n [\n 111.202152,\n 22.740452\n ],\n [\n 111.056791,\n 22.72776\n ],\n [\n 111.055559,\n 22.648268\n ],\n [\n 110.778386,\n 22.585304\n ],\n [\n 110.711249,\n 22.369684\n ],\n [\n 110.785777,\n 22.294415\n ],\n [\n 110.725415,\n 22.295522\n ],\n [\n 110.646575,\n 22.222982\n ],\n [\n 110.629329,\n 22.149296\n ],\n [\n 110.560344,\n 22.196393\n ],\n [\n 110.488895,\n 22.144863\n ],\n [\n 110.414366,\n 22.20858\n ],\n [\n 110.350924,\n 22.072799\n ],\n [\n 110.350924,\n 22.072799\n ],\n [\n 110.355236,\n 22.061709\n ],\n [\n 110.355236,\n 22.061709\n ],\n [\n 110.388497,\n 21.89026\n ],\n [\n 110.200019,\n 21.898587\n ],\n [\n 110.200019,\n 21.898587\n ],\n [\n 110.119947,\n 21.901918\n ],\n [\n 110.051578,\n 21.856945\n ],\n [\n 109.94502,\n 21.844172\n ],\n [\n 109.940709,\n 21.734723\n ],\n [\n 109.898209,\n 21.649661\n ],\n [\n 109.742992,\n 21.61629\n ],\n [\n 109.785492,\n 21.457116\n ],\n [\n 109.704188,\n 21.462684\n ],\n [\n 109.612413,\n 21.55676\n ],\n [\n 109.540964,\n 21.466025\n ],\n [\n 109.245929,\n 21.425929\n ],\n [\n 109.138756,\n 21.389163\n ],\n [\n 109.042669,\n 21.464355\n ],\n [\n 109.150459,\n 21.523924\n ],\n [\n 109.142451,\n 21.56455\n ],\n [\n 108.937959,\n 21.589588\n ],\n [\n 108.881293,\n 21.627415\n ],\n [\n 108.74517,\n 21.599046\n ],\n [\n 108.710062,\n 21.646881\n ],\n [\n 108.591802,\n 21.677465\n ],\n [\n 108.479085,\n 21.546743\n ],\n [\n 108.338651,\n 21.541177\n ],\n [\n 108.230245,\n 21.49108\n ],\n [\n 108.235173,\n 21.60294\n ],\n [\n 108.106441,\n 21.508895\n ],\n [\n 108.030681,\n 21.546186\n ],\n [\n 107.956768,\n 21.535055\n ],\n [\n 107.860066,\n 21.651886\n ],\n [\n 107.546553,\n 21.58625\n ],\n [\n 107.46956,\n 21.659671\n ],\n [\n 107.388256,\n 21.594039\n ],\n [\n 107.310648,\n 21.733611\n ],\n [\n 107.247206,\n 21.703039\n ],\n [\n 107.088294,\n 21.805291\n ],\n [\n 107.011917,\n 21.826399\n ],\n [\n 107.05996,\n 21.915241\n ],\n [\n 106.999598,\n 21.947433\n ],\n [\n 106.73844,\n 22.007911\n ],\n [\n 106.681158,\n 21.995152\n ],\n [\n 106.717498,\n 22.074463\n ],\n [\n 106.673151,\n 22.182543\n ],\n [\n 106.7021,\n 22.206918\n ],\n [\n 106.663296,\n 22.330948\n ],\n [\n 106.562282,\n 22.34589\n ],\n [\n 106.562282,\n 22.462608\n ],\n [\n 106.61402,\n 22.601876\n ],\n [\n 106.710723,\n 22.57536\n ],\n [\n 106.768621,\n 22.739349\n ],\n [\n 106.841302,\n 22.799484\n ],\n [\n 106.606013,\n 22.925737\n ],\n [\n 106.366413,\n 22.857939\n ],\n [\n 106.286957,\n 22.86676\n ],\n [\n 106.206885,\n 22.978629\n ],\n [\n 106.019639,\n 22.990747\n ],\n [\n 105.994385,\n 22.93786\n ],\n [\n 105.893987,\n 22.936758\n ],\n [\n 105.724604,\n 23.062332\n ],\n [\n 105.574931,\n 23.066186\n ],\n [\n 105.542902,\n 23.18449\n ],\n [\n 105.531815,\n 23.248275\n ],\n [\n 105.694423,\n 23.363122\n ],\n [\n 105.699966,\n 23.401566\n ],\n [\n 105.815763,\n 23.506953\n ],\n [\n 105.89214,\n 23.525058\n ],\n [\n 105.999929,\n 23.447683\n ],\n [\n 106.141595,\n 23.569487\n ],\n [\n 106.120653,\n 23.605129\n ],\n [\n 106.157609,\n 23.724048\n ],\n [\n 106.136667,\n 23.795238\n ],\n [\n 106.192102,\n 23.824798\n ],\n [\n 106.04982,\n 24.089986\n ],\n [\n 105.933407,\n 24.123847\n ],\n [\n 105.89214,\n 24.040271\n ],\n [\n 105.704278,\n 24.066497\n ],\n [\n 105.649459,\n 24.033167\n ],\n [\n 105.628518,\n 24.126577\n ],\n [\n 105.529967,\n 24.129308\n ],\n [\n 105.481924,\n 24.018958\n ],\n [\n 105.320548,\n 24.116202\n ],\n [\n 105.260186,\n 24.061033\n ],\n [\n 105.20044,\n 24.105279\n ],\n [\n 105.229389,\n 24.165888\n ],\n [\n 105.164715,\n 24.288109\n ],\n [\n 105.188121,\n 24.346995\n ],\n [\n 105.063085,\n 24.429281\n ],\n [\n 105.063085,\n 24.429281\n ],\n [\n 104.979933,\n 24.412937\n ],\n [\n 104.83642,\n 24.446712\n ],\n [\n 104.72863,\n 24.446167\n ],\n [\n 104.70892,\n 24.321372\n ],\n [\n 104.610986,\n 24.376973\n ],\n [\n 104.492109,\n 24.656241\n ],\n [\n 104.529682,\n 24.73126\n ],\n [\n 104.63316,\n 24.65896\n ],\n [\n 104.743413,\n 24.621978\n ],\n [\n 104.841963,\n 24.676359\n ],\n [\n 104.899245,\n 24.752996\n ],\n [\n 105.03352,\n 24.787765\n ],\n [\n 105.077868,\n 24.918065\n ],\n [\n 105.082179,\n 24.915895\n ],\n [\n 105.096346,\n 24.928375\n ],\n [\n 105.09573,\n 24.928375\n ],\n [\n 105.198592,\n 24.995095\n ],\n [\n 105.265729,\n 24.930003\n ],\n [\n 105.365511,\n 24.943566\n ],\n [\n 105.445584,\n 24.918608\n ],\n [\n 105.500402,\n 24.807862\n ],\n [\n 105.70551,\n 24.768752\n ],\n [\n 105.827466,\n 24.702997\n ],\n [\n 105.942031,\n 24.724738\n ],\n [\n 106.023335,\n 24.632313\n ],\n [\n 106.045508,\n 24.681796\n ],\n [\n 106.173008,\n 24.760059\n ],\n [\n 106.206269,\n 24.851304\n ],\n [\n 106.146522,\n 24.948449\n ],\n [\n 106.215508,\n 24.982079\n ],\n [\n 106.304819,\n 24.973944\n ],\n [\n 106.590615,\n 25.087791\n ],\n [\n 106.684238,\n 25.178252\n ],\n [\n 106.732281,\n 25.162548\n ],\n [\n 106.900432,\n 25.194495\n ],\n [\n 106.912751,\n 25.243212\n ],\n [\n 107.013765,\n 25.275138\n ],\n [\n 107.012533,\n 25.353024\n ],\n [\n 106.963874,\n 25.437884\n ],\n [\n 107.066736,\n 25.509186\n ],\n [\n 107.064272,\n 25.559395\n ],\n [\n 107.228728,\n 25.604728\n ],\n [\n 107.336517,\n 25.461116\n ],\n [\n 107.318039,\n 25.401677\n ],\n [\n 107.420901,\n 25.393029\n ],\n [\n 107.432604,\n 25.289205\n ],\n [\n 107.481263,\n 25.300024\n ],\n [\n 107.472024,\n 25.213984\n ],\n [\n 107.599523,\n 25.250789\n ],\n [\n 107.659885,\n 25.316251\n ],\n [\n 107.700537,\n 25.193954\n ],\n [\n 107.741805,\n 25.239965\n ],\n [\n 107.841587,\n 25.115966\n ],\n [\n 108.001732,\n 25.196661\n ],\n [\n 108.115065,\n 25.210195\n ],\n [\n 108.152021,\n 25.324364\n ],\n [\n 108.142782,\n 25.390867\n ],\n [\n 108.348506,\n 25.536183\n ],\n [\n 108.418723,\n 25.443287\n ],\n [\n 108.471693,\n 25.458955\n ],\n [\n 108.625062,\n 25.308138\n ],\n [\n 108.6072,\n 25.491904\n ],\n [\n 108.68912,\n 25.623072\n ],\n [\n 108.763649,\n 25.637097\n ],\n [\n 108.781511,\n 25.554537\n ],\n [\n 108.949046,\n 25.557236\n ],\n [\n 109.025423,\n 25.512426\n ],\n [\n 109.088249,\n 25.550758\n ],\n [\n 109.030966,\n 25.629545\n ],\n [\n 109.07901,\n 25.720679\n ],\n [\n 109.000785,\n 25.73631\n ],\n [\n 108.953974,\n 25.686714\n ],\n [\n 108.953974,\n 25.686714\n ],\n [\n 108.896076,\n 25.71421\n ],\n [\n 108.989698,\n 25.778881\n ],\n [\n 109.143683,\n 25.795044\n ],\n [\n 109.147995,\n 25.7417\n ],\n [\n 109.3414,\n 25.732537\n ],\n [\n 109.339552,\n 25.834363\n ],\n [\n 109.435022,\n 25.933411\n ],\n [\n 109.408537,\n 25.967305\n ],\n [\n 109.48245,\n 26.029687\n ],\n [\n 109.513247,\n 25.997962\n ],\n [\n 109.635203,\n 26.047428\n ],\n [\n 109.730057,\n 25.989895\n ],\n [\n 109.685094,\n 25.880129\n ],\n [\n 109.806434,\n 25.874746\n ],\n [\n 109.783028,\n 25.988282\n ],\n [\n 109.864332,\n 26.027537\n ],\n [\n 109.906832,\n 26.143611\n ],\n [\n 109.965962,\n 26.195699\n ],\n [\n 110.099005,\n 26.16939\n ],\n [\n 110.065128,\n 26.051191\n ],\n [\n 110.165527,\n 26.023773\n ],\n [\n 110.201251,\n 26.066241\n ],\n [\n 110.257301,\n 25.961388\n ],\n [\n 110.325671,\n 25.975373\n ],\n [\n 110.373098,\n 26.08935\n ],\n [\n 110.516612,\n 26.186035\n ],\n [\n 110.555416,\n 26.286396\n ],\n [\n 110.612083,\n 26.333594\n ],\n [\n 110.76114,\n 26.248838\n ],\n [\n 110.939146,\n 26.28425\n ],\n [\n 110.94469,\n 26.373805\n ],\n [\n 111.092515,\n 26.306779\n ],\n [\n 111.204616,\n 26.307852\n ],\n [\n 111.279761,\n 26.271911\n ],\n [\n 111.267442,\n 26.058716\n ],\n [\n 111.189834,\n 25.953318\n ],\n [\n 111.252043,\n 25.864517\n ],\n [\n 111.346282,\n 25.906504\n ],\n [\n 111.49226,\n 25.868824\n ],\n [\n 111.43313,\n 25.84621\n ],\n [\n 111.442369,\n 25.771877\n ],\n [\n 111.30871,\n 25.72014\n ],\n [\n 111.343202,\n 25.602569\n ],\n [\n 111.301319,\n 25.450851\n ],\n [\n 111.103602,\n 25.284877\n ],\n [\n 111.112841,\n 25.217232\n ],\n [\n 110.998892,\n 25.161465\n ],\n [\n 110.951465,\n 25.043891\n ],\n [\n 110.991501,\n 24.924034\n ],\n [\n 111.100522,\n 24.945736\n ],\n [\n 111.101754,\n 25.035218\n ],\n [\n 111.200921,\n 25.074786\n ],\n [\n 111.274833,\n 25.151175\n ],\n [\n 111.321645,\n 25.10513\n ],\n [\n 111.435593,\n 25.09321\n ],\n [\n 111.43313,\n 24.97991\n ],\n [\n 111.470086,\n 24.928917\n ],\n [\n 111.479325,\n 24.797543\n ],\n [\n 111.431282,\n 24.687776\n ],\n [\n 111.570484,\n 24.644821\n ],\n [\n 111.68936,\n 24.778531\n ],\n [\n 111.951135,\n 24.769839\n ],\n [\n 112.024431,\n 24.739955\n ]\n ]\n ],\n [\n [\n [\n 105.082179,\n 24.915895\n ],\n [\n 105.077868,\n 24.918065\n ],\n [\n 105.09573,\n 24.928375\n ],\n [\n 105.096346,\n 24.928375\n ],\n [\n 105.082179,\n 24.915895\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 460000,\n \"name\": \"海南省\",\n \"center\": [\n 110.33119,\n 20.031971\n ],\n \"centroid\": [\n 109.754777,\n 19.189617\n ],\n \"childrenNum\": 19,\n \"level\": \"province\",\n \"subFeatureIndex\": 20,\n \"acroutes\": [\n 100000\n ],\n \"parent\": {\n \"adcode\": 100000\n }\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 109.231147,\n 19.863293\n ],\n [\n 109.300748,\n 19.917868\n ],\n [\n 109.498464,\n 19.873422\n ],\n [\n 109.585312,\n 19.98817\n ],\n [\n 109.712195,\n 20.017406\n ],\n [\n 109.76147,\n 19.981422\n ],\n [\n 109.965346,\n 19.993792\n ],\n [\n 110.106396,\n 20.026963\n ],\n [\n 110.144585,\n 20.074176\n ],\n [\n 110.291178,\n 20.056754\n ],\n [\n 110.318279,\n 20.109015\n ],\n [\n 110.526467,\n 20.0753\n ],\n [\n 110.562191,\n 20.109577\n ],\n [\n 110.717408,\n 20.148901\n ],\n [\n 110.744509,\n 20.074176\n ],\n [\n 110.871393,\n 20.011784\n ],\n [\n 110.969327,\n 20.010097\n ],\n [\n 111.071573,\n 19.629025\n ],\n [\n 110.920668,\n 19.552926\n ],\n [\n 110.844292,\n 19.450278\n ],\n [\n 110.729727,\n 19.378611\n ],\n [\n 110.619474,\n 19.152118\n ],\n [\n 110.578206,\n 18.78489\n ],\n [\n 110.499366,\n 18.751466\n ],\n [\n 110.495054,\n 18.65002\n ],\n [\n 110.329366,\n 18.64265\n ],\n [\n 110.246215,\n 18.609764\n ],\n [\n 110.117483,\n 18.507666\n ],\n [\n 110.090382,\n 18.399262\n ],\n [\n 110.022629,\n 18.360083\n ],\n [\n 109.919767,\n 18.375415\n ],\n [\n 109.785492,\n 18.339639\n ],\n [\n 109.749767,\n 18.193617\n ],\n [\n 109.584696,\n 18.143589\n ],\n [\n 109.355566,\n 18.215216\n ],\n [\n 109.287813,\n 18.264655\n ],\n [\n 109.138756,\n 18.268064\n ],\n [\n 109.117814,\n 18.322032\n ],\n [\n 108.944735,\n 18.31408\n ],\n [\n 108.888068,\n 18.412319\n ],\n [\n 108.68912,\n 18.447513\n ],\n [\n 108.644772,\n 18.486672\n ],\n [\n 108.663866,\n 18.673261\n ],\n [\n 108.593033,\n 18.809246\n ],\n [\n 108.637997,\n 18.920785\n ],\n [\n 108.591186,\n 19.14477\n ],\n [\n 108.609048,\n 19.276417\n ],\n [\n 108.663866,\n 19.374095\n ],\n [\n 108.765496,\n 19.401187\n ],\n [\n 109.048829,\n 19.620007\n ],\n [\n 109.169553,\n 19.736628\n ],\n [\n 109.159082,\n 19.790684\n ],\n [\n 109.231147,\n 19.863293\n ]\n ]\n ],\n [\n [\n [\n 113.896887,\n 7.607259\n ],\n [\n 114.029314,\n 7.670119\n ],\n [\n 114.211632,\n 7.786918\n ],\n [\n 114.268298,\n 7.870496\n ],\n [\n 114.414892,\n 7.952872\n ],\n [\n 114.540543,\n 7.945761\n ],\n [\n 114.540543,\n 7.862199\n ],\n [\n 114.419819,\n 7.765577\n ],\n [\n 114.368696,\n 7.63869\n ],\n [\n 114.157429,\n 7.56159\n ],\n [\n 113.98743,\n 7.536085\n ],\n [\n 113.896887,\n 7.607259\n ]\n ]\n ],\n [\n [\n [\n 111.660411,\n 16.258092\n ],\n [\n 111.606825,\n 16.17766\n ],\n [\n 111.569252,\n 16.195472\n ],\n [\n 111.660411,\n 16.258092\n ]\n ]\n ],\n [\n [\n [\n 113.976959,\n 8.872658\n ],\n [\n 114.060111,\n 8.816493\n ],\n [\n 114.037321,\n 8.781016\n ],\n [\n 113.976959,\n 8.872658\n ]\n ]\n ],\n [\n [\n [\n 112.067547,\n 16.319543\n ],\n [\n 111.97454,\n 16.323563\n ],\n [\n 112.047221,\n 16.360309\n ],\n [\n 112.067547,\n 16.319543\n ]\n ]\n ],\n [\n [\n [\n 115.837712,\n 9.709358\n ],\n [\n 115.925791,\n 9.7813\n ],\n [\n 115.901153,\n 9.671021\n ],\n [\n 115.837712,\n 9.709358\n ]\n ]\n ],\n [\n [\n [\n 109.463972,\n 7.344453\n ],\n [\n 109.536037,\n 7.448882\n ],\n [\n 109.653065,\n 7.559218\n ],\n [\n 109.72205,\n 7.575825\n ],\n [\n 109.904984,\n 7.551507\n ],\n [\n 109.938861,\n 7.504647\n ],\n [\n 109.791651,\n 7.524815\n ],\n [\n 109.654297,\n 7.479138\n ],\n [\n 109.513247,\n 7.320122\n ],\n [\n 109.463972,\n 7.344453\n ]\n ]\n ],\n [\n [\n [\n 112.527654,\n 16.058099\n ],\n [\n 112.607726,\n 16.066724\n ],\n [\n 112.570154,\n 16.010945\n ],\n [\n 112.448814,\n 16.005194\n ],\n [\n 112.527654,\n 16.058099\n ]\n ]\n ],\n [\n [\n [\n 114.469095,\n 10.83618\n ],\n [\n 114.587355,\n 10.90904\n ],\n [\n 114.565181,\n 10.836767\n ],\n [\n 114.469095,\n 10.83618\n ]\n ]\n ],\n [\n [\n [\n 112.383524,\n 16.266134\n ],\n [\n 112.528886,\n 16.318395\n ],\n [\n 112.538741,\n 16.289107\n ],\n [\n 112.383524,\n 16.266134\n ]\n ]\n ],\n [\n [\n [\n 116.48876,\n 10.395704\n ],\n [\n 116.514629,\n 10.349208\n ],\n [\n 116.637817,\n 10.3651\n ],\n [\n 116.566368,\n 10.304472\n ],\n [\n 116.467202,\n 10.309182\n ],\n [\n 116.48876,\n 10.395704\n ]\n ]\n ],\n [\n [\n [\n 115.16757,\n 8.386402\n ],\n [\n 115.315395,\n 8.356213\n ],\n [\n 115.285214,\n 8.314772\n ],\n [\n 115.18112,\n 8.345557\n ],\n [\n 115.16757,\n 8.386402\n ]\n ]\n ],\n [\n [\n [\n 109.936397,\n 7.848566\n ],\n [\n 109.953027,\n 7.888869\n ],\n [\n 110.078063,\n 7.949317\n ],\n [\n 110.050346,\n 7.846195\n ],\n [\n 109.988136,\n 7.812408\n ],\n [\n 109.936397,\n 7.848566\n ]\n ]\n ],\n [\n [\n [\n 114.696992,\n 11.004203\n ],\n [\n 114.766593,\n 11.110489\n ],\n [\n 114.793079,\n 11.076435\n ],\n [\n 114.696992,\n 11.004203\n ]\n ]\n ],\n [\n [\n [\n 110.459946,\n 8.116389\n ],\n [\n 110.568351,\n 8.172657\n ],\n [\n 110.554184,\n 8.09388\n ],\n [\n 110.471032,\n 8.071962\n ],\n [\n 110.459946,\n 8.116389\n ]\n ]\n ],\n [\n [\n [\n 117.266691,\n 10.691581\n ],\n [\n 117.369553,\n 10.742727\n ],\n [\n 117.404661,\n 10.671002\n ],\n [\n 117.266691,\n 10.691581\n ]\n ]\n ],\n [\n [\n [\n 113.80696,\n 19.223319\n ],\n [\n 113.920293,\n 19.223319\n ],\n [\n 113.874097,\n 19.151553\n ],\n [\n 113.80696,\n 19.223319\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 500000,\n \"name\": \"重庆市\",\n \"center\": [\n 106.504962,\n 29.533155\n ],\n \"centroid\": [\n 107.88398,\n 30.067321\n ],\n \"childrenNum\": 38,\n \"level\": \"province\",\n \"subFeatureIndex\": 21,\n \"acroutes\": [\n 100000\n ],\n \"parent\": {\n \"adcode\": 100000\n }\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 109.09256,\n 30.578762\n ],\n [\n 109.114734,\n 30.64416\n ],\n [\n 108.971836,\n 30.627686\n ],\n [\n 108.808612,\n 30.491153\n ],\n [\n 108.743939,\n 30.494762\n ],\n [\n 108.688504,\n 30.587519\n ],\n [\n 108.56778,\n 30.468464\n ],\n [\n 108.42673,\n 30.492184\n ],\n [\n 108.402092,\n 30.376626\n ],\n [\n 108.460606,\n 30.35959\n ],\n [\n 108.581947,\n 30.255763\n ],\n [\n 108.56778,\n 30.157517\n ],\n [\n 108.513577,\n 30.057619\n ],\n [\n 108.542526,\n 29.998047\n ],\n [\n 108.516041,\n 29.885539\n ],\n [\n 108.371295,\n 29.841434\n ],\n [\n 108.424266,\n 29.816\n ],\n [\n 108.437201,\n 29.741218\n ],\n [\n 108.504338,\n 29.707964\n ],\n [\n 108.602273,\n 29.865824\n ],\n [\n 108.666946,\n 29.842472\n ],\n [\n 108.690968,\n 29.689773\n ],\n [\n 108.785822,\n 29.633622\n ],\n [\n 108.844337,\n 29.658582\n ],\n [\n 108.91209,\n 29.571714\n ],\n [\n 108.880677,\n 29.442576\n ],\n [\n 108.927488,\n 29.435281\n ],\n [\n 108.919481,\n 29.326314\n ],\n [\n 109.11227,\n 29.360737\n ],\n [\n 109.110422,\n 29.215143\n ],\n [\n 109.232378,\n 29.119533\n ],\n [\n 109.319842,\n 29.042667\n ],\n [\n 109.235458,\n 28.882476\n ],\n [\n 109.241002,\n 28.776594\n ],\n [\n 109.2989,\n 28.747221\n ],\n [\n 109.201581,\n 28.598133\n ],\n [\n 109.304443,\n 28.623871\n ],\n [\n 109.321074,\n 28.581322\n ],\n [\n 109.274262,\n 28.494592\n ],\n [\n 109.191726,\n 28.470927\n ],\n [\n 109.152306,\n 28.349885\n ],\n [\n 109.081473,\n 28.249264\n ],\n [\n 109.086401,\n 28.184942\n ],\n [\n 109.026655,\n 28.220271\n ],\n [\n 109.006329,\n 28.163317\n ],\n [\n 108.922561,\n 28.217635\n ],\n [\n 108.772888,\n 28.21289\n ],\n [\n 108.726692,\n 28.282463\n ],\n [\n 108.764881,\n 28.306698\n ],\n [\n 108.779663,\n 28.425158\n ],\n [\n 108.710678,\n 28.500902\n ],\n [\n 108.640461,\n 28.457251\n ],\n [\n 108.688504,\n 28.422527\n ],\n [\n 108.668178,\n 28.334614\n ],\n [\n 108.611512,\n 28.324607\n ],\n [\n 108.577019,\n 28.534024\n ],\n [\n 108.636149,\n 28.621245\n ],\n [\n 108.565316,\n 28.662204\n ],\n [\n 108.471077,\n 28.627548\n ],\n [\n 108.332491,\n 28.679528\n ],\n [\n 108.385462,\n 28.772398\n ],\n [\n 108.352817,\n 28.815395\n ],\n [\n 108.350353,\n 28.933282\n ],\n [\n 108.268433,\n 29.089734\n ],\n [\n 108.256115,\n 29.040574\n ],\n [\n 108.068253,\n 29.086597\n ],\n [\n 108.024521,\n 29.038482\n ],\n [\n 107.930899,\n 29.035343\n ],\n [\n 107.867457,\n 28.960508\n ],\n [\n 107.784921,\n 29.04842\n ],\n [\n 107.810791,\n 29.138348\n ],\n [\n 107.751044,\n 29.199997\n ],\n [\n 107.701769,\n 29.142006\n ],\n [\n 107.589052,\n 29.149845\n ],\n [\n 107.570574,\n 29.218276\n ],\n [\n 107.486806,\n 29.174402\n ],\n [\n 107.404271,\n 29.187984\n ],\n [\n 107.412894,\n 29.095485\n ],\n [\n 107.36485,\n 29.010753\n ],\n [\n 107.441227,\n 28.943755\n ],\n [\n 107.383945,\n 28.848417\n ],\n [\n 107.219489,\n 28.772923\n ],\n [\n 107.191156,\n 28.888763\n ],\n [\n 107.057497,\n 28.895049\n ],\n [\n 106.983584,\n 28.851561\n ],\n [\n 106.986664,\n 28.793899\n ],\n [\n 106.986664,\n 28.793899\n ],\n [\n 106.926302,\n 28.809104\n ],\n [\n 106.824056,\n 28.756139\n ],\n [\n 106.883186,\n 28.69265\n ],\n [\n 106.866556,\n 28.624397\n ],\n [\n 106.73844,\n 28.554522\n ],\n [\n 106.7446,\n 28.465667\n ],\n [\n 106.632499,\n 28.503531\n ],\n [\n 106.564745,\n 28.485127\n ],\n [\n 106.63681,\n 28.623346\n ],\n [\n 106.562897,\n 28.753516\n ],\n [\n 106.45326,\n 28.816968\n ],\n [\n 106.504999,\n 28.662204\n ],\n [\n 106.484057,\n 28.530344\n ],\n [\n 106.395978,\n 28.570287\n ],\n [\n 106.37442,\n 28.525613\n ],\n [\n 106.304203,\n 28.650653\n ],\n [\n 106.248152,\n 28.829024\n ],\n [\n 106.173008,\n 28.92019\n ],\n [\n 106.048588,\n 28.906573\n ],\n [\n 106.043661,\n 28.954226\n ],\n [\n 105.970364,\n 28.966267\n ],\n [\n 105.88906,\n 28.909716\n ],\n [\n 105.762176,\n 28.991391\n ],\n [\n 105.693807,\n 29.267351\n ],\n [\n 105.518264,\n 29.264219\n ],\n [\n 105.427721,\n 29.316924\n ],\n [\n 105.428337,\n 29.417562\n ],\n [\n 105.380294,\n 29.456643\n ],\n [\n 105.380294,\n 29.456643\n ],\n [\n 105.324859,\n 29.448828\n ],\n [\n 105.289751,\n 29.552979\n ],\n [\n 105.38399,\n 29.67002\n ],\n [\n 105.476996,\n 29.674699\n ],\n [\n 105.575547,\n 29.745374\n ],\n [\n 105.619894,\n 29.846624\n ],\n [\n 105.709206,\n 29.840396\n ],\n [\n 105.70243,\n 29.924957\n ],\n [\n 105.753553,\n 30.018254\n ],\n [\n 105.687648,\n 30.038974\n ],\n [\n 105.582938,\n 30.123884\n ],\n [\n 105.582938,\n 30.127507\n ],\n [\n 105.580474,\n 30.129577\n ],\n [\n 105.574315,\n 30.130611\n ],\n [\n 105.56138,\n 30.183898\n ],\n [\n 105.571235,\n 30.17976\n ],\n [\n 105.642684,\n 30.186484\n ],\n [\n 105.624822,\n 30.275917\n ],\n [\n 105.720292,\n 30.252662\n ],\n [\n 105.720292,\n 30.252662\n ],\n [\n 105.714749,\n 30.322927\n ],\n [\n 105.792357,\n 30.427199\n ],\n [\n 105.881053,\n 30.387465\n ],\n [\n 106.031958,\n 30.373529\n ],\n [\n 106.10587,\n 30.310531\n ],\n [\n 106.17116,\n 30.306399\n ],\n [\n 106.180399,\n 30.23302\n ],\n [\n 106.256776,\n 30.19631\n ],\n [\n 106.262935,\n 30.211306\n ],\n [\n 106.428623,\n 30.254729\n ],\n [\n 106.451412,\n 30.307949\n ],\n [\n 106.451412,\n 30.307949\n ],\n [\n 106.610941,\n 30.292451\n ],\n [\n 106.610941,\n 30.292451\n ],\n [\n 106.612789,\n 30.235605\n ],\n [\n 106.612789,\n 30.235605\n ],\n [\n 106.612173,\n 30.235605\n ],\n [\n 106.612173,\n 30.235605\n ],\n [\n 106.611557,\n 30.235605\n ],\n [\n 106.612173,\n 30.235605\n ],\n [\n 106.611557,\n 30.235605\n ],\n [\n 106.677462,\n 30.157\n ],\n [\n 106.726121,\n 30.033277\n ],\n [\n 106.825904,\n 30.031205\n ],\n [\n 106.825904,\n 30.031205\n ],\n [\n 106.913367,\n 30.025506\n ],\n [\n 106.974345,\n 30.082992\n ],\n [\n 106.976193,\n 30.083509\n ],\n [\n 106.980504,\n 30.085062\n ],\n [\n 106.981736,\n 30.085062\n ],\n [\n 107.053801,\n 30.043636\n ],\n [\n 107.054417,\n 30.041046\n ],\n [\n 107.055649,\n 30.040528\n ],\n [\n 107.058113,\n 30.043118\n ],\n [\n 107.221337,\n 30.213891\n ],\n [\n 107.359923,\n 30.456087\n ],\n [\n 107.516987,\n 30.644675\n ],\n [\n 107.424597,\n 30.740889\n ],\n [\n 107.514524,\n 30.854986\n ],\n [\n 107.645103,\n 30.821079\n ],\n [\n 107.739957,\n 30.884259\n ],\n [\n 107.763979,\n 30.816968\n ],\n [\n 107.85329,\n 30.793842\n ],\n [\n 107.994956,\n 30.90839\n ],\n [\n 107.943833,\n 30.989466\n ],\n [\n 108.053471,\n 31.040745\n ],\n [\n 108.009123,\n 31.10839\n ],\n [\n 108.083652,\n 31.185713\n ],\n [\n 108.095354,\n 31.268088\n ],\n [\n 108.185898,\n 31.337104\n ],\n [\n 108.153869,\n 31.371338\n ],\n [\n 108.216079,\n 31.410666\n ],\n [\n 108.191441,\n 31.492333\n ],\n [\n 108.34173,\n 31.509679\n ],\n [\n 108.391621,\n 31.593298\n ],\n [\n 108.517889,\n 31.665131\n ],\n [\n 108.535135,\n 31.757769\n ],\n [\n 108.343578,\n 31.860987\n ],\n [\n 108.259194,\n 31.966628\n ],\n [\n 108.373759,\n 32.077217\n ],\n [\n 108.447672,\n 32.07164\n ],\n [\n 108.369447,\n 32.173493\n ],\n [\n 108.509882,\n 32.201343\n ],\n [\n 108.67249,\n 32.104083\n ],\n [\n 108.734084,\n 32.106617\n ],\n [\n 108.902235,\n 31.984899\n ],\n [\n 108.988466,\n 31.979317\n ],\n [\n 109.164009,\n 31.877247\n ],\n [\n 109.195422,\n 31.817782\n ],\n [\n 109.273646,\n 31.801003\n ],\n [\n 109.281654,\n 31.717061\n ],\n [\n 109.585928,\n 31.726731\n ],\n [\n 109.731289,\n 31.700263\n ],\n [\n 109.76455,\n 31.602981\n ],\n [\n 109.719586,\n 31.555067\n ],\n [\n 109.848934,\n 31.552008\n ],\n [\n 109.946252,\n 31.506108\n ],\n [\n 110.054042,\n 31.410666\n ],\n [\n 110.140273,\n 31.390238\n ],\n [\n 110.189548,\n 31.129391\n ],\n [\n 110.119947,\n 31.088409\n ],\n [\n 110.135961,\n 30.986902\n ],\n [\n 110.172918,\n 30.978694\n ],\n [\n 110.082375,\n 30.799496\n ],\n [\n 110.008462,\n 30.883746\n ],\n [\n 109.893897,\n 30.899662\n ],\n [\n 109.780564,\n 30.848822\n ],\n [\n 109.590855,\n 30.693566\n ],\n [\n 109.435638,\n 30.59576\n ],\n [\n 109.35495,\n 30.487028\n ],\n [\n 109.36111,\n 30.550942\n ],\n [\n 109.299516,\n 30.630775\n ],\n [\n 109.143683,\n 30.521052\n ],\n [\n 109.103647,\n 30.565883\n ],\n [\n 109.106111,\n 30.57052\n ],\n [\n 109.106727,\n 30.572066\n ],\n [\n 109.108575,\n 30.576702\n ],\n [\n 109.102415,\n 30.580308\n ],\n [\n 109.100567,\n 30.580823\n ],\n [\n 109.09872,\n 30.579277\n ],\n [\n 109.09256,\n 30.578762\n ]\n ]\n ],\n [\n [\n [\n 105.574315,\n 30.130611\n ],\n [\n 105.580474,\n 30.129577\n ],\n [\n 105.582938,\n 30.127507\n ],\n [\n 105.582938,\n 30.123884\n ],\n [\n 105.574315,\n 30.130611\n ]\n ]\n ],\n [\n [\n [\n 109.09256,\n 30.578762\n ],\n [\n 109.09872,\n 30.579277\n ],\n [\n 109.106111,\n 30.57052\n ],\n [\n 109.103647,\n 30.565883\n ],\n [\n 109.09256,\n 30.578762\n ]\n ]\n ],\n [\n [\n [\n 109.102415,\n 30.580308\n ],\n [\n 109.108575,\n 30.576702\n ],\n [\n 109.106727,\n 30.572066\n ],\n [\n 109.100567,\n 30.580823\n ],\n [\n 109.102415,\n 30.580308\n ]\n ]\n ],\n [\n [\n [\n 107.053801,\n 30.043636\n ],\n [\n 107.058113,\n 30.043118\n ],\n [\n 107.055649,\n 30.040528\n ],\n [\n 107.054417,\n 30.041046\n ],\n [\n 107.053801,\n 30.043636\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 510000,\n \"name\": \"四川省\",\n \"center\": [\n 104.065735,\n 30.659462\n ],\n \"centroid\": [\n 102.693438,\n 30.674548\n ],\n \"childrenNum\": 21,\n \"level\": \"province\",\n \"subFeatureIndex\": 22,\n \"acroutes\": [\n 100000\n ],\n \"parent\": {\n \"adcode\": 100000\n }\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 105.720292,\n 30.252662\n ],\n [\n 105.720292,\n 30.252662\n ],\n [\n 105.624822,\n 30.275917\n ],\n [\n 105.642684,\n 30.186484\n ],\n [\n 105.571235,\n 30.17976\n ],\n [\n 105.56138,\n 30.188035\n ],\n [\n 105.558916,\n 30.18545\n ],\n [\n 105.56138,\n 30.183898\n ],\n [\n 105.574315,\n 30.130611\n ],\n [\n 105.582938,\n 30.123884\n ],\n [\n 105.687648,\n 30.038974\n ],\n [\n 105.753553,\n 30.018254\n ],\n [\n 105.70243,\n 29.924957\n ],\n [\n 105.709206,\n 29.840396\n ],\n [\n 105.619894,\n 29.846624\n ],\n [\n 105.575547,\n 29.745374\n ],\n [\n 105.476996,\n 29.674699\n ],\n [\n 105.38399,\n 29.67002\n ],\n [\n 105.289751,\n 29.552979\n ],\n [\n 105.324859,\n 29.448828\n ],\n [\n 105.380294,\n 29.456643\n ],\n [\n 105.380294,\n 29.456643\n ],\n [\n 105.428337,\n 29.417562\n ],\n [\n 105.427721,\n 29.316924\n ],\n [\n 105.518264,\n 29.264219\n ],\n [\n 105.693807,\n 29.267351\n ],\n [\n 105.762176,\n 28.991391\n ],\n [\n 105.88906,\n 28.909716\n ],\n [\n 105.970364,\n 28.966267\n ],\n [\n 106.043661,\n 28.954226\n ],\n [\n 106.048588,\n 28.906573\n ],\n [\n 106.173008,\n 28.92019\n ],\n [\n 106.248152,\n 28.829024\n ],\n [\n 106.304203,\n 28.650653\n ],\n [\n 106.37442,\n 28.525613\n ],\n [\n 106.330688,\n 28.481971\n ],\n [\n 106.2925,\n 28.537177\n ],\n [\n 106.103407,\n 28.636476\n ],\n [\n 105.966668,\n 28.76086\n ],\n [\n 105.891524,\n 28.672179\n ],\n [\n 105.884748,\n 28.594981\n ],\n [\n 105.749242,\n 28.614943\n ],\n [\n 105.683952,\n 28.535601\n ],\n [\n 105.62359,\n 28.518253\n ],\n [\n 105.639604,\n 28.32408\n ],\n [\n 105.730147,\n 28.271925\n ],\n [\n 105.826234,\n 28.304064\n ],\n [\n 105.88906,\n 28.238722\n ],\n [\n 105.860111,\n 28.165955\n ],\n [\n 105.975907,\n 28.107917\n ],\n [\n 106.126812,\n 28.16701\n ],\n [\n 106.206885,\n 28.134302\n ],\n [\n 106.328225,\n 27.952643\n ],\n [\n 106.304819,\n 27.899249\n ],\n [\n 106.343007,\n 27.821489\n ],\n [\n 106.193334,\n 27.754265\n ],\n [\n 106.120653,\n 27.779677\n ],\n [\n 106.023335,\n 27.746851\n ],\n [\n 105.78435,\n 27.719312\n ],\n [\n 105.62359,\n 27.666333\n ],\n [\n 105.605112,\n 27.715605\n ],\n [\n 105.508409,\n 27.769089\n ],\n [\n 105.353809,\n 27.74897\n ],\n [\n 105.308229,\n 27.705011\n ],\n [\n 105.273736,\n 27.795028\n ],\n [\n 105.308229,\n 27.810376\n ],\n [\n 105.308229,\n 27.810376\n ],\n [\n 105.244171,\n 27.823077\n ],\n [\n 105.233084,\n 27.895547\n ],\n [\n 105.284823,\n 27.935729\n ],\n [\n 105.270657,\n 27.99703\n ],\n [\n 105.186273,\n 27.995445\n ],\n [\n 105.186889,\n 28.0546\n ],\n [\n 105.05939,\n 28.097889\n ],\n [\n 104.872144,\n 27.905594\n ],\n [\n 104.743413,\n 27.901892\n ],\n [\n 104.573413,\n 27.840537\n ],\n [\n 104.40095,\n 27.952114\n ],\n [\n 104.354139,\n 28.019744\n ],\n [\n 104.44653,\n 28.112666\n ],\n [\n 104.44961,\n 28.269817\n ],\n [\n 104.384936,\n 28.329874\n ],\n [\n 104.314103,\n 28.306698\n ],\n [\n 104.254357,\n 28.408844\n ],\n [\n 104.261748,\n 28.537177\n ],\n [\n 104.318415,\n 28.538229\n ],\n [\n 104.425588,\n 28.626497\n ],\n [\n 104.314719,\n 28.615468\n ],\n [\n 104.12501,\n 28.637526\n ],\n [\n 103.940844,\n 28.606013\n ],\n [\n 103.844757,\n 28.660104\n ],\n [\n 103.838598,\n 28.587101\n ],\n [\n 103.781931,\n 28.525613\n ],\n [\n 103.877402,\n 28.311966\n ],\n [\n 103.721569,\n 28.201817\n ],\n [\n 103.639649,\n 28.261912\n ],\n [\n 103.573128,\n 28.230815\n ],\n [\n 103.471498,\n 28.123221\n ],\n [\n 103.430846,\n 28.044039\n ],\n [\n 103.488128,\n 28.03242\n ],\n [\n 103.515846,\n 27.965326\n ],\n [\n 103.487512,\n 27.795028\n ],\n [\n 103.29226,\n 27.632943\n ],\n [\n 103.295955,\n 27.568785\n ],\n [\n 103.222043,\n 27.566133\n ],\n [\n 103.111789,\n 27.401054\n ],\n [\n 102.989833,\n 27.368114\n ],\n [\n 102.941174,\n 27.405303\n ],\n [\n 102.882044,\n 27.293168\n ],\n [\n 102.913457,\n 27.133538\n ],\n [\n 102.870957,\n 27.026992\n ],\n [\n 102.898674,\n 26.908073\n ],\n [\n 102.991681,\n 26.775675\n ],\n [\n 103.018783,\n 26.593911\n ],\n [\n 103.056971,\n 26.525943\n ],\n [\n 102.989833,\n 26.483108\n ],\n [\n 102.998457,\n 26.371661\n ],\n [\n 102.739762,\n 26.268691\n ],\n [\n 102.674473,\n 26.205363\n ],\n [\n 102.60056,\n 26.250448\n ],\n [\n 102.638748,\n 26.307852\n ],\n [\n 102.567915,\n 26.36362\n ],\n [\n 102.392372,\n 26.296588\n ],\n [\n 102.349257,\n 26.244545\n ],\n [\n 102.245163,\n 26.212341\n ],\n [\n 102.107808,\n 26.068391\n ],\n [\n 102.005562,\n 26.091499\n ],\n [\n 102.005562,\n 26.091499\n ],\n [\n 101.917483,\n 26.108156\n ],\n [\n 101.86328,\n 26.052266\n ],\n [\n 101.799223,\n 26.109231\n ],\n [\n 101.807846,\n 26.156501\n ],\n [\n 101.690202,\n 26.241861\n ],\n [\n 101.630455,\n 26.224687\n ],\n [\n 101.586724,\n 26.279422\n ],\n [\n 101.660636,\n 26.346999\n ],\n [\n 101.636615,\n 26.395245\n ],\n [\n 101.506652,\n 26.499708\n ],\n [\n 101.458608,\n 26.495424\n ],\n [\n 101.400094,\n 26.605146\n ],\n [\n 101.451833,\n 26.600867\n ],\n [\n 101.453065,\n 26.692848\n ],\n [\n 101.512195,\n 26.756443\n ],\n [\n 101.389623,\n 26.723314\n ],\n [\n 101.357594,\n 26.770868\n ],\n [\n 101.399478,\n 26.841893\n ],\n [\n 101.267667,\n 26.902737\n ],\n [\n 101.264587,\n 26.955549\n ],\n [\n 101.136472,\n 27.023794\n ],\n [\n 101.170349,\n 27.195821\n ],\n [\n 101.057016,\n 27.20061\n ],\n [\n 101.021907,\n 27.332508\n ],\n [\n 100.936908,\n 27.469026\n ],\n [\n 100.848212,\n 27.670573\n ],\n [\n 100.782307,\n 27.691767\n ],\n [\n 100.707162,\n 27.80085\n ],\n [\n 100.681293,\n 27.923041\n ],\n [\n 100.633866,\n 27.915111\n ],\n [\n 100.54517,\n 27.809318\n ],\n [\n 100.442924,\n 27.866459\n ],\n [\n 100.327744,\n 27.720372\n ],\n [\n 100.295099,\n 27.869633\n ],\n [\n 100.210715,\n 27.877037\n ],\n [\n 100.196549,\n 27.936257\n ],\n [\n 100.086296,\n 28.030836\n ],\n [\n 100.033941,\n 28.184942\n ],\n [\n 100.157129,\n 28.210254\n ],\n [\n 100.176223,\n 28.324607\n ],\n [\n 100.054267,\n 28.376737\n ],\n [\n 100.073977,\n 28.42621\n ],\n [\n 99.990209,\n 28.476712\n ],\n [\n 99.987129,\n 28.524561\n ],\n [\n 99.793724,\n 28.699473\n ],\n [\n 99.733362,\n 28.719415\n ],\n [\n 99.717964,\n 28.846321\n ],\n [\n 99.625573,\n 28.814871\n ],\n [\n 99.615718,\n 28.741975\n ],\n [\n 99.532566,\n 28.681628\n ],\n [\n 99.463581,\n 28.549266\n ],\n [\n 99.403219,\n 28.546638\n ],\n [\n 99.437095,\n 28.398318\n ],\n [\n 99.374886,\n 28.181778\n ],\n [\n 99.306516,\n 28.227652\n ],\n [\n 99.280647,\n 28.298269\n ],\n [\n 99.174705,\n 28.402003\n ],\n [\n 99.183944,\n 28.588677\n ],\n [\n 99.126662,\n 28.699473\n ],\n [\n 99.103872,\n 28.842128\n ],\n [\n 99.132206,\n 28.948467\n ],\n [\n 99.113727,\n 29.221409\n ],\n [\n 99.075539,\n 29.314316\n ],\n [\n 99.052133,\n 29.563908\n ],\n [\n 98.993003,\n 29.656502\n ],\n [\n 99.0238,\n 29.846105\n ],\n [\n 99.068148,\n 29.93118\n ],\n [\n 99.044742,\n 30.079885\n ],\n [\n 98.989308,\n 30.151826\n ],\n [\n 98.907388,\n 30.698196\n ],\n [\n 98.957895,\n 30.765056\n ],\n [\n 98.901844,\n 30.785105\n ],\n [\n 98.774345,\n 30.907877\n ],\n [\n 98.806374,\n 30.995621\n ],\n [\n 98.736772,\n 31.049459\n ],\n [\n 98.709671,\n 31.118635\n ],\n [\n 98.602498,\n 31.192367\n ],\n [\n 98.64007,\n 31.337615\n ],\n [\n 98.691809,\n 31.333016\n ],\n [\n 98.773113,\n 31.249163\n ],\n [\n 98.88583,\n 31.376446\n ],\n [\n 98.837787,\n 31.436705\n ],\n [\n 98.713367,\n 31.510189\n ],\n [\n 98.553839,\n 31.656473\n ],\n [\n 98.543983,\n 31.718588\n ],\n [\n 98.414636,\n 31.832525\n ],\n [\n 98.434962,\n 32.007734\n ],\n [\n 98.301919,\n 32.12334\n ],\n [\n 98.218768,\n 32.234752\n ],\n [\n 98.218768,\n 32.342489\n ],\n [\n 97.937283,\n 32.484425\n ],\n [\n 97.730944,\n 32.527315\n ],\n [\n 97.543698,\n 32.621602\n ],\n [\n 97.42359,\n 32.704713\n ],\n [\n 97.386018,\n 32.779196\n ],\n [\n 97.373699,\n 32.956094\n ],\n [\n 97.523988,\n 32.988721\n ],\n [\n 97.542466,\n 33.036385\n ],\n [\n 97.487648,\n 33.10658\n ],\n [\n 97.487648,\n 33.168205\n ],\n [\n 97.576343,\n 33.221779\n ],\n [\n 97.621306,\n 33.334327\n ],\n [\n 97.676125,\n 33.340825\n ],\n [\n 97.753733,\n 33.410277\n ],\n [\n 97.625618,\n 33.461705\n ],\n [\n 97.552321,\n 33.465698\n ],\n [\n 97.52522,\n 33.575937\n ],\n [\n 97.415583,\n 33.605343\n ],\n [\n 97.435293,\n 33.680558\n ],\n [\n 97.388481,\n 33.884452\n ],\n [\n 97.458698,\n 33.886935\n ],\n [\n 97.660111,\n 33.956444\n ],\n [\n 97.70261,\n 34.036805\n ],\n [\n 97.665654,\n 34.126997\n ],\n [\n 97.834421,\n 34.208186\n ],\n [\n 97.937283,\n 34.196804\n ],\n [\n 97.937283,\n 34.196804\n ],\n [\n 98.051848,\n 34.115604\n ],\n [\n 98.21076,\n 34.078444\n ],\n [\n 98.401702,\n 34.08786\n ],\n [\n 98.440506,\n 33.981255\n ],\n [\n 98.406629,\n 33.867065\n ],\n [\n 98.462064,\n 33.849178\n ],\n [\n 98.539056,\n 33.746752\n ],\n [\n 98.6567,\n 33.647193\n ],\n [\n 98.61728,\n 33.63723\n ],\n [\n 98.648077,\n 33.549014\n ],\n [\n 98.742316,\n 33.477677\n ],\n [\n 98.734309,\n 33.409278\n ],\n [\n 98.779272,\n 33.37181\n ],\n [\n 98.759562,\n 33.277321\n ],\n [\n 98.858728,\n 33.150674\n ],\n [\n 99.002242,\n 33.08252\n ],\n [\n 99.179633,\n 33.044912\n ],\n [\n 99.235067,\n 32.982197\n ],\n [\n 99.268328,\n 32.878744\n ],\n [\n 99.385973,\n 32.900349\n ],\n [\n 99.558436,\n 32.839039\n ],\n [\n 99.607711,\n 32.780705\n ],\n [\n 99.763543,\n 32.778693\n ],\n [\n 99.788181,\n 32.956596\n ],\n [\n 99.854086,\n 32.945048\n ],\n [\n 99.877492,\n 33.045915\n ],\n [\n 99.956332,\n 32.948061\n ],\n [\n 100.038252,\n 32.928979\n ],\n [\n 100.123252,\n 32.837028\n ],\n [\n 100.139266,\n 32.724346\n ],\n [\n 100.088143,\n 32.668959\n ],\n [\n 100.208252,\n 32.606482\n ],\n [\n 100.258759,\n 32.742466\n ],\n [\n 100.339447,\n 32.719313\n ],\n [\n 100.399809,\n 32.756556\n ],\n [\n 100.516837,\n 32.630168\n ],\n [\n 100.54517,\n 32.569681\n ],\n [\n 100.645568,\n 32.526306\n ],\n [\n 100.690532,\n 32.678025\n ],\n [\n 100.93198,\n 32.600433\n ],\n [\n 101.075494,\n 32.683061\n ],\n [\n 101.157414,\n 32.661404\n ],\n [\n 101.22332,\n 32.725856\n ],\n [\n 101.237486,\n 32.824962\n ],\n [\n 101.124153,\n 32.909893\n ],\n [\n 101.129081,\n 32.989725\n ],\n [\n 101.183899,\n 32.984204\n ],\n [\n 101.169733,\n 33.100566\n ],\n [\n 101.11553,\n 33.194746\n ],\n [\n 101.183283,\n 33.270317\n ],\n [\n 101.297232,\n 33.262313\n ],\n [\n 101.393935,\n 33.157687\n ],\n [\n 101.405022,\n 33.225783\n ],\n [\n 101.486326,\n 33.227285\n ],\n [\n 101.625528,\n 33.100566\n ],\n [\n 101.739477,\n 33.265815\n ],\n [\n 101.64955,\n 33.323328\n ],\n [\n 101.695745,\n 33.433748\n ],\n [\n 101.769658,\n 33.447728\n ],\n [\n 101.769042,\n 33.538541\n ],\n [\n 101.844186,\n 33.602353\n ],\n [\n 101.907012,\n 33.542032\n ],\n [\n 101.9452,\n 33.437742\n ],\n [\n 101.885454,\n 33.380804\n ],\n [\n 101.878063,\n 33.315829\n ],\n [\n 101.769658,\n 33.268816\n ],\n [\n 101.841723,\n 33.184731\n ],\n [\n 101.865744,\n 33.103072\n ],\n [\n 101.935345,\n 33.186734\n ],\n [\n 102.08933,\n 33.204759\n ],\n [\n 102.112736,\n 33.287324\n ],\n [\n 102.217446,\n 33.248303\n ],\n [\n 102.186649,\n 33.332327\n ],\n [\n 102.264873,\n 33.417269\n ],\n [\n 102.396684,\n 33.40678\n ],\n [\n 102.462589,\n 33.449724\n ],\n [\n 102.440416,\n 33.57494\n ],\n [\n 102.33817,\n 33.614313\n ],\n [\n 102.342481,\n 33.725357\n ],\n [\n 102.299981,\n 33.782566\n ],\n [\n 102.239619,\n 33.788036\n ],\n [\n 102.234076,\n 33.870046\n ],\n [\n 102.136142,\n 33.965377\n ],\n [\n 102.237772,\n 33.963392\n ],\n [\n 102.315996,\n 33.994154\n ],\n [\n 102.391756,\n 33.970836\n ],\n [\n 102.437336,\n 34.087364\n ],\n [\n 102.471213,\n 34.072993\n ],\n [\n 102.655994,\n 34.113623\n ],\n [\n 102.599328,\n 34.145321\n ],\n [\n 102.798276,\n 34.272982\n ],\n [\n 102.911609,\n 34.313022\n ],\n [\n 102.978747,\n 34.249246\n ],\n [\n 102.973203,\n 34.205217\n ],\n [\n 103.124108,\n 34.16166\n ],\n [\n 103.178927,\n 34.079931\n ],\n [\n 103.119797,\n 34.034822\n ],\n [\n 103.124108,\n 33.968354\n ],\n [\n 103.181391,\n 33.900842\n ],\n [\n 103.153057,\n 33.814884\n ],\n [\n 103.279325,\n 33.806433\n ],\n [\n 103.349542,\n 33.74327\n ],\n [\n 103.525085,\n 33.798975\n ],\n [\n 103.520157,\n 33.678566\n ],\n [\n 103.626099,\n 33.727347\n ],\n [\n 103.778236,\n 33.658648\n ],\n [\n 103.871243,\n 33.68255\n ],\n [\n 104.046169,\n 33.686533\n ],\n [\n 104.168741,\n 33.611821\n ],\n [\n 104.155191,\n 33.542531\n ],\n [\n 104.22048,\n 33.404782\n ],\n [\n 104.292545,\n 33.336326\n ],\n [\n 104.432979,\n 33.325828\n ],\n [\n 104.303632,\n 33.304328\n ],\n [\n 104.378161,\n 33.109086\n ],\n [\n 104.337509,\n 33.038392\n ],\n [\n 104.426204,\n 33.0108\n ],\n [\n 104.378161,\n 32.953081\n ],\n [\n 104.288234,\n 32.94304\n ],\n [\n 104.294393,\n 32.83552\n ],\n [\n 104.363994,\n 32.822448\n ],\n [\n 104.458849,\n 32.748504\n ],\n [\n 104.582653,\n 32.722333\n ],\n [\n 104.643015,\n 32.661908\n ],\n [\n 104.739717,\n 32.635711\n ],\n [\n 104.845659,\n 32.653848\n ],\n [\n 104.881999,\n 32.600938\n ],\n [\n 105.026745,\n 32.650322\n ],\n [\n 105.111128,\n 32.59388\n ],\n [\n 105.347033,\n 32.682558\n ],\n [\n 105.455439,\n 32.737433\n ],\n [\n 105.391381,\n 32.835017\n ],\n [\n 105.414171,\n 32.921948\n ],\n [\n 105.49917,\n 32.911902\n ],\n [\n 105.563844,\n 32.72485\n ],\n [\n 105.596489,\n 32.699175\n ],\n [\n 105.719061,\n 32.759575\n ],\n [\n 105.822538,\n 32.770141\n ],\n [\n 105.825002,\n 32.824962\n ],\n [\n 106.025798,\n 32.85814\n ],\n [\n 106.093552,\n 32.823956\n ],\n [\n 106.07261,\n 32.764103\n ],\n [\n 106.076305,\n 32.753537\n ],\n [\n 106.17424,\n 32.697664\n ],\n [\n 106.347935,\n 32.670974\n ],\n [\n 106.421231,\n 32.616562\n ],\n [\n 106.585687,\n 32.688097\n ],\n [\n 106.663296,\n 32.690615\n ],\n [\n 106.733513,\n 32.739446\n ],\n [\n 106.82344,\n 32.705217\n ],\n [\n 107.066736,\n 32.708741\n ],\n [\n 107.108004,\n 32.600938\n ],\n [\n 107.080286,\n 32.542448\n ],\n [\n 107.127098,\n 32.482406\n ],\n [\n 107.263836,\n 32.403129\n ],\n [\n 107.313727,\n 32.489976\n ],\n [\n 107.382097,\n 32.54043\n ],\n [\n 107.436299,\n 32.529837\n ],\n [\n 107.456625,\n 32.417778\n ],\n [\n 107.533002,\n 32.383426\n ],\n [\n 107.680211,\n 32.398078\n ],\n [\n 107.707929,\n 32.331873\n ],\n [\n 107.75474,\n 32.338445\n ],\n [\n 107.812022,\n 32.24791\n ],\n [\n 107.979558,\n 32.14614\n ],\n [\n 108.070717,\n 32.233234\n ],\n [\n 108.179122,\n 32.222099\n ],\n [\n 108.251187,\n 32.273208\n ],\n [\n 108.312781,\n 32.232222\n ],\n [\n 108.46923,\n 32.270173\n ],\n [\n 108.509882,\n 32.201343\n ],\n [\n 108.369447,\n 32.173493\n ],\n [\n 108.447672,\n 32.07164\n ],\n [\n 108.373759,\n 32.077217\n ],\n [\n 108.259194,\n 31.966628\n ],\n [\n 108.343578,\n 31.860987\n ],\n [\n 108.535135,\n 31.757769\n ],\n [\n 108.517889,\n 31.665131\n ],\n [\n 108.391621,\n 31.593298\n ],\n [\n 108.34173,\n 31.509679\n ],\n [\n 108.191441,\n 31.492333\n ],\n [\n 108.216079,\n 31.410666\n ],\n [\n 108.153869,\n 31.371338\n ],\n [\n 108.185898,\n 31.337104\n ],\n [\n 108.095354,\n 31.268088\n ],\n [\n 108.083652,\n 31.185713\n ],\n [\n 108.009123,\n 31.10839\n ],\n [\n 108.053471,\n 31.040745\n ],\n [\n 107.943833,\n 30.989466\n ],\n [\n 107.994956,\n 30.90839\n ],\n [\n 107.85329,\n 30.793842\n ],\n [\n 107.763979,\n 30.816968\n ],\n [\n 107.739957,\n 30.884259\n ],\n [\n 107.645103,\n 30.821079\n ],\n [\n 107.514524,\n 30.854986\n ],\n [\n 107.424597,\n 30.740889\n ],\n [\n 107.516987,\n 30.644675\n ],\n [\n 107.359923,\n 30.456087\n ],\n [\n 107.221337,\n 30.213891\n ],\n [\n 107.058113,\n 30.043118\n ],\n [\n 107.053801,\n 30.043636\n ],\n [\n 106.981736,\n 30.085062\n ],\n [\n 106.980504,\n 30.087651\n ],\n [\n 106.980504,\n 30.087651\n ],\n [\n 106.980504,\n 30.085062\n ],\n [\n 106.978041,\n 30.087133\n ],\n [\n 106.978041,\n 30.087651\n ],\n [\n 106.978041,\n 30.087133\n ],\n [\n 106.978041,\n 30.087651\n ],\n [\n 106.978041,\n 30.087133\n ],\n [\n 106.976193,\n 30.083509\n ],\n [\n 106.976193,\n 30.087651\n ],\n [\n 106.976193,\n 30.087651\n ],\n [\n 106.974345,\n 30.082992\n ],\n [\n 106.913367,\n 30.025506\n ],\n [\n 106.825904,\n 30.031205\n ],\n [\n 106.825904,\n 30.031205\n ],\n [\n 106.726121,\n 30.033277\n ],\n [\n 106.677462,\n 30.157\n ],\n [\n 106.611557,\n 30.235605\n ],\n [\n 106.612173,\n 30.235605\n ],\n [\n 106.611557,\n 30.235605\n ],\n [\n 106.612173,\n 30.235605\n ],\n [\n 106.612173,\n 30.235605\n ],\n [\n 106.612789,\n 30.235605\n ],\n [\n 106.612789,\n 30.235605\n ],\n [\n 106.610941,\n 30.292451\n ],\n [\n 106.610941,\n 30.292451\n ],\n [\n 106.451412,\n 30.307949\n ],\n [\n 106.451412,\n 30.307949\n ],\n [\n 106.428623,\n 30.254729\n ],\n [\n 106.262935,\n 30.211306\n ],\n [\n 106.261703,\n 30.205101\n ],\n [\n 106.260471,\n 30.204067\n ],\n [\n 106.256776,\n 30.19631\n ],\n [\n 106.180399,\n 30.23302\n ],\n [\n 106.17116,\n 30.306399\n ],\n [\n 106.10587,\n 30.310531\n ],\n [\n 106.031958,\n 30.373529\n ],\n [\n 105.881053,\n 30.387465\n ],\n [\n 105.792357,\n 30.427199\n ],\n [\n 105.714749,\n 30.322927\n ],\n [\n 105.720292,\n 30.252662\n ]\n ]\n ],\n [\n [\n [\n 106.262935,\n 30.211306\n ],\n [\n 106.256776,\n 30.19631\n ],\n [\n 106.260471,\n 30.204067\n ],\n [\n 106.261703,\n 30.205101\n ],\n [\n 106.262935,\n 30.211306\n ]\n ]\n ],\n [\n [\n [\n 105.571235,\n 30.17976\n ],\n [\n 105.56138,\n 30.183898\n ],\n [\n 105.558916,\n 30.18545\n ],\n [\n 105.56138,\n 30.188035\n ],\n [\n 105.571235,\n 30.17976\n ]\n ]\n ],\n [\n [\n [\n 106.981736,\n 30.085062\n ],\n [\n 106.980504,\n 30.085062\n ],\n [\n 106.980504,\n 30.087651\n ],\n [\n 106.981736,\n 30.085062\n ]\n ]\n ],\n [\n [\n [\n 106.980504,\n 30.085062\n ],\n [\n 106.976193,\n 30.083509\n ],\n [\n 106.978041,\n 30.087133\n ],\n [\n 106.980504,\n 30.085062\n ]\n ]\n ],\n [\n [\n [\n 106.976193,\n 30.083509\n ],\n [\n 106.974345,\n 30.082992\n ],\n [\n 106.976193,\n 30.087651\n ],\n [\n 106.976193,\n 30.083509\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 520000,\n \"name\": \"贵州省\",\n \"center\": [\n 106.713478,\n 26.578343\n ],\n \"centroid\": [\n 106.88108,\n 26.826362\n ],\n \"childrenNum\": 9,\n \"level\": \"province\",\n \"subFeatureIndex\": 23,\n \"acroutes\": [\n 100000\n ],\n \"parent\": {\n \"adcode\": 100000\n }\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 109.52187,\n 26.748964\n ],\n [\n 109.454117,\n 26.761252\n ],\n [\n 109.35495,\n 26.693383\n ],\n [\n 109.407305,\n 26.532902\n ],\n [\n 109.326001,\n 26.427398\n ],\n [\n 109.285965,\n 26.296052\n ],\n [\n 109.340784,\n 26.264399\n ],\n [\n 109.466435,\n 26.314288\n ],\n [\n 109.439334,\n 26.238641\n ],\n [\n 109.486761,\n 26.148445\n ],\n [\n 109.486761,\n 26.148445\n ],\n [\n 109.449805,\n 26.101709\n ],\n [\n 109.48245,\n 26.029687\n ],\n [\n 109.408537,\n 25.967305\n ],\n [\n 109.435022,\n 25.933411\n ],\n [\n 109.339552,\n 25.834363\n ],\n [\n 109.3414,\n 25.732537\n ],\n [\n 109.147995,\n 25.7417\n ],\n [\n 109.143683,\n 25.795044\n ],\n [\n 108.989698,\n 25.778881\n ],\n [\n 108.896076,\n 25.71421\n ],\n [\n 108.953974,\n 25.686714\n ],\n [\n 108.953974,\n 25.686714\n ],\n [\n 109.000785,\n 25.73631\n ],\n [\n 109.07901,\n 25.720679\n ],\n [\n 109.030966,\n 25.629545\n ],\n [\n 109.088249,\n 25.550758\n ],\n [\n 109.025423,\n 25.512426\n ],\n [\n 108.949046,\n 25.557236\n ],\n [\n 108.781511,\n 25.554537\n ],\n [\n 108.763649,\n 25.637097\n ],\n [\n 108.68912,\n 25.623072\n ],\n [\n 108.6072,\n 25.491904\n ],\n [\n 108.625062,\n 25.308138\n ],\n [\n 108.471693,\n 25.458955\n ],\n [\n 108.418723,\n 25.443287\n ],\n [\n 108.348506,\n 25.536183\n ],\n [\n 108.142782,\n 25.390867\n ],\n [\n 108.152021,\n 25.324364\n ],\n [\n 108.115065,\n 25.210195\n ],\n [\n 108.001732,\n 25.196661\n ],\n [\n 107.841587,\n 25.115966\n ],\n [\n 107.741805,\n 25.239965\n ],\n [\n 107.700537,\n 25.193954\n ],\n [\n 107.659885,\n 25.316251\n ],\n [\n 107.599523,\n 25.250789\n ],\n [\n 107.472024,\n 25.213984\n ],\n [\n 107.481263,\n 25.300024\n ],\n [\n 107.432604,\n 25.289205\n ],\n [\n 107.420901,\n 25.393029\n ],\n [\n 107.318039,\n 25.401677\n ],\n [\n 107.336517,\n 25.461116\n ],\n [\n 107.228728,\n 25.604728\n ],\n [\n 107.064272,\n 25.559395\n ],\n [\n 107.066736,\n 25.509186\n ],\n [\n 106.963874,\n 25.437884\n ],\n [\n 107.012533,\n 25.353024\n ],\n [\n 107.013765,\n 25.275138\n ],\n [\n 106.912751,\n 25.243212\n ],\n [\n 106.900432,\n 25.194495\n ],\n [\n 106.732281,\n 25.162548\n ],\n [\n 106.684238,\n 25.178252\n ],\n [\n 106.590615,\n 25.087791\n ],\n [\n 106.304819,\n 24.973944\n ],\n [\n 106.215508,\n 24.982079\n ],\n [\n 106.146522,\n 24.948449\n ],\n [\n 106.206269,\n 24.851304\n ],\n [\n 106.173008,\n 24.760059\n ],\n [\n 106.045508,\n 24.681796\n ],\n [\n 106.023335,\n 24.632313\n ],\n [\n 105.942031,\n 24.724738\n ],\n [\n 105.827466,\n 24.702997\n ],\n [\n 105.70551,\n 24.768752\n ],\n [\n 105.500402,\n 24.807862\n ],\n [\n 105.445584,\n 24.918608\n ],\n [\n 105.365511,\n 24.943566\n ],\n [\n 105.265729,\n 24.930003\n ],\n [\n 105.198592,\n 24.995095\n ],\n [\n 105.09573,\n 24.928375\n ],\n [\n 105.077868,\n 24.918065\n ],\n [\n 105.03352,\n 24.787765\n ],\n [\n 104.899245,\n 24.752996\n ],\n [\n 104.841963,\n 24.676359\n ],\n [\n 104.743413,\n 24.621978\n ],\n [\n 104.63316,\n 24.65896\n ],\n [\n 104.529682,\n 24.73126\n ],\n [\n 104.539537,\n 24.813836\n ],\n [\n 104.713232,\n 24.996179\n ],\n [\n 104.667652,\n 25.05961\n ],\n [\n 104.750804,\n 25.215067\n ],\n [\n 104.822869,\n 25.17013\n ],\n [\n 104.816094,\n 25.262152\n ],\n [\n 104.639935,\n 25.298942\n ],\n [\n 104.646094,\n 25.356809\n ],\n [\n 104.543232,\n 25.400597\n ],\n [\n 104.556783,\n 25.524845\n ],\n [\n 104.434827,\n 25.47246\n ],\n [\n 104.420661,\n 25.585301\n ],\n [\n 104.332581,\n 25.598792\n ],\n [\n 104.309791,\n 25.648964\n ],\n [\n 104.328886,\n 25.760561\n ],\n [\n 104.373233,\n 25.731459\n ],\n [\n 104.441602,\n 25.869362\n ],\n [\n 104.414501,\n 25.909733\n ],\n [\n 104.499501,\n 26.070541\n ],\n [\n 104.592508,\n 26.317506\n ],\n [\n 104.683667,\n 26.377557\n ],\n [\n 104.554935,\n 26.590701\n ],\n [\n 104.487798,\n 26.579465\n ],\n [\n 104.421276,\n 26.712091\n ],\n [\n 104.354139,\n 26.621194\n ],\n [\n 104.120082,\n 26.636705\n ],\n [\n 104.052329,\n 26.507204\n ],\n [\n 103.865699,\n 26.512023\n ],\n [\n 103.764685,\n 26.584816\n ],\n [\n 103.773308,\n 26.716901\n ],\n [\n 103.705555,\n 26.794904\n ],\n [\n 103.779468,\n 26.874454\n ],\n [\n 103.77454,\n 26.951815\n ],\n [\n 103.675374,\n 27.051506\n ],\n [\n 103.638418,\n 27.013133\n ],\n [\n 103.624251,\n 27.112237\n ],\n [\n 103.711714,\n 27.14259\n ],\n [\n 103.903271,\n 27.347921\n ],\n [\n 103.932221,\n 27.444072\n ],\n [\n 104.015372,\n 27.429204\n ],\n [\n 104.01722,\n 27.383523\n ],\n [\n 104.113307,\n 27.338354\n ],\n [\n 104.174285,\n 27.262856\n ],\n [\n 104.363378,\n 27.467964\n ],\n [\n 104.497653,\n 27.411677\n ],\n [\n 104.546312,\n 27.330382\n ],\n [\n 104.609754,\n 27.306991\n ],\n [\n 104.808702,\n 27.35483\n ],\n [\n 104.871528,\n 27.291041\n ],\n [\n 105.067397,\n 27.418051\n ],\n [\n 105.184425,\n 27.393085\n ],\n [\n 105.260186,\n 27.514672\n ],\n [\n 105.232469,\n 27.546506\n ],\n [\n 105.305149,\n 27.612799\n ],\n [\n 105.308229,\n 27.705011\n ],\n [\n 105.353809,\n 27.74897\n ],\n [\n 105.508409,\n 27.769089\n ],\n [\n 105.605112,\n 27.715605\n ],\n [\n 105.62359,\n 27.666333\n ],\n [\n 105.78435,\n 27.719312\n ],\n [\n 106.023335,\n 27.746851\n ],\n [\n 106.120653,\n 27.779677\n ],\n [\n 106.193334,\n 27.754265\n ],\n [\n 106.343007,\n 27.821489\n ],\n [\n 106.304819,\n 27.899249\n ],\n [\n 106.328225,\n 27.952643\n ],\n [\n 106.206885,\n 28.134302\n ],\n [\n 106.126812,\n 28.16701\n ],\n [\n 105.975907,\n 28.107917\n ],\n [\n 105.860111,\n 28.165955\n ],\n [\n 105.88906,\n 28.238722\n ],\n [\n 105.826234,\n 28.304064\n ],\n [\n 105.730147,\n 28.271925\n ],\n [\n 105.639604,\n 28.32408\n ],\n [\n 105.62359,\n 28.518253\n ],\n [\n 105.683952,\n 28.535601\n ],\n [\n 105.749242,\n 28.614943\n ],\n [\n 105.884748,\n 28.594981\n ],\n [\n 105.891524,\n 28.672179\n ],\n [\n 105.966668,\n 28.76086\n ],\n [\n 106.103407,\n 28.636476\n ],\n [\n 106.2925,\n 28.537177\n ],\n [\n 106.330688,\n 28.481971\n ],\n [\n 106.37442,\n 28.525613\n ],\n [\n 106.395978,\n 28.570287\n ],\n [\n 106.484057,\n 28.530344\n ],\n [\n 106.504999,\n 28.662204\n ],\n [\n 106.45326,\n 28.816968\n ],\n [\n 106.562897,\n 28.753516\n ],\n [\n 106.63681,\n 28.623346\n ],\n [\n 106.564745,\n 28.485127\n ],\n [\n 106.632499,\n 28.503531\n ],\n [\n 106.7446,\n 28.465667\n ],\n [\n 106.73844,\n 28.554522\n ],\n [\n 106.866556,\n 28.624397\n ],\n [\n 106.883186,\n 28.69265\n ],\n [\n 106.824056,\n 28.756139\n ],\n [\n 106.926302,\n 28.809104\n ],\n [\n 106.986664,\n 28.793899\n ],\n [\n 106.986664,\n 28.793899\n ],\n [\n 106.983584,\n 28.851561\n ],\n [\n 107.057497,\n 28.895049\n ],\n [\n 107.191156,\n 28.888763\n ],\n [\n 107.219489,\n 28.772923\n ],\n [\n 107.383945,\n 28.848417\n ],\n [\n 107.441227,\n 28.943755\n ],\n [\n 107.36485,\n 29.010753\n ],\n [\n 107.412894,\n 29.095485\n ],\n [\n 107.404271,\n 29.187984\n ],\n [\n 107.486806,\n 29.174402\n ],\n [\n 107.570574,\n 29.218276\n ],\n [\n 107.589052,\n 29.149845\n ],\n [\n 107.701769,\n 29.142006\n ],\n [\n 107.751044,\n 29.199997\n ],\n [\n 107.810791,\n 29.138348\n ],\n [\n 107.784921,\n 29.04842\n ],\n [\n 107.867457,\n 28.960508\n ],\n [\n 107.930899,\n 29.035343\n ],\n [\n 108.024521,\n 29.038482\n ],\n [\n 108.068253,\n 29.086597\n ],\n [\n 108.256115,\n 29.040574\n ],\n [\n 108.268433,\n 29.089734\n ],\n [\n 108.350353,\n 28.933282\n ],\n [\n 108.352817,\n 28.815395\n ],\n [\n 108.385462,\n 28.772398\n ],\n [\n 108.332491,\n 28.679528\n ],\n [\n 108.471077,\n 28.627548\n ],\n [\n 108.565316,\n 28.662204\n ],\n [\n 108.636149,\n 28.621245\n ],\n [\n 108.577019,\n 28.534024\n ],\n [\n 108.611512,\n 28.324607\n ],\n [\n 108.668178,\n 28.334614\n ],\n [\n 108.688504,\n 28.422527\n ],\n [\n 108.640461,\n 28.457251\n ],\n [\n 108.710678,\n 28.500902\n ],\n [\n 108.779663,\n 28.425158\n ],\n [\n 108.764881,\n 28.306698\n ],\n [\n 108.726692,\n 28.282463\n ],\n [\n 108.772888,\n 28.21289\n ],\n [\n 108.922561,\n 28.217635\n ],\n [\n 109.006329,\n 28.163317\n ],\n [\n 109.026655,\n 28.220271\n ],\n [\n 109.086401,\n 28.184942\n ],\n [\n 109.081473,\n 28.249264\n ],\n [\n 109.152306,\n 28.349885\n ],\n [\n 109.191726,\n 28.470927\n ],\n [\n 109.274262,\n 28.494592\n ],\n [\n 109.27303,\n 28.310386\n ],\n [\n 109.388211,\n 28.268236\n ],\n [\n 109.340168,\n 28.190216\n ],\n [\n 109.298284,\n 28.036117\n ],\n [\n 109.378972,\n 28.032948\n ],\n [\n 109.30198,\n 27.956342\n ],\n [\n 109.345711,\n 27.840537\n ],\n [\n 109.332777,\n 27.782853\n ],\n [\n 109.470747,\n 27.68011\n ],\n [\n 109.461508,\n 27.567724\n ],\n [\n 109.303211,\n 27.475396\n ],\n [\n 109.300132,\n 27.423893\n ],\n [\n 109.202197,\n 27.449913\n ],\n [\n 109.142451,\n 27.418051\n ],\n [\n 109.040821,\n 27.276151\n ],\n [\n 108.907162,\n 27.2054\n ],\n [\n 108.878829,\n 27.106378\n ],\n [\n 108.791366,\n 27.084539\n ],\n [\n 108.87575,\n 26.999273\n ],\n [\n 109.07901,\n 27.115965\n ],\n [\n 109.164625,\n 27.065893\n ],\n [\n 109.267487,\n 27.128746\n ],\n [\n 109.415928,\n 27.15377\n ],\n [\n 109.472595,\n 27.135136\n ],\n [\n 109.454733,\n 27.069622\n ],\n [\n 109.520022,\n 27.058433\n ],\n [\n 109.555131,\n 26.947015\n ],\n [\n 109.486761,\n 26.895267\n ],\n [\n 109.500928,\n 26.828546\n ],\n [\n 109.481218,\n 26.838156\n ],\n [\n 109.473211,\n 26.828546\n ],\n [\n 109.504624,\n 26.805051\n ],\n [\n 109.52187,\n 26.748964\n ]\n ]\n ],\n [\n [\n [\n 109.529261,\n 26.740414\n ],\n [\n 109.528029,\n 26.744689\n ],\n [\n 109.548971,\n 26.737208\n ],\n [\n 109.548971,\n 26.737208\n ],\n [\n 109.529261,\n 26.740414\n ]\n ]\n ],\n [\n [\n [\n 109.500928,\n 26.828546\n ],\n [\n 109.504624,\n 26.805051\n ],\n [\n 109.473211,\n 26.828546\n ],\n [\n 109.481218,\n 26.838156\n ],\n [\n 109.500928,\n 26.828546\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 530000,\n \"name\": \"云南省\",\n \"center\": [\n 102.712251,\n 25.040609\n ],\n \"centroid\": [\n 101.485108,\n 25.008649\n ],\n \"childrenNum\": 16,\n \"level\": \"province\",\n \"subFeatureIndex\": 24,\n \"acroutes\": [\n 100000\n ],\n \"parent\": {\n \"adcode\": 100000\n }\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 105.542902,\n 23.18449\n ],\n [\n 105.445584,\n 23.292797\n ],\n [\n 105.372903,\n 23.317525\n ],\n [\n 105.325475,\n 23.390034\n ],\n [\n 105.238012,\n 23.264217\n ],\n [\n 105.093266,\n 23.260919\n ],\n [\n 104.886311,\n 23.169088\n ],\n [\n 104.804391,\n 23.110218\n ],\n [\n 104.860441,\n 22.970917\n ],\n [\n 104.737869,\n 22.825957\n ],\n [\n 104.579573,\n 22.84636\n ],\n [\n 104.375697,\n 22.690228\n ],\n [\n 104.272219,\n 22.738245\n ],\n [\n 104.274067,\n 22.828163\n ],\n [\n 104.117618,\n 22.808861\n ],\n [\n 104.045553,\n 22.728312\n ],\n [\n 104.009213,\n 22.51789\n ],\n [\n 103.964249,\n 22.502966\n ],\n [\n 103.825047,\n 22.615685\n ],\n [\n 103.642113,\n 22.795071\n ],\n [\n 103.566969,\n 22.698508\n ],\n [\n 103.53494,\n 22.594143\n ],\n [\n 103.436389,\n 22.697404\n ],\n [\n 103.441317,\n 22.753144\n ],\n [\n 103.323057,\n 22.807758\n ],\n [\n 103.283021,\n 22.678635\n ],\n [\n 103.195557,\n 22.648268\n ],\n [\n 103.183854,\n 22.557679\n ],\n [\n 103.081608,\n 22.506835\n ],\n [\n 103.079761,\n 22.448784\n ],\n [\n 102.930703,\n 22.482512\n ],\n [\n 102.880196,\n 22.586961\n ],\n [\n 102.688639,\n 22.700164\n ],\n [\n 102.603024,\n 22.731623\n ],\n [\n 102.570379,\n 22.700164\n ],\n [\n 102.510633,\n 22.774661\n ],\n [\n 102.384365,\n 22.679739\n ],\n [\n 102.420706,\n 22.636119\n ],\n [\n 102.322771,\n 22.554364\n ],\n [\n 102.25625,\n 22.457631\n ],\n [\n 102.270416,\n 22.419472\n ],\n [\n 102.046214,\n 22.457631\n ],\n [\n 101.907628,\n 22.43717\n ],\n [\n 101.862665,\n 22.389048\n ],\n [\n 101.76473,\n 22.506282\n ],\n [\n 101.672339,\n 22.474772\n ],\n [\n 101.625528,\n 22.282789\n ],\n [\n 101.547304,\n 22.237936\n ],\n [\n 101.596579,\n 22.160933\n ],\n [\n 101.573789,\n 22.114933\n ],\n [\n 101.626144,\n 22.006247\n ],\n [\n 101.606434,\n 21.967965\n ],\n [\n 101.701288,\n 21.938553\n ],\n [\n 101.777049,\n 21.826954\n ],\n [\n 101.747484,\n 21.730276\n ],\n [\n 101.780129,\n 21.640763\n ],\n [\n 101.754875,\n 21.585137\n ],\n [\n 101.745636,\n 21.29721\n ],\n [\n 101.833715,\n 21.252606\n ],\n [\n 101.76473,\n 21.147733\n ],\n [\n 101.672339,\n 21.195158\n ],\n [\n 101.605818,\n 21.172285\n ],\n [\n 101.604586,\n 21.229741\n ],\n [\n 101.532521,\n 21.252606\n ],\n [\n 101.387775,\n 21.225837\n ],\n [\n 101.290457,\n 21.178422\n ],\n [\n 101.222088,\n 21.234203\n ],\n [\n 101.244877,\n 21.302227\n ],\n [\n 101.142631,\n 21.409218\n ],\n [\n 101.194986,\n 21.425372\n ],\n [\n 101.209153,\n 21.557316\n ],\n [\n 101.117378,\n 21.689141\n ],\n [\n 101.123537,\n 21.771956\n ],\n [\n 101.015132,\n 21.70693\n ],\n [\n 100.870386,\n 21.672461\n ],\n [\n 100.730568,\n 21.518914\n ],\n [\n 100.558105,\n 21.450434\n ],\n [\n 100.48296,\n 21.459343\n ],\n [\n 100.437381,\n 21.532829\n ],\n [\n 100.351765,\n 21.52949\n ],\n [\n 100.247056,\n 21.463798\n ],\n [\n 100.199628,\n 21.512791\n ],\n [\n 100.126948,\n 21.508338\n ],\n [\n 100.107853,\n 21.585137\n ],\n [\n 100.169447,\n 21.663564\n ],\n [\n 100.095535,\n 21.704151\n ],\n [\n 99.991441,\n 21.703595\n ],\n [\n 99.944014,\n 21.821955\n ],\n [\n 99.999448,\n 21.970184\n ],\n [\n 99.972347,\n 22.052837\n ],\n [\n 99.871333,\n 22.0667\n ],\n [\n 99.870101,\n 22.029544\n ],\n [\n 99.486987,\n 22.12879\n ],\n [\n 99.400139,\n 22.099966\n ],\n [\n 99.220901,\n 22.111053\n ],\n [\n 99.156227,\n 22.160933\n ],\n [\n 99.235683,\n 22.250673\n ],\n [\n 99.282495,\n 22.401219\n ],\n [\n 99.381661,\n 22.503519\n ],\n [\n 99.385973,\n 22.57094\n ],\n [\n 99.31514,\n 22.737693\n ],\n [\n 99.385973,\n 22.761972\n ],\n [\n 99.457421,\n 22.84636\n ],\n [\n 99.456806,\n 22.932901\n ],\n [\n 99.563363,\n 22.925737\n ],\n [\n 99.517168,\n 23.006719\n ],\n [\n 99.528255,\n 23.065635\n ],\n [\n 99.3484,\n 23.128927\n ],\n [\n 99.255393,\n 23.077746\n ],\n [\n 99.106336,\n 23.086552\n ],\n [\n 98.889525,\n 23.209238\n ],\n [\n 98.936953,\n 23.309833\n ],\n [\n 98.872279,\n 23.484456\n ],\n [\n 98.826084,\n 23.470187\n ],\n [\n 98.808221,\n 23.547549\n ],\n [\n 98.877823,\n 23.59197\n ],\n [\n 98.786048,\n 23.781551\n ],\n [\n 98.669019,\n 23.800713\n ],\n [\n 98.701664,\n 23.834103\n ],\n [\n 98.701048,\n 23.946251\n ],\n [\n 98.899996,\n 24.109102\n ],\n [\n 98.875975,\n 24.150056\n ],\n [\n 98.716446,\n 24.12767\n ],\n [\n 98.611737,\n 24.08507\n ],\n [\n 98.550759,\n 24.125485\n ],\n [\n 98.360434,\n 24.097087\n ],\n [\n 98.225543,\n 24.113471\n ],\n [\n 98.110978,\n 24.092171\n ],\n [\n 97.902175,\n 24.01404\n ],\n [\n 97.894168,\n 23.973589\n ],\n [\n 97.769748,\n 23.933126\n ],\n [\n 97.711234,\n 23.861465\n ],\n [\n 97.5283,\n 23.926563\n ],\n [\n 97.634241,\n 24.046828\n ],\n [\n 97.730944,\n 24.113471\n ],\n [\n 97.729712,\n 24.227013\n ],\n [\n 97.767284,\n 24.258656\n ],\n [\n 97.658879,\n 24.326279\n ],\n [\n 97.716161,\n 24.358987\n ],\n [\n 97.669966,\n 24.452703\n ],\n [\n 97.531995,\n 24.43146\n ],\n [\n 97.570799,\n 24.602396\n ],\n [\n 97.570183,\n 24.766579\n ],\n [\n 97.701379,\n 24.842617\n ],\n [\n 97.764204,\n 24.824155\n ],\n [\n 97.785762,\n 24.875733\n ],\n [\n 97.716777,\n 24.978283\n ],\n [\n 97.839349,\n 25.27081\n ],\n [\n 97.914494,\n 25.211278\n ],\n [\n 98.014892,\n 25.305433\n ],\n [\n 98.06971,\n 25.311924\n ],\n [\n 98.15779,\n 25.457334\n ],\n [\n 98.131304,\n 25.510266\n ],\n [\n 98.189818,\n 25.569111\n ],\n [\n 98.170724,\n 25.620374\n ],\n [\n 98.247717,\n 25.607965\n ],\n [\n 98.314854,\n 25.543201\n ],\n [\n 98.402317,\n 25.593936\n ],\n [\n 98.457752,\n 25.68294\n ],\n [\n 98.476846,\n 25.777265\n ],\n [\n 98.553839,\n 25.845672\n ],\n [\n 98.640686,\n 25.798815\n ],\n [\n 98.704744,\n 25.852133\n ],\n [\n 98.686881,\n 25.925877\n ],\n [\n 98.614201,\n 25.968919\n ],\n [\n 98.575396,\n 26.118364\n ],\n [\n 98.634527,\n 26.145759\n ],\n [\n 98.662244,\n 26.0872\n ],\n [\n 98.735541,\n 26.183351\n ],\n [\n 98.672715,\n 26.240251\n ],\n [\n 98.733693,\n 26.350753\n ],\n [\n 98.753403,\n 26.559129\n ],\n [\n 98.781736,\n 26.62066\n ],\n [\n 98.746012,\n 26.697125\n ],\n [\n 98.757098,\n 26.87819\n ],\n [\n 98.732461,\n 27.002472\n ],\n [\n 98.765722,\n 27.050973\n ],\n [\n 98.712135,\n 27.077081\n ],\n [\n 98.696121,\n 27.211253\n ],\n [\n 98.734309,\n 27.35111\n ],\n [\n 98.706591,\n 27.362269\n ],\n [\n 98.674563,\n 27.582044\n ],\n [\n 98.583404,\n 27.571437\n ],\n [\n 98.444201,\n 27.665274\n ],\n [\n 98.429419,\n 27.548628\n ],\n [\n 98.317318,\n 27.519448\n ],\n [\n 98.278514,\n 27.659974\n ],\n [\n 98.234166,\n 27.690707\n ],\n [\n 98.222463,\n 27.812493\n ],\n [\n 98.169492,\n 27.851118\n ],\n [\n 98.205217,\n 27.88973\n ],\n [\n 98.133152,\n 27.99069\n ],\n [\n 98.160253,\n 28.101056\n ],\n [\n 98.139311,\n 28.142216\n ],\n [\n 98.168876,\n 28.204454\n ],\n [\n 98.266195,\n 28.24083\n ],\n [\n 98.208913,\n 28.35831\n ],\n [\n 98.301303,\n 28.384633\n ],\n [\n 98.37768,\n 28.246101\n ],\n [\n 98.389383,\n 28.114777\n ],\n [\n 98.428803,\n 28.10475\n ],\n [\n 98.559382,\n 28.182833\n ],\n [\n 98.626519,\n 28.165427\n ],\n [\n 98.712135,\n 28.229233\n ],\n [\n 98.752787,\n 28.333561\n ],\n [\n 98.677026,\n 28.463563\n ],\n [\n 98.627751,\n 28.487756\n ],\n [\n 98.638222,\n 28.55242\n ],\n [\n 98.594491,\n 28.667979\n ],\n [\n 98.683802,\n 28.739877\n ],\n [\n 98.652389,\n 28.816968\n ],\n [\n 98.657932,\n 28.93014\n ],\n [\n 98.765722,\n 29.006044\n ],\n [\n 98.815613,\n 28.948991\n ],\n [\n 98.828547,\n 28.820113\n ],\n [\n 98.912931,\n 28.800715\n ],\n [\n 98.972677,\n 28.832693\n ],\n [\n 98.917243,\n 28.888239\n ],\n [\n 98.925866,\n 28.978306\n ],\n [\n 99.009018,\n 29.031158\n ],\n [\n 98.967134,\n 29.128418\n ],\n [\n 98.976373,\n 29.204698\n ],\n [\n 99.113727,\n 29.221409\n ],\n [\n 99.132206,\n 28.948467\n ],\n [\n 99.103872,\n 28.842128\n ],\n [\n 99.126662,\n 28.699473\n ],\n [\n 99.183944,\n 28.588677\n ],\n [\n 99.174705,\n 28.402003\n ],\n [\n 99.280647,\n 28.298269\n ],\n [\n 99.306516,\n 28.227652\n ],\n [\n 99.374886,\n 28.181778\n ],\n [\n 99.437095,\n 28.398318\n ],\n [\n 99.403219,\n 28.546638\n ],\n [\n 99.463581,\n 28.549266\n ],\n [\n 99.532566,\n 28.681628\n ],\n [\n 99.615718,\n 28.741975\n ],\n [\n 99.625573,\n 28.814871\n ],\n [\n 99.717964,\n 28.846321\n ],\n [\n 99.733362,\n 28.719415\n ],\n [\n 99.793724,\n 28.699473\n ],\n [\n 99.987129,\n 28.524561\n ],\n [\n 99.990209,\n 28.476712\n ],\n [\n 100.073977,\n 28.42621\n ],\n [\n 100.054267,\n 28.376737\n ],\n [\n 100.176223,\n 28.324607\n ],\n [\n 100.157129,\n 28.210254\n ],\n [\n 100.033941,\n 28.184942\n ],\n [\n 100.086296,\n 28.030836\n ],\n [\n 100.196549,\n 27.936257\n ],\n [\n 100.210715,\n 27.877037\n ],\n [\n 100.295099,\n 27.869633\n ],\n [\n 100.327744,\n 27.720372\n ],\n [\n 100.442924,\n 27.866459\n ],\n [\n 100.54517,\n 27.809318\n ],\n [\n 100.633866,\n 27.915111\n ],\n [\n 100.681293,\n 27.923041\n ],\n [\n 100.707162,\n 27.80085\n ],\n [\n 100.782307,\n 27.691767\n ],\n [\n 100.848212,\n 27.670573\n ],\n [\n 100.936908,\n 27.469026\n ],\n [\n 101.021907,\n 27.332508\n ],\n [\n 101.057016,\n 27.20061\n ],\n [\n 101.170349,\n 27.195821\n ],\n [\n 101.136472,\n 27.023794\n ],\n [\n 101.264587,\n 26.955549\n ],\n [\n 101.267667,\n 26.902737\n ],\n [\n 101.399478,\n 26.841893\n ],\n [\n 101.357594,\n 26.770868\n ],\n [\n 101.389623,\n 26.723314\n ],\n [\n 101.512195,\n 26.756443\n ],\n [\n 101.453065,\n 26.692848\n ],\n [\n 101.451833,\n 26.600867\n ],\n [\n 101.400094,\n 26.605146\n ],\n [\n 101.458608,\n 26.495424\n ],\n [\n 101.506652,\n 26.499708\n ],\n [\n 101.636615,\n 26.395245\n ],\n [\n 101.660636,\n 26.346999\n ],\n [\n 101.586724,\n 26.279422\n ],\n [\n 101.630455,\n 26.224687\n ],\n [\n 101.690202,\n 26.241861\n ],\n [\n 101.807846,\n 26.156501\n ],\n [\n 101.799223,\n 26.109231\n ],\n [\n 101.86328,\n 26.052266\n ],\n [\n 101.917483,\n 26.108156\n ],\n [\n 102.005562,\n 26.091499\n ],\n [\n 102.005562,\n 26.091499\n ],\n [\n 102.107808,\n 26.068391\n ],\n [\n 102.245163,\n 26.212341\n ],\n [\n 102.349257,\n 26.244545\n ],\n [\n 102.392372,\n 26.296588\n ],\n [\n 102.567915,\n 26.36362\n ],\n [\n 102.638748,\n 26.307852\n ],\n [\n 102.60056,\n 26.250448\n ],\n [\n 102.674473,\n 26.205363\n ],\n [\n 102.739762,\n 26.268691\n ],\n [\n 102.998457,\n 26.371661\n ],\n [\n 102.989833,\n 26.483108\n ],\n [\n 103.056971,\n 26.525943\n ],\n [\n 103.018783,\n 26.593911\n ],\n [\n 102.991681,\n 26.775675\n ],\n [\n 102.898674,\n 26.908073\n ],\n [\n 102.870957,\n 27.026992\n ],\n [\n 102.913457,\n 27.133538\n ],\n [\n 102.882044,\n 27.293168\n ],\n [\n 102.941174,\n 27.405303\n ],\n [\n 102.989833,\n 27.368114\n ],\n [\n 103.111789,\n 27.401054\n ],\n [\n 103.222043,\n 27.566133\n ],\n [\n 103.295955,\n 27.568785\n ],\n [\n 103.29226,\n 27.632943\n ],\n [\n 103.487512,\n 27.795028\n ],\n [\n 103.515846,\n 27.965326\n ],\n [\n 103.488128,\n 28.03242\n ],\n [\n 103.430846,\n 28.044039\n ],\n [\n 103.471498,\n 28.123221\n ],\n [\n 103.573128,\n 28.230815\n ],\n [\n 103.639649,\n 28.261912\n ],\n [\n 103.721569,\n 28.201817\n ],\n [\n 103.877402,\n 28.311966\n ],\n [\n 103.781931,\n 28.525613\n ],\n [\n 103.838598,\n 28.587101\n ],\n [\n 103.844757,\n 28.660104\n ],\n [\n 103.940844,\n 28.606013\n ],\n [\n 104.12501,\n 28.637526\n ],\n [\n 104.314719,\n 28.615468\n ],\n [\n 104.425588,\n 28.626497\n ],\n [\n 104.318415,\n 28.538229\n ],\n [\n 104.261748,\n 28.537177\n ],\n [\n 104.254357,\n 28.408844\n ],\n [\n 104.314103,\n 28.306698\n ],\n [\n 104.384936,\n 28.329874\n ],\n [\n 104.44961,\n 28.269817\n ],\n [\n 104.44653,\n 28.112666\n ],\n [\n 104.354139,\n 28.019744\n ],\n [\n 104.40095,\n 27.952114\n ],\n [\n 104.573413,\n 27.840537\n ],\n [\n 104.743413,\n 27.901892\n ],\n [\n 104.872144,\n 27.905594\n ],\n [\n 105.05939,\n 28.097889\n ],\n [\n 105.186889,\n 28.0546\n ],\n [\n 105.186273,\n 27.995445\n ],\n [\n 105.270657,\n 27.99703\n ],\n [\n 105.284823,\n 27.935729\n ],\n [\n 105.233084,\n 27.895547\n ],\n [\n 105.244171,\n 27.823077\n ],\n [\n 105.308229,\n 27.810376\n ],\n [\n 105.308229,\n 27.810376\n ],\n [\n 105.273736,\n 27.795028\n ],\n [\n 105.308229,\n 27.705011\n ],\n [\n 105.305149,\n 27.612799\n ],\n [\n 105.232469,\n 27.546506\n ],\n [\n 105.260186,\n 27.514672\n ],\n [\n 105.184425,\n 27.393085\n ],\n [\n 105.067397,\n 27.418051\n ],\n [\n 104.871528,\n 27.291041\n ],\n [\n 104.808702,\n 27.35483\n ],\n [\n 104.609754,\n 27.306991\n ],\n [\n 104.546312,\n 27.330382\n ],\n [\n 104.497653,\n 27.411677\n ],\n [\n 104.363378,\n 27.467964\n ],\n [\n 104.174285,\n 27.262856\n ],\n [\n 104.113307,\n 27.338354\n ],\n [\n 104.01722,\n 27.383523\n ],\n [\n 104.015372,\n 27.429204\n ],\n [\n 103.932221,\n 27.444072\n ],\n [\n 103.903271,\n 27.347921\n ],\n [\n 103.711714,\n 27.14259\n ],\n [\n 103.624251,\n 27.112237\n ],\n [\n 103.638418,\n 27.013133\n ],\n [\n 103.675374,\n 27.051506\n ],\n [\n 103.77454,\n 26.951815\n ],\n [\n 103.779468,\n 26.874454\n ],\n [\n 103.705555,\n 26.794904\n ],\n [\n 103.773308,\n 26.716901\n ],\n [\n 103.764685,\n 26.584816\n ],\n [\n 103.865699,\n 26.512023\n ],\n [\n 104.052329,\n 26.507204\n ],\n [\n 104.120082,\n 26.636705\n ],\n [\n 104.354139,\n 26.621194\n ],\n [\n 104.421276,\n 26.712091\n ],\n [\n 104.487798,\n 26.579465\n ],\n [\n 104.554935,\n 26.590701\n ],\n [\n 104.683667,\n 26.377557\n ],\n [\n 104.592508,\n 26.317506\n ],\n [\n 104.499501,\n 26.070541\n ],\n [\n 104.414501,\n 25.909733\n ],\n [\n 104.441602,\n 25.869362\n ],\n [\n 104.373233,\n 25.731459\n ],\n [\n 104.328886,\n 25.760561\n ],\n [\n 104.309791,\n 25.648964\n ],\n [\n 104.332581,\n 25.598792\n ],\n [\n 104.420661,\n 25.585301\n ],\n [\n 104.434827,\n 25.47246\n ],\n [\n 104.556783,\n 25.524845\n ],\n [\n 104.543232,\n 25.400597\n ],\n [\n 104.646094,\n 25.356809\n ],\n [\n 104.639935,\n 25.298942\n ],\n [\n 104.816094,\n 25.262152\n ],\n [\n 104.822869,\n 25.17013\n ],\n [\n 104.750804,\n 25.215067\n ],\n [\n 104.667652,\n 25.05961\n ],\n [\n 104.713232,\n 24.996179\n ],\n [\n 104.539537,\n 24.813836\n ],\n [\n 104.529682,\n 24.73126\n ],\n [\n 104.492109,\n 24.656241\n ],\n [\n 104.610986,\n 24.376973\n ],\n [\n 104.70892,\n 24.321372\n ],\n [\n 104.72863,\n 24.446167\n ],\n [\n 104.83642,\n 24.446712\n ],\n [\n 104.979933,\n 24.412937\n ],\n [\n 105.063085,\n 24.429281\n ],\n [\n 105.063085,\n 24.429281\n ],\n [\n 105.188121,\n 24.346995\n ],\n [\n 105.164715,\n 24.288109\n ],\n [\n 105.229389,\n 24.165888\n ],\n [\n 105.20044,\n 24.105279\n ],\n [\n 105.260186,\n 24.061033\n ],\n [\n 105.320548,\n 24.116202\n ],\n [\n 105.481924,\n 24.018958\n ],\n [\n 105.529967,\n 24.129308\n ],\n [\n 105.628518,\n 24.126577\n ],\n [\n 105.649459,\n 24.033167\n ],\n [\n 105.704278,\n 24.066497\n ],\n [\n 105.89214,\n 24.040271\n ],\n [\n 105.933407,\n 24.123847\n ],\n [\n 106.04982,\n 24.089986\n ],\n [\n 106.192102,\n 23.824798\n ],\n [\n 106.136667,\n 23.795238\n ],\n [\n 106.157609,\n 23.724048\n ],\n [\n 106.120653,\n 23.605129\n ],\n [\n 106.141595,\n 23.569487\n ],\n [\n 105.999929,\n 23.447683\n ],\n [\n 105.89214,\n 23.525058\n ],\n [\n 105.815763,\n 23.506953\n ],\n [\n 105.699966,\n 23.401566\n ],\n [\n 105.694423,\n 23.363122\n ],\n [\n 105.531815,\n 23.248275\n ],\n [\n 105.542902,\n 23.18449\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 540000,\n \"name\": \"西藏自治区\",\n \"center\": [\n 91.132212,\n 29.660361\n ],\n \"centroid\": [\n 88.388277,\n 31.56375\n ],\n \"childrenNum\": 7,\n \"level\": \"province\",\n \"subFeatureIndex\": 25,\n \"acroutes\": [\n 100000\n ],\n \"parent\": {\n \"adcode\": 100000\n }\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 79.039649,\n 34.33427\n ],\n [\n 79.0107,\n 34.399956\n ],\n [\n 79.161605,\n 34.441416\n ],\n [\n 79.229358,\n 34.413778\n ],\n [\n 79.504683,\n 34.454737\n ],\n [\n 79.675914,\n 34.451284\n ],\n [\n 79.801566,\n 34.478909\n ],\n [\n 79.906892,\n 34.683837\n ],\n [\n 79.947544,\n 34.820993\n ],\n [\n 80.034391,\n 34.902\n ],\n [\n 80.031311,\n 35.034384\n ],\n [\n 80.118159,\n 35.066222\n ],\n [\n 80.23026,\n 35.147476\n ],\n [\n 80.257977,\n 35.20323\n ],\n [\n 80.362687,\n 35.209096\n ],\n [\n 80.268448,\n 35.294114\n ],\n [\n 80.321419,\n 35.386848\n ],\n [\n 80.412578,\n 35.433663\n ],\n [\n 80.516672,\n 35.392214\n ],\n [\n 80.65649,\n 35.394165\n ],\n [\n 80.689135,\n 35.33903\n ],\n [\n 80.844351,\n 35.345375\n ],\n [\n 81.026053,\n 35.312181\n ],\n [\n 81.031597,\n 35.380506\n ],\n [\n 81.09935,\n 35.407333\n ],\n [\n 81.219458,\n 35.319016\n ],\n [\n 81.362356,\n 35.354647\n ],\n [\n 81.494167,\n 35.292161\n ],\n [\n 81.513261,\n 35.235002\n ],\n [\n 81.675253,\n 35.233536\n ],\n [\n 81.736847,\n 35.262365\n ],\n [\n 81.927789,\n 35.271158\n ],\n [\n 82.05344,\n 35.350255\n ],\n [\n 82.033114,\n 35.450236\n ],\n [\n 82.328149,\n 35.559342\n ],\n [\n 82.336156,\n 35.651284\n ],\n [\n 82.424852,\n 35.713006\n ],\n [\n 82.628727,\n 35.692114\n ],\n [\n 82.731589,\n 35.63767\n ],\n [\n 82.788872,\n 35.684824\n ],\n [\n 82.960719,\n 35.671702\n ],\n [\n 82.998907,\n 35.484348\n ],\n [\n 83.067892,\n 35.462908\n ],\n [\n 83.127022,\n 35.398554\n ],\n [\n 83.242203,\n 35.420011\n ],\n [\n 83.451006,\n 35.38197\n ],\n [\n 83.622238,\n 35.335614\n ],\n [\n 83.677672,\n 35.360991\n ],\n [\n 83.885244,\n 35.367334\n ],\n [\n 84.005968,\n 35.422449\n ],\n [\n 84.095895,\n 35.362943\n ],\n [\n 84.1618,\n 35.359039\n ],\n [\n 84.335495,\n 35.414647\n ],\n [\n 84.45314,\n 35.473141\n ],\n [\n 84.448828,\n 35.55058\n ],\n [\n 84.729081,\n 35.613353\n ],\n [\n 85.053065,\n 35.751862\n ],\n [\n 85.159006,\n 35.745549\n ],\n [\n 85.271107,\n 35.788757\n ],\n [\n 85.372121,\n 35.701346\n ],\n [\n 85.613569,\n 35.652257\n ],\n [\n 85.65299,\n 35.731465\n ],\n [\n 85.811286,\n 35.779049\n ],\n [\n 85.949256,\n 35.779049\n ],\n [\n 86.060125,\n 35.846008\n ],\n [\n 86.132806,\n 35.979271\n ],\n [\n 86.199944,\n 36.032513\n ],\n [\n 86.187625,\n 36.131158\n ],\n [\n 86.392733,\n 36.206992\n ],\n [\n 86.515305,\n 36.205543\n ],\n [\n 86.701318,\n 36.245122\n ],\n [\n 86.746282,\n 36.291916\n ],\n [\n 86.862078,\n 36.300114\n ],\n [\n 86.887332,\n 36.262492\n ],\n [\n 86.996353,\n 36.308793\n ],\n [\n 87.149106,\n 36.29722\n ],\n [\n 87.193454,\n 36.349283\n ],\n [\n 87.306787,\n 36.363739\n ],\n [\n 87.361605,\n 36.419128\n ],\n [\n 87.460155,\n 36.409498\n ],\n [\n 87.470626,\n 36.354102\n ],\n [\n 87.570409,\n 36.342536\n ],\n [\n 87.731785,\n 36.384936\n ],\n [\n 87.949211,\n 36.401312\n ],\n [\n 87.983088,\n 36.437903\n ],\n [\n 88.134609,\n 36.427313\n ],\n [\n 88.241782,\n 36.468704\n ],\n [\n 88.365586,\n 36.457636\n ],\n [\n 88.470912,\n 36.482175\n ],\n [\n 88.573158,\n 36.461005\n ],\n [\n 88.623665,\n 36.389271\n ],\n [\n 88.783809,\n 36.291916\n ],\n [\n 88.802903,\n 36.337717\n ],\n [\n 88.926091,\n 36.364221\n ],\n [\n 88.964279,\n 36.318917\n ],\n [\n 89.10225,\n 36.281305\n ],\n [\n 89.127503,\n 36.249465\n ],\n [\n 89.232213,\n 36.295774\n ],\n [\n 89.287647,\n 36.235954\n ],\n [\n 89.375727,\n 36.228231\n ],\n [\n 89.490291,\n 36.150969\n ],\n [\n 89.711414,\n 36.092972\n ],\n [\n 89.638117,\n 36.04993\n ],\n [\n 89.476125,\n 36.021868\n ],\n [\n 89.418843,\n 36.04606\n ],\n [\n 89.429929,\n 35.916302\n ],\n [\n 89.549422,\n 35.858132\n ],\n [\n 89.801957,\n 35.847948\n ],\n [\n 89.747138,\n 35.751862\n ],\n [\n 89.765616,\n 35.599732\n ],\n [\n 89.700327,\n 35.537435\n ],\n [\n 89.744058,\n 35.479963\n ],\n [\n 89.68616,\n 35.414647\n ],\n [\n 89.497067,\n 35.361479\n ],\n [\n 89.532175,\n 35.285323\n ],\n [\n 89.449639,\n 35.226693\n ],\n [\n 89.513081,\n 35.139158\n ],\n [\n 89.593153,\n 35.104412\n ],\n [\n 89.560509,\n 34.938794\n ],\n [\n 89.654747,\n 34.883351\n ],\n [\n 89.707102,\n 34.919663\n ],\n [\n 89.821667,\n 34.902981\n ],\n [\n 89.867862,\n 34.810677\n ],\n [\n 89.799493,\n 34.74384\n ],\n [\n 89.732356,\n 34.732039\n ],\n [\n 89.72558,\n 34.660709\n ],\n [\n 89.798877,\n 34.628714\n ],\n [\n 89.823515,\n 34.455231\n ],\n [\n 89.801957,\n 34.390575\n ],\n [\n 89.872174,\n 34.335752\n ],\n [\n 89.825362,\n 34.293746\n ],\n [\n 89.818587,\n 34.174037\n ],\n [\n 89.655979,\n 34.096778\n ],\n [\n 89.635037,\n 34.0492\n ],\n [\n 89.691704,\n 33.957933\n ],\n [\n 89.795181,\n 33.865575\n ],\n [\n 89.837065,\n 33.869052\n ],\n [\n 89.933768,\n 33.796986\n ],\n [\n 89.907282,\n 33.74128\n ],\n [\n 90.008296,\n 33.688026\n ],\n [\n 89.984275,\n 33.61232\n ],\n [\n 90.01076,\n 33.553501\n ],\n [\n 90.080977,\n 33.530561\n ],\n [\n 90.092064,\n 33.469691\n ],\n [\n 90.246665,\n 33.42426\n ],\n [\n 90.332896,\n 33.310829\n ],\n [\n 90.405577,\n 33.260311\n ],\n [\n 90.486881,\n 33.266815\n ],\n [\n 90.70554,\n 33.135645\n ],\n [\n 90.805938,\n 33.114599\n ],\n [\n 91.001807,\n 33.116102\n ],\n [\n 91.001807,\n 33.116102\n ],\n [\n 91.134849,\n 33.073495\n ],\n [\n 91.262349,\n 33.141156\n ],\n [\n 91.436044,\n 33.065974\n ],\n [\n 91.49887,\n 33.109086\n ],\n [\n 91.58079,\n 33.039395\n ],\n [\n 91.785281,\n 32.944044\n ],\n [\n 91.896766,\n 32.907884\n ],\n [\n 91.955897,\n 32.820437\n ],\n [\n 92.145606,\n 32.885779\n ],\n [\n 92.227526,\n 32.820939\n ],\n [\n 92.198577,\n 32.755046\n ],\n [\n 92.255243,\n 32.720823\n ],\n [\n 92.355641,\n 32.764606\n ],\n [\n 92.63651,\n 32.720319\n ],\n [\n 92.686401,\n 32.765109\n ],\n [\n 92.877342,\n 32.697161\n ],\n [\n 93.019624,\n 32.737433\n ],\n [\n 93.069515,\n 32.626137\n ],\n [\n 93.239514,\n 32.662411\n ],\n [\n 93.385492,\n 32.525297\n ],\n [\n 93.4631,\n 32.556065\n ],\n [\n 93.516687,\n 32.475844\n ],\n [\n 93.618933,\n 32.522775\n ],\n [\n 93.654657,\n 32.57321\n ],\n [\n 93.820345,\n 32.549509\n ],\n [\n 93.861613,\n 32.466253\n ],\n [\n 93.958931,\n 32.484929\n ],\n [\n 94.136322,\n 32.433939\n ],\n [\n 94.196684,\n 32.516216\n ],\n [\n 94.371611,\n 32.524793\n ],\n [\n 94.395016,\n 32.594385\n ],\n [\n 94.53853,\n 32.599425\n ],\n [\n 94.614291,\n 32.673492\n ],\n [\n 94.772587,\n 32.555057\n ],\n [\n 94.80708,\n 32.486444\n ],\n [\n 94.889616,\n 32.472311\n ],\n [\n 94.912405,\n 32.415758\n ],\n [\n 94.985086,\n 32.421819\n ],\n [\n 95.081789,\n 32.384942\n ],\n [\n 95.218527,\n 32.397067\n ],\n [\n 95.261643,\n 32.348049\n ],\n [\n 95.096571,\n 32.322267\n ],\n [\n 95.10581,\n 32.259042\n ],\n [\n 95.241317,\n 32.32075\n ],\n [\n 95.26965,\n 32.194761\n ],\n [\n 95.312766,\n 32.148673\n ],\n [\n 95.406389,\n 32.182102\n ],\n [\n 95.454432,\n 32.062006\n ],\n [\n 95.360809,\n 31.959013\n ],\n [\n 95.439649,\n 31.831508\n ],\n [\n 95.546823,\n 31.739961\n ],\n [\n 95.618272,\n 31.783712\n ],\n [\n 95.779648,\n 31.74912\n ],\n [\n 95.825227,\n 31.681935\n ],\n [\n 95.89914,\n 31.817273\n ],\n [\n 95.982908,\n 31.816765\n ],\n [\n 96.041422,\n 31.734364\n ],\n [\n 96.135661,\n 31.702299\n ],\n [\n 96.160298,\n 31.600943\n ],\n [\n 96.204646,\n 31.598904\n ],\n [\n 96.252689,\n 31.69619\n ],\n [\n 96.176313,\n 31.777608\n ],\n [\n 96.253921,\n 31.929566\n ],\n [\n 96.389428,\n 31.919917\n ],\n [\n 96.468268,\n 31.769978\n ],\n [\n 96.576057,\n 31.712989\n ],\n [\n 96.616093,\n 31.736908\n ],\n [\n 96.775006,\n 31.673788\n ],\n [\n 96.840295,\n 31.720623\n ],\n [\n 96.760223,\n 31.856922\n ],\n [\n 96.81073,\n 31.894521\n ],\n [\n 96.722651,\n 32.013314\n ],\n [\n 96.894498,\n 32.013822\n ],\n [\n 97.008447,\n 32.067076\n ],\n [\n 97.130403,\n 32.04375\n ],\n [\n 97.308409,\n 32.074682\n ],\n [\n 97.264062,\n 32.183621\n ],\n [\n 97.299786,\n 32.294959\n ],\n [\n 97.371235,\n 32.273208\n ],\n [\n 97.424822,\n 32.323278\n ],\n [\n 97.387865,\n 32.427374\n ],\n [\n 97.341054,\n 32.441009\n ],\n [\n 97.388481,\n 32.501583\n ],\n [\n 97.334895,\n 32.514198\n ],\n [\n 97.448843,\n 32.586823\n ],\n [\n 97.472249,\n 32.54497\n ],\n [\n 97.670582,\n 32.517225\n ],\n [\n 97.730944,\n 32.527315\n ],\n [\n 97.937283,\n 32.484425\n ],\n [\n 98.218768,\n 32.342489\n ],\n [\n 98.218768,\n 32.234752\n ],\n [\n 98.301919,\n 32.12334\n ],\n [\n 98.434962,\n 32.007734\n ],\n [\n 98.414636,\n 31.832525\n ],\n [\n 98.543983,\n 31.718588\n ],\n [\n 98.553839,\n 31.656473\n ],\n [\n 98.713367,\n 31.510189\n ],\n [\n 98.837787,\n 31.436705\n ],\n [\n 98.88583,\n 31.376446\n ],\n [\n 98.773113,\n 31.249163\n ],\n [\n 98.691809,\n 31.333016\n ],\n [\n 98.64007,\n 31.337615\n ],\n [\n 98.602498,\n 31.192367\n ],\n [\n 98.709671,\n 31.118635\n ],\n [\n 98.736772,\n 31.049459\n ],\n [\n 98.806374,\n 30.995621\n ],\n [\n 98.774345,\n 30.907877\n ],\n [\n 98.901844,\n 30.785105\n ],\n [\n 98.957895,\n 30.765056\n ],\n [\n 98.907388,\n 30.698196\n ],\n [\n 98.989308,\n 30.151826\n ],\n [\n 99.044742,\n 30.079885\n ],\n [\n 99.068148,\n 29.93118\n ],\n [\n 99.0238,\n 29.846105\n ],\n [\n 98.993003,\n 29.656502\n ],\n [\n 99.052133,\n 29.563908\n ],\n [\n 99.075539,\n 29.314316\n ],\n [\n 99.113727,\n 29.221409\n ],\n [\n 98.976373,\n 29.204698\n ],\n [\n 98.967134,\n 29.128418\n ],\n [\n 99.009018,\n 29.031158\n ],\n [\n 98.925866,\n 28.978306\n ],\n [\n 98.917243,\n 28.888239\n ],\n [\n 98.972677,\n 28.832693\n ],\n [\n 98.912931,\n 28.800715\n ],\n [\n 98.828547,\n 28.820113\n ],\n [\n 98.815613,\n 28.948991\n ],\n [\n 98.765722,\n 29.006044\n ],\n [\n 98.657932,\n 28.93014\n ],\n [\n 98.652389,\n 28.816968\n ],\n [\n 98.683802,\n 28.739877\n ],\n [\n 98.594491,\n 28.667979\n ],\n [\n 98.638222,\n 28.55242\n ],\n [\n 98.627751,\n 28.487756\n ],\n [\n 98.677026,\n 28.463563\n ],\n [\n 98.752787,\n 28.333561\n ],\n [\n 98.712135,\n 28.229233\n ],\n [\n 98.626519,\n 28.165427\n ],\n [\n 98.559382,\n 28.182833\n ],\n [\n 98.428803,\n 28.10475\n ],\n [\n 98.389383,\n 28.114777\n ],\n [\n 98.37768,\n 28.246101\n ],\n [\n 98.301303,\n 28.384633\n ],\n [\n 98.208913,\n 28.35831\n ],\n [\n 98.266195,\n 28.24083\n ],\n [\n 98.168876,\n 28.204454\n ],\n [\n 98.139311,\n 28.142216\n ],\n [\n 98.090036,\n 28.195489\n ],\n [\n 98.03337,\n 28.187052\n ],\n [\n 98.020435,\n 28.25348\n ],\n [\n 97.907718,\n 28.363575\n ],\n [\n 97.801161,\n 28.326714\n ],\n [\n 97.738335,\n 28.396213\n ],\n [\n 97.737103,\n 28.465667\n ],\n [\n 97.68598,\n 28.51983\n ],\n [\n 97.569567,\n 28.541382\n ],\n [\n 97.506126,\n 28.471453\n ],\n [\n 97.485184,\n 28.386212\n ],\n [\n 97.518445,\n 28.327767\n ],\n [\n 97.460546,\n 28.268236\n ],\n [\n 97.42359,\n 28.297742\n ],\n [\n 97.350909,\n 28.23714\n ],\n [\n 97.321344,\n 28.054071\n ],\n [\n 97.413119,\n 28.013406\n ],\n [\n 97.386634,\n 27.882855\n ],\n [\n 97.303482,\n 27.913525\n ],\n [\n 97.062649,\n 27.742615\n ],\n [\n 97.049099,\n 27.814081\n ],\n [\n 96.972722,\n 27.861169\n ],\n [\n 96.849534,\n 27.874393\n ],\n [\n 96.784245,\n 27.9315\n ],\n [\n 96.690622,\n 27.948943\n ],\n [\n 96.572978,\n 28.058296\n ],\n [\n 96.499681,\n 28.067271\n ],\n [\n 96.46334,\n 28.143271\n ],\n [\n 96.398667,\n 28.118471\n ],\n [\n 96.297037,\n 28.141161\n ],\n [\n 96.275479,\n 28.228179\n ],\n [\n 95.989067,\n 28.198126\n ],\n [\n 95.874502,\n 28.297742\n ],\n [\n 95.674322,\n 28.254007\n ],\n [\n 95.371896,\n 28.110028\n ],\n [\n 95.28628,\n 27.939957\n ],\n [\n 95.015267,\n 27.828897\n ],\n [\n 94.88592,\n 27.743145\n ],\n [\n 94.524979,\n 27.596362\n ],\n [\n 94.277372,\n 27.580983\n ],\n [\n 93.970634,\n 27.305396\n ],\n [\n 93.849294,\n 27.168676\n ],\n [\n 93.841903,\n 27.045645\n ],\n [\n 93.56781,\n 26.937948\n ],\n [\n 93.232739,\n 26.907006\n ],\n [\n 93.111399,\n 26.880325\n ],\n [\n 92.909371,\n 26.914475\n ],\n [\n 92.802813,\n 26.895267\n ],\n [\n 92.682089,\n 26.948082\n ],\n [\n 92.57122,\n 26.946482\n ],\n [\n 92.404916,\n 26.902737\n ],\n [\n 92.109265,\n 26.854705\n ],\n [\n 92.124664,\n 26.959815\n ],\n [\n 92.043976,\n 27.052572\n ],\n [\n 92.032273,\n 27.168144\n ],\n [\n 92.125896,\n 27.27296\n ],\n [\n 92.010715,\n 27.474866\n ],\n [\n 91.839484,\n 27.489728\n ],\n [\n 91.753868,\n 27.462656\n ],\n [\n 91.585101,\n 27.54014\n ],\n [\n 91.570934,\n 27.650965\n ],\n [\n 91.642383,\n 27.766442\n ],\n [\n 91.611586,\n 27.891316\n ],\n [\n 91.486551,\n 27.937314\n ],\n [\n 91.464993,\n 28.002841\n ],\n [\n 91.309776,\n 28.057768\n ],\n [\n 91.251878,\n 27.970611\n ],\n [\n 91.162567,\n 27.968497\n ],\n [\n 91.113292,\n 27.846357\n ],\n [\n 90.96485,\n 27.900306\n ],\n [\n 90.96177,\n 27.9537\n ],\n [\n 90.896481,\n 27.9463\n ],\n [\n 90.802242,\n 28.040342\n ],\n [\n 90.701844,\n 28.076246\n ],\n [\n 90.591591,\n 28.021329\n ],\n [\n 90.513983,\n 28.061992\n ],\n [\n 90.384019,\n 28.060936\n ],\n [\n 90.296556,\n 28.15435\n ],\n [\n 90.231882,\n 28.144854\n ],\n [\n 90.124709,\n 28.190743\n ],\n [\n 90.03355,\n 28.13694\n ],\n [\n 89.976268,\n 28.189161\n ],\n [\n 89.906051,\n 28.180723\n ],\n [\n 89.789638,\n 28.24083\n ],\n [\n 89.720037,\n 28.170175\n ],\n [\n 89.605472,\n 28.161735\n ],\n [\n 89.461958,\n 28.031892\n ],\n [\n 89.375727,\n 27.875979\n ],\n [\n 89.238988,\n 27.796616\n ],\n [\n 89.184786,\n 27.673752\n ],\n [\n 89.131815,\n 27.633474\n ],\n [\n 89.163228,\n 27.574619\n ],\n [\n 89.095474,\n 27.471681\n ],\n [\n 89.182938,\n 27.373959\n ],\n [\n 89.077612,\n 27.287319\n ],\n [\n 89.057286,\n 27.234663\n ],\n [\n 88.975982,\n 27.217106\n ],\n [\n 88.911924,\n 27.274024\n ],\n [\n 88.920548,\n 27.325598\n ],\n [\n 88.809063,\n 27.405834\n ],\n [\n 88.770874,\n 27.567724\n ],\n [\n 88.852178,\n 27.671103\n ],\n [\n 88.888519,\n 27.846886\n ],\n [\n 88.842939,\n 28.006539\n ],\n [\n 88.764099,\n 28.068327\n ],\n [\n 88.67602,\n 28.068327\n ],\n [\n 88.645223,\n 28.111083\n ],\n [\n 88.565151,\n 28.083109\n ],\n [\n 88.554064,\n 28.027667\n ],\n [\n 88.478919,\n 28.034005\n ],\n [\n 88.401311,\n 27.976952\n ],\n [\n 88.254101,\n 27.939429\n ],\n [\n 88.156783,\n 27.957928\n ],\n [\n 88.111819,\n 27.864872\n ],\n [\n 87.826639,\n 27.927799\n ],\n [\n 87.727473,\n 27.802967\n ],\n [\n 87.590119,\n 27.848473\n ],\n [\n 87.45954,\n 27.82096\n ],\n [\n 87.420735,\n 27.859053\n ],\n [\n 87.364069,\n 27.824135\n ],\n [\n 87.280917,\n 27.845299\n ],\n [\n 87.227946,\n 27.813022\n ],\n [\n 87.118309,\n 27.840537\n ],\n [\n 87.035157,\n 27.9463\n ],\n [\n 86.935375,\n 27.955285\n ],\n [\n 86.864542,\n 28.022385\n ],\n [\n 86.756753,\n 28.032948\n ],\n [\n 86.700086,\n 28.101583\n ],\n [\n 86.647732,\n 28.069383\n ],\n [\n 86.568891,\n 28.103167\n ],\n [\n 86.514689,\n 27.954757\n ],\n [\n 86.450015,\n 27.908766\n ],\n [\n 86.231972,\n 27.97431\n ],\n [\n 86.19132,\n 28.16701\n ],\n [\n 86.082915,\n 28.01816\n ],\n [\n 86.125415,\n 27.923041\n ],\n [\n 86.053966,\n 27.900306\n ],\n [\n 85.949256,\n 27.937314\n ],\n [\n 85.980053,\n 27.984349\n ],\n [\n 85.901213,\n 28.053543\n ],\n [\n 85.854402,\n 28.172284\n ],\n [\n 85.753388,\n 28.227652\n ],\n [\n 85.720743,\n 28.371999\n ],\n [\n 85.682555,\n 28.375684\n ],\n [\n 85.650526,\n 28.283517\n ],\n [\n 85.526106,\n 28.324607\n ],\n [\n 85.415853,\n 28.321447\n ],\n [\n 85.272339,\n 28.282463\n ],\n [\n 85.209513,\n 28.338827\n ],\n [\n 85.113427,\n 28.34462\n ],\n [\n 85.108499,\n 28.461459\n ],\n [\n 85.189803,\n 28.545062\n ],\n [\n 85.195963,\n 28.623871\n ],\n [\n 85.126361,\n 28.675854\n ],\n [\n 85.05676,\n 28.674279\n ],\n [\n 84.981616,\n 28.586576\n ],\n [\n 84.857196,\n 28.56766\n ],\n [\n 84.698284,\n 28.633325\n ],\n [\n 84.650856,\n 28.714692\n ],\n [\n 84.483321,\n 28.735155\n ],\n [\n 84.408176,\n 28.854182\n ],\n [\n 84.234481,\n 28.889287\n ],\n [\n 84.248648,\n 29.030635\n ],\n [\n 84.194445,\n 29.044759\n ],\n [\n 84.20738,\n 29.118487\n ],\n [\n 84.116837,\n 29.286661\n ],\n [\n 84.002272,\n 29.291358\n ],\n [\n 83.917273,\n 29.324749\n ],\n [\n 83.727563,\n 29.244383\n ],\n [\n 83.656114,\n 29.167088\n ],\n [\n 83.548941,\n 29.201042\n ],\n [\n 83.266841,\n 29.571194\n ],\n [\n 83.12887,\n 29.62374\n ],\n [\n 83.088834,\n 29.605014\n ],\n [\n 82.9484,\n 29.704846\n ],\n [\n 82.830756,\n 29.687694\n ],\n [\n 82.703872,\n 29.847662\n ],\n [\n 82.6238,\n 29.834687\n ],\n [\n 82.560974,\n 29.955547\n ],\n [\n 82.498148,\n 29.947771\n ],\n [\n 82.412533,\n 30.012037\n ],\n [\n 82.246845,\n 30.071601\n ],\n [\n 82.17786,\n 30.067976\n ],\n [\n 82.207425,\n 30.143548\n ],\n [\n 82.114418,\n 30.226816\n ],\n [\n 82.104563,\n 30.346682\n ],\n [\n 81.99123,\n 30.322927\n ],\n [\n 81.872354,\n 30.373012\n ],\n [\n 81.759021,\n 30.385401\n ],\n [\n 81.63029,\n 30.446802\n ],\n [\n 81.566232,\n 30.428747\n ],\n [\n 81.555761,\n 30.369399\n ],\n [\n 81.406704,\n 30.40398\n ],\n [\n 81.427646,\n 30.305366\n ],\n [\n 81.393769,\n 30.199413\n ],\n [\n 81.335871,\n 30.150791\n ],\n [\n 81.269349,\n 30.153378\n ],\n [\n 81.293371,\n 30.094899\n ],\n [\n 81.225618,\n 30.005301\n ],\n [\n 81.131995,\n 30.016181\n ],\n [\n 81.034677,\n 30.246977\n ],\n [\n 80.81725,\n 30.321378\n ],\n [\n 80.719316,\n 30.414816\n ],\n [\n 80.633084,\n 30.458665\n ],\n [\n 80.549316,\n 30.448866\n ],\n [\n 80.322035,\n 30.564338\n ],\n [\n 80.214245,\n 30.585974\n ],\n [\n 80.124934,\n 30.558671\n ],\n [\n 80.04363,\n 30.603485\n ],\n [\n 79.970333,\n 30.685848\n ],\n [\n 79.961094,\n 30.771225\n ],\n [\n 79.890877,\n 30.854986\n ],\n [\n 79.835443,\n 30.850876\n ],\n [\n 79.75845,\n 30.93662\n ],\n [\n 79.668523,\n 30.980233\n ],\n [\n 79.59769,\n 30.925843\n ],\n [\n 79.505915,\n 31.027415\n ],\n [\n 79.427075,\n 31.018186\n ],\n [\n 79.421531,\n 31.067399\n ],\n [\n 79.316206,\n 31.017673\n ],\n [\n 79.33222,\n 30.96946\n ],\n [\n 79.227511,\n 30.94945\n ],\n [\n 79.181931,\n 31.015622\n ],\n [\n 79.0957,\n 30.993057\n ],\n [\n 79.010084,\n 31.044333\n ],\n [\n 78.997765,\n 31.159093\n ],\n [\n 78.865338,\n 31.313082\n ],\n [\n 78.841933,\n 31.288542\n ],\n [\n 78.755085,\n 31.3555\n ],\n [\n 78.792041,\n 31.436195\n ],\n [\n 78.729832,\n 31.478047\n ],\n [\n 78.740303,\n 31.532631\n ],\n [\n 78.845628,\n 31.610115\n ],\n [\n 78.763092,\n 31.668696\n ],\n [\n 78.706426,\n 31.778626\n ],\n [\n 78.654071,\n 31.821849\n ],\n [\n 78.739687,\n 31.885376\n ],\n [\n 78.762476,\n 31.946829\n ],\n [\n 78.599868,\n 32.024982\n ],\n [\n 78.519796,\n 32.123847\n ],\n [\n 78.469905,\n 32.127901\n ],\n [\n 78.430485,\n 32.211975\n ],\n [\n 78.511173,\n 32.308108\n ],\n [\n 78.458818,\n 32.379889\n ],\n [\n 78.472985,\n 32.435454\n ],\n [\n 78.395377,\n 32.530342\n ],\n [\n 78.518564,\n 32.605978\n ],\n [\n 78.628202,\n 32.630168\n ],\n [\n 78.741534,\n 32.703706\n ],\n [\n 78.781571,\n 32.607994\n ],\n [\n 78.760629,\n 32.56363\n ],\n [\n 78.81052,\n 32.436464\n ],\n [\n 78.970664,\n 32.331873\n ],\n [\n 79.005772,\n 32.375341\n ],\n [\n 79.103091,\n 32.369782\n ],\n [\n 79.135736,\n 32.472311\n ],\n [\n 79.252148,\n 32.51672\n ],\n [\n 79.308199,\n 32.596905\n ],\n [\n 79.27309,\n 32.678025\n ],\n [\n 79.301423,\n 32.728877\n ],\n [\n 79.224431,\n 32.784729\n ],\n [\n 79.255844,\n 32.942537\n ],\n [\n 79.162837,\n 33.011804\n ],\n [\n 79.139431,\n 33.117606\n ],\n [\n 79.162221,\n 33.166202\n ],\n [\n 79.072294,\n 33.228286\n ],\n [\n 79.022403,\n 33.323328\n ],\n [\n 78.84686,\n 33.421264\n ],\n [\n 78.74215,\n 33.553501\n ],\n [\n 78.755085,\n 33.623281\n ],\n [\n 78.692259,\n 33.676575\n ],\n [\n 78.779723,\n 33.732323\n ],\n [\n 78.758165,\n 33.791019\n ],\n [\n 78.744614,\n 33.980759\n ],\n [\n 78.656535,\n 34.030359\n ],\n [\n 78.661462,\n 34.086868\n ],\n [\n 78.750158,\n 34.092815\n ],\n [\n 78.793273,\n 34.132445\n ],\n [\n 78.9257,\n 34.155719\n ],\n [\n 78.981751,\n 34.318458\n ],\n [\n 79.039649,\n 34.33427\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 610000,\n \"name\": \"陕西省\",\n \"center\": [\n 108.948024,\n 34.263161\n ],\n \"centroid\": [\n 108.887567,\n 35.263665\n ],\n \"childrenNum\": 10,\n \"level\": \"province\",\n \"subFeatureIndex\": 26,\n \"acroutes\": [\n 100000\n ],\n \"parent\": {\n \"adcode\": 100000\n }\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 107.288474,\n 37.00812\n ],\n [\n 107.288474,\n 37.00812\n ],\n [\n 107.268764,\n 37.099324\n ],\n [\n 107.336517,\n 37.165628\n ],\n [\n 107.257677,\n 37.337082\n ],\n [\n 107.284162,\n 37.482036\n ],\n [\n 107.342061,\n 37.515265\n ],\n [\n 107.348836,\n 37.608226\n ],\n [\n 107.484959,\n 37.706279\n ],\n [\n 107.499125,\n 37.7659\n ],\n [\n 107.620465,\n 37.775832\n ],\n [\n 107.65003,\n 37.864688\n ],\n [\n 107.982022,\n 37.787181\n ],\n [\n 108.025137,\n 37.649926\n ],\n [\n 108.134159,\n 37.621971\n ],\n [\n 108.219158,\n 37.661295\n ],\n [\n 108.304158,\n 37.638556\n ],\n [\n 108.440896,\n 37.654663\n ],\n [\n 108.532671,\n 37.690656\n ],\n [\n 108.611512,\n 37.65419\n ],\n [\n 108.777815,\n 37.683554\n ],\n [\n 108.799989,\n 37.783871\n ],\n [\n 108.798141,\n 37.93362\n ],\n [\n 108.82709,\n 37.989285\n ],\n [\n 108.797525,\n 38.047735\n ],\n [\n 108.871438,\n 38.027471\n ],\n [\n 108.938575,\n 37.920877\n ],\n [\n 109.017416,\n 37.969949\n ],\n [\n 109.069155,\n 38.091071\n ],\n [\n 108.963829,\n 38.155085\n ],\n [\n 108.938575,\n 38.207291\n ],\n [\n 109.051908,\n 38.432146\n ],\n [\n 109.178792,\n 38.520675\n ],\n [\n 109.276726,\n 38.623121\n ],\n [\n 109.367269,\n 38.627328\n ],\n [\n 109.338936,\n 38.70161\n ],\n [\n 109.404226,\n 38.720752\n ],\n [\n 109.511399,\n 38.833633\n ],\n [\n 109.549587,\n 38.805662\n ],\n [\n 109.624116,\n 38.854603\n ],\n [\n 109.683862,\n 38.935631\n ],\n [\n 109.665384,\n 38.981691\n ],\n [\n 109.961035,\n 39.191608\n ],\n [\n 110.217881,\n 39.28105\n ],\n [\n 110.146432,\n 39.455434\n ],\n [\n 110.243751,\n 39.42355\n ],\n [\n 110.39096,\n 39.31161\n ],\n [\n 110.434692,\n 39.381016\n ],\n [\n 110.528315,\n 39.380091\n ],\n [\n 110.604075,\n 39.277345\n ],\n [\n 110.702626,\n 39.27364\n ],\n [\n 110.740198,\n 39.351874\n ],\n [\n 110.892335,\n 39.509927\n ],\n [\n 111.134399,\n 39.586513\n ],\n [\n 111.148566,\n 39.531619\n ],\n [\n 111.064182,\n 39.400899\n ],\n [\n 111.125776,\n 39.366678\n ],\n [\n 111.247732,\n 39.302351\n ],\n [\n 111.163348,\n 39.152644\n ],\n [\n 111.138711,\n 39.064897\n ],\n [\n 110.980414,\n 38.970063\n ],\n [\n 111.009363,\n 38.847614\n ],\n [\n 110.880016,\n 38.618446\n ],\n [\n 110.920052,\n 38.581973\n ],\n [\n 110.874473,\n 38.453702\n ],\n [\n 110.77777,\n 38.44105\n ],\n [\n 110.746973,\n 38.366029\n ],\n [\n 110.661358,\n 38.308773\n ],\n [\n 110.57759,\n 38.297035\n ],\n [\n 110.565887,\n 38.215283\n ],\n [\n 110.509221,\n 38.192245\n ],\n [\n 110.501213,\n 38.031713\n ],\n [\n 110.522771,\n 37.954853\n ],\n [\n 110.59422,\n 37.921821\n ],\n [\n 110.663821,\n 37.803256\n ],\n [\n 110.758676,\n 37.744139\n ],\n [\n 110.706321,\n 37.705332\n ],\n [\n 110.796248,\n 37.66319\n ],\n [\n 110.795017,\n 37.566029\n ],\n [\n 110.745125,\n 37.450693\n ],\n [\n 110.644111,\n 37.435017\n ],\n [\n 110.630561,\n 37.373228\n ],\n [\n 110.695234,\n 37.34945\n ],\n [\n 110.690307,\n 37.287115\n ],\n [\n 110.53509,\n 37.137969\n ],\n [\n 110.444547,\n 37.007164\n ],\n [\n 110.382953,\n 37.021975\n ],\n [\n 110.425453,\n 36.960325\n ],\n [\n 110.416214,\n 36.790892\n ],\n [\n 110.447011,\n 36.737687\n ],\n [\n 110.394656,\n 36.676768\n ],\n [\n 110.496902,\n 36.582175\n ],\n [\n 110.503677,\n 36.487948\n ],\n [\n 110.45933,\n 36.330969\n ],\n [\n 110.474112,\n 36.248018\n ],\n [\n 110.447011,\n 36.164495\n ],\n [\n 110.511684,\n 35.879951\n ],\n [\n 110.549257,\n 35.877527\n ],\n [\n 110.57759,\n 35.701346\n ],\n [\n 110.609619,\n 35.632321\n ],\n [\n 110.525851,\n 35.44195\n ],\n [\n 110.477808,\n 35.413672\n ],\n [\n 110.45009,\n 35.327803\n ],\n [\n 110.39404,\n 35.271647\n ],\n [\n 110.325671,\n 35.014785\n ],\n [\n 110.257301,\n 34.93487\n ],\n [\n 110.232664,\n 34.803308\n ],\n [\n 110.241287,\n 34.682361\n ],\n [\n 110.310272,\n 34.608033\n ],\n [\n 110.379257,\n 34.600646\n ],\n [\n 110.360779,\n 34.516878\n ],\n [\n 110.403279,\n 34.43352\n ],\n [\n 110.403279,\n 34.43352\n ],\n [\n 110.503677,\n 34.337234\n ],\n [\n 110.426685,\n 34.275454\n ],\n [\n 110.43962,\n 34.24331\n ],\n [\n 110.642264,\n 34.16067\n ],\n [\n 110.590525,\n 34.096778\n ],\n [\n 110.669365,\n 33.939072\n ],\n [\n 110.587445,\n 33.887929\n ],\n [\n 110.782698,\n 33.795494\n ],\n [\n 110.877552,\n 33.635238\n ],\n [\n 111.00382,\n 33.578429\n ],\n [\n 111.02661,\n 33.478675\n ],\n [\n 111.022914,\n 33.475181\n ],\n [\n 111.022914,\n 33.474682\n ],\n [\n 111.02661,\n 33.474183\n ],\n [\n 110.996429,\n 33.435745\n ],\n [\n 111.025994,\n 33.330327\n ],\n [\n 110.984726,\n 33.255308\n ],\n [\n 110.824582,\n 33.158188\n ],\n [\n 110.745741,\n 33.147167\n ],\n [\n 110.702626,\n 33.097057\n ],\n [\n 110.59422,\n 33.168706\n ],\n [\n 110.54125,\n 33.255809\n ],\n [\n 110.468569,\n 33.181226\n ],\n [\n 110.218497,\n 33.163197\n ],\n [\n 110.164911,\n 33.209265\n ],\n [\n 110.031252,\n 33.191742\n ],\n [\n 109.852013,\n 33.247803\n ],\n [\n 109.732521,\n 33.231288\n ],\n [\n 109.619804,\n 33.27532\n ],\n [\n 109.537268,\n 33.2438\n ],\n [\n 109.438718,\n 33.152177\n ],\n [\n 109.576073,\n 33.110088\n ],\n [\n 109.688174,\n 33.116603\n ],\n [\n 109.794731,\n 33.066977\n ],\n [\n 109.76455,\n 32.909391\n ],\n [\n 109.988752,\n 32.886281\n ],\n [\n 110.10886,\n 32.82999\n ],\n [\n 110.159367,\n 32.767122\n ],\n [\n 110.156903,\n 32.683061\n ],\n [\n 110.206179,\n 32.633191\n ],\n [\n 110.153824,\n 32.593376\n ],\n [\n 110.085454,\n 32.613034\n ],\n [\n 110.017701,\n 32.546987\n ],\n [\n 109.910528,\n 32.592872\n ],\n [\n 109.816905,\n 32.577244\n ],\n [\n 109.726978,\n 32.608498\n ],\n [\n 109.631507,\n 32.599929\n ],\n [\n 109.637051,\n 32.540935\n ],\n [\n 109.575457,\n 32.506629\n ],\n [\n 109.502776,\n 32.389489\n ],\n [\n 109.495385,\n 32.300522\n ],\n [\n 109.592703,\n 32.219568\n ],\n [\n 109.621652,\n 32.106617\n ],\n [\n 109.590855,\n 32.012807\n ],\n [\n 109.631507,\n 31.962059\n ],\n [\n 109.584696,\n 31.900617\n ],\n [\n 109.638282,\n 31.811172\n ],\n [\n 109.585928,\n 31.726731\n ],\n [\n 109.281654,\n 31.717061\n ],\n [\n 109.273646,\n 31.801003\n ],\n [\n 109.195422,\n 31.817782\n ],\n [\n 109.164009,\n 31.877247\n ],\n [\n 108.988466,\n 31.979317\n ],\n [\n 108.902235,\n 31.984899\n ],\n [\n 108.734084,\n 32.106617\n ],\n [\n 108.67249,\n 32.104083\n ],\n [\n 108.509882,\n 32.201343\n ],\n [\n 108.46923,\n 32.270173\n ],\n [\n 108.312781,\n 32.232222\n ],\n [\n 108.251187,\n 32.273208\n ],\n [\n 108.179122,\n 32.222099\n ],\n [\n 108.070717,\n 32.233234\n ],\n [\n 107.979558,\n 32.14614\n ],\n [\n 107.812022,\n 32.24791\n ],\n [\n 107.75474,\n 32.338445\n ],\n [\n 107.707929,\n 32.331873\n ],\n [\n 107.680211,\n 32.398078\n ],\n [\n 107.533002,\n 32.383426\n ],\n [\n 107.456625,\n 32.417778\n ],\n [\n 107.436299,\n 32.529837\n ],\n [\n 107.382097,\n 32.54043\n ],\n [\n 107.313727,\n 32.489976\n ],\n [\n 107.263836,\n 32.403129\n ],\n [\n 107.127098,\n 32.482406\n ],\n [\n 107.080286,\n 32.542448\n ],\n [\n 107.108004,\n 32.600938\n ],\n [\n 107.066736,\n 32.708741\n ],\n [\n 106.82344,\n 32.705217\n ],\n [\n 106.733513,\n 32.739446\n ],\n [\n 106.663296,\n 32.690615\n ],\n [\n 106.585687,\n 32.688097\n ],\n [\n 106.421231,\n 32.616562\n ],\n [\n 106.347935,\n 32.670974\n ],\n [\n 106.17424,\n 32.697664\n ],\n [\n 106.076305,\n 32.753537\n ],\n [\n 106.076305,\n 32.758065\n ],\n [\n 106.076921,\n 32.764103\n ],\n [\n 106.07261,\n 32.764103\n ],\n [\n 106.093552,\n 32.823956\n ],\n [\n 106.025798,\n 32.85814\n ],\n [\n 105.825002,\n 32.824962\n ],\n [\n 105.822538,\n 32.770141\n ],\n [\n 105.719061,\n 32.759575\n ],\n [\n 105.596489,\n 32.699175\n ],\n [\n 105.563844,\n 32.72485\n ],\n [\n 105.49917,\n 32.911902\n ],\n [\n 105.590329,\n 32.876734\n ],\n [\n 105.735691,\n 32.905372\n ],\n [\n 105.917393,\n 32.993739\n ],\n [\n 105.930944,\n 33.177721\n ],\n [\n 105.965436,\n 33.204759\n ],\n [\n 105.862574,\n 33.234291\n ],\n [\n 105.74801,\n 33.298827\n ],\n [\n 105.723372,\n 33.390796\n ],\n [\n 105.82993,\n 33.382802\n ],\n [\n 105.842248,\n 33.490152\n ],\n [\n 105.956197,\n 33.612818\n ],\n [\n 106.129276,\n 33.604347\n ],\n [\n 106.187174,\n 33.54652\n ],\n [\n 106.303587,\n 33.604347\n ],\n [\n 106.447101,\n 33.613316\n ],\n [\n 106.456956,\n 33.533055\n ],\n [\n 106.54134,\n 33.513103\n ],\n [\n 106.58076,\n 33.575937\n ],\n [\n 106.539492,\n 33.691013\n ],\n [\n 106.480362,\n 33.715403\n ],\n [\n 106.461883,\n 33.789528\n ],\n [\n 106.493296,\n 33.846197\n ],\n [\n 106.41076,\n 33.906304\n ],\n [\n 106.474202,\n 33.970836\n ],\n [\n 106.501919,\n 34.104706\n ],\n [\n 106.585071,\n 34.149282\n ],\n [\n 106.526557,\n 34.291768\n ],\n [\n 106.663912,\n 34.24331\n ],\n [\n 106.717498,\n 34.369342\n ],\n [\n 106.624491,\n 34.410323\n ],\n [\n 106.610325,\n 34.454244\n ],\n [\n 106.455108,\n 34.531667\n ],\n [\n 106.334384,\n 34.517864\n ],\n [\n 106.314058,\n 34.578973\n ],\n [\n 106.419384,\n 34.643482\n ],\n [\n 106.505615,\n 34.74679\n ],\n [\n 106.575216,\n 34.769893\n ],\n [\n 106.493296,\n 34.941247\n ],\n [\n 106.494528,\n 35.005964\n ],\n [\n 106.494528,\n 35.005964\n ],\n [\n 106.5746,\n 35.089236\n ],\n [\n 106.710723,\n 35.100495\n ],\n [\n 106.838222,\n 35.079933\n ],\n [\n 106.901664,\n 35.094621\n ],\n [\n 107.08275,\n 35.024095\n ],\n [\n 107.089526,\n 34.976553\n ],\n [\n 107.189308,\n 34.893166\n ],\n [\n 107.252134,\n 34.880896\n ],\n [\n 107.286626,\n 34.931927\n ],\n [\n 107.523763,\n 34.909851\n ],\n [\n 107.561951,\n 34.966747\n ],\n [\n 107.634016,\n 34.950565\n ],\n [\n 107.804631,\n 34.95694\n ],\n [\n 107.863761,\n 34.996161\n ],\n [\n 107.757204,\n 35.076016\n ],\n [\n 107.686371,\n 35.217895\n ],\n [\n 107.651878,\n 35.239889\n ],\n [\n 107.745501,\n 35.311693\n ],\n [\n 107.867457,\n 35.256014\n ],\n [\n 108.049159,\n 35.254059\n ],\n [\n 108.174811,\n 35.305345\n ],\n [\n 108.2401,\n 35.256014\n ],\n [\n 108.352817,\n 35.285812\n ],\n [\n 108.48894,\n 35.275066\n ],\n [\n 108.614591,\n 35.32878\n ],\n [\n 108.631222,\n 35.418548\n ],\n [\n 108.618287,\n 35.556908\n ],\n [\n 108.539447,\n 35.605569\n ],\n [\n 108.517273,\n 35.715921\n ],\n [\n 108.524664,\n 35.839703\n ],\n [\n 108.498179,\n 35.876072\n ],\n [\n 108.588722,\n 35.950214\n ],\n [\n 108.656475,\n 35.952636\n ],\n [\n 108.712526,\n 36.13889\n ],\n [\n 108.646004,\n 36.25429\n ],\n [\n 108.651548,\n 36.384936\n ],\n [\n 108.618903,\n 36.434052\n ],\n [\n 108.510498,\n 36.474478\n ],\n [\n 108.495099,\n 36.422498\n ],\n [\n 108.407636,\n 36.458117\n ],\n [\n 108.340498,\n 36.55911\n ],\n [\n 108.262274,\n 36.549497\n ],\n [\n 108.194521,\n 36.625405\n ],\n [\n 108.163724,\n 36.563916\n ],\n [\n 108.007891,\n 36.61628\n ],\n [\n 108.004811,\n 36.683006\n ],\n [\n 107.939522,\n 36.655651\n ],\n [\n 107.907493,\n 36.751591\n ],\n [\n 107.720863,\n 36.802391\n ],\n [\n 107.540393,\n 36.828736\n ],\n [\n 107.478183,\n 36.908674\n ],\n [\n 107.310032,\n 36.912501\n ],\n [\n 107.288474,\n 37.00812\n ]\n ]\n ],\n [\n [\n [\n 106.076305,\n 32.753537\n ],\n [\n 106.07261,\n 32.764103\n ],\n [\n 106.076921,\n 32.764103\n ],\n [\n 106.076305,\n 32.758065\n ],\n [\n 106.076305,\n 32.753537\n ]\n ]\n ],\n [\n [\n [\n 111.022914,\n 33.474682\n ],\n [\n 111.022914,\n 33.475181\n ],\n [\n 111.02661,\n 33.478675\n ],\n [\n 111.02661,\n 33.474183\n ],\n [\n 111.022914,\n 33.474682\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 620000,\n \"name\": \"甘肃省\",\n \"center\": [\n 103.823557,\n 36.058039\n ],\n \"childrenNum\": 14,\n \"level\": \"province\",\n \"subFeatureIndex\": 27,\n \"acroutes\": [\n 100000\n ],\n \"parent\": {\n \"adcode\": 100000\n }\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 106.494528,\n 35.005964\n ],\n [\n 106.494528,\n 35.005964\n ],\n [\n 106.493296,\n 34.941247\n ],\n [\n 106.575216,\n 34.769893\n ],\n [\n 106.505615,\n 34.74679\n ],\n [\n 106.419384,\n 34.643482\n ],\n [\n 106.314058,\n 34.578973\n ],\n [\n 106.334384,\n 34.517864\n ],\n [\n 106.455108,\n 34.531667\n ],\n [\n 106.610325,\n 34.454244\n ],\n [\n 106.624491,\n 34.410323\n ],\n [\n 106.717498,\n 34.369342\n ],\n [\n 106.663912,\n 34.24331\n ],\n [\n 106.526557,\n 34.291768\n ],\n [\n 106.585071,\n 34.149282\n ],\n [\n 106.501919,\n 34.104706\n ],\n [\n 106.474202,\n 33.970836\n ],\n [\n 106.41076,\n 33.906304\n ],\n [\n 106.493296,\n 33.846197\n ],\n [\n 106.461883,\n 33.789528\n ],\n [\n 106.480362,\n 33.715403\n ],\n [\n 106.539492,\n 33.691013\n ],\n [\n 106.58076,\n 33.575937\n ],\n [\n 106.54134,\n 33.513103\n ],\n [\n 106.456956,\n 33.533055\n ],\n [\n 106.447101,\n 33.613316\n ],\n [\n 106.303587,\n 33.604347\n ],\n [\n 106.187174,\n 33.54652\n ],\n [\n 106.129276,\n 33.604347\n ],\n [\n 105.956197,\n 33.612818\n ],\n [\n 105.842248,\n 33.490152\n ],\n [\n 105.82993,\n 33.382802\n ],\n [\n 105.723372,\n 33.390796\n ],\n [\n 105.74801,\n 33.298827\n ],\n [\n 105.862574,\n 33.234291\n ],\n [\n 105.965436,\n 33.204759\n ],\n [\n 105.930944,\n 33.177721\n ],\n [\n 105.917393,\n 32.993739\n ],\n [\n 105.735691,\n 32.905372\n ],\n [\n 105.590329,\n 32.876734\n ],\n [\n 105.49917,\n 32.911902\n ],\n [\n 105.414171,\n 32.921948\n ],\n [\n 105.391381,\n 32.835017\n ],\n [\n 105.455439,\n 32.737433\n ],\n [\n 105.347033,\n 32.682558\n ],\n [\n 105.111128,\n 32.59388\n ],\n [\n 105.026745,\n 32.650322\n ],\n [\n 104.881999,\n 32.600938\n ],\n [\n 104.845659,\n 32.653848\n ],\n [\n 104.739717,\n 32.635711\n ],\n [\n 104.643015,\n 32.661908\n ],\n [\n 104.582653,\n 32.722333\n ],\n [\n 104.458849,\n 32.748504\n ],\n [\n 104.363994,\n 32.822448\n ],\n [\n 104.294393,\n 32.83552\n ],\n [\n 104.288234,\n 32.94304\n ],\n [\n 104.378161,\n 32.953081\n ],\n [\n 104.426204,\n 33.0108\n ],\n [\n 104.337509,\n 33.038392\n ],\n [\n 104.378161,\n 33.109086\n ],\n [\n 104.303632,\n 33.304328\n ],\n [\n 104.432979,\n 33.325828\n ],\n [\n 104.292545,\n 33.336326\n ],\n [\n 104.22048,\n 33.404782\n ],\n [\n 104.155191,\n 33.542531\n ],\n [\n 104.168741,\n 33.611821\n ],\n [\n 104.046169,\n 33.686533\n ],\n [\n 103.871243,\n 33.68255\n ],\n [\n 103.778236,\n 33.658648\n ],\n [\n 103.626099,\n 33.727347\n ],\n [\n 103.520157,\n 33.678566\n ],\n [\n 103.525085,\n 33.798975\n ],\n [\n 103.349542,\n 33.74327\n ],\n [\n 103.279325,\n 33.806433\n ],\n [\n 103.153057,\n 33.814884\n ],\n [\n 103.181391,\n 33.900842\n ],\n [\n 103.124108,\n 33.968354\n ],\n [\n 103.119797,\n 34.034822\n ],\n [\n 103.178927,\n 34.079931\n ],\n [\n 103.124108,\n 34.16166\n ],\n [\n 102.973203,\n 34.205217\n ],\n [\n 102.978747,\n 34.249246\n ],\n [\n 102.911609,\n 34.313022\n ],\n [\n 102.798276,\n 34.272982\n ],\n [\n 102.599328,\n 34.145321\n ],\n [\n 102.655994,\n 34.113623\n ],\n [\n 102.471213,\n 34.072993\n ],\n [\n 102.437336,\n 34.087364\n ],\n [\n 102.391756,\n 33.970836\n ],\n [\n 102.315996,\n 33.994154\n ],\n [\n 102.237772,\n 33.963392\n ],\n [\n 102.136142,\n 33.965377\n ],\n [\n 102.234076,\n 33.870046\n ],\n [\n 102.239619,\n 33.788036\n ],\n [\n 102.299981,\n 33.782566\n ],\n [\n 102.342481,\n 33.725357\n ],\n [\n 102.33817,\n 33.614313\n ],\n [\n 102.440416,\n 33.57494\n ],\n [\n 102.462589,\n 33.449724\n ],\n [\n 102.396684,\n 33.40678\n ],\n [\n 102.264873,\n 33.417269\n ],\n [\n 102.186649,\n 33.332327\n ],\n [\n 102.217446,\n 33.248303\n ],\n [\n 102.112736,\n 33.287324\n ],\n [\n 102.08933,\n 33.204759\n ],\n [\n 101.935345,\n 33.186734\n ],\n [\n 101.865744,\n 33.103072\n ],\n [\n 101.841723,\n 33.184731\n ],\n [\n 101.769658,\n 33.268816\n ],\n [\n 101.878063,\n 33.315829\n ],\n [\n 101.885454,\n 33.380804\n ],\n [\n 101.9452,\n 33.437742\n ],\n [\n 101.907012,\n 33.542032\n ],\n [\n 101.844186,\n 33.602353\n ],\n [\n 101.769042,\n 33.538541\n ],\n [\n 101.735781,\n 33.49614\n ],\n [\n 101.622448,\n 33.502127\n ],\n [\n 101.582412,\n 33.675081\n ],\n [\n 101.501724,\n 33.70296\n ],\n [\n 101.385312,\n 33.644702\n ],\n [\n 101.238718,\n 33.685039\n ],\n [\n 101.166653,\n 33.660142\n ],\n [\n 101.191907,\n 33.786047\n ],\n [\n 101.153718,\n 33.844706\n ],\n [\n 100.999118,\n 33.889419\n ],\n [\n 100.806329,\n 34.155224\n ],\n [\n 100.764445,\n 34.178987\n ],\n [\n 100.821727,\n 34.317469\n ],\n [\n 100.895024,\n 34.375268\n ],\n [\n 100.986799,\n 34.374774\n ],\n [\n 101.054552,\n 34.322905\n ],\n [\n 101.235022,\n 34.325376\n ],\n [\n 101.331109,\n 34.245289\n ],\n [\n 101.530057,\n 34.21066\n ],\n [\n 101.622448,\n 34.178492\n ],\n [\n 101.736397,\n 34.079931\n ],\n [\n 101.84665,\n 34.150272\n ],\n [\n 101.955055,\n 34.10966\n ],\n [\n 101.965526,\n 34.167601\n ],\n [\n 102.062229,\n 34.227976\n ],\n [\n 102.067772,\n 34.293746\n ],\n [\n 102.149692,\n 34.271993\n ],\n [\n 102.189728,\n 34.355018\n ],\n [\n 102.237156,\n 34.343163\n ],\n [\n 102.237772,\n 34.343163\n ],\n [\n 102.237156,\n 34.343163\n ],\n [\n 102.237772,\n 34.343163\n ],\n [\n 102.210054,\n 34.399462\n ],\n [\n 102.210054,\n 34.399462\n ],\n [\n 102.155852,\n 34.507511\n ],\n [\n 102.003715,\n 34.538074\n ],\n [\n 101.919947,\n 34.621821\n ],\n [\n 101.917483,\n 34.875497\n ],\n [\n 102.048062,\n 34.910832\n ],\n [\n 102.094874,\n 34.986848\n ],\n [\n 102.218677,\n 35.058386\n ],\n [\n 102.29567,\n 35.071609\n ],\n [\n 102.310452,\n 35.128883\n ],\n [\n 102.402227,\n 35.191006\n ],\n [\n 102.370814,\n 35.262854\n ],\n [\n 102.279655,\n 35.304857\n ],\n [\n 102.317228,\n 35.433663\n ],\n [\n 102.407155,\n 35.408308\n ],\n [\n 102.447807,\n 35.437563\n ],\n [\n 102.504473,\n 35.583189\n ],\n [\n 102.742226,\n 35.495065\n ],\n [\n 102.808747,\n 35.560315\n ],\n [\n 102.686175,\n 35.772253\n ],\n [\n 102.78411,\n 35.862496\n ],\n [\n 102.955957,\n 35.861041\n ],\n [\n 102.971971,\n 35.995247\n ],\n [\n 102.882044,\n 36.082335\n ],\n [\n 102.941174,\n 36.105058\n ],\n [\n 102.98737,\n 36.193956\n ],\n [\n 103.068058,\n 36.203612\n ],\n [\n 103.024326,\n 36.257185\n ],\n [\n 102.830305,\n 36.358439\n ],\n [\n 102.832153,\n 36.357957\n ],\n [\n 102.831537,\n 36.360848\n ],\n [\n 102.830305,\n 36.362294\n ],\n [\n 102.769943,\n 36.472072\n ],\n [\n 102.761936,\n 36.568721\n ],\n [\n 102.606719,\n 36.682526\n ],\n [\n 102.704654,\n 36.792329\n ],\n [\n 102.587009,\n 36.869912\n ],\n [\n 102.56114,\n 36.919676\n ],\n [\n 102.450271,\n 36.968453\n ],\n [\n 102.506321,\n 37.019108\n ],\n [\n 102.488459,\n 37.079278\n ],\n [\n 102.642444,\n 37.099801\n ],\n [\n 102.599944,\n 37.174687\n ],\n [\n 102.457662,\n 37.24807\n ],\n [\n 102.428097,\n 37.308534\n ],\n [\n 102.19712,\n 37.420287\n ],\n [\n 102.102881,\n 37.48441\n ],\n [\n 102.130598,\n 37.544684\n ],\n [\n 102.035743,\n 37.627184\n ],\n [\n 102.036359,\n 37.684974\n ],\n [\n 101.946432,\n 37.728051\n ],\n [\n 101.815853,\n 37.65419\n ],\n [\n 101.791832,\n 37.695864\n ],\n [\n 101.659405,\n 37.733256\n ],\n [\n 101.597195,\n 37.828308\n ],\n [\n 101.459224,\n 37.866105\n ],\n [\n 101.362522,\n 37.791437\n ],\n [\n 101.150639,\n 37.876969\n ],\n [\n 100.887633,\n 38.050562\n ],\n [\n 100.93814,\n 38.160261\n ],\n [\n 100.825423,\n 38.158849\n ],\n [\n 100.74843,\n 38.239724\n ],\n [\n 100.619083,\n 38.265567\n ],\n [\n 100.546402,\n 38.246773\n ],\n [\n 100.474953,\n 38.289052\n ],\n [\n 100.318505,\n 38.329428\n ],\n [\n 100.261222,\n 38.366498\n ],\n [\n 100.24028,\n 38.441519\n ],\n [\n 100.064122,\n 38.518802\n ],\n [\n 100.001296,\n 38.466821\n ],\n [\n 100.093071,\n 38.4073\n ],\n [\n 100.157744,\n 38.309712\n ],\n [\n 100.182998,\n 38.221864\n ],\n [\n 100.126332,\n 38.231735\n ],\n [\n 99.937238,\n 38.34163\n ],\n [\n 99.826985,\n 38.370251\n ],\n [\n 99.65945,\n 38.449017\n ],\n [\n 99.555972,\n 38.520207\n ],\n [\n 99.50916,\n 38.608628\n ],\n [\n 99.450646,\n 38.60442\n ],\n [\n 99.361951,\n 38.718418\n ],\n [\n 99.222133,\n 38.788875\n ],\n [\n 99.068764,\n 38.896991\n ],\n [\n 99.1088,\n 38.946334\n ],\n [\n 98.951735,\n 38.987737\n ],\n [\n 98.816845,\n 39.085799\n ],\n [\n 98.743548,\n 39.086728\n ],\n [\n 98.584635,\n 38.930046\n ],\n [\n 98.457752,\n 38.952849\n ],\n [\n 98.383839,\n 39.029581\n ],\n [\n 98.280977,\n 39.027257\n ],\n [\n 98.251412,\n 38.891403\n ],\n [\n 98.094964,\n 38.786077\n ],\n [\n 98.009348,\n 38.859262\n ],\n [\n 97.828878,\n 38.930046\n ],\n [\n 97.701379,\n 38.963085\n ],\n [\n 97.679205,\n 39.010522\n ],\n [\n 97.371235,\n 39.14058\n ],\n [\n 97.220946,\n 39.192999\n ],\n [\n 96.962867,\n 39.198564\n ],\n [\n 97.012142,\n 39.141972\n ],\n [\n 96.969643,\n 39.097873\n ],\n [\n 96.940693,\n 38.907701\n ],\n [\n 96.983809,\n 38.869046\n ],\n [\n 97.009063,\n 38.702544\n ],\n [\n 97.057722,\n 38.672654\n ],\n [\n 97.055874,\n 38.5946\n ],\n [\n 96.975802,\n 38.559519\n ],\n [\n 96.7941,\n 38.60816\n ],\n [\n 96.780549,\n 38.504289\n ],\n [\n 96.6666,\n 38.483684\n ],\n [\n 96.698013,\n 38.422302\n ],\n [\n 96.626564,\n 38.356177\n ],\n [\n 96.665369,\n 38.230325\n ],\n [\n 96.46334,\n 38.27778\n ],\n [\n 96.335841,\n 38.246303\n ],\n [\n 96.313051,\n 38.162142\n ],\n [\n 96.221892,\n 38.148969\n ],\n [\n 96.109175,\n 38.187072\n ],\n [\n 96.063596,\n 38.172962\n ],\n [\n 95.856024,\n 38.284355\n ],\n [\n 95.83693,\n 38.343977\n ],\n [\n 95.702039,\n 38.400736\n ],\n [\n 95.51849,\n 38.295156\n ],\n [\n 95.320157,\n 38.32051\n ],\n [\n 95.261027,\n 38.301261\n ],\n [\n 95.121825,\n 38.417615\n ],\n [\n 94.973999,\n 38.430271\n ],\n [\n 94.810775,\n 38.385261\n ],\n [\n 94.67958,\n 38.387137\n ],\n [\n 94.527443,\n 38.36556\n ],\n [\n 94.511429,\n 38.445268\n ],\n [\n 94.370379,\n 38.762753\n ],\n [\n 93.885018,\n 38.720752\n ],\n [\n 93.800019,\n 38.750622\n ],\n [\n 93.769838,\n 38.821047\n ],\n [\n 93.884403,\n 38.826175\n ],\n [\n 93.729186,\n 38.92446\n ],\n [\n 93.453245,\n 38.915615\n ],\n [\n 93.274007,\n 38.89606\n ],\n [\n 93.179152,\n 38.923994\n ],\n [\n 93.198246,\n 39.045847\n ],\n [\n 93.131725,\n 39.108088\n ],\n [\n 93.142196,\n 39.160531\n ],\n [\n 92.978356,\n 39.143364\n ],\n [\n 92.938936,\n 39.169809\n ],\n [\n 92.866871,\n 39.138723\n ],\n [\n 92.489916,\n 39.09973\n ],\n [\n 92.41046,\n 39.038412\n ],\n [\n 92.366728,\n 39.059322\n ],\n [\n 92.339011,\n 39.236575\n ],\n [\n 92.52564,\n 39.368528\n ],\n [\n 92.639589,\n 39.514543\n ],\n [\n 92.745531,\n 39.868137\n ],\n [\n 92.796654,\n 40.15364\n ],\n [\n 92.906907,\n 40.310773\n ],\n [\n 92.928465,\n 40.572609\n ],\n [\n 93.506216,\n 40.648464\n ],\n [\n 93.760599,\n 40.664804\n ],\n [\n 93.820961,\n 40.793574\n ],\n [\n 93.809874,\n 40.879583\n ],\n [\n 94.01067,\n 41.114857\n ],\n [\n 94.184365,\n 41.268392\n ],\n [\n 94.534219,\n 41.50586\n ],\n [\n 94.750413,\n 41.538114\n ],\n [\n 94.861898,\n 41.668309\n ],\n [\n 95.135991,\n 41.772811\n ],\n [\n 95.29552,\n 41.569456\n ],\n [\n 95.39407,\n 41.693333\n ],\n [\n 95.57146,\n 41.796011\n ],\n [\n 95.677402,\n 41.830795\n ],\n [\n 95.855408,\n 41.849516\n ],\n [\n 96.038342,\n 41.924794\n ],\n [\n 96.117183,\n 41.985753\n ],\n [\n 96.13874,\n 42.054207\n ],\n [\n 96.077147,\n 42.149652\n ],\n [\n 96.178161,\n 42.217929\n ],\n [\n 96.040806,\n 42.3264\n ],\n [\n 96.06606,\n 42.414367\n ],\n [\n 95.978596,\n 42.436892\n ],\n [\n 96.02356,\n 42.54234\n ],\n [\n 96.103632,\n 42.604026\n ],\n [\n 96.386348,\n 42.727655\n ],\n [\n 96.742361,\n 42.757096\n ],\n [\n 96.968411,\n 42.756218\n ],\n [\n 97.172903,\n 42.795305\n ],\n [\n 97.307177,\n 42.565259\n ],\n [\n 97.84674,\n 41.656687\n ],\n [\n 97.613915,\n 41.477176\n ],\n [\n 97.629314,\n 41.440407\n ],\n [\n 97.971776,\n 41.097726\n ],\n [\n 98.25018,\n 40.939271\n ],\n [\n 98.333332,\n 40.918929\n ],\n [\n 98.344419,\n 40.568518\n ],\n [\n 98.627751,\n 40.677965\n ],\n [\n 98.569853,\n 40.746901\n ],\n [\n 98.668403,\n 40.772734\n ],\n [\n 98.689345,\n 40.691576\n ],\n [\n 98.801446,\n 40.609411\n ],\n [\n 98.790975,\n 40.705185\n ],\n [\n 98.984996,\n 40.782701\n ],\n [\n 99.041662,\n 40.693844\n ],\n [\n 99.102025,\n 40.676603\n ],\n [\n 99.172858,\n 40.747354\n ],\n [\n 99.174705,\n 40.858317\n ],\n [\n 99.565827,\n 40.846551\n ],\n [\n 99.673,\n 40.932943\n ],\n [\n 100.057346,\n 40.908077\n ],\n [\n 100.107853,\n 40.875511\n ],\n [\n 100.237201,\n 40.716977\n ],\n [\n 100.242744,\n 40.618495\n ],\n [\n 100.169447,\n 40.541242\n ],\n [\n 100.169447,\n 40.277458\n ],\n [\n 100.002528,\n 40.197528\n ],\n [\n 99.927383,\n 40.063947\n ],\n [\n 99.488218,\n 39.875943\n ],\n [\n 99.672384,\n 39.887881\n ],\n [\n 99.822058,\n 39.85987\n ],\n [\n 99.904593,\n 39.785886\n ],\n [\n 100.040716,\n 39.756913\n ],\n [\n 100.128179,\n 39.702155\n ],\n [\n 100.250135,\n 39.68512\n ],\n [\n 100.314193,\n 39.606799\n ],\n [\n 100.326512,\n 39.509003\n ],\n [\n 100.500823,\n 39.4813\n ],\n [\n 100.498975,\n 39.400437\n ],\n [\n 100.619699,\n 39.38749\n ],\n [\n 100.842053,\n 39.405523\n ],\n [\n 100.842669,\n 39.199955\n ],\n [\n 100.864227,\n 39.106695\n ],\n [\n 100.835278,\n 39.025863\n ],\n [\n 100.961545,\n 39.005873\n ],\n [\n 100.969553,\n 38.9468\n ],\n [\n 101.117378,\n 38.97518\n ],\n [\n 101.228863,\n 39.02075\n ],\n [\n 101.198682,\n 38.943077\n ],\n [\n 101.24303,\n 38.86066\n ],\n [\n 101.334189,\n 38.848545\n ],\n [\n 101.307087,\n 38.802865\n ],\n [\n 101.562702,\n 38.712816\n ],\n [\n 101.601506,\n 38.6549\n ],\n [\n 101.679115,\n 38.690869\n ],\n [\n 101.777049,\n 38.660507\n ],\n [\n 101.941505,\n 38.808926\n ],\n [\n 102.075164,\n 38.891403\n ],\n [\n 101.926106,\n 39.000758\n ],\n [\n 101.830636,\n 39.093229\n ],\n [\n 102.280887,\n 39.190217\n ],\n [\n 102.45335,\n 39.25511\n ],\n [\n 102.601792,\n 39.172129\n ],\n [\n 103.007696,\n 39.09973\n ],\n [\n 103.344615,\n 39.331514\n ],\n [\n 103.595302,\n 39.386565\n ],\n [\n 103.839214,\n 39.460516\n ],\n [\n 103.964865,\n 39.455434\n ],\n [\n 104.091133,\n 39.418466\n ],\n [\n 104.047401,\n 39.297721\n ],\n [\n 104.177364,\n 39.15218\n ],\n [\n 104.207546,\n 39.083941\n ],\n [\n 104.168125,\n 38.940285\n ],\n [\n 104.044322,\n 38.895128\n ],\n [\n 103.85954,\n 38.64462\n ],\n [\n 103.416063,\n 38.404956\n ],\n [\n 103.507838,\n 38.281068\n ],\n [\n 103.53494,\n 38.156497\n ],\n [\n 103.369868,\n 38.089658\n ],\n [\n 103.362477,\n 38.037368\n ],\n [\n 103.401897,\n 37.861854\n ],\n [\n 103.676606,\n 37.783871\n ],\n [\n 103.948235,\n 37.564606\n ],\n [\n 104.183524,\n 37.406981\n ],\n [\n 104.287002,\n 37.42789\n ],\n [\n 104.437907,\n 37.445943\n ],\n [\n 104.679971,\n 37.407931\n ],\n [\n 104.713848,\n 37.32947\n ],\n [\n 104.632544,\n 37.299015\n ],\n [\n 104.600515,\n 37.242831\n ],\n [\n 104.638087,\n 37.201857\n ],\n [\n 104.775442,\n 37.246641\n ],\n [\n 104.85613,\n 37.211864\n ],\n [\n 104.95468,\n 37.040125\n ],\n [\n 105.165331,\n 36.995218\n ],\n [\n 105.190585,\n 36.886185\n ],\n [\n 105.244787,\n 36.894798\n ],\n [\n 105.334714,\n 36.800953\n ],\n [\n 105.319932,\n 36.742961\n ],\n [\n 105.218302,\n 36.730494\n ],\n [\n 105.22015,\n 36.631167\n ],\n [\n 105.281744,\n 36.522575\n ],\n [\n 105.319932,\n 36.536038\n ],\n [\n 105.398156,\n 36.430683\n ],\n [\n 105.401236,\n 36.370002\n ],\n [\n 105.473301,\n 36.298185\n ],\n [\n 105.460366,\n 36.223887\n ],\n [\n 105.513337,\n 36.150003\n ],\n [\n 105.343954,\n 36.033965\n ],\n [\n 105.333483,\n 35.887707\n ],\n [\n 105.392613,\n 35.865405\n ],\n [\n 105.481924,\n 35.727094\n ],\n [\n 105.570003,\n 35.716407\n ],\n [\n 105.671017,\n 35.749434\n ],\n [\n 105.754785,\n 35.730494\n ],\n [\n 105.690727,\n 35.698431\n ],\n [\n 105.847176,\n 35.490681\n ],\n [\n 105.868734,\n 35.53987\n ],\n [\n 106.015943,\n 35.52234\n ],\n [\n 106.070762,\n 35.491655\n ],\n [\n 106.057827,\n 35.488245\n ],\n [\n 105.897683,\n 35.451698\n ],\n [\n 105.894603,\n 35.413672\n ],\n [\n 106.054132,\n 35.449261\n ],\n [\n 106.061523,\n 35.457547\n ],\n [\n 106.064603,\n 35.431225\n ],\n [\n 106.073226,\n 35.421474\n ],\n [\n 106.079385,\n 35.427325\n ],\n [\n 106.107102,\n 35.364894\n ],\n [\n 106.174856,\n 35.438538\n ],\n [\n 106.319601,\n 35.265296\n ],\n [\n 106.472354,\n 35.310716\n ],\n [\n 106.503767,\n 35.415135\n ],\n [\n 106.440941,\n 35.526723\n ],\n [\n 106.476666,\n 35.580756\n ],\n [\n 106.434782,\n 35.688712\n ],\n [\n 106.501304,\n 35.737779\n ],\n [\n 106.501304,\n 35.735836\n ],\n [\n 106.503767,\n 35.736322\n ],\n [\n 106.504383,\n 35.738265\n ],\n [\n 106.737208,\n 35.689198\n ],\n [\n 106.86594,\n 35.737779\n ],\n [\n 106.92199,\n 35.803316\n ],\n [\n 106.849925,\n 35.887707\n ],\n [\n 106.950939,\n 36.004444\n ],\n [\n 106.957715,\n 36.091522\n ],\n [\n 106.858548,\n 36.206992\n ],\n [\n 106.858548,\n 36.206992\n ],\n [\n 106.599238,\n 36.274552\n ],\n [\n 106.599238,\n 36.274552\n ],\n [\n 106.505615,\n 36.265869\n ],\n [\n 106.488369,\n 36.400348\n ],\n [\n 106.521014,\n 36.479289\n ],\n [\n 106.401521,\n 36.546133\n ],\n [\n 106.471738,\n 36.581214\n ],\n [\n 106.519782,\n 36.708912\n ],\n [\n 106.519782,\n 36.708912\n ],\n [\n 106.589383,\n 36.750153\n ],\n [\n 106.631883,\n 36.723301\n ],\n [\n 106.658368,\n 36.811972\n ],\n [\n 106.595542,\n 36.940243\n ],\n [\n 106.666991,\n 37.01672\n ],\n [\n 106.605397,\n 37.127475\n ],\n [\n 106.750143,\n 37.098847\n ],\n [\n 106.777244,\n 37.156569\n ],\n [\n 106.777244,\n 37.156569\n ],\n [\n 106.891193,\n 37.098369\n ],\n [\n 107.030395,\n 37.140831\n ],\n [\n 107.095685,\n 37.115548\n ],\n [\n 107.180685,\n 37.143692\n ],\n [\n 107.268764,\n 37.099324\n ],\n [\n 107.288474,\n 37.00812\n ],\n [\n 107.288474,\n 37.00812\n ],\n [\n 107.310032,\n 36.912501\n ],\n [\n 107.478183,\n 36.908674\n ],\n [\n 107.540393,\n 36.828736\n ],\n [\n 107.720863,\n 36.802391\n ],\n [\n 107.907493,\n 36.751591\n ],\n [\n 107.939522,\n 36.655651\n ],\n [\n 108.004811,\n 36.683006\n ],\n [\n 108.007891,\n 36.61628\n ],\n [\n 108.163724,\n 36.563916\n ],\n [\n 108.194521,\n 36.625405\n ],\n [\n 108.262274,\n 36.549497\n ],\n [\n 108.340498,\n 36.55911\n ],\n [\n 108.407636,\n 36.458117\n ],\n [\n 108.495099,\n 36.422498\n ],\n [\n 108.510498,\n 36.474478\n ],\n [\n 108.618903,\n 36.434052\n ],\n [\n 108.651548,\n 36.384936\n ],\n [\n 108.646004,\n 36.25429\n ],\n [\n 108.712526,\n 36.13889\n ],\n [\n 108.656475,\n 35.952636\n ],\n [\n 108.588722,\n 35.950214\n ],\n [\n 108.498179,\n 35.876072\n ],\n [\n 108.524664,\n 35.839703\n ],\n [\n 108.517273,\n 35.715921\n ],\n [\n 108.539447,\n 35.605569\n ],\n [\n 108.618287,\n 35.556908\n ],\n [\n 108.631222,\n 35.418548\n ],\n [\n 108.614591,\n 35.32878\n ],\n [\n 108.48894,\n 35.275066\n ],\n [\n 108.352817,\n 35.285812\n ],\n [\n 108.2401,\n 35.256014\n ],\n [\n 108.174811,\n 35.305345\n ],\n [\n 108.049159,\n 35.254059\n ],\n [\n 107.867457,\n 35.256014\n ],\n [\n 107.745501,\n 35.311693\n ],\n [\n 107.651878,\n 35.239889\n ],\n [\n 107.686371,\n 35.217895\n ],\n [\n 107.757204,\n 35.076016\n ],\n [\n 107.863761,\n 34.996161\n ],\n [\n 107.804631,\n 34.95694\n ],\n [\n 107.634016,\n 34.950565\n ],\n [\n 107.561951,\n 34.966747\n ],\n [\n 107.523763,\n 34.909851\n ],\n [\n 107.286626,\n 34.931927\n ],\n [\n 107.252134,\n 34.880896\n ],\n [\n 107.189308,\n 34.893166\n ],\n [\n 107.089526,\n 34.976553\n ],\n [\n 107.08275,\n 35.024095\n ],\n [\n 106.901664,\n 35.094621\n ],\n [\n 106.838222,\n 35.079933\n ],\n [\n 106.710723,\n 35.100495\n ],\n [\n 106.5746,\n 35.089236\n ],\n [\n 106.494528,\n 35.005964\n ]\n ]\n ],\n [\n [\n [\n 106.070762,\n 35.491655\n ],\n [\n 106.078153,\n 35.489707\n ],\n [\n 106.078153,\n 35.489707\n ],\n [\n 106.071994,\n 35.463395\n ],\n [\n 106.061523,\n 35.457547\n ],\n [\n 106.054132,\n 35.449261\n ],\n [\n 106.057827,\n 35.488245\n ],\n [\n 106.070762,\n 35.491655\n ]\n ]\n ],\n [\n [\n [\n 106.073226,\n 35.421474\n ],\n [\n 106.064603,\n 35.431225\n ],\n [\n 106.061523,\n 35.457547\n ],\n [\n 106.071994,\n 35.463395\n ],\n [\n 106.06953,\n 35.458034\n ],\n [\n 106.071378,\n 35.449261\n ],\n [\n 106.079385,\n 35.427325\n ],\n [\n 106.073226,\n 35.421474\n ]\n ]\n ],\n [\n [\n [\n 102.831537,\n 36.360848\n ],\n [\n 102.832153,\n 36.357957\n ],\n [\n 102.830305,\n 36.358439\n ],\n [\n 102.830305,\n 36.362294\n ],\n [\n 102.831537,\n 36.360848\n ]\n ]\n ],\n [\n [\n [\n 106.503767,\n 35.736322\n ],\n [\n 106.501304,\n 35.735836\n ],\n [\n 106.501304,\n 35.737779\n ],\n [\n 106.504383,\n 35.738265\n ],\n [\n 106.503767,\n 35.736322\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 630000,\n \"name\": \"青海省\",\n \"center\": [\n 101.778916,\n 36.623178\n ],\n \"centroid\": [\n 96.043531,\n 35.726402\n ],\n \"childrenNum\": 8,\n \"level\": \"province\",\n \"subFeatureIndex\": 28,\n \"acroutes\": [\n 100000\n ],\n \"parent\": {\n \"adcode\": 100000\n }\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 91.001807,\n 33.116102\n ],\n [\n 91.001807,\n 33.116102\n ],\n [\n 90.805938,\n 33.114599\n ],\n [\n 90.70554,\n 33.135645\n ],\n [\n 90.486881,\n 33.266815\n ],\n [\n 90.405577,\n 33.260311\n ],\n [\n 90.332896,\n 33.310829\n ],\n [\n 90.246665,\n 33.42426\n ],\n [\n 90.092064,\n 33.469691\n ],\n [\n 90.080977,\n 33.530561\n ],\n [\n 90.01076,\n 33.553501\n ],\n [\n 89.984275,\n 33.61232\n ],\n [\n 90.008296,\n 33.688026\n ],\n [\n 89.907282,\n 33.74128\n ],\n [\n 89.933768,\n 33.796986\n ],\n [\n 89.837065,\n 33.869052\n ],\n [\n 89.795181,\n 33.865575\n ],\n [\n 89.691704,\n 33.957933\n ],\n [\n 89.635037,\n 34.0492\n ],\n [\n 89.655979,\n 34.096778\n ],\n [\n 89.818587,\n 34.174037\n ],\n [\n 89.825362,\n 34.293746\n ],\n [\n 89.872174,\n 34.335752\n ],\n [\n 89.801957,\n 34.390575\n ],\n [\n 89.823515,\n 34.455231\n ],\n [\n 89.798877,\n 34.628714\n ],\n [\n 89.72558,\n 34.660709\n ],\n [\n 89.732356,\n 34.732039\n ],\n [\n 89.799493,\n 34.74384\n ],\n [\n 89.867862,\n 34.810677\n ],\n [\n 89.821667,\n 34.902981\n ],\n [\n 89.707102,\n 34.919663\n ],\n [\n 89.654747,\n 34.883351\n ],\n [\n 89.560509,\n 34.938794\n ],\n [\n 89.593153,\n 35.104412\n ],\n [\n 89.513081,\n 35.139158\n ],\n [\n 89.449639,\n 35.226693\n ],\n [\n 89.532175,\n 35.285323\n ],\n [\n 89.497067,\n 35.361479\n ],\n [\n 89.68616,\n 35.414647\n ],\n [\n 89.744058,\n 35.479963\n ],\n [\n 89.700327,\n 35.537435\n ],\n [\n 89.765616,\n 35.599732\n ],\n [\n 89.747138,\n 35.751862\n ],\n [\n 89.801957,\n 35.847948\n ],\n [\n 89.549422,\n 35.858132\n ],\n [\n 89.429929,\n 35.916302\n ],\n [\n 89.418843,\n 36.04606\n ],\n [\n 89.476125,\n 36.021868\n ],\n [\n 89.638117,\n 36.04993\n ],\n [\n 89.711414,\n 36.092972\n ],\n [\n 89.941159,\n 36.067343\n ],\n [\n 89.937463,\n 36.130675\n ],\n [\n 89.999057,\n 36.169809\n ],\n [\n 90.028006,\n 36.25815\n ],\n [\n 90.145651,\n 36.238849\n ],\n [\n 90.128405,\n 36.208923\n ],\n [\n 90.234962,\n 36.161597\n ],\n [\n 90.430215,\n 36.133091\n ],\n [\n 90.526917,\n 36.148553\n ],\n [\n 90.66304,\n 36.134058\n ],\n [\n 90.776373,\n 36.086203\n ],\n [\n 90.841046,\n 36.01848\n ],\n [\n 90.922966,\n 36.029126\n ],\n [\n 90.979017,\n 36.106992\n ],\n [\n 91.09235,\n 36.088621\n ],\n [\n 91.124994,\n 36.115693\n ],\n [\n 91.07264,\n 36.299149\n ],\n [\n 91.026444,\n 36.323738\n ],\n [\n 91.05293,\n 36.432608\n ],\n [\n 91.035683,\n 36.529788\n ],\n [\n 90.7388,\n 36.58746\n ],\n [\n 90.720938,\n 36.708912\n ],\n [\n 90.735105,\n 36.827778\n ],\n [\n 90.853981,\n 36.915371\n ],\n [\n 90.983944,\n 36.913458\n ],\n [\n 91.181045,\n 37.025318\n ],\n [\n 91.303617,\n 37.01242\n ],\n [\n 91.280211,\n 37.163721\n ],\n [\n 91.1909,\n 37.205669\n ],\n [\n 91.192132,\n 37.27807\n ],\n [\n 91.134849,\n 37.32614\n ],\n [\n 91.099741,\n 37.447843\n ],\n [\n 91.057241,\n 37.483936\n ],\n [\n 90.958075,\n 37.477763\n ],\n [\n 90.863836,\n 37.534246\n ],\n [\n 90.882314,\n 37.575513\n ],\n [\n 90.776373,\n 37.6504\n ],\n [\n 90.519526,\n 37.73089\n ],\n [\n 90.516446,\n 38.207291\n ],\n [\n 90.530613,\n 38.32004\n ],\n [\n 90.361846,\n 38.300322\n ],\n [\n 90.352607,\n 38.233615\n ],\n [\n 90.280542,\n 38.238315\n ],\n [\n 90.137644,\n 38.340692\n ],\n [\n 90.111774,\n 38.477595\n ],\n [\n 90.315034,\n 38.501948\n ],\n [\n 90.424671,\n 38.492114\n ],\n [\n 90.463476,\n 38.556711\n ],\n [\n 90.610685,\n 38.596003\n ],\n [\n 90.619308,\n 38.664245\n ],\n [\n 90.831191,\n 38.667982\n ],\n [\n 91.307928,\n 38.751089\n ],\n [\n 91.446515,\n 38.813588\n ],\n [\n 91.87952,\n 38.884417\n ],\n [\n 91.966368,\n 38.930976\n ],\n [\n 92.173323,\n 38.960758\n ],\n [\n 92.263866,\n 39.002153\n ],\n [\n 92.38459,\n 39.000758\n ],\n [\n 92.41046,\n 39.038412\n ],\n [\n 92.489916,\n 39.09973\n ],\n [\n 92.866871,\n 39.138723\n ],\n [\n 92.938936,\n 39.169809\n ],\n [\n 92.978356,\n 39.143364\n ],\n [\n 93.142196,\n 39.160531\n ],\n [\n 93.131725,\n 39.108088\n ],\n [\n 93.198246,\n 39.045847\n ],\n [\n 93.179152,\n 38.923994\n ],\n [\n 93.274007,\n 38.89606\n ],\n [\n 93.453245,\n 38.915615\n ],\n [\n 93.729186,\n 38.92446\n ],\n [\n 93.884403,\n 38.826175\n ],\n [\n 93.769838,\n 38.821047\n ],\n [\n 93.800019,\n 38.750622\n ],\n [\n 93.885018,\n 38.720752\n ],\n [\n 94.370379,\n 38.762753\n ],\n [\n 94.511429,\n 38.445268\n ],\n [\n 94.527443,\n 38.36556\n ],\n [\n 94.67958,\n 38.387137\n ],\n [\n 94.810775,\n 38.385261\n ],\n [\n 94.973999,\n 38.430271\n ],\n [\n 95.121825,\n 38.417615\n ],\n [\n 95.261027,\n 38.301261\n ],\n [\n 95.320157,\n 38.32051\n ],\n [\n 95.51849,\n 38.295156\n ],\n [\n 95.702039,\n 38.400736\n ],\n [\n 95.83693,\n 38.343977\n ],\n [\n 95.856024,\n 38.284355\n ],\n [\n 96.063596,\n 38.172962\n ],\n [\n 96.109175,\n 38.187072\n ],\n [\n 96.221892,\n 38.148969\n ],\n [\n 96.313051,\n 38.162142\n ],\n [\n 96.335841,\n 38.246303\n ],\n [\n 96.46334,\n 38.27778\n ],\n [\n 96.665369,\n 38.230325\n ],\n [\n 96.626564,\n 38.356177\n ],\n [\n 96.698013,\n 38.422302\n ],\n [\n 96.6666,\n 38.483684\n ],\n [\n 96.780549,\n 38.504289\n ],\n [\n 96.7941,\n 38.60816\n ],\n [\n 96.975802,\n 38.559519\n ],\n [\n 97.055874,\n 38.5946\n ],\n [\n 97.057722,\n 38.672654\n ],\n [\n 97.009063,\n 38.702544\n ],\n [\n 96.983809,\n 38.869046\n ],\n [\n 96.940693,\n 38.907701\n ],\n [\n 96.969643,\n 39.097873\n ],\n [\n 97.012142,\n 39.141972\n ],\n [\n 96.962867,\n 39.198564\n ],\n [\n 97.220946,\n 39.192999\n ],\n [\n 97.371235,\n 39.14058\n ],\n [\n 97.679205,\n 39.010522\n ],\n [\n 97.701379,\n 38.963085\n ],\n [\n 97.828878,\n 38.930046\n ],\n [\n 98.009348,\n 38.859262\n ],\n [\n 98.094964,\n 38.786077\n ],\n [\n 98.251412,\n 38.891403\n ],\n [\n 98.280977,\n 39.027257\n ],\n [\n 98.383839,\n 39.029581\n ],\n [\n 98.457752,\n 38.952849\n ],\n [\n 98.584635,\n 38.930046\n ],\n [\n 98.743548,\n 39.086728\n ],\n [\n 98.816845,\n 39.085799\n ],\n [\n 98.951735,\n 38.987737\n ],\n [\n 99.1088,\n 38.946334\n ],\n [\n 99.068764,\n 38.896991\n ],\n [\n 99.222133,\n 38.788875\n ],\n [\n 99.361951,\n 38.718418\n ],\n [\n 99.450646,\n 38.60442\n ],\n [\n 99.50916,\n 38.608628\n ],\n [\n 99.555972,\n 38.520207\n ],\n [\n 99.65945,\n 38.449017\n ],\n [\n 99.826985,\n 38.370251\n ],\n [\n 99.937238,\n 38.34163\n ],\n [\n 100.126332,\n 38.231735\n ],\n [\n 100.182998,\n 38.221864\n ],\n [\n 100.157744,\n 38.309712\n ],\n [\n 100.093071,\n 38.4073\n ],\n [\n 100.001296,\n 38.466821\n ],\n [\n 100.064122,\n 38.518802\n ],\n [\n 100.24028,\n 38.441519\n ],\n [\n 100.261222,\n 38.366498\n ],\n [\n 100.318505,\n 38.329428\n ],\n [\n 100.474953,\n 38.289052\n ],\n [\n 100.546402,\n 38.246773\n ],\n [\n 100.619083,\n 38.265567\n ],\n [\n 100.74843,\n 38.239724\n ],\n [\n 100.825423,\n 38.158849\n ],\n [\n 100.93814,\n 38.160261\n ],\n [\n 100.887633,\n 38.050562\n ],\n [\n 101.150639,\n 37.876969\n ],\n [\n 101.362522,\n 37.791437\n ],\n [\n 101.459224,\n 37.866105\n ],\n [\n 101.597195,\n 37.828308\n ],\n [\n 101.659405,\n 37.733256\n ],\n [\n 101.791832,\n 37.695864\n ],\n [\n 101.815853,\n 37.65419\n ],\n [\n 101.946432,\n 37.728051\n ],\n [\n 102.036359,\n 37.684974\n ],\n [\n 102.035743,\n 37.627184\n ],\n [\n 102.130598,\n 37.544684\n ],\n [\n 102.102881,\n 37.48441\n ],\n [\n 102.19712,\n 37.420287\n ],\n [\n 102.428097,\n 37.308534\n ],\n [\n 102.457662,\n 37.24807\n ],\n [\n 102.599944,\n 37.174687\n ],\n [\n 102.642444,\n 37.099801\n ],\n [\n 102.488459,\n 37.079278\n ],\n [\n 102.506321,\n 37.019108\n ],\n [\n 102.450271,\n 36.968453\n ],\n [\n 102.56114,\n 36.919676\n ],\n [\n 102.587009,\n 36.869912\n ],\n [\n 102.704654,\n 36.792329\n ],\n [\n 102.606719,\n 36.682526\n ],\n [\n 102.761936,\n 36.568721\n ],\n [\n 102.769943,\n 36.472072\n ],\n [\n 102.830305,\n 36.362294\n ],\n [\n 102.830305,\n 36.358439\n ],\n [\n 103.024326,\n 36.257185\n ],\n [\n 103.068058,\n 36.203612\n ],\n [\n 102.98737,\n 36.193956\n ],\n [\n 102.941174,\n 36.105058\n ],\n [\n 102.882044,\n 36.082335\n ],\n [\n 102.971971,\n 35.995247\n ],\n [\n 102.955957,\n 35.861041\n ],\n [\n 102.78411,\n 35.862496\n ],\n [\n 102.686175,\n 35.772253\n ],\n [\n 102.808747,\n 35.560315\n ],\n [\n 102.742226,\n 35.495065\n ],\n [\n 102.504473,\n 35.583189\n ],\n [\n 102.447807,\n 35.437563\n ],\n [\n 102.407155,\n 35.408308\n ],\n [\n 102.317228,\n 35.433663\n ],\n [\n 102.279655,\n 35.304857\n ],\n [\n 102.370814,\n 35.262854\n ],\n [\n 102.402227,\n 35.191006\n ],\n [\n 102.310452,\n 35.128883\n ],\n [\n 102.29567,\n 35.071609\n ],\n [\n 102.218677,\n 35.058386\n ],\n [\n 102.094874,\n 34.986848\n ],\n [\n 102.048062,\n 34.910832\n ],\n [\n 101.917483,\n 34.875497\n ],\n [\n 101.919947,\n 34.621821\n ],\n [\n 102.003715,\n 34.538074\n ],\n [\n 102.155852,\n 34.507511\n ],\n [\n 102.210054,\n 34.399462\n ],\n [\n 102.210054,\n 34.399462\n ],\n [\n 102.237772,\n 34.343163\n ],\n [\n 102.237156,\n 34.343163\n ],\n [\n 102.237772,\n 34.343163\n ],\n [\n 102.237156,\n 34.343163\n ],\n [\n 102.189728,\n 34.355018\n ],\n [\n 102.149692,\n 34.271993\n ],\n [\n 102.067772,\n 34.293746\n ],\n [\n 102.062229,\n 34.227976\n ],\n [\n 101.965526,\n 34.167601\n ],\n [\n 101.955055,\n 34.10966\n ],\n [\n 101.84665,\n 34.150272\n ],\n [\n 101.736397,\n 34.079931\n ],\n [\n 101.622448,\n 34.178492\n ],\n [\n 101.530057,\n 34.21066\n ],\n [\n 101.331109,\n 34.245289\n ],\n [\n 101.235022,\n 34.325376\n ],\n [\n 101.054552,\n 34.322905\n ],\n [\n 100.986799,\n 34.374774\n ],\n [\n 100.895024,\n 34.375268\n ],\n [\n 100.821727,\n 34.317469\n ],\n [\n 100.764445,\n 34.178987\n ],\n [\n 100.806329,\n 34.155224\n ],\n [\n 100.999118,\n 33.889419\n ],\n [\n 101.153718,\n 33.844706\n ],\n [\n 101.191907,\n 33.786047\n ],\n [\n 101.166653,\n 33.660142\n ],\n [\n 101.238718,\n 33.685039\n ],\n [\n 101.385312,\n 33.644702\n ],\n [\n 101.501724,\n 33.70296\n ],\n [\n 101.582412,\n 33.675081\n ],\n [\n 101.622448,\n 33.502127\n ],\n [\n 101.735781,\n 33.49614\n ],\n [\n 101.769042,\n 33.538541\n ],\n [\n 101.769658,\n 33.447728\n ],\n [\n 101.695745,\n 33.433748\n ],\n [\n 101.64955,\n 33.323328\n ],\n [\n 101.739477,\n 33.265815\n ],\n [\n 101.625528,\n 33.100566\n ],\n [\n 101.486326,\n 33.227285\n ],\n [\n 101.405022,\n 33.225783\n ],\n [\n 101.393935,\n 33.157687\n ],\n [\n 101.297232,\n 33.262313\n ],\n [\n 101.183283,\n 33.270317\n ],\n [\n 101.11553,\n 33.194746\n ],\n [\n 101.169733,\n 33.100566\n ],\n [\n 101.183899,\n 32.984204\n ],\n [\n 101.129081,\n 32.989725\n ],\n [\n 101.124153,\n 32.909893\n ],\n [\n 101.237486,\n 32.824962\n ],\n [\n 101.22332,\n 32.725856\n ],\n [\n 101.157414,\n 32.661404\n ],\n [\n 101.075494,\n 32.683061\n ],\n [\n 100.93198,\n 32.600433\n ],\n [\n 100.690532,\n 32.678025\n ],\n [\n 100.645568,\n 32.526306\n ],\n [\n 100.54517,\n 32.569681\n ],\n [\n 100.516837,\n 32.630168\n ],\n [\n 100.399809,\n 32.756556\n ],\n [\n 100.339447,\n 32.719313\n ],\n [\n 100.258759,\n 32.742466\n ],\n [\n 100.208252,\n 32.606482\n ],\n [\n 100.088143,\n 32.668959\n ],\n [\n 100.139266,\n 32.724346\n ],\n [\n 100.123252,\n 32.837028\n ],\n [\n 100.038252,\n 32.928979\n ],\n [\n 99.956332,\n 32.948061\n ],\n [\n 99.877492,\n 33.045915\n ],\n [\n 99.854086,\n 32.945048\n ],\n [\n 99.788181,\n 32.956596\n ],\n [\n 99.763543,\n 32.778693\n ],\n [\n 99.607711,\n 32.780705\n ],\n [\n 99.558436,\n 32.839039\n ],\n [\n 99.385973,\n 32.900349\n ],\n [\n 99.268328,\n 32.878744\n ],\n [\n 99.235067,\n 32.982197\n ],\n [\n 99.179633,\n 33.044912\n ],\n [\n 99.002242,\n 33.08252\n ],\n [\n 98.858728,\n 33.150674\n ],\n [\n 98.759562,\n 33.277321\n ],\n [\n 98.779272,\n 33.37181\n ],\n [\n 98.734309,\n 33.409278\n ],\n [\n 98.742316,\n 33.477677\n ],\n [\n 98.648077,\n 33.549014\n ],\n [\n 98.61728,\n 33.63723\n ],\n [\n 98.6567,\n 33.647193\n ],\n [\n 98.539056,\n 33.746752\n ],\n [\n 98.462064,\n 33.849178\n ],\n [\n 98.406629,\n 33.867065\n ],\n [\n 98.440506,\n 33.981255\n ],\n [\n 98.401702,\n 34.08786\n ],\n [\n 98.21076,\n 34.078444\n ],\n [\n 98.051848,\n 34.115604\n ],\n [\n 97.937283,\n 34.196804\n ],\n [\n 97.937283,\n 34.196804\n ],\n [\n 97.834421,\n 34.208186\n ],\n [\n 97.665654,\n 34.126997\n ],\n [\n 97.70261,\n 34.036805\n ],\n [\n 97.660111,\n 33.956444\n ],\n [\n 97.458698,\n 33.886935\n ],\n [\n 97.388481,\n 33.884452\n ],\n [\n 97.435293,\n 33.680558\n ],\n [\n 97.415583,\n 33.605343\n ],\n [\n 97.52522,\n 33.575937\n ],\n [\n 97.552321,\n 33.465698\n ],\n [\n 97.625618,\n 33.461705\n ],\n [\n 97.753733,\n 33.410277\n ],\n [\n 97.676125,\n 33.340825\n ],\n [\n 97.621306,\n 33.334327\n ],\n [\n 97.576343,\n 33.221779\n ],\n [\n 97.487648,\n 33.168205\n ],\n [\n 97.487648,\n 33.10658\n ],\n [\n 97.542466,\n 33.036385\n ],\n [\n 97.523988,\n 32.988721\n ],\n [\n 97.373699,\n 32.956094\n ],\n [\n 97.386018,\n 32.779196\n ],\n [\n 97.42359,\n 32.704713\n ],\n [\n 97.543698,\n 32.621602\n ],\n [\n 97.730944,\n 32.527315\n ],\n [\n 97.670582,\n 32.517225\n ],\n [\n 97.472249,\n 32.54497\n ],\n [\n 97.448843,\n 32.586823\n ],\n [\n 97.334895,\n 32.514198\n ],\n [\n 97.388481,\n 32.501583\n ],\n [\n 97.341054,\n 32.441009\n ],\n [\n 97.387865,\n 32.427374\n ],\n [\n 97.424822,\n 32.323278\n ],\n [\n 97.371235,\n 32.273208\n ],\n [\n 97.299786,\n 32.294959\n ],\n [\n 97.264062,\n 32.183621\n ],\n [\n 97.308409,\n 32.074682\n ],\n [\n 97.130403,\n 32.04375\n ],\n [\n 97.008447,\n 32.067076\n ],\n [\n 96.894498,\n 32.013822\n ],\n [\n 96.722651,\n 32.013314\n ],\n [\n 96.81073,\n 31.894521\n ],\n [\n 96.760223,\n 31.856922\n ],\n [\n 96.840295,\n 31.720623\n ],\n [\n 96.775006,\n 31.673788\n ],\n [\n 96.616093,\n 31.736908\n ],\n [\n 96.576057,\n 31.712989\n ],\n [\n 96.468268,\n 31.769978\n ],\n [\n 96.389428,\n 31.919917\n ],\n [\n 96.253921,\n 31.929566\n ],\n [\n 96.176313,\n 31.777608\n ],\n [\n 96.252689,\n 31.69619\n ],\n [\n 96.204646,\n 31.598904\n ],\n [\n 96.160298,\n 31.600943\n ],\n [\n 96.135661,\n 31.702299\n ],\n [\n 96.041422,\n 31.734364\n ],\n [\n 95.982908,\n 31.816765\n ],\n [\n 95.89914,\n 31.817273\n ],\n [\n 95.825227,\n 31.681935\n ],\n [\n 95.779648,\n 31.74912\n ],\n [\n 95.618272,\n 31.783712\n ],\n [\n 95.546823,\n 31.739961\n ],\n [\n 95.439649,\n 31.831508\n ],\n [\n 95.360809,\n 31.959013\n ],\n [\n 95.454432,\n 32.062006\n ],\n [\n 95.406389,\n 32.182102\n ],\n [\n 95.312766,\n 32.148673\n ],\n [\n 95.26965,\n 32.194761\n ],\n [\n 95.241317,\n 32.32075\n ],\n [\n 95.10581,\n 32.259042\n ],\n [\n 95.096571,\n 32.322267\n ],\n [\n 95.261643,\n 32.348049\n ],\n [\n 95.218527,\n 32.397067\n ],\n [\n 95.081789,\n 32.384942\n ],\n [\n 94.985086,\n 32.421819\n ],\n [\n 94.912405,\n 32.415758\n ],\n [\n 94.889616,\n 32.472311\n ],\n [\n 94.80708,\n 32.486444\n ],\n [\n 94.772587,\n 32.555057\n ],\n [\n 94.614291,\n 32.673492\n ],\n [\n 94.53853,\n 32.599425\n ],\n [\n 94.395016,\n 32.594385\n ],\n [\n 94.371611,\n 32.524793\n ],\n [\n 94.196684,\n 32.516216\n ],\n [\n 94.136322,\n 32.433939\n ],\n [\n 93.958931,\n 32.484929\n ],\n [\n 93.861613,\n 32.466253\n ],\n [\n 93.820345,\n 32.549509\n ],\n [\n 93.654657,\n 32.57321\n ],\n [\n 93.618933,\n 32.522775\n ],\n [\n 93.516687,\n 32.475844\n ],\n [\n 93.4631,\n 32.556065\n ],\n [\n 93.385492,\n 32.525297\n ],\n [\n 93.239514,\n 32.662411\n ],\n [\n 93.069515,\n 32.626137\n ],\n [\n 93.019624,\n 32.737433\n ],\n [\n 92.877342,\n 32.697161\n ],\n [\n 92.686401,\n 32.765109\n ],\n [\n 92.63651,\n 32.720319\n ],\n [\n 92.355641,\n 32.764606\n ],\n [\n 92.255243,\n 32.720823\n ],\n [\n 92.198577,\n 32.755046\n ],\n [\n 92.227526,\n 32.820939\n ],\n [\n 92.145606,\n 32.885779\n ],\n [\n 91.955897,\n 32.820437\n ],\n [\n 91.896766,\n 32.907884\n ],\n [\n 91.785281,\n 32.944044\n ],\n [\n 91.58079,\n 33.039395\n ],\n [\n 91.49887,\n 33.109086\n ],\n [\n 91.436044,\n 33.065974\n ],\n [\n 91.262349,\n 33.141156\n ],\n [\n 91.134849,\n 33.073495\n ],\n [\n 91.001807,\n 33.116102\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 640000,\n \"name\": \"宁夏回族自治区\",\n \"center\": [\n 106.278179,\n 38.46637\n ],\n \"centroid\": [\n 106.169867,\n 37.291331\n ],\n \"childrenNum\": 5,\n \"level\": \"province\",\n \"subFeatureIndex\": 29,\n \"acroutes\": [\n 100000\n ],\n \"parent\": {\n \"adcode\": 100000\n }\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 106.06953,\n 35.458034\n ],\n [\n 106.071994,\n 35.463395\n ],\n [\n 106.078153,\n 35.489707\n ],\n [\n 106.078153,\n 35.489707\n ],\n [\n 106.070762,\n 35.491655\n ],\n [\n 106.015943,\n 35.52234\n ],\n [\n 105.868734,\n 35.53987\n ],\n [\n 105.847176,\n 35.490681\n ],\n [\n 105.690727,\n 35.698431\n ],\n [\n 105.754785,\n 35.730494\n ],\n [\n 105.671017,\n 35.749434\n ],\n [\n 105.570003,\n 35.716407\n ],\n [\n 105.481924,\n 35.727094\n ],\n [\n 105.392613,\n 35.865405\n ],\n [\n 105.333483,\n 35.887707\n ],\n [\n 105.343954,\n 36.033965\n ],\n [\n 105.513337,\n 36.150003\n ],\n [\n 105.460366,\n 36.223887\n ],\n [\n 105.473301,\n 36.298185\n ],\n [\n 105.401236,\n 36.370002\n ],\n [\n 105.398156,\n 36.430683\n ],\n [\n 105.319932,\n 36.536038\n ],\n [\n 105.281744,\n 36.522575\n ],\n [\n 105.22015,\n 36.631167\n ],\n [\n 105.218302,\n 36.730494\n ],\n [\n 105.319932,\n 36.742961\n ],\n [\n 105.334714,\n 36.800953\n ],\n [\n 105.244787,\n 36.894798\n ],\n [\n 105.190585,\n 36.886185\n ],\n [\n 105.165331,\n 36.995218\n ],\n [\n 104.95468,\n 37.040125\n ],\n [\n 104.85613,\n 37.211864\n ],\n [\n 104.775442,\n 37.246641\n ],\n [\n 104.638087,\n 37.201857\n ],\n [\n 104.600515,\n 37.242831\n ],\n [\n 104.632544,\n 37.299015\n ],\n [\n 104.713848,\n 37.32947\n ],\n [\n 104.679971,\n 37.407931\n ],\n [\n 104.437907,\n 37.445943\n ],\n [\n 104.287002,\n 37.42789\n ],\n [\n 104.407726,\n 37.464467\n ],\n [\n 104.419429,\n 37.511943\n ],\n [\n 104.801311,\n 37.538516\n ],\n [\n 104.866601,\n 37.566503\n ],\n [\n 105.024281,\n 37.579781\n ],\n [\n 105.111128,\n 37.633818\n ],\n [\n 105.315004,\n 37.702018\n ],\n [\n 105.598952,\n 37.699178\n ],\n [\n 105.622974,\n 37.778669\n ],\n [\n 105.760944,\n 37.799947\n ],\n [\n 105.80406,\n 37.861854\n ],\n [\n 105.799749,\n 37.940227\n ],\n [\n 105.840401,\n 38.003902\n ],\n [\n 105.780655,\n 38.084949\n ],\n [\n 105.775111,\n 38.186601\n ],\n [\n 105.86627,\n 38.296565\n ],\n [\n 105.821307,\n 38.366967\n ],\n [\n 105.874277,\n 38.593197\n ],\n [\n 105.852719,\n 38.641349\n ],\n [\n 105.90569,\n 38.731488\n ],\n [\n 105.897683,\n 38.788875\n ],\n [\n 106.003625,\n 38.874636\n ],\n [\n 105.97098,\n 38.909097\n ],\n [\n 106.060907,\n 38.968667\n ],\n [\n 106.096631,\n 39.08487\n ],\n [\n 106.145907,\n 39.153108\n ],\n [\n 106.283877,\n 39.14522\n ],\n [\n 106.284493,\n 39.270397\n ],\n [\n 106.402753,\n 39.291701\n ],\n [\n 106.506231,\n 39.269934\n ],\n [\n 106.602318,\n 39.375466\n ],\n [\n 106.683622,\n 39.357426\n ],\n [\n 106.751375,\n 39.381478\n ],\n [\n 106.806809,\n 39.318554\n ],\n [\n 106.795723,\n 39.214327\n ],\n [\n 106.859164,\n 39.107623\n ],\n [\n 106.96757,\n 39.054676\n ],\n [\n 106.954019,\n 38.941215\n ],\n [\n 106.709491,\n 38.718885\n ],\n [\n 106.66268,\n 38.601614\n ],\n [\n 106.647897,\n 38.470569\n ],\n [\n 106.601702,\n 38.392295\n ],\n [\n 106.482825,\n 38.319571\n ],\n [\n 106.546883,\n 38.269794\n ],\n [\n 106.768621,\n 38.174843\n ],\n [\n 107.014997,\n 38.120261\n ],\n [\n 107.19054,\n 38.154144\n ],\n [\n 107.329742,\n 38.087774\n ],\n [\n 107.438147,\n 37.992586\n ],\n [\n 107.419669,\n 37.940699\n ],\n [\n 107.49235,\n 37.944945\n ],\n [\n 107.65003,\n 37.864688\n ],\n [\n 107.620465,\n 37.775832\n ],\n [\n 107.499125,\n 37.7659\n ],\n [\n 107.484959,\n 37.706279\n ],\n [\n 107.348836,\n 37.608226\n ],\n [\n 107.342061,\n 37.515265\n ],\n [\n 107.284162,\n 37.482036\n ],\n [\n 107.257677,\n 37.337082\n ],\n [\n 107.336517,\n 37.165628\n ],\n [\n 107.268764,\n 37.099324\n ],\n [\n 107.180685,\n 37.143692\n ],\n [\n 107.095685,\n 37.115548\n ],\n [\n 107.030395,\n 37.140831\n ],\n [\n 106.891193,\n 37.098369\n ],\n [\n 106.777244,\n 37.156569\n ],\n [\n 106.777244,\n 37.156569\n ],\n [\n 106.750143,\n 37.098847\n ],\n [\n 106.605397,\n 37.127475\n ],\n [\n 106.666991,\n 37.01672\n ],\n [\n 106.595542,\n 36.940243\n ],\n [\n 106.658368,\n 36.811972\n ],\n [\n 106.631883,\n 36.723301\n ],\n [\n 106.589383,\n 36.750153\n ],\n [\n 106.519782,\n 36.708912\n ],\n [\n 106.519782,\n 36.708912\n ],\n [\n 106.471738,\n 36.581214\n ],\n [\n 106.401521,\n 36.546133\n ],\n [\n 106.521014,\n 36.479289\n ],\n [\n 106.488369,\n 36.400348\n ],\n [\n 106.505615,\n 36.265869\n ],\n [\n 106.599238,\n 36.274552\n ],\n [\n 106.599238,\n 36.274552\n ],\n [\n 106.858548,\n 36.206992\n ],\n [\n 106.858548,\n 36.206992\n ],\n [\n 106.957715,\n 36.091522\n ],\n [\n 106.950939,\n 36.004444\n ],\n [\n 106.849925,\n 35.887707\n ],\n [\n 106.92199,\n 35.803316\n ],\n [\n 106.86594,\n 35.737779\n ],\n [\n 106.737208,\n 35.689198\n ],\n [\n 106.504383,\n 35.738265\n ],\n [\n 106.501304,\n 35.737779\n ],\n [\n 106.434782,\n 35.688712\n ],\n [\n 106.476666,\n 35.580756\n ],\n [\n 106.440941,\n 35.526723\n ],\n [\n 106.503767,\n 35.415135\n ],\n [\n 106.472354,\n 35.310716\n ],\n [\n 106.319601,\n 35.265296\n ],\n [\n 106.174856,\n 35.438538\n ],\n [\n 106.107102,\n 35.364894\n ],\n [\n 106.079385,\n 35.427325\n ],\n [\n 106.071378,\n 35.449261\n ],\n [\n 106.073226,\n 35.450236\n ],\n [\n 106.073842,\n 35.45511\n ],\n [\n 106.06953,\n 35.458034\n ]\n ]\n ],\n [\n [\n [\n 106.057827,\n 35.488245\n ],\n [\n 106.054132,\n 35.449261\n ],\n [\n 105.894603,\n 35.413672\n ],\n [\n 105.897683,\n 35.451698\n ],\n [\n 106.057827,\n 35.488245\n ]\n ]\n ],\n [\n [\n [\n 106.071378,\n 35.449261\n ],\n [\n 106.06953,\n 35.458034\n ],\n [\n 106.073842,\n 35.45511\n ],\n [\n 106.073226,\n 35.450236\n ],\n [\n 106.071378,\n 35.449261\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 650000,\n \"name\": \"新疆维吾尔自治区\",\n \"center\": [\n 87.617733,\n 43.792818\n ],\n \"centroid\": [\n 85.294712,\n 41.371801\n ],\n \"childrenNum\": 23,\n \"level\": \"province\",\n \"subFeatureIndex\": 30,\n \"acroutes\": [\n 100000\n ],\n \"parent\": {\n \"adcode\": 100000\n }\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 79.039649,\n 34.33427\n ],\n [\n 78.958961,\n 34.386132\n ],\n [\n 78.878273,\n 34.391563\n ],\n [\n 78.742766,\n 34.454737\n ],\n [\n 78.708274,\n 34.522301\n ],\n [\n 78.634977,\n 34.538074\n ],\n [\n 78.58139,\n 34.505539\n ],\n [\n 78.542586,\n 34.574539\n ],\n [\n 78.436029,\n 34.543496\n ],\n [\n 78.427405,\n 34.594243\n ],\n [\n 78.280812,\n 34.623298\n ],\n [\n 78.267261,\n 34.705482\n ],\n [\n 78.213059,\n 34.717778\n ],\n [\n 78.237696,\n 34.882369\n ],\n [\n 78.182262,\n 34.936832\n ],\n [\n 78.201972,\n 34.974592\n ],\n [\n 78.123131,\n 35.036833\n ],\n [\n 78.124979,\n 35.108327\n ],\n [\n 78.062769,\n 35.11469\n ],\n [\n 78.01719,\n 35.22816\n ],\n [\n 78.013494,\n 35.36587\n ],\n [\n 78.136066,\n 35.49263\n ],\n [\n 78.009799,\n 35.491655\n ],\n [\n 77.914944,\n 35.464857\n ],\n [\n 77.816394,\n 35.518445\n ],\n [\n 77.690742,\n 35.448287\n ],\n [\n 77.518895,\n 35.481912\n ],\n [\n 77.396939,\n 35.467781\n ],\n [\n 77.307628,\n 35.540356\n ],\n [\n 77.195527,\n 35.519419\n ],\n [\n 77.072339,\n 35.590974\n ],\n [\n 76.967013,\n 35.591947\n ],\n [\n 76.83705,\n 35.66198\n ],\n [\n 76.76129,\n 35.65566\n ],\n [\n 76.69292,\n 35.747492\n ],\n [\n 76.593754,\n 35.772253\n ],\n [\n 76.566037,\n 35.819328\n ],\n [\n 76.59745,\n 35.895947\n ],\n [\n 76.54879,\n 35.919209\n ],\n [\n 76.365857,\n 35.82418\n ],\n [\n 76.298719,\n 35.841643\n ],\n [\n 76.147198,\n 35.833397\n ],\n [\n 76.16506,\n 35.909033\n ],\n [\n 76.104082,\n 36.018964\n ],\n [\n 75.961184,\n 36.051381\n ],\n [\n 75.942706,\n 36.137923\n ],\n [\n 76.016619,\n 36.165461\n ],\n [\n 76.011691,\n 36.229197\n ],\n [\n 76.060967,\n 36.225335\n ],\n [\n 75.989518,\n 36.340127\n ],\n [\n 76.035097,\n 36.409017\n ],\n [\n 75.945786,\n 36.588421\n ],\n [\n 75.871873,\n 36.66621\n ],\n [\n 75.724048,\n 36.750632\n ],\n [\n 75.537418,\n 36.773161\n ],\n [\n 75.536802,\n 36.730015\n ],\n [\n 75.458578,\n 36.720903\n ],\n [\n 75.425933,\n 36.778912\n ],\n [\n 75.413614,\n 36.954588\n ],\n [\n 75.244847,\n 36.963194\n ],\n [\n 75.130898,\n 37.010987\n ],\n [\n 75.032348,\n 37.01672\n ],\n [\n 74.893762,\n 36.939764\n ],\n [\n 74.84695,\n 37.056839\n ],\n [\n 74.739161,\n 37.028185\n ],\n [\n 74.70898,\n 37.084529\n ],\n [\n 74.56793,\n 37.032961\n ],\n [\n 74.498944,\n 37.072595\n ],\n [\n 74.465068,\n 37.147031\n ],\n [\n 74.511263,\n 37.239973\n ],\n [\n 74.665864,\n 37.235686\n ],\n [\n 74.727458,\n 37.282831\n ],\n [\n 74.816153,\n 37.216629\n ],\n [\n 74.911008,\n 37.23378\n ],\n [\n 74.927022,\n 37.277594\n ],\n [\n 75.125971,\n 37.322334\n ],\n [\n 75.153072,\n 37.414109\n ],\n [\n 75.069304,\n 37.513367\n ],\n [\n 75.035428,\n 37.501026\n ],\n [\n 74.940573,\n 37.558914\n ],\n [\n 74.891914,\n 37.668399\n ],\n [\n 75.006478,\n 37.771102\n ],\n [\n 74.917167,\n 37.844847\n ],\n [\n 74.911008,\n 37.967118\n ],\n [\n 74.821697,\n 38.102842\n ],\n [\n 74.789668,\n 38.324734\n ],\n [\n 74.868508,\n 38.404018\n ],\n [\n 74.862965,\n 38.484152\n ],\n [\n 74.792747,\n 38.536121\n ],\n [\n 74.717603,\n 38.542205\n ],\n [\n 74.639995,\n 38.599744\n ],\n [\n 74.506336,\n 38.63761\n ],\n [\n 74.229779,\n 38.656302\n ],\n [\n 74.147859,\n 38.676858\n ],\n [\n 74.068403,\n 38.585714\n ],\n [\n 74.090577,\n 38.542205\n ],\n [\n 73.926121,\n 38.536121\n ],\n [\n 73.89902,\n 38.579166\n ],\n [\n 73.799237,\n 38.610966\n ],\n [\n 73.757353,\n 38.719818\n ],\n [\n 73.769056,\n 38.775815\n ],\n [\n 73.699455,\n 38.857865\n ],\n [\n 73.767824,\n 38.941215\n ],\n [\n 73.826339,\n 38.917012\n ],\n [\n 73.820179,\n 39.041665\n ],\n [\n 73.743187,\n 39.029581\n ],\n [\n 73.719781,\n 39.108088\n ],\n [\n 73.639709,\n 39.220353\n ],\n [\n 73.542391,\n 39.269471\n ],\n [\n 73.554094,\n 39.350023\n ],\n [\n 73.502355,\n 39.383791\n ],\n [\n 73.592898,\n 39.412457\n ],\n [\n 73.61076,\n 39.466059\n ],\n [\n 73.745651,\n 39.461902\n ],\n [\n 73.868223,\n 39.482686\n ],\n [\n 73.953838,\n 39.600345\n ],\n [\n 73.905795,\n 39.742193\n ],\n [\n 73.841737,\n 39.756453\n ],\n [\n 73.845433,\n 39.831389\n ],\n [\n 73.907027,\n 39.873647\n ],\n [\n 73.910722,\n 39.934693\n ],\n [\n 73.980324,\n 40.004851\n ],\n [\n 73.943367,\n 40.015849\n ],\n [\n 74.023439,\n 40.085008\n ],\n [\n 74.26304,\n 40.125281\n ],\n [\n 74.356662,\n 40.089128\n ],\n [\n 74.442894,\n 40.137175\n ],\n [\n 74.577169,\n 40.260567\n ],\n [\n 74.673255,\n 40.278828\n ],\n [\n 74.697893,\n 40.344527\n ],\n [\n 74.908544,\n 40.339055\n ],\n [\n 74.795211,\n 40.443412\n ],\n [\n 74.819233,\n 40.505767\n ],\n [\n 74.891914,\n 40.507587\n ],\n [\n 74.973218,\n 40.460258\n ],\n [\n 75.102565,\n 40.439769\n ],\n [\n 75.13521,\n 40.463445\n ],\n [\n 75.242383,\n 40.448876\n ],\n [\n 75.355716,\n 40.538059\n ],\n [\n 75.432093,\n 40.563518\n ],\n [\n 75.550353,\n 40.648917\n ],\n [\n 75.636584,\n 40.624399\n ],\n [\n 75.646439,\n 40.516684\n ],\n [\n 75.733287,\n 40.474369\n ],\n [\n 75.669845,\n 40.363678\n ],\n [\n 75.709265,\n 40.28111\n ],\n [\n 75.831221,\n 40.327196\n ],\n [\n 75.921764,\n 40.291151\n ],\n [\n 75.986438,\n 40.381911\n ],\n [\n 76.176147,\n 40.381455\n ],\n [\n 76.279625,\n 40.439314\n ],\n [\n 76.333212,\n 40.343615\n ],\n [\n 76.442233,\n 40.391482\n ],\n [\n 76.539551,\n 40.4639\n ],\n [\n 76.556798,\n 40.542606\n ],\n [\n 76.657196,\n 40.620312\n ],\n [\n 76.676906,\n 40.696113\n ],\n [\n 76.646725,\n 40.760045\n ],\n [\n 76.731724,\n 40.818935\n ],\n [\n 76.761905,\n 40.954185\n ],\n [\n 76.85368,\n 40.976323\n ],\n [\n 76.885709,\n 41.027348\n ],\n [\n 77.002122,\n 41.073373\n ],\n [\n 77.091433,\n 41.062546\n ],\n [\n 77.169041,\n 41.009291\n ],\n [\n 77.296541,\n 41.004776\n ],\n [\n 77.363062,\n 41.040888\n ],\n [\n 77.476395,\n 40.999357\n ],\n [\n 77.591576,\n 40.992132\n ],\n [\n 77.829328,\n 41.059388\n ],\n [\n 77.814546,\n 41.134238\n ],\n [\n 77.905089,\n 41.185141\n ],\n [\n 77.972842,\n 41.172982\n ],\n [\n 78.129291,\n 41.228354\n ],\n [\n 78.162551,\n 41.382521\n ],\n [\n 78.324544,\n 41.384316\n ],\n [\n 78.458818,\n 41.41349\n ],\n [\n 78.580774,\n 41.481659\n ],\n [\n 78.650375,\n 41.467314\n ],\n [\n 78.739071,\n 41.555578\n ],\n [\n 78.825302,\n 41.560503\n ],\n [\n 78.959577,\n 41.652663\n ],\n [\n 79.021787,\n 41.657134\n ],\n [\n 79.138199,\n 41.722814\n ],\n [\n 79.21704,\n 41.725493\n ],\n [\n 79.326061,\n 41.809391\n ],\n [\n 79.361169,\n 41.796457\n ],\n [\n 79.462799,\n 41.848625\n ],\n [\n 79.550879,\n 41.833915\n ],\n [\n 79.640806,\n 41.884717\n ],\n [\n 79.776313,\n 41.892734\n ],\n [\n 79.852689,\n 42.015544\n ],\n [\n 79.918594,\n 42.041322\n ],\n [\n 80.14218,\n 42.034656\n ],\n [\n 80.193303,\n 42.081301\n ],\n [\n 80.139717,\n 42.151427\n ],\n [\n 80.168666,\n 42.200202\n ],\n [\n 80.28631,\n 42.232993\n ],\n [\n 80.283847,\n 42.320649\n ],\n [\n 80.229028,\n 42.358241\n ],\n [\n 80.206238,\n 42.428943\n ],\n [\n 80.265368,\n 42.502211\n ],\n [\n 80.164354,\n 42.627363\n ],\n [\n 80.228412,\n 42.692923\n ],\n [\n 80.261673,\n 42.825592\n ],\n [\n 80.417505,\n 42.838755\n ],\n [\n 80.500041,\n 42.879544\n ],\n [\n 80.602903,\n 42.89445\n ],\n [\n 80.487106,\n 42.94878\n ],\n [\n 80.378701,\n 43.031497\n ],\n [\n 80.593048,\n 43.133319\n ],\n [\n 80.79446,\n 43.137248\n ],\n [\n 80.777214,\n 43.30816\n ],\n [\n 80.69283,\n 43.32035\n ],\n [\n 80.761199,\n 43.446456\n ],\n [\n 80.75504,\n 43.49422\n ],\n [\n 80.522215,\n 43.816724\n ],\n [\n 80.511128,\n 43.906887\n ],\n [\n 80.453846,\n 43.989596\n ],\n [\n 80.449534,\n 44.077778\n ],\n [\n 80.3941,\n 44.127189\n ],\n [\n 80.413194,\n 44.264461\n ],\n [\n 80.350368,\n 44.484713\n ],\n [\n 80.411962,\n 44.605392\n ],\n [\n 80.313412,\n 44.704987\n ],\n [\n 80.200695,\n 44.75642\n ],\n [\n 80.169898,\n 44.844727\n ],\n [\n 79.999283,\n 44.793797\n ],\n [\n 79.969102,\n 44.877383\n ],\n [\n 79.887798,\n 44.909173\n ],\n [\n 80.144644,\n 45.058985\n ],\n [\n 80.24381,\n 45.031507\n ],\n [\n 80.328194,\n 45.069973\n ],\n [\n 80.404571,\n 45.049264\n ],\n [\n 80.493882,\n 45.126991\n ],\n [\n 80.599207,\n 45.10588\n ],\n [\n 80.731634,\n 45.156111\n ],\n [\n 80.897938,\n 45.127413\n ],\n [\n 80.93551,\n 45.16033\n ],\n [\n 81.024821,\n 45.162862\n ],\n [\n 81.111669,\n 45.218522\n ],\n [\n 81.170183,\n 45.210935\n ],\n [\n 81.44982,\n 45.265707\n ],\n [\n 81.575471,\n 45.307803\n ],\n [\n 81.634601,\n 45.357856\n ],\n [\n 81.78797,\n 45.383497\n ],\n [\n 81.921013,\n 45.233272\n ],\n [\n 82.052824,\n 45.25602\n ],\n [\n 82.109491,\n 45.211357\n ],\n [\n 82.294272,\n 45.247596\n ],\n [\n 82.487061,\n 45.181\n ],\n [\n 82.58746,\n 45.224001\n ],\n [\n 82.60101,\n 45.346083\n ],\n [\n 82.546808,\n 45.425925\n ],\n [\n 82.281954,\n 45.538772\n ],\n [\n 82.266555,\n 45.620015\n ],\n [\n 82.289961,\n 45.7166\n ],\n [\n 82.340468,\n 45.772552\n ],\n [\n 82.342932,\n 45.935076\n ],\n [\n 82.461808,\n 45.979999\n ],\n [\n 82.518474,\n 46.153938\n ],\n [\n 82.726662,\n 46.494818\n ],\n [\n 82.829524,\n 46.772551\n ],\n [\n 82.876335,\n 46.82375\n ],\n [\n 82.937929,\n 47.014193\n ],\n [\n 82.993364,\n 47.06557\n ],\n [\n 83.02724,\n 47.215341\n ],\n [\n 83.15474,\n 47.236063\n ],\n [\n 83.257602,\n 47.173057\n ],\n [\n 83.370318,\n 47.178751\n ],\n [\n 83.418978,\n 47.118934\n ],\n [\n 83.463325,\n 47.131961\n ],\n [\n 83.576042,\n 47.059049\n ],\n [\n 83.766367,\n 47.026838\n ],\n [\n 83.932671,\n 46.970117\n ],\n [\n 84.002888,\n 46.990527\n ],\n [\n 84.086656,\n 46.965217\n ],\n [\n 84.195061,\n 47.003586\n ],\n [\n 84.37122,\n 46.993384\n ],\n [\n 84.425422,\n 47.00889\n ],\n [\n 84.506726,\n 46.972975\n ],\n [\n 84.748175,\n 47.009706\n ],\n [\n 84.849189,\n 46.95705\n ],\n [\n 84.934188,\n 46.863857\n ],\n [\n 84.987159,\n 46.918239\n ],\n [\n 85.082014,\n 46.939895\n ],\n [\n 85.276651,\n 47.068831\n ],\n [\n 85.325926,\n 47.044781\n ],\n [\n 85.545816,\n 47.057826\n ],\n [\n 85.582772,\n 47.14295\n ],\n [\n 85.682555,\n 47.222655\n ],\n [\n 85.675163,\n 47.318063\n ],\n [\n 85.701649,\n 47.384138\n ],\n [\n 85.614801,\n 47.497853\n ],\n [\n 85.617881,\n 47.550781\n ],\n [\n 85.547048,\n 48.00833\n ],\n [\n 85.529186,\n 48.02714\n ],\n [\n 85.587084,\n 48.191738\n ],\n [\n 85.678243,\n 48.266272\n ],\n [\n 85.695489,\n 48.335129\n ],\n [\n 85.791576,\n 48.418986\n ],\n [\n 85.916612,\n 48.438043\n ],\n [\n 86.225813,\n 48.432485\n ],\n [\n 86.305269,\n 48.491999\n ],\n [\n 86.416138,\n 48.481688\n ],\n [\n 86.579978,\n 48.538768\n ],\n [\n 86.640956,\n 48.629012\n ],\n [\n 86.780774,\n 48.73133\n ],\n [\n 86.754289,\n 48.78458\n ],\n [\n 86.822042,\n 48.849193\n ],\n [\n 86.757985,\n 48.894844\n ],\n [\n 86.732731,\n 48.995444\n ],\n [\n 86.836209,\n 49.051159\n ],\n [\n 86.88918,\n 49.132656\n ],\n [\n 87.088128,\n 49.13383\n ],\n [\n 87.112766,\n 49.155748\n ],\n [\n 87.239033,\n 49.114644\n ],\n [\n 87.388707,\n 49.098193\n ],\n [\n 87.43675,\n 49.075073\n ],\n [\n 87.511894,\n 49.101718\n ],\n [\n 87.49896,\n 49.141268\n ],\n [\n 87.821096,\n 49.173745\n ],\n [\n 87.867291,\n 49.108769\n ],\n [\n 87.833415,\n 49.050374\n ],\n [\n 87.911639,\n 48.980132\n ],\n [\n 87.87653,\n 48.949099\n ],\n [\n 87.763198,\n 48.926697\n ],\n [\n 87.742256,\n 48.881074\n ],\n [\n 87.93874,\n 48.757765\n ],\n [\n 88.029283,\n 48.75027\n ],\n [\n 88.089645,\n 48.695009\n ],\n [\n 88.027436,\n 48.62743\n ],\n [\n 87.96153,\n 48.599344\n ],\n [\n 88.041602,\n 48.548275\n ],\n [\n 88.10874,\n 48.545898\n ],\n [\n 88.196819,\n 48.493982\n ],\n [\n 88.363123,\n 48.460267\n ],\n [\n 88.443811,\n 48.391579\n ],\n [\n 88.503557,\n 48.413029\n ],\n [\n 88.605803,\n 48.337914\n ],\n [\n 88.575006,\n 48.277423\n ],\n [\n 88.663085,\n 48.172189\n ],\n [\n 88.79736,\n 48.133869\n ],\n [\n 88.824461,\n 48.106708\n ],\n [\n 88.939026,\n 48.115497\n ],\n [\n 89.078228,\n 47.98711\n ],\n [\n 89.231597,\n 47.980301\n ],\n [\n 89.38127,\n 48.046344\n ],\n [\n 89.569132,\n 48.037943\n ],\n [\n 89.651052,\n 47.913774\n ],\n [\n 89.735435,\n 47.897329\n ],\n [\n 89.761921,\n 47.835916\n ],\n [\n 89.957789,\n 47.842743\n ],\n [\n 89.960253,\n 47.885694\n ],\n [\n 90.086521,\n 47.865628\n ],\n [\n 90.07605,\n 47.777646\n ],\n [\n 90.13518,\n 47.723337\n ],\n [\n 90.331665,\n 47.68146\n ],\n [\n 90.398186,\n 47.547551\n ],\n [\n 90.468403,\n 47.497853\n ],\n [\n 90.468403,\n 47.404795\n ],\n [\n 90.526301,\n 47.378871\n ],\n [\n 90.488113,\n 47.317252\n ],\n [\n 90.56141,\n 47.207212\n ],\n [\n 90.767134,\n 46.992568\n ],\n [\n 90.901408,\n 46.960725\n ],\n [\n 90.958075,\n 46.8794\n ],\n [\n 90.942676,\n 46.825797\n ],\n [\n 91.054161,\n 46.71761\n ],\n [\n 91.017821,\n 46.582483\n ],\n [\n 91.079415,\n 46.558626\n ],\n [\n 90.983328,\n 46.374823\n ],\n [\n 90.900177,\n 46.31204\n ],\n [\n 91.021517,\n 46.121185\n ],\n [\n 91.028292,\n 46.023224\n ],\n [\n 90.850285,\n 45.888035\n ],\n [\n 90.714779,\n 45.728714\n ],\n [\n 90.676591,\n 45.582339\n ],\n [\n 90.671047,\n 45.48762\n ],\n [\n 90.772677,\n 45.432223\n ],\n [\n 90.804706,\n 45.294756\n ],\n [\n 90.877387,\n 45.280865\n ],\n [\n 90.881698,\n 45.191964\n ],\n [\n 91.007966,\n 45.218522\n ],\n [\n 91.129922,\n 45.215993\n ],\n [\n 91.242023,\n 45.137544\n ],\n [\n 91.37753,\n 45.110947\n ],\n [\n 91.448978,\n 45.156533\n ],\n [\n 91.561695,\n 45.075466\n ],\n [\n 91.694738,\n 45.065325\n ],\n [\n 91.803144,\n 45.082649\n ],\n [\n 92.100026,\n 45.081381\n ],\n [\n 92.240461,\n 45.015859\n ],\n [\n 92.315605,\n 45.02897\n ],\n [\n 92.501003,\n 45.001054\n ],\n [\n 92.779407,\n 45.050532\n ],\n [\n 92.884117,\n 45.046727\n ],\n [\n 92.932776,\n 45.017551\n ],\n [\n 93.174225,\n 45.015436\n ],\n [\n 93.434767,\n 44.955343\n ],\n [\n 93.509296,\n 44.968044\n ],\n [\n 93.716251,\n 44.89434\n ],\n [\n 93.723642,\n 44.86551\n ],\n [\n 94.215162,\n 44.667978\n ],\n [\n 94.329727,\n 44.582811\n ],\n [\n 94.359292,\n 44.51544\n ],\n [\n 94.470777,\n 44.509466\n ],\n [\n 94.606283,\n 44.448418\n ],\n [\n 94.722696,\n 44.340681\n ],\n [\n 94.945666,\n 44.292734\n ],\n [\n 94.998637,\n 44.25332\n ],\n [\n 95.398381,\n 44.294447\n ],\n [\n 95.326932,\n 44.028756\n ],\n [\n 95.527113,\n 44.007243\n ],\n [\n 95.623199,\n 43.855567\n ],\n [\n 95.735916,\n 43.597437\n ],\n [\n 95.857872,\n 43.417779\n ],\n [\n 95.880046,\n 43.280289\n ],\n [\n 95.921314,\n 43.22974\n ],\n [\n 96.363558,\n 42.900586\n ],\n [\n 96.386348,\n 42.727655\n ],\n [\n 96.103632,\n 42.604026\n ],\n [\n 96.02356,\n 42.54234\n ],\n [\n 95.978596,\n 42.436892\n ],\n [\n 96.06606,\n 42.414367\n ],\n [\n 96.040806,\n 42.3264\n ],\n [\n 96.178161,\n 42.217929\n ],\n [\n 96.077147,\n 42.149652\n ],\n [\n 96.13874,\n 42.054207\n ],\n [\n 96.117183,\n 41.985753\n ],\n [\n 96.038342,\n 41.924794\n ],\n [\n 95.855408,\n 41.849516\n ],\n [\n 95.677402,\n 41.830795\n ],\n [\n 95.57146,\n 41.796011\n ],\n [\n 95.39407,\n 41.693333\n ],\n [\n 95.29552,\n 41.569456\n ],\n [\n 95.135991,\n 41.772811\n ],\n [\n 94.861898,\n 41.668309\n ],\n [\n 94.750413,\n 41.538114\n ],\n [\n 94.534219,\n 41.50586\n ],\n [\n 94.184365,\n 41.268392\n ],\n [\n 94.01067,\n 41.114857\n ],\n [\n 93.809874,\n 40.879583\n ],\n [\n 93.820961,\n 40.793574\n ],\n [\n 93.760599,\n 40.664804\n ],\n [\n 93.506216,\n 40.648464\n ],\n [\n 92.928465,\n 40.572609\n ],\n [\n 92.906907,\n 40.310773\n ],\n [\n 92.796654,\n 40.15364\n ],\n [\n 92.745531,\n 39.868137\n ],\n [\n 92.639589,\n 39.514543\n ],\n [\n 92.52564,\n 39.368528\n ],\n [\n 92.339011,\n 39.236575\n ],\n [\n 92.366728,\n 39.059322\n ],\n [\n 92.41046,\n 39.038412\n ],\n [\n 92.38459,\n 39.000758\n ],\n [\n 92.263866,\n 39.002153\n ],\n [\n 92.173323,\n 38.960758\n ],\n [\n 91.966368,\n 38.930976\n ],\n [\n 91.87952,\n 38.884417\n ],\n [\n 91.446515,\n 38.813588\n ],\n [\n 91.307928,\n 38.751089\n ],\n [\n 90.831191,\n 38.667982\n ],\n [\n 90.619308,\n 38.664245\n ],\n [\n 90.610685,\n 38.596003\n ],\n [\n 90.463476,\n 38.556711\n ],\n [\n 90.424671,\n 38.492114\n ],\n [\n 90.315034,\n 38.501948\n ],\n [\n 90.111774,\n 38.477595\n ],\n [\n 90.137644,\n 38.340692\n ],\n [\n 90.280542,\n 38.238315\n ],\n [\n 90.352607,\n 38.233615\n ],\n [\n 90.361846,\n 38.300322\n ],\n [\n 90.530613,\n 38.32004\n ],\n [\n 90.516446,\n 38.207291\n ],\n [\n 90.519526,\n 37.73089\n ],\n [\n 90.776373,\n 37.6504\n ],\n [\n 90.882314,\n 37.575513\n ],\n [\n 90.863836,\n 37.534246\n ],\n [\n 90.958075,\n 37.477763\n ],\n [\n 91.057241,\n 37.483936\n ],\n [\n 91.099741,\n 37.447843\n ],\n [\n 91.134849,\n 37.32614\n ],\n [\n 91.192132,\n 37.27807\n ],\n [\n 91.1909,\n 37.205669\n ],\n [\n 91.280211,\n 37.163721\n ],\n [\n 91.303617,\n 37.01242\n ],\n [\n 91.181045,\n 37.025318\n ],\n [\n 90.983944,\n 36.913458\n ],\n [\n 90.853981,\n 36.915371\n ],\n [\n 90.735105,\n 36.827778\n ],\n [\n 90.720938,\n 36.708912\n ],\n [\n 90.7388,\n 36.58746\n ],\n [\n 91.035683,\n 36.529788\n ],\n [\n 91.05293,\n 36.432608\n ],\n [\n 91.026444,\n 36.323738\n ],\n [\n 91.07264,\n 36.299149\n ],\n [\n 91.124994,\n 36.115693\n ],\n [\n 91.09235,\n 36.088621\n ],\n [\n 90.979017,\n 36.106992\n ],\n [\n 90.922966,\n 36.029126\n ],\n [\n 90.841046,\n 36.01848\n ],\n [\n 90.776373,\n 36.086203\n ],\n [\n 90.66304,\n 36.134058\n ],\n [\n 90.526917,\n 36.148553\n ],\n [\n 90.430215,\n 36.133091\n ],\n [\n 90.234962,\n 36.161597\n ],\n [\n 90.128405,\n 36.208923\n ],\n [\n 90.145651,\n 36.238849\n ],\n [\n 90.028006,\n 36.25815\n ],\n [\n 89.999057,\n 36.169809\n ],\n [\n 89.937463,\n 36.130675\n ],\n [\n 89.941159,\n 36.067343\n ],\n [\n 89.711414,\n 36.092972\n ],\n [\n 89.490291,\n 36.150969\n ],\n [\n 89.375727,\n 36.228231\n ],\n [\n 89.287647,\n 36.235954\n ],\n [\n 89.232213,\n 36.295774\n ],\n [\n 89.127503,\n 36.249465\n ],\n [\n 89.10225,\n 36.281305\n ],\n [\n 88.964279,\n 36.318917\n ],\n [\n 88.926091,\n 36.364221\n ],\n [\n 88.802903,\n 36.337717\n ],\n [\n 88.783809,\n 36.291916\n ],\n [\n 88.623665,\n 36.389271\n ],\n [\n 88.573158,\n 36.461005\n ],\n [\n 88.470912,\n 36.482175\n ],\n [\n 88.365586,\n 36.457636\n ],\n [\n 88.241782,\n 36.468704\n ],\n [\n 88.134609,\n 36.427313\n ],\n [\n 87.983088,\n 36.437903\n ],\n [\n 87.949211,\n 36.401312\n ],\n [\n 87.731785,\n 36.384936\n ],\n [\n 87.570409,\n 36.342536\n ],\n [\n 87.470626,\n 36.354102\n ],\n [\n 87.460155,\n 36.409498\n ],\n [\n 87.361605,\n 36.419128\n ],\n [\n 87.306787,\n 36.363739\n ],\n [\n 87.193454,\n 36.349283\n ],\n [\n 87.149106,\n 36.29722\n ],\n [\n 86.996353,\n 36.308793\n ],\n [\n 86.887332,\n 36.262492\n ],\n [\n 86.862078,\n 36.300114\n ],\n [\n 86.746282,\n 36.291916\n ],\n [\n 86.701318,\n 36.245122\n ],\n [\n 86.515305,\n 36.205543\n ],\n [\n 86.392733,\n 36.206992\n ],\n [\n 86.187625,\n 36.131158\n ],\n [\n 86.199944,\n 36.032513\n ],\n [\n 86.132806,\n 35.979271\n ],\n [\n 86.060125,\n 35.846008\n ],\n [\n 85.949256,\n 35.779049\n ],\n [\n 85.811286,\n 35.779049\n ],\n [\n 85.65299,\n 35.731465\n ],\n [\n 85.613569,\n 35.652257\n ],\n [\n 85.372121,\n 35.701346\n ],\n [\n 85.271107,\n 35.788757\n ],\n [\n 85.159006,\n 35.745549\n ],\n [\n 85.053065,\n 35.751862\n ],\n [\n 84.729081,\n 35.613353\n ],\n [\n 84.448828,\n 35.55058\n ],\n [\n 84.45314,\n 35.473141\n ],\n [\n 84.335495,\n 35.414647\n ],\n [\n 84.1618,\n 35.359039\n ],\n [\n 84.095895,\n 35.362943\n ],\n [\n 84.005968,\n 35.422449\n ],\n [\n 83.885244,\n 35.367334\n ],\n [\n 83.677672,\n 35.360991\n ],\n [\n 83.622238,\n 35.335614\n ],\n [\n 83.451006,\n 35.38197\n ],\n [\n 83.242203,\n 35.420011\n ],\n [\n 83.127022,\n 35.398554\n ],\n [\n 83.067892,\n 35.462908\n ],\n [\n 82.998907,\n 35.484348\n ],\n [\n 82.960719,\n 35.671702\n ],\n [\n 82.788872,\n 35.684824\n ],\n [\n 82.731589,\n 35.63767\n ],\n [\n 82.628727,\n 35.692114\n ],\n [\n 82.424852,\n 35.713006\n ],\n [\n 82.336156,\n 35.651284\n ],\n [\n 82.328149,\n 35.559342\n ],\n [\n 82.033114,\n 35.450236\n ],\n [\n 82.05344,\n 35.350255\n ],\n [\n 81.927789,\n 35.271158\n ],\n [\n 81.736847,\n 35.262365\n ],\n [\n 81.675253,\n 35.233536\n ],\n [\n 81.513261,\n 35.235002\n ],\n [\n 81.494167,\n 35.292161\n ],\n [\n 81.362356,\n 35.354647\n ],\n [\n 81.219458,\n 35.319016\n ],\n [\n 81.09935,\n 35.407333\n ],\n [\n 81.031597,\n 35.380506\n ],\n [\n 81.026053,\n 35.312181\n ],\n [\n 80.844351,\n 35.345375\n ],\n [\n 80.689135,\n 35.33903\n ],\n [\n 80.65649,\n 35.394165\n ],\n [\n 80.516672,\n 35.392214\n ],\n [\n 80.412578,\n 35.433663\n ],\n [\n 80.321419,\n 35.386848\n ],\n [\n 80.268448,\n 35.294114\n ],\n [\n 80.362687,\n 35.209096\n ],\n [\n 80.257977,\n 35.20323\n ],\n [\n 80.23026,\n 35.147476\n ],\n [\n 80.118159,\n 35.066222\n ],\n [\n 80.031311,\n 35.034384\n ],\n [\n 80.034391,\n 34.902\n ],\n [\n 79.947544,\n 34.820993\n ],\n [\n 79.906892,\n 34.683837\n ],\n [\n 79.801566,\n 34.478909\n ],\n [\n 79.675914,\n 34.451284\n ],\n [\n 79.504683,\n 34.454737\n ],\n [\n 79.229358,\n 34.413778\n ],\n [\n 79.161605,\n 34.441416\n ],\n [\n 79.0107,\n 34.399956\n ],\n [\n 79.039649,\n 34.33427\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 710000,\n \"name\": \"台湾省\",\n \"center\": [\n 121.509062,\n 25.044332\n ],\n \"centroid\": [\n 120.971486,\n 23.749452\n ],\n \"childrenNum\": 0,\n \"level\": \"province\",\n \"subFeatureIndex\": 31,\n \"acroutes\": [\n 100000\n ],\n \"parent\": {\n \"adcode\": 100000\n }\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 120.443706,\n 22.441042\n ],\n [\n 120.297112,\n 22.531154\n ],\n [\n 120.20041,\n 22.721137\n ],\n [\n 120.131425,\n 23.002313\n ],\n [\n 120.018708,\n 23.073342\n ],\n [\n 120.108019,\n 23.34115\n ],\n [\n 120.12157,\n 23.504758\n ],\n [\n 120.095084,\n 23.587583\n ],\n [\n 120.102476,\n 23.70104\n ],\n [\n 120.175156,\n 23.807282\n ],\n [\n 120.245989,\n 23.84067\n ],\n [\n 120.278018,\n 23.927657\n ],\n [\n 120.68885,\n 24.600764\n ],\n [\n 120.82374,\n 24.68832\n ],\n [\n 120.89211,\n 24.767665\n ],\n [\n 120.914899,\n 24.864876\n ],\n [\n 121.024537,\n 25.040639\n ],\n [\n 121.209318,\n 25.127342\n ],\n [\n 121.371926,\n 25.15984\n ],\n [\n 121.444607,\n 25.27081\n ],\n [\n 121.53515,\n 25.307597\n ],\n [\n 121.62323,\n 25.294614\n ],\n [\n 121.745186,\n 25.162007\n ],\n [\n 121.917033,\n 25.137634\n ],\n [\n 121.947214,\n 25.031965\n ],\n [\n 122.012503,\n 25.001602\n ],\n [\n 121.844968,\n 24.836101\n ],\n [\n 121.841272,\n 24.733977\n ],\n [\n 121.892395,\n 24.618171\n ],\n [\n 121.88562,\n 24.529477\n ],\n [\n 121.809243,\n 24.338818\n ],\n [\n 121.643556,\n 24.097633\n ],\n [\n 121.65957,\n 24.006934\n ],\n [\n 121.621382,\n 23.920547\n ],\n [\n 121.522832,\n 23.538772\n ],\n [\n 121.479716,\n 23.32247\n ],\n [\n 121.415042,\n 23.196039\n ],\n [\n 121.430441,\n 23.137181\n ],\n [\n 121.370695,\n 23.084351\n ],\n [\n 121.324499,\n 22.945574\n ],\n [\n 121.170514,\n 22.723345\n ],\n [\n 121.03316,\n 22.650477\n ],\n [\n 120.914899,\n 22.302718\n ],\n [\n 120.907508,\n 22.033426\n ],\n [\n 120.86624,\n 21.98461\n ],\n [\n 120.873016,\n 21.897477\n ],\n [\n 120.701784,\n 21.926898\n ],\n [\n 120.651277,\n 22.033426\n ],\n [\n 120.640806,\n 22.241259\n ],\n [\n 120.569973,\n 22.361938\n ],\n [\n 120.443706,\n 22.441042\n ]\n ]\n ],\n [\n [\n [\n 119.646064,\n 23.55084\n ],\n [\n 119.609108,\n 23.503661\n ],\n [\n 119.566608,\n 23.584842\n ],\n [\n 119.678093,\n 23.600195\n ],\n [\n 119.646064,\n 23.55084\n ]\n ]\n ],\n [\n [\n [\n 123.491374,\n 25.747089\n ],\n [\n 123.496917,\n 25.739005\n ],\n [\n 123.495069,\n 25.737927\n ],\n [\n 123.494453,\n 25.737927\n ],\n [\n 123.492606,\n 25.737388\n ],\n [\n 123.480903,\n 25.737927\n ],\n [\n 123.480287,\n 25.737388\n ],\n [\n 123.46612,\n 25.732537\n ],\n [\n 123.465504,\n 25.732537\n ],\n [\n 123.491374,\n 25.747089\n ]\n ]\n ],\n [\n [\n [\n 123.549272,\n 25.724991\n ],\n [\n 123.549272,\n 25.724991\n ],\n [\n 123.546192,\n 25.729303\n ],\n [\n 123.546192,\n 25.728764\n ],\n [\n 123.549272,\n 25.724991\n ]\n ]\n ],\n [\n [\n [\n 123.690322,\n 25.923187\n ],\n [\n 123.691554,\n 25.921572\n ],\n [\n 123.690938,\n 25.917267\n ],\n [\n 123.690938,\n 25.916729\n ],\n [\n 123.690322,\n 25.923187\n ]\n ]\n ],\n [\n [\n [\n 123.559743,\n 25.718523\n ],\n [\n 123.559743,\n 25.717984\n ],\n [\n 123.548656,\n 25.720679\n ],\n [\n 123.549272,\n 25.720679\n ],\n [\n 123.559743,\n 25.718523\n ]\n ]\n ],\n [\n [\n [\n 121.510513,\n 22.087215\n ],\n [\n 121.573339,\n 22.086106\n ],\n [\n 121.594281,\n 21.995152\n ],\n [\n 121.510513,\n 22.087215\n ]\n ]\n ],\n [\n [\n [\n 123.559743,\n 25.718523\n ],\n [\n 123.560359,\n 25.718523\n ],\n [\n 123.560359,\n 25.717984\n ],\n [\n 123.559743,\n 25.717984\n ],\n [\n 123.559743,\n 25.718523\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 810000,\n \"name\": \"香港特别行政区\",\n \"center\": [\n 114.173355,\n 22.320048\n ],\n \"centroid\": [\n 114.134394,\n 22.377371\n ],\n \"childrenNum\": 18,\n \"level\": \"province\",\n \"subFeatureIndex\": 32,\n \"acroutes\": [\n 100000\n ],\n \"parent\": {\n \"adcode\": 100000\n }\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 114.031778,\n 22.504071\n ],\n [\n 114.044096,\n 22.502413\n ],\n [\n 114.045944,\n 22.502413\n ],\n [\n 114.185762,\n 22.551601\n ],\n [\n 114.185762,\n 22.551601\n ],\n [\n 114.232574,\n 22.539997\n ],\n [\n 114.232574,\n 22.528944\n ],\n [\n 114.263371,\n 22.541654\n ],\n [\n 114.263987,\n 22.541654\n ],\n [\n 114.271994,\n 22.535023\n ],\n [\n 114.28924,\n 22.522864\n ],\n [\n 114.355762,\n 22.434958\n ],\n [\n 114.406269,\n 22.433299\n ],\n [\n 114.406269,\n 22.432746\n ],\n [\n 114.356994,\n 22.340356\n ],\n [\n 114.323733,\n 22.384622\n ],\n [\n 114.315726,\n 22.299951\n ],\n [\n 114.315726,\n 22.298843\n ],\n [\n 114.248588,\n 22.274484\n ],\n [\n 114.265835,\n 22.200825\n ],\n [\n 114.195002,\n 22.232951\n ],\n [\n 114.120473,\n 22.272269\n ],\n [\n 114.121089,\n 22.320985\n ],\n [\n 114.034857,\n 22.301058\n ],\n [\n 114.026234,\n 22.229628\n ],\n [\n 113.848844,\n 22.191961\n ],\n [\n 113.898119,\n 22.308808\n ],\n [\n 114.015763,\n 22.332054\n ],\n [\n 113.920293,\n 22.368024\n ],\n [\n 113.918445,\n 22.418366\n ],\n [\n 114.031778,\n 22.504071\n ]\n ]\n ],\n [\n [\n [\n 114.350834,\n 22.260087\n ],\n [\n 114.355146,\n 22.268393\n ],\n [\n 114.355762,\n 22.268393\n ],\n [\n 114.350834,\n 22.260087\n ]\n ]\n ],\n [\n [\n [\n 114.320037,\n 22.381303\n ],\n [\n 114.320037,\n 22.381856\n ],\n [\n 114.319421,\n 22.382409\n ],\n [\n 114.323733,\n 22.384622\n ],\n [\n 114.320037,\n 22.381303\n ]\n ]\n ],\n [\n [\n [\n 114.372392,\n 22.322645\n ],\n [\n 114.372392,\n 22.323752\n ],\n [\n 114.37424,\n 22.323199\n ],\n [\n 114.372392,\n 22.322645\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 820000,\n \"name\": \"澳门特别行政区\",\n \"center\": [\n 113.54909,\n 22.198951\n ],\n \"centroid\": [\n 113.56642,\n 22.159262\n ],\n \"childrenNum\": 8,\n \"level\": \"province\",\n \"subFeatureIndex\": 33,\n \"acroutes\": [\n 100000\n ],\n \"parent\": {\n \"adcode\": 100000\n }\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 113.558736,\n 22.213012\n ],\n [\n 113.6037,\n 22.132116\n ],\n [\n 113.553809,\n 22.107727\n ],\n [\n 113.558736,\n 22.213012\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 100000,\n \"name\": \"\",\n \"adchar\": \"JD\"\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 122.51865306,\n 23.46078502\n ],\n [\n 122.51742454,\n 23.45790762\n ],\n [\n 122.51536697,\n 23.45555069\n ],\n [\n 122.51268178,\n 23.45394494\n ],\n [\n 122.50963181,\n 23.45324755\n ],\n [\n 122.5065156,\n 23.45352678\n ],\n [\n 122.5036382,\n 23.45475531\n ],\n [\n 122.50128127,\n 23.45681287\n ],\n [\n 122.49967552,\n 23.45949807\n ],\n [\n 122.49897813,\n 23.46254804\n ],\n [\n 122.49925737,\n 23.46566424\n ],\n [\n 122.77921829,\n 24.57855302\n ],\n [\n 122.78044682,\n 24.58143041\n ],\n [\n 122.78250438,\n 24.58378734\n ],\n [\n 122.78518957,\n 24.5853931\n ],\n [\n 122.78823955,\n 24.58609049\n ],\n [\n 122.79135575,\n 24.58581125\n ],\n [\n 122.79423315,\n 24.58458272\n ],\n [\n 122.79659008,\n 24.58252516\n ],\n [\n 122.79819583,\n 24.57983997\n ],\n [\n 122.79889322,\n 24.57678999\n ],\n [\n 122.79861399,\n 24.57367379\n ],\n [\n 122.51865306,\n 23.46078502\n ]\n ]\n ],\n [\n [\n [\n 121.17202617,\n 20.8054593\n ],\n [\n 121.16966862,\n 20.80340244\n ],\n [\n 121.16679085,\n 20.80217478\n ],\n [\n 121.16367457,\n 20.80189649\n ],\n [\n 121.1606248,\n 20.8025948\n ],\n [\n 121.1579401,\n 20.80420136\n ],\n [\n 121.15588324,\n 20.80655891\n ],\n [\n 121.15465558,\n 20.80943668\n ],\n [\n 121.15437729,\n 20.81255297\n ],\n [\n 121.1550756,\n 20.81560273\n ],\n [\n 121.15668216,\n 20.81828744\n ],\n [\n 121.89404403,\n 21.70026162\n ],\n [\n 121.89640158,\n 21.70231847\n ],\n [\n 121.89927934,\n 21.70354613\n ],\n [\n 121.90239563,\n 21.70382443\n ],\n [\n 121.9054454,\n 21.70312611\n ],\n [\n 121.9081301,\n 21.70151955\n ],\n [\n 121.91018696,\n 21.699162\n ],\n [\n 121.91141462,\n 21.69628423\n ],\n [\n 121.91169291,\n 21.69316794\n ],\n [\n 121.9109946,\n 21.69011818\n ],\n [\n 121.90938804,\n 21.68743347\n ],\n [\n 121.17202617,\n 20.8054593\n ]\n ]\n ],\n [\n [\n [\n 119.47366172,\n 18.00707291\n ],\n [\n 119.47175735,\n 18.00459056\n ],\n [\n 119.46917909,\n 18.0028182\n ],\n [\n 119.46617933,\n 18.0019293\n ],\n [\n 119.4630517,\n 18.00201089\n ],\n [\n 119.46010237,\n 18.00305497\n ],\n [\n 119.45762002,\n 18.00495935\n ],\n [\n 119.45584765,\n 18.00753761\n ],\n [\n 119.45495876,\n 18.01053737\n ],\n [\n 119.45504035,\n 18.01366499\n ],\n [\n 119.45608443,\n 18.01661433\n ],\n [\n 120.00812005,\n 19.0335793\n ],\n [\n 120.01002443,\n 19.03606165\n ],\n [\n 120.01260269,\n 19.03783401\n ],\n [\n 120.01560245,\n 19.03872291\n ],\n [\n 120.01873007,\n 19.03864132\n ],\n [\n 120.02167941,\n 19.03759723\n ],\n [\n 120.02416175,\n 19.03569286\n ],\n [\n 120.02593412,\n 19.0331146\n ],\n [\n 120.02682302,\n 19.03011484\n ],\n [\n 120.02674143,\n 19.02698721\n ],\n [\n 120.02569734,\n 19.02403788\n ],\n [\n 119.47366172,\n 18.00707291\n ]\n ]\n ],\n [\n [\n [\n 119.0726757,\n 15.04098494\n ],\n [\n 119.0726746,\n 15.04083704\n ],\n [\n 119.07218171,\n 15.00751424\n ],\n [\n 119.07164663,\n 15.00443165\n ],\n [\n 119.07018516,\n 15.00166528\n ],\n [\n 119.06794036,\n 14.99948592\n ],\n [\n 119.06513198,\n 14.99810691\n ],\n [\n 119.06203491,\n 14.99766324\n ],\n [\n 119.05895232,\n 14.99819832\n ],\n [\n 119.05618595,\n 14.99965979\n ],\n [\n 119.05400659,\n 15.00190458\n ],\n [\n 119.05262758,\n 15.00471297\n ],\n [\n 119.0521839,\n 15.00781004\n ],\n [\n 119.0526757,\n 15.04105889\n ],\n [\n 119.0526757,\n 16.04388528\n ],\n [\n 119.05316513,\n 16.04697545\n ],\n [\n 119.05458553,\n 16.04976313\n ],\n [\n 119.05679784,\n 16.05197545\n ],\n [\n 119.05958553,\n 16.05339584\n ],\n [\n 119.0626757,\n 16.05388528\n ],\n [\n 119.06576587,\n 16.05339584\n ],\n [\n 119.06855355,\n 16.05197545\n ],\n [\n 119.07076587,\n 16.04976313\n ],\n [\n 119.07218626,\n 16.04697545\n ],\n [\n 119.0726757,\n 16.04388528\n ],\n [\n 119.0726757,\n 15.04098494\n ]\n ]\n ],\n [\n [\n [\n 118.68646749,\n 11.18959191\n ],\n [\n 118.85557939,\n 11.6136711\n ],\n [\n 118.9698053,\n 11.99151854\n ],\n [\n 118.97116801,\n 11.99433487\n ],\n [\n 118.97333431,\n 11.99659227\n ],\n [\n 118.97609216,\n 11.99806975\n ],\n [\n 118.9791716,\n 11.99862269\n ],\n [\n 118.98227119,\n 11.99819697\n ],\n [\n 118.98508753,\n 11.99683427\n ],\n [\n 118.98734492,\n 11.99466796\n ],\n [\n 118.9888224,\n 11.99191011\n ],\n [\n 118.98937534,\n 11.98883067\n ],\n [\n 118.98894963,\n 11.98573108\n ],\n [\n 118.87459939,\n 11.60747236\n ],\n [\n 118.87431591,\n 11.606662\n ],\n [\n 118.70476212,\n 11.18147468\n ],\n [\n 118.70409227,\n 11.18010771\n ],\n [\n 118.54242469,\n 10.9053354\n ],\n [\n 118.54043581,\n 10.90292022\n ],\n [\n 118.53779795,\n 10.90123786\n ],\n [\n 118.53476931,\n 10.90045298\n ],\n [\n 118.53164636,\n 10.90064241\n ],\n [\n 118.5287348,\n 10.90178762\n ],\n [\n 118.52631962,\n 10.9037765\n ],\n [\n 118.52463726,\n 10.90641436\n ],\n [\n 118.52385237,\n 10.909443\n ],\n [\n 118.52404181,\n 10.91256595\n ],\n [\n 118.52518702,\n 10.91547751\n ],\n [\n 118.68646749,\n 11.18959191\n ]\n ]\n ],\n [\n [\n [\n 115.54466883,\n 7.14672265\n ],\n [\n 115.54229721,\n 7.14468204\n ],\n [\n 115.53941108,\n 7.14347417\n ],\n [\n 115.53629295,\n 7.14321728\n ],\n [\n 115.53324806,\n 7.14393652\n ],\n [\n 115.53057445,\n 7.14556148\n ],\n [\n 115.52853383,\n 7.1479331\n ],\n [\n 115.52732596,\n 7.15081924\n ],\n [\n 115.52706908,\n 7.15393736\n ],\n [\n 115.52778832,\n 7.15698226\n ],\n [\n 115.52941328,\n 7.15965587\n ],\n [\n 116.23523025,\n 7.99221221\n ],\n [\n 116.23760187,\n 7.99425282\n ],\n [\n 116.240488,\n 7.99546069\n ],\n [\n 116.24360613,\n 7.99571758\n ],\n [\n 116.24665102,\n 7.99499834\n ],\n [\n 116.24932463,\n 7.99337338\n ],\n [\n 116.25136525,\n 7.99100176\n ],\n [\n 116.25257312,\n 7.98811563\n ],\n [\n 116.25283001,\n 7.9849975\n ],\n [\n 116.25211077,\n 7.98195261\n ],\n [\n 116.2504858,\n 7.979279\n ],\n [\n 115.54466883,\n 7.14672265\n ]\n ]\n ],\n [\n [\n [\n 112.30705249,\n 3.53487257\n ],\n [\n 112.51501594,\n 3.59753306\n ],\n [\n 112.84361424,\n 3.7506962\n ],\n [\n 112.84662187,\n 3.75155809\n ],\n [\n 112.84974864,\n 3.7514484\n ],\n [\n 112.85268847,\n 3.75037785\n ],\n [\n 112.8551536,\n 3.74845124\n ],\n [\n 112.85690272,\n 3.74585715\n ],\n [\n 112.85776462,\n 3.74284952\n ],\n [\n 112.85765492,\n 3.73972276\n ],\n [\n 112.85658437,\n 3.73678292\n ],\n [\n 112.85465776,\n 3.7343178\n ],\n [\n 112.85206367,\n 3.73256867\n ],\n [\n 112.52281386,\n 3.57910186\n ],\n [\n 112.52147408,\n 3.5785908\n ],\n [\n 112.31248917,\n 3.51562254\n ],\n [\n 112.31181658,\n 3.51544515\n ],\n [\n 111.79132585,\n 3.39736822\n ],\n [\n 111.78820398,\n 3.39716187\n ],\n [\n 111.78517113,\n 3.39793033\n ],\n [\n 111.78252419,\n 3.39959839\n ],\n [\n 111.78052226,\n 3.40200275\n ],\n [\n 111.77936129,\n 3.40490807\n ],\n [\n 111.77915495,\n 3.40802995\n ],\n [\n 111.77992341,\n 3.41106279\n ],\n [\n 111.78159146,\n 3.41370973\n ],\n [\n 111.78399583,\n 3.41571167\n ],\n [\n 111.78690114,\n 3.41687263\n ],\n [\n 112.30705249,\n 3.53487257\n ]\n ]\n ],\n [\n [\n [\n 108.26055972,\n 6.08912451\n ],\n [\n 108.26004031,\n 6.09098419\n ],\n [\n 108.23638164,\n 6.22427602\n ],\n [\n 108.23630689,\n 6.22476797\n ],\n [\n 108.19687578,\n 6.53630242\n ],\n [\n 108.19679674,\n 6.53760583\n ],\n [\n 108.1987683,\n 6.95072469\n ],\n [\n 108.19897125,\n 6.95268198\n ],\n [\n 108.22460147,\n 7.07791743\n ],\n [\n 108.22570055,\n 7.08084671\n ],\n [\n 108.22765103,\n 7.083293\n ],\n [\n 108.230262,\n 7.08501682\n ],\n [\n 108.23327786,\n 7.08584944\n ],\n [\n 108.23640341,\n 7.08570936\n ],\n [\n 108.2393327,\n 7.08461028\n ],\n [\n 108.24177899,\n 7.0826598\n ],\n [\n 108.24350281,\n 7.08004883\n ],\n [\n 108.24433543,\n 7.07703297\n ],\n [\n 108.24419535,\n 7.07390742\n ],\n [\n 108.21876335,\n 6.94964057\n ],\n [\n 108.21679964,\n 6.53816468\n ],\n [\n 108.25611734,\n 6.22752625\n ],\n [\n 108.279563,\n 6.09543449\n ],\n [\n 108.30878645,\n 6.01987736\n ],\n [\n 108.30944469,\n 6.0168187\n ],\n [\n 108.30912553,\n 6.01370633\n ],\n [\n 108.30786022,\n 6.01084492\n ],\n [\n 108.30577262,\n 6.00851455\n ],\n [\n 108.30306706,\n 6.00694335\n ],\n [\n 108.3000084,\n 6.00628511\n ],\n [\n 108.29689603,\n 6.00660426\n ],\n [\n 108.29403462,\n 6.00786957\n ],\n [\n 108.29170425,\n 6.00995718\n ],\n [\n 108.29013305,\n 6.01266273\n ],\n [\n 108.26055972,\n 6.08912451\n ]\n ]\n ],\n [\n [\n [\n 110.12822847,\n 11.36894451\n ],\n [\n 110.18898148,\n 11.48996382\n ],\n [\n 110.23982347,\n 11.61066468\n ],\n [\n 110.28485499,\n 11.78705054\n ],\n [\n 110.3083549,\n 11.94803461\n ],\n [\n 110.3142445,\n 12.14195265\n ],\n [\n 110.312278,\n 12.23998238\n ],\n [\n 110.31270536,\n 12.24308175\n ],\n [\n 110.31406956,\n 12.24589736\n ],\n [\n 110.31623706,\n 12.2481536\n ],\n [\n 110.3189957,\n 12.24962962\n ],\n [\n 110.32207543,\n 12.25018094\n ],\n [\n 110.32517479,\n 12.24975358\n ],\n [\n 110.3279904,\n 12.24838938\n ],\n [\n 110.33024665,\n 12.24622187\n ],\n [\n 110.33172267,\n 12.24346324\n ],\n [\n 110.33227398,\n 12.24038351\n ],\n [\n 110.33424553,\n 12.14210167\n ],\n [\n 110.33424294,\n 12.14159753\n ],\n [\n 110.32832827,\n 11.94685414\n ],\n [\n 110.32822801,\n 11.94571326\n ],\n [\n 110.30456934,\n 11.78364161\n ],\n [\n 110.30436343,\n 11.7826124\n ],\n [\n 110.25901765,\n 11.60499559\n ],\n [\n 110.25854422,\n 11.60358735\n ],\n [\n 110.20728377,\n 11.48189306\n ],\n [\n 110.20700505,\n 11.48128846\n ],\n [\n 110.14588682,\n 11.35954163\n ],\n [\n 110.14541497,\n 11.35870461\n ],\n [\n 110.07246741,\n 11.24270688\n ],\n [\n 110.07040803,\n 11.24035153\n ],\n [\n 110.0677216,\n 11.23874785\n ],\n [\n 110.06467109,\n 11.23805281\n ],\n [\n 110.0615551,\n 11.23833444\n ],\n [\n 110.05867865,\n 11.23956519\n ],\n [\n 110.05632331,\n 11.24162456\n ],\n [\n 110.05471962,\n 11.24431099\n ],\n [\n 110.05402458,\n 11.2473615\n ],\n [\n 110.05430621,\n 11.25047749\n ],\n [\n 110.05553696,\n 11.25335394\n ],\n [\n 110.12822847,\n 11.36894451\n ]\n ]\n ],\n [\n [\n [\n 109.82951587,\n 15.22896754\n ],\n [\n 109.77065019,\n 15.44468789\n ],\n [\n 109.67264555,\n 15.66561455\n ],\n [\n 109.57455994,\n 15.82609887\n ],\n [\n 109.51574449,\n 15.91095759\n ],\n [\n 109.29314007,\n 16.19491896\n ],\n [\n 109.29161878,\n 16.19765288\n ],\n [\n 109.29101677,\n 16.20072311\n ],\n [\n 109.29139298,\n 16.2038291\n ],\n [\n 109.29271057,\n 16.20666681\n ],\n [\n 109.29484059,\n 16.20895848\n ],\n [\n 109.29757451,\n 16.21047978\n ],\n [\n 109.30064474,\n 16.21108179\n ],\n [\n 109.30375073,\n 16.21070558\n ],\n [\n 109.30658844,\n 16.20938798\n ],\n [\n 109.30888011,\n 16.20725797\n ],\n [\n 109.53166592,\n 15.92306523\n ],\n [\n 109.53201478,\n 15.92259221\n ],\n [\n 109.59116145,\n 15.8372556\n ],\n [\n 109.59147511,\n 15.83677407\n ],\n [\n 109.6900529,\n 15.67548445\n ],\n [\n 109.69066131,\n 15.67432448\n ],\n [\n 109.7892391,\n 15.45210582\n ],\n [\n 109.78974541,\n 15.45068337\n ],\n [\n 109.84889209,\n 15.23393326\n ],\n [\n 109.84903675,\n 15.23333003\n ],\n [\n 109.8648092,\n 15.15722425\n ],\n [\n 109.86495704,\n 15.15409906\n ],\n [\n 109.86413191,\n 15.15108113\n ],\n [\n 109.86241457,\n 15.1484659\n ],\n [\n 109.85997314,\n 15.14650935\n ],\n [\n 109.85704658,\n 15.145403\n ],\n [\n 109.85392139,\n 15.14525516\n ],\n [\n 109.85090347,\n 15.14608029\n ],\n [\n 109.84828823,\n 15.14779763\n ],\n [\n 109.84633168,\n 15.15023907\n ],\n [\n 109.84522534,\n 15.15316562\n ],\n [\n 109.82951587,\n 15.22896754\n ]\n ]\n ]\n ]\n }\n }\n ]\n}', 'admin', '2020-05-19 16:42:27', 'admin', '2021-02-01 17:41:14', '0', NULL); +INSERT INTO `jimu_report_map` VALUES ('1235113459258056705', '内蒙古地图', '内蒙古地图', '{\n \"type\": \"FeatureCollection\",\n \"features\": [\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 150100,\n \"name\": \"呼和浩特市\",\n \"center\": [\n 111.670801,\n 40.818311\n ],\n \"centroid\": [\n 111.502117,\n 40.596287\n ],\n \"childrenNum\": 9,\n \"level\": \"city\",\n \"subFeatureIndex\": 0,\n \"acroutes\": [\n 100000,\n 150000\n ],\n \"parent\": {\n \"adcode\": 150000\n }\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 111.438183,\n 39.640433\n ],\n [\n 111.440784,\n 39.672526\n ],\n [\n 111.365058,\n 39.721166\n ],\n [\n 111.371417,\n 39.791775\n ],\n [\n 111.417083,\n 39.829778\n ],\n [\n 111.41506,\n 39.864772\n ],\n [\n 111.445409,\n 39.899045\n ],\n [\n 111.426332,\n 39.949983\n ],\n [\n 111.420263,\n 40.02211\n ],\n [\n 111.360433,\n 40.10187\n ],\n [\n 111.314188,\n 40.150557\n ],\n [\n 111.248289,\n 40.164561\n ],\n [\n 111.190483,\n 40.216525\n ],\n [\n 111.115624,\n 40.255866\n ],\n [\n 111.05406,\n 40.264605\n ],\n [\n 111.032961,\n 40.296931\n ],\n [\n 111.033828,\n 40.315271\n ],\n [\n 111.114757,\n 40.331161\n ],\n [\n 111.106664,\n 40.38073\n ],\n [\n 111.083253,\n 40.425729\n ],\n [\n 111.028337,\n 40.429914\n ],\n [\n 111.019955,\n 40.459198\n ],\n [\n 110.966195,\n 40.471221\n ],\n [\n 110.959547,\n 40.496133\n ],\n [\n 110.9081,\n 40.481675\n ],\n [\n 110.889024,\n 40.511633\n ],\n [\n 110.843068,\n 40.534962\n ],\n [\n 110.880064,\n 40.586468\n ],\n [\n 110.831217,\n 40.586816\n ],\n [\n 110.802025,\n 40.612207\n ],\n [\n 110.788441,\n 40.687625\n ],\n [\n 110.797112,\n 40.759662\n ],\n [\n 110.783527,\n 40.79383\n ],\n [\n 110.733814,\n 40.785853\n ],\n [\n 110.713004,\n 40.810301\n ],\n [\n 110.735548,\n 40.827461\n ],\n [\n 110.744797,\n 40.919079\n ],\n [\n 110.712137,\n 40.939326\n ],\n [\n 110.644792,\n 40.920118\n ],\n [\n 110.62774,\n 40.988272\n ],\n [\n 110.660978,\n 41.008497\n ],\n [\n 110.675719,\n 41.049965\n ],\n [\n 110.648261,\n 41.109874\n ],\n [\n 110.656065,\n 41.166109\n ],\n [\n 110.62774,\n 41.166109\n ],\n [\n 110.612999,\n 41.208856\n ],\n [\n 110.556927,\n 41.232458\n ],\n [\n 110.550857,\n 41.288415\n ],\n [\n 110.576003,\n 41.332974\n ],\n [\n 110.634098,\n 41.311816\n ],\n [\n 110.647105,\n 41.33263\n ],\n [\n 110.742196,\n 41.385408\n ],\n [\n 110.762139,\n 41.373893\n ],\n [\n 110.828905,\n 41.383002\n ],\n [\n 110.820523,\n 41.358938\n ],\n [\n 110.875728,\n 41.356875\n ],\n [\n 110.89596,\n 41.334006\n ],\n [\n 110.947697,\n 41.31801\n ],\n [\n 110.967351,\n 41.347935\n ],\n [\n 111.010706,\n 41.334866\n ],\n [\n 111.032094,\n 41.300461\n ],\n [\n 111.093947,\n 41.286694\n ],\n [\n 111.102618,\n 41.308203\n ],\n [\n 111.162447,\n 41.28394\n ],\n [\n 111.235283,\n 41.240553\n ],\n [\n 111.279794,\n 41.290308\n ],\n [\n 111.355231,\n 41.313193\n ],\n [\n 111.425465,\n 41.31887\n ],\n [\n 111.525181,\n 41.331426\n ],\n [\n 111.582409,\n 41.306655\n ],\n [\n 111.702646,\n 41.29461\n ],\n [\n 111.730104,\n 41.310956\n ],\n [\n 111.804096,\n 41.259668\n ],\n [\n 111.840514,\n 41.252091\n ],\n [\n 111.877221,\n 41.129027\n ],\n [\n 111.921732,\n 41.095895\n ],\n [\n 112.027517,\n 41.048583\n ],\n [\n 112.010175,\n 41.014719\n ],\n [\n 112.037055,\n 40.96389\n ],\n [\n 112.09515,\n 40.943305\n ],\n [\n 112.125788,\n 40.955933\n ],\n [\n 112.150933,\n 40.879088\n ],\n [\n 112.176079,\n 40.85276\n ],\n [\n 112.17868,\n 40.811514\n ],\n [\n 112.15209,\n 40.764519\n ],\n [\n 112.098619,\n 40.74526\n ],\n [\n 112.130412,\n 40.697697\n ],\n [\n 112.115672,\n 40.658788\n ],\n [\n 112.045148,\n 40.655139\n ],\n [\n 112.087925,\n 40.618813\n ],\n [\n 112.098619,\n 40.583859\n ],\n [\n 112.059022,\n 40.584381\n ],\n [\n 112.052374,\n 40.55985\n ],\n [\n 112.113648,\n 40.508672\n ],\n [\n 112.13706,\n 40.508324\n ],\n [\n 112.183305,\n 40.466168\n ],\n [\n 112.22348,\n 40.452575\n ],\n [\n 112.2177,\n 40.42817\n ],\n [\n 112.264523,\n 40.38736\n ],\n [\n 112.236198,\n 40.353856\n ],\n [\n 112.272616,\n 40.357172\n ],\n [\n 112.289379,\n 40.281032\n ],\n [\n 112.31019,\n 40.25639\n ],\n [\n 112.285622,\n 40.198158\n ],\n [\n 112.233018,\n 40.170336\n ],\n [\n 112.223191,\n 40.128845\n ],\n [\n 112.183594,\n 40.083998\n ],\n [\n 112.174923,\n 40.05122\n ],\n [\n 112.076363,\n 39.919425\n ],\n [\n 112.042547,\n 39.886216\n ],\n [\n 112.035032,\n 39.854398\n ],\n [\n 111.970578,\n 39.79635\n ],\n [\n 111.956416,\n 39.687686\n ],\n [\n 111.925489,\n 39.667414\n ],\n [\n 111.92838,\n 39.610266\n ],\n [\n 111.878955,\n 39.605855\n ],\n [\n 111.842537,\n 39.620147\n ],\n [\n 111.787621,\n 39.589618\n ],\n [\n 111.722589,\n 39.606031\n ],\n [\n 111.646574,\n 39.644313\n ],\n [\n 111.616515,\n 39.633378\n ],\n [\n 111.502059,\n 39.663182\n ],\n [\n 111.438183,\n 39.640433\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 150200,\n \"name\": \"包头市\",\n \"center\": [\n 109.840405,\n 40.658168\n ],\n \"centroid\": [\n 110.265618,\n 41.560878\n ],\n \"childrenNum\": 9,\n \"level\": \"city\",\n \"subFeatureIndex\": 1,\n \"acroutes\": [\n 100000,\n 150000\n ],\n \"parent\": {\n \"adcode\": 150000\n }\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 109.437509,\n 40.513722\n ],\n [\n 109.445602,\n 40.540184\n ],\n [\n 109.407739,\n 40.628027\n ],\n [\n 109.41641,\n 40.708463\n ],\n [\n 109.47913,\n 40.749945\n ],\n [\n 109.528554,\n 40.732592\n ],\n [\n 109.545607,\n 40.742831\n ],\n [\n 109.635496,\n 40.738666\n ],\n [\n 109.795908,\n 40.76157\n ],\n [\n 109.79822,\n 40.795911\n ],\n [\n 109.841575,\n 40.835606\n ],\n [\n 109.869322,\n 40.841324\n ],\n [\n 109.867299,\n 40.878049\n ],\n [\n 109.886953,\n 40.924271\n ],\n [\n 109.835216,\n 40.945727\n ],\n [\n 109.8251,\n 40.994496\n ],\n [\n 109.79822,\n 41.008151\n ],\n [\n 109.759779,\n 40.999509\n ],\n [\n 109.735211,\n 41.036318\n ],\n [\n 109.698794,\n 41.036663\n ],\n [\n 109.688099,\n 41.07725\n ],\n [\n 109.657462,\n 41.115914\n ],\n [\n 109.724806,\n 41.115224\n ],\n [\n 109.709488,\n 41.152486\n ],\n [\n 109.667578,\n 41.199723\n ],\n [\n 109.620466,\n 41.275506\n ],\n [\n 109.641565,\n 41.31801\n ],\n [\n 109.696192,\n 41.322998\n ],\n [\n 109.698794,\n 41.379393\n ],\n [\n 109.63116,\n 41.426637\n ],\n [\n 109.66411,\n 41.49907\n ],\n [\n 109.478263,\n 41.499584\n ],\n [\n 109.428838,\n 41.552055\n ],\n [\n 109.423636,\n 41.634448\n ],\n [\n 109.395022,\n 41.697926\n ],\n [\n 109.341551,\n 41.742546\n ],\n [\n 109.367853,\n 41.765784\n ],\n [\n 109.317272,\n 41.80865\n ],\n [\n 109.292127,\n 41.854557\n ],\n [\n 109.259177,\n 41.868374\n ],\n [\n 109.263513,\n 41.889521\n ],\n [\n 109.337216,\n 41.898727\n ],\n [\n 109.375079,\n 41.932985\n ],\n [\n 109.48809,\n 42.077312\n ],\n [\n 109.515548,\n 42.139333\n ],\n [\n 109.539248,\n 42.147315\n ],\n [\n 109.508611,\n 42.263702\n ],\n [\n 109.472482,\n 42.314363\n ],\n [\n 109.477396,\n 42.345181\n ],\n [\n 109.445313,\n 42.379198\n ],\n [\n 109.433463,\n 42.427737\n ],\n [\n 109.379414,\n 42.447345\n ],\n [\n 109.486934,\n 42.458668\n ],\n [\n 109.544162,\n 42.472354\n ],\n [\n 109.684053,\n 42.558961\n ],\n [\n 109.906029,\n 42.635844\n ],\n [\n 110.108351,\n 42.642752\n ],\n [\n 110.139566,\n 42.674755\n ],\n [\n 110.337552,\n 42.738039\n ],\n [\n 110.438135,\n 42.690414\n ],\n [\n 110.521954,\n 42.62607\n ],\n [\n 110.577159,\n 42.573637\n ],\n [\n 110.639012,\n 42.491779\n ],\n [\n 110.704911,\n 42.470833\n ],\n [\n 110.730057,\n 42.442613\n ],\n [\n 110.72312,\n 42.393916\n ],\n [\n 110.750867,\n 42.294883\n ],\n [\n 110.783238,\n 42.239967\n ],\n [\n 110.784683,\n 42.176347\n ],\n [\n 110.842201,\n 42.119969\n ],\n [\n 110.985849,\n 41.9352\n ],\n [\n 111.039609,\n 41.822818\n ],\n [\n 111.078917,\n 41.78611\n ],\n [\n 111.120827,\n 41.771421\n ],\n [\n 111.150886,\n 41.735026\n ],\n [\n 111.241353,\n 41.671242\n ],\n [\n 111.371128,\n 41.635646\n ],\n [\n 111.441362,\n 41.524282\n ],\n [\n 111.446565,\n 41.472646\n ],\n [\n 111.434136,\n 41.425264\n ],\n [\n 111.387313,\n 41.378705\n ],\n [\n 111.424887,\n 41.346903\n ],\n [\n 111.425465,\n 41.31887\n ],\n [\n 111.355231,\n 41.313193\n ],\n [\n 111.279794,\n 41.290308\n ],\n [\n 111.235283,\n 41.240553\n ],\n [\n 111.162447,\n 41.28394\n ],\n [\n 111.102618,\n 41.308203\n ],\n [\n 111.093947,\n 41.286694\n ],\n [\n 111.032094,\n 41.300461\n ],\n [\n 111.010706,\n 41.334866\n ],\n [\n 110.967351,\n 41.347935\n ],\n [\n 110.947697,\n 41.31801\n ],\n [\n 110.89596,\n 41.334006\n ],\n [\n 110.875728,\n 41.356875\n ],\n [\n 110.820523,\n 41.358938\n ],\n [\n 110.828905,\n 41.383002\n ],\n [\n 110.762139,\n 41.373893\n ],\n [\n 110.742196,\n 41.385408\n ],\n [\n 110.647105,\n 41.33263\n ],\n [\n 110.634098,\n 41.311816\n ],\n [\n 110.576003,\n 41.332974\n ],\n [\n 110.550857,\n 41.288415\n ],\n [\n 110.556927,\n 41.232458\n ],\n [\n 110.612999,\n 41.208856\n ],\n [\n 110.62774,\n 41.166109\n ],\n [\n 110.656065,\n 41.166109\n ],\n [\n 110.648261,\n 41.109874\n ],\n [\n 110.675719,\n 41.049965\n ],\n [\n 110.660978,\n 41.008497\n ],\n [\n 110.62774,\n 40.988272\n ],\n [\n 110.644792,\n 40.920118\n ],\n [\n 110.712137,\n 40.939326\n ],\n [\n 110.744797,\n 40.919079\n ],\n [\n 110.735548,\n 40.827461\n ],\n [\n 110.713004,\n 40.810301\n ],\n [\n 110.733814,\n 40.785853\n ],\n [\n 110.783527,\n 40.79383\n ],\n [\n 110.797112,\n 40.759662\n ],\n [\n 110.788441,\n 40.687625\n ],\n [\n 110.802025,\n 40.612207\n ],\n [\n 110.831217,\n 40.586816\n ],\n [\n 110.880064,\n 40.586468\n ],\n [\n 110.843068,\n 40.534962\n ],\n [\n 110.889024,\n 40.511633\n ],\n [\n 110.9081,\n 40.481675\n ],\n [\n 110.959547,\n 40.496133\n ],\n [\n 110.966195,\n 40.471221\n ],\n [\n 111.019955,\n 40.459198\n ],\n [\n 111.028337,\n 40.429914\n ],\n [\n 111.083253,\n 40.425729\n ],\n [\n 111.106664,\n 40.38073\n ],\n [\n 111.114757,\n 40.331161\n ],\n [\n 111.033828,\n 40.315271\n ],\n [\n 111.032961,\n 40.296931\n ],\n [\n 110.999144,\n 40.26111\n ],\n [\n 110.945963,\n 40.270373\n ],\n [\n 110.914458,\n 40.244678\n ],\n [\n 110.837287,\n 40.289943\n ],\n [\n 110.816477,\n 40.266178\n ],\n [\n 110.782371,\n 40.274042\n ],\n [\n 110.768787,\n 40.299726\n ],\n [\n 110.702021,\n 40.325399\n ],\n [\n 110.636699,\n 40.308634\n ],\n [\n 110.570222,\n 40.340589\n ],\n [\n 110.510971,\n 40.389279\n ],\n [\n 110.488137,\n 40.369563\n ],\n [\n 110.472241,\n 40.404978\n ],\n [\n 110.45172,\n 40.391896\n ],\n [\n 110.369057,\n 40.444383\n ],\n [\n 110.357495,\n 40.462509\n ],\n [\n 110.319054,\n 40.445777\n ],\n [\n 110.296799,\n 40.492823\n ],\n [\n 110.249398,\n 40.475054\n ],\n [\n 110.247953,\n 40.521209\n ],\n [\n 110.18321,\n 40.554282\n ],\n [\n 110.164712,\n 40.513722\n ],\n [\n 110.035804,\n 40.534266\n ],\n [\n 109.996207,\n 40.510588\n ],\n [\n 109.910075,\n 40.532003\n ],\n [\n 109.866143,\n 40.509891\n ],\n [\n 109.802267,\n 40.509717\n ],\n [\n 109.708621,\n 40.477494\n ],\n [\n 109.667,\n 40.500139\n ],\n [\n 109.635496,\n 40.546798\n ],\n [\n 109.580291,\n 40.553586\n ],\n [\n 109.519883,\n 40.514244\n ],\n [\n 109.437509,\n 40.513722\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 150300,\n \"name\": \"乌海市\",\n \"center\": [\n 106.825563,\n 39.673734\n ],\n \"centroid\": [\n 106.872209,\n 39.425058\n ],\n \"childrenNum\": 3,\n \"level\": \"city\",\n \"subFeatureIndex\": 2,\n \"acroutes\": [\n 100000,\n 150000\n ],\n \"parent\": {\n \"adcode\": 150000\n }\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 106.967739,\n 39.052388\n ],\n [\n 106.933344,\n 39.076396\n ],\n [\n 106.881318,\n 39.090263\n ],\n [\n 106.853571,\n 39.116569\n ],\n [\n 106.825535,\n 39.193828\n ],\n [\n 106.796054,\n 39.214239\n ],\n [\n 106.806748,\n 39.318684\n ],\n [\n 106.781603,\n 39.371822\n ],\n [\n 106.750965,\n 39.381559\n ],\n [\n 106.73449,\n 39.437303\n ],\n [\n 106.635064,\n 39.476209\n ],\n [\n 106.611074,\n 39.543005\n ],\n [\n 106.637376,\n 39.573731\n ],\n [\n 106.755012,\n 39.626851\n ],\n [\n 106.795476,\n 39.689449\n ],\n [\n 106.757324,\n 39.710595\n ],\n [\n 106.766573,\n 39.763787\n ],\n [\n 106.754145,\n 39.850706\n ],\n [\n 106.768885,\n 39.86653\n ],\n [\n 106.778712,\n 39.811131\n ],\n [\n 106.86282,\n 39.842793\n ],\n [\n 106.871491,\n 39.865475\n ],\n [\n 106.933922,\n 39.914506\n ],\n [\n 106.963403,\n 39.902383\n ],\n [\n 106.965137,\n 39.859673\n ],\n [\n 106.9345,\n 39.858794\n ],\n [\n 106.875827,\n 39.795822\n ],\n [\n 106.899238,\n 39.755687\n ],\n [\n 106.91369,\n 39.682046\n ],\n [\n 106.875827,\n 39.672526\n ],\n [\n 106.911956,\n 39.627027\n ],\n [\n 106.931899,\n 39.576732\n ],\n [\n 106.935945,\n 39.517213\n ],\n [\n 106.965426,\n 39.420142\n ],\n [\n 106.952131,\n 39.409171\n ],\n [\n 106.943749,\n 39.299367\n ],\n [\n 107.034505,\n 39.251318\n ],\n [\n 107.060229,\n 39.222401\n ],\n [\n 107.136533,\n 39.27969\n ],\n [\n 107.139134,\n 39.226127\n ],\n [\n 107.11659,\n 39.205365\n ],\n [\n 107.103583,\n 39.136113\n ],\n [\n 107.087976,\n 39.113903\n ],\n [\n 107.077859,\n 39.045273\n ],\n [\n 107.06283,\n 39.061458\n ],\n [\n 107.033349,\n 39.036734\n ],\n [\n 106.967739,\n 39.052388\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 150400,\n \"name\": \"赤峰市\",\n \"center\": [\n 118.956806,\n 42.275317\n ],\n \"centroid\": [\n 118.878117,\n 43.240534\n ],\n \"childrenNum\": 12,\n \"level\": \"city\",\n \"subFeatureIndex\": 3,\n \"acroutes\": [\n 100000,\n 150000\n ],\n \"parent\": {\n \"adcode\": 150000\n }\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 120.886032,\n 42.270651\n ],\n [\n 120.885743,\n 42.270482\n ],\n [\n 120.883719,\n 42.24268\n ],\n [\n 120.829382,\n 42.252514\n ],\n [\n 120.820711,\n 42.228096\n ],\n [\n 120.745273,\n 42.223517\n ],\n [\n 120.722151,\n 42.203669\n ],\n [\n 120.624748,\n 42.154447\n ],\n [\n 120.584283,\n 42.16718\n ],\n [\n 120.466647,\n 42.105357\n ],\n [\n 120.493527,\n 42.072552\n ],\n [\n 120.450751,\n 42.057248\n ],\n [\n 120.456531,\n 42.016251\n ],\n [\n 120.374447,\n 41.994466\n ],\n [\n 120.28687,\n 41.934859\n ],\n [\n 120.260279,\n 41.904183\n ],\n [\n 120.300455,\n 41.888157\n ],\n [\n 120.251608,\n 41.883894\n ],\n [\n 120.128192,\n 41.773471\n ],\n [\n 120.138308,\n 41.729215\n ],\n [\n 120.09611,\n 41.697071\n ],\n [\n 120.036858,\n 41.708016\n ],\n [\n 120.024719,\n 41.738615\n ],\n [\n 120.050443,\n 41.776033\n ],\n [\n 120.041772,\n 41.818721\n ],\n [\n 120.023274,\n 41.816502\n ],\n [\n 119.985122,\n 41.904694\n ],\n [\n 119.954484,\n 41.920375\n ],\n [\n 119.954484,\n 41.968246\n ],\n [\n 119.924425,\n 41.989189\n ],\n [\n 119.869798,\n 42.083432\n ],\n [\n 119.84552,\n 42.097199\n ],\n [\n 119.839739,\n 42.148674\n ],\n [\n 119.854769,\n 42.170236\n ],\n [\n 119.846676,\n 42.215205\n ],\n [\n 119.744648,\n 42.211643\n ],\n [\n 119.67239,\n 42.241663\n ],\n [\n 119.616896,\n 42.252683\n ],\n [\n 119.608514,\n 42.277091\n ],\n [\n 119.541459,\n 42.292172\n ],\n [\n 119.572096,\n 42.359399\n ],\n [\n 119.50244,\n 42.387995\n ],\n [\n 119.488277,\n 42.351444\n ],\n [\n 119.41573,\n 42.309621\n ],\n [\n 119.346652,\n 42.299965\n ],\n [\n 119.28451,\n 42.265227\n ],\n [\n 119.237976,\n 42.200954\n ],\n [\n 119.276417,\n 42.186021\n ],\n [\n 119.314859,\n 42.119799\n ],\n [\n 119.352433,\n 42.11827\n ],\n [\n 119.385093,\n 42.089551\n ],\n [\n 119.374399,\n 42.021016\n ],\n [\n 119.324686,\n 41.969268\n ],\n [\n 119.340871,\n 41.921568\n ],\n [\n 119.334513,\n 41.869398\n ],\n [\n 119.312835,\n 41.805747\n ],\n [\n 119.290002,\n 41.783378\n ],\n [\n 119.317749,\n 41.763222\n ],\n [\n 119.299829,\n 41.711435\n ],\n [\n 119.307922,\n 41.657554\n ],\n [\n 119.342606,\n 41.618012\n ],\n [\n 119.416019,\n 41.590096\n ],\n [\n 119.414863,\n 41.562339\n ],\n [\n 119.361971,\n 41.566451\n ],\n [\n 119.404458,\n 41.510734\n ],\n [\n 119.403302,\n 41.475221\n ],\n [\n 119.377867,\n 41.459774\n ],\n [\n 119.376422,\n 41.422172\n ],\n [\n 119.309945,\n 41.406026\n ],\n [\n 119.326131,\n 41.329362\n ],\n [\n 119.252139,\n 41.325578\n ],\n [\n 119.197801,\n 41.282907\n ],\n [\n 119.155024,\n 41.297708\n ],\n [\n 119.093172,\n 41.293578\n ],\n [\n 118.974669,\n 41.306483\n ],\n [\n 118.89085,\n 41.300805\n ],\n [\n 118.844894,\n 41.342432\n ],\n [\n 118.839691,\n 41.374237\n ],\n [\n 118.770035,\n 41.353093\n ],\n [\n 118.741999,\n 41.32403\n ],\n [\n 118.676967,\n 41.350514\n ],\n [\n 118.629855,\n 41.346387\n ],\n [\n 118.519156,\n 41.353781\n ],\n [\n 118.412503,\n 41.331942\n ],\n [\n 118.380132,\n 41.31216\n ],\n [\n 118.349206,\n 41.342776\n ],\n [\n 118.361056,\n 41.384892\n ],\n [\n 118.32695,\n 41.450848\n ],\n [\n 118.272034,\n 41.471273\n ],\n [\n 118.315678,\n 41.512449\n ],\n [\n 118.301515,\n 41.569707\n ],\n [\n 118.230414,\n 41.582215\n ],\n [\n 118.209893,\n 41.610649\n ],\n [\n 118.206713,\n 41.650708\n ],\n [\n 118.169139,\n 41.670729\n ],\n [\n 118.130698,\n 41.742375\n ],\n [\n 118.140236,\n 41.784061\n ],\n [\n 118.16596,\n 41.813259\n ],\n [\n 118.235905,\n 41.807625\n ],\n [\n 118.246889,\n 41.773984\n ],\n [\n 118.292266,\n 41.772788\n ],\n [\n 118.340246,\n 41.872468\n ],\n [\n 118.268855,\n 41.930088\n ],\n [\n 118.30614,\n 41.939971\n ],\n [\n 118.313944,\n 41.988167\n ],\n [\n 118.23764,\n 42.022887\n ],\n [\n 118.296891,\n 42.048405\n ],\n [\n 118.272323,\n 42.083262\n ],\n [\n 118.226656,\n 42.090231\n ],\n [\n 118.220298,\n 42.058609\n ],\n [\n 118.189082,\n 42.030544\n ],\n [\n 118.125206,\n 42.032926\n ],\n [\n 118.155266,\n 42.081222\n ],\n [\n 118.088789,\n 42.117081\n ],\n [\n 118.106419,\n 42.171934\n ],\n [\n 118.033584,\n 42.199088\n ],\n [\n 117.96913,\n 42.245562\n ],\n [\n 118.047457,\n 42.28065\n ],\n [\n 118.059885,\n 42.298271\n ],\n [\n 118.016242,\n 42.333329\n ],\n [\n 118.024335,\n 42.384781\n ],\n [\n 117.997744,\n 42.416747\n ],\n [\n 117.874038,\n 42.510185\n ],\n [\n 117.855829,\n 42.540063\n ],\n [\n 117.797734,\n 42.585274\n ],\n [\n 117.779814,\n 42.618655\n ],\n [\n 117.707267,\n 42.587972\n ],\n [\n 117.667381,\n 42.582407\n ],\n [\n 117.600326,\n 42.602978\n ],\n [\n 117.539918,\n 42.605507\n ],\n [\n 117.520264,\n 42.59185\n ],\n [\n 117.473441,\n 42.602472\n ],\n [\n 117.435289,\n 42.585442\n ],\n [\n 117.433266,\n 42.555755\n ],\n [\n 117.39627,\n 42.53635\n ],\n [\n 117.413034,\n 42.471171\n ],\n [\n 117.332105,\n 42.46154\n ],\n [\n 117.286727,\n 42.479787\n ],\n [\n 117.176028,\n 42.465596\n ],\n [\n 117.095389,\n 42.484178\n ],\n [\n 117.078625,\n 42.460189\n ],\n [\n 117.016772,\n 42.456471\n ],\n [\n 116.993939,\n 42.425708\n ],\n [\n 116.893645,\n 42.387826\n ],\n [\n 116.907807,\n 42.443965\n ],\n [\n 116.875725,\n 42.482996\n ],\n [\n 116.885552,\n 42.534662\n ],\n [\n 116.82052,\n 42.546981\n ],\n [\n 116.801444,\n 42.582913\n ],\n [\n 116.699127,\n 42.592019\n ],\n [\n 116.669357,\n 42.555755\n ],\n [\n 116.638141,\n 42.577179\n ],\n [\n 116.63554,\n 42.614609\n ],\n [\n 116.58785,\n 42.599775\n ],\n [\n 116.619354,\n 42.671387\n ],\n [\n 116.67427,\n 42.761586\n ],\n [\n 116.666177,\n 42.81655\n ],\n [\n 116.673981,\n 42.889758\n ],\n [\n 116.664732,\n 42.933038\n ],\n [\n 116.580624,\n 42.985336\n ],\n [\n 116.500852,\n 43.01532\n ],\n [\n 116.503742,\n 43.04914\n ],\n [\n 116.436109,\n 43.077922\n ],\n [\n 116.419345,\n 43.104015\n ],\n [\n 116.356336,\n 43.156835\n ],\n [\n 116.37021,\n 43.243323\n ],\n [\n 116.413853,\n 43.258003\n ],\n [\n 116.436398,\n 43.328188\n ],\n [\n 116.518194,\n 43.365664\n ],\n [\n 116.59681,\n 43.410605\n ],\n [\n 116.621956,\n 43.505039\n ],\n [\n 116.681207,\n 43.517165\n ],\n [\n 116.734967,\n 43.509026\n ],\n [\n 116.790461,\n 43.484436\n ],\n [\n 116.830636,\n 43.5067\n ],\n [\n 116.804912,\n 43.565147\n ],\n [\n 116.812138,\n 43.612593\n ],\n [\n 116.837284,\n 43.614086\n ],\n [\n 116.858383,\n 43.657351\n ],\n [\n 116.971683,\n 43.673422\n ],\n [\n 117.053768,\n 43.753384\n ],\n [\n 117.001164,\n 43.782495\n ],\n [\n 116.986135,\n 43.840343\n ],\n [\n 117.013304,\n 43.85075\n ],\n [\n 117.000008,\n 43.912328\n ],\n [\n 117.031802,\n 43.942845\n ],\n [\n 117.022264,\n 43.969721\n ],\n [\n 116.970816,\n 43.988674\n ],\n [\n 116.961567,\n 44.024752\n ],\n [\n 117.011281,\n 44.057681\n ],\n [\n 117.120823,\n 44.179195\n ],\n [\n 117.166201,\n 44.192662\n ],\n [\n 117.206666,\n 44.220081\n ],\n [\n 117.452631,\n 44.235017\n ],\n [\n 117.522866,\n 44.226811\n ],\n [\n 117.550613,\n 44.187736\n ],\n [\n 117.634721,\n 44.14847\n ],\n [\n 117.624894,\n 44.128745\n ],\n [\n 117.686746,\n 44.095033\n ],\n [\n 117.643392,\n 44.042207\n ],\n [\n 117.700331,\n 44.016353\n ],\n [\n 117.790219,\n 44.019482\n ],\n [\n 117.827793,\n 44.063113\n ],\n [\n 117.859876,\n 44.072987\n ],\n [\n 117.904098,\n 44.121182\n ],\n [\n 117.962193,\n 44.121182\n ],\n [\n 118.06162,\n 44.100461\n ],\n [\n 118.116825,\n 44.132362\n ],\n [\n 118.128675,\n 44.190692\n ],\n [\n 118.148907,\n 44.215157\n ],\n [\n 118.172608,\n 44.204321\n ],\n [\n 118.19284,\n 44.242565\n ],\n [\n 118.237351,\n 44.279144\n ],\n [\n 118.214228,\n 44.306195\n ],\n [\n 118.250935,\n 44.337493\n ],\n [\n 118.34198,\n 44.319961\n ],\n [\n 118.414816,\n 44.322419\n ],\n [\n 118.428111,\n 44.346174\n ],\n [\n 118.466552,\n 44.354036\n ],\n [\n 118.476957,\n 44.399383\n ],\n [\n 118.544591,\n 44.411165\n ],\n [\n 118.54777,\n 44.442243\n ],\n [\n 118.596038,\n 44.468728\n ],\n [\n 118.635635,\n 44.472814\n ],\n [\n 118.659336,\n 44.453361\n ],\n [\n 118.75067,\n 44.477554\n ],\n [\n 118.789111,\n 44.46317\n ],\n [\n 118.816569,\n 44.49128\n ],\n [\n 118.904723,\n 44.516436\n ],\n [\n 118.981606,\n 44.566064\n ],\n [\n 119.001549,\n 44.648248\n ],\n [\n 118.96831,\n 44.691087\n ],\n [\n 118.926112,\n 44.7046\n ],\n [\n 118.97149,\n 44.729827\n ],\n [\n 119.001549,\n 44.713879\n ],\n [\n 119.074674,\n 44.712739\n ],\n [\n 119.148377,\n 44.731617\n ],\n [\n 119.125832,\n 44.762199\n ],\n [\n 119.173233,\n 44.76041\n ],\n [\n 119.14751,\n 44.808692\n ],\n [\n 119.067448,\n 44.870895\n ],\n [\n 119.082188,\n 44.938381\n ],\n [\n 119.107334,\n 44.920543\n ],\n [\n 119.146642,\n 44.924922\n ],\n [\n 119.224681,\n 44.909676\n ],\n [\n 119.230172,\n 44.9353\n ],\n [\n 119.18624,\n 44.952971\n ],\n [\n 119.15329,\n 44.992993\n ],\n [\n 119.171788,\n 45.015989\n ],\n [\n 119.208495,\n 44.997366\n ],\n [\n 119.231907,\n 45.019065\n ],\n [\n 119.196934,\n 45.03234\n ],\n [\n 119.156759,\n 45.074409\n ],\n [\n 119.159071,\n 45.099959\n ],\n [\n 119.215432,\n 45.152802\n ],\n [\n 119.28769,\n 45.121943\n ],\n [\n 119.293181,\n 45.087347\n ],\n [\n 119.342027,\n 45.076026\n ],\n [\n 119.373243,\n 45.105456\n ],\n [\n 119.360814,\n 45.165884\n ],\n [\n 119.311101,\n 45.186551\n ],\n [\n 119.323818,\n 45.245925\n ],\n [\n 119.33827,\n 45.252214\n ],\n [\n 119.492324,\n 45.223829\n ],\n [\n 119.507642,\n 45.194622\n ],\n [\n 119.634816,\n 45.121619\n ],\n [\n 119.668633,\n 45.084436\n ],\n [\n 119.708519,\n 44.989429\n ],\n [\n 119.751874,\n 44.925895\n ],\n [\n 119.848988,\n 44.894751\n ],\n [\n 119.864307,\n 44.873329\n ],\n [\n 119.927604,\n 44.846379\n ],\n [\n 119.9409,\n 44.826401\n ],\n [\n 120.076166,\n 44.72641\n ],\n [\n 120.082236,\n 44.687668\n ],\n [\n 120.116342,\n 44.652484\n ],\n [\n 120.180796,\n 44.635373\n ],\n [\n 120.156517,\n 44.598853\n ],\n [\n 120.206519,\n 44.571938\n ],\n [\n 120.2123,\n 44.552355\n ],\n [\n 120.28687,\n 44.517253\n ],\n [\n 120.325022,\n 44.440444\n ],\n [\n 120.312016,\n 44.418363\n ],\n [\n 120.339185,\n 44.39071\n ],\n [\n 120.378493,\n 44.38629\n ],\n [\n 120.38832,\n 44.337656\n ],\n [\n 120.454508,\n 44.262416\n ],\n [\n 120.496707,\n 44.249292\n ],\n [\n 120.560872,\n 44.261432\n ],\n [\n 120.574456,\n 44.235017\n ],\n [\n 120.645847,\n 44.235017\n ],\n [\n 120.653651,\n 44.185765\n ],\n [\n 120.688912,\n 44.18248\n ],\n [\n 120.706543,\n 44.129238\n ],\n [\n 120.746141,\n 44.113783\n ],\n [\n 120.708856,\n 44.081543\n ],\n [\n 120.693537,\n 44.037268\n ],\n [\n 120.774466,\n 43.935588\n ],\n [\n 120.795854,\n 43.885756\n ],\n [\n 120.787472,\n 43.814401\n ],\n [\n 120.836029,\n 43.788613\n ],\n [\n 120.876783,\n 43.739485\n ],\n [\n 120.940659,\n 43.693961\n ],\n [\n 120.964359,\n 43.654037\n ],\n [\n 120.93141,\n 43.611101\n ],\n [\n 120.864354,\n 43.593188\n ],\n [\n 120.807993,\n 43.559504\n ],\n [\n 120.758569,\n 43.54307\n ],\n [\n 120.753366,\n 43.525967\n ],\n [\n 120.694404,\n 43.488424\n ],\n [\n 120.654807,\n 43.451024\n ],\n [\n 120.60018,\n 43.427241\n ],\n [\n 120.464046,\n 43.400787\n ],\n [\n 120.426761,\n 43.380149\n ],\n [\n 120.504222,\n 43.380315\n ],\n [\n 120.607406,\n 43.393798\n ],\n [\n 120.644402,\n 43.409607\n ],\n [\n 120.705387,\n 43.410439\n ],\n [\n 120.772153,\n 43.42824\n ],\n [\n 120.762904,\n 43.406112\n ],\n [\n 120.721284,\n 43.393964\n ],\n [\n 120.666368,\n 43.325022\n ],\n [\n 120.627927,\n 43.318523\n ],\n [\n 120.631973,\n 43.295856\n ],\n [\n 120.589486,\n 43.276849\n ],\n [\n 120.574745,\n 43.240486\n ],\n [\n 120.535148,\n 43.226803\n ],\n [\n 120.507979,\n 43.196254\n ],\n [\n 120.47474,\n 43.184899\n ],\n [\n 120.451907,\n 43.131434\n ],\n [\n 120.386008,\n 43.102008\n ],\n [\n 120.3467,\n 43.058512\n ],\n [\n 120.387164,\n 42.986342\n ],\n [\n 120.430519,\n 42.986174\n ],\n [\n 120.403061,\n 42.93723\n ],\n [\n 120.420403,\n 42.914757\n ],\n [\n 120.396413,\n 42.885563\n ],\n [\n 120.42416,\n 42.8671\n ],\n [\n 120.462023,\n 42.756541\n ],\n [\n 120.484856,\n 42.725926\n ],\n [\n 120.512892,\n 42.649154\n ],\n [\n 120.564918,\n 42.598089\n ],\n [\n 120.568386,\n 42.540569\n ],\n [\n 120.653073,\n 42.465089\n ],\n [\n 120.666079,\n 42.442275\n ],\n [\n 120.768685,\n 42.393916\n ],\n [\n 120.766951,\n 42.366168\n ],\n [\n 120.84181,\n 42.309282\n ],\n [\n 120.861175,\n 42.269465\n ],\n [\n 120.885743,\n 42.270482\n ],\n [\n 120.886032,\n 42.270651\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 150500,\n \"name\": \"通辽市\",\n \"center\": [\n 122.263119,\n 43.617429\n ],\n \"centroid\": [\n 121.569877,\n 43.834478\n ],\n \"childrenNum\": 8,\n \"level\": \"city\",\n \"subFeatureIndex\": 4,\n \"acroutes\": [\n 100000,\n 150000\n ],\n \"parent\": {\n \"adcode\": 150000\n }\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 120.886032,\n 42.270651\n ],\n [\n 120.885743,\n 42.270482\n ],\n [\n 120.861175,\n 42.269465\n ],\n [\n 120.84181,\n 42.309282\n ],\n [\n 120.766951,\n 42.366168\n ],\n [\n 120.768685,\n 42.393916\n ],\n [\n 120.666079,\n 42.442275\n ],\n [\n 120.653073,\n 42.465089\n ],\n [\n 120.568386,\n 42.540569\n ],\n [\n 120.564918,\n 42.598089\n ],\n [\n 120.512892,\n 42.649154\n ],\n [\n 120.484856,\n 42.725926\n ],\n [\n 120.462023,\n 42.756541\n ],\n [\n 120.42416,\n 42.8671\n ],\n [\n 120.396413,\n 42.885563\n ],\n [\n 120.420403,\n 42.914757\n ],\n [\n 120.403061,\n 42.93723\n ],\n [\n 120.430519,\n 42.986174\n ],\n [\n 120.387164,\n 42.986342\n ],\n [\n 120.3467,\n 43.058512\n ],\n [\n 120.386008,\n 43.102008\n ],\n [\n 120.451907,\n 43.131434\n ],\n [\n 120.47474,\n 43.184899\n ],\n [\n 120.507979,\n 43.196254\n ],\n [\n 120.535148,\n 43.226803\n ],\n [\n 120.574745,\n 43.240486\n ],\n [\n 120.589486,\n 43.276849\n ],\n [\n 120.631973,\n 43.295856\n ],\n [\n 120.627927,\n 43.318523\n ],\n [\n 120.666368,\n 43.325022\n ],\n [\n 120.721284,\n 43.393964\n ],\n [\n 120.762904,\n 43.406112\n ],\n [\n 120.772153,\n 43.42824\n ],\n [\n 120.705387,\n 43.410439\n ],\n [\n 120.644402,\n 43.409607\n ],\n [\n 120.607406,\n 43.393798\n ],\n [\n 120.504222,\n 43.380315\n ],\n [\n 120.426761,\n 43.380149\n ],\n [\n 120.464046,\n 43.400787\n ],\n [\n 120.60018,\n 43.427241\n ],\n [\n 120.654807,\n 43.451024\n ],\n [\n 120.694404,\n 43.488424\n ],\n [\n 120.753366,\n 43.525967\n ],\n [\n 120.758569,\n 43.54307\n ],\n [\n 120.807993,\n 43.559504\n ],\n [\n 120.864354,\n 43.593188\n ],\n [\n 120.93141,\n 43.611101\n ],\n [\n 120.964359,\n 43.654037\n ],\n [\n 120.940659,\n 43.693961\n ],\n [\n 120.876783,\n 43.739485\n ],\n [\n 120.836029,\n 43.788613\n ],\n [\n 120.787472,\n 43.814401\n ],\n [\n 120.795854,\n 43.885756\n ],\n [\n 120.774466,\n 43.935588\n ],\n [\n 120.693537,\n 44.037268\n ],\n [\n 120.708856,\n 44.081543\n ],\n [\n 120.746141,\n 44.113783\n ],\n [\n 120.706543,\n 44.129238\n ],\n [\n 120.688912,\n 44.18248\n ],\n [\n 120.653651,\n 44.185765\n ],\n [\n 120.645847,\n 44.235017\n ],\n [\n 120.574456,\n 44.235017\n ],\n [\n 120.560872,\n 44.261432\n ],\n [\n 120.496707,\n 44.249292\n ],\n [\n 120.454508,\n 44.262416\n ],\n [\n 120.38832,\n 44.337656\n ],\n [\n 120.378493,\n 44.38629\n ],\n [\n 120.339185,\n 44.39071\n ],\n [\n 120.312016,\n 44.418363\n ],\n [\n 120.325022,\n 44.440444\n ],\n [\n 120.28687,\n 44.517253\n ],\n [\n 120.2123,\n 44.552355\n ],\n [\n 120.206519,\n 44.571938\n ],\n [\n 120.156517,\n 44.598853\n ],\n [\n 120.180796,\n 44.635373\n ],\n [\n 120.116342,\n 44.652484\n ],\n [\n 120.082236,\n 44.687668\n ],\n [\n 120.076166,\n 44.72641\n ],\n [\n 119.9409,\n 44.826401\n ],\n [\n 119.927604,\n 44.846379\n ],\n [\n 119.864307,\n 44.873329\n ],\n [\n 119.848988,\n 44.894751\n ],\n [\n 119.751874,\n 44.925895\n ],\n [\n 119.708519,\n 44.989429\n ],\n [\n 119.668633,\n 45.084436\n ],\n [\n 119.634816,\n 45.121619\n ],\n [\n 119.507642,\n 45.194622\n ],\n [\n 119.492324,\n 45.223829\n ],\n [\n 119.33827,\n 45.252214\n ],\n [\n 119.323818,\n 45.245925\n ],\n [\n 119.248381,\n 45.304111\n ],\n [\n 119.313413,\n 45.385244\n ],\n [\n 119.304742,\n 45.468029\n ],\n [\n 119.396943,\n 45.511863\n ],\n [\n 119.496081,\n 45.550691\n ],\n [\n 119.55909,\n 45.615933\n ],\n [\n 119.544927,\n 45.635956\n ],\n [\n 119.566027,\n 45.65565\n ],\n [\n 119.656493,\n 45.623463\n ],\n [\n 119.790893,\n 45.564323\n ],\n [\n 119.819507,\n 45.572821\n ],\n [\n 119.877602,\n 45.549088\n ],\n [\n 119.918355,\n 45.561918\n ],\n [\n 119.906794,\n 45.505603\n ],\n [\n 120.002464,\n 45.482162\n ],\n [\n 120.031656,\n 45.499342\n ],\n [\n 120.028765,\n 45.526306\n ],\n [\n 119.994082,\n 45.552937\n ],\n [\n 119.994082,\n 45.580837\n ],\n [\n 120.027031,\n 45.594942\n ],\n [\n 120.142644,\n 45.584204\n ],\n [\n 120.165766,\n 45.594782\n ],\n [\n 120.269239,\n 45.552135\n ],\n [\n 120.318375,\n 45.556626\n ],\n [\n 120.35855,\n 45.516838\n ],\n [\n 120.414044,\n 45.503516\n ],\n [\n 120.434854,\n 45.464495\n ],\n [\n 120.49584,\n 45.464173\n ],\n [\n 120.559716,\n 45.416604\n ],\n [\n 120.554224,\n 45.357569\n ],\n [\n 120.580526,\n 45.352901\n ],\n [\n 120.660298,\n 45.297666\n ],\n [\n 120.744406,\n 45.260115\n ],\n [\n 120.82678,\n 45.253504\n ],\n [\n 120.834873,\n 45.216084\n ],\n [\n 120.882274,\n 45.217537\n ],\n [\n 120.967827,\n 45.184129\n ],\n [\n 120.97303,\n 45.157002\n ],\n [\n 120.947884,\n 45.120973\n ],\n [\n 120.97303,\n 45.11871\n ],\n [\n 120.977076,\n 45.072953\n ],\n [\n 121.032859,\n 44.9985\n ],\n [\n 121.239806,\n 44.934165\n ],\n [\n 121.401663,\n 44.85125\n ],\n [\n 121.420161,\n 44.817953\n ],\n [\n 121.409178,\n 44.790815\n ],\n [\n 121.529993,\n 44.720389\n ],\n [\n 121.548491,\n 44.667472\n ],\n [\n 121.595603,\n 44.659164\n ],\n [\n 121.585198,\n 44.639774\n ],\n [\n 121.651097,\n 44.563126\n ],\n [\n 121.697631,\n 44.534562\n ],\n [\n 121.760062,\n 44.47739\n ],\n [\n 121.778271,\n 44.446494\n ],\n [\n 121.829429,\n 44.411328\n ],\n [\n 121.881166,\n 44.402983\n ],\n [\n 121.933769,\n 44.351252\n ],\n [\n 122.017877,\n 44.304392\n ],\n [\n 122.167596,\n 44.25569\n ],\n [\n 122.22598,\n 44.263564\n ],\n [\n 122.274537,\n 44.25405\n ],\n [\n 122.319337,\n 44.232883\n ],\n [\n 122.483218,\n 44.236986\n ],\n [\n 122.512988,\n 44.250276\n ],\n [\n 122.641896,\n 44.283408\n ],\n [\n 122.675423,\n 44.285703\n ],\n [\n 122.760687,\n 44.369756\n ],\n [\n 122.856068,\n 44.398238\n ],\n [\n 123.024862,\n 44.492914\n ],\n [\n 123.124867,\n 44.509577\n ],\n [\n 123.124,\n 44.457939\n ],\n [\n 123.142208,\n 44.428178\n ],\n [\n 123.114461,\n 44.402493\n ],\n [\n 123.127179,\n 44.368774\n ],\n [\n 123.196835,\n 44.345028\n ],\n [\n 123.277186,\n 44.252573\n ],\n [\n 123.287302,\n 44.213351\n ],\n [\n 123.32372,\n 44.179852\n ],\n [\n 123.38644,\n 44.161945\n ],\n [\n 123.3506,\n 44.092566\n ],\n [\n 123.328344,\n 44.083847\n ],\n [\n 123.332391,\n 44.028376\n ],\n [\n 123.400891,\n 43.979281\n ],\n [\n 123.375168,\n 43.965599\n ],\n [\n 123.428349,\n 43.927341\n ],\n [\n 123.443957,\n 43.877337\n ],\n [\n 123.468236,\n 43.853062\n ],\n [\n 123.463322,\n 43.819524\n ],\n [\n 123.49685,\n 43.785637\n ],\n [\n 123.482687,\n 43.737831\n ],\n [\n 123.517371,\n 43.71383\n ],\n [\n 123.537314,\n 43.649728\n ],\n [\n 123.511879,\n 43.62619\n ],\n [\n 123.510434,\n 43.592193\n ],\n [\n 123.421123,\n 43.59833\n ],\n [\n 123.46101,\n 43.568632\n ],\n [\n 123.452339,\n 43.545726\n ],\n [\n 123.352912,\n 43.567636\n ],\n [\n 123.304644,\n 43.550707\n ],\n [\n 123.32979,\n 43.518992\n ],\n [\n 123.315916,\n 43.49208\n ],\n [\n 123.375746,\n 43.476625\n ],\n [\n 123.419967,\n 43.410106\n ],\n [\n 123.441934,\n 43.43772\n ],\n [\n 123.486734,\n 43.44537\n ],\n [\n 123.519683,\n 43.402452\n ],\n [\n 123.545118,\n 43.415097\n ],\n [\n 123.608705,\n 43.36633\n ],\n [\n 123.703796,\n 43.370659\n ],\n [\n 123.712756,\n 43.347179\n ],\n [\n 123.696281,\n 43.281351\n ],\n [\n 123.664199,\n 43.26234\n ],\n [\n 123.676916,\n 43.224132\n ],\n [\n 123.646279,\n 43.213283\n ],\n [\n 123.667956,\n 43.18089\n ],\n [\n 123.636163,\n 43.141462\n ],\n [\n 123.626336,\n 43.079427\n ],\n [\n 123.572576,\n 43.004601\n ],\n [\n 123.537603,\n 43.007114\n ],\n [\n 123.471993,\n 43.042779\n ],\n [\n 123.321986,\n 43.000749\n ],\n [\n 123.258977,\n 42.993043\n ],\n [\n 123.184118,\n 42.925995\n ],\n [\n 123.188742,\n 42.895799\n ],\n [\n 123.169955,\n 42.859713\n ],\n [\n 123.227473,\n 42.83234\n ],\n [\n 123.115907,\n 42.800419\n ],\n [\n 123.058389,\n 42.769153\n ],\n [\n 122.980351,\n 42.777559\n ],\n [\n 122.945956,\n 42.753682\n ],\n [\n 122.928904,\n 42.772179\n ],\n [\n 122.887283,\n 42.770162\n ],\n [\n 122.850865,\n 42.714315\n ],\n [\n 122.732362,\n 42.786469\n ],\n [\n 122.625132,\n 42.773188\n ],\n [\n 122.58091,\n 42.789662\n ],\n [\n 122.563857,\n 42.825957\n ],\n [\n 122.436973,\n 42.842921\n ],\n [\n 122.358356,\n 42.835868\n ],\n [\n 122.349974,\n 42.82159\n ],\n [\n 122.374831,\n 42.774869\n ],\n [\n 122.46154,\n 42.758055\n ],\n [\n 122.399688,\n 42.712128\n ],\n [\n 122.398531,\n 42.68671\n ],\n [\n 122.341303,\n 42.671219\n ],\n [\n 122.259507,\n 42.696643\n ],\n [\n 122.203724,\n 42.732151\n ],\n [\n 122.19621,\n 42.690919\n ],\n [\n 122.133201,\n 42.689404\n ],\n [\n 122.060943,\n 42.723402\n ],\n [\n 122.018745,\n 42.699168\n ],\n [\n 121.940417,\n 42.688562\n ],\n [\n 121.916139,\n 42.65724\n ],\n [\n 121.921341,\n 42.606181\n ],\n [\n 121.869315,\n 42.527911\n ],\n [\n 121.828851,\n 42.531962\n ],\n [\n 121.747344,\n 42.484516\n ],\n [\n 121.711215,\n 42.443627\n ],\n [\n 121.666127,\n 42.437204\n ],\n [\n 121.637802,\n 42.480462\n ],\n [\n 121.605141,\n 42.493974\n ],\n [\n 121.607742,\n 42.516094\n ],\n [\n 121.570168,\n 42.486881\n ],\n [\n 121.506292,\n 42.482489\n ],\n [\n 121.478834,\n 42.496339\n ],\n [\n 121.433746,\n 42.475395\n ],\n [\n 121.385188,\n 42.473029\n ],\n [\n 121.304549,\n 42.435683\n ],\n [\n 121.284895,\n 42.387826\n ],\n [\n 121.218706,\n 42.371922\n ],\n [\n 121.121592,\n 42.280989\n ],\n [\n 121.087197,\n 42.278447\n ],\n [\n 121.069277,\n 42.252683\n ],\n [\n 121.028813,\n 42.24251\n ],\n [\n 120.936034,\n 42.279803\n ],\n [\n 120.886032,\n 42.270651\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 150600,\n \"name\": \"鄂尔多斯市\",\n \"center\": [\n 109.99029,\n 39.817179\n ],\n \"centroid\": [\n 108.63473,\n 39.427784\n ],\n \"childrenNum\": 9,\n \"level\": \"city\",\n \"subFeatureIndex\": 5,\n \"acroutes\": [\n 100000,\n 150000\n ],\n \"parent\": {\n \"adcode\": 150000\n }\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 110.74104,\n 39.349509\n ],\n [\n 110.739595,\n 39.348977\n ],\n [\n 110.732947,\n 39.308406\n ],\n [\n 110.702888,\n 39.273839\n ],\n [\n 110.626294,\n 39.266747\n ],\n [\n 110.566754,\n 39.319924\n ],\n [\n 110.559239,\n 39.352165\n ],\n [\n 110.524266,\n 39.382799\n ],\n [\n 110.482646,\n 39.360666\n ],\n [\n 110.430042,\n 39.379258\n ],\n [\n 110.429175,\n 39.342069\n ],\n [\n 110.391023,\n 39.311773\n ],\n [\n 110.340443,\n 39.341715\n ],\n [\n 110.243328,\n 39.423681\n ],\n [\n 110.152572,\n 39.453929\n ],\n [\n 110.132051,\n 39.446855\n ],\n [\n 110.136676,\n 39.391827\n ],\n [\n 110.158931,\n 39.389526\n ],\n [\n 110.203153,\n 39.315317\n ],\n [\n 110.210957,\n 39.281463\n ],\n [\n 110.110663,\n 39.249721\n ],\n [\n 110.010947,\n 39.20856\n ],\n [\n 109.962679,\n 39.211932\n ],\n [\n 109.902849,\n 39.271889\n ],\n [\n 109.869033,\n 39.249721\n ],\n [\n 109.960367,\n 39.186727\n ],\n [\n 109.89389,\n 39.141265\n ],\n [\n 109.922215,\n 39.106972\n ],\n [\n 109.860073,\n 39.124387\n ],\n [\n 109.757467,\n 39.053455\n ],\n [\n 109.725384,\n 39.018407\n ],\n [\n 109.665266,\n 38.981739\n ],\n [\n 109.683764,\n 38.935611\n ],\n [\n 109.624513,\n 38.854502\n ],\n [\n 109.549653,\n 38.805791\n ],\n [\n 109.517282,\n 38.833808\n ],\n [\n 109.450805,\n 38.788833\n ],\n [\n 109.40167,\n 38.716314\n ],\n [\n 109.338661,\n 38.701479\n ],\n [\n 109.328834,\n 38.660534\n ],\n [\n 109.367564,\n 38.629766\n ],\n [\n 109.331435,\n 38.59791\n ],\n [\n 109.276808,\n 38.622966\n ],\n [\n 109.196747,\n 38.552607\n ],\n [\n 109.175936,\n 38.518746\n ],\n [\n 109.052231,\n 38.42855\n ],\n [\n 109.051364,\n 38.385295\n ],\n [\n 109.00772,\n 38.359078\n ],\n [\n 108.961764,\n 38.265087\n ],\n [\n 108.975927,\n 38.245122\n ],\n [\n 108.938931,\n 38.209497\n ],\n [\n 108.967545,\n 38.152784\n ],\n [\n 109.068995,\n 38.091161\n ],\n [\n 109.050786,\n 38.054919\n ],\n [\n 109.069573,\n 38.02299\n ],\n [\n 109.038068,\n 38.021546\n ],\n [\n 109.017547,\n 37.969924\n ],\n [\n 108.982574,\n 37.963784\n ],\n [\n 108.974193,\n 37.931815\n ],\n [\n 108.935751,\n 37.921698\n ],\n [\n 108.893842,\n 37.978229\n ],\n [\n 108.882859,\n 38.013787\n ],\n [\n 108.830544,\n 38.049869\n ],\n [\n 108.797595,\n 38.047885\n ],\n [\n 108.826787,\n 37.995198\n ],\n [\n 108.798173,\n 37.933622\n ],\n [\n 108.793259,\n 37.815925\n ],\n [\n 108.784588,\n 37.764701\n ],\n [\n 108.792103,\n 37.700214\n ],\n [\n 108.777651,\n 37.683539\n ],\n [\n 108.611169,\n 37.654169\n ],\n [\n 108.532553,\n 37.690608\n ],\n [\n 108.422432,\n 37.64891\n ],\n [\n 108.301039,\n 37.640749\n ],\n [\n 108.246412,\n 37.665774\n ],\n [\n 108.19352,\n 37.63821\n ],\n [\n 108.133979,\n 37.622066\n ],\n [\n 108.013164,\n 37.665592\n ],\n [\n 108.024436,\n 37.698764\n ],\n [\n 107.993221,\n 37.735363\n ],\n [\n 107.981949,\n 37.787331\n ],\n [\n 107.884834,\n 37.808325\n ],\n [\n 107.842636,\n 37.828951\n ],\n [\n 107.741186,\n 37.845412\n ],\n [\n 107.68338,\n 37.887722\n ],\n [\n 107.650141,\n 37.864581\n ],\n [\n 107.560541,\n 37.893687\n ],\n [\n 107.492619,\n 37.944821\n ],\n [\n 107.450132,\n 37.933261\n ],\n [\n 107.41169,\n 37.949156\n ],\n [\n 107.440015,\n 37.995017\n ],\n [\n 107.39377,\n 38.01505\n ],\n [\n 107.331629,\n 38.086474\n ],\n [\n 107.242318,\n 38.110626\n ],\n [\n 107.190293,\n 38.154045\n ],\n [\n 107.138845,\n 38.160709\n ],\n [\n 107.125839,\n 38.137113\n ],\n [\n 107.068899,\n 38.139095\n ],\n [\n 107.014851,\n 38.120357\n ],\n [\n 106.945194,\n 38.131708\n ],\n [\n 106.755879,\n 38.181236\n ],\n [\n 106.728132,\n 38.204098\n ],\n [\n 106.627838,\n 38.23253\n ],\n [\n 106.555291,\n 38.263828\n ],\n [\n 106.482455,\n 38.319556\n ],\n [\n 106.504711,\n 38.332852\n ],\n [\n 106.511358,\n 38.336804\n ],\n [\n 106.601825,\n 38.392476\n ],\n [\n 106.648648,\n 38.472676\n ],\n [\n 106.662522,\n 38.60149\n ],\n [\n 106.702697,\n 38.708271\n ],\n [\n 106.755879,\n 38.748474\n ],\n [\n 106.837386,\n 38.847545\n ],\n [\n 106.954443,\n 38.941134\n ],\n [\n 106.971496,\n 39.016983\n ],\n [\n 106.967739,\n 39.052388\n ],\n [\n 107.033349,\n 39.036734\n ],\n [\n 107.06283,\n 39.061458\n ],\n [\n 107.077859,\n 39.045273\n ],\n [\n 107.087976,\n 39.113903\n ],\n [\n 107.103583,\n 39.136113\n ],\n [\n 107.11659,\n 39.205365\n ],\n [\n 107.139134,\n 39.226127\n ],\n [\n 107.136533,\n 39.27969\n ],\n [\n 107.060229,\n 39.222401\n ],\n [\n 107.034505,\n 39.251318\n ],\n [\n 106.943749,\n 39.299367\n ],\n [\n 106.952131,\n 39.409171\n ],\n [\n 106.965426,\n 39.420142\n ],\n [\n 106.935945,\n 39.517213\n ],\n [\n 106.931899,\n 39.576732\n ],\n [\n 106.911956,\n 39.627027\n ],\n [\n 106.875827,\n 39.672526\n ],\n [\n 106.91369,\n 39.682046\n ],\n [\n 106.899238,\n 39.755687\n ],\n [\n 106.875827,\n 39.795822\n ],\n [\n 106.9345,\n 39.858794\n ],\n [\n 106.965137,\n 39.859673\n ],\n [\n 106.963403,\n 39.902383\n ],\n [\n 106.933922,\n 39.914506\n ],\n [\n 106.871491,\n 39.865475\n ],\n [\n 106.86282,\n 39.842793\n ],\n [\n 106.778712,\n 39.811131\n ],\n [\n 106.768885,\n 39.86653\n ],\n [\n 106.754145,\n 39.850706\n ],\n [\n 106.696049,\n 39.890258\n ],\n [\n 106.723796,\n 39.932422\n ],\n [\n 106.704142,\n 39.967364\n ],\n [\n 106.720039,\n 39.993163\n ],\n [\n 106.718016,\n 40.047363\n ],\n [\n 106.759347,\n 40.083647\n ],\n [\n 106.801546,\n 40.10187\n ],\n [\n 106.866578,\n 40.181012\n ],\n [\n 106.922939,\n 40.196934\n ],\n [\n 106.948663,\n 40.234887\n ],\n [\n 106.99722,\n 40.262333\n ],\n [\n 107.013116,\n 40.314572\n ],\n [\n 107.055026,\n 40.332733\n ],\n [\n 107.044043,\n 40.35403\n ],\n [\n 107.114277,\n 40.366945\n ],\n [\n 107.15214,\n 40.410907\n ],\n [\n 107.147227,\n 40.464251\n ],\n [\n 107.18509,\n 40.471744\n ],\n [\n 107.203877,\n 40.505712\n ],\n [\n 107.1611,\n 40.525388\n ],\n [\n 107.169193,\n 40.598295\n ],\n [\n 107.230757,\n 40.577423\n ],\n [\n 107.250989,\n 40.58299\n ],\n [\n 107.286829,\n 40.650969\n ],\n [\n 107.392325,\n 40.644887\n ],\n [\n 107.455334,\n 40.680677\n ],\n [\n 107.485104,\n 40.711067\n ],\n [\n 107.526725,\n 40.701344\n ],\n [\n 107.584531,\n 40.739707\n ],\n [\n 107.612567,\n 40.778049\n ],\n [\n 107.603896,\n 40.798685\n ],\n [\n 107.653609,\n 40.772845\n ],\n [\n 107.679622,\n 40.780824\n ],\n [\n 107.681067,\n 40.817235\n ],\n [\n 107.738874,\n 40.874758\n ],\n [\n 107.747545,\n 40.860728\n ],\n [\n 107.821247,\n 40.835779\n ],\n [\n 107.856509,\n 40.874585\n ],\n [\n 107.899575,\n 40.849295\n ],\n [\n 107.972122,\n 40.862287\n ],\n [\n 108.000447,\n 40.846003\n ],\n [\n 108.088601,\n 40.832314\n ],\n [\n 108.125308,\n 40.842711\n ],\n [\n 108.182247,\n 40.888092\n ],\n [\n 108.211439,\n 40.850681\n ],\n [\n 108.211728,\n 40.820875\n ],\n [\n 108.288033,\n 40.819661\n ],\n [\n 108.338902,\n 40.801633\n ],\n [\n 108.421565,\n 40.80666\n ],\n [\n 108.468388,\n 40.785159\n ],\n [\n 108.483129,\n 40.75463\n ],\n [\n 108.580243,\n 40.710893\n ],\n [\n 108.591804,\n 40.658962\n ],\n [\n 108.656547,\n 40.667128\n ],\n [\n 108.720134,\n 40.619161\n ],\n [\n 108.762622,\n 40.62681\n ],\n [\n 108.778229,\n 40.567158\n ],\n [\n 108.831122,\n 40.541577\n ],\n [\n 108.870141,\n 40.570464\n ],\n [\n 108.92737,\n 40.552194\n ],\n [\n 108.925635,\n 40.533048\n ],\n [\n 108.997604,\n 40.530088\n ],\n [\n 108.998182,\n 40.55724\n ],\n [\n 109.053387,\n 40.550801\n ],\n [\n 109.088938,\n 40.532699\n ],\n [\n 109.157149,\n 40.53357\n ],\n [\n 109.322475,\n 40.484636\n ],\n [\n 109.419879,\n 40.473312\n ],\n [\n 109.437509,\n 40.513722\n ],\n [\n 109.519883,\n 40.514244\n ],\n [\n 109.580291,\n 40.553586\n ],\n [\n 109.635496,\n 40.546798\n ],\n [\n 109.667,\n 40.500139\n ],\n [\n 109.708621,\n 40.477494\n ],\n [\n 109.802267,\n 40.509717\n ],\n [\n 109.866143,\n 40.509891\n ],\n [\n 109.910075,\n 40.532003\n ],\n [\n 109.996207,\n 40.510588\n ],\n [\n 110.035804,\n 40.534266\n ],\n [\n 110.164712,\n 40.513722\n ],\n [\n 110.18321,\n 40.554282\n ],\n [\n 110.247953,\n 40.521209\n ],\n [\n 110.249398,\n 40.475054\n ],\n [\n 110.296799,\n 40.492823\n ],\n [\n 110.319054,\n 40.445777\n ],\n [\n 110.357495,\n 40.462509\n ],\n [\n 110.369057,\n 40.444383\n ],\n [\n 110.45172,\n 40.391896\n ],\n [\n 110.472241,\n 40.404978\n ],\n [\n 110.488137,\n 40.369563\n ],\n [\n 110.510971,\n 40.389279\n ],\n [\n 110.570222,\n 40.340589\n ],\n [\n 110.636699,\n 40.308634\n ],\n [\n 110.702021,\n 40.325399\n ],\n [\n 110.768787,\n 40.299726\n ],\n [\n 110.782371,\n 40.274042\n ],\n [\n 110.816477,\n 40.266178\n ],\n [\n 110.837287,\n 40.289943\n ],\n [\n 110.914458,\n 40.244678\n ],\n [\n 110.945963,\n 40.270373\n ],\n [\n 110.999144,\n 40.26111\n ],\n [\n 111.032961,\n 40.296931\n ],\n [\n 111.05406,\n 40.264605\n ],\n [\n 111.115624,\n 40.255866\n ],\n [\n 111.190483,\n 40.216525\n ],\n [\n 111.248289,\n 40.164561\n ],\n [\n 111.314188,\n 40.150557\n ],\n [\n 111.360433,\n 40.10187\n ],\n [\n 111.420263,\n 40.02211\n ],\n [\n 111.426332,\n 39.949983\n ],\n [\n 111.445409,\n 39.899045\n ],\n [\n 111.41506,\n 39.864772\n ],\n [\n 111.417083,\n 39.829778\n ],\n [\n 111.371417,\n 39.791775\n ],\n [\n 111.365058,\n 39.721166\n ],\n [\n 111.440784,\n 39.672526\n ],\n [\n 111.438183,\n 39.640433\n ],\n [\n 111.426622,\n 39.50343\n ],\n [\n 111.364191,\n 39.467368\n ],\n [\n 111.352341,\n 39.426689\n ],\n [\n 111.289332,\n 39.417134\n ],\n [\n 111.21216,\n 39.425627\n ],\n [\n 111.145394,\n 39.409525\n ],\n [\n 111.108109,\n 39.356593\n ],\n [\n 111.097993,\n 39.401915\n ],\n [\n 111.064466,\n 39.400854\n ],\n [\n 111.058396,\n 39.447739\n ],\n [\n 111.108976,\n 39.474264\n ],\n [\n 111.106375,\n 39.498481\n ],\n [\n 111.148863,\n 39.53223\n ],\n [\n 111.154932,\n 39.568964\n ],\n [\n 111.134411,\n 39.586441\n ],\n [\n 111.100883,\n 39.559429\n ],\n [\n 111.043655,\n 39.554661\n ],\n [\n 111.041054,\n 39.567728\n ],\n [\n 110.959258,\n 39.51951\n ],\n [\n 110.890758,\n 39.508908\n ],\n [\n 110.808095,\n 39.411826\n ],\n [\n 110.74104,\n 39.349509\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 150700,\n \"name\": \"呼伦贝尔市\",\n \"center\": [\n 119.758168,\n 49.215333\n ],\n \"centroid\": [\n 120.886666,\n 49.619014\n ],\n \"childrenNum\": 14,\n \"level\": \"city\",\n \"subFeatureIndex\": 6,\n \"acroutes\": [\n 100000,\n 150000\n ],\n \"parent\": {\n \"adcode\": 150000\n }\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 119.486254,\n 47.336721\n ],\n [\n 119.444633,\n 47.371014\n ],\n [\n 119.386827,\n 47.397532\n ],\n [\n 119.351565,\n 47.432095\n ],\n [\n 119.322084,\n 47.427136\n ],\n [\n 119.365728,\n 47.477472\n ],\n [\n 119.205316,\n 47.520335\n ],\n [\n 119.152134,\n 47.540594\n ],\n [\n 119.134214,\n 47.664452\n ],\n [\n 118.773214,\n 47.771085\n ],\n [\n 118.568002,\n 47.99213\n ],\n [\n 118.455858,\n 47.996268\n ],\n [\n 118.424354,\n 48.014811\n ],\n [\n 118.329841,\n 48.006077\n ],\n [\n 118.27637,\n 48.009295\n ],\n [\n 118.240241,\n 48.040544\n ],\n [\n 118.107576,\n 48.031049\n ],\n [\n 118.015375,\n 48.012053\n ],\n [\n 117.926353,\n 48.015883\n ],\n [\n 117.886756,\n 48.025228\n ],\n [\n 117.813342,\n 48.01619\n ],\n [\n 117.528935,\n 47.782937\n ],\n [\n 117.493674,\n 47.758461\n ],\n [\n 117.384131,\n 47.641154\n ],\n [\n 117.094811,\n 47.824013\n ],\n [\n 116.879193,\n 47.893936\n ],\n [\n 116.791328,\n 47.897622\n ],\n [\n 116.669935,\n 47.890557\n ],\n [\n 116.452872,\n 47.837544\n ],\n [\n 116.265869,\n 47.876733\n ],\n [\n 116.110949,\n 47.811709\n ],\n [\n 115.968167,\n 47.689897\n ],\n [\n 115.938975,\n 47.683113\n ],\n [\n 115.580577,\n 47.921725\n ],\n [\n 115.529418,\n 48.15527\n ],\n [\n 115.822785,\n 48.259372\n ],\n [\n 115.799373,\n 48.515059\n ],\n [\n 115.830299,\n 48.560101\n ],\n [\n 116.078288,\n 48.822421\n ],\n [\n 116.048518,\n 48.873516\n ],\n [\n 116.350845,\n 49.317592\n ],\n [\n 116.717914,\n 49.847284\n ],\n [\n 116.736701,\n 49.847579\n ],\n [\n 117.069087,\n 49.695514\n ],\n [\n 117.278056,\n 49.636364\n ],\n [\n 117.485003,\n 49.6331\n ],\n [\n 117.638189,\n 49.574914\n ],\n [\n 117.809585,\n 49.521268\n ],\n [\n 117.849471,\n 49.551442\n ],\n [\n 117.866524,\n 49.59214\n ],\n [\n 117.950921,\n 49.596\n ],\n [\n 117.980691,\n 49.621231\n ],\n [\n 118.082719,\n 49.616631\n ],\n [\n 118.118848,\n 49.666467\n ],\n [\n 118.154688,\n 49.66024\n ],\n [\n 118.185325,\n 49.687809\n ],\n [\n 118.205846,\n 49.684697\n ],\n [\n 118.220876,\n 49.730022\n ],\n [\n 118.282439,\n 49.74364\n ],\n [\n 118.315967,\n 49.767168\n ],\n [\n 118.388514,\n 49.785952\n ],\n [\n 118.402387,\n 49.811381\n ],\n [\n 118.385334,\n 49.826898\n ],\n [\n 118.469732,\n 49.825716\n ],\n [\n 118.496033,\n 49.84625\n ],\n [\n 118.485917,\n 49.866923\n ],\n [\n 118.523202,\n 49.881093\n ],\n [\n 118.572916,\n 49.930952\n ],\n [\n 118.617715,\n 49.927856\n ],\n [\n 118.651243,\n 49.950852\n ],\n [\n 118.741999,\n 49.946578\n ],\n [\n 118.763098,\n 49.959694\n ],\n [\n 118.96542,\n 49.98886\n ],\n [\n 119.050395,\n 49.980613\n ],\n [\n 119.091437,\n 49.985768\n ],\n [\n 119.123809,\n 50.018156\n ],\n [\n 119.188263,\n 50.054493\n ],\n [\n 119.189997,\n 50.085365\n ],\n [\n 119.234797,\n 50.074783\n ],\n [\n 119.290291,\n 50.121651\n ],\n [\n 119.309656,\n 50.161285\n ],\n [\n 119.34434,\n 50.163192\n ],\n [\n 119.359658,\n 50.197074\n ],\n [\n 119.318616,\n 50.220381\n ],\n [\n 119.340004,\n 50.243823\n ],\n [\n 119.347808,\n 50.298135\n ],\n [\n 119.386827,\n 50.321685\n ],\n [\n 119.358502,\n 50.358961\n ],\n [\n 119.277284,\n 50.365974\n ],\n [\n 119.237109,\n 50.346539\n ],\n [\n 119.23393,\n 50.365098\n ],\n [\n 119.195489,\n 50.349316\n ],\n [\n 119.155602,\n 50.364659\n ],\n [\n 119.176702,\n 50.378683\n ],\n [\n 119.126699,\n 50.391243\n ],\n [\n 119.164851,\n 50.422482\n ],\n [\n 119.206761,\n 50.410368\n ],\n [\n 119.239999,\n 50.459095\n ],\n [\n 119.264567,\n 50.469447\n ],\n [\n 119.238265,\n 50.505587\n ],\n [\n 119.262544,\n 50.510831\n ],\n [\n 119.26659,\n 50.56091\n ],\n [\n 119.299251,\n 50.583893\n ],\n [\n 119.282487,\n 50.604831\n ],\n [\n 119.361393,\n 50.632732\n ],\n [\n 119.394053,\n 50.667296\n ],\n [\n 119.387405,\n 50.682827\n ],\n [\n 119.433072,\n 50.684568\n ],\n [\n 119.496659,\n 50.745478\n ],\n [\n 119.515735,\n 50.814125\n ],\n [\n 119.498971,\n 50.827726\n ],\n [\n 119.491457,\n 50.878913\n ],\n [\n 119.569784,\n 50.933797\n ],\n [\n 119.598687,\n 50.984723\n ],\n [\n 119.629902,\n 51.008508\n ],\n [\n 119.683084,\n 51.018883\n ],\n [\n 119.725572,\n 51.049562\n ],\n [\n 119.722681,\n 51.076192\n ],\n [\n 119.764302,\n 51.092594\n ],\n [\n 119.785112,\n 51.163603\n ],\n [\n 119.760255,\n 51.213272\n ],\n [\n 119.786268,\n 51.225466\n ],\n [\n 119.82153,\n 51.21442\n ],\n [\n 119.797251,\n 51.247121\n ],\n [\n 119.827889,\n 51.263749\n ],\n [\n 119.810836,\n 51.278508\n ],\n [\n 119.879336,\n 51.2967\n ],\n [\n 119.883961,\n 51.336927\n ],\n [\n 119.922402,\n 51.345225\n ],\n [\n 119.945813,\n 51.365965\n ],\n [\n 119.912864,\n 51.375259\n ],\n [\n 119.922113,\n 51.396557\n ],\n [\n 119.971248,\n 51.400415\n ],\n [\n 119.982809,\n 51.444976\n ],\n [\n 120.002464,\n 51.459392\n ],\n [\n 119.987145,\n 51.506604\n ],\n [\n 120.017204,\n 51.521143\n ],\n [\n 120.052466,\n 51.560887\n ],\n [\n 120.035124,\n 51.585799\n ],\n [\n 120.06605,\n 51.639135\n ],\n [\n 120.102179,\n 51.650221\n ],\n [\n 120.094375,\n 51.682043\n ],\n [\n 120.172414,\n 51.679913\n ],\n [\n 120.226174,\n 51.717674\n ],\n [\n 120.293518,\n 51.750724\n ],\n [\n 120.311149,\n 51.781767\n ],\n [\n 120.363463,\n 51.789985\n ],\n [\n 120.406818,\n 51.81647\n ],\n [\n 120.400459,\n 51.833457\n ],\n [\n 120.459422,\n 51.845062\n ],\n [\n 120.496996,\n 51.88735\n ],\n [\n 120.533414,\n 51.87915\n ],\n [\n 120.547865,\n 51.907137\n ],\n [\n 120.660876,\n 51.929458\n ],\n [\n 120.661165,\n 51.955578\n ],\n [\n 120.701341,\n 51.980555\n ],\n [\n 120.71955,\n 52.010171\n ],\n [\n 120.686022,\n 52.034976\n ],\n [\n 120.698739,\n 52.056107\n ],\n [\n 120.769552,\n 52.114093\n ],\n [\n 120.763193,\n 52.142777\n ],\n [\n 120.785738,\n 52.165542\n ],\n [\n 120.747008,\n 52.20402\n ],\n [\n 120.758569,\n 52.256346\n ],\n [\n 120.717526,\n 52.260833\n ],\n [\n 120.696138,\n 52.289842\n ],\n [\n 120.628505,\n 52.322753\n ],\n [\n 120.624169,\n 52.361514\n ],\n [\n 120.649315,\n 52.363752\n ],\n [\n 120.648448,\n 52.389619\n ],\n [\n 120.690069,\n 52.430416\n ],\n [\n 120.683132,\n 52.466571\n ],\n [\n 120.706543,\n 52.490147\n ],\n [\n 120.692959,\n 52.518309\n ],\n [\n 120.73429,\n 52.536842\n ],\n [\n 120.629372,\n 52.570265\n ],\n [\n 120.596711,\n 52.592811\n ],\n [\n 120.561161,\n 52.595594\n ],\n [\n 120.4837,\n 52.630084\n ],\n [\n 120.437166,\n 52.639675\n ],\n [\n 120.396702,\n 52.616319\n ],\n [\n 120.286292,\n 52.622993\n ],\n [\n 120.185998,\n 52.579312\n ],\n [\n 120.080502,\n 52.585436\n ],\n [\n 120.049287,\n 52.598515\n ],\n [\n 120.035124,\n 52.646346\n ],\n [\n 120.070675,\n 52.707587\n ],\n [\n 120.031367,\n 52.772762\n ],\n [\n 120.099,\n 52.787309\n ],\n [\n 120.141198,\n 52.812927\n ],\n [\n 120.187732,\n 52.807943\n ],\n [\n 120.222416,\n 52.842819\n ],\n [\n 120.296986,\n 52.869926\n ],\n [\n 120.294963,\n 52.890659\n ],\n [\n 120.344676,\n 52.900884\n ],\n [\n 120.363174,\n 52.941345\n ],\n [\n 120.408263,\n 52.956387\n ],\n [\n 120.453063,\n 53.010028\n ],\n [\n 120.529078,\n 53.045981\n ],\n [\n 120.541507,\n 53.070346\n ],\n [\n 120.611163,\n 53.100336\n ],\n [\n 120.642089,\n 53.105149\n ],\n [\n 120.660009,\n 53.137038\n ],\n [\n 120.686889,\n 53.142396\n ],\n [\n 120.690936,\n 53.172611\n ],\n [\n 120.748164,\n 53.210349\n ],\n [\n 120.814063,\n 53.239692\n ],\n [\n 120.840076,\n 53.241063\n ],\n [\n 120.822734,\n 53.270112\n ],\n [\n 120.93112,\n 53.286957\n ],\n [\n 120.954821,\n 53.298594\n ],\n [\n 121.047022,\n 53.288874\n ],\n [\n 121.096735,\n 53.307354\n ],\n [\n 121.129396,\n 53.277371\n ],\n [\n 121.153674,\n 53.285314\n ],\n [\n 121.234603,\n 53.280932\n ],\n [\n 121.285473,\n 53.291338\n ],\n [\n 121.329405,\n 53.322816\n ],\n [\n 121.416115,\n 53.319395\n ],\n [\n 121.499356,\n 53.337178\n ],\n [\n 121.511495,\n 53.31748\n ],\n [\n 121.579706,\n 53.289285\n ],\n [\n 121.615257,\n 53.259016\n ],\n [\n 121.648207,\n 53.260797\n ],\n [\n 121.678844,\n 53.241337\n ],\n [\n 121.679133,\n 53.199511\n ],\n [\n 121.665259,\n 53.170551\n ],\n [\n 121.719597,\n 53.146243\n ],\n [\n 121.753125,\n 53.147342\n ],\n [\n 121.784629,\n 53.104599\n ],\n [\n 121.775669,\n 53.089746\n ],\n [\n 121.814978,\n 53.069108\n ],\n [\n 121.785496,\n 53.018571\n ],\n [\n 121.715551,\n 52.998037\n ],\n [\n 121.677399,\n 52.948108\n ],\n [\n 121.662369,\n 52.912487\n ],\n [\n 121.610344,\n 52.892317\n ],\n [\n 121.620171,\n 52.851119\n ],\n [\n 121.591268,\n 52.824693\n ],\n [\n 121.482014,\n 52.774286\n ],\n [\n 121.454845,\n 52.735333\n ],\n [\n 121.373049,\n 52.683157\n ],\n [\n 121.321023,\n 52.678852\n ],\n [\n 121.292698,\n 52.651765\n ],\n [\n 121.182289,\n 52.596289\n ],\n [\n 121.232002,\n 52.577642\n ],\n [\n 121.277091,\n 52.587662\n ],\n [\n 121.325648,\n 52.572631\n ],\n [\n 121.353106,\n 52.535728\n ],\n [\n 121.409756,\n 52.523466\n ],\n [\n 121.416404,\n 52.49935\n ],\n [\n 121.49502,\n 52.484847\n ],\n [\n 121.518721,\n 52.456663\n ],\n [\n 121.565255,\n 52.460292\n ],\n [\n 121.5904,\n 52.443123\n ],\n [\n 121.640114,\n 52.444379\n ],\n [\n 121.678844,\n 52.419801\n ],\n [\n 121.658612,\n 52.390318\n ],\n [\n 121.715551,\n 52.343047\n ],\n [\n 121.714106,\n 52.318133\n ],\n [\n 121.769311,\n 52.308191\n ],\n [\n 121.841279,\n 52.282697\n ],\n [\n 121.90082,\n 52.280595\n ],\n [\n 121.947643,\n 52.298387\n ],\n [\n 121.976835,\n 52.343747\n ],\n [\n 122.035508,\n 52.377596\n ],\n [\n 122.040422,\n 52.413096\n ],\n [\n 122.091291,\n 52.427204\n ],\n [\n 122.16933,\n 52.51357\n ],\n [\n 122.207771,\n 52.469222\n ],\n [\n 122.310377,\n 52.475222\n ],\n [\n 122.34217,\n 52.414074\n ],\n [\n 122.367027,\n 52.413794\n ],\n [\n 122.416451,\n 52.37424\n ],\n [\n 122.439863,\n 52.393672\n ],\n [\n 122.484085,\n 52.341508\n ],\n [\n 122.478304,\n 52.296286\n ],\n [\n 122.560678,\n 52.282557\n ],\n [\n 122.585824,\n 52.26644\n ],\n [\n 122.678892,\n 52.276671\n ],\n [\n 122.710685,\n 52.256206\n ],\n [\n 122.760976,\n 52.26686\n ],\n [\n 122.787278,\n 52.252701\n ],\n [\n 122.766179,\n 52.232646\n ],\n [\n 122.769358,\n 52.179729\n ],\n [\n 122.738143,\n 52.153458\n ],\n [\n 122.690742,\n 52.140387\n ],\n [\n 122.629178,\n 52.136592\n ],\n [\n 122.643919,\n 52.111702\n ],\n [\n 122.625132,\n 52.067513\n ],\n [\n 122.650567,\n 52.059064\n ],\n [\n 122.665018,\n 51.99875\n ],\n [\n 122.683805,\n 51.974489\n ],\n [\n 122.726293,\n 51.978862\n ],\n [\n 122.729472,\n 51.919288\n ],\n [\n 122.706061,\n 51.890177\n ],\n [\n 122.725715,\n 51.87816\n ],\n [\n 122.732651,\n 51.832608\n ],\n [\n 122.77196,\n 51.7795\n ],\n [\n 122.749993,\n 51.747746\n ],\n [\n 122.77485,\n 51.703907\n ],\n [\n 122.816181,\n 51.655195\n ],\n [\n 122.820806,\n 51.633165\n ],\n [\n 122.856357,\n 51.606714\n ],\n [\n 122.832656,\n 51.581672\n ],\n [\n 122.873988,\n 51.561172\n ],\n [\n 122.880057,\n 51.511023\n ],\n [\n 122.854623,\n 51.477655\n ],\n [\n 122.900289,\n 51.445261\n ],\n [\n 122.898555,\n 51.422558\n ],\n [\n 122.965899,\n 51.386981\n ],\n [\n 122.960119,\n 51.361675\n ],\n [\n 122.978039,\n 51.331489\n ],\n [\n 123.014457,\n 51.310018\n ],\n [\n 123.059257,\n 51.3219\n ],\n [\n 123.15377,\n 51.300853\n ],\n [\n 123.231519,\n 51.268621\n ],\n [\n 123.294239,\n 51.254145\n ],\n [\n 123.339617,\n 51.27249\n ],\n [\n 123.4402,\n 51.270914\n ],\n [\n 123.465345,\n 51.28739\n ],\n [\n 123.588472,\n 51.142484\n ],\n [\n 123.736456,\n 50.974052\n ],\n [\n 123.772007,\n 50.906507\n ],\n [\n 123.792817,\n 50.891773\n ],\n [\n 123.795419,\n 50.83033\n ],\n [\n 123.825767,\n 50.813835\n ],\n [\n 123.872301,\n 50.765185\n ],\n [\n 124.027511,\n 50.619074\n ],\n [\n 124.020574,\n 50.598143\n ],\n [\n 124.076646,\n 50.564111\n ],\n [\n 124.087051,\n 50.539953\n ],\n [\n 124.026355,\n 50.538352\n ],\n [\n 124.023464,\n 50.51855\n ],\n [\n 123.983578,\n 50.510249\n ],\n [\n 124.003521,\n 50.478922\n ],\n [\n 124.005255,\n 50.434592\n ],\n [\n 123.969994,\n 50.399274\n ],\n [\n 123.939934,\n 50.397376\n ],\n [\n 123.92028,\n 50.372987\n ],\n [\n 123.879527,\n 50.402486\n ],\n [\n 123.840508,\n 50.411536\n ],\n [\n 123.825767,\n 50.449471\n ],\n [\n 123.780389,\n 50.437072\n ],\n [\n 123.787326,\n 50.373717\n ],\n [\n 123.777788,\n 50.344493\n ],\n [\n 123.870278,\n 50.273988\n ],\n [\n 123.862763,\n 50.226389\n ],\n [\n 123.954097,\n 50.186956\n ],\n [\n 124.007568,\n 50.219355\n ],\n [\n 124.061905,\n 50.19898\n ],\n [\n 124.103526,\n 50.222139\n ],\n [\n 124.102659,\n 50.238696\n ],\n [\n 124.189368,\n 50.216864\n ],\n [\n 124.283014,\n 50.230785\n ],\n [\n 124.286483,\n 50.189596\n ],\n [\n 124.327525,\n 50.178449\n ],\n [\n 124.359607,\n 50.199127\n ],\n [\n 124.344289,\n 50.219062\n ],\n [\n 124.368567,\n 50.258176\n ],\n [\n 124.348624,\n 50.292429\n ],\n [\n 124.374059,\n 50.310862\n ],\n [\n 124.347757,\n 50.316566\n ],\n [\n 124.364232,\n 50.360861\n ],\n [\n 124.403829,\n 50.362468\n ],\n [\n 124.439958,\n 50.388615\n ],\n [\n 124.499499,\n 50.398106\n ],\n [\n 124.504701,\n 50.342592\n ],\n [\n 124.578693,\n 50.294623\n ],\n [\n 124.592278,\n 50.243676\n ],\n [\n 124.619735,\n 50.229613\n ],\n [\n 124.575514,\n 50.179623\n ],\n [\n 124.508169,\n 50.162606\n ],\n [\n 124.533315,\n 50.149398\n ],\n [\n 124.555282,\n 50.106229\n ],\n [\n 124.604995,\n 50.07052\n ],\n [\n 124.63939,\n 50.069931\n ],\n [\n 124.680721,\n 50.031693\n ],\n [\n 124.650373,\n 49.99475\n ],\n [\n 124.670894,\n 49.95041\n ],\n [\n 124.66598,\n 49.868104\n ],\n [\n 124.711069,\n 49.82276\n ],\n [\n 124.730723,\n 49.817441\n ],\n [\n 124.720318,\n 49.775008\n ],\n [\n 124.67494,\n 49.774712\n ],\n [\n 124.741418,\n 49.76125\n ],\n [\n 124.82408,\n 49.849942\n ],\n [\n 124.878707,\n 49.834876\n ],\n [\n 124.972642,\n 49.83458\n ],\n [\n 124.97033,\n 49.853339\n ],\n [\n 124.935357,\n 49.866627\n ],\n [\n 124.977267,\n 49.900719\n ],\n [\n 125.0449,\n 49.826898\n ],\n [\n 125.09577,\n 49.795859\n ],\n [\n 125.177855,\n 49.829409\n ],\n [\n 125.222943,\n 49.798964\n ],\n [\n 125.228146,\n 49.774564\n ],\n [\n 125.205313,\n 49.733575\n ],\n [\n 125.224967,\n 49.726468\n ],\n [\n 125.219764,\n 49.669135\n ],\n [\n 125.189994,\n 49.649861\n ],\n [\n 125.164559,\n 49.669431\n ],\n [\n 125.127274,\n 49.655051\n ],\n [\n 125.154154,\n 49.61678\n ],\n [\n 125.168317,\n 49.629985\n ],\n [\n 125.205313,\n 49.59407\n ],\n [\n 125.226412,\n 49.596\n ],\n [\n 125.235661,\n 49.540891\n ],\n [\n 125.212538,\n 49.541337\n ],\n [\n 125.228435,\n 49.48691\n ],\n [\n 125.263986,\n 49.46146\n ],\n [\n 125.257049,\n 49.393976\n ],\n [\n 125.258205,\n 49.314008\n ],\n [\n 125.214851,\n 49.280252\n ],\n [\n 125.233638,\n 49.255442\n ],\n [\n 125.219475,\n 49.189023\n ],\n [\n 125.185369,\n 49.18528\n ],\n [\n 125.160224,\n 49.146342\n ],\n [\n 125.117447,\n 49.125962\n ],\n [\n 125.039409,\n 49.151885\n ],\n [\n 125.039987,\n 49.176297\n ],\n [\n 124.982759,\n 49.16252\n ],\n [\n 124.906454,\n 49.183933\n ],\n [\n 124.860787,\n 49.166564\n ],\n [\n 124.847492,\n 49.129709\n ],\n [\n 124.80934,\n 49.115918\n ],\n [\n 124.828994,\n 49.071974\n ],\n [\n 124.808184,\n 49.020481\n ],\n [\n 124.765407,\n 48.981263\n ],\n [\n 124.744308,\n 48.920496\n ],\n [\n 124.711936,\n 48.921248\n ],\n [\n 124.714827,\n 48.886771\n ],\n [\n 124.697196,\n 48.841871\n ],\n [\n 124.65413,\n 48.834333\n ],\n [\n 124.653552,\n 48.777161\n ],\n [\n 124.613955,\n 48.751193\n ],\n [\n 124.624938,\n 48.700276\n ],\n [\n 124.601816,\n 48.632356\n ],\n [\n 124.578982,\n 48.596468\n ],\n [\n 124.518575,\n 48.554188\n ],\n [\n 124.548923,\n 48.531291\n ],\n [\n 124.534471,\n 48.51779\n ],\n [\n 124.553258,\n 48.46527\n ],\n [\n 124.508748,\n 48.448257\n ],\n [\n 124.526378,\n 48.421664\n ],\n [\n 124.52002,\n 48.374521\n ],\n [\n 124.5469,\n 48.357631\n ],\n [\n 124.541119,\n 48.335253\n ],\n [\n 124.57956,\n 48.297479\n ],\n [\n 124.55875,\n 48.268215\n ],\n [\n 124.578982,\n 48.262116\n ],\n [\n 124.547189,\n 48.200936\n ],\n [\n 124.512505,\n 48.16459\n ],\n [\n 124.531003,\n 48.148699\n ],\n [\n 124.488515,\n 48.126383\n ],\n [\n 124.463948,\n 48.097633\n ],\n [\n 124.416258,\n 48.087995\n ],\n [\n 124.430131,\n 48.121032\n ],\n [\n 124.472619,\n 48.134485\n ],\n [\n 124.476954,\n 48.164131\n ],\n [\n 124.410477,\n 48.190401\n ],\n [\n 124.428397,\n 48.230086\n ],\n [\n 124.404985,\n 48.264251\n ],\n [\n 124.365099,\n 48.284678\n ],\n [\n 124.35585,\n 48.314846\n ],\n [\n 124.318854,\n 48.347128\n ],\n [\n 124.33215,\n 48.379238\n ],\n [\n 124.306715,\n 48.399619\n ],\n [\n 124.330126,\n 48.435646\n ],\n [\n 124.302668,\n 48.456764\n ],\n [\n 124.31423,\n 48.50383\n ],\n [\n 124.259025,\n 48.536447\n ],\n [\n 124.24255,\n 48.522189\n ],\n [\n 124.083294,\n 48.438533\n ],\n [\n 123.979821,\n 48.363718\n ],\n [\n 123.866231,\n 48.27477\n ],\n [\n 123.746283,\n 48.197577\n ],\n [\n 123.705241,\n 48.152061\n ],\n [\n 123.61911,\n 48.077896\n ],\n [\n 123.537603,\n 48.021858\n ],\n [\n 123.300308,\n 47.953642\n ],\n [\n 123.254642,\n 47.874736\n ],\n [\n 123.221692,\n 47.832624\n ],\n [\n 123.165042,\n 47.783091\n ],\n [\n 123.031221,\n 47.741829\n ],\n [\n 122.980929,\n 47.717179\n ],\n [\n 122.857513,\n 47.678333\n ],\n [\n 122.765023,\n 47.61445\n ],\n [\n 122.593049,\n 47.547088\n ],\n [\n 122.543336,\n 47.495426\n ],\n [\n 122.506918,\n 47.401408\n ],\n [\n 122.418186,\n 47.350534\n ],\n [\n 122.308932,\n 47.304271\n ],\n [\n 122.256906,\n 47.260299\n ],\n [\n 122.209505,\n 47.236199\n ],\n [\n 122.146207,\n 47.222201\n ],\n [\n 122.084644,\n 47.180652\n ],\n [\n 122.042156,\n 47.204154\n ],\n [\n 121.840123,\n 47.265739\n ],\n [\n 121.760351,\n 47.280968\n ],\n [\n 121.674219,\n 47.249883\n ],\n [\n 121.639825,\n 47.203064\n ],\n [\n 121.648785,\n 47.179406\n ],\n [\n 121.588955,\n 47.1724\n ],\n [\n 121.551092,\n 47.197773\n ],\n [\n 121.488661,\n 47.183765\n ],\n [\n 121.437503,\n 47.184232\n ],\n [\n 121.368136,\n 47.135175\n ],\n [\n 121.329405,\n 47.136577\n ],\n [\n 121.246453,\n 47.112577\n ],\n [\n 121.172461,\n 47.141251\n ],\n [\n 121.098469,\n 47.151999\n ],\n [\n 121.018119,\n 47.129253\n ],\n [\n 120.976787,\n 47.09652\n ],\n [\n 120.945861,\n 47.099014\n ],\n [\n 120.876494,\n 47.149819\n ],\n [\n 120.823312,\n 47.145613\n ],\n [\n 120.773888,\n 47.176915\n ],\n [\n 120.739204,\n 47.217379\n ],\n [\n 120.623302,\n 47.244285\n ],\n [\n 120.624748,\n 47.300698\n ],\n [\n 120.708277,\n 47.337342\n ],\n [\n 120.733134,\n 47.357672\n ],\n [\n 120.732556,\n 47.384972\n ],\n [\n 120.703364,\n 47.408539\n ],\n [\n 120.725619,\n 47.441545\n ],\n [\n 120.643535,\n 47.506877\n ],\n [\n 120.593532,\n 47.488617\n ],\n [\n 120.582549,\n 47.505329\n ],\n [\n 120.604226,\n 47.532244\n ],\n [\n 120.581104,\n 47.548479\n ],\n [\n 120.525321,\n 47.544769\n ],\n [\n 120.52561,\n 47.574599\n ],\n [\n 120.385719,\n 47.620317\n ],\n [\n 120.344387,\n 47.602405\n ],\n [\n 120.265193,\n 47.65643\n ],\n [\n 120.230509,\n 47.623713\n ],\n [\n 120.200161,\n 47.632975\n ],\n [\n 120.188022,\n 47.615222\n ],\n [\n 120.11403,\n 47.597926\n ],\n [\n 120.023852,\n 47.554044\n ],\n [\n 119.958242,\n 47.581552\n ],\n [\n 119.904482,\n 47.5678\n ],\n [\n 119.853034,\n 47.520954\n ],\n [\n 119.814015,\n 47.49914\n ],\n [\n 119.814304,\n 47.474995\n ],\n [\n 119.764013,\n 47.436123\n ],\n [\n 119.657938,\n 47.410554\n ],\n [\n 119.616896,\n 47.361706\n ],\n [\n 119.486254,\n 47.336721\n ]\n ]\n ],\n [\n [\n [\n 125.177855,\n 49.829409\n ],\n [\n 125.09577,\n 49.795859\n ],\n [\n 125.0449,\n 49.826898\n ],\n [\n 124.977267,\n 49.900719\n ],\n [\n 124.935357,\n 49.866627\n ],\n [\n 124.97033,\n 49.853339\n ],\n [\n 124.972642,\n 49.83458\n ],\n [\n 124.878707,\n 49.834876\n ],\n [\n 124.82408,\n 49.849942\n ],\n [\n 124.741418,\n 49.76125\n ],\n [\n 124.67494,\n 49.774712\n ],\n [\n 124.720318,\n 49.775008\n ],\n [\n 124.730723,\n 49.817441\n ],\n [\n 124.711069,\n 49.82276\n ],\n [\n 124.66598,\n 49.868104\n ],\n [\n 124.670894,\n 49.95041\n ],\n [\n 124.650373,\n 49.99475\n ],\n [\n 124.680721,\n 50.031693\n ],\n [\n 124.63939,\n 50.069931\n ],\n [\n 124.604995,\n 50.07052\n ],\n [\n 124.555282,\n 50.106229\n ],\n [\n 124.533315,\n 50.149398\n ],\n [\n 124.508169,\n 50.162606\n ],\n [\n 124.575514,\n 50.179623\n ],\n [\n 124.619735,\n 50.229613\n ],\n [\n 124.592278,\n 50.243676\n ],\n [\n 124.578693,\n 50.294623\n ],\n [\n 124.504701,\n 50.342592\n ],\n [\n 124.499499,\n 50.398106\n ],\n [\n 124.439958,\n 50.388615\n ],\n [\n 124.416547,\n 50.449617\n ],\n [\n 124.444872,\n 50.476298\n ],\n [\n 124.43331,\n 50.546649\n ],\n [\n 124.393135,\n 50.547522\n ],\n [\n 124.315964,\n 50.532674\n ],\n [\n 124.266539,\n 50.556254\n ],\n [\n 124.183009,\n 50.557709\n ],\n [\n 124.110174,\n 50.569785\n ],\n [\n 124.076646,\n 50.564111\n ],\n [\n 124.020574,\n 50.598143\n ],\n [\n 124.027511,\n 50.619074\n ],\n [\n 123.872301,\n 50.765185\n ],\n [\n 123.825767,\n 50.813835\n ],\n [\n 123.795419,\n 50.83033\n ],\n [\n 123.792817,\n 50.891773\n ],\n [\n 123.772007,\n 50.906507\n ],\n [\n 123.736456,\n 50.974052\n ],\n [\n 123.588472,\n 51.142484\n ],\n [\n 123.465345,\n 51.28739\n ],\n [\n 123.582692,\n 51.294695\n ],\n [\n 123.582403,\n 51.306868\n ],\n [\n 123.661886,\n 51.31918\n ],\n [\n 123.660441,\n 51.342793\n ],\n [\n 123.711022,\n 51.398272\n ],\n [\n 123.794552,\n 51.361246\n ],\n [\n 123.842531,\n 51.367538\n ],\n [\n 123.88762,\n 51.320898\n ],\n [\n 123.926061,\n 51.30071\n ],\n [\n 123.994561,\n 51.322758\n ],\n [\n 124.071733,\n 51.320754\n ],\n [\n 124.090231,\n 51.341362\n ],\n [\n 124.128094,\n 51.347514\n ],\n [\n 124.192548,\n 51.339359\n ],\n [\n 124.239371,\n 51.344653\n ],\n [\n 124.271453,\n 51.308299\n ],\n [\n 124.311628,\n 51.289539\n ],\n [\n 124.339375,\n 51.293406\n ],\n [\n 124.406431,\n 51.27206\n ],\n [\n 124.430131,\n 51.301283\n ],\n [\n 124.426663,\n 51.331918\n ],\n [\n 124.443716,\n 51.358099\n ],\n [\n 124.49025,\n 51.380406\n ],\n [\n 124.55586,\n 51.375402\n ],\n [\n 124.587075,\n 51.363677\n ],\n [\n 124.624649,\n 51.328627\n ],\n [\n 124.693438,\n 51.332777\n ],\n [\n 124.751245,\n 51.356955\n ],\n [\n 124.783616,\n 51.392269\n ],\n [\n 124.864545,\n 51.379691\n ],\n [\n 124.885066,\n 51.408131\n ],\n [\n 124.942583,\n 51.447403\n ],\n [\n 124.917727,\n 51.474231\n ],\n [\n 124.92871,\n 51.498477\n ],\n [\n 124.983626,\n 51.508315\n ],\n [\n 125.004436,\n 51.529266\n ],\n [\n 125.047502,\n 51.529693\n ],\n [\n 125.072936,\n 51.553482\n ],\n [\n 125.05993,\n 51.596756\n ],\n [\n 125.098949,\n 51.658321\n ],\n [\n 125.12843,\n 51.659031\n ],\n [\n 125.130453,\n 51.635439\n ],\n [\n 125.17612,\n 51.639277\n ],\n [\n 125.289132,\n 51.633875\n ],\n [\n 125.316011,\n 51.609986\n ],\n [\n 125.351562,\n 51.623923\n ],\n [\n 125.379598,\n 51.586795\n ],\n [\n 125.424687,\n 51.563023\n ],\n [\n 125.524114,\n 51.49149\n ],\n [\n 125.625853,\n 51.379262\n ],\n [\n 125.669496,\n 51.343222\n ],\n [\n 125.695509,\n 51.337785\n ],\n [\n 125.711117,\n 51.302715\n ],\n [\n 125.76401,\n 51.261455\n ],\n [\n 125.75794,\n 51.227331\n ],\n [\n 125.817769,\n 51.227044\n ],\n [\n 125.851875,\n 51.212555\n ],\n [\n 125.868928,\n 51.140328\n ],\n [\n 125.908814,\n 51.139179\n ],\n [\n 125.946388,\n 51.108128\n ],\n [\n 125.990032,\n 51.119199\n ],\n [\n 125.976158,\n 51.084538\n ],\n [\n 126.009108,\n 51.057193\n ],\n [\n 126.057087,\n 51.045242\n ],\n [\n 126.033676,\n 51.010525\n ],\n [\n 126.072695,\n 50.979243\n ],\n [\n 126.044081,\n 50.928022\n ],\n [\n 126.021247,\n 50.927878\n ],\n [\n 125.995524,\n 50.897118\n ],\n [\n 125.996391,\n 50.871542\n ],\n [\n 125.958817,\n 50.900296\n ],\n [\n 125.945521,\n 50.855495\n ],\n [\n 125.906791,\n 50.855206\n ],\n [\n 125.920375,\n 50.831343\n ],\n [\n 125.878466,\n 50.816585\n ],\n [\n 125.889449,\n 50.804862\n ],\n [\n 125.838869,\n 50.794439\n ],\n [\n 125.840025,\n 50.756202\n ],\n [\n 125.805341,\n 50.772717\n ],\n [\n 125.758518,\n 50.747217\n ],\n [\n 125.794647,\n 50.739971\n ],\n [\n 125.782219,\n 50.724024\n ],\n [\n 125.825284,\n 50.70488\n ],\n [\n 125.787421,\n 50.678037\n ],\n [\n 125.792913,\n 50.644208\n ],\n [\n 125.829331,\n 50.561637\n ],\n [\n 125.752737,\n 50.506898\n ],\n [\n 125.740598,\n 50.523356\n ],\n [\n 125.654467,\n 50.471197\n ],\n [\n 125.632211,\n 50.443928\n ],\n [\n 125.59088,\n 50.452242\n ],\n [\n 125.561977,\n 50.438239\n ],\n [\n 125.574694,\n 50.401318\n ],\n [\n 125.536542,\n 50.420001\n ],\n [\n 125.513131,\n 50.409347\n ],\n [\n 125.537409,\n 50.379852\n ],\n [\n 125.522669,\n 50.367143\n ],\n [\n 125.530473,\n 50.331043\n ],\n [\n 125.466308,\n 50.297403\n ],\n [\n 125.466019,\n 50.266961\n ],\n [\n 125.442896,\n 50.26169\n ],\n [\n 125.464573,\n 50.229906\n ],\n [\n 125.388558,\n 50.178449\n ],\n [\n 125.33422,\n 50.164953\n ],\n [\n 125.375841,\n 50.137362\n ],\n [\n 125.313121,\n 50.139417\n ],\n [\n 125.27757,\n 50.12635\n ],\n [\n 125.257627,\n 50.100794\n ],\n [\n 125.289132,\n 50.091243\n ],\n [\n 125.278726,\n 50.071843\n ],\n [\n 125.337689,\n 50.05964\n ],\n [\n 125.316011,\n 50.045669\n ],\n [\n 125.285663,\n 50.058757\n ],\n [\n 125.256182,\n 50.039049\n ],\n [\n 125.286819,\n 50.034489\n ],\n [\n 125.296646,\n 50.009472\n ],\n [\n 125.242019,\n 49.987829\n ],\n [\n 125.231614,\n 49.957631\n ],\n [\n 125.189994,\n 49.959841\n ],\n [\n 125.225545,\n 49.924612\n ],\n [\n 125.212827,\n 49.907209\n ],\n [\n 125.24173,\n 49.866775\n ],\n [\n 125.2241,\n 49.835762\n ],\n [\n 125.177855,\n 49.829409\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 150800,\n \"name\": \"巴彦淖尔市\",\n \"center\": [\n 107.416959,\n 40.757402\n ],\n \"centroid\": [\n 107.572978,\n 41.453196\n ],\n \"childrenNum\": 7,\n \"level\": \"city\",\n \"subFeatureIndex\": 7,\n \"acroutes\": [\n 100000,\n 150000\n ],\n \"parent\": {\n \"adcode\": 150000\n }\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 106.866578,\n 40.181012\n ],\n [\n 106.740271,\n 40.196234\n ],\n [\n 106.705587,\n 40.262158\n ],\n [\n 106.765706,\n 40.29466\n ],\n [\n 106.820044,\n 40.355252\n ],\n [\n 106.672349,\n 40.375845\n ],\n [\n 106.604426,\n 40.377764\n ],\n [\n 106.528122,\n 40.365375\n ],\n [\n 106.476386,\n 40.319113\n ],\n [\n 106.426961,\n 40.339542\n ],\n [\n 106.32002,\n 40.34024\n ],\n [\n 106.219148,\n 40.461289\n ],\n [\n 106.197182,\n 40.515637\n ],\n [\n 106.268283,\n 40.519294\n ],\n [\n 106.282446,\n 40.548539\n ],\n [\n 106.34979,\n 40.527999\n ],\n [\n 106.37956,\n 40.501009\n ],\n [\n 106.482455,\n 40.502925\n ],\n [\n 106.467137,\n 40.546276\n ],\n [\n 106.321754,\n 40.589425\n ],\n [\n 106.273197,\n 40.591165\n ],\n [\n 106.235334,\n 40.626636\n ],\n [\n 106.237935,\n 40.661221\n ],\n [\n 106.161631,\n 40.68502\n ],\n [\n 106.115097,\n 40.717838\n ],\n [\n 105.944279,\n 40.739534\n ],\n [\n 105.835604,\n 40.781864\n ],\n [\n 105.781266,\n 40.785333\n ],\n [\n 105.697447,\n 40.811168\n ],\n [\n 105.636461,\n 40.854492\n ],\n [\n 105.559001,\n 40.89017\n ],\n [\n 105.503507,\n 40.927559\n ],\n [\n 105.395409,\n 40.984987\n ],\n [\n 105.403213,\n 41.015756\n ],\n [\n 105.379224,\n 41.059464\n ],\n [\n 105.31766,\n 41.113153\n ],\n [\n 105.334424,\n 41.131442\n ],\n [\n 105.317082,\n 41.201446\n ],\n [\n 105.245691,\n 41.32403\n ],\n [\n 105.222858,\n 41.396748\n ],\n [\n 105.201759,\n 41.542456\n ],\n [\n 105.226326,\n 41.67877\n ],\n [\n 105.226615,\n 41.748186\n ],\n [\n 105.291647,\n 41.749894\n ],\n [\n 105.385293,\n 41.79721\n ],\n [\n 105.589638,\n 41.888498\n ],\n [\n 105.741669,\n 41.94934\n ],\n [\n 106.013069,\n 42.032075\n ],\n [\n 106.344877,\n 42.149523\n ],\n [\n 106.613097,\n 42.241832\n ],\n [\n 106.785938,\n 42.291494\n ],\n [\n 107.051269,\n 42.319275\n ],\n [\n 107.271799,\n 42.364138\n ],\n [\n 107.304171,\n 42.412689\n ],\n [\n 107.466317,\n 42.458837\n ],\n [\n 107.501868,\n 42.456809\n ],\n [\n 107.574415,\n 42.413027\n ],\n [\n 107.732804,\n 42.414887\n ],\n [\n 107.939172,\n 42.403726\n ],\n [\n 108.022413,\n 42.433316\n ],\n [\n 108.089179,\n 42.436359\n ],\n [\n 108.23803,\n 42.460358\n ],\n [\n 108.298438,\n 42.438387\n ],\n [\n 108.532842,\n 42.442951\n ],\n [\n 108.704816,\n 42.413365\n ],\n [\n 108.798751,\n 42.415225\n ],\n [\n 108.845574,\n 42.395776\n ],\n [\n 108.983153,\n 42.448866\n ],\n [\n 109.02564,\n 42.458499\n ],\n [\n 109.291549,\n 42.435852\n ],\n [\n 109.379414,\n 42.447345\n ],\n [\n 109.433463,\n 42.427737\n ],\n [\n 109.445313,\n 42.379198\n ],\n [\n 109.477396,\n 42.345181\n ],\n [\n 109.472482,\n 42.314363\n ],\n [\n 109.508611,\n 42.263702\n ],\n [\n 109.539248,\n 42.147315\n ],\n [\n 109.515548,\n 42.139333\n ],\n [\n 109.48809,\n 42.077312\n ],\n [\n 109.375079,\n 41.932985\n ],\n [\n 109.337216,\n 41.898727\n ],\n [\n 109.263513,\n 41.889521\n ],\n [\n 109.259177,\n 41.868374\n ],\n [\n 109.292127,\n 41.854557\n ],\n [\n 109.317272,\n 41.80865\n ],\n [\n 109.367853,\n 41.765784\n ],\n [\n 109.341551,\n 41.742546\n ],\n [\n 109.395022,\n 41.697926\n ],\n [\n 109.423636,\n 41.634448\n ],\n [\n 109.428838,\n 41.552055\n ],\n [\n 109.478263,\n 41.499584\n ],\n [\n 109.66411,\n 41.49907\n ],\n [\n 109.63116,\n 41.426637\n ],\n [\n 109.698794,\n 41.379393\n ],\n [\n 109.696192,\n 41.322998\n ],\n [\n 109.641565,\n 41.31801\n ],\n [\n 109.620466,\n 41.275506\n ],\n [\n 109.667578,\n 41.199723\n ],\n [\n 109.709488,\n 41.152486\n ],\n [\n 109.724806,\n 41.115224\n ],\n [\n 109.657462,\n 41.115914\n ],\n [\n 109.688099,\n 41.07725\n ],\n [\n 109.698794,\n 41.036663\n ],\n [\n 109.735211,\n 41.036318\n ],\n [\n 109.759779,\n 40.999509\n ],\n [\n 109.79822,\n 41.008151\n ],\n [\n 109.8251,\n 40.994496\n ],\n [\n 109.835216,\n 40.945727\n ],\n [\n 109.886953,\n 40.924271\n ],\n [\n 109.867299,\n 40.878049\n ],\n [\n 109.869322,\n 40.841324\n ],\n [\n 109.841575,\n 40.835606\n ],\n [\n 109.79822,\n 40.795911\n ],\n [\n 109.795908,\n 40.76157\n ],\n [\n 109.635496,\n 40.738666\n ],\n [\n 109.545607,\n 40.742831\n ],\n [\n 109.528554,\n 40.732592\n ],\n [\n 109.47913,\n 40.749945\n ],\n [\n 109.41641,\n 40.708463\n ],\n [\n 109.407739,\n 40.628027\n ],\n [\n 109.445602,\n 40.540184\n ],\n [\n 109.437509,\n 40.513722\n ],\n [\n 109.419879,\n 40.473312\n ],\n [\n 109.322475,\n 40.484636\n ],\n [\n 109.157149,\n 40.53357\n ],\n [\n 109.088938,\n 40.532699\n ],\n [\n 109.053387,\n 40.550801\n ],\n [\n 108.998182,\n 40.55724\n ],\n [\n 108.997604,\n 40.530088\n ],\n [\n 108.925635,\n 40.533048\n ],\n [\n 108.92737,\n 40.552194\n ],\n [\n 108.870141,\n 40.570464\n ],\n [\n 108.831122,\n 40.541577\n ],\n [\n 108.778229,\n 40.567158\n ],\n [\n 108.762622,\n 40.62681\n ],\n [\n 108.720134,\n 40.619161\n ],\n [\n 108.656547,\n 40.667128\n ],\n [\n 108.591804,\n 40.658962\n ],\n [\n 108.580243,\n 40.710893\n ],\n [\n 108.483129,\n 40.75463\n ],\n [\n 108.468388,\n 40.785159\n ],\n [\n 108.421565,\n 40.80666\n ],\n [\n 108.338902,\n 40.801633\n ],\n [\n 108.288033,\n 40.819661\n ],\n [\n 108.211728,\n 40.820875\n ],\n [\n 108.211439,\n 40.850681\n ],\n [\n 108.182247,\n 40.888092\n ],\n [\n 108.125308,\n 40.842711\n ],\n [\n 108.088601,\n 40.832314\n ],\n [\n 108.000447,\n 40.846003\n ],\n [\n 107.972122,\n 40.862287\n ],\n [\n 107.899575,\n 40.849295\n ],\n [\n 107.856509,\n 40.874585\n ],\n [\n 107.821247,\n 40.835779\n ],\n [\n 107.747545,\n 40.860728\n ],\n [\n 107.738874,\n 40.874758\n ],\n [\n 107.681067,\n 40.817235\n ],\n [\n 107.679622,\n 40.780824\n ],\n [\n 107.653609,\n 40.772845\n ],\n [\n 107.603896,\n 40.798685\n ],\n [\n 107.612567,\n 40.778049\n ],\n [\n 107.584531,\n 40.739707\n ],\n [\n 107.526725,\n 40.701344\n ],\n [\n 107.485104,\n 40.711067\n ],\n [\n 107.455334,\n 40.680677\n ],\n [\n 107.392325,\n 40.644887\n ],\n [\n 107.286829,\n 40.650969\n ],\n [\n 107.250989,\n 40.58299\n ],\n [\n 107.230757,\n 40.577423\n ],\n [\n 107.169193,\n 40.598295\n ],\n [\n 107.1611,\n 40.525388\n ],\n [\n 107.203877,\n 40.505712\n ],\n [\n 107.18509,\n 40.471744\n ],\n [\n 107.147227,\n 40.464251\n ],\n [\n 107.15214,\n 40.410907\n ],\n [\n 107.114277,\n 40.366945\n ],\n [\n 107.044043,\n 40.35403\n ],\n [\n 107.055026,\n 40.332733\n ],\n [\n 107.013116,\n 40.314572\n ],\n [\n 106.99722,\n 40.262333\n ],\n [\n 106.948663,\n 40.234887\n ],\n [\n 106.922939,\n 40.196934\n ],\n [\n 106.866578,\n 40.181012\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 150900,\n \"name\": \"乌兰察布市\",\n \"center\": [\n 113.114543,\n 41.034126\n ],\n \"centroid\": [\n 112.442779,\n 41.696758\n ],\n \"childrenNum\": 11,\n \"level\": \"city\",\n \"subFeatureIndex\": 8,\n \"acroutes\": [\n 100000,\n 150000\n ],\n \"parent\": {\n \"adcode\": 150000\n }\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 114.807129,\n 42.149523\n ],\n [\n 114.755393,\n 42.115891\n ],\n [\n 114.67562,\n 42.120478\n ],\n [\n 114.624751,\n 42.112153\n ],\n [\n 114.565788,\n 42.133728\n ],\n [\n 114.510872,\n 42.110964\n ],\n [\n 114.502491,\n 42.067111\n ],\n [\n 114.466073,\n 42.038029\n ],\n [\n 114.509427,\n 41.972503\n ],\n [\n 114.421562,\n 41.942185\n ],\n [\n 114.352483,\n 41.953939\n ],\n [\n 114.346703,\n 41.928043\n ],\n [\n 114.200742,\n 41.789867\n ],\n [\n 114.206812,\n 41.738445\n ],\n [\n 114.237449,\n 41.69861\n ],\n [\n 114.215483,\n 41.685099\n ],\n [\n 114.259415,\n 41.62332\n ],\n [\n 114.228778,\n 41.620923\n ],\n [\n 114.221552,\n 41.582215\n ],\n [\n 114.23109,\n 41.513649\n ],\n [\n 114.101315,\n 41.537827\n ],\n [\n 114.032237,\n 41.529597\n ],\n [\n 113.92992,\n 41.484487\n ],\n [\n 113.92096,\n 41.456513\n ],\n [\n 113.871247,\n 41.413412\n ],\n [\n 113.948707,\n 41.392109\n ],\n [\n 113.926741,\n 41.326266\n ],\n [\n 113.899572,\n 41.316289\n ],\n [\n 113.951308,\n 41.282907\n ],\n [\n 113.97154,\n 41.23952\n ],\n [\n 113.992351,\n 41.269825\n ],\n [\n 114.01634,\n 41.232113\n ],\n [\n 113.996686,\n 41.192484\n ],\n [\n 113.961135,\n 41.171281\n ],\n [\n 113.920382,\n 41.171971\n ],\n [\n 113.877894,\n 41.115569\n ],\n [\n 113.820377,\n 41.10159\n ],\n [\n 113.868356,\n 41.068962\n ],\n [\n 113.975587,\n 40.976514\n ],\n [\n 113.991195,\n 40.940191\n ],\n [\n 114.057383,\n 40.925137\n ],\n [\n 114.041486,\n 40.917349\n ],\n [\n 114.055359,\n 40.86783\n ],\n [\n 114.073568,\n 40.857264\n ],\n [\n 114.044665,\n 40.8311\n ],\n [\n 114.134554,\n 40.737798\n ],\n [\n 114.093223,\n 40.731898\n ],\n [\n 114.06403,\n 40.707074\n ],\n [\n 114.070389,\n 40.660352\n ],\n [\n 114.041775,\n 40.608729\n ],\n [\n 114.076748,\n 40.575857\n ],\n [\n 114.062007,\n 40.52887\n ],\n [\n 114.011427,\n 40.515812\n ],\n [\n 113.948707,\n 40.517379\n ],\n [\n 113.890034,\n 40.466517\n ],\n [\n 113.851014,\n 40.460592\n ],\n [\n 113.794942,\n 40.517901\n ],\n [\n 113.763438,\n 40.474009\n ],\n [\n 113.680486,\n 40.444034\n ],\n [\n 113.55996,\n 40.348619\n ],\n [\n 113.387698,\n 40.319113\n ],\n [\n 113.316018,\n 40.320161\n ],\n [\n 113.251275,\n 40.413349\n ],\n [\n 113.11543,\n 40.381079\n ],\n [\n 113.039704,\n 40.370086\n ],\n [\n 112.892876,\n 40.326447\n ],\n [\n 112.848655,\n 40.20708\n ],\n [\n 112.750673,\n 40.168061\n ],\n [\n 112.728707,\n 40.168236\n ],\n [\n 112.629858,\n 40.235761\n ],\n [\n 112.509043,\n 40.270373\n ],\n [\n 112.45615,\n 40.300075\n ],\n [\n 112.418287,\n 40.295358\n ],\n [\n 112.345451,\n 40.25639\n ],\n [\n 112.31019,\n 40.25639\n ],\n [\n 112.289379,\n 40.281032\n ],\n [\n 112.272616,\n 40.357172\n ],\n [\n 112.236198,\n 40.353856\n ],\n [\n 112.264523,\n 40.38736\n ],\n [\n 112.2177,\n 40.42817\n ],\n [\n 112.22348,\n 40.452575\n ],\n [\n 112.183305,\n 40.466168\n ],\n [\n 112.13706,\n 40.508324\n ],\n [\n 112.113648,\n 40.508672\n ],\n [\n 112.052374,\n 40.55985\n ],\n [\n 112.059022,\n 40.584381\n ],\n [\n 112.098619,\n 40.583859\n ],\n [\n 112.087925,\n 40.618813\n ],\n [\n 112.045148,\n 40.655139\n ],\n [\n 112.115672,\n 40.658788\n ],\n [\n 112.130412,\n 40.697697\n ],\n [\n 112.098619,\n 40.74526\n ],\n [\n 112.15209,\n 40.764519\n ],\n [\n 112.17868,\n 40.811514\n ],\n [\n 112.176079,\n 40.85276\n ],\n [\n 112.150933,\n 40.879088\n ],\n [\n 112.125788,\n 40.955933\n ],\n [\n 112.09515,\n 40.943305\n ],\n [\n 112.037055,\n 40.96389\n ],\n [\n 112.010175,\n 41.014719\n ],\n [\n 112.027517,\n 41.048583\n ],\n [\n 111.921732,\n 41.095895\n ],\n [\n 111.877221,\n 41.129027\n ],\n [\n 111.840514,\n 41.252091\n ],\n [\n 111.804096,\n 41.259668\n ],\n [\n 111.730104,\n 41.310956\n ],\n [\n 111.702646,\n 41.29461\n ],\n [\n 111.582409,\n 41.306655\n ],\n [\n 111.525181,\n 41.331426\n ],\n [\n 111.425465,\n 41.31887\n ],\n [\n 111.424887,\n 41.346903\n ],\n [\n 111.387313,\n 41.378705\n ],\n [\n 111.434136,\n 41.425264\n ],\n [\n 111.446565,\n 41.472646\n ],\n [\n 111.441362,\n 41.524282\n ],\n [\n 111.371128,\n 41.635646\n ],\n [\n 111.241353,\n 41.671242\n ],\n [\n 111.150886,\n 41.735026\n ],\n [\n 111.120827,\n 41.771421\n ],\n [\n 111.078917,\n 41.78611\n ],\n [\n 111.039609,\n 41.822818\n ],\n [\n 110.985849,\n 41.9352\n ],\n [\n 110.842201,\n 42.119969\n ],\n [\n 110.784683,\n 42.176347\n ],\n [\n 110.783238,\n 42.239967\n ],\n [\n 110.750867,\n 42.294883\n ],\n [\n 110.72312,\n 42.393916\n ],\n [\n 110.730057,\n 42.442613\n ],\n [\n 110.704911,\n 42.470833\n ],\n [\n 110.639012,\n 42.491779\n ],\n [\n 110.577159,\n 42.573637\n ],\n [\n 110.521954,\n 42.62607\n ],\n [\n 110.438135,\n 42.690414\n ],\n [\n 110.337552,\n 42.738039\n ],\n [\n 110.437268,\n 42.781426\n ],\n [\n 110.46964,\n 42.839059\n ],\n [\n 110.631497,\n 42.936057\n ],\n [\n 110.689303,\n 43.021516\n ],\n [\n 110.68728,\n 43.036418\n ],\n [\n 110.736415,\n 43.089631\n ],\n [\n 110.769943,\n 43.099332\n ],\n [\n 110.820234,\n 43.148982\n ],\n [\n 111.020533,\n 43.33002\n ],\n [\n 111.069668,\n 43.358004\n ],\n [\n 111.150886,\n 43.380315\n ],\n [\n 111.21534,\n 43.279351\n ],\n [\n 111.380087,\n 43.18206\n ],\n [\n 111.506972,\n 43.179387\n ],\n [\n 111.618827,\n 43.054161\n ],\n [\n 111.658135,\n 43.024028\n ],\n [\n 111.75236,\n 42.987514\n ],\n [\n 111.855833,\n 42.839899\n ],\n [\n 111.858434,\n 42.81823\n ],\n [\n 111.934738,\n 42.707415\n ],\n [\n 112.026072,\n 42.602978\n ],\n [\n 112.028962,\n 42.584599\n ],\n [\n 112.180704,\n 42.534662\n ],\n [\n 112.178391,\n 42.511029\n ],\n [\n 112.254407,\n 42.482827\n ],\n [\n 112.398055,\n 42.387318\n ],\n [\n 112.612227,\n 42.341287\n ],\n [\n 112.654715,\n 42.315887\n ],\n [\n 112.636795,\n 42.280311\n ],\n [\n 112.689976,\n 42.254379\n ],\n [\n 112.737956,\n 42.144258\n ],\n [\n 112.790848,\n 42.138144\n ],\n [\n 112.856458,\n 42.115721\n ],\n [\n 112.938832,\n 42.019655\n ],\n [\n 112.965134,\n 41.9977\n ],\n [\n 113.041727,\n 41.986125\n ],\n [\n 113.086527,\n 41.932644\n ],\n [\n 113.127281,\n 41.953939\n ],\n [\n 113.17208,\n 41.950022\n ],\n [\n 113.148669,\n 41.978293\n ],\n [\n 113.22873,\n 42.01489\n ],\n [\n 113.313417,\n 42.105357\n ],\n [\n 113.372379,\n 42.143579\n ],\n [\n 113.572388,\n 42.13186\n ],\n [\n 113.632218,\n 42.104677\n ],\n [\n 113.709389,\n 42.129822\n ],\n [\n 113.743206,\n 42.083432\n ],\n [\n 113.782803,\n 42.067111\n ],\n [\n 113.895236,\n 42.058099\n ],\n [\n 113.914601,\n 41.978122\n ],\n [\n 113.988015,\n 41.952917\n ],\n [\n 114.019231,\n 41.991572\n ],\n [\n 114.058539,\n 41.949681\n ],\n [\n 114.069233,\n 41.999062\n ],\n [\n 114.105362,\n 41.98306\n ],\n [\n 114.065186,\n 42.043302\n ],\n [\n 114.093801,\n 42.065241\n ],\n [\n 114.100159,\n 42.125745\n ],\n [\n 114.131953,\n 42.116911\n ],\n [\n 114.213459,\n 42.125235\n ],\n [\n 114.257103,\n 42.175668\n ],\n [\n 114.320112,\n 42.189416\n ],\n [\n 114.375895,\n 42.1519\n ],\n [\n 114.377051,\n 42.110114\n ],\n [\n 114.44584,\n 42.098729\n ],\n [\n 114.479079,\n 42.115551\n ],\n [\n 114.465206,\n 42.170745\n ],\n [\n 114.437748,\n 42.171424\n ],\n [\n 114.404798,\n 42.200276\n ],\n [\n 114.519832,\n 42.229962\n ],\n [\n 114.575037,\n 42.296577\n ],\n [\n 114.689205,\n 42.26421\n ],\n [\n 114.669551,\n 42.248953\n ],\n [\n 114.68747,\n 42.221142\n ],\n [\n 114.675042,\n 42.19807\n ],\n [\n 114.758572,\n 42.218598\n ],\n [\n 114.809153,\n 42.200106\n ],\n [\n 114.790077,\n 42.187718\n ],\n [\n 114.807129,\n 42.149523\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 152200,\n \"name\": \"兴安盟\",\n \"center\": [\n 122.070317,\n 46.076268\n ],\n \"centroid\": [\n 121.340147,\n 46.24332\n ],\n \"childrenNum\": 6,\n \"level\": \"city\",\n \"subFeatureIndex\": 9,\n \"acroutes\": [\n 100000,\n 150000\n ],\n \"parent\": {\n \"adcode\": 150000\n }\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 122.418186,\n 47.350534\n ],\n [\n 122.462696,\n 47.278482\n ],\n [\n 122.509808,\n 47.242886\n ],\n [\n 122.556342,\n 47.172556\n ],\n [\n 122.596229,\n 47.155115\n ],\n [\n 122.612414,\n 47.128474\n ],\n [\n 122.679759,\n 47.094181\n ],\n [\n 122.702014,\n 47.096676\n ],\n [\n 122.821962,\n 47.065638\n ],\n [\n 122.852021,\n 47.072346\n ],\n [\n 122.845952,\n 47.046757\n ],\n [\n 122.778318,\n 47.002883\n ],\n [\n 122.77485,\n 46.973979\n ],\n [\n 122.802308,\n 46.937396\n ],\n [\n 122.848842,\n 46.939586\n ],\n [\n 122.895376,\n 46.960224\n ],\n [\n 122.893642,\n 46.895155\n ],\n [\n 122.907226,\n 46.807907\n ],\n [\n 122.996537,\n 46.761641\n ],\n [\n 123.026596,\n 46.71879\n ],\n [\n 123.077176,\n 46.745007\n ],\n [\n 123.104056,\n 46.734647\n ],\n [\n 123.171112,\n 46.743908\n ],\n [\n 123.18643,\n 46.786739\n ],\n [\n 123.230941,\n 46.859928\n ],\n [\n 123.295684,\n 46.865253\n ],\n [\n 123.34164,\n 46.826872\n ],\n [\n 123.374589,\n 46.837684\n ],\n [\n 123.406672,\n 46.906423\n ],\n [\n 123.404649,\n 46.93552\n ],\n [\n 123.360427,\n 46.97101\n ],\n [\n 123.304066,\n 46.964914\n ],\n [\n 123.301754,\n 46.999759\n ],\n [\n 123.336437,\n 46.989136\n ],\n [\n 123.427482,\n 46.934425\n ],\n [\n 123.527776,\n 46.958036\n ],\n [\n 123.522284,\n 46.922225\n ],\n [\n 123.483843,\n 46.844734\n ],\n [\n 123.514192,\n 46.826089\n ],\n [\n 123.562749,\n 46.825932\n ],\n [\n 123.576911,\n 46.890616\n ],\n [\n 123.605525,\n 46.891242\n ],\n [\n 123.599167,\n 46.864939\n ],\n [\n 123.625758,\n 46.847711\n ],\n [\n 123.580091,\n 46.827969\n ],\n [\n 123.629226,\n 46.81355\n ],\n [\n 123.631827,\n 46.729466\n ],\n [\n 123.604658,\n 46.690046\n ],\n [\n 123.482109,\n 46.686904\n ],\n [\n 123.366497,\n 46.67779\n ],\n [\n 123.277475,\n 46.661602\n ],\n [\n 123.279209,\n 46.616941\n ],\n [\n 123.22834,\n 46.5883\n ],\n [\n 123.181517,\n 46.613637\n ],\n [\n 123.098565,\n 46.603094\n ],\n [\n 123.077755,\n 46.622132\n ],\n [\n 123.045672,\n 46.617255\n ],\n [\n 123.052898,\n 46.580115\n ],\n [\n 123.007231,\n 46.576966\n ],\n [\n 123.011566,\n 46.434928\n ],\n [\n 123.094807,\n 46.342192\n ],\n [\n 123.140474,\n 46.300274\n ],\n [\n 123.178626,\n 46.24803\n ],\n [\n 123.128624,\n 46.210478\n ],\n [\n 123.127757,\n 46.174646\n ],\n [\n 123.1029,\n 46.17195\n ],\n [\n 123.112438,\n 46.130061\n ],\n [\n 123.069951,\n 46.123552\n ],\n [\n 123.045672,\n 46.100052\n ],\n [\n 122.793059,\n 46.073205\n ],\n [\n 122.82861,\n 45.912329\n ],\n [\n 122.800285,\n 45.856685\n ],\n [\n 122.752305,\n 45.834827\n ],\n [\n 122.792481,\n 45.766165\n ],\n [\n 122.751149,\n 45.736119\n ],\n [\n 122.7419,\n 45.705097\n ],\n [\n 122.671377,\n 45.700619\n ],\n [\n 122.640739,\n 45.771118\n ],\n [\n 122.603454,\n 45.778147\n ],\n [\n 122.554897,\n 45.821421\n ],\n [\n 122.504317,\n 45.787731\n ],\n [\n 122.495935,\n 45.85828\n ],\n [\n 122.445933,\n 45.91695\n ],\n [\n 122.362114,\n 45.917428\n ],\n [\n 122.373097,\n 45.856047\n ],\n [\n 122.337546,\n 45.859875\n ],\n [\n 122.320782,\n 45.830518\n ],\n [\n 122.262687,\n 45.794918\n ],\n [\n 122.200834,\n 45.856845\n ],\n [\n 122.09158,\n 45.882043\n ],\n [\n 122.083488,\n 45.917269\n ],\n [\n 122.040133,\n 45.959001\n ],\n [\n 121.923653,\n 46.004838\n ],\n [\n 121.863824,\n 46.002611\n ],\n [\n 121.843303,\n 46.024403\n ],\n [\n 121.761796,\n 45.998952\n ],\n [\n 121.809197,\n 45.961548\n ],\n [\n 121.821047,\n 45.920615\n ],\n [\n 121.81729,\n 45.875665\n ],\n [\n 121.784918,\n 45.860194\n ],\n [\n 121.754281,\n 45.794918\n ],\n [\n 121.690116,\n 45.76281\n ],\n [\n 121.656878,\n 45.77016\n ],\n [\n 121.644449,\n 45.752423\n ],\n [\n 121.714106,\n 45.701738\n ],\n [\n 121.81122,\n 45.68702\n ],\n [\n 121.812376,\n 45.704777\n ],\n [\n 121.867003,\n 45.719811\n ],\n [\n 121.934058,\n 45.710535\n ],\n [\n 121.970187,\n 45.69278\n ],\n [\n 122.003426,\n 45.623302\n ],\n [\n 121.9962,\n 45.598949\n ],\n [\n 121.96643,\n 45.596064\n ],\n [\n 121.99331,\n 45.552937\n ],\n [\n 122.002559,\n 45.50785\n ],\n [\n 122.023369,\n 45.490191\n ],\n [\n 122.163549,\n 45.443768\n ],\n [\n 122.179735,\n 45.409369\n ],\n [\n 122.146785,\n 45.374465\n ],\n [\n 122.147363,\n 45.295572\n ],\n [\n 122.238986,\n 45.276234\n ],\n [\n 122.230026,\n 45.206887\n ],\n [\n 122.192741,\n 45.180739\n ],\n [\n 122.143317,\n 45.182999\n ],\n [\n 122.109789,\n 45.141979\n ],\n [\n 122.119327,\n 45.068586\n ],\n [\n 122.098806,\n 45.021493\n ],\n [\n 122.074528,\n 45.006597\n ],\n [\n 122.086667,\n 44.952971\n ],\n [\n 122.079152,\n 44.914218\n ],\n [\n 122.049671,\n 44.912758\n ],\n [\n 122.114992,\n 44.776671\n ],\n [\n 122.169041,\n 44.770167\n ],\n [\n 122.142739,\n 44.753742\n ],\n [\n 122.110656,\n 44.767891\n ],\n [\n 122.102853,\n 44.736336\n ],\n [\n 122.152566,\n 44.743819\n ],\n [\n 122.161526,\n 44.7282\n ],\n [\n 122.117304,\n 44.702158\n ],\n [\n 122.103142,\n 44.673988\n ],\n [\n 122.131756,\n 44.577485\n ],\n [\n 122.195921,\n 44.559863\n ],\n [\n 122.223957,\n 44.526235\n ],\n [\n 122.228003,\n 44.480168\n ],\n [\n 122.286098,\n 44.477717\n ],\n [\n 122.29448,\n 44.411001\n ],\n [\n 122.29159,\n 44.310292\n ],\n [\n 122.274537,\n 44.25405\n ],\n [\n 122.22598,\n 44.263564\n ],\n [\n 122.167596,\n 44.25569\n ],\n [\n 122.017877,\n 44.304392\n ],\n [\n 121.933769,\n 44.351252\n ],\n [\n 121.881166,\n 44.402983\n ],\n [\n 121.829429,\n 44.411328\n ],\n [\n 121.778271,\n 44.446494\n ],\n [\n 121.760062,\n 44.47739\n ],\n [\n 121.697631,\n 44.534562\n ],\n [\n 121.651097,\n 44.563126\n ],\n [\n 121.585198,\n 44.639774\n ],\n [\n 121.595603,\n 44.659164\n ],\n [\n 121.548491,\n 44.667472\n ],\n [\n 121.529993,\n 44.720389\n ],\n [\n 121.409178,\n 44.790815\n ],\n [\n 121.420161,\n 44.817953\n ],\n [\n 121.401663,\n 44.85125\n ],\n [\n 121.239806,\n 44.934165\n ],\n [\n 121.032859,\n 44.9985\n ],\n [\n 120.977076,\n 45.072953\n ],\n [\n 120.97303,\n 45.11871\n ],\n [\n 120.947884,\n 45.120973\n ],\n [\n 120.97303,\n 45.157002\n ],\n [\n 120.967827,\n 45.184129\n ],\n [\n 120.882274,\n 45.217537\n ],\n [\n 120.834873,\n 45.216084\n ],\n [\n 120.82678,\n 45.253504\n ],\n [\n 120.744406,\n 45.260115\n ],\n [\n 120.660298,\n 45.297666\n ],\n [\n 120.580526,\n 45.352901\n ],\n [\n 120.554224,\n 45.357569\n ],\n [\n 120.559716,\n 45.416604\n ],\n [\n 120.49584,\n 45.464173\n ],\n [\n 120.434854,\n 45.464495\n ],\n [\n 120.414044,\n 45.503516\n ],\n [\n 120.35855,\n 45.516838\n ],\n [\n 120.318375,\n 45.556626\n ],\n [\n 120.269239,\n 45.552135\n ],\n [\n 120.165766,\n 45.594782\n ],\n [\n 120.142644,\n 45.584204\n ],\n [\n 120.027031,\n 45.594942\n ],\n [\n 119.994082,\n 45.580837\n ],\n [\n 119.994082,\n 45.552937\n ],\n [\n 120.028765,\n 45.526306\n ],\n [\n 120.031656,\n 45.499342\n ],\n [\n 120.002464,\n 45.482162\n ],\n [\n 119.906794,\n 45.505603\n ],\n [\n 119.918355,\n 45.561918\n ],\n [\n 119.877602,\n 45.549088\n ],\n [\n 119.819507,\n 45.572821\n ],\n [\n 119.790893,\n 45.564323\n ],\n [\n 119.656493,\n 45.623463\n ],\n [\n 119.566027,\n 45.65565\n ],\n [\n 119.596086,\n 45.670057\n ],\n [\n 119.681639,\n 45.669417\n ],\n [\n 119.708808,\n 45.703178\n ],\n [\n 119.700426,\n 45.736439\n ],\n [\n 119.751585,\n 45.76297\n ],\n [\n 119.807946,\n 45.820463\n ],\n [\n 119.829912,\n 45.974603\n ],\n [\n 119.807657,\n 45.991314\n ],\n [\n 119.833669,\n 46.004838\n ],\n [\n 119.855058,\n 46.107992\n ],\n [\n 119.879336,\n 46.144344\n ],\n [\n 119.850433,\n 46.18321\n ],\n [\n 119.889452,\n 46.209686\n ],\n [\n 119.835693,\n 46.235357\n ],\n [\n 119.837716,\n 46.320683\n ],\n [\n 119.874134,\n 46.345512\n ],\n [\n 119.838294,\n 46.37586\n ],\n [\n 119.900147,\n 46.403507\n ],\n [\n 119.961421,\n 46.39561\n ],\n [\n 119.984544,\n 46.418667\n ],\n [\n 119.909396,\n 46.429088\n ],\n [\n 119.948704,\n 46.493617\n ],\n [\n 119.907083,\n 46.53775\n ],\n [\n 119.952461,\n 46.604196\n ],\n [\n 119.906794,\n 46.668518\n ],\n [\n 119.935119,\n 46.712822\n ],\n [\n 119.91691,\n 46.758346\n ],\n [\n 119.936275,\n 46.790189\n ],\n [\n 119.920379,\n 46.853193\n ],\n [\n 119.928761,\n 46.903762\n ],\n [\n 119.859682,\n 46.917062\n ],\n [\n 119.844942,\n 46.96507\n ],\n [\n 119.794939,\n 47.013035\n ],\n [\n 119.8065,\n 47.054872\n ],\n [\n 119.762857,\n 47.130968\n ],\n [\n 119.716034,\n 47.195595\n ],\n [\n 119.62181,\n 47.248484\n ],\n [\n 119.557356,\n 47.257656\n ],\n [\n 119.561113,\n 47.301164\n ],\n [\n 119.486254,\n 47.336721\n ],\n [\n 119.616896,\n 47.361706\n ],\n [\n 119.657938,\n 47.410554\n ],\n [\n 119.764013,\n 47.436123\n ],\n [\n 119.814304,\n 47.474995\n ],\n [\n 119.814015,\n 47.49914\n ],\n [\n 119.853034,\n 47.520954\n ],\n [\n 119.904482,\n 47.5678\n ],\n [\n 119.958242,\n 47.581552\n ],\n [\n 120.023852,\n 47.554044\n ],\n [\n 120.11403,\n 47.597926\n ],\n [\n 120.188022,\n 47.615222\n ],\n [\n 120.200161,\n 47.632975\n ],\n [\n 120.230509,\n 47.623713\n ],\n [\n 120.265193,\n 47.65643\n ],\n [\n 120.344387,\n 47.602405\n ],\n [\n 120.385719,\n 47.620317\n ],\n [\n 120.52561,\n 47.574599\n ],\n [\n 120.525321,\n 47.544769\n ],\n [\n 120.581104,\n 47.548479\n ],\n [\n 120.604226,\n 47.532244\n ],\n [\n 120.582549,\n 47.505329\n ],\n [\n 120.593532,\n 47.488617\n ],\n [\n 120.643535,\n 47.506877\n ],\n [\n 120.725619,\n 47.441545\n ],\n [\n 120.703364,\n 47.408539\n ],\n [\n 120.732556,\n 47.384972\n ],\n [\n 120.733134,\n 47.357672\n ],\n [\n 120.708277,\n 47.337342\n ],\n [\n 120.624748,\n 47.300698\n ],\n [\n 120.623302,\n 47.244285\n ],\n [\n 120.739204,\n 47.217379\n ],\n [\n 120.773888,\n 47.176915\n ],\n [\n 120.823312,\n 47.145613\n ],\n [\n 120.876494,\n 47.149819\n ],\n [\n 120.945861,\n 47.099014\n ],\n [\n 120.976787,\n 47.09652\n ],\n [\n 121.018119,\n 47.129253\n ],\n [\n 121.098469,\n 47.151999\n ],\n [\n 121.172461,\n 47.141251\n ],\n [\n 121.246453,\n 47.112577\n ],\n [\n 121.329405,\n 47.136577\n ],\n [\n 121.368136,\n 47.135175\n ],\n [\n 121.437503,\n 47.184232\n ],\n [\n 121.488661,\n 47.183765\n ],\n [\n 121.551092,\n 47.197773\n ],\n [\n 121.588955,\n 47.1724\n ],\n [\n 121.648785,\n 47.179406\n ],\n [\n 121.639825,\n 47.203064\n ],\n [\n 121.674219,\n 47.249883\n ],\n [\n 121.760351,\n 47.280968\n ],\n [\n 121.840123,\n 47.265739\n ],\n [\n 122.042156,\n 47.204154\n ],\n [\n 122.084644,\n 47.180652\n ],\n [\n 122.146207,\n 47.222201\n ],\n [\n 122.209505,\n 47.236199\n ],\n [\n 122.256906,\n 47.260299\n ],\n [\n 122.308932,\n 47.304271\n ],\n [\n 122.418186,\n 47.350534\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 152500,\n \"name\": \"锡林郭勒盟\",\n \"center\": [\n 116.090996,\n 43.944018\n ],\n \"centroid\": [\n 115.515195,\n 44.233018\n ],\n \"childrenNum\": 12,\n \"level\": \"city\",\n \"subFeatureIndex\": 10,\n \"acroutes\": [\n 100000,\n 150000\n ],\n \"parent\": {\n \"adcode\": 150000\n }\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 116.893645,\n 42.387826\n ],\n [\n 116.884974,\n 42.353306\n ],\n [\n 116.918502,\n 42.229962\n ],\n [\n 116.903472,\n 42.190773\n ],\n [\n 116.789305,\n 42.200276\n ],\n [\n 116.825145,\n 42.155636\n ],\n [\n 116.85029,\n 42.156315\n ],\n [\n 116.890755,\n 42.092611\n ],\n [\n 116.879482,\n 42.018463\n ],\n [\n 116.832081,\n 42.00536\n ],\n [\n 116.814161,\n 41.981868\n ],\n [\n 116.766471,\n 41.990381\n ],\n [\n 116.727452,\n 41.951044\n ],\n [\n 116.652304,\n 41.943889\n ],\n [\n 116.640743,\n 41.930429\n ],\n [\n 116.566462,\n 41.928725\n ],\n [\n 116.533801,\n 41.938948\n ],\n [\n 116.514147,\n 41.970119\n ],\n [\n 116.482643,\n 41.975909\n ],\n [\n 116.427438,\n 41.938948\n ],\n [\n 116.386684,\n 41.952406\n ],\n [\n 116.414431,\n 41.986976\n ],\n [\n 116.373678,\n 42.009955\n ],\n [\n 116.327144,\n 42.0057\n ],\n [\n 116.298241,\n 41.968076\n ],\n [\n 116.233498,\n 41.941504\n ],\n [\n 116.19419,\n 41.861893\n ],\n [\n 116.123088,\n 41.861722\n ],\n [\n 116.106902,\n 41.831522\n ],\n [\n 116.128869,\n 41.806089\n ],\n [\n 116.098809,\n 41.776546\n ],\n [\n 116.016725,\n 41.777058\n ],\n [\n 115.995047,\n 41.828621\n ],\n [\n 115.946779,\n 41.885599\n ],\n [\n 115.916431,\n 41.945081\n ],\n [\n 115.853133,\n 41.927703\n ],\n [\n 115.837236,\n 41.937756\n ],\n [\n 115.724514,\n 41.868033\n ],\n [\n 115.688096,\n 41.867692\n ],\n [\n 115.653991,\n 41.828962\n ],\n [\n 115.574218,\n 41.805406\n ],\n [\n 115.51988,\n 41.767834\n ],\n [\n 115.429991,\n 41.728702\n ],\n [\n 115.347039,\n 41.71229\n ],\n [\n 115.319003,\n 41.691427\n ],\n [\n 115.362358,\n 41.668163\n ],\n [\n 115.345594,\n 41.635646\n ],\n [\n 115.377677,\n 41.602428\n ],\n [\n 115.310911,\n 41.592665\n ],\n [\n 115.290389,\n 41.622977\n ],\n [\n 115.264377,\n 41.613046\n ],\n [\n 115.257729,\n 41.581187\n ],\n [\n 115.204258,\n 41.571421\n ],\n [\n 115.195009,\n 41.602086\n ],\n [\n 115.087779,\n 41.622806\n ],\n [\n 115.055985,\n 41.602257\n ],\n [\n 115.025059,\n 41.615272\n ],\n [\n 114.8606,\n 41.601058\n ],\n [\n 114.895573,\n 41.636502\n ],\n [\n 114.902799,\n 41.689375\n ],\n [\n 114.896151,\n 41.767663\n ],\n [\n 114.867248,\n 41.803016\n ],\n [\n 114.922453,\n 41.825207\n ],\n [\n 114.939217,\n 41.846197\n ],\n [\n 114.921586,\n 41.875879\n ],\n [\n 114.916961,\n 41.981017\n ],\n [\n 114.901932,\n 42.015571\n ],\n [\n 114.860889,\n 42.054868\n ],\n [\n 114.856265,\n 42.109944\n ],\n [\n 114.807129,\n 42.149523\n ],\n [\n 114.790077,\n 42.187718\n ],\n [\n 114.809153,\n 42.200106\n ],\n [\n 114.758572,\n 42.218598\n ],\n [\n 114.675042,\n 42.19807\n ],\n [\n 114.68747,\n 42.221142\n ],\n [\n 114.669551,\n 42.248953\n ],\n [\n 114.689205,\n 42.26421\n ],\n [\n 114.575037,\n 42.296577\n ],\n [\n 114.519832,\n 42.229962\n ],\n [\n 114.404798,\n 42.200276\n ],\n [\n 114.437748,\n 42.171424\n ],\n [\n 114.465206,\n 42.170745\n ],\n [\n 114.479079,\n 42.115551\n ],\n [\n 114.44584,\n 42.098729\n ],\n [\n 114.377051,\n 42.110114\n ],\n [\n 114.375895,\n 42.1519\n ],\n [\n 114.320112,\n 42.189416\n ],\n [\n 114.257103,\n 42.175668\n ],\n [\n 114.213459,\n 42.125235\n ],\n [\n 114.131953,\n 42.116911\n ],\n [\n 114.100159,\n 42.125745\n ],\n [\n 114.093801,\n 42.065241\n ],\n [\n 114.065186,\n 42.043302\n ],\n [\n 114.105362,\n 41.98306\n ],\n [\n 114.069233,\n 41.999062\n ],\n [\n 114.058539,\n 41.949681\n ],\n [\n 114.019231,\n 41.991572\n ],\n [\n 113.988015,\n 41.952917\n ],\n [\n 113.914601,\n 41.978122\n ],\n [\n 113.895236,\n 42.058099\n ],\n [\n 113.782803,\n 42.067111\n ],\n [\n 113.743206,\n 42.083432\n ],\n [\n 113.709389,\n 42.129822\n ],\n [\n 113.632218,\n 42.104677\n ],\n [\n 113.572388,\n 42.13186\n ],\n [\n 113.372379,\n 42.143579\n ],\n [\n 113.313417,\n 42.105357\n ],\n [\n 113.22873,\n 42.01489\n ],\n [\n 113.148669,\n 41.978293\n ],\n [\n 113.17208,\n 41.950022\n ],\n [\n 113.127281,\n 41.953939\n ],\n [\n 113.086527,\n 41.932644\n ],\n [\n 113.041727,\n 41.986125\n ],\n [\n 112.965134,\n 41.9977\n ],\n [\n 112.938832,\n 42.019655\n ],\n [\n 112.856458,\n 42.115721\n ],\n [\n 112.790848,\n 42.138144\n ],\n [\n 112.737956,\n 42.144258\n ],\n [\n 112.689976,\n 42.254379\n ],\n [\n 112.636795,\n 42.280311\n ],\n [\n 112.654715,\n 42.315887\n ],\n [\n 112.612227,\n 42.341287\n ],\n [\n 112.398055,\n 42.387318\n ],\n [\n 112.254407,\n 42.482827\n ],\n [\n 112.178391,\n 42.511029\n ],\n [\n 112.180704,\n 42.534662\n ],\n [\n 112.028962,\n 42.584599\n ],\n [\n 112.026072,\n 42.602978\n ],\n [\n 111.934738,\n 42.707415\n ],\n [\n 111.858434,\n 42.81823\n ],\n [\n 111.855833,\n 42.839899\n ],\n [\n 111.75236,\n 42.987514\n ],\n [\n 111.658135,\n 43.024028\n ],\n [\n 111.618827,\n 43.054161\n ],\n [\n 111.506972,\n 43.179387\n ],\n [\n 111.380087,\n 43.18206\n ],\n [\n 111.21534,\n 43.279351\n ],\n [\n 111.150886,\n 43.380315\n ],\n [\n 111.183546,\n 43.396128\n ],\n [\n 111.354075,\n 43.436057\n ],\n [\n 111.40032,\n 43.472802\n ],\n [\n 111.456681,\n 43.494406\n ],\n [\n 111.564489,\n 43.490252\n ],\n [\n 111.643973,\n 43.543734\n ],\n [\n 111.794269,\n 43.671931\n ],\n [\n 111.891673,\n 43.674085\n ],\n [\n 111.950924,\n 43.693133\n ],\n [\n 111.970578,\n 43.748421\n ],\n [\n 111.959884,\n 43.82316\n ],\n [\n 111.870284,\n 43.940206\n ],\n [\n 111.77317,\n 44.010587\n ],\n [\n 111.702357,\n 44.033974\n ],\n [\n 111.663049,\n 44.061138\n ],\n [\n 111.559287,\n 44.17131\n ],\n [\n 111.541656,\n 44.20662\n ],\n [\n 111.534141,\n 44.262088\n ],\n [\n 111.506683,\n 44.294229\n ],\n [\n 111.428645,\n 44.31947\n ],\n [\n 111.415927,\n 44.357148\n ],\n [\n 111.4272,\n 44.39431\n ],\n [\n 111.478358,\n 44.488829\n ],\n [\n 111.514487,\n 44.507453\n ],\n [\n 111.530673,\n 44.550233\n ],\n [\n 111.569981,\n 44.57618\n ],\n [\n 111.560732,\n 44.646944\n ],\n [\n 111.624608,\n 44.778297\n ],\n [\n 111.692241,\n 44.86018\n ],\n [\n 111.764499,\n 44.969339\n ],\n [\n 111.903523,\n 45.052245\n ],\n [\n 112.002661,\n 45.090743\n ],\n [\n 112.071161,\n 45.096079\n ],\n [\n 112.113648,\n 45.073115\n ],\n [\n 112.39661,\n 45.064542\n ],\n [\n 112.438808,\n 45.071498\n ],\n [\n 112.540547,\n 45.001091\n ],\n [\n 112.599799,\n 44.930598\n ],\n [\n 112.712232,\n 44.879335\n ],\n [\n 112.850678,\n 44.840695\n ],\n [\n 112.937965,\n 44.840208\n ],\n [\n 113.03797,\n 44.822502\n ],\n [\n 113.129015,\n 44.796991\n ],\n [\n 113.504177,\n 44.777484\n ],\n [\n 113.540595,\n 44.759434\n ],\n [\n 113.631062,\n 44.745446\n ],\n [\n 113.71228,\n 44.788214\n ],\n [\n 113.798989,\n 44.849464\n ],\n [\n 113.861998,\n 44.863265\n ],\n [\n 113.907376,\n 44.915191\n ],\n [\n 114.065186,\n 44.931246\n ],\n [\n 114.116923,\n 44.956861\n ],\n [\n 114.190915,\n 45.03671\n ],\n [\n 114.313464,\n 45.107396\n ],\n [\n 114.347281,\n 45.119357\n ],\n [\n 114.409712,\n 45.179609\n ],\n [\n 114.459714,\n 45.213342\n ],\n [\n 114.519543,\n 45.283809\n ],\n [\n 114.539776,\n 45.326015\n ],\n [\n 114.551048,\n 45.387657\n ],\n [\n 114.744988,\n 45.438304\n ],\n [\n 114.920719,\n 45.386049\n ],\n [\n 114.974189,\n 45.37704\n ],\n [\n 115.16784,\n 45.396343\n ],\n [\n 115.36467,\n 45.392322\n ],\n [\n 115.530285,\n 45.428982\n ],\n [\n 115.699657,\n 45.459515\n ],\n [\n 115.863827,\n 45.572982\n ],\n [\n 115.936663,\n 45.632913\n ],\n [\n 116.026841,\n 45.661093\n ],\n [\n 116.035512,\n 45.6851\n ],\n [\n 116.115573,\n 45.679659\n ],\n [\n 116.174246,\n 45.68862\n ],\n [\n 116.217312,\n 45.722369\n ],\n [\n 116.223093,\n 45.747309\n ],\n [\n 116.260956,\n 45.775911\n ],\n [\n 116.286969,\n 45.775112\n ],\n [\n 116.288703,\n 45.838976\n ],\n [\n 116.243036,\n 45.876143\n ],\n [\n 116.27165,\n 45.966802\n ],\n [\n 116.414142,\n 46.134029\n ],\n [\n 116.439577,\n 46.137679\n ],\n [\n 116.536113,\n 46.232664\n ],\n [\n 116.573398,\n 46.258958\n ],\n [\n 116.585249,\n 46.292361\n ],\n [\n 116.673403,\n 46.325112\n ],\n [\n 116.745661,\n 46.327801\n ],\n [\n 116.813294,\n 46.355946\n ],\n [\n 116.82659,\n 46.380443\n ],\n [\n 117.097412,\n 46.357211\n ],\n [\n 117.247708,\n 46.367011\n ],\n [\n 117.371991,\n 46.360214\n ],\n [\n 117.375749,\n 46.416457\n ],\n [\n 117.392224,\n 46.463176\n ],\n [\n 117.447718,\n 46.528138\n ],\n [\n 117.419971,\n 46.582004\n ],\n [\n 117.495697,\n 46.600577\n ],\n [\n 117.595991,\n 46.603567\n ],\n [\n 117.630096,\n 46.591606\n ],\n [\n 117.641079,\n 46.558228\n ],\n [\n 117.703799,\n 46.516791\n ],\n [\n 117.769987,\n 46.537592\n ],\n [\n 117.813342,\n 46.530817\n ],\n [\n 117.870859,\n 46.54988\n ],\n [\n 117.868547,\n 46.575706\n ],\n [\n 117.914503,\n 46.607973\n ],\n [\n 117.982425,\n 46.614895\n ],\n [\n 117.993119,\n 46.63157\n ],\n [\n 118.04659,\n 46.631412\n ],\n [\n 118.124339,\n 46.678262\n ],\n [\n 118.19284,\n 46.682819\n ],\n [\n 118.238796,\n 46.709524\n ],\n [\n 118.316545,\n 46.739513\n ],\n [\n 118.410191,\n 46.72821\n ],\n [\n 118.446609,\n 46.704498\n ],\n [\n 118.585922,\n 46.693031\n ],\n [\n 118.638815,\n 46.721459\n ],\n [\n 118.676967,\n 46.698058\n ],\n [\n 118.787955,\n 46.687061\n ],\n [\n 118.788244,\n 46.717533\n ],\n [\n 118.845183,\n 46.771838\n ],\n [\n 118.91455,\n 46.774976\n ],\n [\n 118.912527,\n 46.733391\n ],\n [\n 118.950968,\n 46.722087\n ],\n [\n 119.011376,\n 46.745634\n ],\n [\n 119.040857,\n 46.708896\n ],\n [\n 119.123231,\n 46.642893\n ],\n [\n 119.152423,\n 46.658301\n ],\n [\n 119.262833,\n 46.648868\n ],\n [\n 119.313413,\n 46.610805\n ],\n [\n 119.357924,\n 46.6193\n ],\n [\n 119.37411,\n 46.603252\n ],\n [\n 119.431916,\n 46.638647\n ],\n [\n 119.491746,\n 46.62921\n ],\n [\n 119.558223,\n 46.633772\n ],\n [\n 119.598976,\n 46.618199\n ],\n [\n 119.656782,\n 46.625593\n ],\n [\n 119.677593,\n 46.58468\n ],\n [\n 119.739734,\n 46.615367\n ],\n [\n 119.783667,\n 46.625907\n ],\n [\n 119.813437,\n 46.668361\n ],\n [\n 119.804188,\n 46.681719\n ],\n [\n 119.906794,\n 46.668518\n ],\n [\n 119.952461,\n 46.604196\n ],\n [\n 119.907083,\n 46.53775\n ],\n [\n 119.948704,\n 46.493617\n ],\n [\n 119.909396,\n 46.429088\n ],\n [\n 119.984544,\n 46.418667\n ],\n [\n 119.961421,\n 46.39561\n ],\n [\n 119.900147,\n 46.403507\n ],\n [\n 119.838294,\n 46.37586\n ],\n [\n 119.874134,\n 46.345512\n ],\n [\n 119.837716,\n 46.320683\n ],\n [\n 119.835693,\n 46.235357\n ],\n [\n 119.889452,\n 46.209686\n ],\n [\n 119.850433,\n 46.18321\n ],\n [\n 119.879336,\n 46.144344\n ],\n [\n 119.855058,\n 46.107992\n ],\n [\n 119.833669,\n 46.004838\n ],\n [\n 119.807657,\n 45.991314\n ],\n [\n 119.829912,\n 45.974603\n ],\n [\n 119.807946,\n 45.820463\n ],\n [\n 119.751585,\n 45.76297\n ],\n [\n 119.700426,\n 45.736439\n ],\n [\n 119.708808,\n 45.703178\n ],\n [\n 119.681639,\n 45.669417\n ],\n [\n 119.596086,\n 45.670057\n ],\n [\n 119.566027,\n 45.65565\n ],\n [\n 119.544927,\n 45.635956\n ],\n [\n 119.55909,\n 45.615933\n ],\n [\n 119.496081,\n 45.550691\n ],\n [\n 119.396943,\n 45.511863\n ],\n [\n 119.304742,\n 45.468029\n ],\n [\n 119.313413,\n 45.385244\n ],\n [\n 119.248381,\n 45.304111\n ],\n [\n 119.323818,\n 45.245925\n ],\n [\n 119.311101,\n 45.186551\n ],\n [\n 119.360814,\n 45.165884\n ],\n [\n 119.373243,\n 45.105456\n ],\n [\n 119.342027,\n 45.076026\n ],\n [\n 119.293181,\n 45.087347\n ],\n [\n 119.28769,\n 45.121943\n ],\n [\n 119.215432,\n 45.152802\n ],\n [\n 119.159071,\n 45.099959\n ],\n [\n 119.156759,\n 45.074409\n ],\n [\n 119.196934,\n 45.03234\n ],\n [\n 119.231907,\n 45.019065\n ],\n [\n 119.208495,\n 44.997366\n ],\n [\n 119.171788,\n 45.015989\n ],\n [\n 119.15329,\n 44.992993\n ],\n [\n 119.18624,\n 44.952971\n ],\n [\n 119.230172,\n 44.9353\n ],\n [\n 119.224681,\n 44.909676\n ],\n [\n 119.146642,\n 44.924922\n ],\n [\n 119.107334,\n 44.920543\n ],\n [\n 119.082188,\n 44.938381\n ],\n [\n 119.067448,\n 44.870895\n ],\n [\n 119.14751,\n 44.808692\n ],\n [\n 119.173233,\n 44.76041\n ],\n [\n 119.125832,\n 44.762199\n ],\n [\n 119.148377,\n 44.731617\n ],\n [\n 119.074674,\n 44.712739\n ],\n [\n 119.001549,\n 44.713879\n ],\n [\n 118.97149,\n 44.729827\n ],\n [\n 118.926112,\n 44.7046\n ],\n [\n 118.96831,\n 44.691087\n ],\n [\n 119.001549,\n 44.648248\n ],\n [\n 118.981606,\n 44.566064\n ],\n [\n 118.904723,\n 44.516436\n ],\n [\n 118.816569,\n 44.49128\n ],\n [\n 118.789111,\n 44.46317\n ],\n [\n 118.75067,\n 44.477554\n ],\n [\n 118.659336,\n 44.453361\n ],\n [\n 118.635635,\n 44.472814\n ],\n [\n 118.596038,\n 44.468728\n ],\n [\n 118.54777,\n 44.442243\n ],\n [\n 118.544591,\n 44.411165\n ],\n [\n 118.476957,\n 44.399383\n ],\n [\n 118.466552,\n 44.354036\n ],\n [\n 118.428111,\n 44.346174\n ],\n [\n 118.414816,\n 44.322419\n ],\n [\n 118.34198,\n 44.319961\n ],\n [\n 118.250935,\n 44.337493\n ],\n [\n 118.214228,\n 44.306195\n ],\n [\n 118.237351,\n 44.279144\n ],\n [\n 118.19284,\n 44.242565\n ],\n [\n 118.172608,\n 44.204321\n ],\n [\n 118.148907,\n 44.215157\n ],\n [\n 118.128675,\n 44.190692\n ],\n [\n 118.116825,\n 44.132362\n ],\n [\n 118.06162,\n 44.100461\n ],\n [\n 117.962193,\n 44.121182\n ],\n [\n 117.904098,\n 44.121182\n ],\n [\n 117.859876,\n 44.072987\n ],\n [\n 117.827793,\n 44.063113\n ],\n [\n 117.790219,\n 44.019482\n ],\n [\n 117.700331,\n 44.016353\n ],\n [\n 117.643392,\n 44.042207\n ],\n [\n 117.686746,\n 44.095033\n ],\n [\n 117.624894,\n 44.128745\n ],\n [\n 117.634721,\n 44.14847\n ],\n [\n 117.550613,\n 44.187736\n ],\n [\n 117.522866,\n 44.226811\n ],\n [\n 117.452631,\n 44.235017\n ],\n [\n 117.206666,\n 44.220081\n ],\n [\n 117.166201,\n 44.192662\n ],\n [\n 117.120823,\n 44.179195\n ],\n [\n 117.011281,\n 44.057681\n ],\n [\n 116.961567,\n 44.024752\n ],\n [\n 116.970816,\n 43.988674\n ],\n [\n 117.022264,\n 43.969721\n ],\n [\n 117.031802,\n 43.942845\n ],\n [\n 117.000008,\n 43.912328\n ],\n [\n 117.013304,\n 43.85075\n ],\n [\n 116.986135,\n 43.840343\n ],\n [\n 117.001164,\n 43.782495\n ],\n [\n 117.053768,\n 43.753384\n ],\n [\n 116.971683,\n 43.673422\n ],\n [\n 116.858383,\n 43.657351\n ],\n [\n 116.837284,\n 43.614086\n ],\n [\n 116.812138,\n 43.612593\n ],\n [\n 116.804912,\n 43.565147\n ],\n [\n 116.830636,\n 43.5067\n ],\n [\n 116.790461,\n 43.484436\n ],\n [\n 116.734967,\n 43.509026\n ],\n [\n 116.681207,\n 43.517165\n ],\n [\n 116.621956,\n 43.505039\n ],\n [\n 116.59681,\n 43.410605\n ],\n [\n 116.518194,\n 43.365664\n ],\n [\n 116.436398,\n 43.328188\n ],\n [\n 116.413853,\n 43.258003\n ],\n [\n 116.37021,\n 43.243323\n ],\n [\n 116.356336,\n 43.156835\n ],\n [\n 116.419345,\n 43.104015\n ],\n [\n 116.436109,\n 43.077922\n ],\n [\n 116.503742,\n 43.04914\n ],\n [\n 116.500852,\n 43.01532\n ],\n [\n 116.580624,\n 42.985336\n ],\n [\n 116.664732,\n 42.933038\n ],\n [\n 116.673981,\n 42.889758\n ],\n [\n 116.666177,\n 42.81655\n ],\n [\n 116.67427,\n 42.761586\n ],\n [\n 116.619354,\n 42.671387\n ],\n [\n 116.58785,\n 42.599775\n ],\n [\n 116.63554,\n 42.614609\n ],\n [\n 116.638141,\n 42.577179\n ],\n [\n 116.669357,\n 42.555755\n ],\n [\n 116.699127,\n 42.592019\n ],\n [\n 116.801444,\n 42.582913\n ],\n [\n 116.82052,\n 42.546981\n ],\n [\n 116.885552,\n 42.534662\n ],\n [\n 116.875725,\n 42.482996\n ],\n [\n 116.907807,\n 42.443965\n ],\n [\n 116.893645,\n 42.387826\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 152900,\n \"name\": \"阿拉善盟\",\n \"center\": [\n 105.706422,\n 38.844814\n ],\n \"centroid\": [\n 102.422231,\n 40.532548\n ],\n \"childrenNum\": 3,\n \"level\": \"city\",\n \"subFeatureIndex\": 11,\n \"acroutes\": [\n 100000,\n 150000\n ],\n \"parent\": {\n \"adcode\": 150000\n }\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 105.226615,\n 41.748186\n ],\n [\n 105.226326,\n 41.67877\n ],\n [\n 105.201759,\n 41.542456\n ],\n [\n 105.222858,\n 41.396748\n ],\n [\n 105.245691,\n 41.32403\n ],\n [\n 105.317082,\n 41.201446\n ],\n [\n 105.334424,\n 41.131442\n ],\n [\n 105.31766,\n 41.113153\n ],\n [\n 105.379224,\n 41.059464\n ],\n [\n 105.403213,\n 41.015756\n ],\n [\n 105.395409,\n 40.984987\n ],\n [\n 105.503507,\n 40.927559\n ],\n [\n 105.559001,\n 40.89017\n ],\n [\n 105.636461,\n 40.854492\n ],\n [\n 105.697447,\n 40.811168\n ],\n [\n 105.781266,\n 40.785333\n ],\n [\n 105.835604,\n 40.781864\n ],\n [\n 105.944279,\n 40.739534\n ],\n [\n 106.115097,\n 40.717838\n ],\n [\n 106.161631,\n 40.68502\n ],\n [\n 106.237935,\n 40.661221\n ],\n [\n 106.235334,\n 40.626636\n ],\n [\n 106.273197,\n 40.591165\n ],\n [\n 106.321754,\n 40.589425\n ],\n [\n 106.467137,\n 40.546276\n ],\n [\n 106.482455,\n 40.502925\n ],\n [\n 106.37956,\n 40.501009\n ],\n [\n 106.34979,\n 40.527999\n ],\n [\n 106.282446,\n 40.548539\n ],\n [\n 106.268283,\n 40.519294\n ],\n [\n 106.197182,\n 40.515637\n ],\n [\n 106.219148,\n 40.461289\n ],\n [\n 106.32002,\n 40.34024\n ],\n [\n 106.426961,\n 40.339542\n ],\n [\n 106.476386,\n 40.319113\n ],\n [\n 106.528122,\n 40.365375\n ],\n [\n 106.604426,\n 40.377764\n ],\n [\n 106.672349,\n 40.375845\n ],\n [\n 106.820044,\n 40.355252\n ],\n [\n 106.765706,\n 40.29466\n ],\n [\n 106.705587,\n 40.262158\n ],\n [\n 106.740271,\n 40.196234\n ],\n [\n 106.866578,\n 40.181012\n ],\n [\n 106.801546,\n 40.10187\n ],\n [\n 106.759347,\n 40.083647\n ],\n [\n 106.718016,\n 40.047363\n ],\n [\n 106.720039,\n 39.993163\n ],\n [\n 106.704142,\n 39.967364\n ],\n [\n 106.723796,\n 39.932422\n ],\n [\n 106.696049,\n 39.890258\n ],\n [\n 106.754145,\n 39.850706\n ],\n [\n 106.766573,\n 39.763787\n ],\n [\n 106.757324,\n 39.710595\n ],\n [\n 106.795476,\n 39.689449\n ],\n [\n 106.755012,\n 39.626851\n ],\n [\n 106.637376,\n 39.573731\n ],\n [\n 106.611074,\n 39.543005\n ],\n [\n 106.635064,\n 39.476209\n ],\n [\n 106.73449,\n 39.437303\n ],\n [\n 106.750965,\n 39.381559\n ],\n [\n 106.680731,\n 39.355885\n ],\n [\n 106.602692,\n 39.375363\n ],\n [\n 106.555869,\n 39.322228\n ],\n [\n 106.525232,\n 39.308406\n ],\n [\n 106.506445,\n 39.270116\n ],\n [\n 106.402972,\n 39.291568\n ],\n [\n 106.279845,\n 39.262136\n ],\n [\n 106.295452,\n 39.167907\n ],\n [\n 106.250941,\n 39.131494\n ],\n [\n 106.146023,\n 39.153166\n ],\n [\n 106.098333,\n 39.087597\n ],\n [\n 106.078101,\n 39.026592\n ],\n [\n 106.089373,\n 39.015916\n ],\n [\n 106.060759,\n 38.968563\n ],\n [\n 106.018849,\n 38.951109\n ],\n [\n 105.973183,\n 38.911377\n ],\n [\n 106.002953,\n 38.875902\n ],\n [\n 105.935898,\n 38.810075\n ],\n [\n 105.898613,\n 38.789547\n ],\n [\n 105.905838,\n 38.731324\n ],\n [\n 105.893121,\n 38.691111\n ],\n [\n 105.852946,\n 38.641574\n ],\n [\n 105.875201,\n 38.591823\n ],\n [\n 105.856703,\n 38.572128\n ],\n [\n 105.862773,\n 38.526272\n ],\n [\n 105.83676,\n 38.475903\n ],\n [\n 105.835604,\n 38.390322\n ],\n [\n 105.82173,\n 38.368058\n ],\n [\n 105.865952,\n 38.29727\n ],\n [\n 105.84254,\n 38.241165\n ],\n [\n 105.797163,\n 38.217055\n ],\n [\n 105.775196,\n 38.186817\n ],\n [\n 105.76797,\n 38.121619\n ],\n [\n 105.782133,\n 38.082327\n ],\n [\n 105.839939,\n 38.007832\n ],\n [\n 105.799764,\n 37.940125\n ],\n [\n 105.808724,\n 37.87543\n ],\n [\n 105.760745,\n 37.799819\n ],\n [\n 105.677504,\n 37.771943\n ],\n [\n 105.62201,\n 37.777736\n ],\n [\n 105.616229,\n 37.722501\n ],\n [\n 105.598887,\n 37.699308\n ],\n [\n 105.467378,\n 37.694958\n ],\n [\n 105.403791,\n 37.709999\n ],\n [\n 105.31477,\n 37.702026\n ],\n [\n 105.221991,\n 37.677014\n ],\n [\n 105.111003,\n 37.633857\n ],\n [\n 105.028051,\n 37.581055\n ],\n [\n 104.866482,\n 37.566714\n ],\n [\n 104.806075,\n 37.539659\n ],\n [\n 104.623696,\n 37.522585\n ],\n [\n 104.41964,\n 37.511866\n ],\n [\n 104.407501,\n 37.464614\n ],\n [\n 104.322526,\n 37.448432\n ],\n [\n 104.23784,\n 37.411874\n ],\n [\n 104.183502,\n 37.40678\n ],\n [\n 104.074537,\n 37.475158\n ],\n [\n 103.93349,\n 37.574157\n ],\n [\n 103.871348,\n 37.605737\n ],\n [\n 103.841,\n 37.647459\n ],\n [\n 103.683189,\n 37.777918\n ],\n [\n 103.636077,\n 37.795476\n ],\n [\n 103.401962,\n 37.861869\n ],\n [\n 103.385487,\n 37.946989\n ],\n [\n 103.368145,\n 37.985631\n ],\n [\n 103.368723,\n 38.088997\n ],\n [\n 103.534916,\n 38.156747\n ],\n [\n 103.507747,\n 38.28091\n ],\n [\n 103.466416,\n 38.350996\n ],\n [\n 103.416413,\n 38.405041\n ],\n [\n 103.859787,\n 38.644436\n ],\n [\n 104.011528,\n 38.859139\n ],\n [\n 104.044478,\n 38.894979\n ],\n [\n 104.167894,\n 38.940421\n ],\n [\n 104.196219,\n 38.988149\n ],\n [\n 104.191017,\n 39.042249\n ],\n [\n 104.207202,\n 39.083685\n ],\n [\n 104.177432,\n 39.152101\n ],\n [\n 104.047657,\n 39.297772\n ],\n [\n 104.073381,\n 39.351811\n ],\n [\n 104.090145,\n 39.419788\n ],\n [\n 103.955745,\n 39.457112\n ],\n [\n 103.838977,\n 39.460295\n ],\n [\n 103.595324,\n 39.386693\n ],\n [\n 103.428842,\n 39.353582\n ],\n [\n 103.346468,\n 39.332504\n ],\n [\n 103.188079,\n 39.215481\n ],\n [\n 103.133163,\n 39.192763\n ],\n [\n 103.013215,\n 39.101107\n ],\n [\n 102.947027,\n 39.106794\n ],\n [\n 102.583426,\n 39.180691\n ],\n [\n 102.453651,\n 39.255219\n ],\n [\n 102.352201,\n 39.231272\n ],\n [\n 102.286591,\n 39.192585\n ],\n [\n 102.059701,\n 39.143575\n ],\n [\n 102.008254,\n 39.125809\n ],\n [\n 101.897555,\n 39.11106\n ],\n [\n 101.8305,\n 39.093463\n ],\n [\n 101.926169,\n 39.00061\n ],\n [\n 101.955072,\n 38.986012\n ],\n [\n 102.045828,\n 38.904604\n ],\n [\n 102.07502,\n 38.891592\n ],\n [\n 101.941488,\n 38.808826\n ],\n [\n 101.873854,\n 38.734004\n ],\n [\n 101.777029,\n 38.660534\n ],\n [\n 101.679047,\n 38.690932\n ],\n [\n 101.601876,\n 38.655169\n ],\n [\n 101.557654,\n 38.715063\n ],\n [\n 101.412272,\n 38.764192\n ],\n [\n 101.331343,\n 38.777228\n ],\n [\n 101.306197,\n 38.801865\n ],\n [\n 101.341459,\n 38.82221\n ],\n [\n 101.335389,\n 38.846831\n ],\n [\n 101.242032,\n 38.861279\n ],\n [\n 101.237697,\n 38.907278\n ],\n [\n 101.198678,\n 38.943271\n ],\n [\n 101.228737,\n 39.02072\n ],\n [\n 101.117171,\n 38.975151\n ],\n [\n 100.969187,\n 38.947012\n ],\n [\n 100.969476,\n 38.996694\n ],\n [\n 100.901843,\n 39.029973\n ],\n [\n 100.875541,\n 39.00239\n ],\n [\n 100.835077,\n 39.026059\n ],\n [\n 100.829296,\n 39.074973\n ],\n [\n 100.864269,\n 39.106972\n ],\n [\n 100.84288,\n 39.200218\n ],\n [\n 100.842013,\n 39.405809\n ],\n [\n 100.707903,\n 39.40457\n ],\n [\n 100.617436,\n 39.387401\n ],\n [\n 100.499222,\n 39.4005\n ],\n [\n 100.500668,\n 39.481336\n ],\n [\n 100.44315,\n 39.485578\n ],\n [\n 100.326382,\n 39.509085\n ],\n [\n 100.300947,\n 39.572318\n ],\n [\n 100.314242,\n 39.606914\n ],\n [\n 100.250078,\n 39.685042\n ],\n [\n 100.127817,\n 39.702137\n ],\n [\n 100.040819,\n 39.757096\n ],\n [\n 99.904396,\n 39.785791\n ],\n [\n 99.822022,\n 39.860025\n ],\n [\n 99.672593,\n 39.887974\n ],\n [\n 99.487903,\n 39.876022\n ],\n [\n 99.441079,\n 39.885865\n ],\n [\n 99.459577,\n 39.898166\n ],\n [\n 99.524609,\n 39.888149\n ],\n [\n 99.713925,\n 39.972103\n ],\n [\n 99.75121,\n 40.006849\n ],\n [\n 99.841388,\n 40.01334\n ],\n [\n 99.928386,\n 40.064894\n ],\n [\n 99.955844,\n 40.150907\n ],\n [\n 100.0018,\n 40.196934\n ],\n [\n 100.169727,\n 40.277537\n ],\n [\n 100.169727,\n 40.541403\n ],\n [\n 100.242563,\n 40.61864\n ],\n [\n 100.23736,\n 40.716796\n ],\n [\n 100.108163,\n 40.875624\n ],\n [\n 100.057005,\n 40.908002\n ],\n [\n 99.985903,\n 40.909733\n ],\n [\n 99.673171,\n 40.932924\n ],\n [\n 99.565941,\n 40.846696\n ],\n [\n 99.174882,\n 40.858303\n ],\n [\n 99.173148,\n 40.747343\n ],\n [\n 99.125747,\n 40.715234\n ],\n [\n 99.102046,\n 40.676335\n ],\n [\n 99.041638,\n 40.693703\n ],\n [\n 98.984988,\n 40.782905\n ],\n [\n 98.791049,\n 40.705337\n ],\n [\n 98.807234,\n 40.65931\n ],\n [\n 98.800298,\n 40.610294\n ],\n [\n 98.715611,\n 40.661742\n ],\n [\n 98.687864,\n 40.696829\n ],\n [\n 98.668499,\n 40.772845\n ],\n [\n 98.56994,\n 40.746822\n ],\n [\n 98.628035,\n 40.677898\n ],\n [\n 98.344206,\n 40.568376\n ],\n [\n 98.333223,\n 40.919079\n ],\n [\n 98.250271,\n 40.939153\n ],\n [\n 98.18495,\n 40.988099\n ],\n [\n 98.142463,\n 41.001756\n ],\n [\n 97.971934,\n 41.097966\n ],\n [\n 97.629432,\n 41.440547\n ],\n [\n 97.614114,\n 41.47728\n ],\n [\n 97.847073,\n 41.656527\n ],\n [\n 97.500814,\n 42.243867\n ],\n [\n 97.371328,\n 42.456978\n ],\n [\n 97.172763,\n 42.795209\n ],\n [\n 97.282595,\n 42.782098\n ],\n [\n 97.831754,\n 42.706069\n ],\n [\n 98.195355,\n 42.653366\n ],\n [\n 98.546528,\n 42.638203\n ],\n [\n 98.962733,\n 42.606855\n ],\n [\n 99.507557,\n 42.56807\n ],\n [\n 99.969139,\n 42.647806\n ],\n [\n 100.272622,\n 42.63635\n ],\n [\n 100.325515,\n 42.690077\n ],\n [\n 100.576683,\n 42.682838\n ],\n [\n 100.862824,\n 42.671219\n ],\n [\n 101.155034,\n 42.613935\n ],\n [\n 101.581644,\n 42.52521\n ],\n [\n 101.80362,\n 42.503769\n ],\n [\n 101.981952,\n 42.326556\n ],\n [\n 102.070395,\n 42.232166\n ],\n [\n 102.093807,\n 42.223686\n ],\n [\n 102.449026,\n 42.144088\n ],\n [\n 102.540938,\n 42.162257\n ],\n [\n 102.712045,\n 42.152749\n ],\n [\n 103.021886,\n 42.028162\n ],\n [\n 103.207444,\n 41.962796\n ],\n [\n 103.418437,\n 41.882359\n ],\n [\n 103.868747,\n 41.802503\n ],\n [\n 104.095636,\n 41.80865\n ],\n [\n 104.53005,\n 41.874855\n ],\n [\n 104.52427,\n 41.661832\n ],\n [\n 104.689017,\n 41.645232\n ],\n [\n 104.923133,\n 41.654131\n ],\n [\n 105.009553,\n 41.583243\n ],\n [\n 105.226615,\n 41.748186\n ]\n ]\n ]\n ]\n }\n }\n ]\n}', 'admin', '2020-05-19 16:42:33', 'jeecg', '2020-05-19 16:42:33', '0', NULL); +INSERT INTO `jimu_report_map` VALUES ('1262343644795432961', '河北省', '河北省', '{\n \"type\": \"FeatureCollection\",\n \"features\": [\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 130100,\n \"name\": \"石家庄市\",\n \"center\": [\n 114.502461,\n 38.045474\n ],\n \"centroid\": [\n 114.44505,\n 38.133023\n ],\n \"childrenNum\": 22,\n \"level\": \"city\",\n \"parent\": {\n \"adcode\": 130000\n },\n \"subFeatureIndex\": 0,\n \"acroutes\": [\n 100000,\n 130000\n ]\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 113.839548,\n 38.758413\n ],\n [\n 113.864664,\n 38.746006\n ],\n [\n 113.883245,\n 38.74667\n ],\n [\n 113.932324,\n 38.71362\n ],\n [\n 113.929697,\n 38.702467\n ],\n [\n 113.964617,\n 38.699811\n ],\n [\n 113.991655,\n 38.676769\n ],\n [\n 114.028624,\n 38.688524\n ],\n [\n 114.052139,\n 38.686399\n ],\n [\n 114.086097,\n 38.65837\n ],\n [\n 114.125053,\n 38.659632\n ],\n [\n 114.129153,\n 38.669596\n ],\n [\n 114.182205,\n 38.67657\n ],\n [\n 114.212831,\n 38.688192\n ],\n [\n 114.311502,\n 38.706517\n ],\n [\n 114.341167,\n 38.690184\n ],\n [\n 114.366411,\n 38.6862\n ],\n [\n 114.413504,\n 38.703928\n ],\n [\n 114.437787,\n 38.692773\n ],\n [\n 114.452652,\n 38.699413\n ],\n [\n 114.498463,\n 38.678297\n ],\n [\n 114.522106,\n 38.65372\n ],\n [\n 114.53633,\n 38.649268\n ],\n [\n 114.536907,\n 38.632324\n ],\n [\n 114.552284,\n 38.612983\n ],\n [\n 114.527616,\n 38.590644\n ],\n [\n 114.56324,\n 38.590644\n ],\n [\n 114.58432,\n 38.596429\n ],\n [\n 114.595724,\n 38.568897\n ],\n [\n 114.635257,\n 38.514801\n ],\n [\n 114.651851,\n 38.504682\n ],\n [\n 114.6737,\n 38.473452\n ],\n [\n 114.702084,\n 38.489102\n ],\n [\n 114.729442,\n 38.484574\n ],\n [\n 114.765259,\n 38.496626\n ],\n [\n 114.81075,\n 38.492365\n ],\n [\n 114.830868,\n 38.46033\n ],\n [\n 114.819143,\n 38.449871\n ],\n [\n 114.837852,\n 38.435745\n ],\n [\n 114.840992,\n 38.460797\n ],\n [\n 114.858163,\n 38.448605\n ],\n [\n 114.853998,\n 38.435879\n ],\n [\n 114.882254,\n 38.424149\n ],\n [\n 114.910381,\n 38.393751\n ],\n [\n 114.923388,\n 38.388217\n ],\n [\n 114.932871,\n 38.344194\n ],\n [\n 114.942994,\n 38.343193\n ],\n [\n 114.922875,\n 38.315631\n ],\n [\n 114.906986,\n 38.309624\n ],\n [\n 114.902565,\n 38.294936\n ],\n [\n 114.883343,\n 38.284854\n ],\n [\n 114.886162,\n 38.265286\n ],\n [\n 114.915059,\n 38.263348\n ],\n [\n 114.927681,\n 38.283385\n ],\n [\n 114.970096,\n 38.281114\n ],\n [\n 114.990087,\n 38.272165\n ],\n [\n 114.989062,\n 38.258138\n ],\n [\n 115.031862,\n 38.267089\n ],\n [\n 115.056465,\n 38.258472\n ],\n [\n 115.066204,\n 38.264684\n ],\n [\n 115.056722,\n 38.288326\n ],\n [\n 115.073765,\n 38.293134\n ],\n [\n 115.085874,\n 38.276773\n ],\n [\n 115.108107,\n 38.264551\n ],\n [\n 115.152317,\n 38.256802\n ],\n [\n 115.168591,\n 38.259608\n ],\n [\n 115.19422,\n 38.236759\n ],\n [\n 115.210174,\n 38.236491\n ],\n [\n 115.225871,\n 38.269894\n ],\n [\n 115.252205,\n 38.29093\n ],\n [\n 115.265788,\n 38.287658\n ],\n [\n 115.263994,\n 38.260543\n ],\n [\n 115.273605,\n 38.2403\n ],\n [\n 115.302758,\n 38.235289\n ],\n [\n 115.324734,\n 38.248184\n ],\n [\n 115.323645,\n 38.220586\n ],\n [\n 115.35094,\n 38.210493\n ],\n [\n 115.342418,\n 38.196254\n ],\n [\n 115.346903,\n 38.13967\n ],\n [\n 115.364843,\n 38.13793\n ],\n [\n 115.383232,\n 38.0886\n ],\n [\n 115.420522,\n 38.089671\n ],\n [\n 115.439871,\n 38.082038\n ],\n [\n 115.468063,\n 38.095161\n ],\n [\n 115.482992,\n 38.08398\n ],\n [\n 115.466782,\n 38.063554\n ],\n [\n 115.45134,\n 38.017323\n ],\n [\n 115.438205,\n 38.001102\n ],\n [\n 115.464219,\n 37.99299\n ],\n [\n 115.444997,\n 37.989168\n ],\n [\n 115.456017,\n 37.974551\n ],\n [\n 115.457555,\n 37.95074\n ],\n [\n 115.448585,\n 37.936584\n ],\n [\n 115.412769,\n 37.943293\n ],\n [\n 115.408668,\n 37.918936\n ],\n [\n 115.385795,\n 37.917191\n ],\n [\n 115.365484,\n 37.906318\n ],\n [\n 115.360294,\n 37.880068\n ],\n [\n 115.389831,\n 37.874629\n ],\n [\n 115.388614,\n 37.853003\n ],\n [\n 115.363049,\n 37.849845\n ],\n [\n 115.360166,\n 37.820215\n ],\n [\n 115.349722,\n 37.805765\n ],\n [\n 115.352349,\n 37.784052\n ],\n [\n 115.371635,\n 37.770335\n ],\n [\n 115.344468,\n 37.74814\n ],\n [\n 115.360294,\n 37.731994\n ],\n [\n 115.386179,\n 37.727082\n ],\n [\n 115.394316,\n 37.712143\n ],\n [\n 115.380989,\n 37.707432\n ],\n [\n 115.333768,\n 37.71322\n ],\n [\n 115.317046,\n 37.695383\n ],\n [\n 115.325567,\n 37.682458\n ],\n [\n 115.316853,\n 37.660102\n ],\n [\n 115.301412,\n 37.660169\n ],\n [\n 115.297376,\n 37.629587\n ],\n [\n 115.258356,\n 37.639625\n ],\n [\n 115.255088,\n 37.645621\n ],\n [\n 115.253807,\n 37.671415\n ],\n [\n 115.261431,\n 37.68818\n ],\n [\n 115.243235,\n 37.722641\n ],\n [\n 115.227281,\n 37.732599\n ],\n [\n 115.172564,\n 37.749351\n ],\n [\n 115.152765,\n 37.759507\n ],\n [\n 115.160262,\n 37.780287\n ],\n [\n 115.150523,\n 37.808521\n ],\n [\n 115.131173,\n 37.799783\n ],\n [\n 115.122972,\n 37.811479\n ],\n [\n 115.097471,\n 37.807849\n ],\n [\n 115.097215,\n 37.797498\n ],\n [\n 115.072099,\n 37.788893\n ],\n [\n 115.066653,\n 37.771007\n ],\n [\n 115.070049,\n 37.745651\n ],\n [\n 115.041024,\n 37.733541\n ],\n [\n 115.012512,\n 37.75157\n ],\n [\n 115.001748,\n 37.734685\n ],\n [\n 114.987524,\n 37.742691\n ],\n [\n 114.960165,\n 37.720084\n ],\n [\n 114.931846,\n 37.728899\n ],\n [\n 114.904038,\n 37.729302\n ],\n [\n 114.895965,\n 37.712547\n ],\n [\n 114.881357,\n 37.716113\n ],\n [\n 114.871041,\n 37.702114\n ],\n [\n 114.847783,\n 37.69673\n ],\n [\n 114.841504,\n 37.676129\n ],\n [\n 114.808571,\n 37.659832\n ],\n [\n 114.797423,\n 37.628239\n ],\n [\n 114.764618,\n 37.624399\n ],\n [\n 114.725983,\n 37.630665\n ],\n [\n 114.707338,\n 37.615774\n ],\n [\n 114.698816,\n 37.589353\n ],\n [\n 114.680171,\n 37.565283\n ],\n [\n 114.64679,\n 37.556247\n ],\n [\n 114.585217,\n 37.55301\n ],\n [\n 114.519927,\n 37.574656\n ],\n [\n 114.483471,\n 37.576814\n ],\n [\n 114.433495,\n 37.552537\n ],\n [\n 114.412095,\n 37.549907\n ],\n [\n 114.37269,\n 37.52967\n ],\n [\n 114.370192,\n 37.513612\n ],\n [\n 114.358274,\n 37.519212\n ],\n [\n 114.334632,\n 37.502949\n ],\n [\n 114.310861,\n 37.499979\n ],\n [\n 114.303621,\n 37.507808\n ],\n [\n 114.27293,\n 37.494445\n ],\n [\n 114.255439,\n 37.504096\n ],\n [\n 114.215009,\n 37.51125\n ],\n [\n 114.184575,\n 37.530817\n ],\n [\n 114.166123,\n 37.528186\n ],\n [\n 114.156191,\n 37.505244\n ],\n [\n 114.133766,\n 37.498899\n ],\n [\n 114.126526,\n 37.481957\n ],\n [\n 114.113263,\n 37.493837\n ],\n [\n 114.096477,\n 37.490935\n ],\n [\n 114.06899,\n 37.447384\n ],\n [\n 114.022666,\n 37.435496\n ],\n [\n 114.028304,\n 37.474598\n ],\n [\n 114.036762,\n 37.494175\n ],\n [\n 114.059635,\n 37.515906\n ],\n [\n 114.118325,\n 37.590634\n ],\n [\n 114.115378,\n 37.619884\n ],\n [\n 114.131139,\n 37.648315\n ],\n [\n 114.139725,\n 37.675927\n ],\n [\n 114.128256,\n 37.69821\n ],\n [\n 114.088275,\n 37.708845\n ],\n [\n 114.068029,\n 37.721564\n ],\n [\n 113.993769,\n 37.706893\n ],\n [\n 114.000817,\n 37.735358\n ],\n [\n 114.041182,\n 37.756817\n ],\n [\n 114.043873,\n 37.777463\n ],\n [\n 114.018821,\n 37.794876\n ],\n [\n 114.006648,\n 37.813495\n ],\n [\n 113.982557,\n 37.812823\n ],\n [\n 113.970191,\n 37.833923\n ],\n [\n 113.971536,\n 37.868786\n ],\n [\n 113.956864,\n 37.911419\n ],\n [\n 113.929185,\n 37.932022\n ],\n [\n 113.922842,\n 37.952082\n ],\n [\n 113.90125,\n 37.98481\n ],\n [\n 113.872353,\n 37.990375\n ],\n [\n 113.878376,\n 38.032402\n ],\n [\n 113.876261,\n 38.055047\n ],\n [\n 113.856015,\n 38.065898\n ],\n [\n 113.854733,\n 38.077082\n ],\n [\n 113.824235,\n 38.106676\n ],\n [\n 113.810075,\n 38.112566\n ],\n [\n 113.822505,\n 38.150442\n ],\n [\n 113.83359,\n 38.147431\n ],\n [\n 113.828848,\n 38.168971\n ],\n [\n 113.796876,\n 38.162884\n ],\n [\n 113.756575,\n 38.171713\n ],\n [\n 113.731139,\n 38.168369\n ],\n [\n 113.720631,\n 38.174656\n ],\n [\n 113.738507,\n 38.189501\n ],\n [\n 113.715057,\n 38.193713\n ],\n [\n 113.711725,\n 38.213702\n ],\n [\n 113.679112,\n 38.205413\n ],\n [\n 113.657072,\n 38.225599\n ],\n [\n 113.636761,\n 38.232682\n ],\n [\n 113.598894,\n 38.227136\n ],\n [\n 113.570318,\n 38.237427\n ],\n [\n 113.566282,\n 38.252393\n ],\n [\n 113.544818,\n 38.270495\n ],\n [\n 113.546035,\n 38.293067\n ],\n [\n 113.557248,\n 38.34346\n ],\n [\n 113.53431,\n 38.365208\n ],\n [\n 113.525468,\n 38.383016\n ],\n [\n 113.538026,\n 38.418017\n ],\n [\n 113.573202,\n 38.449205\n ],\n [\n 113.583517,\n 38.465992\n ],\n [\n 113.561348,\n 38.485773\n ],\n [\n 113.555518,\n 38.521058\n ],\n [\n 113.562053,\n 38.558321\n ],\n [\n 113.602803,\n 38.586854\n ],\n [\n 113.604212,\n 38.616107\n ],\n [\n 113.612862,\n 38.646013\n ],\n [\n 113.632596,\n 38.653122\n ],\n [\n 113.667067,\n 38.646943\n ],\n [\n 113.702114,\n 38.65166\n ],\n [\n 113.713839,\n 38.663684\n ],\n [\n 113.709995,\n 38.698284\n ],\n [\n 113.729024,\n 38.71196\n ],\n [\n 113.745363,\n 38.701538\n ],\n [\n 113.775669,\n 38.709836\n ],\n [\n 113.78041,\n 38.728355\n ],\n [\n 113.802899,\n 38.763321\n ],\n [\n 113.839548,\n 38.758413\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 130200,\n \"name\": \"唐山市\",\n \"center\": [\n 118.175393,\n 39.635113\n ],\n \"centroid\": [\n 118.343434,\n 39.717249\n ],\n \"childrenNum\": 14,\n \"level\": \"city\",\n \"parent\": {\n \"adcode\": 130000\n },\n \"subFeatureIndex\": 1,\n \"acroutes\": [\n 100000,\n 130000\n ]\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 119.319039,\n 39.429554\n ],\n [\n 119.317052,\n 39.410759\n ],\n [\n 119.272779,\n 39.363616\n ],\n [\n 119.239269,\n 39.352368\n ],\n [\n 119.185577,\n 39.342039\n ],\n [\n 119.121505,\n 39.281549\n ],\n [\n 119.096068,\n 39.241963\n ],\n [\n 119.038276,\n 39.21178\n ],\n [\n 119.023988,\n 39.186925\n ],\n [\n 118.977984,\n 39.163381\n ],\n [\n 118.926278,\n 39.123464\n ],\n [\n 118.890013,\n 39.118844\n ],\n [\n 118.896549,\n 39.139698\n ],\n [\n 118.952035,\n 39.175649\n ],\n [\n 118.920447,\n 39.171758\n ],\n [\n 118.897253,\n 39.151508\n ],\n [\n 118.876366,\n 39.14999\n ],\n [\n 118.857913,\n 39.162854\n ],\n [\n 118.814409,\n 39.138642\n ],\n [\n 118.760716,\n 39.133495\n ],\n [\n 118.719646,\n 39.136992\n ],\n [\n 118.692992,\n 39.148077\n ],\n [\n 118.637314,\n 39.157379\n ],\n [\n 118.59272,\n 39.142601\n ],\n [\n 118.578752,\n 39.130921\n ],\n [\n 118.588619,\n 39.107623\n ],\n [\n 118.560107,\n 39.09904\n ],\n [\n 118.551394,\n 39.088278\n ],\n [\n 118.532877,\n 39.091051\n ],\n [\n 118.570487,\n 38.999212\n ],\n [\n 118.604445,\n 38.971505\n ],\n [\n 118.539732,\n 38.909835\n ],\n [\n 118.525252,\n 38.90487\n ],\n [\n 118.491038,\n 38.909041\n ],\n [\n 118.406463,\n 38.960525\n ],\n [\n 118.378015,\n 38.97177\n ],\n [\n 118.371031,\n 38.984137\n ],\n [\n 118.373594,\n 39.012037\n ],\n [\n 118.309907,\n 39.011773\n ],\n [\n 118.290813,\n 39.022216\n ],\n [\n 118.267107,\n 39.021555\n ],\n [\n 118.225011,\n 39.034839\n ],\n [\n 118.182596,\n 39.094155\n ],\n [\n 118.16299,\n 39.136596\n ],\n [\n 118.121151,\n 39.186068\n ],\n [\n 118.07771,\n 39.202024\n ],\n [\n 118.07047,\n 39.214021\n ],\n [\n 118.037153,\n 39.220348\n ],\n [\n 118.037089,\n 39.230497\n ],\n [\n 118.064768,\n 39.231222\n ],\n [\n 118.064768,\n 39.256061\n ],\n [\n 118.036512,\n 39.265151\n ],\n [\n 118.024787,\n 39.292414\n ],\n [\n 118.016842,\n 39.284117\n ],\n [\n 117.97763,\n 39.300643\n ],\n [\n 117.972248,\n 39.314401\n ],\n [\n 117.891774,\n 39.32322\n ],\n [\n 117.888314,\n 39.332038\n ],\n [\n 117.84955,\n 39.327366\n ],\n [\n 117.842054,\n 39.336512\n ],\n [\n 117.862877,\n 39.362169\n ],\n [\n 117.837056,\n 39.350789\n ],\n [\n 117.803354,\n 39.362037\n ],\n [\n 117.805277,\n 39.373284\n ],\n [\n 117.852369,\n 39.38078\n ],\n [\n 117.859353,\n 39.403265\n ],\n [\n 117.871847,\n 39.411547\n ],\n [\n 117.87031,\n 39.45498\n ],\n [\n 117.878062,\n 39.467196\n ],\n [\n 117.898181,\n 39.472516\n ],\n [\n 117.898565,\n 39.509675\n ],\n [\n 117.912277,\n 39.516172\n ],\n [\n 117.905293,\n 39.53015\n ],\n [\n 117.933997,\n 39.574164\n ],\n [\n 117.892607,\n 39.591539\n ],\n [\n 117.868259,\n 39.596849\n ],\n [\n 117.851408,\n 39.589244\n ],\n [\n 117.826548,\n 39.590818\n ],\n [\n 117.801945,\n 39.601765\n ],\n [\n 117.76773,\n 39.599012\n ],\n [\n 117.747868,\n 39.589375\n ],\n [\n 117.753122,\n 39.576\n ],\n [\n 117.737745,\n 39.574033\n ],\n [\n 117.744857,\n 39.548585\n ],\n [\n 117.71596,\n 39.530084\n ],\n [\n 117.710194,\n 39.550422\n ],\n [\n 117.689563,\n 39.559539\n ],\n [\n 117.688794,\n 39.569246\n ],\n [\n 117.708913,\n 39.572918\n ],\n [\n 117.68495,\n 39.588916\n ],\n [\n 117.660795,\n 39.57541\n ],\n [\n 117.636191,\n 39.603731\n ],\n [\n 117.621967,\n 39.59167\n ],\n [\n 117.619084,\n 39.603207\n ],\n [\n 117.641189,\n 39.612645\n ],\n [\n 117.641957,\n 39.628438\n ],\n [\n 117.662012,\n 39.636365\n ],\n [\n 117.668355,\n 39.667085\n ],\n [\n 117.657014,\n 39.668657\n ],\n [\n 117.643944,\n 39.688692\n ],\n [\n 117.644777,\n 39.701849\n ],\n [\n 117.602425,\n 39.705384\n ],\n [\n 117.577629,\n 39.726913\n ],\n [\n 117.596082,\n 39.735222\n ],\n [\n 117.59589,\n 39.746147\n ],\n [\n 117.559305,\n 39.756088\n ],\n [\n 117.546106,\n 39.776164\n ],\n [\n 117.561419,\n 39.800024\n ],\n [\n 117.537264,\n 39.835178\n ],\n [\n 117.548092,\n 39.839882\n ],\n [\n 117.521374,\n 39.870641\n ],\n [\n 117.518811,\n 39.891271\n ],\n [\n 117.507406,\n 39.909023\n ],\n [\n 117.525539,\n 39.92964\n ],\n [\n 117.514967,\n 39.946665\n ],\n [\n 117.532907,\n 39.952469\n ],\n [\n 117.547323,\n 39.976855\n ],\n [\n 117.537777,\n 39.997452\n ],\n [\n 117.589226,\n 39.996866\n ],\n [\n 117.634589,\n 39.968901\n ],\n [\n 117.674698,\n 39.974834\n ],\n [\n 117.70667,\n 39.986046\n ],\n [\n 117.72775,\n 39.972422\n ],\n [\n 117.756326,\n 39.96512\n ],\n [\n 117.763566,\n 39.972748\n ],\n [\n 117.781826,\n 39.966293\n ],\n [\n 117.797075,\n 40.010225\n ],\n [\n 117.782467,\n 40.023516\n ],\n [\n 117.744152,\n 40.018434\n ],\n [\n 117.747932,\n 40.047421\n ],\n [\n 117.758312,\n 40.04436\n ],\n [\n 117.776188,\n 40.059272\n ],\n [\n 117.758184,\n 40.065978\n ],\n [\n 117.751648,\n 40.081993\n ],\n [\n 117.721983,\n 40.07991\n ],\n [\n 117.708272,\n 40.093643\n ],\n [\n 117.67489,\n 40.082123\n ],\n [\n 117.668099,\n 40.100931\n ],\n [\n 117.644841,\n 40.096181\n ],\n [\n 117.65317,\n 40.110757\n ],\n [\n 117.650159,\n 40.128191\n ],\n [\n 117.635999,\n 40.132094\n ],\n [\n 117.630232,\n 40.147833\n ],\n [\n 117.601208,\n 40.171239\n ],\n [\n 117.576412,\n 40.178584\n ],\n [\n 117.575451,\n 40.192817\n ],\n [\n 117.609409,\n 40.194897\n ],\n [\n 117.619532,\n 40.206398\n ],\n [\n 117.64625,\n 40.205163\n ],\n [\n 117.677069,\n 40.22095\n ],\n [\n 117.694112,\n 40.238161\n ],\n [\n 117.714551,\n 40.241668\n ],\n [\n 117.75152,\n 40.229718\n ],\n [\n 117.807775,\n 40.261926\n ],\n [\n 117.844104,\n 40.261406\n ],\n [\n 117.867554,\n 40.26965\n ],\n [\n 117.897989,\n 40.270429\n ],\n [\n 117.909457,\n 40.285876\n ],\n [\n 118.000888,\n 40.29256\n ],\n [\n 118.031643,\n 40.302358\n ],\n [\n 118.061564,\n 40.319095\n ],\n [\n 118.079312,\n 40.353528\n ],\n [\n 118.121856,\n 40.354695\n ],\n [\n 118.133837,\n 40.375113\n ],\n [\n 118.165232,\n 40.400449\n ],\n [\n 118.153123,\n 40.409519\n ],\n [\n 118.156967,\n 40.423768\n ],\n [\n 118.173818,\n 40.423056\n ],\n [\n 118.239684,\n 40.464686\n ],\n [\n 118.262942,\n 40.452063\n ],\n [\n 118.277935,\n 40.425711\n ],\n [\n 118.306575,\n 40.419558\n ],\n [\n 118.356295,\n 40.435295\n ],\n [\n 118.360011,\n 40.428819\n ],\n [\n 118.387305,\n 40.436719\n ],\n [\n 118.402683,\n 40.416838\n ],\n [\n 118.430746,\n 40.411851\n ],\n [\n 118.45599,\n 40.414053\n ],\n [\n 118.503211,\n 40.403365\n ],\n [\n 118.523458,\n 40.40628\n ],\n [\n 118.548062,\n 40.422667\n ],\n [\n 118.571512,\n 40.414636\n ],\n [\n 118.550881,\n 40.385482\n ],\n [\n 118.558377,\n 40.36928\n ],\n [\n 118.539989,\n 40.361048\n ],\n [\n 118.532364,\n 40.319419\n ],\n [\n 118.533325,\n 40.298854\n ],\n [\n 118.568949,\n 40.287564\n ],\n [\n 118.571384,\n 40.269845\n ],\n [\n 118.628472,\n 40.249915\n ],\n [\n 118.665634,\n 40.242577\n ],\n [\n 118.708562,\n 40.216078\n ],\n [\n 118.746108,\n 40.208087\n ],\n [\n 118.743609,\n 40.191777\n ],\n [\n 118.775581,\n 40.194182\n ],\n [\n 118.794482,\n 40.204838\n ],\n [\n 118.849135,\n 40.178974\n ],\n [\n 118.867652,\n 40.180599\n ],\n [\n 118.888924,\n 40.168768\n ],\n [\n 118.906736,\n 40.169679\n ],\n [\n 118.92474,\n 40.149653\n ],\n [\n 118.918269,\n 40.092211\n ],\n [\n 118.900521,\n 40.086549\n ],\n [\n 118.866307,\n 40.061942\n ],\n [\n 118.865602,\n 40.023777\n ],\n [\n 118.88508,\n 40.005403\n ],\n [\n 118.884247,\n 39.961794\n ],\n [\n 118.875149,\n 39.941121\n ],\n [\n 118.859643,\n 39.93362\n ],\n [\n 118.853556,\n 39.88409\n ],\n [\n 118.835232,\n 39.859018\n ],\n [\n 118.838179,\n 39.847981\n ],\n [\n 118.816843,\n 39.825836\n ],\n [\n 118.825429,\n 39.799436\n ],\n [\n 118.797942,\n 39.790415\n ],\n [\n 118.800185,\n 39.775706\n ],\n [\n 118.774428,\n 39.764198\n ],\n [\n 118.787242,\n 39.71592\n ],\n [\n 118.804157,\n 39.679985\n ],\n [\n 118.822225,\n 39.668984\n ],\n [\n 118.824596,\n 39.648681\n ],\n [\n 118.850097,\n 39.622737\n ],\n [\n 118.844586,\n 39.615004\n ],\n [\n 118.861309,\n 39.574754\n ],\n [\n 118.882261,\n 39.566557\n ],\n [\n 118.895139,\n 39.547011\n ],\n [\n 118.938452,\n 39.557572\n ],\n [\n 118.945243,\n 39.544781\n ],\n [\n 118.983302,\n 39.538942\n ],\n [\n 118.966067,\n 39.529494\n ],\n [\n 118.961453,\n 39.51591\n ],\n [\n 119.008098,\n 39.509347\n ],\n [\n 119.015658,\n 39.482103\n ],\n [\n 119.004894,\n 39.467459\n ],\n [\n 119.048399,\n 39.459052\n ],\n [\n 119.064545,\n 39.473763\n ],\n [\n 119.185769,\n 39.458986\n ],\n [\n 119.212295,\n 39.463453\n ],\n [\n 119.257401,\n 39.429752\n ],\n [\n 119.280403,\n 39.422852\n ],\n [\n 119.319039,\n 39.429554\n ]\n ]\n ],\n [\n [\n [\n 117.784581,\n 39.377032\n ],\n [\n 117.744601,\n 39.354604\n ],\n [\n 117.692318,\n 39.35171\n ],\n [\n 117.670918,\n 39.356446\n ],\n [\n 117.669316,\n 39.324141\n ],\n [\n 117.650799,\n 39.315191\n ],\n [\n 117.637536,\n 39.335986\n ],\n [\n 117.595249,\n 39.349144\n ],\n [\n 117.536239,\n 39.338026\n ],\n [\n 117.520862,\n 39.357236\n ],\n [\n 117.535342,\n 39.374007\n ],\n [\n 117.557895,\n 39.38558\n ],\n [\n 117.571158,\n 39.404646\n ],\n [\n 117.590636,\n 39.405435\n ],\n [\n 117.6014,\n 39.4195\n ],\n [\n 117.61415,\n 39.407078\n ],\n [\n 117.643495,\n 39.405829\n ],\n [\n 117.669124,\n 39.412008\n ],\n [\n 117.673224,\n 39.386698\n ],\n [\n 117.702313,\n 39.388934\n ],\n [\n 117.69975,\n 39.407604\n ],\n [\n 117.737296,\n 39.410562\n ],\n [\n 117.782147,\n 39.394785\n ],\n [\n 117.784581,\n 39.377032\n ]\n ]\n ],\n [\n [\n [\n 118.630522,\n 39.054726\n ],\n [\n 118.620847,\n 39.068268\n ],\n [\n 118.638852,\n 39.076061\n ],\n [\n 118.653652,\n 39.056973\n ],\n [\n 118.640005,\n 39.042306\n ],\n [\n 118.630522,\n 39.054726\n ]\n ]\n ],\n [\n [\n [\n 118.869446,\n 39.142733\n ],\n [\n 118.871753,\n 39.115082\n ],\n [\n 118.857465,\n 39.098842\n ],\n [\n 118.820495,\n 39.093693\n ],\n [\n 118.820239,\n 39.108745\n ],\n [\n 118.842664,\n 39.117788\n ],\n [\n 118.869446,\n 39.142733\n ]\n ]\n ],\n [\n [\n [\n 118.83914,\n 39.153817\n ],\n [\n 118.841511,\n 39.135475\n ],\n [\n 118.825749,\n 39.122672\n ],\n [\n 118.815177,\n 39.132373\n ],\n [\n 118.83914,\n 39.153817\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 130300,\n \"name\": \"秦皇岛市\",\n \"center\": [\n 119.586579,\n 39.942531\n ],\n \"centroid\": [\n 119.193332,\n 40.088346\n ],\n \"childrenNum\": 7,\n \"level\": \"city\",\n \"parent\": {\n \"adcode\": 130000\n },\n \"subFeatureIndex\": 2,\n \"acroutes\": [\n 100000,\n 130000\n ]\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 119.319039,\n 39.429554\n ],\n [\n 119.280403,\n 39.422852\n ],\n [\n 119.257401,\n 39.429752\n ],\n [\n 119.212295,\n 39.463453\n ],\n [\n 119.185769,\n 39.458986\n ],\n [\n 119.064545,\n 39.473763\n ],\n [\n 119.048399,\n 39.459052\n ],\n [\n 119.004894,\n 39.467459\n ],\n [\n 119.015658,\n 39.482103\n ],\n [\n 119.008098,\n 39.509347\n ],\n [\n 118.961453,\n 39.51591\n ],\n [\n 118.966067,\n 39.529494\n ],\n [\n 118.983302,\n 39.538942\n ],\n [\n 118.945243,\n 39.544781\n ],\n [\n 118.938452,\n 39.557572\n ],\n [\n 118.895139,\n 39.547011\n ],\n [\n 118.882261,\n 39.566557\n ],\n [\n 118.861309,\n 39.574754\n ],\n [\n 118.844586,\n 39.615004\n ],\n [\n 118.850097,\n 39.622737\n ],\n [\n 118.824596,\n 39.648681\n ],\n [\n 118.822225,\n 39.668984\n ],\n [\n 118.804157,\n 39.679985\n ],\n [\n 118.787242,\n 39.71592\n ],\n [\n 118.774428,\n 39.764198\n ],\n [\n 118.800185,\n 39.775706\n ],\n [\n 118.797942,\n 39.790415\n ],\n [\n 118.825429,\n 39.799436\n ],\n [\n 118.816843,\n 39.825836\n ],\n [\n 118.838179,\n 39.847981\n ],\n [\n 118.835232,\n 39.859018\n ],\n [\n 118.853556,\n 39.88409\n ],\n [\n 118.859643,\n 39.93362\n ],\n [\n 118.875149,\n 39.941121\n ],\n [\n 118.884247,\n 39.961794\n ],\n [\n 118.88508,\n 40.005403\n ],\n [\n 118.865602,\n 40.023777\n ],\n [\n 118.866307,\n 40.061942\n ],\n [\n 118.900521,\n 40.086549\n ],\n [\n 118.918269,\n 40.092211\n ],\n [\n 118.92474,\n 40.149653\n ],\n [\n 118.906736,\n 40.169679\n ],\n [\n 118.888924,\n 40.168768\n ],\n [\n 118.867652,\n 40.180599\n ],\n [\n 118.849135,\n 40.178974\n ],\n [\n 118.794482,\n 40.204838\n ],\n [\n 118.775581,\n 40.194182\n ],\n [\n 118.743609,\n 40.191777\n ],\n [\n 118.746108,\n 40.208087\n ],\n [\n 118.708562,\n 40.216078\n ],\n [\n 118.665634,\n 40.242577\n ],\n [\n 118.628472,\n 40.249915\n ],\n [\n 118.571384,\n 40.269845\n ],\n [\n 118.568949,\n 40.287564\n ],\n [\n 118.580098,\n 40.305861\n ],\n [\n 118.596949,\n 40.308456\n ],\n [\n 118.608225,\n 40.328305\n ],\n [\n 118.640197,\n 40.354566\n ],\n [\n 118.643785,\n 40.380946\n ],\n [\n 118.618349,\n 40.425193\n ],\n [\n 118.624179,\n 40.437626\n ],\n [\n 118.657176,\n 40.450574\n ],\n [\n 118.702795,\n 40.491411\n ],\n [\n 118.723491,\n 40.473746\n ],\n [\n 118.772954,\n 40.479765\n ],\n [\n 118.792112,\n 40.492382\n ],\n [\n 118.794867,\n 40.510753\n ],\n [\n 118.821328,\n 40.531964\n ],\n [\n 118.864,\n 40.527244\n ],\n [\n 118.886938,\n 40.542438\n ],\n [\n 118.919038,\n 40.53093\n ],\n [\n 118.966003,\n 40.536102\n ],\n [\n 118.952676,\n 40.558469\n ],\n [\n 118.983366,\n 40.56364\n ],\n [\n 118.998359,\n 40.578955\n ],\n [\n 119.013095,\n 40.577081\n ],\n [\n 119.063392,\n 40.606151\n ],\n [\n 119.086394,\n 40.588775\n ],\n [\n 119.105487,\n 40.603632\n ],\n [\n 119.158474,\n 40.614418\n ],\n [\n 119.162575,\n 40.600015\n ],\n [\n 119.178209,\n 40.609316\n ],\n [\n 119.230812,\n 40.603891\n ],\n [\n 119.232862,\n 40.589421\n ],\n [\n 119.220624,\n 40.569133\n ],\n [\n 119.25612,\n 40.543279\n ],\n [\n 119.302188,\n 40.530283\n ],\n [\n 119.338068,\n 40.531253\n ],\n [\n 119.361839,\n 40.537331\n ],\n [\n 119.441864,\n 40.539852\n ],\n [\n 119.477809,\n 40.533322\n ],\n [\n 119.491007,\n 40.536167\n ],\n [\n 119.503886,\n 40.553945\n ],\n [\n 119.520288,\n 40.547416\n ],\n [\n 119.534256,\n 40.554203\n ],\n [\n 119.571033,\n 40.540887\n ],\n [\n 119.568855,\n 40.520778\n ],\n [\n 119.555464,\n 40.516833\n ],\n [\n 119.553542,\n 40.501762\n ],\n [\n 119.604927,\n 40.454976\n ],\n [\n 119.593458,\n 40.435683\n ],\n [\n 119.600442,\n 40.406863\n ],\n [\n 119.586667,\n 40.375437\n ],\n [\n 119.599801,\n 40.356575\n ],\n [\n 119.598136,\n 40.334206\n ],\n [\n 119.621458,\n 40.30359\n ],\n [\n 119.642153,\n 40.291327\n ],\n [\n 119.651892,\n 40.272377\n ],\n [\n 119.633503,\n 40.249395\n ],\n [\n 119.625174,\n 40.224132\n ],\n [\n 119.671562,\n 40.23959\n ],\n [\n 119.676239,\n 40.224522\n ],\n [\n 119.716797,\n 40.196066\n ],\n [\n 119.745949,\n 40.207957\n ],\n [\n 119.755496,\n 40.153165\n ],\n [\n 119.76248,\n 40.144776\n ],\n [\n 119.736723,\n 40.104836\n ],\n [\n 119.771578,\n 40.082253\n ],\n [\n 119.76043,\n 40.065653\n ],\n [\n 119.770873,\n 40.048788\n ],\n [\n 119.795285,\n 40.040387\n ],\n [\n 119.817069,\n 40.052826\n ],\n [\n 119.835009,\n 40.050286\n ],\n [\n 119.854231,\n 40.03231\n ],\n [\n 119.841032,\n 40.011789\n ],\n [\n 119.872363,\n 39.960621\n ],\n [\n 119.862432,\n 39.951556\n ],\n [\n 119.835522,\n 39.964468\n ],\n [\n 119.836739,\n 39.985786\n ],\n [\n 119.816877,\n 39.978224\n ],\n [\n 119.787212,\n 39.950382\n ],\n [\n 119.726279,\n 39.941056\n ],\n [\n 119.683543,\n 39.921942\n ],\n [\n 119.674317,\n 39.933424\n ],\n [\n 119.666436,\n 39.92018\n ],\n [\n 119.637027,\n 39.923182\n ],\n [\n 119.612936,\n 39.898907\n ],\n [\n 119.587948,\n 39.909936\n ],\n [\n 119.559564,\n 39.901518\n ],\n [\n 119.541048,\n 39.888138\n ],\n [\n 119.520352,\n 39.838183\n ],\n [\n 119.537652,\n 39.831259\n ],\n [\n 119.53778,\n 39.810154\n ],\n [\n 119.506641,\n 39.816493\n ],\n [\n 119.464738,\n 39.809239\n ],\n [\n 119.396886,\n 39.761124\n ],\n [\n 119.395925,\n 39.74425\n ],\n [\n 119.3735,\n 39.739671\n ],\n [\n 119.358122,\n 39.721744\n ],\n [\n 119.334928,\n 39.656148\n ],\n [\n 119.31276,\n 39.605894\n ],\n [\n 119.270024,\n 39.498582\n ],\n [\n 119.304238,\n 39.459972\n ],\n [\n 119.319039,\n 39.429554\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 130400,\n \"name\": \"邯郸市\",\n \"center\": [\n 114.490686,\n 36.612273\n ],\n \"centroid\": [\n 114.548854,\n 36.553496\n ],\n \"childrenNum\": 18,\n \"level\": \"city\",\n \"parent\": {\n \"adcode\": 130000\n },\n \"subFeatureIndex\": 3,\n \"acroutes\": [\n 100000,\n 130000\n ]\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 113.794954,\n 36.994995\n ],\n [\n 113.828784,\n 37.012048\n ],\n [\n 113.859475,\n 37.015037\n ],\n [\n 113.883886,\n 37.010893\n ],\n [\n 113.901185,\n 36.99683\n ],\n [\n 113.941743,\n 36.983376\n ],\n [\n 113.984415,\n 36.941503\n ],\n [\n 113.991078,\n 36.914913\n ],\n [\n 114.028176,\n 36.881236\n ],\n [\n 114.063672,\n 36.879331\n ],\n [\n 114.090005,\n 36.861023\n ],\n [\n 114.081548,\n 36.845094\n ],\n [\n 114.100449,\n 36.839035\n ],\n [\n 114.182653,\n 36.843937\n ],\n [\n 114.225902,\n 36.843052\n ],\n [\n 114.252684,\n 36.856531\n ],\n [\n 114.299969,\n 36.845435\n ],\n [\n 114.304518,\n 36.857007\n ],\n [\n 114.336105,\n 36.846728\n ],\n [\n 114.353533,\n 36.852038\n ],\n [\n 114.421193,\n 36.839444\n ],\n [\n 114.462327,\n 36.847681\n ],\n [\n 114.478921,\n 36.833248\n ],\n [\n 114.507754,\n 36.827936\n ],\n [\n 114.555231,\n 36.845979\n ],\n [\n 114.551707,\n 36.884094\n ],\n [\n 114.56702,\n 36.891307\n ],\n [\n 114.64884,\n 36.89845\n ],\n [\n 114.671073,\n 36.917429\n ],\n [\n 114.707145,\n 36.918041\n ],\n [\n 114.718166,\n 36.938103\n ],\n [\n 114.734568,\n 36.942931\n ],\n [\n 114.74341,\n 36.932323\n ],\n [\n 114.772691,\n 36.928447\n ],\n [\n 114.787492,\n 36.91396\n ],\n [\n 114.838172,\n 36.950885\n ],\n [\n 114.836314,\n 36.958024\n ],\n [\n 114.862712,\n 36.969715\n ],\n [\n 114.892441,\n 36.969647\n ],\n [\n 114.949593,\n 36.948778\n ],\n [\n 114.985602,\n 36.950477\n ],\n [\n 115.02161,\n 36.961422\n ],\n [\n 115.0589,\n 36.957004\n ],\n [\n 115.096702,\n 36.964549\n ],\n [\n 115.111631,\n 36.958431\n ],\n [\n 115.125022,\n 36.936471\n ],\n [\n 115.106505,\n 36.923958\n ],\n [\n 115.125086,\n 36.90607\n ],\n [\n 115.143219,\n 36.899131\n ],\n [\n 115.16622,\n 36.901512\n ],\n [\n 115.170449,\n 36.881509\n ],\n [\n 115.158916,\n 36.852038\n ],\n [\n 115.176856,\n 36.854353\n ],\n [\n 115.200563,\n 36.868374\n ],\n [\n 115.283344,\n 36.862589\n ],\n [\n 115.325567,\n 36.869667\n ],\n [\n 115.307499,\n 36.837129\n ],\n [\n 115.323004,\n 36.815474\n ],\n [\n 115.335691,\n 36.775826\n ],\n [\n 115.349786,\n 36.786796\n ],\n [\n 115.362921,\n 36.771056\n ],\n [\n 115.390664,\n 36.76315\n ],\n [\n 115.423661,\n 36.766081\n ],\n [\n 115.463386,\n 36.752177\n ],\n [\n 115.478314,\n 36.754699\n ],\n [\n 115.450507,\n 36.713656\n ],\n [\n 115.446663,\n 36.694626\n ],\n [\n 115.420586,\n 36.686781\n ],\n [\n 115.406426,\n 36.663242\n ],\n [\n 115.386756,\n 36.656827\n ],\n [\n 115.388229,\n 36.647203\n ],\n [\n 115.366061,\n 36.621945\n ],\n [\n 115.355104,\n 36.627407\n ],\n [\n 115.334281,\n 36.58247\n ],\n [\n 115.33127,\n 36.550219\n ],\n [\n 115.307435,\n 36.527458\n ],\n [\n 115.288341,\n 36.528484\n ],\n [\n 115.296479,\n 36.508862\n ],\n [\n 115.272836,\n 36.497373\n ],\n [\n 115.291417,\n 36.460572\n ],\n [\n 115.300259,\n 36.465908\n ],\n [\n 115.317046,\n 36.454003\n ],\n [\n 115.312048,\n 36.433541\n ],\n [\n 115.29744,\n 36.413484\n ],\n [\n 115.339983,\n 36.398078\n ],\n [\n 115.349594,\n 36.363079\n ],\n [\n 115.368688,\n 36.342593\n ],\n [\n 115.359782,\n 36.318743\n ],\n [\n 115.366637,\n 36.30894\n ],\n [\n 115.394637,\n 36.322581\n ],\n [\n 115.422956,\n 36.32217\n ],\n [\n 115.417062,\n 36.29276\n ],\n [\n 115.436347,\n 36.27637\n ],\n [\n 115.462681,\n 36.276096\n ],\n [\n 115.465372,\n 36.250373\n ],\n [\n 115.47652,\n 36.246531\n ],\n [\n 115.475944,\n 36.193066\n ],\n [\n 115.483568,\n 36.148976\n ],\n [\n 115.469985,\n 36.152892\n ],\n [\n 115.463898,\n 36.171299\n ],\n [\n 115.451276,\n 36.16972\n ],\n [\n 115.449674,\n 36.150144\n ],\n [\n 115.431286,\n 36.149183\n ],\n [\n 115.415716,\n 36.137572\n ],\n [\n 115.404632,\n 36.15564\n ],\n [\n 115.39265,\n 36.12919\n ],\n [\n 115.377914,\n 36.128503\n ],\n [\n 115.369264,\n 36.102731\n ],\n [\n 115.341393,\n 36.087608\n ],\n [\n 115.313073,\n 36.088227\n ],\n [\n 115.297247,\n 36.109123\n ],\n [\n 115.302181,\n 36.127678\n ],\n [\n 115.279307,\n 36.137847\n ],\n [\n 115.260406,\n 36.171574\n ],\n [\n 115.242146,\n 36.191212\n ],\n [\n 115.20178,\n 36.212768\n ],\n [\n 115.189222,\n 36.195538\n ],\n [\n 115.170705,\n 36.191006\n ],\n [\n 115.142834,\n 36.209679\n ],\n [\n 115.110414,\n 36.199382\n ],\n [\n 115.104583,\n 36.172192\n ],\n [\n 115.06268,\n 36.178235\n ],\n [\n 115.048456,\n 36.162027\n ],\n [\n 115.045893,\n 36.112216\n ],\n [\n 114.998416,\n 36.069732\n ],\n [\n 114.954591,\n 36.067806\n ],\n [\n 114.920184,\n 36.048205\n ],\n [\n 114.914674,\n 36.051988\n ],\n [\n 114.926463,\n 36.089464\n ],\n [\n 114.90705,\n 36.117233\n ],\n [\n 114.912432,\n 36.140458\n ],\n [\n 114.879435,\n 36.147809\n ],\n [\n 114.858675,\n 36.144305\n ],\n [\n 114.857458,\n 36.127747\n ],\n [\n 114.825166,\n 36.123693\n ],\n [\n 114.77865,\n 36.133175\n ],\n [\n 114.771345,\n 36.124517\n ],\n [\n 114.73444,\n 36.155777\n ],\n [\n 114.720665,\n 36.140046\n ],\n [\n 114.692409,\n 36.146229\n ],\n [\n 114.691128,\n 36.138397\n ],\n [\n 114.655183,\n 36.140252\n ],\n [\n 114.630387,\n 36.124243\n ],\n [\n 114.610845,\n 36.128297\n ],\n [\n 114.58259,\n 36.121356\n ],\n [\n 114.586883,\n 36.140939\n ],\n [\n 114.55805,\n 36.150763\n ],\n [\n 114.53287,\n 36.171505\n ],\n [\n 114.480267,\n 36.177823\n ],\n [\n 114.466171,\n 36.197735\n ],\n [\n 114.417541,\n 36.205904\n ],\n [\n 114.408442,\n 36.224573\n ],\n [\n 114.39236,\n 36.221141\n ],\n [\n 114.356096,\n 36.230337\n ],\n [\n 114.345139,\n 36.255792\n ],\n [\n 114.328353,\n 36.248177\n ],\n [\n 114.290102,\n 36.247148\n ],\n [\n 114.256464,\n 36.264024\n ],\n [\n 114.235577,\n 36.252774\n ],\n [\n 114.223723,\n 36.270883\n ],\n [\n 114.211037,\n 36.273009\n ],\n [\n 114.203028,\n 36.24557\n ],\n [\n 114.168878,\n 36.243443\n ],\n [\n 114.17663,\n 36.263132\n ],\n [\n 114.130627,\n 36.279662\n ],\n [\n 114.12108,\n 36.272735\n ],\n [\n 114.092632,\n 36.27781\n ],\n [\n 114.085328,\n 36.270129\n ],\n [\n 114.060532,\n 36.276507\n ],\n [\n 114.04272,\n 36.297011\n ],\n [\n 114.061557,\n 36.317989\n ],\n [\n 114.055727,\n 36.329983\n ],\n [\n 114.026254,\n 36.325117\n ],\n [\n 114.032276,\n 36.347527\n ],\n [\n 114.023691,\n 36.354995\n ],\n [\n 114.010684,\n 36.342456\n ],\n [\n 113.985824,\n 36.357599\n ],\n [\n 113.979802,\n 36.344101\n ],\n [\n 113.994474,\n 36.344169\n ],\n [\n 113.993833,\n 36.314561\n ],\n [\n 113.983005,\n 36.317166\n ],\n [\n 113.964232,\n 36.352597\n ],\n [\n 113.952763,\n 36.358147\n ],\n [\n 113.957248,\n 36.33622\n ],\n [\n 113.934439,\n 36.336151\n ],\n [\n 113.93162,\n 36.319497\n ],\n [\n 113.911181,\n 36.314767\n ],\n [\n 113.901121,\n 36.336974\n ],\n [\n 113.881515,\n 36.353899\n ],\n [\n 113.85358,\n 36.35013\n ],\n [\n 113.855951,\n 36.329367\n ],\n [\n 113.818212,\n 36.331149\n ],\n [\n 113.797581,\n 36.347184\n ],\n [\n 113.764392,\n 36.355612\n ],\n [\n 113.755166,\n 36.365956\n ],\n [\n 113.73242,\n 36.357599\n ],\n [\n 113.729601,\n 36.381642\n ],\n [\n 113.708329,\n 36.423342\n ],\n [\n 113.670206,\n 36.425122\n ],\n [\n 113.6292,\n 36.454687\n ],\n [\n 113.587233,\n 36.460982\n ],\n [\n 113.582108,\n 36.482942\n ],\n [\n 113.554428,\n 36.494706\n ],\n [\n 113.559939,\n 36.52862\n ],\n [\n 113.547317,\n 36.534362\n ],\n [\n 113.588707,\n 36.548101\n ],\n [\n 113.58813,\n 36.562725\n ],\n [\n 113.569678,\n 36.585885\n ],\n [\n 113.539756,\n 36.594082\n ],\n [\n 113.545266,\n 36.616892\n ],\n [\n 113.535463,\n 36.62925\n ],\n [\n 113.486833,\n 36.635189\n ],\n [\n 113.47703,\n 36.655189\n ],\n [\n 113.502018,\n 36.681528\n ],\n [\n 113.507015,\n 36.704858\n ],\n [\n 113.477542,\n 36.697287\n ],\n [\n 113.465369,\n 36.70779\n ],\n [\n 113.47767,\n 36.726407\n ],\n [\n 113.499391,\n 36.740589\n ],\n [\n 113.536232,\n 36.732339\n ],\n [\n 113.549303,\n 36.752313\n ],\n [\n 113.569165,\n 36.758107\n ],\n [\n 113.599984,\n 36.752927\n ],\n [\n 113.65579,\n 36.785706\n ],\n [\n 113.68097,\n 36.790134\n ],\n [\n 113.673923,\n 36.807505\n ],\n [\n 113.68411,\n 36.824804\n ],\n [\n 113.676293,\n 36.855646\n ],\n [\n 113.696924,\n 36.882257\n ],\n [\n 113.710508,\n 36.88736\n ],\n [\n 113.731587,\n 36.87865\n ],\n [\n 113.731908,\n 36.859118\n ],\n [\n 113.742095,\n 36.851085\n ],\n [\n 113.772337,\n 36.871165\n ],\n [\n 113.786945,\n 36.870076\n ],\n [\n 113.79284,\n 36.894709\n ],\n [\n 113.761701,\n 36.956052\n ],\n [\n 113.777463,\n 36.96856\n ],\n [\n 113.794954,\n 36.994995\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 130500,\n \"name\": \"邢台市\",\n \"center\": [\n 114.508851,\n 37.0682\n ],\n \"centroid\": [\n 114.822689,\n 37.213818\n ],\n \"childrenNum\": 19,\n \"level\": \"city\",\n \"parent\": {\n \"adcode\": 130000\n },\n \"subFeatureIndex\": 4,\n \"acroutes\": [\n 100000,\n 130000\n ]\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 114.022666,\n 37.435496\n ],\n [\n 114.06899,\n 37.447384\n ],\n [\n 114.096477,\n 37.490935\n ],\n [\n 114.113263,\n 37.493837\n ],\n [\n 114.126526,\n 37.481957\n ],\n [\n 114.133766,\n 37.498899\n ],\n [\n 114.156191,\n 37.505244\n ],\n [\n 114.166123,\n 37.528186\n ],\n [\n 114.184575,\n 37.530817\n ],\n [\n 114.215009,\n 37.51125\n ],\n [\n 114.255439,\n 37.504096\n ],\n [\n 114.27293,\n 37.494445\n ],\n [\n 114.303621,\n 37.507808\n ],\n [\n 114.310861,\n 37.499979\n ],\n [\n 114.334632,\n 37.502949\n ],\n [\n 114.358274,\n 37.519212\n ],\n [\n 114.370192,\n 37.513612\n ],\n [\n 114.37269,\n 37.52967\n ],\n [\n 114.412095,\n 37.549907\n ],\n [\n 114.433495,\n 37.552537\n ],\n [\n 114.483471,\n 37.576814\n ],\n [\n 114.519927,\n 37.574656\n ],\n [\n 114.585217,\n 37.55301\n ],\n [\n 114.64679,\n 37.556247\n ],\n [\n 114.680171,\n 37.565283\n ],\n [\n 114.698816,\n 37.589353\n ],\n [\n 114.707338,\n 37.615774\n ],\n [\n 114.725983,\n 37.630665\n ],\n [\n 114.764618,\n 37.624399\n ],\n [\n 114.797423,\n 37.628239\n ],\n [\n 114.808571,\n 37.659832\n ],\n [\n 114.841504,\n 37.676129\n ],\n [\n 114.847783,\n 37.69673\n ],\n [\n 114.871041,\n 37.702114\n ],\n [\n 114.881357,\n 37.716113\n ],\n [\n 114.895965,\n 37.712547\n ],\n [\n 114.904038,\n 37.729302\n ],\n [\n 114.931846,\n 37.728899\n ],\n [\n 114.960165,\n 37.720084\n ],\n [\n 114.987524,\n 37.742691\n ],\n [\n 115.001748,\n 37.734685\n ],\n [\n 115.012512,\n 37.75157\n ],\n [\n 115.041024,\n 37.733541\n ],\n [\n 115.070049,\n 37.745651\n ],\n [\n 115.066653,\n 37.771007\n ],\n [\n 115.072099,\n 37.788893\n ],\n [\n 115.097215,\n 37.797498\n ],\n [\n 115.097471,\n 37.807849\n ],\n [\n 115.122972,\n 37.811479\n ],\n [\n 115.131173,\n 37.799783\n ],\n [\n 115.150523,\n 37.808521\n ],\n [\n 115.160262,\n 37.780287\n ],\n [\n 115.152765,\n 37.759507\n ],\n [\n 115.172564,\n 37.749351\n ],\n [\n 115.227281,\n 37.732599\n ],\n [\n 115.243235,\n 37.722641\n ],\n [\n 115.261431,\n 37.68818\n ],\n [\n 115.253807,\n 37.671415\n ],\n [\n 115.255088,\n 37.645621\n ],\n [\n 115.227858,\n 37.648921\n ],\n [\n 115.202934,\n 37.637133\n ],\n [\n 115.191593,\n 37.608833\n ],\n [\n 115.172756,\n 37.600543\n ],\n [\n 115.200563,\n 37.572498\n ],\n [\n 115.188325,\n 37.563125\n ],\n [\n 115.201908,\n 37.555977\n ],\n [\n 115.237276,\n 37.575465\n ],\n [\n 115.282575,\n 37.576005\n ],\n [\n 115.307179,\n 37.563935\n ],\n [\n 115.360871,\n 37.523935\n ],\n [\n 115.359461,\n 37.558675\n ],\n [\n 115.372147,\n 37.544106\n ],\n [\n 115.405785,\n 37.535944\n ],\n [\n 115.410078,\n 37.523261\n ],\n [\n 115.430965,\n 37.506796\n ],\n [\n 115.455313,\n 37.501802\n ],\n [\n 115.421675,\n 37.495727\n ],\n [\n 115.426096,\n 37.506256\n ],\n [\n 115.402069,\n 37.51017\n ],\n [\n 115.397968,\n 37.497347\n ],\n [\n 115.417638,\n 37.487762\n ],\n [\n 115.410719,\n 37.476421\n ],\n [\n 115.431478,\n 37.469602\n ],\n [\n 115.404183,\n 37.462039\n ],\n [\n 115.360038,\n 37.461431\n ],\n [\n 115.345109,\n 37.448195\n ],\n [\n 115.391049,\n 37.42793\n ],\n [\n 115.428595,\n 37.387926\n ],\n [\n 115.468768,\n 37.382788\n ],\n [\n 115.506634,\n 37.368997\n ],\n [\n 115.520089,\n 37.353648\n ],\n [\n 115.52938,\n 37.326864\n ],\n [\n 115.577177,\n 37.316107\n ],\n [\n 115.599218,\n 37.332884\n ],\n [\n 115.590632,\n 37.312453\n ],\n [\n 115.599859,\n 37.301965\n ],\n [\n 115.623437,\n 37.297905\n ],\n [\n 115.63292,\n 37.277058\n ],\n [\n 115.67258,\n 37.275839\n ],\n [\n 115.675784,\n 37.258914\n ],\n [\n 115.698465,\n 37.257153\n ],\n [\n 115.756322,\n 37.209876\n ],\n [\n 115.76997,\n 37.14155\n ],\n [\n 115.786564,\n 37.123916\n ],\n [\n 115.827378,\n 37.106006\n ],\n [\n 115.853904,\n 37.059245\n ],\n [\n 115.812385,\n 37.028961\n ],\n [\n 115.80963,\n 37.011436\n ],\n [\n 115.776441,\n 36.992073\n ],\n [\n 115.784322,\n 36.970735\n ],\n [\n 115.796816,\n 36.968763\n ],\n [\n 115.772789,\n 36.936811\n ],\n [\n 115.757796,\n 36.903008\n ],\n [\n 115.740561,\n 36.90641\n ],\n [\n 115.71128,\n 36.882393\n ],\n [\n 115.688598,\n 36.83958\n ],\n [\n 115.684177,\n 36.812954\n ],\n [\n 115.66502,\n 36.812477\n ],\n [\n 115.637405,\n 36.797492\n ],\n [\n 115.572116,\n 36.775349\n ],\n [\n 115.538734,\n 36.784139\n ],\n [\n 115.523613,\n 36.763832\n ],\n [\n 115.502918,\n 36.77017\n ],\n [\n 115.478314,\n 36.754699\n ],\n [\n 115.463386,\n 36.752177\n ],\n [\n 115.423661,\n 36.766081\n ],\n [\n 115.390664,\n 36.76315\n ],\n [\n 115.362921,\n 36.771056\n ],\n [\n 115.349786,\n 36.786796\n ],\n [\n 115.335691,\n 36.775826\n ],\n [\n 115.323004,\n 36.815474\n ],\n [\n 115.307499,\n 36.837129\n ],\n [\n 115.325567,\n 36.869667\n ],\n [\n 115.283344,\n 36.862589\n ],\n [\n 115.200563,\n 36.868374\n ],\n [\n 115.176856,\n 36.854353\n ],\n [\n 115.158916,\n 36.852038\n ],\n [\n 115.170449,\n 36.881509\n ],\n [\n 115.16622,\n 36.901512\n ],\n [\n 115.143219,\n 36.899131\n ],\n [\n 115.125086,\n 36.90607\n ],\n [\n 115.106505,\n 36.923958\n ],\n [\n 115.125022,\n 36.936471\n ],\n [\n 115.111631,\n 36.958431\n ],\n [\n 115.096702,\n 36.964549\n ],\n [\n 115.0589,\n 36.957004\n ],\n [\n 115.02161,\n 36.961422\n ],\n [\n 114.985602,\n 36.950477\n ],\n [\n 114.949593,\n 36.948778\n ],\n [\n 114.892441,\n 36.969647\n ],\n [\n 114.862712,\n 36.969715\n ],\n [\n 114.836314,\n 36.958024\n ],\n [\n 114.838172,\n 36.950885\n ],\n [\n 114.787492,\n 36.91396\n ],\n [\n 114.772691,\n 36.928447\n ],\n [\n 114.74341,\n 36.932323\n ],\n [\n 114.734568,\n 36.942931\n ],\n [\n 114.718166,\n 36.938103\n ],\n [\n 114.707145,\n 36.918041\n ],\n [\n 114.671073,\n 36.917429\n ],\n [\n 114.64884,\n 36.89845\n ],\n [\n 114.56702,\n 36.891307\n ],\n [\n 114.551707,\n 36.884094\n ],\n [\n 114.555231,\n 36.845979\n ],\n [\n 114.507754,\n 36.827936\n ],\n [\n 114.478921,\n 36.833248\n ],\n [\n 114.462327,\n 36.847681\n ],\n [\n 114.421193,\n 36.839444\n ],\n [\n 114.353533,\n 36.852038\n ],\n [\n 114.336105,\n 36.846728\n ],\n [\n 114.304518,\n 36.857007\n ],\n [\n 114.299969,\n 36.845435\n ],\n [\n 114.252684,\n 36.856531\n ],\n [\n 114.225902,\n 36.843052\n ],\n [\n 114.182653,\n 36.843937\n ],\n [\n 114.100449,\n 36.839035\n ],\n [\n 114.081548,\n 36.845094\n ],\n [\n 114.090005,\n 36.861023\n ],\n [\n 114.063672,\n 36.879331\n ],\n [\n 114.028176,\n 36.881236\n ],\n [\n 113.991078,\n 36.914913\n ],\n [\n 113.984415,\n 36.941503\n ],\n [\n 113.941743,\n 36.983376\n ],\n [\n 113.901185,\n 36.99683\n ],\n [\n 113.883886,\n 37.010893\n ],\n [\n 113.859475,\n 37.015037\n ],\n [\n 113.828784,\n 37.012048\n ],\n [\n 113.794954,\n 36.994995\n ],\n [\n 113.771888,\n 37.016803\n ],\n [\n 113.790149,\n 37.04295\n ],\n [\n 113.788227,\n 37.059788\n ],\n [\n 113.768749,\n 37.062504\n ],\n [\n 113.758177,\n 37.075672\n ],\n [\n 113.77349,\n 37.106956\n ],\n [\n 113.767339,\n 37.144601\n ],\n [\n 113.77317,\n 37.151857\n ],\n [\n 113.831924,\n 37.167518\n ],\n [\n 113.836601,\n 37.18948\n ],\n [\n 113.853067,\n 37.215093\n ],\n [\n 113.886449,\n 37.23914\n ],\n [\n 113.886897,\n 37.25993\n ],\n [\n 113.899007,\n 37.279495\n ],\n [\n 113.902147,\n 37.30995\n ],\n [\n 113.921176,\n 37.33072\n ],\n [\n 113.959811,\n 37.348982\n ],\n [\n 113.973907,\n 37.403133\n ],\n [\n 114.022666,\n 37.435496\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 130600,\n \"name\": \"保定市\",\n \"center\": [\n 115.482331,\n 38.867657\n ],\n \"centroid\": [\n 115.177664,\n 39.025148\n ],\n \"childrenNum\": 24,\n \"level\": \"city\",\n \"parent\": {\n \"adcode\": 130000\n },\n \"subFeatureIndex\": 5,\n \"acroutes\": [\n 100000,\n 130000\n ]\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 116.244678,\n 39.517354\n ],\n [\n 116.222766,\n 39.501995\n ],\n [\n 116.220843,\n 39.511644\n ],\n [\n 116.182144,\n 39.49635\n ],\n [\n 116.179901,\n 39.486568\n ],\n [\n 116.151325,\n 39.471005\n ],\n [\n 116.132104,\n 39.429423\n ],\n [\n 116.133001,\n 39.4055\n ],\n [\n 116.116791,\n 39.376243\n ],\n [\n 116.13582,\n 39.351842\n ],\n [\n 116.198226,\n 39.351315\n ],\n [\n 116.208734,\n 39.330195\n ],\n [\n 116.201109,\n 39.251911\n ],\n [\n 116.186116,\n 39.222457\n ],\n [\n 116.206555,\n 39.207429\n ],\n [\n 116.207837,\n 39.168526\n ],\n [\n 116.221804,\n 39.147813\n ],\n [\n 116.262426,\n 39.138114\n ],\n [\n 116.278957,\n 39.112045\n ],\n [\n 116.305354,\n 39.098116\n ],\n [\n 116.317592,\n 39.077911\n ],\n [\n 116.318617,\n 39.037416\n ],\n [\n 116.307148,\n 39.032196\n ],\n [\n 116.293757,\n 39.007344\n ],\n [\n 116.299588,\n 38.993658\n ],\n [\n 116.3215,\n 38.998088\n ],\n [\n 116.33534,\n 38.984004\n ],\n [\n 116.316182,\n 38.962708\n ],\n [\n 116.298755,\n 38.975076\n ],\n [\n 116.291386,\n 38.948683\n ],\n [\n 116.253007,\n 38.932074\n ],\n [\n 116.243653,\n 38.949345\n ],\n [\n 116.228083,\n 38.942199\n ],\n [\n 116.230262,\n 38.92453\n ],\n [\n 116.209503,\n 38.921618\n ],\n [\n 116.15203,\n 38.948352\n ],\n [\n 116.121083,\n 38.934391\n ],\n [\n 116.125633,\n 38.920823\n ],\n [\n 116.112754,\n 38.909703\n ],\n [\n 116.085524,\n 38.91063\n ],\n [\n 116.045543,\n 38.897786\n ],\n [\n 116.04157,\n 38.878451\n ],\n [\n 116.048746,\n 38.8607\n ],\n [\n 116.035548,\n 38.829492\n ],\n [\n 116.04093,\n 38.812259\n ],\n [\n 116.023054,\n 38.812524\n ],\n [\n 115.999731,\n 38.796812\n ],\n [\n 115.995118,\n 38.77798\n ],\n [\n 115.95187,\n 38.746736\n ],\n [\n 115.944053,\n 38.735456\n ],\n [\n 115.966286,\n 38.708973\n ],\n [\n 115.955009,\n 38.702932\n ],\n [\n 115.959879,\n 38.679891\n ],\n [\n 115.973526,\n 38.668467\n ],\n [\n 115.973398,\n 38.635514\n ],\n [\n 115.951101,\n 38.627938\n ],\n [\n 115.96321,\n 38.613182\n ],\n [\n 115.960583,\n 38.584394\n ],\n [\n 115.934058,\n 38.546678\n ],\n [\n 115.940721,\n 38.530508\n ],\n [\n 115.890809,\n 38.52585\n ],\n [\n 115.878507,\n 38.535566\n ],\n [\n 115.869345,\n 38.524652\n ],\n [\n 115.875047,\n 38.510141\n ],\n [\n 115.816101,\n 38.52545\n ],\n [\n 115.79137,\n 38.512005\n ],\n [\n 115.770418,\n 38.48817\n ],\n [\n 115.745686,\n 38.481311\n ],\n [\n 115.718584,\n 38.449205\n ],\n [\n 115.715957,\n 38.438411\n ],\n [\n 115.731462,\n 38.392618\n ],\n [\n 115.705321,\n 38.367543\n ],\n [\n 115.699811,\n 38.349932\n ],\n [\n 115.650155,\n 38.340791\n ],\n [\n 115.644965,\n 38.32611\n ],\n [\n 115.590504,\n 38.332784\n ],\n [\n 115.57942,\n 38.342859\n ],\n [\n 115.575768,\n 38.326377\n ],\n [\n 115.550908,\n 38.332917\n ],\n [\n 115.547704,\n 38.318168\n ],\n [\n 115.516437,\n 38.318168\n ],\n [\n 115.516822,\n 38.357337\n ],\n [\n 115.494781,\n 38.362006\n ],\n [\n 115.495101,\n 38.342993\n ],\n [\n 115.478122,\n 38.341658\n ],\n [\n 115.462104,\n 38.327311\n ],\n [\n 115.420906,\n 38.337922\n ],\n [\n 115.402453,\n 38.320103\n ],\n [\n 115.381822,\n 38.327578\n ],\n [\n 115.383104,\n 38.299076\n ],\n [\n 115.393611,\n 38.285588\n ],\n [\n 115.369072,\n 38.283451\n ],\n [\n 115.356194,\n 38.271764\n ],\n [\n 115.34953,\n 38.248117\n ],\n [\n 115.324734,\n 38.248184\n ],\n [\n 115.302758,\n 38.235289\n ],\n [\n 115.273605,\n 38.2403\n ],\n [\n 115.263994,\n 38.260543\n ],\n [\n 115.265788,\n 38.287658\n ],\n [\n 115.252205,\n 38.29093\n ],\n [\n 115.225871,\n 38.269894\n ],\n [\n 115.210174,\n 38.236491\n ],\n [\n 115.19422,\n 38.236759\n ],\n [\n 115.168591,\n 38.259608\n ],\n [\n 115.152317,\n 38.256802\n ],\n [\n 115.108107,\n 38.264551\n ],\n [\n 115.085874,\n 38.276773\n ],\n [\n 115.073765,\n 38.293134\n ],\n [\n 115.056722,\n 38.288326\n ],\n [\n 115.066204,\n 38.264684\n ],\n [\n 115.056465,\n 38.258472\n ],\n [\n 115.031862,\n 38.267089\n ],\n [\n 114.989062,\n 38.258138\n ],\n [\n 114.990087,\n 38.272165\n ],\n [\n 114.970096,\n 38.281114\n ],\n [\n 114.927681,\n 38.283385\n ],\n [\n 114.915059,\n 38.263348\n ],\n [\n 114.886162,\n 38.265286\n ],\n [\n 114.883343,\n 38.284854\n ],\n [\n 114.902565,\n 38.294936\n ],\n [\n 114.906986,\n 38.309624\n ],\n [\n 114.922875,\n 38.315631\n ],\n [\n 114.942994,\n 38.343193\n ],\n [\n 114.932871,\n 38.344194\n ],\n [\n 114.923388,\n 38.388217\n ],\n [\n 114.910381,\n 38.393751\n ],\n [\n 114.882254,\n 38.424149\n ],\n [\n 114.853998,\n 38.435879\n ],\n [\n 114.858163,\n 38.448605\n ],\n [\n 114.840992,\n 38.460797\n ],\n [\n 114.837852,\n 38.435745\n ],\n [\n 114.819143,\n 38.449871\n ],\n [\n 114.830868,\n 38.46033\n ],\n [\n 114.81075,\n 38.492365\n ],\n [\n 114.765259,\n 38.496626\n ],\n [\n 114.729442,\n 38.484574\n ],\n [\n 114.702084,\n 38.489102\n ],\n [\n 114.6737,\n 38.473452\n ],\n [\n 114.651851,\n 38.504682\n ],\n [\n 114.635257,\n 38.514801\n ],\n [\n 114.595724,\n 38.568897\n ],\n [\n 114.58432,\n 38.596429\n ],\n [\n 114.56324,\n 38.590644\n ],\n [\n 114.527616,\n 38.590644\n ],\n [\n 114.552284,\n 38.612983\n ],\n [\n 114.536907,\n 38.632324\n ],\n [\n 114.53633,\n 38.649268\n ],\n [\n 114.522106,\n 38.65372\n ],\n [\n 114.498463,\n 38.678297\n ],\n [\n 114.452652,\n 38.699413\n ],\n [\n 114.437787,\n 38.692773\n ],\n [\n 114.413504,\n 38.703928\n ],\n [\n 114.366411,\n 38.6862\n ],\n [\n 114.341167,\n 38.690184\n ],\n [\n 114.311502,\n 38.706517\n ],\n [\n 114.212831,\n 38.688192\n ],\n [\n 114.182205,\n 38.67657\n ],\n [\n 114.129153,\n 38.669596\n ],\n [\n 114.125053,\n 38.659632\n ],\n [\n 114.086097,\n 38.65837\n ],\n [\n 114.052139,\n 38.686399\n ],\n [\n 114.028624,\n 38.688524\n ],\n [\n 113.991655,\n 38.676769\n ],\n [\n 113.964617,\n 38.699811\n ],\n [\n 113.929697,\n 38.702467\n ],\n [\n 113.932324,\n 38.71362\n ],\n [\n 113.883245,\n 38.74667\n ],\n [\n 113.864664,\n 38.746006\n ],\n [\n 113.839548,\n 38.758413\n ],\n [\n 113.836537,\n 38.79595\n ],\n [\n 113.853644,\n 38.810138\n ],\n [\n 113.855566,\n 38.828962\n ],\n [\n 113.83564,\n 38.842547\n ],\n [\n 113.801297,\n 38.85487\n ],\n [\n 113.776181,\n 38.885669\n ],\n [\n 113.775156,\n 38.919103\n ],\n [\n 113.767532,\n 38.959665\n ],\n [\n 113.776758,\n 38.98698\n ],\n [\n 113.806808,\n 38.989691\n ],\n [\n 113.830514,\n 39.011773\n ],\n [\n 113.884399,\n 39.051688\n ],\n [\n 113.898046,\n 39.067607\n ],\n [\n 113.930274,\n 39.063446\n ],\n [\n 113.942896,\n 39.08742\n ],\n [\n 113.961733,\n 39.100823\n ],\n [\n 113.995115,\n 39.095475\n ],\n [\n 114.006456,\n 39.12287\n ],\n [\n 114.050793,\n 39.13587\n ],\n [\n 114.065274,\n 39.093494\n ],\n [\n 114.078793,\n 39.095343\n ],\n [\n 114.096797,\n 39.083722\n ],\n [\n 114.108714,\n 39.052282\n ],\n [\n 114.126654,\n 39.050895\n ],\n [\n 114.157217,\n 39.061134\n ],\n [\n 114.180923,\n 39.049111\n ],\n [\n 114.197005,\n 39.050432\n ],\n [\n 114.22635,\n 39.066485\n ],\n [\n 114.300097,\n 39.079231\n ],\n [\n 114.320215,\n 39.070712\n ],\n [\n 114.349176,\n 39.076788\n ],\n [\n 114.369679,\n 39.107557\n ],\n [\n 114.360773,\n 39.133957\n ],\n [\n 114.388196,\n 39.176968\n ],\n [\n 114.417989,\n 39.171626\n ],\n [\n 114.443618,\n 39.174132\n ],\n [\n 114.453165,\n 39.192662\n ],\n [\n 114.469695,\n 39.193321\n ],\n [\n 114.475974,\n 39.215867\n ],\n [\n 114.467389,\n 39.225884\n ],\n [\n 114.436314,\n 39.229641\n ],\n [\n 114.415939,\n 39.242885\n ],\n [\n 114.437018,\n 39.25942\n ],\n [\n 114.425101,\n 39.285105\n ],\n [\n 114.438236,\n 39.319139\n ],\n [\n 114.46662,\n 39.329669\n ],\n [\n 114.47969,\n 39.351118\n ],\n [\n 114.469503,\n 39.355196\n ],\n [\n 114.470913,\n 39.408787\n ],\n [\n 114.496798,\n 39.438556\n ],\n [\n 114.502308,\n 39.477112\n ],\n [\n 114.532678,\n 39.486174\n ],\n [\n 114.536586,\n 39.512891\n ],\n [\n 114.557345,\n 39.531987\n ],\n [\n 114.563432,\n 39.558162\n ],\n [\n 114.58432,\n 39.585835\n ],\n [\n 114.604887,\n 39.567869\n ],\n [\n 114.633527,\n 39.555866\n ],\n [\n 114.654991,\n 39.599209\n ],\n [\n 114.680748,\n 39.588064\n ],\n [\n 114.712079,\n 39.594358\n ],\n [\n 114.716756,\n 39.618674\n ],\n [\n 114.760645,\n 39.617036\n ],\n [\n 114.783775,\n 39.609499\n ],\n [\n 114.821642,\n 39.61022\n ],\n [\n 114.838429,\n 39.589179\n ],\n [\n 114.891032,\n 39.634728\n ],\n [\n 114.936331,\n 39.66368\n ],\n [\n 114.961895,\n 39.666103\n ],\n [\n 114.987396,\n 39.67802\n ],\n [\n 115.011487,\n 39.674746\n ],\n [\n 115.03199,\n 39.702373\n ],\n [\n 115.050058,\n 39.709245\n ],\n [\n 115.095293,\n 39.704795\n ],\n [\n 115.138734,\n 39.688627\n ],\n [\n 115.168847,\n 39.672651\n ],\n [\n 115.179163,\n 39.679592\n ],\n [\n 115.177625,\n 39.700475\n ],\n [\n 115.215043,\n 39.708067\n ],\n [\n 115.250859,\n 39.73882\n ],\n [\n 115.283216,\n 39.745165\n ],\n [\n 115.312945,\n 39.783551\n ],\n [\n 115.342867,\n 39.79205\n ],\n [\n 115.330052,\n 39.80656\n ],\n [\n 115.345237,\n 39.821851\n ],\n [\n 115.343251,\n 39.837857\n ],\n [\n 115.354848,\n 39.850528\n ],\n [\n 115.354848,\n 39.850528\n ],\n [\n 115.365676,\n 39.867507\n ],\n [\n 115.364523,\n 39.885331\n ],\n [\n 115.399891,\n 39.891336\n ],\n [\n 115.40162,\n 39.903802\n ],\n [\n 115.426801,\n 39.950056\n ],\n [\n 115.438462,\n 39.952534\n ],\n [\n 115.480685,\n 39.935838\n ],\n [\n 115.487285,\n 39.923834\n ],\n [\n 115.523037,\n 39.898907\n ],\n [\n 115.51003,\n 39.881479\n ],\n [\n 115.526625,\n 39.875538\n ],\n [\n 115.514323,\n 39.837726\n ],\n [\n 115.569168,\n 39.814206\n ],\n [\n 115.55488,\n 39.795579\n ],\n [\n 115.505289,\n 39.784597\n ],\n [\n 115.483761,\n 39.798717\n ],\n [\n 115.457171,\n 39.781982\n ],\n [\n 115.434105,\n 39.782309\n ],\n [\n 115.439871,\n 39.752099\n ],\n [\n 115.466717,\n 39.740456\n ],\n [\n 115.482351,\n 39.742483\n ],\n [\n 115.499266,\n 39.69622\n ],\n [\n 115.491065,\n 39.66846\n ],\n [\n 115.478507,\n 39.650319\n ],\n [\n 115.506698,\n 39.652153\n ],\n [\n 115.52246,\n 39.639969\n ],\n [\n 115.523421,\n 39.620378\n ],\n [\n 115.513041,\n 39.611727\n ],\n [\n 115.515925,\n 39.591211\n ],\n [\n 115.545974,\n 39.61874\n ],\n [\n 115.587044,\n 39.589965\n ],\n [\n 115.61844,\n 39.604059\n ],\n [\n 115.633176,\n 39.597701\n ],\n [\n 115.664507,\n 39.604649\n ],\n [\n 115.667134,\n 39.615594\n ],\n [\n 115.685331,\n 39.603666\n ],\n [\n 115.697889,\n 39.579344\n ],\n [\n 115.692058,\n 39.56577\n ],\n [\n 115.71711,\n 39.560392\n ],\n [\n 115.738574,\n 39.546289\n ],\n [\n 115.752542,\n 39.515385\n ],\n [\n 115.82033,\n 39.509741\n ],\n [\n 115.819241,\n 39.53074\n ],\n [\n 115.846023,\n 39.543272\n ],\n [\n 115.855506,\n 39.555014\n ],\n [\n 115.882992,\n 39.548126\n ],\n [\n 115.89004,\n 39.567869\n ],\n [\n 115.907852,\n 39.566885\n ],\n [\n 115.915605,\n 39.58295\n ],\n [\n 115.910223,\n 39.600847\n ],\n [\n 115.923742,\n 39.597308\n ],\n [\n 115.937966,\n 39.577442\n ],\n [\n 115.959558,\n 39.560851\n ],\n [\n 115.978139,\n 39.572852\n ],\n [\n 115.978459,\n 39.595669\n ],\n [\n 115.991018,\n 39.593768\n ],\n [\n 115.995182,\n 39.577049\n ],\n [\n 116.026193,\n 39.587409\n ],\n [\n 116.036188,\n 39.571672\n ],\n [\n 116.121468,\n 39.574951\n ],\n [\n 116.149595,\n 39.573049\n ],\n [\n 116.151774,\n 39.583409\n ],\n [\n 116.19688,\n 39.588982\n ],\n [\n 116.221164,\n 39.578951\n ],\n [\n 116.246152,\n 39.557178\n ],\n [\n 116.244678,\n 39.517354\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 130700,\n \"name\": \"张家口市\",\n \"center\": [\n 114.884091,\n 40.811901\n ],\n \"centroid\": [\n 115.038685,\n 40.874644\n ],\n \"childrenNum\": 16,\n \"level\": \"city\",\n \"parent\": {\n \"adcode\": 130000\n },\n \"subFeatureIndex\": 6,\n \"acroutes\": [\n 100000,\n 130000\n ]\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 114.563432,\n 39.558162\n ],\n [\n 114.568942,\n 39.573967\n ],\n [\n 114.557025,\n 39.581442\n ],\n [\n 114.515378,\n 39.564983\n ],\n [\n 114.495836,\n 39.608188\n ],\n [\n 114.474757,\n 39.613759\n ],\n [\n 114.431636,\n 39.614021\n ],\n [\n 114.408122,\n 39.651956\n ],\n [\n 114.408827,\n 39.782375\n ],\n [\n 114.390695,\n 39.818584\n ],\n [\n 114.406712,\n 39.83348\n ],\n [\n 114.395436,\n 39.867246\n ],\n [\n 114.349432,\n 39.862806\n ],\n [\n 114.328929,\n 39.865548\n ],\n [\n 114.286065,\n 39.858235\n ],\n [\n 114.276967,\n 39.874494\n ],\n [\n 114.224877,\n 39.851704\n ],\n [\n 114.19944,\n 39.87939\n ],\n [\n 114.229426,\n 39.899495\n ],\n [\n 114.211998,\n 39.918745\n ],\n [\n 114.174132,\n 39.897602\n ],\n [\n 114.102884,\n 39.912873\n ],\n [\n 114.089941,\n 39.910197\n ],\n [\n 114.067772,\n 39.922334\n ],\n [\n 114.047397,\n 39.916135\n ],\n [\n 114.02824,\n 39.959316\n ],\n [\n 114.029457,\n 39.985395\n ],\n [\n 114.021256,\n 39.991782\n ],\n [\n 113.960452,\n 40.000906\n ],\n [\n 113.932004,\n 40.009443\n ],\n [\n 113.914641,\n 40.005924\n ],\n [\n 113.922457,\n 40.026578\n ],\n [\n 113.954878,\n 40.030812\n ],\n [\n 113.975573,\n 40.051068\n ],\n [\n 113.981019,\n 40.073205\n ],\n [\n 113.973843,\n 40.097157\n ],\n [\n 113.989476,\n 40.112383\n ],\n [\n 114.019462,\n 40.102819\n ],\n [\n 114.043809,\n 40.056863\n ],\n [\n 114.091159,\n 40.075288\n ],\n [\n 114.101218,\n 40.10874\n ],\n [\n 114.089108,\n 40.121491\n ],\n [\n 114.068029,\n 40.179754\n ],\n [\n 114.097758,\n 40.193597\n ],\n [\n 114.123387,\n 40.188723\n ],\n [\n 114.123963,\n 40.178129\n ],\n [\n 114.145107,\n 40.177349\n ],\n [\n 114.180026,\n 40.191517\n ],\n [\n 114.235833,\n 40.198341\n ],\n [\n 114.240126,\n 40.221924\n ],\n [\n 114.255247,\n 40.236213\n ],\n [\n 114.293113,\n 40.230108\n ],\n [\n 114.335144,\n 40.245434\n ],\n [\n 114.362567,\n 40.250109\n ],\n [\n 114.406392,\n 40.246149\n ],\n [\n 114.469951,\n 40.268093\n ],\n [\n 114.510957,\n 40.303006\n ],\n [\n 114.526463,\n 40.32357\n ],\n [\n 114.530627,\n 40.3451\n ],\n [\n 114.499296,\n 40.354047\n ],\n [\n 114.470784,\n 40.349703\n ],\n [\n 114.446565,\n 40.372845\n ],\n [\n 114.390374,\n 40.351259\n ],\n [\n 114.382237,\n 40.362085\n ],\n [\n 114.344435,\n 40.36954\n ],\n [\n 114.314449,\n 40.369604\n ],\n [\n 114.28709,\n 40.423444\n ],\n [\n 114.299648,\n 40.440086\n ],\n [\n 114.275429,\n 40.458019\n ],\n [\n 114.267228,\n 40.474199\n ],\n [\n 114.282605,\n 40.495164\n ],\n [\n 114.285617,\n 40.525822\n ],\n [\n 114.296381,\n 40.535973\n ],\n [\n 114.293433,\n 40.551424\n ],\n [\n 114.273379,\n 40.553815\n ],\n [\n 114.282926,\n 40.590778\n ],\n [\n 114.258258,\n 40.610672\n ],\n [\n 114.236153,\n 40.606991\n ],\n [\n 114.209307,\n 40.629721\n ],\n [\n 114.216163,\n 40.63437\n ],\n [\n 114.200081,\n 40.662189\n ],\n [\n 114.18323,\n 40.671675\n ],\n [\n 114.147285,\n 40.73346\n ],\n [\n 114.134727,\n 40.737263\n ],\n [\n 114.104165,\n 40.768068\n ],\n [\n 114.104421,\n 40.797571\n ],\n [\n 114.081163,\n 40.790486\n ],\n [\n 114.044771,\n 40.831115\n ],\n [\n 114.069694,\n 40.846948\n ],\n [\n 114.073539,\n 40.857308\n ],\n [\n 114.052844,\n 40.870304\n ],\n [\n 114.052203,\n 40.893395\n ],\n [\n 114.041375,\n 40.917378\n ],\n [\n 114.057457,\n 40.925092\n ],\n [\n 114.011773,\n 40.935311\n ],\n [\n 114.000753,\n 40.947521\n ],\n [\n 113.991142,\n 40.940195\n ],\n [\n 113.97647,\n 40.961206\n ],\n [\n 113.972946,\n 40.982981\n ],\n [\n 113.922585,\n 41.024391\n ],\n [\n 113.90567,\n 41.034081\n ],\n [\n 113.868445,\n 41.068853\n ],\n [\n 113.823402,\n 41.093093\n ],\n [\n 113.820327,\n 41.101619\n ],\n [\n 113.863383,\n 41.106042\n ],\n [\n 113.877927,\n 41.115593\n ],\n [\n 113.920407,\n 41.172034\n ],\n [\n 113.973651,\n 41.174275\n ],\n [\n 113.996781,\n 41.192458\n ],\n [\n 114.000625,\n 41.224011\n ],\n [\n 114.016259,\n 41.232073\n ],\n [\n 114.007032,\n 41.250752\n ],\n [\n 113.985824,\n 41.270385\n ],\n [\n 113.976854,\n 41.266676\n ],\n [\n 113.971536,\n 41.239814\n ],\n [\n 113.952956,\n 41.254269\n ],\n [\n 113.951226,\n 41.282916\n ],\n [\n 113.936297,\n 41.294805\n ],\n [\n 113.922585,\n 41.291162\n ],\n [\n 113.89952,\n 41.316214\n ],\n [\n 113.926622,\n 41.326309\n ],\n [\n 113.923354,\n 41.33934\n ],\n [\n 113.937514,\n 41.356647\n ],\n [\n 113.93399,\n 41.376823\n ],\n [\n 113.943985,\n 41.390802\n ],\n [\n 113.918229,\n 41.40382\n ],\n [\n 113.8712,\n 41.413327\n ],\n [\n 113.884911,\n 41.438141\n ],\n [\n 113.92124,\n 41.457271\n ],\n [\n 113.930659,\n 41.485573\n ],\n [\n 113.952827,\n 41.483533\n ],\n [\n 113.977559,\n 41.506664\n ],\n [\n 114.032148,\n 41.529595\n ],\n [\n 114.083982,\n 41.528958\n ],\n [\n 114.101218,\n 41.537746\n ],\n [\n 114.231027,\n 41.513671\n ],\n [\n 114.231604,\n 41.547043\n ],\n [\n 114.221673,\n 41.582242\n ],\n [\n 114.237242,\n 41.59624\n ],\n [\n 114.227632,\n 41.620221\n ],\n [\n 114.259347,\n 41.6234\n ],\n [\n 114.215394,\n 41.685057\n ],\n [\n 114.219302,\n 41.700239\n ],\n [\n 114.237563,\n 41.698651\n ],\n [\n 114.232501,\n 41.717705\n ],\n [\n 114.206744,\n 41.738402\n ],\n [\n 114.215266,\n 41.756492\n ],\n [\n 114.200401,\n 41.778509\n ],\n [\n 114.202964,\n 41.793416\n ],\n [\n 114.243457,\n 41.832792\n ],\n [\n 114.287026,\n 41.868658\n ],\n [\n 114.330403,\n 41.916977\n ],\n [\n 114.326751,\n 41.9297\n ],\n [\n 114.343217,\n 41.926915\n ],\n [\n 114.348087,\n 41.947609\n ],\n [\n 114.374036,\n 41.956783\n ],\n [\n 114.421705,\n 41.942167\n ],\n [\n 114.476295,\n 41.953936\n ],\n [\n 114.487443,\n 41.96722\n ],\n [\n 114.510701,\n 41.973292\n ],\n [\n 114.501411,\n 41.99277\n ],\n [\n 114.484752,\n 41.999155\n ],\n [\n 114.485969,\n 42.015338\n ],\n [\n 114.46835,\n 42.025577\n ],\n [\n 114.466107,\n 42.037962\n ],\n [\n 114.479883,\n 42.064304\n ],\n [\n 114.5025,\n 42.067398\n ],\n [\n 114.500706,\n 42.085963\n ],\n [\n 114.510957,\n 42.110897\n ],\n [\n 114.560293,\n 42.132414\n ],\n [\n 114.585537,\n 42.131215\n ],\n [\n 114.624813,\n 42.112222\n ],\n [\n 114.647751,\n 42.109634\n ],\n [\n 114.675494,\n 42.120426\n ],\n [\n 114.704647,\n 42.121435\n ],\n [\n 114.710221,\n 42.115377\n ],\n [\n 114.754879,\n 42.115756\n ],\n [\n 114.78935,\n 42.130963\n ],\n [\n 114.793963,\n 42.149193\n ],\n [\n 114.828369,\n 42.147679\n ],\n [\n 114.823051,\n 42.140867\n ],\n [\n 114.861302,\n 42.101997\n ],\n [\n 114.860854,\n 42.05483\n ],\n [\n 114.889622,\n 42.030316\n ],\n [\n 114.89148,\n 42.012115\n ],\n [\n 114.901796,\n 42.015528\n ],\n [\n 114.916853,\n 41.981008\n ],\n [\n 114.915507,\n 41.958934\n ],\n [\n 114.933255,\n 41.943559\n ],\n [\n 114.916148,\n 41.936978\n ],\n [\n 114.925438,\n 41.899566\n ],\n [\n 114.92153,\n 41.875943\n ],\n [\n 114.939214,\n 41.846165\n ],\n [\n 114.922363,\n 41.825121\n ],\n [\n 114.8663,\n 41.804578\n ],\n [\n 114.896157,\n 41.76766\n ],\n [\n 114.895068,\n 41.736561\n ],\n [\n 114.902885,\n 41.689313\n ],\n [\n 114.895581,\n 41.636436\n ],\n [\n 114.860726,\n 41.600948\n ],\n [\n 114.877449,\n 41.590896\n ],\n [\n 114.89808,\n 41.607182\n ],\n [\n 114.938317,\n 41.613225\n ],\n [\n 114.977849,\n 41.611571\n ],\n [\n 115.025006,\n 41.61526\n ],\n [\n 115.055953,\n 41.602284\n ],\n [\n 115.087796,\n 41.613415\n ],\n [\n 115.099137,\n 41.623973\n ],\n [\n 115.113489,\n 41.615769\n ],\n [\n 115.142386,\n 41.616087\n ],\n [\n 115.167246,\n 41.605973\n ],\n [\n 115.195053,\n 41.602093\n ],\n [\n 115.205753,\n 41.591723\n ],\n [\n 115.204215,\n 41.571423\n ],\n [\n 115.257587,\n 41.581097\n ],\n [\n 115.266429,\n 41.592868\n ],\n [\n 115.26425,\n 41.611889\n ],\n [\n 115.273477,\n 41.622764\n ],\n [\n 115.290328,\n 41.622955\n ],\n [\n 115.311535,\n 41.592677\n ],\n [\n 115.365099,\n 41.595795\n ],\n [\n 115.377594,\n 41.602475\n ],\n [\n 115.345494,\n 41.635673\n ],\n [\n 115.360935,\n 41.661355\n ],\n [\n 115.355489,\n 41.672158\n ],\n [\n 115.336844,\n 41.675145\n ],\n [\n 115.319032,\n 41.691473\n ],\n [\n 115.347031,\n 41.712307\n ],\n [\n 115.366317,\n 41.712561\n ],\n [\n 115.430068,\n 41.728753\n ],\n [\n 115.488758,\n 41.760934\n ],\n [\n 115.519769,\n 41.767787\n ],\n [\n 115.548345,\n 41.783902\n ],\n [\n 115.574102,\n 41.805403\n ],\n [\n 115.598641,\n 41.808003\n ],\n [\n 115.630806,\n 41.824995\n ],\n [\n 115.653871,\n 41.829052\n ],\n [\n 115.659382,\n 41.848319\n ],\n [\n 115.68815,\n 41.867708\n ],\n [\n 115.724415,\n 41.868025\n ],\n [\n 115.727874,\n 41.888421\n ],\n [\n 115.756707,\n 41.886774\n ],\n [\n 115.795855,\n 41.911153\n ],\n [\n 115.810976,\n 41.912356\n ],\n [\n 115.815461,\n 41.928687\n ],\n [\n 115.828852,\n 41.936978\n ],\n [\n 115.853071,\n 41.927738\n ],\n [\n 115.916374,\n 41.945141\n ],\n [\n 115.946936,\n 41.885634\n ],\n [\n 115.978588,\n 41.840841\n ],\n [\n 115.994926,\n 41.828608\n ],\n [\n 116.016646,\n 41.77705\n ],\n [\n 116.03401,\n 41.782633\n ],\n [\n 116.083986,\n 41.781745\n ],\n [\n 116.081039,\n 41.776352\n ],\n [\n 116.056307,\n 41.733705\n ],\n [\n 116.014404,\n 41.715355\n ],\n [\n 115.972885,\n 41.680101\n ],\n [\n 115.909967,\n 41.642921\n ],\n [\n 115.929252,\n 41.596113\n ],\n [\n 115.924767,\n 41.568623\n ],\n [\n 115.958789,\n 41.550353\n ],\n [\n 115.97391,\n 41.529659\n ],\n [\n 115.982112,\n 41.485127\n ],\n [\n 115.97673,\n 41.470913\n ],\n [\n 116.000052,\n 41.454402\n ],\n [\n 116.004473,\n 41.432911\n ],\n [\n 116.03023,\n 41.416645\n ],\n [\n 116.036124,\n 41.397694\n ],\n [\n 116.07713,\n 41.384866\n ],\n [\n 116.08751,\n 41.376951\n ],\n [\n 116.141586,\n 41.373439\n ],\n [\n 116.17484,\n 41.356328\n ],\n [\n 116.203352,\n 41.326117\n ],\n [\n 116.209503,\n 41.307715\n ],\n [\n 116.191627,\n 41.288158\n ],\n [\n 116.198995,\n 41.259578\n ],\n [\n 116.213603,\n 41.233288\n ],\n [\n 116.235195,\n 41.211853\n ],\n [\n 116.221356,\n 41.185928\n ],\n [\n 116.22347,\n 41.174275\n ],\n [\n 116.245895,\n 41.16358\n ],\n [\n 116.233273,\n 41.130845\n ],\n [\n 116.245447,\n 41.114183\n ],\n [\n 116.268769,\n 41.102645\n ],\n [\n 116.277419,\n 41.083154\n ],\n [\n 116.296128,\n 41.062118\n ],\n [\n 116.264733,\n 41.038252\n ],\n [\n 116.29837,\n 40.986641\n ],\n [\n 116.333546,\n 40.984458\n ],\n [\n 116.341747,\n 40.964804\n ],\n [\n 116.365069,\n 40.943216\n ],\n [\n 116.334571,\n 40.921749\n ],\n [\n 116.334443,\n 40.904648\n ],\n [\n 116.399988,\n 40.84978\n ],\n [\n 116.40646,\n 40.833368\n ],\n [\n 116.43683,\n 40.820751\n ],\n [\n 116.456564,\n 40.798665\n ],\n [\n 116.465854,\n 40.774511\n ],\n [\n 116.453937,\n 40.765877\n ],\n [\n 116.416519,\n 40.769357\n ],\n [\n 116.414276,\n 40.777925\n ],\n [\n 116.379806,\n 40.77232\n ],\n [\n 116.317015,\n 40.772256\n ],\n [\n 116.307917,\n 40.752152\n ],\n [\n 116.290938,\n 40.763815\n ],\n [\n 116.273446,\n 40.762913\n ],\n [\n 116.269602,\n 40.777152\n ],\n [\n 116.247946,\n 40.791839\n ],\n [\n 116.235003,\n 40.783143\n ],\n [\n 116.218857,\n 40.742807\n ],\n [\n 116.191947,\n 40.724241\n ],\n [\n 116.171316,\n 40.695996\n ],\n [\n 116.162025,\n 40.662383\n ],\n [\n 116.136909,\n 40.667674\n ],\n [\n 116.112562,\n 40.648507\n ],\n [\n 116.121724,\n 40.62914\n ],\n [\n 116.099363,\n 40.630561\n ],\n [\n 116.062714,\n 40.610285\n ],\n [\n 116.030037,\n 40.597367\n ],\n [\n 116.0285,\n 40.607314\n ],\n [\n 116.005113,\n 40.584124\n ],\n [\n 115.981407,\n 40.579665\n ],\n [\n 115.971988,\n 40.602341\n ],\n [\n 115.907788,\n 40.617324\n ],\n [\n 115.885427,\n 40.595235\n ],\n [\n 115.846151,\n 40.593039\n ],\n [\n 115.827378,\n 40.587031\n ],\n [\n 115.819818,\n 40.559374\n ],\n [\n 115.792203,\n 40.561313\n ],\n [\n 115.755041,\n 40.540046\n ],\n [\n 115.736012,\n 40.503832\n ],\n [\n 115.782207,\n 40.492058\n ],\n [\n 115.769841,\n 40.468051\n ],\n [\n 115.770418,\n 40.444165\n ],\n [\n 115.796431,\n 40.426812\n ],\n [\n 115.846856,\n 40.375113\n ],\n [\n 115.861849,\n 40.373428\n ],\n [\n 115.864476,\n 40.359363\n ],\n [\n 115.918296,\n 40.353917\n ],\n [\n 115.922653,\n 40.325905\n ],\n [\n 115.943156,\n 40.311375\n ],\n [\n 115.93976,\n 40.304434\n ],\n [\n 115.968913,\n 40.264263\n ],\n [\n 115.960007,\n 40.256667\n ],\n [\n 115.930085,\n 40.254524\n ],\n [\n 115.911953,\n 40.23446\n ],\n [\n 115.898498,\n 40.234524\n ],\n [\n 115.883121,\n 40.216143\n ],\n [\n 115.886324,\n 40.206657\n ],\n [\n 115.870306,\n 40.186058\n ],\n [\n 115.855506,\n 40.188853\n ],\n [\n 115.844421,\n 40.168053\n ],\n [\n 115.847817,\n 40.147052\n ],\n [\n 115.806555,\n 40.15323\n ],\n [\n 115.773045,\n 40.176179\n ],\n [\n 115.754336,\n 40.163243\n ],\n [\n 115.754849,\n 40.145427\n ],\n [\n 115.734858,\n 40.129492\n ],\n [\n 115.715893,\n 40.133395\n ],\n [\n 115.644581,\n 40.12663\n ],\n [\n 115.641762,\n 40.115897\n ],\n [\n 115.59909,\n 40.119995\n ],\n [\n 115.590697,\n 40.096376\n ],\n [\n 115.575576,\n 40.100997\n ],\n [\n 115.553727,\n 40.091691\n ],\n [\n 115.555457,\n 40.082644\n ],\n [\n 115.528034,\n 40.07633\n ],\n [\n 115.478571,\n 40.036153\n ],\n [\n 115.454544,\n 40.029705\n ],\n [\n 115.442178,\n 40.010876\n ],\n [\n 115.450123,\n 39.99289\n ],\n [\n 115.428531,\n 39.984352\n ],\n [\n 115.426801,\n 39.950056\n ],\n [\n 115.40162,\n 39.903802\n ],\n [\n 115.399891,\n 39.891336\n ],\n [\n 115.364523,\n 39.885331\n ],\n [\n 115.365676,\n 39.867507\n ],\n [\n 115.354848,\n 39.850528\n ],\n [\n 115.354848,\n 39.850528\n ],\n [\n 115.343251,\n 39.837857\n ],\n [\n 115.345237,\n 39.821851\n ],\n [\n 115.330052,\n 39.80656\n ],\n [\n 115.342867,\n 39.79205\n ],\n [\n 115.312945,\n 39.783551\n ],\n [\n 115.283216,\n 39.745165\n ],\n [\n 115.250859,\n 39.73882\n ],\n [\n 115.215043,\n 39.708067\n ],\n [\n 115.177625,\n 39.700475\n ],\n [\n 115.179163,\n 39.679592\n ],\n [\n 115.168847,\n 39.672651\n ],\n [\n 115.138734,\n 39.688627\n ],\n [\n 115.095293,\n 39.704795\n ],\n [\n 115.050058,\n 39.709245\n ],\n [\n 115.03199,\n 39.702373\n ],\n [\n 115.011487,\n 39.674746\n ],\n [\n 114.987396,\n 39.67802\n ],\n [\n 114.961895,\n 39.666103\n ],\n [\n 114.936331,\n 39.66368\n ],\n [\n 114.891032,\n 39.634728\n ],\n [\n 114.838429,\n 39.589179\n ],\n [\n 114.821642,\n 39.61022\n ],\n [\n 114.783775,\n 39.609499\n ],\n [\n 114.760645,\n 39.617036\n ],\n [\n 114.716756,\n 39.618674\n ],\n [\n 114.712079,\n 39.594358\n ],\n [\n 114.680748,\n 39.588064\n ],\n [\n 114.654991,\n 39.599209\n ],\n [\n 114.633527,\n 39.555866\n ],\n [\n 114.604887,\n 39.567869\n ],\n [\n 114.58432,\n 39.585835\n ],\n [\n 114.563432,\n 39.558162\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 130800,\n \"name\": \"承德市\",\n \"center\": [\n 117.939152,\n 40.976204\n ],\n \"centroid\": [\n 117.55153,\n 41.356188\n ],\n \"childrenNum\": 11,\n \"level\": \"city\",\n \"parent\": {\n \"adcode\": 130000\n },\n \"subFeatureIndex\": 7,\n \"acroutes\": [\n 100000,\n 130000\n ]\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 119.158474,\n 40.614418\n ],\n [\n 119.105487,\n 40.603632\n ],\n [\n 119.086394,\n 40.588775\n ],\n [\n 119.063392,\n 40.606151\n ],\n [\n 119.013095,\n 40.577081\n ],\n [\n 118.998359,\n 40.578955\n ],\n [\n 118.983366,\n 40.56364\n ],\n [\n 118.952676,\n 40.558469\n ],\n [\n 118.966003,\n 40.536102\n ],\n [\n 118.919038,\n 40.53093\n ],\n [\n 118.886938,\n 40.542438\n ],\n [\n 118.864,\n 40.527244\n ],\n [\n 118.821328,\n 40.531964\n ],\n [\n 118.794867,\n 40.510753\n ],\n [\n 118.792112,\n 40.492382\n ],\n [\n 118.772954,\n 40.479765\n ],\n [\n 118.723491,\n 40.473746\n ],\n [\n 118.702795,\n 40.491411\n ],\n [\n 118.657176,\n 40.450574\n ],\n [\n 118.624179,\n 40.437626\n ],\n [\n 118.618349,\n 40.425193\n ],\n [\n 118.643785,\n 40.380946\n ],\n [\n 118.640197,\n 40.354566\n ],\n [\n 118.608225,\n 40.328305\n ],\n [\n 118.596949,\n 40.308456\n ],\n [\n 118.580098,\n 40.305861\n ],\n [\n 118.568949,\n 40.287564\n ],\n [\n 118.533325,\n 40.298854\n ],\n [\n 118.532364,\n 40.319419\n ],\n [\n 118.539989,\n 40.361048\n ],\n [\n 118.558377,\n 40.36928\n ],\n [\n 118.550881,\n 40.385482\n ],\n [\n 118.571512,\n 40.414636\n ],\n [\n 118.548062,\n 40.422667\n ],\n [\n 118.523458,\n 40.40628\n ],\n [\n 118.503211,\n 40.403365\n ],\n [\n 118.45599,\n 40.414053\n ],\n [\n 118.430746,\n 40.411851\n ],\n [\n 118.402683,\n 40.416838\n ],\n [\n 118.387305,\n 40.436719\n ],\n [\n 118.360011,\n 40.428819\n ],\n [\n 118.356295,\n 40.435295\n ],\n [\n 118.306575,\n 40.419558\n ],\n [\n 118.277935,\n 40.425711\n ],\n [\n 118.262942,\n 40.452063\n ],\n [\n 118.239684,\n 40.464686\n ],\n [\n 118.173818,\n 40.423056\n ],\n [\n 118.156967,\n 40.423768\n ],\n [\n 118.153123,\n 40.409519\n ],\n [\n 118.165232,\n 40.400449\n ],\n [\n 118.133837,\n 40.375113\n ],\n [\n 118.121856,\n 40.354695\n ],\n [\n 118.079312,\n 40.353528\n ],\n [\n 118.061564,\n 40.319095\n ],\n [\n 118.031643,\n 40.302358\n ],\n [\n 118.000888,\n 40.29256\n ],\n [\n 117.909457,\n 40.285876\n ],\n [\n 117.897989,\n 40.270429\n ],\n [\n 117.867554,\n 40.26965\n ],\n [\n 117.844104,\n 40.261406\n ],\n [\n 117.807775,\n 40.261926\n ],\n [\n 117.75152,\n 40.229718\n ],\n [\n 117.714551,\n 40.241668\n ],\n [\n 117.694112,\n 40.238161\n ],\n [\n 117.677069,\n 40.22095\n ],\n [\n 117.64625,\n 40.205163\n ],\n [\n 117.619532,\n 40.206398\n ],\n [\n 117.609409,\n 40.194897\n ],\n [\n 117.575451,\n 40.192817\n ],\n [\n 117.56238,\n 40.206073\n ],\n [\n 117.571671,\n 40.219261\n ],\n [\n 117.54617,\n 40.232901\n ],\n [\n 117.514326,\n 40.227705\n ],\n [\n 117.484084,\n 40.235304\n ],\n [\n 117.450062,\n 40.252512\n ],\n [\n 117.419115,\n 40.249785\n ],\n [\n 117.415335,\n 40.236862\n ],\n [\n 117.386375,\n 40.22712\n ],\n [\n 117.350943,\n 40.229978\n ],\n [\n 117.339859,\n 40.246213\n ],\n [\n 117.331465,\n 40.28977\n ],\n [\n 117.296354,\n 40.278088\n ],\n [\n 117.293342,\n 40.296713\n ],\n [\n 117.274377,\n 40.308521\n ],\n [\n 117.275018,\n 40.33239\n ],\n [\n 117.260217,\n 40.335762\n ],\n [\n 117.242277,\n 40.369993\n ],\n [\n 117.226195,\n 40.369021\n ],\n [\n 117.228502,\n 40.386389\n ],\n [\n 117.240675,\n 40.394424\n ],\n [\n 117.234076,\n 40.417162\n ],\n [\n 117.263357,\n 40.442352\n ],\n [\n 117.236511,\n 40.45653\n ],\n [\n 117.237215,\n 40.468763\n ],\n [\n 117.208575,\n 40.501115\n ],\n [\n 117.219019,\n 40.514375\n ],\n [\n 117.247147,\n 40.511788\n ],\n [\n 117.264126,\n 40.517285\n ],\n [\n 117.247403,\n 40.54024\n ],\n [\n 117.269444,\n 40.560473\n ],\n [\n 117.311859,\n 40.57805\n ],\n [\n 117.342742,\n 40.581604\n ],\n [\n 117.365936,\n 40.575982\n ],\n [\n 117.387464,\n 40.560861\n ],\n [\n 117.402072,\n 40.573139\n ],\n [\n 117.430008,\n 40.576112\n ],\n [\n 117.412708,\n 40.605118\n ],\n [\n 117.431545,\n 40.625589\n ],\n [\n 117.448909,\n 40.628366\n ],\n [\n 117.46198,\n 40.65309\n ],\n [\n 117.477997,\n 40.635338\n ],\n [\n 117.501256,\n 40.636759\n ],\n [\n 117.514583,\n 40.660511\n ],\n [\n 117.492862,\n 40.675417\n ],\n [\n 117.442245,\n 40.676643\n ],\n [\n 117.409248,\n 40.687288\n ],\n [\n 117.359208,\n 40.673869\n ],\n [\n 117.342678,\n 40.673611\n ],\n [\n 117.32115,\n 40.658317\n ],\n [\n 117.290395,\n 40.660189\n ],\n [\n 117.261371,\n 40.681159\n ],\n [\n 117.241636,\n 40.676643\n ],\n [\n 117.20236,\n 40.695609\n ],\n [\n 117.117785,\n 40.700059\n ],\n [\n 117.110673,\n 40.70825\n ],\n [\n 117.0771,\n 40.700059\n ],\n [\n 117.058327,\n 40.701543\n ],\n [\n 117.031032,\n 40.692126\n ],\n [\n 116.979967,\n 40.702833\n ],\n [\n 116.926531,\n 40.744869\n ],\n [\n 116.923391,\n 40.773738\n ],\n [\n 116.894623,\n 40.781597\n ],\n [\n 116.896353,\n 40.79712\n ],\n [\n 116.880207,\n 40.804332\n ],\n [\n 116.87617,\n 40.821202\n ],\n [\n 116.847723,\n 40.839354\n ],\n [\n 116.813636,\n 40.848428\n ],\n [\n 116.805051,\n 40.840706\n ],\n [\n 116.79512,\n 40.863614\n ],\n [\n 116.759496,\n 40.889858\n ],\n [\n 116.730471,\n 40.897768\n ],\n [\n 116.713236,\n 40.911978\n ],\n [\n 116.722334,\n 40.927406\n ],\n [\n 116.689465,\n 40.950669\n ],\n [\n 116.67774,\n 40.971227\n ],\n [\n 116.683058,\n 41.000511\n ],\n [\n 116.698884,\n 41.021246\n ],\n [\n 116.688632,\n 41.044669\n ],\n [\n 116.665182,\n 41.046658\n ],\n [\n 116.64769,\n 41.059296\n ],\n [\n 116.630839,\n 41.060771\n ],\n [\n 116.614116,\n 41.03607\n ],\n [\n 116.622958,\n 41.02086\n ],\n [\n 116.614309,\n 40.982916\n ],\n [\n 116.597778,\n 40.97476\n ],\n [\n 116.569715,\n 40.991265\n ],\n [\n 116.536333,\n 40.988889\n ],\n [\n 116.516791,\n 40.975274\n ],\n [\n 116.455539,\n 40.980476\n ],\n [\n 116.447466,\n 40.953818\n ],\n [\n 116.473607,\n 40.919757\n ],\n [\n 116.474184,\n 40.896032\n ],\n [\n 116.458678,\n 40.900597\n ],\n [\n 116.41402,\n 40.899762\n ],\n [\n 116.398771,\n 40.905934\n ],\n [\n 116.37641,\n 40.939681\n ],\n [\n 116.365069,\n 40.943216\n ],\n [\n 116.341747,\n 40.964804\n ],\n [\n 116.333546,\n 40.984458\n ],\n [\n 116.29837,\n 40.986641\n ],\n [\n 116.264733,\n 41.038252\n ],\n [\n 116.296128,\n 41.062118\n ],\n [\n 116.277419,\n 41.083154\n ],\n [\n 116.268769,\n 41.102645\n ],\n [\n 116.245447,\n 41.114183\n ],\n [\n 116.233273,\n 41.130845\n ],\n [\n 116.245895,\n 41.16358\n ],\n [\n 116.22347,\n 41.174275\n ],\n [\n 116.221356,\n 41.185928\n ],\n [\n 116.235195,\n 41.211853\n ],\n [\n 116.213603,\n 41.233288\n ],\n [\n 116.198995,\n 41.259578\n ],\n [\n 116.191627,\n 41.288158\n ],\n [\n 116.209503,\n 41.307715\n ],\n [\n 116.203352,\n 41.326117\n ],\n [\n 116.17484,\n 41.356328\n ],\n [\n 116.141586,\n 41.373439\n ],\n [\n 116.08751,\n 41.376951\n ],\n [\n 116.07713,\n 41.384866\n ],\n [\n 116.036124,\n 41.397694\n ],\n [\n 116.03023,\n 41.416645\n ],\n [\n 116.004473,\n 41.432911\n ],\n [\n 116.000052,\n 41.454402\n ],\n [\n 115.97673,\n 41.470913\n ],\n [\n 115.982112,\n 41.485127\n ],\n [\n 115.97391,\n 41.529659\n ],\n [\n 115.958789,\n 41.550353\n ],\n [\n 115.924767,\n 41.568623\n ],\n [\n 115.929252,\n 41.596113\n ],\n [\n 115.909967,\n 41.642921\n ],\n [\n 115.972885,\n 41.680101\n ],\n [\n 116.014404,\n 41.715355\n ],\n [\n 116.056307,\n 41.733705\n ],\n [\n 116.081039,\n 41.776352\n ],\n [\n 116.098658,\n 41.776479\n ],\n [\n 116.129221,\n 41.806607\n ],\n [\n 116.105706,\n 41.834757\n ],\n [\n 116.106667,\n 41.849587\n ],\n [\n 116.134731,\n 41.863844\n ],\n [\n 116.171124,\n 41.868912\n ],\n [\n 116.193164,\n 41.861816\n ],\n [\n 116.212578,\n 41.885128\n ],\n [\n 116.211361,\n 41.906848\n ],\n [\n 116.230518,\n 41.926282\n ],\n [\n 116.233401,\n 41.941408\n ],\n [\n 116.28421,\n 41.959376\n ],\n [\n 116.29837,\n 41.968106\n ],\n [\n 116.306507,\n 41.991379\n ],\n [\n 116.327267,\n 42.005667\n ],\n [\n 116.373719,\n 42.009965\n ],\n [\n 116.409087,\n 41.994034\n ],\n [\n 116.41402,\n 41.98221\n ],\n [\n 116.393133,\n 41.94299\n ],\n [\n 116.432088,\n 41.939383\n ],\n [\n 116.453873,\n 41.945964\n ],\n [\n 116.482641,\n 41.975886\n ],\n [\n 116.496416,\n 41.97968\n ],\n [\n 116.514164,\n 41.970067\n ],\n [\n 116.533706,\n 41.938876\n ],\n [\n 116.566383,\n 41.928751\n ],\n [\n 116.597073,\n 41.935586\n ],\n [\n 116.634812,\n 41.929953\n ],\n [\n 116.669154,\n 41.947735\n ],\n [\n 116.72746,\n 41.951089\n ],\n [\n 116.744631,\n 41.982146\n ],\n [\n 116.766479,\n 41.990304\n ],\n [\n 116.796209,\n 41.978099\n ],\n [\n 116.821133,\n 41.988723\n ],\n [\n 116.831961,\n 42.005351\n ],\n [\n 116.868161,\n 42.002885\n ],\n [\n 116.87963,\n 42.018372\n ],\n [\n 116.881681,\n 42.05224\n ],\n [\n 116.890651,\n 42.092655\n ],\n [\n 116.877324,\n 42.121057\n ],\n [\n 116.865022,\n 42.124085\n ],\n [\n 116.850221,\n 42.15632\n ],\n [\n 116.825169,\n 42.155563\n ],\n [\n 116.789225,\n 42.200261\n ],\n [\n 116.858166,\n 42.197236\n ],\n [\n 116.903401,\n 42.19087\n ],\n [\n 116.917433,\n 42.207698\n ],\n [\n 116.918522,\n 42.229875\n ],\n [\n 116.897442,\n 42.297618\n ],\n [\n 116.886806,\n 42.366608\n ],\n [\n 116.911858,\n 42.391431\n ],\n [\n 116.914421,\n 42.402677\n ],\n [\n 116.965102,\n 42.421583\n ],\n [\n 117.006685,\n 42.432948\n ],\n [\n 117.016744,\n 42.45649\n ],\n [\n 117.046922,\n 42.454105\n ],\n [\n 117.079535,\n 42.460632\n ],\n [\n 117.094912,\n 42.483661\n ],\n [\n 117.135726,\n 42.469167\n ],\n [\n 117.175963,\n 42.465527\n ],\n [\n 117.222287,\n 42.475442\n ],\n [\n 117.252208,\n 42.473685\n ],\n [\n 117.275466,\n 42.481905\n ],\n [\n 117.321406,\n 42.468791\n ],\n [\n 117.330056,\n 42.461887\n ],\n [\n 117.390732,\n 42.462076\n ],\n [\n 117.412836,\n 42.472493\n ],\n [\n 117.416296,\n 42.512326\n ],\n [\n 117.408415,\n 42.519976\n ],\n [\n 117.387015,\n 42.517405\n ],\n [\n 117.39637,\n 42.536339\n ],\n [\n 117.433147,\n 42.555769\n ],\n [\n 117.44436,\n 42.577447\n ],\n [\n 117.435197,\n 42.585403\n ],\n [\n 117.455957,\n 42.589411\n ],\n [\n 117.473512,\n 42.602437\n ],\n [\n 117.524898,\n 42.590727\n ],\n [\n 117.539955,\n 42.605443\n ],\n [\n 117.600311,\n 42.603001\n ],\n [\n 117.610883,\n 42.592355\n ],\n [\n 117.6442,\n 42.589787\n ],\n [\n 117.66733,\n 42.582459\n ],\n [\n 117.707247,\n 42.588033\n ],\n [\n 117.779904,\n 42.618591\n ],\n [\n 117.801496,\n 42.612706\n ],\n [\n 117.792334,\n 42.598367\n ],\n [\n 117.797588,\n 42.585277\n ],\n [\n 117.829624,\n 42.56498\n ],\n [\n 117.849614,\n 42.546619\n ],\n [\n 117.87409,\n 42.510194\n ],\n [\n 117.940148,\n 42.462766\n ],\n [\n 117.954564,\n 42.445003\n ],\n [\n 117.99762,\n 42.416684\n ],\n [\n 118.019405,\n 42.395201\n ],\n [\n 118.021263,\n 42.371636\n ],\n [\n 118.009153,\n 42.358248\n ],\n [\n 118.016265,\n 42.333286\n ],\n [\n 118.059962,\n 42.29831\n ],\n [\n 118.047468,\n 42.280563\n ],\n [\n 118.023249,\n 42.267155\n ],\n [\n 117.971095,\n 42.248014\n ],\n [\n 117.977438,\n 42.229875\n ],\n [\n 118.020366,\n 42.213432\n ],\n [\n 118.033629,\n 42.199127\n ],\n [\n 118.089051,\n 42.183874\n ],\n [\n 118.10635,\n 42.171958\n ],\n [\n 118.104172,\n 42.148878\n ],\n [\n 118.088859,\n 42.117144\n ],\n [\n 118.097765,\n 42.10509\n ],\n [\n 118.136528,\n 42.094486\n ],\n [\n 118.155173,\n 42.081164\n ],\n [\n 118.136913,\n 42.052871\n ],\n [\n 118.115256,\n 42.045859\n ],\n [\n 118.116538,\n 42.037204\n ],\n [\n 118.141846,\n 42.031327\n ],\n [\n 118.189067,\n 42.030569\n ],\n [\n 118.204188,\n 42.034866\n ],\n [\n 118.220206,\n 42.058619\n ],\n [\n 118.212581,\n 42.081101\n ],\n [\n 118.226613,\n 42.090256\n ],\n [\n 118.252498,\n 42.091014\n ],\n [\n 118.272232,\n 42.083311\n ],\n [\n 118.297284,\n 42.048765\n ],\n [\n 118.283061,\n 42.03158\n ],\n [\n 118.237634,\n 42.022859\n ],\n [\n 118.256278,\n 42.010724\n ],\n [\n 118.294722,\n 42.005224\n ],\n [\n 118.314007,\n 41.987774\n ],\n [\n 118.306255,\n 41.975127\n ],\n [\n 118.306511,\n 41.940269\n ],\n [\n 118.268901,\n 41.930143\n ],\n [\n 118.270182,\n 41.917357\n ],\n [\n 118.286649,\n 41.91109\n ],\n [\n 118.324515,\n 41.880187\n ],\n [\n 118.340213,\n 41.872459\n ],\n [\n 118.331755,\n 41.840651\n ],\n [\n 118.319838,\n 41.83146\n ],\n [\n 118.292287,\n 41.772863\n ],\n [\n 118.270823,\n 41.762203\n ],\n [\n 118.246988,\n 41.774005\n ],\n [\n 118.236032,\n 41.807559\n ],\n [\n 118.219117,\n 41.815358\n ],\n [\n 118.165873,\n 41.813265\n ],\n [\n 118.140372,\n 41.783965\n ],\n [\n 118.130698,\n 41.742275\n ],\n [\n 118.155173,\n 41.712624\n ],\n [\n 118.153699,\n 41.691156\n ],\n [\n 118.169013,\n 41.67076\n ],\n [\n 118.206879,\n 41.65074\n ],\n [\n 118.215208,\n 41.633002\n ],\n [\n 118.20989,\n 41.61774\n ],\n [\n 118.215337,\n 41.595668\n ],\n [\n 118.230522,\n 41.582178\n ],\n [\n 118.270823,\n 41.573524\n ],\n [\n 118.279152,\n 41.56544\n ],\n [\n 118.301577,\n 41.569641\n ],\n [\n 118.313302,\n 41.561494\n ],\n [\n 118.302923,\n 41.552709\n ],\n [\n 118.315801,\n 41.512525\n ],\n [\n 118.295426,\n 41.485127\n ],\n [\n 118.269605,\n 41.478881\n ],\n [\n 118.272168,\n 41.471296\n ],\n [\n 118.327078,\n 41.450831\n ],\n [\n 118.34867,\n 41.428318\n ],\n [\n 118.343993,\n 41.404139\n ],\n [\n 118.361741,\n 41.386717\n ],\n [\n 118.348286,\n 41.373886\n ],\n [\n 118.349119,\n 41.342789\n ],\n [\n 118.380193,\n 41.312124\n ],\n [\n 118.399607,\n 41.311102\n ],\n [\n 118.412422,\n 41.33193\n ],\n [\n 118.47329,\n 41.345663\n ],\n [\n 118.500841,\n 41.345791\n ],\n [\n 118.528135,\n 41.355051\n ],\n [\n 118.539796,\n 41.3509\n ],\n [\n 118.57997,\n 41.354029\n ],\n [\n 118.629946,\n 41.34643\n ],\n [\n 118.676974,\n 41.350453\n ],\n [\n 118.695171,\n 41.337999\n ],\n [\n 118.741879,\n 41.324073\n ],\n [\n 118.763343,\n 41.328928\n ],\n [\n 118.770007,\n 41.353071\n ],\n [\n 118.846124,\n 41.373823\n ],\n [\n 118.844907,\n 41.34247\n ],\n [\n 118.868421,\n 41.312636\n ],\n [\n 118.890718,\n 41.300749\n ],\n [\n 118.934671,\n 41.304584\n ],\n [\n 118.949536,\n 41.318003\n ],\n [\n 118.974716,\n 41.306565\n ],\n [\n 119.006752,\n 41.307076\n ],\n [\n 119.035136,\n 41.298768\n ],\n [\n 119.093121,\n 41.293655\n ],\n [\n 119.154951,\n 41.297682\n ],\n [\n 119.200698,\n 41.28234\n ],\n [\n 119.212103,\n 41.308099\n ],\n [\n 119.239461,\n 41.314489\n ],\n [\n 119.248367,\n 41.27665\n ],\n [\n 119.231004,\n 41.256444\n ],\n [\n 119.20954,\n 41.244483\n ],\n [\n 119.209796,\n 41.225803\n ],\n [\n 119.169623,\n 41.222923\n ],\n [\n 119.166483,\n 41.21294\n ],\n [\n 119.188909,\n 41.198156\n ],\n [\n 119.184295,\n 41.182727\n ],\n [\n 119.158603,\n 41.169664\n ],\n [\n 119.126374,\n 41.138662\n ],\n [\n 119.081204,\n 41.131422\n ],\n [\n 119.080627,\n 41.095978\n ],\n [\n 119.073771,\n 41.084244\n ],\n [\n 119.050834,\n 41.080333\n ],\n [\n 119.037507,\n 41.067378\n ],\n [\n 119.008354,\n 41.068596\n ],\n [\n 118.964657,\n 41.079307\n ],\n [\n 118.93685,\n 41.052624\n ],\n [\n 118.936209,\n 41.037482\n ],\n [\n 118.951971,\n 41.018421\n ],\n [\n 119.013544,\n 41.007637\n ],\n [\n 119.0204,\n 40.997878\n ],\n [\n 119.005086,\n 40.984265\n ],\n [\n 119.000601,\n 40.967052\n ],\n [\n 118.946461,\n 40.958122\n ],\n [\n 118.917052,\n 40.968594\n ],\n [\n 118.903468,\n 40.961784\n ],\n [\n 118.891743,\n 40.903362\n ],\n [\n 118.873034,\n 40.848042\n ],\n [\n 118.855094,\n 40.840577\n ],\n [\n 118.846252,\n 40.822103\n ],\n [\n 118.849135,\n 40.800919\n ],\n [\n 118.861501,\n 40.802658\n ],\n [\n 118.878544,\n 40.783207\n ],\n [\n 118.910965,\n 40.776766\n ],\n [\n 118.895459,\n 40.754021\n ],\n [\n 118.91167,\n 40.756083\n ],\n [\n 118.949344,\n 40.747834\n ],\n [\n 118.960813,\n 40.720566\n ],\n [\n 118.987723,\n 40.697931\n ],\n [\n 119.010725,\n 40.687868\n ],\n [\n 119.027063,\n 40.692448\n ],\n [\n 119.048719,\n 40.681482\n ],\n [\n 119.05423,\n 40.664964\n ],\n [\n 119.081588,\n 40.671869\n ],\n [\n 119.095107,\n 40.663351\n ],\n [\n 119.115098,\n 40.666513\n ],\n [\n 119.153349,\n 40.688707\n ],\n [\n 119.176222,\n 40.690191\n ],\n [\n 119.185833,\n 40.67574\n ],\n [\n 119.173211,\n 40.654316\n ],\n [\n 119.146557,\n 40.63579\n ],\n [\n 119.158474,\n 40.614418\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 130900,\n \"name\": \"沧州市\",\n \"center\": [\n 116.857461,\n 38.310582\n ],\n \"centroid\": [\n 116.771346,\n 38.27096\n ],\n \"childrenNum\": 16,\n \"level\": \"city\",\n \"parent\": {\n \"adcode\": 130000\n },\n \"subFeatureIndex\": 8,\n \"acroutes\": [\n 100000,\n 130000\n ]\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 116.335916,\n 37.581263\n ],\n [\n 116.3281,\n 37.605058\n ],\n [\n 116.375192,\n 37.617256\n ],\n [\n 116.374936,\n 37.63949\n ],\n [\n 116.36539,\n 37.648719\n ],\n [\n 116.378909,\n 37.659698\n ],\n [\n 116.386533,\n 37.696393\n ],\n [\n 116.424784,\n 37.735829\n ],\n [\n 116.434331,\n 37.734618\n ],\n [\n 116.438367,\n 37.758902\n ],\n [\n 116.451182,\n 37.7587\n ],\n [\n 116.460664,\n 37.778875\n ],\n [\n 116.47303,\n 37.777059\n ],\n [\n 116.466623,\n 37.805564\n ],\n [\n 116.481424,\n 37.830026\n ],\n [\n 116.473415,\n 37.865495\n ],\n [\n 116.51346,\n 37.863951\n ],\n [\n 116.515382,\n 37.892892\n ],\n [\n 116.53377,\n 37.907727\n ],\n [\n 116.565166,\n 37.980116\n ],\n [\n 116.563243,\n 38.01987\n ],\n [\n 116.496352,\n 38.013704\n ],\n [\n 116.483474,\n 38.02503\n ],\n [\n 116.479309,\n 38.011492\n ],\n [\n 116.417224,\n 38.009481\n ],\n [\n 116.3709,\n 38.018597\n ],\n [\n 116.343925,\n 38.017256\n ],\n [\n 116.329189,\n 38.008141\n ],\n [\n 116.306764,\n 37.979312\n ],\n [\n 116.278252,\n 37.962479\n ],\n [\n 116.266975,\n 37.981458\n ],\n [\n 116.266206,\n 37.961405\n ],\n [\n 116.256595,\n 37.965229\n ],\n [\n 116.226354,\n 37.95121\n ],\n [\n 116.209118,\n 37.966369\n ],\n [\n 116.188039,\n 37.968314\n ],\n [\n 116.170163,\n 37.959594\n ],\n [\n 116.170867,\n 37.933565\n ],\n [\n 116.153952,\n 37.914573\n ],\n [\n 116.091034,\n 37.910949\n ],\n [\n 116.093981,\n 37.922627\n ],\n [\n 116.120571,\n 37.948996\n ],\n [\n 116.100645,\n 37.948929\n ],\n [\n 116.071876,\n 37.980318\n ],\n [\n 116.062394,\n 38.005057\n ],\n [\n 116.044774,\n 38.023824\n ],\n [\n 116.049515,\n 38.038365\n ],\n [\n 116.070595,\n 38.041112\n ],\n [\n 116.05227,\n 38.052434\n ],\n [\n 116.055474,\n 38.071725\n ],\n [\n 116.031511,\n 38.082774\n ],\n [\n 116.031831,\n 38.100718\n ],\n [\n 116.048554,\n 38.11424\n ],\n [\n 116.055218,\n 38.131306\n ],\n [\n 116.049771,\n 38.146026\n ],\n [\n 115.986725,\n 38.125885\n ],\n [\n 115.968913,\n 38.138533\n ],\n [\n 115.938671,\n 38.144354\n ],\n [\n 115.935403,\n 38.167232\n ],\n [\n 115.900804,\n 38.158536\n ],\n [\n 115.887542,\n 38.171312\n ],\n [\n 115.899523,\n 38.20314\n ],\n [\n 115.871267,\n 38.217579\n ],\n [\n 115.856467,\n 38.240901\n ],\n [\n 115.864476,\n 38.255266\n ],\n [\n 115.837181,\n 38.272499\n ],\n [\n 115.833016,\n 38.298008\n ],\n [\n 115.850188,\n 38.309423\n ],\n [\n 115.841538,\n 38.346062\n ],\n [\n 115.804633,\n 38.345462\n ],\n [\n 115.783297,\n 38.358338\n ],\n [\n 115.738767,\n 38.369544\n ],\n [\n 115.734025,\n 38.359205\n ],\n [\n 115.705321,\n 38.367543\n ],\n [\n 115.731462,\n 38.392618\n ],\n [\n 115.715957,\n 38.438411\n ],\n [\n 115.718584,\n 38.449205\n ],\n [\n 115.745686,\n 38.481311\n ],\n [\n 115.770418,\n 38.48817\n ],\n [\n 115.79137,\n 38.512005\n ],\n [\n 115.816101,\n 38.52545\n ],\n [\n 115.875047,\n 38.510141\n ],\n [\n 115.869345,\n 38.524652\n ],\n [\n 115.878507,\n 38.535566\n ],\n [\n 115.890809,\n 38.52585\n ],\n [\n 115.940721,\n 38.530508\n ],\n [\n 115.934058,\n 38.546678\n ],\n [\n 115.960583,\n 38.584394\n ],\n [\n 115.96321,\n 38.613182\n ],\n [\n 115.951101,\n 38.627938\n ],\n [\n 115.973398,\n 38.635514\n ],\n [\n 115.973526,\n 38.668467\n ],\n [\n 115.959879,\n 38.679891\n ],\n [\n 115.955009,\n 38.702932\n ],\n [\n 115.966286,\n 38.708973\n ],\n [\n 115.944053,\n 38.735456\n ],\n [\n 115.95187,\n 38.746736\n ],\n [\n 115.995118,\n 38.77798\n ],\n [\n 115.999731,\n 38.796812\n ],\n [\n 116.023054,\n 38.812524\n ],\n [\n 116.04093,\n 38.812259\n ],\n [\n 116.035548,\n 38.829492\n ],\n [\n 116.048746,\n 38.8607\n ],\n [\n 116.04157,\n 38.878451\n ],\n [\n 116.045543,\n 38.897786\n ],\n [\n 116.085524,\n 38.91063\n ],\n [\n 116.112754,\n 38.909703\n ],\n [\n 116.125633,\n 38.920823\n ],\n [\n 116.121083,\n 38.934391\n ],\n [\n 116.15203,\n 38.948352\n ],\n [\n 116.209503,\n 38.921618\n ],\n [\n 116.20002,\n 38.915727\n ],\n [\n 116.202198,\n 38.887258\n ],\n [\n 116.212194,\n 38.870238\n ],\n [\n 116.23212,\n 38.871894\n ],\n [\n 116.248907,\n 38.85964\n ],\n [\n 116.247497,\n 38.848907\n ],\n [\n 116.278764,\n 38.836451\n ],\n [\n 116.271973,\n 38.816634\n ],\n [\n 116.338287,\n 38.80689\n ],\n [\n 116.390313,\n 38.789784\n ],\n [\n 116.42299,\n 38.770419\n ],\n [\n 116.435804,\n 38.733199\n ],\n [\n 116.406331,\n 38.703596\n ],\n [\n 116.370836,\n 38.692508\n ],\n [\n 116.366863,\n 38.67305\n ],\n [\n 116.381984,\n 38.619165\n ],\n [\n 116.41921,\n 38.599288\n ],\n [\n 116.425425,\n 38.587187\n ],\n [\n 116.454834,\n 38.580337\n ],\n [\n 116.455475,\n 38.557656\n ],\n [\n 116.432152,\n 38.552533\n ],\n [\n 116.431127,\n 38.539558\n ],\n [\n 116.452655,\n 38.534501\n ],\n [\n 116.449772,\n 38.518262\n ],\n [\n 116.465726,\n 38.494096\n ],\n [\n 116.519482,\n 38.48817\n ],\n [\n 116.559399,\n 38.496759\n ],\n [\n 116.569715,\n 38.470988\n ],\n [\n 116.589897,\n 38.483908\n ],\n [\n 116.610593,\n 38.479646\n ],\n [\n 116.627315,\n 38.501087\n ],\n [\n 116.621228,\n 38.514335\n ],\n [\n 116.647114,\n 38.50648\n ],\n [\n 116.668257,\n 38.530042\n ],\n [\n 116.672678,\n 38.546545\n ],\n [\n 116.652431,\n 38.551202\n ],\n [\n 116.643333,\n 38.564773\n ],\n [\n 116.671653,\n 38.566503\n ],\n [\n 116.662234,\n 38.581268\n ],\n [\n 116.680303,\n 38.592706\n ],\n [\n 116.680559,\n 38.605936\n ],\n [\n 116.702792,\n 38.619098\n ],\n [\n 116.71503,\n 38.609327\n ],\n [\n 116.733739,\n 38.614047\n ],\n [\n 116.738224,\n 38.631327\n ],\n [\n 116.763212,\n 38.633853\n ],\n [\n 116.77404,\n 38.652258\n ],\n [\n 116.758855,\n 38.732071\n ],\n [\n 116.766351,\n 38.741959\n ],\n [\n 116.796529,\n 38.74667\n ],\n [\n 116.859127,\n 38.741295\n ],\n [\n 116.867457,\n 38.745873\n ],\n [\n 116.866496,\n 38.717005\n ],\n [\n 116.87726,\n 38.680688\n ],\n [\n 116.994447,\n 38.695695\n ],\n [\n 117.014502,\n 38.690184\n ],\n [\n 117.015719,\n 38.700409\n ],\n [\n 117.042309,\n 38.706517\n ],\n [\n 117.039041,\n 38.688457\n ],\n [\n 117.06813,\n 38.680621\n ],\n [\n 117.051727,\n 38.643488\n ],\n [\n 117.064285,\n 38.635713\n ],\n [\n 117.071526,\n 38.607399\n ],\n [\n 117.086326,\n 38.606402\n ],\n [\n 117.098179,\n 38.586921\n ],\n [\n 117.13611,\n 38.598756\n ],\n [\n 117.151103,\n 38.617702\n ],\n [\n 117.186086,\n 38.616506\n ],\n [\n 117.23036,\n 38.641694\n ],\n [\n 117.23068,\n 38.624017\n ],\n [\n 117.255988,\n 38.613781\n ],\n [\n 117.259512,\n 38.603078\n ],\n [\n 117.238369,\n 38.581002\n ],\n [\n 117.253169,\n 38.556192\n ],\n [\n 117.292189,\n 38.562445\n ],\n [\n 117.305644,\n 38.556591\n ],\n [\n 117.358055,\n 38.57056\n ],\n [\n 117.368883,\n 38.582465\n ],\n [\n 117.369075,\n 38.564773\n ],\n [\n 117.391949,\n 38.572689\n ],\n [\n 117.432442,\n 38.601349\n ],\n [\n 117.478895,\n 38.617237\n ],\n [\n 117.541429,\n 38.60361\n ],\n [\n 117.557831,\n 38.613781\n ],\n [\n 117.63901,\n 38.626742\n ],\n [\n 117.645033,\n 38.593836\n ],\n [\n 117.638562,\n 38.570028\n ],\n [\n 117.643367,\n 38.54029\n ],\n [\n 117.68527,\n 38.539425\n ],\n [\n 117.685975,\n 38.532438\n ],\n [\n 117.645161,\n 38.527647\n ],\n [\n 117.647852,\n 38.508677\n ],\n [\n 117.678799,\n 38.477049\n ],\n [\n 117.710899,\n 38.467791\n ],\n [\n 117.725123,\n 38.457333\n ],\n [\n 117.730505,\n 38.424949\n ],\n [\n 117.781186,\n 38.373812\n ],\n [\n 117.804764,\n 38.367076\n ],\n [\n 117.846411,\n 38.36801\n ],\n [\n 117.937457,\n 38.38775\n ],\n [\n 117.958024,\n 38.376147\n ],\n [\n 117.948349,\n 38.346462\n ],\n [\n 117.916698,\n 38.32344\n ],\n [\n 117.895682,\n 38.301613\n ],\n [\n 117.860891,\n 38.274569\n ],\n [\n 117.8475,\n 38.25393\n ],\n [\n 117.808544,\n 38.228406\n ],\n [\n 117.789195,\n 38.180741\n ],\n [\n 117.801625,\n 38.173786\n ],\n [\n 117.766962,\n 38.15867\n ],\n [\n 117.76882,\n 38.131908\n ],\n [\n 117.743191,\n 38.123409\n ],\n [\n 117.729223,\n 38.093822\n ],\n [\n 117.704492,\n 38.076078\n ],\n [\n 117.679504,\n 38.07956\n ],\n [\n 117.666048,\n 38.072528\n ],\n [\n 117.616713,\n 38.069046\n ],\n [\n 117.58378,\n 38.070653\n ],\n [\n 117.556486,\n 38.05719\n ],\n [\n 117.56033,\n 38.040978\n ],\n [\n 117.527974,\n 37.996275\n ],\n [\n 117.512789,\n 37.943428\n ],\n [\n 117.481137,\n 37.914842\n ],\n [\n 117.438593,\n 37.853876\n ],\n [\n 117.406301,\n 37.843531\n ],\n [\n 117.381954,\n 37.854547\n ],\n [\n 117.34428,\n 37.862675\n ],\n [\n 117.320124,\n 37.861399\n ],\n [\n 117.271366,\n 37.839903\n ],\n [\n 117.208832,\n 37.843732\n ],\n [\n 117.185317,\n 37.849778\n ],\n [\n 117.150142,\n 37.839567\n ],\n [\n 117.093759,\n 37.849509\n ],\n [\n 117.074345,\n 37.848771\n ],\n [\n 117.027188,\n 37.832378\n ],\n [\n 116.976635,\n 37.841045\n ],\n [\n 116.947675,\n 37.840037\n ],\n [\n 116.919355,\n 37.845882\n ],\n [\n 116.883795,\n 37.844337\n ],\n [\n 116.84375,\n 37.834461\n ],\n [\n 116.812739,\n 37.843598\n ],\n [\n 116.788136,\n 37.843396\n ],\n [\n 116.786149,\n 37.82633\n ],\n [\n 116.753665,\n 37.792993\n ],\n [\n 116.753793,\n 37.770536\n ],\n [\n 116.744182,\n 37.757355\n ],\n [\n 116.723167,\n 37.766703\n ],\n [\n 116.724512,\n 37.744305\n ],\n [\n 116.699332,\n 37.730648\n ],\n [\n 116.67979,\n 37.728764\n ],\n [\n 116.663964,\n 37.687776\n ],\n [\n 116.641027,\n 37.682323\n ],\n [\n 116.640834,\n 37.666432\n ],\n [\n 116.604506,\n 37.62514\n ],\n [\n 116.574648,\n 37.609978\n ],\n [\n 116.545816,\n 37.582477\n ],\n [\n 116.538512,\n 37.568453\n ],\n [\n 116.517048,\n 37.557191\n ],\n [\n 116.486421,\n 37.524205\n ],\n [\n 116.456115,\n 37.513679\n ],\n [\n 116.434139,\n 37.473383\n ],\n [\n 116.402167,\n 37.509833\n ],\n [\n 116.368913,\n 37.526364\n ],\n [\n 116.376858,\n 37.546602\n ],\n [\n 116.367696,\n 37.566295\n ],\n [\n 116.343541,\n 37.566025\n ],\n [\n 116.335916,\n 37.581263\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 131000,\n \"name\": \"廊坊市\",\n \"center\": [\n 116.704441,\n 39.523927\n ],\n \"centroid\": [\n 116.540228,\n 39.111214\n ],\n \"childrenNum\": 10,\n \"level\": \"city\",\n \"parent\": {\n \"adcode\": 130000\n },\n \"subFeatureIndex\": 9,\n \"acroutes\": [\n 100000,\n 130000\n ]\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 116.209503,\n 38.921618\n ],\n [\n 116.230262,\n 38.92453\n ],\n [\n 116.228083,\n 38.942199\n ],\n [\n 116.243653,\n 38.949345\n ],\n [\n 116.253007,\n 38.932074\n ],\n [\n 116.291386,\n 38.948683\n ],\n [\n 116.298755,\n 38.975076\n ],\n [\n 116.316182,\n 38.962708\n ],\n [\n 116.33534,\n 38.984004\n ],\n [\n 116.3215,\n 38.998088\n ],\n [\n 116.299588,\n 38.993658\n ],\n [\n 116.293757,\n 39.007344\n ],\n [\n 116.307148,\n 39.032196\n ],\n [\n 116.318617,\n 39.037416\n ],\n [\n 116.317592,\n 39.077911\n ],\n [\n 116.305354,\n 39.098116\n ],\n [\n 116.278957,\n 39.112045\n ],\n [\n 116.262426,\n 39.138114\n ],\n [\n 116.221804,\n 39.147813\n ],\n [\n 116.207837,\n 39.168526\n ],\n [\n 116.206555,\n 39.207429\n ],\n [\n 116.186116,\n 39.222457\n ],\n [\n 116.201109,\n 39.251911\n ],\n [\n 116.208734,\n 39.330195\n ],\n [\n 116.198226,\n 39.351315\n ],\n [\n 116.13582,\n 39.351842\n ],\n [\n 116.116791,\n 39.376243\n ],\n [\n 116.133001,\n 39.4055\n ],\n [\n 116.132104,\n 39.429423\n ],\n [\n 116.151325,\n 39.471005\n ],\n [\n 116.179901,\n 39.486568\n ],\n [\n 116.182144,\n 39.49635\n ],\n [\n 116.220843,\n 39.511644\n ],\n [\n 116.222766,\n 39.501995\n ],\n [\n 116.244678,\n 39.517354\n ],\n [\n 116.257941,\n 39.500551\n ],\n [\n 116.279277,\n 39.491295\n ],\n [\n 116.306443,\n 39.488997\n ],\n [\n 116.320027,\n 39.46851\n ],\n [\n 116.350461,\n 39.453009\n ],\n [\n 116.408958,\n 39.45025\n ],\n [\n 116.434395,\n 39.442761\n ],\n [\n 116.454706,\n 39.453338\n ],\n [\n 116.444134,\n 39.482169\n ],\n [\n 116.412354,\n 39.482103\n ],\n [\n 116.418761,\n 39.506393\n ],\n [\n 116.402807,\n 39.5144\n ],\n [\n 116.402679,\n 39.526869\n ],\n [\n 116.424079,\n 39.522735\n ],\n [\n 116.424656,\n 39.509741\n ],\n [\n 116.443813,\n 39.509872\n ],\n [\n 116.440994,\n 39.527328\n ],\n [\n 116.464573,\n 39.527657\n ],\n [\n 116.478861,\n 39.539204\n ],\n [\n 116.470916,\n 39.55462\n ],\n [\n 116.508462,\n 39.551078\n ],\n [\n 116.519354,\n 39.566491\n ],\n [\n 116.524416,\n 39.596521\n ],\n [\n 116.541779,\n 39.593505\n ],\n [\n 116.566575,\n 39.604387\n ],\n [\n 116.565934,\n 39.619788\n ],\n [\n 116.607773,\n 39.619723\n ],\n [\n 116.620524,\n 39.601699\n ],\n [\n 116.646537,\n 39.599143\n ],\n [\n 116.662363,\n 39.605239\n ],\n [\n 116.705099,\n 39.587999\n ],\n [\n 116.727075,\n 39.593047\n ],\n [\n 116.7026,\n 39.610417\n ],\n [\n 116.700742,\n 39.621033\n ],\n [\n 116.748667,\n 39.619919\n ],\n [\n 116.790699,\n 39.596062\n ],\n [\n 116.789994,\n 39.610548\n ],\n [\n 116.812355,\n 39.615922\n ],\n [\n 116.797875,\n 39.594358\n ],\n [\n 116.81165,\n 39.576983\n ],\n [\n 116.787687,\n 39.554555\n ],\n [\n 116.806204,\n 39.528838\n ],\n [\n 116.819595,\n 39.52851\n ],\n [\n 116.826194,\n 39.513088\n ],\n [\n 116.813957,\n 39.510266\n ],\n [\n 116.820748,\n 39.482431\n ],\n [\n 116.785124,\n 39.465883\n ],\n [\n 116.807421,\n 39.445586\n ],\n [\n 116.815751,\n 39.451761\n ],\n [\n 116.832473,\n 39.435468\n ],\n [\n 116.855475,\n 39.443352\n ],\n [\n 116.875914,\n 39.434548\n ],\n [\n 116.834139,\n 39.402674\n ],\n [\n 116.837599,\n 39.374073\n ],\n [\n 116.818121,\n 39.373547\n ],\n [\n 116.829206,\n 39.338881\n ],\n [\n 116.849196,\n 39.339473\n ],\n [\n 116.870724,\n 39.357499\n ],\n [\n 116.875786,\n 39.33921\n ],\n [\n 116.889626,\n 39.338157\n ],\n [\n 116.884243,\n 39.305383\n ],\n [\n 116.867969,\n 39.302552\n ],\n [\n 116.878733,\n 39.255336\n ],\n [\n 116.892637,\n 39.223973\n ],\n [\n 116.874569,\n 39.230036\n ],\n [\n 116.875594,\n 39.21646\n ],\n [\n 116.855796,\n 39.215669\n ],\n [\n 116.863164,\n 39.201365\n ],\n [\n 116.870084,\n 39.153685\n ],\n [\n 116.909232,\n 39.150782\n ],\n [\n 116.924096,\n 39.119372\n ],\n [\n 116.91109,\n 39.111055\n ],\n [\n 116.881488,\n 39.071702\n ],\n [\n 116.869891,\n 39.069919\n ],\n [\n 116.860473,\n 39.050564\n ],\n [\n 116.80268,\n 39.050895\n ],\n [\n 116.787303,\n 39.061927\n ],\n [\n 116.773015,\n 39.046865\n ],\n [\n 116.756612,\n 39.0503\n ],\n [\n 116.754626,\n 39.003245\n ],\n [\n 116.728613,\n 38.975341\n ],\n [\n 116.716247,\n 38.938957\n ],\n [\n 116.70811,\n 38.931876\n ],\n [\n 116.708046,\n 38.897058\n ],\n [\n 116.722334,\n 38.897058\n ],\n [\n 116.723103,\n 38.852551\n ],\n [\n 116.74604,\n 38.851491\n ],\n [\n 116.75123,\n 38.831282\n ],\n [\n 116.73848,\n 38.807022\n ],\n [\n 116.737327,\n 38.784479\n ],\n [\n 116.751294,\n 38.780168\n ],\n [\n 116.746297,\n 38.754233\n ],\n [\n 116.766351,\n 38.741959\n ],\n [\n 116.758855,\n 38.732071\n ],\n [\n 116.77404,\n 38.652258\n ],\n [\n 116.763212,\n 38.633853\n ],\n [\n 116.738224,\n 38.631327\n ],\n [\n 116.733739,\n 38.614047\n ],\n [\n 116.71503,\n 38.609327\n ],\n [\n 116.702792,\n 38.619098\n ],\n [\n 116.680559,\n 38.605936\n ],\n [\n 116.680303,\n 38.592706\n ],\n [\n 116.662234,\n 38.581268\n ],\n [\n 116.671653,\n 38.566503\n ],\n [\n 116.643333,\n 38.564773\n ],\n [\n 116.652431,\n 38.551202\n ],\n [\n 116.672678,\n 38.546545\n ],\n [\n 116.668257,\n 38.530042\n ],\n [\n 116.647114,\n 38.50648\n ],\n [\n 116.621228,\n 38.514335\n ],\n [\n 116.627315,\n 38.501087\n ],\n [\n 116.610593,\n 38.479646\n ],\n [\n 116.589897,\n 38.483908\n ],\n [\n 116.569715,\n 38.470988\n ],\n [\n 116.559399,\n 38.496759\n ],\n [\n 116.519482,\n 38.48817\n ],\n [\n 116.465726,\n 38.494096\n ],\n [\n 116.449772,\n 38.518262\n ],\n [\n 116.452655,\n 38.534501\n ],\n [\n 116.431127,\n 38.539558\n ],\n [\n 116.432152,\n 38.552533\n ],\n [\n 116.455475,\n 38.557656\n ],\n [\n 116.454834,\n 38.580337\n ],\n [\n 116.425425,\n 38.587187\n ],\n [\n 116.41921,\n 38.599288\n ],\n [\n 116.381984,\n 38.619165\n ],\n [\n 116.366863,\n 38.67305\n ],\n [\n 116.370836,\n 38.692508\n ],\n [\n 116.406331,\n 38.703596\n ],\n [\n 116.435804,\n 38.733199\n ],\n [\n 116.42299,\n 38.770419\n ],\n [\n 116.390313,\n 38.789784\n ],\n [\n 116.338287,\n 38.80689\n ],\n [\n 116.271973,\n 38.816634\n ],\n [\n 116.278764,\n 38.836451\n ],\n [\n 116.247497,\n 38.848907\n ],\n [\n 116.248907,\n 38.85964\n ],\n [\n 116.23212,\n 38.871894\n ],\n [\n 116.212194,\n 38.870238\n ],\n [\n 116.202198,\n 38.887258\n ],\n [\n 116.20002,\n 38.915727\n ],\n [\n 116.209503,\n 38.921618\n ]\n ]\n ],\n [\n [\n [\n 117.209793,\n 40.082253\n ],\n [\n 117.222863,\n 40.065523\n ],\n [\n 117.1841,\n 40.062593\n ],\n [\n 117.187752,\n 40.026187\n ],\n [\n 117.198132,\n 39.99276\n ],\n [\n 117.178654,\n 39.977311\n ],\n [\n 117.175963,\n 39.959121\n ],\n [\n 117.151039,\n 39.944839\n ],\n [\n 117.156869,\n 39.938055\n ],\n [\n 117.137456,\n 39.921616\n ],\n [\n 117.158856,\n 39.909218\n ],\n [\n 117.149117,\n 39.896297\n ],\n [\n 117.166865,\n 39.868944\n ],\n [\n 117.227797,\n 39.852749\n ],\n [\n 117.247467,\n 39.861043\n ],\n [\n 117.259961,\n 39.843409\n ],\n [\n 117.252208,\n 39.834591\n ],\n [\n 117.192173,\n 39.833088\n ],\n [\n 117.195056,\n 39.82551\n ],\n [\n 117.156357,\n 39.817473\n ],\n [\n 117.15751,\n 39.796756\n ],\n [\n 117.178718,\n 39.795318\n ],\n [\n 117.18064,\n 39.78244\n ],\n [\n 117.205884,\n 39.763871\n ],\n [\n 117.161867,\n 39.747389\n ],\n [\n 117.153153,\n 39.722726\n ],\n [\n 117.169235,\n 39.717622\n ],\n [\n 117.170132,\n 39.673371\n ],\n [\n 117.159624,\n 39.666823\n ],\n [\n 117.177693,\n 39.645602\n ],\n [\n 117.157959,\n 39.636627\n ],\n [\n 117.152641,\n 39.623523\n ],\n [\n 117.127076,\n 39.61697\n ],\n [\n 117.057045,\n 39.644554\n ],\n [\n 117.015783,\n 39.654052\n ],\n [\n 117.004378,\n 39.644489\n ],\n [\n 116.974585,\n 39.636824\n ],\n [\n 116.963629,\n 39.643441\n ],\n [\n 116.944599,\n 39.695173\n ],\n [\n 116.950878,\n 39.706824\n ],\n [\n 116.91692,\n 39.706365\n ],\n [\n 116.912563,\n 39.689216\n ],\n [\n 116.893854,\n 39.695893\n ],\n [\n 116.88277,\n 39.718472\n ],\n [\n 116.916664,\n 39.731362\n ],\n [\n 116.901799,\n 39.763609\n ],\n [\n 116.920893,\n 39.769167\n ],\n [\n 116.924288,\n 39.781263\n ],\n [\n 116.949725,\n 39.778583\n ],\n [\n 116.952608,\n 39.789827\n ],\n [\n 116.928453,\n 39.813095\n ],\n [\n 116.92589,\n 39.835374\n ],\n [\n 116.902824,\n 39.848242\n ],\n [\n 116.907566,\n 39.834133\n ],\n [\n 116.885653,\n 39.844585\n ],\n [\n 116.866047,\n 39.843866\n ],\n [\n 116.827284,\n 39.87704\n ],\n [\n 116.804154,\n 39.877954\n ],\n [\n 116.784676,\n 39.891401\n ],\n [\n 116.780575,\n 39.94973\n ],\n [\n 116.757317,\n 39.961468\n ],\n [\n 116.775385,\n 39.99276\n ],\n [\n 116.770452,\n 40.011658\n ],\n [\n 116.781536,\n 40.034851\n ],\n [\n 116.819979,\n 40.028337\n ],\n [\n 116.822734,\n 40.046444\n ],\n [\n 116.857782,\n 40.051914\n ],\n [\n 116.867841,\n 40.041885\n ],\n [\n 116.928133,\n 40.05491\n ],\n [\n 116.960489,\n 40.051133\n ],\n [\n 116.972086,\n 40.037\n ],\n [\n 117.000662,\n 40.0299\n ],\n [\n 117.028533,\n 40.033939\n ],\n [\n 117.052048,\n 40.059402\n ],\n [\n 117.085173,\n 40.068583\n ],\n [\n 117.085621,\n 40.075158\n ],\n [\n 117.119515,\n 40.072424\n ],\n [\n 117.13925,\n 40.064025\n ],\n [\n 117.160073,\n 40.076199\n ],\n [\n 117.204347,\n 40.06982\n ],\n [\n 117.209793,\n 40.082253\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 131100,\n \"name\": \"衡水市\",\n \"center\": [\n 115.665993,\n 37.735097\n ],\n \"centroid\": [\n 115.828776,\n 37.764802\n ],\n \"childrenNum\": 11,\n \"level\": \"city\",\n \"parent\": {\n \"adcode\": 130000\n },\n \"subFeatureIndex\": 10,\n \"acroutes\": [\n 100000,\n 130000\n ]\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 115.705321,\n 38.367543\n ],\n [\n 115.734025,\n 38.359205\n ],\n [\n 115.738767,\n 38.369544\n ],\n [\n 115.783297,\n 38.358338\n ],\n [\n 115.804633,\n 38.345462\n ],\n [\n 115.841538,\n 38.346062\n ],\n [\n 115.850188,\n 38.309423\n ],\n [\n 115.833016,\n 38.298008\n ],\n [\n 115.837181,\n 38.272499\n ],\n [\n 115.864476,\n 38.255266\n ],\n [\n 115.856467,\n 38.240901\n ],\n [\n 115.871267,\n 38.217579\n ],\n [\n 115.899523,\n 38.20314\n ],\n [\n 115.887542,\n 38.171312\n ],\n [\n 115.900804,\n 38.158536\n ],\n [\n 115.935403,\n 38.167232\n ],\n [\n 115.938671,\n 38.144354\n ],\n [\n 115.968913,\n 38.138533\n ],\n [\n 115.986725,\n 38.125885\n ],\n [\n 116.049771,\n 38.146026\n ],\n [\n 116.055218,\n 38.131306\n ],\n [\n 116.048554,\n 38.11424\n ],\n [\n 116.031831,\n 38.100718\n ],\n [\n 116.031511,\n 38.082774\n ],\n [\n 116.055474,\n 38.071725\n ],\n [\n 116.05227,\n 38.052434\n ],\n [\n 116.070595,\n 38.041112\n ],\n [\n 116.049515,\n 38.038365\n ],\n [\n 116.044774,\n 38.023824\n ],\n [\n 116.062394,\n 38.005057\n ],\n [\n 116.071876,\n 37.980318\n ],\n [\n 116.100645,\n 37.948929\n ],\n [\n 116.120571,\n 37.948996\n ],\n [\n 116.093981,\n 37.922627\n ],\n [\n 116.091034,\n 37.910949\n ],\n [\n 116.153952,\n 37.914573\n ],\n [\n 116.170867,\n 37.933565\n ],\n [\n 116.170163,\n 37.959594\n ],\n [\n 116.188039,\n 37.968314\n ],\n [\n 116.209118,\n 37.966369\n ],\n [\n 116.226354,\n 37.95121\n ],\n [\n 116.256595,\n 37.965229\n ],\n [\n 116.266206,\n 37.961405\n ],\n [\n 116.266975,\n 37.981458\n ],\n [\n 116.278252,\n 37.962479\n ],\n [\n 116.306764,\n 37.979312\n ],\n [\n 116.329189,\n 38.008141\n ],\n [\n 116.343925,\n 38.017256\n ],\n [\n 116.3709,\n 38.018597\n ],\n [\n 116.417224,\n 38.009481\n ],\n [\n 116.479309,\n 38.011492\n ],\n [\n 116.483474,\n 38.02503\n ],\n [\n 116.496352,\n 38.013704\n ],\n [\n 116.563243,\n 38.01987\n ],\n [\n 116.565166,\n 37.980116\n ],\n [\n 116.53377,\n 37.907727\n ],\n [\n 116.515382,\n 37.892892\n ],\n [\n 116.51346,\n 37.863951\n ],\n [\n 116.473415,\n 37.865495\n ],\n [\n 116.481424,\n 37.830026\n ],\n [\n 116.466623,\n 37.805564\n ],\n [\n 116.47303,\n 37.777059\n ],\n [\n 116.460664,\n 37.778875\n ],\n [\n 116.451182,\n 37.7587\n ],\n [\n 116.438367,\n 37.758902\n ],\n [\n 116.434331,\n 37.734618\n ],\n [\n 116.424784,\n 37.735829\n ],\n [\n 116.386533,\n 37.696393\n ],\n [\n 116.378909,\n 37.659698\n ],\n [\n 116.36539,\n 37.648719\n ],\n [\n 116.374936,\n 37.63949\n ],\n [\n 116.375192,\n 37.617256\n ],\n [\n 116.3281,\n 37.605058\n ],\n [\n 116.335916,\n 37.581263\n ],\n [\n 116.287863,\n 37.5493\n ],\n [\n 116.291386,\n 37.5238\n ],\n [\n 116.278444,\n 37.524745\n ],\n [\n 116.290233,\n 37.484049\n ],\n [\n 116.271781,\n 37.478176\n ],\n [\n 116.276458,\n 37.466901\n ],\n [\n 116.241346,\n 37.491475\n ],\n [\n 116.224431,\n 37.479729\n ],\n [\n 116.229878,\n 37.459676\n ],\n [\n 116.243076,\n 37.448195\n ],\n [\n 116.227379,\n 37.424755\n ],\n [\n 116.263067,\n 37.42239\n ],\n [\n 116.285236,\n 37.40266\n ],\n [\n 116.236028,\n 37.361559\n ],\n [\n 116.195471,\n 37.365684\n ],\n [\n 116.168817,\n 37.38414\n ],\n [\n 116.106539,\n 37.368794\n ],\n [\n 116.08751,\n 37.373324\n ],\n [\n 116.056179,\n 37.369065\n ],\n [\n 116.05195,\n 37.357502\n ],\n [\n 116.024527,\n 37.359937\n ],\n [\n 116.00947,\n 37.343165\n ],\n [\n 115.975897,\n 37.334508\n ],\n [\n 115.98461,\n 37.316175\n ],\n [\n 115.968272,\n 37.287076\n ],\n [\n 115.976217,\n 37.276178\n ],\n [\n 115.964171,\n 37.250721\n ],\n [\n 115.969425,\n 37.239479\n ],\n [\n 115.953215,\n 37.223697\n ],\n [\n 115.940721,\n 37.227558\n ],\n [\n 115.912017,\n 37.207098\n ],\n [\n 115.904841,\n 37.189344\n ],\n [\n 115.911825,\n 37.176195\n ],\n [\n 115.879981,\n 37.151992\n ],\n [\n 115.885427,\n 37.128731\n ],\n [\n 115.864988,\n 37.070785\n ],\n [\n 115.853904,\n 37.059245\n ],\n [\n 115.827378,\n 37.106006\n ],\n [\n 115.786564,\n 37.123916\n ],\n [\n 115.76997,\n 37.14155\n ],\n [\n 115.756322,\n 37.209876\n ],\n [\n 115.698465,\n 37.257153\n ],\n [\n 115.675784,\n 37.258914\n ],\n [\n 115.67258,\n 37.275839\n ],\n [\n 115.63292,\n 37.277058\n ],\n [\n 115.623437,\n 37.297905\n ],\n [\n 115.599859,\n 37.301965\n ],\n [\n 115.590632,\n 37.312453\n ],\n [\n 115.599218,\n 37.332884\n ],\n [\n 115.577177,\n 37.316107\n ],\n [\n 115.52938,\n 37.326864\n ],\n [\n 115.520089,\n 37.353648\n ],\n [\n 115.506634,\n 37.368997\n ],\n [\n 115.468768,\n 37.382788\n ],\n [\n 115.428595,\n 37.387926\n ],\n [\n 115.391049,\n 37.42793\n ],\n [\n 115.345109,\n 37.448195\n ],\n [\n 115.360038,\n 37.461431\n ],\n [\n 115.404183,\n 37.462039\n ],\n [\n 115.431478,\n 37.469602\n ],\n [\n 115.410719,\n 37.476421\n ],\n [\n 115.417638,\n 37.487762\n ],\n [\n 115.397968,\n 37.497347\n ],\n [\n 115.402069,\n 37.51017\n ],\n [\n 115.426096,\n 37.506256\n ],\n [\n 115.421675,\n 37.495727\n ],\n [\n 115.455313,\n 37.501802\n ],\n [\n 115.430965,\n 37.506796\n ],\n [\n 115.410078,\n 37.523261\n ],\n [\n 115.405785,\n 37.535944\n ],\n [\n 115.372147,\n 37.544106\n ],\n [\n 115.359461,\n 37.558675\n ],\n [\n 115.360871,\n 37.523935\n ],\n [\n 115.307179,\n 37.563935\n ],\n [\n 115.282575,\n 37.576005\n ],\n [\n 115.237276,\n 37.575465\n ],\n [\n 115.201908,\n 37.555977\n ],\n [\n 115.188325,\n 37.563125\n ],\n [\n 115.200563,\n 37.572498\n ],\n [\n 115.172756,\n 37.600543\n ],\n [\n 115.191593,\n 37.608833\n ],\n [\n 115.202934,\n 37.637133\n ],\n [\n 115.227858,\n 37.648921\n ],\n [\n 115.255088,\n 37.645621\n ],\n [\n 115.258356,\n 37.639625\n ],\n [\n 115.297376,\n 37.629587\n ],\n [\n 115.301412,\n 37.660169\n ],\n [\n 115.316853,\n 37.660102\n ],\n [\n 115.325567,\n 37.682458\n ],\n [\n 115.317046,\n 37.695383\n ],\n [\n 115.333768,\n 37.71322\n ],\n [\n 115.380989,\n 37.707432\n ],\n [\n 115.394316,\n 37.712143\n ],\n [\n 115.386179,\n 37.727082\n ],\n [\n 115.360294,\n 37.731994\n ],\n [\n 115.344468,\n 37.74814\n ],\n [\n 115.371635,\n 37.770335\n ],\n [\n 115.352349,\n 37.784052\n ],\n [\n 115.349722,\n 37.805765\n ],\n [\n 115.360166,\n 37.820215\n ],\n [\n 115.363049,\n 37.849845\n ],\n [\n 115.388614,\n 37.853003\n ],\n [\n 115.389831,\n 37.874629\n ],\n [\n 115.360294,\n 37.880068\n ],\n [\n 115.365484,\n 37.906318\n ],\n [\n 115.385795,\n 37.917191\n ],\n [\n 115.408668,\n 37.918936\n ],\n [\n 115.412769,\n 37.943293\n ],\n [\n 115.448585,\n 37.936584\n ],\n [\n 115.457555,\n 37.95074\n ],\n [\n 115.456017,\n 37.974551\n ],\n [\n 115.444997,\n 37.989168\n ],\n [\n 115.464219,\n 37.99299\n ],\n [\n 115.438205,\n 38.001102\n ],\n [\n 115.45134,\n 38.017323\n ],\n [\n 115.466782,\n 38.063554\n ],\n [\n 115.482992,\n 38.08398\n ],\n [\n 115.468063,\n 38.095161\n ],\n [\n 115.439871,\n 38.082038\n ],\n [\n 115.420522,\n 38.089671\n ],\n [\n 115.383232,\n 38.0886\n ],\n [\n 115.364843,\n 38.13793\n ],\n [\n 115.346903,\n 38.13967\n ],\n [\n 115.342418,\n 38.196254\n ],\n [\n 115.35094,\n 38.210493\n ],\n [\n 115.323645,\n 38.220586\n ],\n [\n 115.324734,\n 38.248184\n ],\n [\n 115.34953,\n 38.248117\n ],\n [\n 115.356194,\n 38.271764\n ],\n [\n 115.369072,\n 38.283451\n ],\n [\n 115.393611,\n 38.285588\n ],\n [\n 115.383104,\n 38.299076\n ],\n [\n 115.381822,\n 38.327578\n ],\n [\n 115.402453,\n 38.320103\n ],\n [\n 115.420906,\n 38.337922\n ],\n [\n 115.462104,\n 38.327311\n ],\n [\n 115.478122,\n 38.341658\n ],\n [\n 115.495101,\n 38.342993\n ],\n [\n 115.494781,\n 38.362006\n ],\n [\n 115.516822,\n 38.357337\n ],\n [\n 115.516437,\n 38.318168\n ],\n [\n 115.547704,\n 38.318168\n ],\n [\n 115.550908,\n 38.332917\n ],\n [\n 115.575768,\n 38.326377\n ],\n [\n 115.57942,\n 38.342859\n ],\n [\n 115.590504,\n 38.332784\n ],\n [\n 115.644965,\n 38.32611\n ],\n [\n 115.650155,\n 38.340791\n ],\n [\n 115.699811,\n 38.349932\n ],\n [\n 115.705321,\n 38.367543\n ]\n ]\n ]\n ]\n }\n }\n ]\n}', 'admin', '2020-05-19 16:42:35', 'jeecg', '2020-05-19 16:42:35', '0', NULL); +INSERT INTO `jimu_report_map` VALUES ('1334703777051127809', '山东', 'shandong', '{\n \"type\": \"FeatureCollection\",\n \"features\": [\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 370100,\n \"name\": \"济南市\",\n \"center\": [\n 117.000923,\n 36.675807\n ],\n \"centroid\": [\n 117.221244,\n 36.639974\n ],\n \"childrenNum\": 12,\n \"level\": \"city\",\n \"parent\": {\n \"adcode\": 370000\n },\n \"subFeatureIndex\": 0,\n \"acroutes\": [\n 100000,\n 370000\n ]\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 117.273417,\n 37.532619\n ],\n [\n 117.275549,\n 37.526193\n ],\n [\n 117.284393,\n 37.522266\n ],\n [\n 117.286525,\n 37.510046\n ],\n [\n 117.307215,\n 37.507744\n ],\n [\n 117.317718,\n 37.499371\n ],\n [\n 117.312585,\n 37.487068\n ],\n [\n 117.285894,\n 37.479328\n ],\n [\n 117.283998,\n 37.471587\n ],\n [\n 117.304609,\n 37.466069\n ],\n [\n 117.307768,\n 37.46194\n ],\n [\n 117.295449,\n 37.4538\n ],\n [\n 117.309189,\n 37.447486\n ],\n [\n 117.353332,\n 37.450901\n ],\n [\n 117.369758,\n 37.436048\n ],\n [\n 117.368257,\n 37.419563\n ],\n [\n 117.360202,\n 37.405697\n ],\n [\n 117.368652,\n 37.396399\n ],\n [\n 117.401029,\n 37.379071\n ],\n [\n 117.415401,\n 37.364203\n ],\n [\n 117.41319,\n 37.342255\n ],\n [\n 117.409163,\n 37.329488\n ],\n [\n 117.411611,\n 37.308604\n ],\n [\n 117.417612,\n 37.296587\n ],\n [\n 117.430168,\n 37.285166\n ],\n [\n 117.432379,\n 37.272032\n ],\n [\n 117.43688,\n 37.27235\n ],\n [\n 117.438302,\n 37.25786\n ],\n [\n 117.443908,\n 37.250056\n ],\n [\n 117.431037,\n 37.254396\n ],\n [\n 117.424403,\n 37.243367\n ],\n [\n 117.429141,\n 37.239783\n ],\n [\n 117.408768,\n 37.239703\n ],\n [\n 117.402371,\n 37.224808\n ],\n [\n 117.404977,\n 37.21716\n ],\n [\n 117.417928,\n 37.20003\n ],\n [\n 117.436091,\n 37.184251\n ],\n [\n 117.442724,\n 37.170859\n ],\n [\n 117.444066,\n 37.156868\n ],\n [\n 117.4507,\n 37.153957\n ],\n [\n 117.4507,\n 37.143711\n ],\n [\n 117.455596,\n 37.11767\n ],\n [\n 117.459781,\n 37.109931\n ],\n [\n 117.442092,\n 37.093574\n ],\n [\n 117.409241,\n 37.089425\n ],\n [\n 117.391158,\n 37.083479\n ],\n [\n 117.365256,\n 37.069272\n ],\n [\n 117.336433,\n 37.073941\n ],\n [\n 117.339434,\n 37.056419\n ],\n [\n 117.33667,\n 37.046838\n ],\n [\n 117.326088,\n 37.036178\n ],\n [\n 117.315349,\n 37.030547\n ],\n [\n 117.317323,\n 37.020923\n ],\n [\n 117.328457,\n 37.011218\n ],\n [\n 117.35349,\n 37.003349\n ],\n [\n 117.365335,\n 36.99496\n ],\n [\n 117.378286,\n 36.956997\n ],\n [\n 117.391632,\n 36.952\n ],\n [\n 117.40403,\n 36.955038\n ],\n [\n 117.415322,\n 36.964311\n ],\n [\n 117.432853,\n 36.954878\n ],\n [\n 117.444461,\n 36.958116\n ],\n [\n 117.458754,\n 36.957676\n ],\n [\n 117.477628,\n 36.961154\n ],\n [\n 117.476522,\n 36.968348\n ],\n [\n 117.494527,\n 36.972344\n ],\n [\n 117.509847,\n 36.969267\n ],\n [\n 117.519875,\n 36.957117\n ],\n [\n 117.536854,\n 36.978498\n ],\n [\n 117.549094,\n 36.979817\n ],\n [\n 117.555253,\n 36.970785\n ],\n [\n 117.54933,\n 36.96507\n ],\n [\n 117.56544,\n 36.959954\n ],\n [\n 117.56465,\n 36.945084\n ],\n [\n 117.553674,\n 36.940727\n ],\n [\n 117.551305,\n 36.93385\n ],\n [\n 117.539538,\n 36.941486\n ],\n [\n 117.534248,\n 36.931611\n ],\n [\n 117.56923,\n 36.915736\n ],\n [\n 117.58376,\n 36.894176\n ],\n [\n 117.585024,\n 36.886815\n ],\n [\n 117.579891,\n 36.878093\n ],\n [\n 117.577364,\n 36.862847\n ],\n [\n 117.580523,\n 36.85136\n ],\n [\n 117.608556,\n 36.821815\n ],\n [\n 117.648119,\n 36.805436\n ],\n [\n 117.677811,\n 36.783245\n ],\n [\n 117.687603,\n 36.763853\n ],\n [\n 117.695974,\n 36.754115\n ],\n [\n 117.724165,\n 36.755998\n ],\n [\n 117.747303,\n 36.748584\n ],\n [\n 117.736642,\n 36.729423\n ],\n [\n 117.739959,\n 36.721004\n ],\n [\n 117.71848,\n 36.704724\n ],\n [\n 117.718006,\n 36.697826\n ],\n [\n 117.715637,\n 36.691208\n ],\n [\n 117.701265,\n 36.685191\n ],\n [\n 117.695184,\n 36.666978\n ],\n [\n 117.698027,\n 36.652974\n ],\n [\n 117.709003,\n 36.651569\n ],\n [\n 117.712241,\n 36.642258\n ],\n [\n 117.70853,\n 36.635154\n ],\n [\n 117.715321,\n 36.627527\n ],\n [\n 117.714926,\n 36.610545\n ],\n [\n 117.706555,\n 36.611549\n ],\n [\n 117.705055,\n 36.605807\n ],\n [\n 117.690525,\n 36.604883\n ],\n [\n 117.697869,\n 36.599422\n ],\n [\n 117.715163,\n 36.600546\n ],\n [\n 117.706792,\n 36.593559\n ],\n [\n 117.715321,\n 36.578537\n ],\n [\n 117.706792,\n 36.581469\n ],\n [\n 117.696132,\n 36.575042\n ],\n [\n 117.694315,\n 36.568896\n ],\n [\n 117.720849,\n 36.560057\n ],\n [\n 117.72377,\n 36.54732\n ],\n [\n 117.739406,\n 36.539925\n ],\n [\n 117.742486,\n 36.525737\n ],\n [\n 117.750777,\n 36.524652\n ],\n [\n 117.76586,\n 36.512994\n ],\n [\n 117.765544,\n 36.509496\n ],\n [\n 117.751646,\n 36.509979\n ],\n [\n 117.735853,\n 36.504993\n ],\n [\n 117.743118,\n 36.498439\n ],\n [\n 117.755673,\n 36.496228\n ],\n [\n 117.757332,\n 36.484485\n ],\n [\n 117.748566,\n 36.478694\n ],\n [\n 117.765544,\n 36.469845\n ],\n [\n 117.757016,\n 36.459144\n ],\n [\n 117.763491,\n 36.452868\n ],\n [\n 117.755752,\n 36.445303\n ],\n [\n 117.779838,\n 36.441239\n ],\n [\n 117.786471,\n 36.434277\n ],\n [\n 117.7965,\n 36.43963\n ],\n [\n 117.799343,\n 36.432265\n ],\n [\n 117.817268,\n 36.436129\n ],\n [\n 117.822717,\n 36.44305\n ],\n [\n 117.833062,\n 36.44301\n ],\n [\n 117.826823,\n 36.427114\n ],\n [\n 117.829508,\n 36.417776\n ],\n [\n 117.855094,\n 36.412945\n ],\n [\n 117.859279,\n 36.389433\n ],\n [\n 117.867492,\n 36.386373\n ],\n [\n 117.879732,\n 36.370626\n ],\n [\n 117.882101,\n 36.35673\n ],\n [\n 117.890314,\n 36.366035\n ],\n [\n 117.89521,\n 36.359227\n ],\n [\n 117.893472,\n 36.339446\n ],\n [\n 117.902633,\n 36.352057\n ],\n [\n 117.915346,\n 36.352903\n ],\n [\n 117.933904,\n 36.341219\n ],\n [\n 117.933509,\n 36.334369\n ],\n [\n 117.919611,\n 36.324738\n ],\n [\n 117.918347,\n 36.317725\n ],\n [\n 117.924823,\n 36.313171\n ],\n [\n 117.922533,\n 36.300514\n ],\n [\n 117.93114,\n 36.283742\n ],\n [\n 117.926797,\n 36.277532\n ],\n [\n 117.932719,\n 36.271846\n ],\n [\n 117.943696,\n 36.274064\n ],\n [\n 117.972993,\n 36.268378\n ],\n [\n 117.975362,\n 36.262328\n ],\n [\n 117.96707,\n 36.248251\n ],\n [\n 117.96328,\n 36.224971\n ],\n [\n 117.967781,\n 36.21464\n ],\n [\n 117.959332,\n 36.204308\n ],\n [\n 117.943933,\n 36.207981\n ],\n [\n 117.928534,\n 36.196558\n ],\n [\n 117.921664,\n 36.203662\n ],\n [\n 117.914636,\n 36.200837\n ],\n [\n 117.915899,\n 36.192562\n ],\n [\n 117.903027,\n 36.172092\n ],\n [\n 117.912109,\n 36.171648\n ],\n [\n 117.917873,\n 36.16337\n ],\n [\n 117.90666,\n 36.152708\n ],\n [\n 117.914162,\n 36.140631\n ],\n [\n 117.91203,\n 36.132753\n ],\n [\n 117.923875,\n 36.1174\n ],\n [\n 117.921111,\n 36.110005\n ],\n [\n 117.931535,\n 36.094203\n ],\n [\n 117.939984,\n 36.094324\n ],\n [\n 117.946618,\n 36.100387\n ],\n [\n 117.954041,\n 36.090201\n ],\n [\n 117.953172,\n 36.081833\n ],\n [\n 117.946223,\n 36.08151\n ],\n [\n 117.94188,\n 36.071807\n ],\n [\n 117.948829,\n 36.062589\n ],\n [\n 117.935799,\n 36.061214\n ],\n [\n 117.932798,\n 36.052196\n ],\n [\n 117.946855,\n 36.04253\n ],\n [\n 117.949855,\n 36.018259\n ],\n [\n 117.94338,\n 36.017288\n ],\n [\n 117.950803,\n 35.996489\n ],\n [\n 117.937536,\n 35.99653\n ],\n [\n 117.935088,\n 36.004421\n ],\n [\n 117.926165,\n 36.005068\n ],\n [\n 117.922848,\n 36.015467\n ],\n [\n 117.914557,\n 36.020039\n ],\n [\n 117.895052,\n 36.020363\n ],\n [\n 117.877047,\n 36.016357\n ],\n [\n 117.866386,\n 36.007415\n ],\n [\n 117.854462,\n 36.006889\n ],\n [\n 117.841827,\n 36.011947\n ],\n [\n 117.828719,\n 36.008022\n ],\n [\n 117.825244,\n 36.013363\n ],\n [\n 117.801159,\n 36.012959\n ],\n [\n 117.794763,\n 36.015143\n ],\n [\n 117.782286,\n 36.007294\n ],\n [\n 117.781022,\n 35.995437\n ],\n [\n 117.762307,\n 35.990621\n ],\n [\n 117.756621,\n 35.991916\n ],\n [\n 117.756542,\n 36.002236\n ],\n [\n 117.750304,\n 36.011947\n ],\n [\n 117.757016,\n 36.019392\n ],\n [\n 117.741696,\n 36.036058\n ],\n [\n 117.725824,\n 36.029667\n ],\n [\n 117.720454,\n 36.038243\n ],\n [\n 117.701186,\n 36.04528\n ],\n [\n 117.689972,\n 36.052358\n ],\n [\n 117.656569,\n 36.049729\n ],\n [\n 117.630588,\n 36.059879\n ],\n [\n 117.601844,\n 36.075648\n ],\n [\n 117.575943,\n 36.074516\n ],\n [\n 117.561649,\n 36.079327\n ],\n [\n 117.552884,\n 36.087978\n ],\n [\n 117.547672,\n 36.106166\n ],\n [\n 117.534879,\n 36.111419\n ],\n [\n 117.505898,\n 36.098245\n ],\n [\n 117.491052,\n 36.096587\n ],\n [\n 117.484893,\n 36.10075\n ],\n [\n 117.473758,\n 36.089797\n ],\n [\n 117.451963,\n 36.087412\n ],\n [\n 117.447067,\n 36.09206\n ],\n [\n 117.456148,\n 36.100467\n ],\n [\n 117.454885,\n 36.111177\n ],\n [\n 117.463571,\n 36.116875\n ],\n [\n 117.44683,\n 36.120834\n ],\n [\n 117.459623,\n 36.1498\n ],\n [\n 117.469178,\n 36.154687\n ],\n [\n 117.476601,\n 36.150123\n ],\n [\n 117.487972,\n 36.15921\n ],\n [\n 117.475653,\n 36.173102\n ],\n [\n 117.461202,\n 36.170194\n ],\n [\n 117.446988,\n 36.18691\n ],\n [\n 117.440434,\n 36.191189\n ],\n [\n 117.452437,\n 36.203138\n ],\n [\n 117.447778,\n 36.203541\n ],\n [\n 117.447383,\n 36.218313\n ],\n [\n 117.427878,\n 36.221662\n ],\n [\n 117.412716,\n 36.210927\n ],\n [\n 117.396607,\n 36.215972\n ],\n [\n 117.385235,\n 36.226989\n ],\n [\n 117.393132,\n 36.226747\n ],\n [\n 117.392895,\n 36.237439\n ],\n [\n 117.417217,\n 36.243652\n ],\n [\n 117.413901,\n 36.267934\n ],\n [\n 117.394553,\n 36.266522\n ],\n [\n 117.397791,\n 36.283782\n ],\n [\n 117.387604,\n 36.285556\n ],\n [\n 117.38792,\n 36.296361\n ],\n [\n 117.379707,\n 36.315146\n ],\n [\n 117.38871,\n 36.326148\n ],\n [\n 117.387762,\n 36.337915\n ],\n [\n 117.362729,\n 36.360234\n ],\n [\n 117.351753,\n 36.377997\n ],\n [\n 117.35041,\n 36.393379\n ],\n [\n 117.344962,\n 36.403968\n ],\n [\n 117.339434,\n 36.425786\n ],\n [\n 117.339118,\n 36.438181\n ],\n [\n 117.346936,\n 36.455724\n ],\n [\n 117.346383,\n 36.46373\n ],\n [\n 117.335328,\n 36.466345\n ],\n [\n 117.30682,\n 36.467029\n ],\n [\n 117.30682,\n 36.472097\n ],\n [\n 117.288184,\n 36.476039\n ],\n [\n 117.288973,\n 36.468718\n ],\n [\n 117.275786,\n 36.451218\n ],\n [\n 117.263862,\n 36.449206\n ],\n [\n 117.249726,\n 36.436732\n ],\n [\n 117.242145,\n 36.41528\n ],\n [\n 117.218297,\n 36.406182\n ],\n [\n 117.208742,\n 36.405297\n ],\n [\n 117.200924,\n 36.389755\n ],\n [\n 117.191685,\n 36.378762\n ],\n [\n 117.180945,\n 36.37256\n ],\n [\n 117.18292,\n 36.360798\n ],\n [\n 117.179603,\n 36.353144\n ],\n [\n 117.161361,\n 36.351895\n ],\n [\n 117.142567,\n 36.345731\n ],\n [\n 117.137039,\n 36.335135\n ],\n [\n 117.111691,\n 36.340413\n ],\n [\n 117.107347,\n 36.338882\n ],\n [\n 117.088711,\n 36.346013\n ],\n [\n 117.07734,\n 36.321957\n ],\n [\n 117.077655,\n 36.307205\n ],\n [\n 117.074102,\n 36.296724\n ],\n [\n 117.066995,\n 36.296885\n ],\n [\n 117.051201,\n 36.288741\n ],\n [\n 117.0482,\n 36.283701\n ],\n [\n 117.030275,\n 36.277532\n ],\n [\n 117.027353,\n 36.268983\n ],\n [\n 117.003347,\n 36.265353\n ],\n [\n 117.002794,\n 36.254503\n ],\n [\n 116.987632,\n 36.250711\n ],\n [\n 116.975471,\n 36.243208\n ],\n [\n 116.956835,\n 36.259787\n ],\n [\n 116.950201,\n 36.257327\n ],\n [\n 116.932828,\n 36.261925\n ],\n [\n 116.928722,\n 36.26991\n ],\n [\n 116.891133,\n 36.255471\n ],\n [\n 116.873129,\n 36.264062\n ],\n [\n 116.867759,\n 36.28108\n ],\n [\n 116.855519,\n 36.289709\n ],\n [\n 116.855756,\n 36.301642\n ],\n [\n 116.830644,\n 36.294587\n ],\n [\n 116.808612,\n 36.299022\n ],\n [\n 116.786659,\n 36.311357\n ],\n [\n 116.772761,\n 36.312002\n ],\n [\n 116.762574,\n 36.305391\n ],\n [\n 116.732961,\n 36.294144\n ],\n [\n 116.710376,\n 36.279185\n ],\n [\n 116.701058,\n 36.280153\n ],\n [\n 116.686528,\n 36.275435\n ],\n [\n 116.675709,\n 36.276645\n ],\n [\n 116.649018,\n 36.295797\n ],\n [\n 116.615536,\n 36.294587\n ],\n [\n 116.610403,\n 36.282451\n ],\n [\n 116.595794,\n 36.270999\n ],\n [\n 116.587502,\n 36.268862\n ],\n [\n 116.581264,\n 36.255471\n ],\n [\n 116.574393,\n 36.263457\n ],\n [\n 116.558837,\n 36.261037\n ],\n [\n 116.552361,\n 36.247767\n ],\n [\n 116.53641,\n 36.245588\n ],\n [\n 116.525591,\n 36.255229\n ],\n [\n 116.512325,\n 36.253414\n ],\n [\n 116.506402,\n 36.240344\n ],\n [\n 116.485239,\n 36.236067\n ],\n [\n 116.487529,\n 36.228441\n ],\n [\n 116.472604,\n 36.21464\n ],\n [\n 116.481922,\n 36.197002\n ],\n [\n 116.502059,\n 36.192764\n ],\n [\n 116.51035,\n 36.176857\n ],\n [\n 116.525986,\n 36.168297\n ],\n [\n 116.52188,\n 36.157151\n ],\n [\n 116.510192,\n 36.148346\n ],\n [\n 116.507192,\n 36.141277\n ],\n [\n 116.519748,\n 36.141196\n ],\n [\n 116.528513,\n 36.145276\n ],\n [\n 116.525275,\n 36.135298\n ],\n [\n 116.543122,\n 36.13958\n ],\n [\n 116.5586,\n 36.133804\n ],\n [\n 116.562153,\n 36.121643\n ],\n [\n 116.569024,\n 36.118774\n ],\n [\n 116.566891,\n 36.108752\n ],\n [\n 116.554651,\n 36.108187\n ],\n [\n 116.546597,\n 36.101195\n ],\n [\n 116.543359,\n 36.086604\n ],\n [\n 116.532303,\n 36.074274\n ],\n [\n 116.504112,\n 36.064732\n ],\n [\n 116.471182,\n 36.06457\n ],\n [\n 116.452072,\n 36.058019\n ],\n [\n 116.449387,\n 36.047302\n ],\n [\n 116.434541,\n 36.038607\n ],\n [\n 116.436121,\n 36.046534\n ],\n [\n 116.429566,\n 36.052439\n ],\n [\n 116.433357,\n 36.059839\n ],\n [\n 116.427829,\n 36.067441\n ],\n [\n 116.409508,\n 36.068007\n ],\n [\n 116.401059,\n 36.074031\n ],\n [\n 116.398058,\n 36.084582\n ],\n [\n 116.386845,\n 36.090807\n ],\n [\n 116.360233,\n 36.084744\n ],\n [\n 116.352731,\n 36.070797\n ],\n [\n 116.338753,\n 36.060082\n ],\n [\n 116.324855,\n 36.054178\n ],\n [\n 116.310404,\n 36.052196\n ],\n [\n 116.304718,\n 36.046251\n ],\n [\n 116.301244,\n 36.031123\n ],\n [\n 116.294689,\n 36.031407\n ],\n [\n 116.271552,\n 36.043824\n ],\n [\n 116.267998,\n 36.052964\n ],\n [\n 116.267287,\n 36.074233\n ],\n [\n 116.273368,\n 36.093758\n ],\n [\n 116.27171,\n 36.109843\n ],\n [\n 116.261444,\n 36.122693\n ],\n [\n 116.246677,\n 36.149436\n ],\n [\n 116.226066,\n 36.173748\n ],\n [\n 116.234911,\n 36.180935\n ],\n [\n 116.255047,\n 36.203703\n ],\n [\n 116.280159,\n 36.221945\n ],\n [\n 116.28624,\n 36.239174\n ],\n [\n 116.307166,\n 36.259464\n ],\n [\n 116.310799,\n 36.270515\n ],\n [\n 116.322644,\n 36.284669\n ],\n [\n 116.331251,\n 36.290677\n ],\n [\n 116.374526,\n 36.3039\n ],\n [\n 116.406745,\n 36.319015\n ],\n [\n 116.430593,\n 36.318007\n ],\n [\n 116.441411,\n 36.321755\n ],\n [\n 116.449071,\n 36.337149\n ],\n [\n 116.484607,\n 36.336948\n ],\n [\n 116.503717,\n 36.369982\n ],\n [\n 116.519984,\n 36.384158\n ],\n [\n 116.528592,\n 36.387259\n ],\n [\n 116.546202,\n 36.40892\n ],\n [\n 116.591213,\n 36.416286\n ],\n [\n 116.612377,\n 36.42333\n ],\n [\n 116.6198,\n 36.428522\n ],\n [\n 116.620905,\n 36.44144\n ],\n [\n 116.611429,\n 36.459104\n ],\n [\n 116.613009,\n 36.473425\n ],\n [\n 116.595636,\n 36.480383\n ],\n [\n 116.593267,\n 36.485973\n ],\n [\n 116.602032,\n 36.495223\n ],\n [\n 116.624301,\n 36.497233\n ],\n [\n 116.627223,\n 36.508853\n ],\n [\n 116.610087,\n 36.51609\n ],\n [\n 116.60835,\n 36.52011\n ],\n [\n 116.622801,\n 36.532651\n ],\n [\n 116.629592,\n 36.544587\n ],\n [\n 116.646728,\n 36.544105\n ],\n [\n 116.658968,\n 36.553026\n ],\n [\n 116.662916,\n 36.563111\n ],\n [\n 116.661258,\n 36.578376\n ],\n [\n 116.682421,\n 36.580586\n ],\n [\n 116.694345,\n 36.591149\n ],\n [\n 116.693319,\n 36.607895\n ],\n [\n 116.71314,\n 36.608858\n ],\n [\n 116.742042,\n 36.620381\n ],\n [\n 116.759494,\n 36.632746\n ],\n [\n 116.763126,\n 36.651971\n ],\n [\n 116.777262,\n 36.660718\n ],\n [\n 116.780736,\n 36.671552\n ],\n [\n 116.780657,\n 36.691048\n ],\n [\n 116.799689,\n 36.694417\n ],\n [\n 116.802768,\n 36.706729\n ],\n [\n 116.830881,\n 36.723851\n ],\n [\n 116.842489,\n 36.72786\n ],\n [\n 116.861757,\n 36.730345\n ],\n [\n 116.873997,\n 36.739846\n ],\n [\n 116.88679,\n 36.745538\n ],\n [\n 116.883868,\n 36.758243\n ],\n [\n 116.87076,\n 36.759164\n ],\n [\n 116.865548,\n 36.777877\n ],\n [\n 116.868233,\n 36.801872\n ],\n [\n 116.872813,\n 36.812004\n ],\n [\n 116.887975,\n 36.811404\n ],\n [\n 116.882447,\n 36.824058\n ],\n [\n 116.887106,\n 36.833427\n ],\n [\n 116.892476,\n 36.830023\n ],\n [\n 116.919404,\n 36.822776\n ],\n [\n 116.933223,\n 36.823697\n ],\n [\n 116.935908,\n 36.829743\n ],\n [\n 116.934724,\n 36.845116\n ],\n [\n 116.9442,\n 36.844916\n ],\n [\n 116.948069,\n 36.839231\n ],\n [\n 116.962836,\n 36.842674\n ],\n [\n 116.96181,\n 36.867529\n ],\n [\n 116.963152,\n 36.893896\n ],\n [\n 116.957466,\n 36.916495\n ],\n [\n 116.934408,\n 36.925973\n ],\n [\n 116.922563,\n 36.93453\n ],\n [\n 116.935434,\n 36.93457\n ],\n [\n 116.931881,\n 36.946204\n ],\n [\n 116.933381,\n 36.959595\n ],\n [\n 116.907717,\n 36.963272\n ],\n [\n 116.897767,\n 36.962712\n ],\n [\n 116.899188,\n 36.977499\n ],\n [\n 116.886158,\n 36.983573\n ],\n [\n 116.885764,\n 36.991444\n ],\n [\n 116.875024,\n 36.999274\n ],\n [\n 116.891607,\n 37.00271\n ],\n [\n 116.907796,\n 37.019046\n ],\n [\n 116.943173,\n 37.030907\n ],\n [\n 116.948701,\n 37.036537\n ],\n [\n 116.944279,\n 37.042327\n ],\n [\n 116.928643,\n 37.05103\n ],\n [\n 116.925247,\n 37.069831\n ],\n [\n 116.91972,\n 37.081364\n ],\n [\n 116.919009,\n 37.093056\n ],\n [\n 116.931486,\n 37.100477\n ],\n [\n 116.982578,\n 37.113601\n ],\n [\n 117.004531,\n 37.121219\n ],\n [\n 117.024273,\n 37.119664\n ],\n [\n 117.044884,\n 37.122615\n ],\n [\n 117.047411,\n 37.134739\n ],\n [\n 117.059809,\n 37.137251\n ],\n [\n 117.054676,\n 37.141717\n ],\n [\n 117.050648,\n 37.160894\n ],\n [\n 117.061783,\n 37.16496\n ],\n [\n 117.06352,\n 37.182656\n ],\n [\n 117.05744,\n 37.192141\n ],\n [\n 117.045358,\n 37.197161\n ],\n [\n 117.037382,\n 37.195169\n ],\n [\n 117.037777,\n 37.207361\n ],\n [\n 117.022299,\n 37.215089\n ],\n [\n 117.03596,\n 37.224091\n ],\n [\n 117.036592,\n 37.237393\n ],\n [\n 117.042673,\n 37.238867\n ],\n [\n 117.041251,\n 37.247667\n ],\n [\n 117.032328,\n 37.253241\n ],\n [\n 117.030275,\n 37.264229\n ],\n [\n 117.038961,\n 37.266538\n ],\n [\n 117.024273,\n 37.278918\n ],\n [\n 117.002241,\n 37.285962\n ],\n [\n 116.993397,\n 37.32201\n ],\n [\n 116.986684,\n 37.335335\n ],\n [\n 116.987158,\n 37.342692\n ],\n [\n 117.006663,\n 37.355138\n ],\n [\n 117.009664,\n 37.359671\n ],\n [\n 116.99924,\n 37.376964\n ],\n [\n 117.008164,\n 37.392464\n ],\n [\n 117.019693,\n 37.405419\n ],\n [\n 117.018193,\n 37.418967\n ],\n [\n 117.029406,\n 37.435174\n ],\n [\n 117.085631,\n 37.437517\n ],\n [\n 117.096845,\n 37.440099\n ],\n [\n 117.104978,\n 37.455309\n ],\n [\n 117.098819,\n 37.469721\n ],\n [\n 117.109795,\n 37.47901\n ],\n [\n 117.124878,\n 37.483853\n ],\n [\n 117.135618,\n 37.475239\n ],\n [\n 117.163809,\n 37.478971\n ],\n [\n 117.176049,\n 37.486116\n ],\n [\n 117.199345,\n 37.487148\n ],\n [\n 117.22114,\n 37.51318\n ],\n [\n 117.230063,\n 37.528891\n ],\n [\n 117.238197,\n 37.532897\n ],\n [\n 117.260861,\n 37.530081\n ],\n [\n 117.273417,\n 37.532619\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 370200,\n \"name\": \"青岛市\",\n \"center\": [\n 120.355173,\n 36.082982\n ],\n \"centroid\": [\n 120.150851,\n 36.451234\n ],\n \"childrenNum\": 10,\n \"level\": \"city\",\n \"parent\": {\n \"adcode\": 370000\n },\n \"subFeatureIndex\": 1,\n \"acroutes\": [\n 100000,\n 370000\n ]\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 120.850108,\n 36.612271\n ],\n [\n 120.86598,\n 36.605606\n ],\n [\n 120.884854,\n 36.60143\n ],\n [\n 120.891961,\n 36.58898\n ],\n [\n 120.893382,\n 36.57918\n ],\n [\n 120.91265,\n 36.568414\n ],\n [\n 120.923785,\n 36.572029\n ],\n [\n 120.936341,\n 36.56532\n ],\n [\n 120.962163,\n 36.562789\n ],\n [\n 120.969349,\n 36.559495\n ],\n [\n 120.983326,\n 36.545913\n ],\n [\n 120.983958,\n 36.540809\n ],\n [\n 120.962716,\n 36.519225\n ],\n [\n 120.954345,\n 36.507567\n ],\n [\n 120.95861,\n 36.498721\n ],\n [\n 120.954977,\n 36.489311\n ],\n [\n 120.967691,\n 36.47797\n ],\n [\n 120.963585,\n 36.464334\n ],\n [\n 120.952371,\n 36.459184\n ],\n [\n 120.947238,\n 36.449287\n ],\n [\n 120.938315,\n 36.44812\n ],\n [\n 120.934524,\n 36.454678\n ],\n [\n 120.920152,\n 36.455201\n ],\n [\n 120.907833,\n 36.445987\n ],\n [\n 120.917388,\n 36.435364\n ],\n [\n 120.91881,\n 36.425383\n ],\n [\n 120.925522,\n 36.419909\n ],\n [\n 120.935077,\n 36.421036\n ],\n [\n 120.927812,\n 36.410047\n ],\n [\n 120.918968,\n 36.419144\n ],\n [\n 120.903332,\n 36.406142\n ],\n [\n 120.891645,\n 36.389675\n ],\n [\n 120.895909,\n 36.376104\n ],\n [\n 120.872061,\n 36.367001\n ],\n [\n 120.87443,\n 36.373244\n ],\n [\n 120.854925,\n 36.381903\n ],\n [\n 120.851134,\n 36.406021\n ],\n [\n 120.859505,\n 36.412422\n ],\n [\n 120.858952,\n 36.424578\n ],\n [\n 120.838342,\n 36.436974\n ],\n [\n 120.842369,\n 36.441601\n ],\n [\n 120.843001,\n 36.457736\n ],\n [\n 120.83921,\n 36.464374\n ],\n [\n 120.828471,\n 36.466627\n ],\n [\n 120.759453,\n 36.462604\n ],\n [\n 120.756768,\n 36.458098\n ],\n [\n 120.761664,\n 36.443211\n ],\n [\n 120.760084,\n 36.434559\n ],\n [\n 120.751003,\n 36.431299\n ],\n [\n 120.736868,\n 36.432829\n ],\n [\n 120.726997,\n 36.422928\n ],\n [\n 120.72597,\n 36.413912\n ],\n [\n 120.71144,\n 36.408678\n ],\n [\n 120.694383,\n 36.390158\n ],\n [\n 120.700385,\n 36.37123\n ],\n [\n 120.709703,\n 36.368089\n ],\n [\n 120.716494,\n 36.360516\n ],\n [\n 120.72676,\n 36.359831\n ],\n [\n 120.729603,\n 36.349801\n ],\n [\n 120.739632,\n 36.3386\n ],\n [\n 120.744449,\n 36.328163\n ],\n [\n 120.73821,\n 36.32373\n ],\n [\n 120.707966,\n 36.328929\n ],\n [\n 120.692093,\n 36.325544\n ],\n [\n 120.663033,\n 36.33179\n ],\n [\n 120.656005,\n 36.322158\n ],\n [\n 120.66635,\n 36.309342\n ],\n [\n 120.665718,\n 36.29749\n ],\n [\n 120.656005,\n 36.28862\n ],\n [\n 120.65482,\n 36.27983\n ],\n [\n 120.659716,\n 36.27483\n ],\n [\n 120.677326,\n 36.281443\n ],\n [\n 120.686249,\n 36.279104\n ],\n [\n 120.685855,\n 36.260231\n ],\n [\n 120.689724,\n 36.251437\n ],\n [\n 120.681038,\n 36.238932\n ],\n [\n 120.689171,\n 36.230176\n ],\n [\n 120.696752,\n 36.204026\n ],\n [\n 120.693041,\n 36.190624\n ],\n [\n 120.697147,\n 36.168579\n ],\n [\n 120.707255,\n 36.165066\n ],\n [\n 120.707018,\n 36.159331\n ],\n [\n 120.698332,\n 36.158887\n ],\n [\n 120.704333,\n 36.152344\n ],\n [\n 120.705439,\n 36.139702\n ],\n [\n 120.716257,\n 36.142085\n ],\n [\n 120.719811,\n 36.13441\n ],\n [\n 120.71223,\n 36.126572\n ],\n [\n 120.695647,\n 36.123744\n ],\n [\n 120.672667,\n 36.129844\n ],\n [\n 120.650951,\n 36.117885\n ],\n [\n 120.632235,\n 36.113319\n ],\n [\n 120.621259,\n 36.119259\n ],\n [\n 120.612099,\n 36.117521\n ],\n [\n 120.607834,\n 36.107217\n ],\n [\n 120.599859,\n 36.101801\n ],\n [\n 120.579248,\n 36.103943\n ],\n [\n 120.580827,\n 36.111419\n ],\n [\n 120.573325,\n 36.114248\n ],\n [\n 120.567087,\n 36.105964\n ],\n [\n 120.547187,\n 36.10952\n ],\n [\n 120.552241,\n 36.097881\n ],\n [\n 120.547345,\n 36.092141\n ],\n [\n 120.526261,\n 36.093435\n ],\n [\n 120.497832,\n 36.08624\n ],\n [\n 120.479827,\n 36.091656\n ],\n [\n 120.467587,\n 36.087169\n ],\n [\n 120.449662,\n 36.07302\n ],\n [\n 120.441923,\n 36.063236\n ],\n [\n 120.437185,\n 36.0655\n ],\n [\n 120.42226,\n 36.054986\n ],\n [\n 120.415311,\n 36.057413\n ],\n [\n 120.404413,\n 36.051589\n ],\n [\n 120.38783,\n 36.051711\n ],\n [\n 120.389172,\n 36.059394\n ],\n [\n 120.37022,\n 36.053409\n ],\n [\n 120.371089,\n 36.044835\n ],\n [\n 120.365166,\n 36.041398\n ],\n [\n 120.35798,\n 36.04892\n ],\n [\n 120.345661,\n 36.043541\n ],\n [\n 120.337922,\n 36.044633\n ],\n [\n 120.342897,\n 36.05167\n ],\n [\n 120.337527,\n 36.054986\n ],\n [\n 120.324577,\n 36.051104\n ],\n [\n 120.324814,\n 36.059515\n ],\n [\n 120.315969,\n 36.059677\n ],\n [\n 120.307993,\n 36.050214\n ],\n [\n 120.296069,\n 36.052439\n ],\n [\n 120.297649,\n 36.045361\n ],\n [\n 120.286119,\n 36.047181\n ],\n [\n 120.290147,\n 36.060526\n ],\n [\n 120.30136,\n 36.071282\n ],\n [\n 120.311231,\n 36.087614\n ],\n [\n 120.312653,\n 36.100185\n ],\n [\n 120.317549,\n 36.108106\n ],\n [\n 120.326235,\n 36.111662\n ],\n [\n 120.333658,\n 36.134652\n ],\n [\n 120.347004,\n 36.155818\n ],\n [\n 120.356953,\n 36.166076\n ],\n [\n 120.358217,\n 36.174757\n ],\n [\n 120.369509,\n 36.177745\n ],\n [\n 120.35877,\n 36.200312\n ],\n [\n 120.336896,\n 36.213954\n ],\n [\n 120.319997,\n 36.232234\n ],\n [\n 120.297412,\n 36.225455\n ],\n [\n 120.293305,\n 36.219241\n ],\n [\n 120.29828,\n 36.203783\n ],\n [\n 120.313205,\n 36.196316\n ],\n [\n 120.310283,\n 36.185295\n ],\n [\n 120.291489,\n 36.185941\n ],\n [\n 120.28075,\n 36.17932\n ],\n [\n 120.276564,\n 36.185699\n ],\n [\n 120.262982,\n 36.182267\n ],\n [\n 120.260929,\n 36.198415\n ],\n [\n 120.244819,\n 36.199384\n ],\n [\n 120.235027,\n 36.189211\n ],\n [\n 120.224445,\n 36.19131\n ],\n [\n 120.217338,\n 36.211412\n ],\n [\n 120.20723,\n 36.211613\n ],\n [\n 120.181566,\n 36.203945\n ],\n [\n 120.164351,\n 36.188767\n ],\n [\n 120.140345,\n 36.173304\n ],\n [\n 120.142556,\n 36.143539\n ],\n [\n 120.128105,\n 36.129723\n ],\n [\n 120.1086,\n 36.12742\n ],\n [\n 120.116023,\n 36.114046\n ],\n [\n 120.116891,\n 36.102852\n ],\n [\n 120.152111,\n 36.095254\n ],\n [\n 120.161903,\n 36.082682\n ],\n [\n 120.173906,\n 36.077225\n ],\n [\n 120.181645,\n 36.066511\n ],\n [\n 120.19499,\n 36.064206\n ],\n [\n 120.231868,\n 36.063842\n ],\n [\n 120.241345,\n 36.060445\n ],\n [\n 120.24095,\n 36.047828\n ],\n [\n 120.230605,\n 36.044916\n ],\n [\n 120.23479,\n 36.030638\n ],\n [\n 120.223656,\n 36.022385\n ],\n [\n 120.223577,\n 36.016398\n ],\n [\n 120.19886,\n 35.99572\n ],\n [\n 120.213232,\n 35.998351\n ],\n [\n 120.244977,\n 36.020444\n ],\n [\n 120.25698,\n 36.024813\n ],\n [\n 120.265509,\n 36.014011\n ],\n [\n 120.256427,\n 36.005433\n ],\n [\n 120.248768,\n 35.992078\n ],\n [\n 120.247662,\n 35.982567\n ],\n [\n 120.254927,\n 35.980826\n ],\n [\n 120.265588,\n 36.001062\n ],\n [\n 120.271273,\n 35.99394\n ],\n [\n 120.278775,\n 35.996368\n ],\n [\n 120.27459,\n 36.004664\n ],\n [\n 120.289673,\n 36.017086\n ],\n [\n 120.309494,\n 36.014132\n ],\n [\n 120.316522,\n 36.002155\n ],\n [\n 120.305072,\n 35.97184\n ],\n [\n 120.284619,\n 35.965565\n ],\n [\n 120.261718,\n 35.965484\n ],\n [\n 120.251531,\n 35.95937\n ],\n [\n 120.246477,\n 35.947466\n ],\n [\n 120.233132,\n 35.941553\n ],\n [\n 120.222076,\n 35.924947\n ],\n [\n 120.209284,\n 35.917616\n ],\n [\n 120.204388,\n 35.910404\n ],\n [\n 120.202098,\n 35.89205\n ],\n [\n 120.185198,\n 35.88747\n ],\n [\n 120.169405,\n 35.888565\n ],\n [\n 120.172169,\n 35.904408\n ],\n [\n 120.184172,\n 35.915671\n ],\n [\n 120.194438,\n 35.93402\n ],\n [\n 120.210784,\n 35.938435\n ],\n [\n 120.207862,\n 35.947344\n ],\n [\n 120.179276,\n 35.936653\n ],\n [\n 120.167983,\n 35.918426\n ],\n [\n 120.15677,\n 35.909149\n ],\n [\n 120.147768,\n 35.907852\n ],\n [\n 120.141924,\n 35.919438\n ],\n [\n 120.142714,\n 35.909392\n ],\n [\n 120.135843,\n 35.905421\n ],\n [\n 120.12542,\n 35.906718\n ],\n [\n 120.123998,\n 35.895291\n ],\n [\n 120.118392,\n 35.888524\n ],\n [\n 120.102203,\n 35.881918\n ],\n [\n 120.084041,\n 35.880378\n ],\n [\n 120.07875,\n 35.885768\n ],\n [\n 120.062798,\n 35.87134\n ],\n [\n 120.036423,\n 35.824753\n ],\n [\n 120.033264,\n 35.806013\n ],\n [\n 120.041319,\n 35.799198\n ],\n [\n 120.049453,\n 35.782278\n ],\n [\n 120.043135,\n 35.776759\n ],\n [\n 120.03745,\n 35.763041\n ],\n [\n 120.037529,\n 35.753908\n ],\n [\n 120.031369,\n 35.752244\n ],\n [\n 120.020235,\n 35.722239\n ],\n [\n 120.011074,\n 35.713223\n ],\n [\n 120.001519,\n 35.720209\n ],\n [\n 119.981224,\n 35.715335\n ],\n [\n 119.986041,\n 35.729711\n ],\n [\n 119.978461,\n 35.739496\n ],\n [\n 119.967879,\n 35.74108\n ],\n [\n 119.969932,\n 35.749078\n ],\n [\n 119.959982,\n 35.759104\n ],\n [\n 119.937081,\n 35.763407\n ],\n [\n 119.924841,\n 35.758252\n ],\n [\n 119.920735,\n 35.737548\n ],\n [\n 119.930369,\n 35.728899\n ],\n [\n 119.949321,\n 35.729873\n ],\n [\n 119.953349,\n 35.72561\n ],\n [\n 119.952954,\n 35.713142\n ],\n [\n 119.94482,\n 35.705506\n ],\n [\n 119.923894,\n 35.696529\n ],\n [\n 119.910864,\n 35.674305\n ],\n [\n 119.912285,\n 35.660651\n ],\n [\n 119.927921,\n 35.65045\n ],\n [\n 119.925157,\n 35.63736\n ],\n [\n 119.902493,\n 35.63297\n ],\n [\n 119.894597,\n 35.628742\n ],\n [\n 119.877619,\n 35.610972\n ],\n [\n 119.868379,\n 35.608817\n ],\n [\n 119.851717,\n 35.622074\n ],\n [\n 119.844768,\n 35.623619\n ],\n [\n 119.831422,\n 35.618333\n ],\n [\n 119.829606,\n 35.643702\n ],\n [\n 119.824315,\n 35.646304\n ],\n [\n 119.818472,\n 35.63858\n ],\n [\n 119.800625,\n 35.626465\n ],\n [\n 119.802204,\n 35.620244\n ],\n [\n 119.792649,\n 35.615446\n ],\n [\n 119.802994,\n 35.609183\n ],\n [\n 119.800467,\n 35.59869\n ],\n [\n 119.792649,\n 35.59385\n ],\n [\n 119.800862,\n 35.581891\n ],\n [\n 119.786174,\n 35.576073\n ],\n [\n 119.780172,\n 35.58486\n ],\n [\n 119.76967,\n 35.577212\n ],\n [\n 119.762483,\n 35.578351\n ],\n [\n 119.752849,\n 35.588684\n ],\n [\n 119.751349,\n 35.617845\n ],\n [\n 119.729949,\n 35.618943\n ],\n [\n 119.717946,\n 35.615649\n ],\n [\n 119.682173,\n 35.590027\n ],\n [\n 119.662115,\n 35.589294\n ],\n [\n 119.651455,\n 35.588766\n ],\n [\n 119.634713,\n 35.598731\n ],\n [\n 119.614972,\n 35.606336\n ],\n [\n 119.609286,\n 35.59202\n ],\n [\n 119.600599,\n 35.590271\n ],\n [\n 119.592308,\n 35.600683\n ],\n [\n 119.57762,\n 35.586243\n ],\n [\n 119.556535,\n 35.592508\n ],\n [\n 119.538215,\n 35.589294\n ],\n [\n 119.536872,\n 35.606011\n ],\n [\n 119.518157,\n 35.615446\n ],\n [\n 119.517762,\n 35.625774\n ],\n [\n 119.524474,\n 35.632279\n ],\n [\n 119.528265,\n 35.674305\n ],\n [\n 119.519105,\n 35.68552\n ],\n [\n 119.51484,\n 35.697992\n ],\n [\n 119.518473,\n 35.700632\n ],\n [\n 119.521079,\n 35.716879\n ],\n [\n 119.517762,\n 35.723742\n ],\n [\n 119.525422,\n 35.730604\n ],\n [\n 119.527317,\n 35.723214\n ],\n [\n 119.545085,\n 35.726747\n ],\n [\n 119.560563,\n 35.721752\n ],\n [\n 119.566485,\n 35.714523\n ],\n [\n 119.576988,\n 35.71237\n ],\n [\n 119.588833,\n 35.715701\n ],\n [\n 119.601231,\n 35.709446\n ],\n [\n 119.614182,\n 35.716675\n ],\n [\n 119.624685,\n 35.712817\n ],\n [\n 119.627843,\n 35.722077\n ],\n [\n 119.605495,\n 35.747454\n ],\n [\n 119.591992,\n 35.753218\n ],\n [\n 119.596256,\n 35.773756\n ],\n [\n 119.611576,\n 35.776597\n ],\n [\n 119.617972,\n 35.789623\n ],\n [\n 119.60897,\n 35.799279\n ],\n [\n 119.612445,\n 35.812707\n ],\n [\n 119.622631,\n 35.816114\n ],\n [\n 119.629344,\n 35.833878\n ],\n [\n 119.649796,\n 35.845191\n ],\n [\n 119.664326,\n 35.841015\n ],\n [\n 119.676014,\n 35.842515\n ],\n [\n 119.68699,\n 35.861814\n ],\n [\n 119.704047,\n 35.863962\n ],\n [\n 119.71834,\n 35.853138\n ],\n [\n 119.725211,\n 35.856746\n ],\n [\n 119.72221,\n 35.865138\n ],\n [\n 119.736898,\n 35.86303\n ],\n [\n 119.738003,\n 35.873123\n ],\n [\n 119.727738,\n 35.902544\n ],\n [\n 119.721262,\n 35.906718\n ],\n [\n 119.716208,\n 35.927337\n ],\n [\n 119.701362,\n 35.923732\n ],\n [\n 119.701757,\n 35.944469\n ],\n [\n 119.690149,\n 35.963702\n ],\n [\n 119.684858,\n 35.982648\n ],\n [\n 119.689122,\n 36.000212\n ],\n [\n 119.681068,\n 36.012068\n ],\n [\n 119.706495,\n 36.028292\n ],\n [\n 119.717314,\n 36.044229\n ],\n [\n 119.704126,\n 36.055269\n ],\n [\n 119.695677,\n 36.053045\n ],\n [\n 119.675698,\n 36.064085\n ],\n [\n 119.666695,\n 36.062993\n ],\n [\n 119.633608,\n 36.067683\n ],\n [\n 119.632187,\n 36.091535\n ],\n [\n 119.657061,\n 36.100872\n ],\n [\n 119.657614,\n 36.108631\n ],\n [\n 119.643716,\n 36.127178\n ],\n [\n 119.651218,\n 36.130531\n ],\n [\n 119.649954,\n 36.137157\n ],\n [\n 119.660852,\n 36.154122\n ],\n [\n 119.671039,\n 36.177866\n ],\n [\n 119.681305,\n 36.18045\n ],\n [\n 119.691728,\n 36.176292\n ],\n [\n 119.723473,\n 36.175565\n ],\n [\n 119.732792,\n 36.172536\n ],\n [\n 119.733818,\n 36.163572\n ],\n [\n 119.748111,\n 36.158645\n ],\n [\n 119.772354,\n 36.167691\n ],\n [\n 119.782778,\n 36.165308\n ],\n [\n 119.792333,\n 36.171648\n ],\n [\n 119.813023,\n 36.167691\n ],\n [\n 119.81326,\n 36.175242\n ],\n [\n 119.821315,\n 36.171285\n ],\n [\n 119.82242,\n 36.177987\n ],\n [\n 119.831738,\n 36.180612\n ],\n [\n 119.823131,\n 36.19894\n ],\n [\n 119.828816,\n 36.210685\n ],\n [\n 119.819498,\n 36.211856\n ],\n [\n 119.808048,\n 36.232839\n ],\n [\n 119.82092,\n 36.244499\n ],\n [\n 119.820446,\n 36.257367\n ],\n [\n 119.82929,\n 36.258859\n ],\n [\n 119.83387,\n 36.278822\n ],\n [\n 119.848795,\n 36.292692\n ],\n [\n 119.854402,\n 36.302328\n ],\n [\n 119.862773,\n 36.302368\n ],\n [\n 119.865379,\n 36.308898\n ],\n [\n 119.891991,\n 36.318773\n ],\n [\n 119.896966,\n 36.334047\n ],\n [\n 119.895939,\n 36.34827\n ],\n [\n 119.904784,\n 36.369942\n ],\n [\n 119.90431,\n 36.38154\n ],\n [\n 119.909837,\n 36.384359\n ],\n [\n 119.93029,\n 36.385165\n ],\n [\n 119.936371,\n 36.380655\n ],\n [\n 119.945452,\n 36.384682\n ],\n [\n 119.941425,\n 36.39503\n ],\n [\n 119.926421,\n 36.403324\n ],\n [\n 119.925236,\n 36.419346\n ],\n [\n 119.933923,\n 36.42007\n ],\n [\n 119.935976,\n 36.427436\n ],\n [\n 119.949795,\n 36.446511\n ],\n [\n 119.953981,\n 36.444217\n ],\n [\n 119.968432,\n 36.450051\n ],\n [\n 119.994175,\n 36.450333\n ],\n [\n 119.996623,\n 36.446309\n ],\n [\n 120.011864,\n 36.454236\n ],\n [\n 120.012812,\n 36.467833\n ],\n [\n 120.006889,\n 36.468799\n ],\n [\n 120.004125,\n 36.477447\n ],\n [\n 120.010758,\n 36.484445\n ],\n [\n 120.004204,\n 36.489512\n ],\n [\n 120.010364,\n 36.509255\n ],\n [\n 119.997571,\n 36.504431\n ],\n [\n 119.974749,\n 36.515688\n ],\n [\n 119.971985,\n 36.522441\n ],\n [\n 119.951375,\n 36.519788\n ],\n [\n 119.936292,\n 36.511507\n ],\n [\n 119.936687,\n 36.496389\n ],\n [\n 119.923025,\n 36.495464\n ],\n [\n 119.920261,\n 36.522079\n ],\n [\n 119.917576,\n 36.525858\n ],\n [\n 119.826763,\n 36.54101\n ],\n [\n 119.798019,\n 36.551619\n ],\n [\n 119.784516,\n 36.554673\n ],\n [\n 119.755929,\n 36.565521\n ],\n [\n 119.74748,\n 36.571788\n ],\n [\n 119.72758,\n 36.562749\n ],\n [\n 119.730107,\n 36.581027\n ],\n [\n 119.701125,\n 36.602634\n ],\n [\n 119.681857,\n 36.606891\n ],\n [\n 119.670328,\n 36.616246\n ],\n [\n 119.651297,\n 36.623633\n ],\n [\n 119.625079,\n 36.638807\n ],\n [\n 119.617025,\n 36.652532\n ],\n [\n 119.61355,\n 36.66453\n ],\n [\n 119.607154,\n 36.667379\n ],\n [\n 119.596651,\n 36.689884\n ],\n [\n 119.587412,\n 36.696101\n ],\n [\n 119.579831,\n 36.711581\n ],\n [\n 119.567433,\n 36.713065\n ],\n [\n 119.561036,\n 36.720884\n ],\n [\n 119.547059,\n 36.725454\n ],\n [\n 119.534977,\n 36.743333\n ],\n [\n 119.530555,\n 36.765256\n ],\n [\n 119.532766,\n 36.78008\n ],\n [\n 119.539162,\n 36.787732\n ],\n [\n 119.539162,\n 36.799949\n ],\n [\n 119.550613,\n 36.80868\n ],\n [\n 119.563721,\n 36.802753\n ],\n [\n 119.56767,\n 36.805717\n ],\n [\n 119.597757,\n 36.857244\n ],\n [\n 119.599652,\n 36.878253\n ],\n [\n 119.599968,\n 36.920614\n ],\n [\n 119.5837,\n 36.950441\n ],\n [\n 119.598072,\n 36.989406\n ],\n [\n 119.604548,\n 36.996038\n ],\n [\n 119.60976,\n 37.013894\n ],\n [\n 119.619078,\n 37.017848\n ],\n [\n 119.61971,\n 37.012895\n ],\n [\n 119.629344,\n 37.01621\n ],\n [\n 119.66251,\n 37.008262\n ],\n [\n 119.681699,\n 36.998475\n ],\n [\n 119.716998,\n 37.007144\n ],\n [\n 119.722289,\n 36.993401\n ],\n [\n 119.731133,\n 36.988487\n ],\n [\n 119.743057,\n 36.992483\n ],\n [\n 119.750559,\n 36.990844\n ],\n [\n 119.769906,\n 36.996597\n ],\n [\n 119.771881,\n 37.006984\n ],\n [\n 119.804968,\n 37.013814\n ],\n [\n 119.820209,\n 36.999594\n ],\n [\n 119.829606,\n 37.002031\n ],\n [\n 119.85148,\n 37.002031\n ],\n [\n 119.900045,\n 36.997556\n ],\n [\n 119.902257,\n 36.9948\n ],\n [\n 119.923341,\n 36.993961\n ],\n [\n 119.939608,\n 37.004108\n ],\n [\n 119.949716,\n 37.006185\n ],\n [\n 119.961561,\n 37.013654\n ],\n [\n 119.975618,\n 37.011098\n ],\n [\n 119.980198,\n 37.018088\n ],\n [\n 119.993543,\n 37.012176\n ],\n [\n 120.002309,\n 37.013494\n ],\n [\n 120.024104,\n 36.999913\n ],\n [\n 120.035238,\n 36.998395\n ],\n [\n 120.049374,\n 37.020045\n ],\n [\n 120.09249,\n 37.017928\n ],\n [\n 120.101571,\n 37.014293\n ],\n [\n 120.123051,\n 37.01645\n ],\n [\n 120.138134,\n 37.022201\n ],\n [\n 120.142319,\n 37.015292\n ],\n [\n 120.159929,\n 37.013375\n ],\n [\n 120.167273,\n 37.017968\n ],\n [\n 120.166404,\n 37.025795\n ],\n [\n 120.173037,\n 37.034421\n ],\n [\n 120.180697,\n 37.032544\n ],\n [\n 120.189621,\n 37.038094\n ],\n [\n 120.193411,\n 37.034261\n ],\n [\n 120.205335,\n 37.038374\n ],\n [\n 120.21647,\n 37.056699\n ],\n [\n 120.214101,\n 37.07019\n ],\n [\n 120.220497,\n 37.08711\n ],\n [\n 120.229894,\n 37.089544\n ],\n [\n 120.231237,\n 37.106301\n ],\n [\n 120.236606,\n 37.125965\n ],\n [\n 120.245688,\n 37.118906\n ],\n [\n 120.264087,\n 37.114718\n ],\n [\n 120.280828,\n 37.13111\n ],\n [\n 120.303413,\n 37.130153\n ],\n [\n 120.300176,\n 37.119584\n ],\n [\n 120.315337,\n 37.113043\n ],\n [\n 120.320628,\n 37.10654\n ],\n [\n 120.331684,\n 37.111966\n ],\n [\n 120.336896,\n 37.104267\n ],\n [\n 120.336343,\n 37.092058\n ],\n [\n 120.34574,\n 37.087789\n ],\n [\n 120.348583,\n 37.077094\n ],\n [\n 120.357822,\n 37.084357\n ],\n [\n 120.362244,\n 37.100477\n ],\n [\n 120.369667,\n 37.104626\n ],\n [\n 120.388225,\n 37.104227\n ],\n [\n 120.398096,\n 37.096447\n ],\n [\n 120.408914,\n 37.09517\n ],\n [\n 120.412942,\n 37.103149\n ],\n [\n 120.407098,\n 37.112803\n ],\n [\n 120.415153,\n 37.110569\n ],\n [\n 120.439475,\n 37.116912\n ],\n [\n 120.440265,\n 37.122655\n ],\n [\n 120.462928,\n 37.115157\n ],\n [\n 120.478643,\n 37.124211\n ],\n [\n 120.493015,\n 37.126723\n ],\n [\n 120.493805,\n 37.1345\n ],\n [\n 120.505729,\n 37.143551\n ],\n [\n 120.506834,\n 37.148854\n ],\n [\n 120.517258,\n 37.148974\n ],\n [\n 120.527129,\n 37.143352\n ],\n [\n 120.527998,\n 37.136733\n ],\n [\n 120.542528,\n 37.128677\n ],\n [\n 120.547661,\n 37.113003\n ],\n [\n 120.536368,\n 37.081963\n ],\n [\n 120.539843,\n 37.060371\n ],\n [\n 120.533289,\n 37.053944\n ],\n [\n 120.541738,\n 37.044163\n ],\n [\n 120.549793,\n 37.041288\n ],\n [\n 120.558953,\n 37.047437\n ],\n [\n 120.570877,\n 37.046399\n ],\n [\n 120.58446,\n 37.058136\n ],\n [\n 120.586513,\n 37.048515\n ],\n [\n 120.606176,\n 37.047157\n ],\n [\n 120.613915,\n 37.023839\n ],\n [\n 120.601754,\n 37.012696\n ],\n [\n 120.606413,\n 37.001192\n ],\n [\n 120.593857,\n 36.991244\n ],\n [\n 120.582328,\n 37.001791\n ],\n [\n 120.575931,\n 36.999074\n ],\n [\n 120.574036,\n 36.987568\n ],\n [\n 120.568508,\n 36.983293\n ],\n [\n 120.566534,\n 36.96559\n ],\n [\n 120.560296,\n 36.960674\n ],\n [\n 120.563218,\n 36.95172\n ],\n [\n 120.571114,\n 36.948682\n ],\n [\n 120.574984,\n 36.927053\n ],\n [\n 120.592909,\n 36.912216\n ],\n [\n 120.617389,\n 36.911136\n ],\n [\n 120.622838,\n 36.907377\n ],\n [\n 120.622838,\n 36.890856\n ],\n [\n 120.592909,\n 36.882134\n ],\n [\n 120.576642,\n 36.879894\n ],\n [\n 120.57988,\n 36.858885\n ],\n [\n 120.588408,\n 36.859045\n ],\n [\n 120.595989,\n 36.852681\n ],\n [\n 120.58754,\n 36.843635\n ],\n [\n 120.589751,\n 36.838791\n ],\n [\n 120.609809,\n 36.832906\n ],\n [\n 120.612336,\n 36.829223\n ],\n [\n 120.601517,\n 36.804996\n ],\n [\n 120.590382,\n 36.801552\n ],\n [\n 120.563454,\n 36.802953\n ],\n [\n 120.56377,\n 36.795343\n ],\n [\n 120.5554,\n 36.778718\n ],\n [\n 120.540791,\n 36.7679\n ],\n [\n 120.544502,\n 36.76213\n ],\n [\n 120.546397,\n 36.744616\n ],\n [\n 120.560375,\n 36.742492\n ],\n [\n 120.562586,\n 36.736479\n ],\n [\n 120.584065,\n 36.735236\n ],\n [\n 120.58525,\n 36.728501\n ],\n [\n 120.596542,\n 36.708052\n ],\n [\n 120.586118,\n 36.698829\n ],\n [\n 120.589751,\n 36.694497\n ],\n [\n 120.616521,\n 36.689764\n ],\n [\n 120.619206,\n 36.681541\n ],\n [\n 120.631446,\n 36.673357\n ],\n [\n 120.625128,\n 36.671231\n ],\n [\n 120.627339,\n 36.659836\n ],\n [\n 120.642027,\n 36.666095\n ],\n [\n 120.652135,\n 36.663327\n ],\n [\n 120.648977,\n 36.655863\n ],\n [\n 120.660585,\n 36.647998\n ],\n [\n 120.657426,\n 36.626644\n ],\n [\n 120.644712,\n 36.626524\n ],\n [\n 120.643449,\n 36.613436\n ],\n [\n 120.635947,\n 36.597775\n ],\n [\n 120.637763,\n 36.574199\n ],\n [\n 120.664059,\n 36.583478\n ],\n [\n 120.665402,\n 36.587454\n ],\n [\n 120.679695,\n 36.589181\n ],\n [\n 120.702991,\n 36.598338\n ],\n [\n 120.699121,\n 36.60665\n ],\n [\n 120.70836,\n 36.612914\n ],\n [\n 120.708281,\n 36.621385\n ],\n [\n 120.725733,\n 36.624436\n ],\n [\n 120.751556,\n 36.615042\n ],\n [\n 120.757557,\n 36.606088\n ],\n [\n 120.765533,\n 36.607011\n ],\n [\n 120.777062,\n 36.600546\n ],\n [\n 120.779747,\n 36.591551\n ],\n [\n 120.786223,\n 36.589663\n ],\n [\n 120.850108,\n 36.612271\n ]\n ]\n ],\n [\n [\n [\n 120.584381,\n 36.096183\n ],\n [\n 120.587461,\n 36.099457\n ],\n [\n 120.595042,\n 36.090282\n ],\n [\n 120.579485,\n 36.091535\n ],\n [\n 120.584381,\n 36.096183\n ]\n ]\n ],\n [\n [\n [\n 120.990039,\n 36.413348\n ],\n [\n 120.981431,\n 36.417494\n ],\n [\n 120.963663,\n 36.41363\n ],\n [\n 120.950318,\n 36.414757\n ],\n [\n 120.948502,\n 36.421117\n ],\n [\n 120.9639,\n 36.424618\n ],\n [\n 120.969823,\n 36.431581\n ],\n [\n 120.978115,\n 36.428643\n ],\n [\n 120.990039,\n 36.413348\n ]\n ]\n ],\n [\n [\n [\n 121.004253,\n 36.488306\n ],\n [\n 120.988538,\n 36.485249\n ],\n [\n 120.989881,\n 36.492367\n ],\n [\n 121.004253,\n 36.488306\n ]\n ]\n ],\n [\n [\n [\n 120.877352,\n 35.89359\n ],\n [\n 120.888802,\n 35.897277\n ],\n [\n 120.875377,\n 35.888443\n ],\n [\n 120.877352,\n 35.89359\n ]\n ]\n ],\n [\n [\n [\n 119.73524,\n 35.595762\n ],\n [\n 119.738872,\n 35.599666\n ],\n [\n 119.743689,\n 35.591328\n ],\n [\n 119.741873,\n 35.583884\n ],\n [\n 119.73524,\n 35.595762\n ]\n ]\n ],\n [\n [\n [\n 120.158823,\n 35.76499\n ],\n [\n 120.17209,\n 35.785727\n ],\n [\n 120.180539,\n 35.788649\n ],\n [\n 120.184725,\n 35.766978\n ],\n [\n 120.192858,\n 35.757156\n ],\n [\n 120.187962,\n 35.748712\n ],\n [\n 120.173037,\n 35.741405\n ],\n [\n 120.158665,\n 35.744896\n ],\n [\n 120.155428,\n 35.751838\n ],\n [\n 120.158823,\n 35.76499\n ]\n ]\n ],\n [\n [\n [\n 120.775088,\n 36.237963\n ],\n [\n 120.777457,\n 36.222308\n ],\n [\n 120.76806,\n 36.230701\n ],\n [\n 120.775088,\n 36.237963\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 370300,\n \"name\": \"淄博市\",\n \"center\": [\n 118.047648,\n 36.814939\n ],\n \"centroid\": [\n 118.058672,\n 36.610968\n ],\n \"childrenNum\": 8,\n \"level\": \"city\",\n \"parent\": {\n \"adcode\": 370000\n },\n \"subFeatureIndex\": 2,\n \"acroutes\": [\n 100000,\n 370000\n ]\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 117.718006,\n 36.697826\n ],\n [\n 117.725666,\n 36.695219\n ],\n [\n 117.754173,\n 36.696944\n ],\n [\n 117.777942,\n 36.695219\n ],\n [\n 117.78197,\n 36.70304\n ],\n [\n 117.793025,\n 36.707451\n ],\n [\n 117.795157,\n 36.719761\n ],\n [\n 117.810161,\n 36.734394\n ],\n [\n 117.820743,\n 36.756359\n ],\n [\n 117.826429,\n 36.763011\n ],\n [\n 117.834404,\n 36.751871\n ],\n [\n 117.832983,\n 36.744816\n ],\n [\n 117.852488,\n 36.750708\n ],\n [\n 117.850672,\n 36.764735\n ],\n [\n 117.840327,\n 36.777516\n ],\n [\n 117.825639,\n 36.775834\n ],\n [\n 117.824297,\n 36.787933\n ],\n [\n 117.815531,\n 36.788573\n ],\n [\n 117.814662,\n 36.797306\n ],\n [\n 117.820901,\n 36.801511\n ],\n [\n 117.822085,\n 36.825139\n ],\n [\n 117.831877,\n 36.836629\n ],\n [\n 117.828008,\n 36.855883\n ],\n [\n 117.832825,\n 36.859966\n ],\n [\n 117.856594,\n 36.859926\n ],\n [\n 117.865597,\n 36.866529\n ],\n [\n 117.875152,\n 36.861246\n ],\n [\n 117.891103,\n 36.864408\n ],\n [\n 117.891814,\n 36.871811\n ],\n [\n 117.917005,\n 36.86973\n ],\n [\n 117.9189,\n 36.880094\n ],\n [\n 117.929719,\n 36.890216\n ],\n [\n 117.940616,\n 36.891616\n ],\n [\n 117.9403,\n 36.901177\n ],\n [\n 117.950645,\n 36.902137\n ],\n [\n 117.960674,\n 36.910376\n ],\n [\n 117.96178,\n 36.922494\n ],\n [\n 117.949145,\n 36.918375\n ],\n [\n 117.94338,\n 36.930012\n ],\n [\n 117.935404,\n 36.915736\n ],\n [\n 117.936115,\n 36.93489\n ],\n [\n 117.931772,\n 36.941886\n ],\n [\n 117.913372,\n 36.953679\n ],\n [\n 117.910292,\n 36.962592\n ],\n [\n 117.911951,\n 36.975141\n ],\n [\n 117.906581,\n 36.981695\n ],\n [\n 117.870493,\n 36.985451\n ],\n [\n 117.866623,\n 36.993282\n ],\n [\n 117.866386,\n 37.007024\n ],\n [\n 117.870493,\n 37.013375\n ],\n [\n 117.865992,\n 37.023719\n ],\n [\n 117.841827,\n 37.026354\n ],\n [\n 117.840327,\n 37.035539\n ],\n [\n 117.847355,\n 37.065959\n ],\n [\n 117.800369,\n 37.070789\n ],\n [\n 117.771783,\n 37.069032\n ],\n [\n 117.761991,\n 37.065839\n ],\n [\n 117.739801,\n 37.064921\n ],\n [\n 117.726692,\n 37.068753\n ],\n [\n 117.703002,\n 37.068673\n ],\n [\n 117.673942,\n 37.073143\n ],\n [\n 117.644645,\n 37.083878\n ],\n [\n 117.619375,\n 37.090103\n ],\n [\n 117.608477,\n 37.090622\n ],\n [\n 117.590946,\n 37.084996\n ],\n [\n 117.575074,\n 37.089185\n ],\n [\n 117.567888,\n 37.11029\n ],\n [\n 117.576969,\n 37.114758\n ],\n [\n 117.574442,\n 37.12106\n ],\n [\n 117.557464,\n 37.124211\n ],\n [\n 117.551305,\n 37.146781\n ],\n [\n 117.574284,\n 37.151366\n ],\n [\n 117.586366,\n 37.160216\n ],\n [\n 117.592052,\n 37.169624\n ],\n [\n 117.598212,\n 37.203058\n ],\n [\n 117.615348,\n 37.212699\n ],\n [\n 117.627193,\n 37.228074\n ],\n [\n 117.63043,\n 37.247269\n ],\n [\n 117.644329,\n 37.265862\n ],\n [\n 117.659491,\n 37.274101\n ],\n [\n 117.675995,\n 37.270121\n ],\n [\n 117.693447,\n 37.257661\n ],\n [\n 117.729851,\n 37.249101\n ],\n [\n 117.760333,\n 37.244959\n ],\n [\n 117.773678,\n 37.244959\n ],\n [\n 117.782128,\n 37.248702\n ],\n [\n 117.818848,\n 37.276012\n ],\n [\n 117.83859,\n 37.282659\n ],\n [\n 117.850909,\n 37.28246\n ],\n [\n 117.8776,\n 37.273027\n ],\n [\n 117.888497,\n 37.262319\n ],\n [\n 117.909266,\n 37.265065\n ],\n [\n 117.941327,\n 37.280549\n ],\n [\n 117.948829,\n 37.26829\n ],\n [\n 117.947013,\n 37.262159\n ],\n [\n 117.963833,\n 37.271753\n ],\n [\n 117.990603,\n 37.262358\n ],\n [\n 117.990761,\n 37.248981\n ],\n [\n 117.996446,\n 37.246273\n ],\n [\n 117.981048,\n 37.238429\n ],\n [\n 117.973862,\n 37.216483\n ],\n [\n 117.98089,\n 37.218674\n ],\n [\n 117.984364,\n 37.210349\n ],\n [\n 117.994393,\n 37.212699\n ],\n [\n 118.010898,\n 37.20756\n ],\n [\n 118.019584,\n 37.210309\n ],\n [\n 118.022348,\n 37.2221\n ],\n [\n 118.036799,\n 37.220905\n ],\n [\n 118.046275,\n 37.216324\n ],\n [\n 118.048012,\n 37.205568\n ],\n [\n 118.064122,\n 37.21007\n ],\n [\n 118.074072,\n 37.204094\n ],\n [\n 118.077941,\n 37.188953\n ],\n [\n 118.082995,\n 37.185605\n ],\n [\n 118.071545,\n 37.177675\n ],\n [\n 118.074467,\n 37.170341\n ],\n [\n 118.062385,\n 37.162528\n ],\n [\n 118.059858,\n 37.151087\n ],\n [\n 118.065069,\n 37.139564\n ],\n [\n 118.079679,\n 37.120781\n ],\n [\n 118.068623,\n 37.115875\n ],\n [\n 118.057252,\n 37.106141\n ],\n [\n 118.045485,\n 37.105982\n ],\n [\n 118.045959,\n 37.098202\n ],\n [\n 118.056857,\n 37.093654\n ],\n [\n 118.063016,\n 37.082841\n ],\n [\n 118.086075,\n 37.091899\n ],\n [\n 118.111187,\n 37.094652\n ],\n [\n 118.115925,\n 37.100636\n ],\n [\n 118.130455,\n 37.091101\n ],\n [\n 118.136062,\n 37.077773\n ],\n [\n 118.13622,\n 37.06536\n ],\n [\n 118.156909,\n 37.065281\n ],\n [\n 118.15762,\n 37.057776\n ],\n [\n 118.150829,\n 37.054743\n ],\n [\n 118.15146,\n 37.047038\n ],\n [\n 118.139615,\n 37.044363\n ],\n [\n 118.139299,\n 37.033103\n ],\n [\n 118.134008,\n 37.025955\n ],\n [\n 118.139299,\n 37.014693\n ],\n [\n 118.138983,\n 37.005985\n ],\n [\n 118.153198,\n 37.000512\n ],\n [\n 118.15146,\n 36.988527\n ],\n [\n 118.161331,\n 36.988567\n ],\n [\n 118.160936,\n 36.981934\n ],\n [\n 118.192918,\n 36.977739\n ],\n [\n 118.195209,\n 36.967348\n ],\n [\n 118.209739,\n 36.963152\n ],\n [\n 118.222531,\n 36.967109\n ],\n [\n 118.231376,\n 36.974822\n ],\n [\n 118.235087,\n 36.98557\n ],\n [\n 118.247327,\n 36.98613\n ],\n [\n 118.250802,\n 37.002949\n ],\n [\n 118.262568,\n 37.00271\n ],\n [\n 118.271412,\n 37.006744\n ],\n [\n 118.288785,\n 36.999993\n ],\n [\n 118.291628,\n 36.995878\n ],\n [\n 118.294629,\n 36.969666\n ],\n [\n 118.312476,\n 36.970905\n ],\n [\n 118.322347,\n 36.974502\n ],\n [\n 118.324637,\n 36.964751\n ],\n [\n 118.3443,\n 36.960714\n ],\n [\n 118.352276,\n 36.974582\n ],\n [\n 118.384652,\n 36.974382\n ],\n [\n 118.387574,\n 36.971305\n ],\n [\n 118.386548,\n 36.950481\n ],\n [\n 118.401788,\n 36.949802\n ],\n [\n 118.40321,\n 36.943125\n ],\n [\n 118.439061,\n 36.942206\n ],\n [\n 118.467411,\n 36.945484\n ],\n [\n 118.494339,\n 36.941846\n ],\n [\n 118.492365,\n 36.931611\n ],\n [\n 118.496708,\n 36.924733\n ],\n [\n 118.48968,\n 36.914096\n ],\n [\n 118.481862,\n 36.914136\n ],\n [\n 118.474913,\n 36.905297\n ],\n [\n 118.483046,\n 36.900777\n ],\n [\n 118.482809,\n 36.879214\n ],\n [\n 118.476966,\n 36.876893\n ],\n [\n 118.465042,\n 36.861366\n ],\n [\n 118.479967,\n 36.860166\n ],\n [\n 118.480993,\n 36.852641\n ],\n [\n 118.460462,\n 36.846597\n ],\n [\n 118.461488,\n 36.854322\n ],\n [\n 118.453828,\n 36.857564\n ],\n [\n 118.450038,\n 36.83747\n ],\n [\n 118.435508,\n 36.838391\n ],\n [\n 118.44072,\n 36.828142\n ],\n [\n 118.438666,\n 36.809682\n ],\n [\n 118.424531,\n 36.802673\n ],\n [\n 118.419872,\n 36.796304\n ],\n [\n 118.388522,\n 36.791217\n ],\n [\n 118.350222,\n 36.768301\n ],\n [\n 118.321636,\n 36.770905\n ],\n [\n 118.318161,\n 36.77972\n ],\n [\n 118.307501,\n 36.776234\n ],\n [\n 118.297788,\n 36.777677\n ],\n [\n 118.298183,\n 36.753914\n ],\n [\n 118.279546,\n 36.753033\n ],\n [\n 118.27157,\n 36.744015\n ],\n [\n 118.276151,\n 36.731749\n ],\n [\n 118.284363,\n 36.72337\n ],\n [\n 118.277019,\n 36.719801\n ],\n [\n 118.264147,\n 36.72373\n ],\n [\n 118.254276,\n 36.731789\n ],\n [\n 118.234219,\n 36.726457\n ],\n [\n 118.227743,\n 36.717957\n ],\n [\n 118.237614,\n 36.712704\n ],\n [\n 118.227585,\n 36.697625\n ],\n [\n 118.238246,\n 36.697305\n ],\n [\n 118.245037,\n 36.690647\n ],\n [\n 118.228059,\n 36.694016\n ],\n [\n 118.21653,\n 36.6811\n ],\n [\n 118.215819,\n 36.668262\n ],\n [\n 118.226796,\n 36.668382\n ],\n [\n 118.230191,\n 36.660357\n ],\n [\n 118.221189,\n 36.664169\n ],\n [\n 118.215898,\n 36.648921\n ],\n [\n 118.199631,\n 36.639047\n ],\n [\n 118.20658,\n 36.637482\n ],\n [\n 118.214793,\n 36.621144\n ],\n [\n 118.200657,\n 36.612071\n ],\n [\n 118.189523,\n 36.599141\n ],\n [\n 118.180363,\n 36.593599\n ],\n [\n 118.176967,\n 36.582996\n ],\n [\n 118.180678,\n 36.577412\n ],\n [\n 118.180915,\n 36.5607\n ],\n [\n 118.183916,\n 36.561142\n ],\n [\n 118.191892,\n 36.546074\n ],\n [\n 118.214556,\n 36.539322\n ],\n [\n 118.221663,\n 36.531887\n ],\n [\n 118.210844,\n 36.526099\n ],\n [\n 118.213766,\n 36.513075\n ],\n [\n 118.210528,\n 36.503466\n ],\n [\n 118.218346,\n 36.497354\n ],\n [\n 118.212818,\n 36.490075\n ],\n [\n 118.216135,\n 36.478573\n ],\n [\n 118.229638,\n 36.467793\n ],\n [\n 118.233508,\n 36.456609\n ],\n [\n 118.22719,\n 36.451379\n ],\n [\n 118.232797,\n 36.432869\n ],\n [\n 118.228533,\n 36.430736\n ],\n [\n 118.224427,\n 36.414234\n ],\n [\n 118.227427,\n 36.408034\n ],\n [\n 118.250407,\n 36.411214\n ],\n [\n 118.251592,\n 36.401995\n ],\n [\n 118.235403,\n 36.389634\n ],\n [\n 118.239825,\n 36.376748\n ],\n [\n 118.256093,\n 36.363175\n ],\n [\n 118.262726,\n 36.352218\n ],\n [\n 118.261857,\n 36.345852\n ],\n [\n 118.269912,\n 36.339849\n ],\n [\n 118.300157,\n 36.338116\n ],\n [\n 118.291075,\n 36.326189\n ],\n [\n 118.304105,\n 36.321393\n ],\n [\n 118.30908,\n 36.307125\n ],\n [\n 118.315477,\n 36.304464\n ],\n [\n 118.310107,\n 36.295716\n ],\n [\n 118.317609,\n 36.288903\n ],\n [\n 118.31366,\n 36.277371\n ],\n [\n 118.315003,\n 36.266361\n ],\n [\n 118.306948,\n 36.252123\n ],\n [\n 118.31524,\n 36.24938\n ],\n [\n 118.350775,\n 36.263538\n ],\n [\n 118.368385,\n 36.248412\n ],\n [\n 118.379756,\n 36.245265\n ],\n [\n 118.386548,\n 36.239053\n ],\n [\n 118.382046,\n 36.207335\n ],\n [\n 118.374387,\n 36.203097\n ],\n [\n 118.387653,\n 36.174555\n ],\n [\n 118.402262,\n 36.162926\n ],\n [\n 118.405263,\n 36.141641\n ],\n [\n 118.402183,\n 36.131622\n ],\n [\n 118.412844,\n 36.127218\n ],\n [\n 118.428953,\n 36.132672\n ],\n [\n 118.440956,\n 36.132511\n ],\n [\n 118.447116,\n 36.140913\n ],\n [\n 118.457303,\n 36.13247\n ],\n [\n 118.462594,\n 36.14059\n ],\n [\n 118.487863,\n 36.131784\n ],\n [\n 118.492601,\n 36.127057\n ],\n [\n 118.479493,\n 36.118814\n ],\n [\n 118.484468,\n 36.104064\n ],\n [\n 118.478545,\n 36.098245\n ],\n [\n 118.482099,\n 36.092546\n ],\n [\n 118.48044,\n 36.074071\n ],\n [\n 118.496866,\n 36.067683\n ],\n [\n 118.507842,\n 36.074961\n ],\n [\n 118.516608,\n 36.068573\n ],\n [\n 118.513449,\n 36.064085\n ],\n [\n 118.522214,\n 36.05349\n ],\n [\n 118.522609,\n 36.043622\n ],\n [\n 118.516845,\n 36.026107\n ],\n [\n 118.507447,\n 36.029789\n ],\n [\n 118.503341,\n 36.024246\n ],\n [\n 118.489206,\n 36.025784\n ],\n [\n 118.476097,\n 36.031407\n ],\n [\n 118.469859,\n 36.022992\n ],\n [\n 118.476571,\n 36.012797\n ],\n [\n 118.487074,\n 36.005797\n ],\n [\n 118.49268,\n 35.995437\n ],\n [\n 118.486521,\n 35.988759\n ],\n [\n 118.499393,\n 35.976212\n ],\n [\n 118.505157,\n 35.965808\n ],\n [\n 118.502157,\n 35.962488\n ],\n [\n 118.470964,\n 35.960868\n ],\n [\n 118.459356,\n 35.952689\n ],\n [\n 118.430612,\n 35.969694\n ],\n [\n 118.415213,\n 35.990783\n ],\n [\n 118.387021,\n 35.987586\n ],\n [\n 118.382283,\n 35.975078\n ],\n [\n 118.360725,\n 35.970908\n ],\n [\n 118.352828,\n 35.956698\n ],\n [\n 118.344774,\n 35.955888\n ],\n [\n 118.320136,\n 35.946575\n ],\n [\n 118.314134,\n 35.950827\n ],\n [\n 118.303552,\n 35.948923\n ],\n [\n 118.293523,\n 35.937503\n ],\n [\n 118.281362,\n 35.935964\n ],\n [\n 118.26928,\n 35.928512\n ],\n [\n 118.257593,\n 35.925717\n ],\n [\n 118.257119,\n 35.930699\n ],\n [\n 118.245906,\n 35.932157\n ],\n [\n 118.236904,\n 35.939245\n ],\n [\n 118.236351,\n 35.947749\n ],\n [\n 118.22569,\n 35.948235\n ],\n [\n 118.209897,\n 35.955767\n ],\n [\n 118.207054,\n 35.964391\n ],\n [\n 118.193787,\n 35.974026\n ],\n [\n 118.206106,\n 35.97864\n ],\n [\n 118.197578,\n 36.004947\n ],\n [\n 118.178388,\n 36.017005\n ],\n [\n 118.135588,\n 36.02364\n ],\n [\n 118.132666,\n 36.030436\n ],\n [\n 118.10937,\n 36.030031\n ],\n [\n 118.096104,\n 36.024246\n ],\n [\n 118.093261,\n 36.014618\n ],\n [\n 118.084338,\n 36.012149\n ],\n [\n 118.078415,\n 36.017652\n ],\n [\n 118.075888,\n 36.009034\n ],\n [\n 118.066807,\n 36.009155\n ],\n [\n 118.058989,\n 35.992968\n ],\n [\n 118.042248,\n 35.986371\n ],\n [\n 118.032693,\n 35.974268\n ],\n [\n 118.03293,\n 35.964998\n ],\n [\n 118.02298,\n 35.958965\n ],\n [\n 118.021084,\n 35.949004\n ],\n [\n 117.988471,\n 35.947709\n ],\n [\n 117.984443,\n 35.956293\n ],\n [\n 117.992577,\n 35.971273\n ],\n [\n 117.971414,\n 35.969937\n ],\n [\n 117.953962,\n 35.957913\n ],\n [\n 117.947013,\n 35.960382\n ],\n [\n 117.946065,\n 35.970949\n ],\n [\n 117.937221,\n 35.98119\n ],\n [\n 117.937536,\n 35.99653\n ],\n [\n 117.950803,\n 35.996489\n ],\n [\n 117.94338,\n 36.017288\n ],\n [\n 117.949855,\n 36.018259\n ],\n [\n 117.946855,\n 36.04253\n ],\n [\n 117.932798,\n 36.052196\n ],\n [\n 117.935799,\n 36.061214\n ],\n [\n 117.948829,\n 36.062589\n ],\n [\n 117.94188,\n 36.071807\n ],\n [\n 117.946223,\n 36.08151\n ],\n [\n 117.953172,\n 36.081833\n ],\n [\n 117.954041,\n 36.090201\n ],\n [\n 117.946618,\n 36.100387\n ],\n [\n 117.939984,\n 36.094324\n ],\n [\n 117.931535,\n 36.094203\n ],\n [\n 117.921111,\n 36.110005\n ],\n [\n 117.923875,\n 36.1174\n ],\n [\n 117.91203,\n 36.132753\n ],\n [\n 117.914162,\n 36.140631\n ],\n [\n 117.90666,\n 36.152708\n ],\n [\n 117.917873,\n 36.16337\n ],\n [\n 117.912109,\n 36.171648\n ],\n [\n 117.903027,\n 36.172092\n ],\n [\n 117.915899,\n 36.192562\n ],\n [\n 117.914636,\n 36.200837\n ],\n [\n 117.921664,\n 36.203662\n ],\n [\n 117.928534,\n 36.196558\n ],\n [\n 117.943933,\n 36.207981\n ],\n [\n 117.959332,\n 36.204308\n ],\n [\n 117.967781,\n 36.21464\n ],\n [\n 117.96328,\n 36.224971\n ],\n [\n 117.96707,\n 36.248251\n ],\n [\n 117.975362,\n 36.262328\n ],\n [\n 117.972993,\n 36.268378\n ],\n [\n 117.943696,\n 36.274064\n ],\n [\n 117.932719,\n 36.271846\n ],\n [\n 117.926797,\n 36.277532\n ],\n [\n 117.93114,\n 36.283742\n ],\n [\n 117.922533,\n 36.300514\n ],\n [\n 117.924823,\n 36.313171\n ],\n [\n 117.918347,\n 36.317725\n ],\n [\n 117.919611,\n 36.324738\n ],\n [\n 117.933509,\n 36.334369\n ],\n [\n 117.933904,\n 36.341219\n ],\n [\n 117.915346,\n 36.352903\n ],\n [\n 117.902633,\n 36.352057\n ],\n [\n 117.893472,\n 36.339446\n ],\n [\n 117.89521,\n 36.359227\n ],\n [\n 117.890314,\n 36.366035\n ],\n [\n 117.882101,\n 36.35673\n ],\n [\n 117.879732,\n 36.370626\n ],\n [\n 117.867492,\n 36.386373\n ],\n [\n 117.859279,\n 36.389433\n ],\n [\n 117.855094,\n 36.412945\n ],\n [\n 117.829508,\n 36.417776\n ],\n [\n 117.826823,\n 36.427114\n ],\n [\n 117.833062,\n 36.44301\n ],\n [\n 117.822717,\n 36.44305\n ],\n [\n 117.817268,\n 36.436129\n ],\n [\n 117.799343,\n 36.432265\n ],\n [\n 117.7965,\n 36.43963\n ],\n [\n 117.786471,\n 36.434277\n ],\n [\n 117.779838,\n 36.441239\n ],\n [\n 117.755752,\n 36.445303\n ],\n [\n 117.763491,\n 36.452868\n ],\n [\n 117.757016,\n 36.459144\n ],\n [\n 117.765544,\n 36.469845\n ],\n [\n 117.748566,\n 36.478694\n ],\n [\n 117.757332,\n 36.484485\n ],\n [\n 117.755673,\n 36.496228\n ],\n [\n 117.743118,\n 36.498439\n ],\n [\n 117.735853,\n 36.504993\n ],\n [\n 117.751646,\n 36.509979\n ],\n [\n 117.765544,\n 36.509496\n ],\n [\n 117.76586,\n 36.512994\n ],\n [\n 117.750777,\n 36.524652\n ],\n [\n 117.742486,\n 36.525737\n ],\n [\n 117.739406,\n 36.539925\n ],\n [\n 117.72377,\n 36.54732\n ],\n [\n 117.720849,\n 36.560057\n ],\n [\n 117.694315,\n 36.568896\n ],\n [\n 117.696132,\n 36.575042\n ],\n [\n 117.706792,\n 36.581469\n ],\n [\n 117.715321,\n 36.578537\n ],\n [\n 117.706792,\n 36.593559\n ],\n [\n 117.715163,\n 36.600546\n ],\n [\n 117.697869,\n 36.599422\n ],\n [\n 117.690525,\n 36.604883\n ],\n [\n 117.705055,\n 36.605807\n ],\n [\n 117.706555,\n 36.611549\n ],\n [\n 117.714926,\n 36.610545\n ],\n [\n 117.715321,\n 36.627527\n ],\n [\n 117.70853,\n 36.635154\n ],\n [\n 117.712241,\n 36.642258\n ],\n [\n 117.709003,\n 36.651569\n ],\n [\n 117.698027,\n 36.652974\n ],\n [\n 117.695184,\n 36.666978\n ],\n [\n 117.701265,\n 36.685191\n ],\n [\n 117.715637,\n 36.691208\n ],\n [\n 117.718006,\n 36.697826\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 370400,\n \"name\": \"枣庄市\",\n \"center\": [\n 117.557964,\n 34.856424\n ],\n \"centroid\": [\n 117.39817,\n 34.916234\n ],\n \"childrenNum\": 6,\n \"level\": \"city\",\n \"parent\": {\n \"adcode\": 370000\n },\n \"subFeatureIndex\": 3,\n \"acroutes\": [\n 100000,\n 370000\n ]\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 117.392342,\n 34.574909\n ],\n [\n 117.393922,\n 34.587676\n ],\n [\n 117.398976,\n 34.588335\n ],\n [\n 117.397949,\n 34.604393\n ],\n [\n 117.407978,\n 34.610651\n ],\n [\n 117.4109,\n 34.623454\n ],\n [\n 117.402687,\n 34.628434\n ],\n [\n 117.384051,\n 34.628228\n ],\n [\n 117.376707,\n 34.622301\n ],\n [\n 117.374022,\n 34.636172\n ],\n [\n 117.366915,\n 34.650246\n ],\n [\n 117.354201,\n 34.653538\n ],\n [\n 117.35657,\n 34.661643\n ],\n [\n 117.346067,\n 34.670982\n ],\n [\n 117.329247,\n 34.677359\n ],\n [\n 117.335485,\n 34.692454\n ],\n [\n 117.324272,\n 34.697307\n ],\n [\n 117.326167,\n 34.703434\n ],\n [\n 117.310611,\n 34.717333\n ],\n [\n 117.304609,\n 34.714866\n ],\n [\n 117.278787,\n 34.715647\n ],\n [\n 117.271443,\n 34.726501\n ],\n [\n 117.253675,\n 34.721444\n ],\n [\n 117.242067,\n 34.729995\n ],\n [\n 117.236697,\n 34.746355\n ],\n [\n 117.22422,\n 34.745533\n ],\n [\n 117.212927,\n 34.761027\n ],\n [\n 117.191369,\n 34.780914\n ],\n [\n 117.180551,\n 34.784201\n ],\n [\n 117.176523,\n 34.779065\n ],\n [\n 117.162467,\n 34.782105\n ],\n [\n 117.172733,\n 34.799194\n ],\n [\n 117.180314,\n 34.800221\n ],\n [\n 117.194686,\n 34.816239\n ],\n [\n 117.17755,\n 34.828722\n ],\n [\n 117.156623,\n 34.834306\n ],\n [\n 117.140593,\n 34.846499\n ],\n [\n 117.139013,\n 34.854052\n ],\n [\n 117.125826,\n 34.863451\n ],\n [\n 117.12093,\n 34.903581\n ],\n [\n 117.110111,\n 34.90514\n ],\n [\n 117.111059,\n 34.917774\n ],\n [\n 117.103399,\n 34.937459\n ],\n [\n 117.082551,\n 34.934917\n ],\n [\n 117.073707,\n 34.925485\n ],\n [\n 117.06123,\n 34.930406\n ],\n [\n 117.05815,\n 34.926961\n ],\n [\n 117.041093,\n 34.925157\n ],\n [\n 117.043462,\n 34.932825\n ],\n [\n 117.038487,\n 34.937869\n ],\n [\n 117.017719,\n 34.942503\n ],\n [\n 116.989448,\n 34.93873\n ],\n [\n 116.980367,\n 34.941027\n ],\n [\n 116.9671,\n 34.951072\n ],\n [\n 116.955334,\n 34.967142\n ],\n [\n 116.943015,\n 34.975627\n ],\n [\n 116.954466,\n 34.993331\n ],\n [\n 116.956993,\n 35.01054\n ],\n [\n 116.951702,\n 35.020618\n ],\n [\n 116.937172,\n 35.0275\n ],\n [\n 116.907875,\n 35.046995\n ],\n [\n 116.900767,\n 35.05977\n ],\n [\n 116.881183,\n 35.058133\n ],\n [\n 116.880473,\n 35.062595\n ],\n [\n 116.900373,\n 35.068737\n ],\n [\n 116.888212,\n 35.085193\n ],\n [\n 116.888922,\n 35.093829\n ],\n [\n 116.863179,\n 35.091496\n ],\n [\n 116.848649,\n 35.103774\n ],\n [\n 116.832065,\n 35.123783\n ],\n [\n 116.825748,\n 35.147631\n ],\n [\n 116.81793,\n 35.150699\n ],\n [\n 116.813192,\n 35.159573\n ],\n [\n 116.81564,\n 35.170777\n ],\n [\n 116.811218,\n 35.17736\n ],\n [\n 116.832776,\n 35.184392\n ],\n [\n 116.85394,\n 35.16861\n ],\n [\n 116.86618,\n 35.172617\n ],\n [\n 116.876603,\n 35.188031\n ],\n [\n 116.898398,\n 35.195757\n ],\n [\n 116.904716,\n 35.182471\n ],\n [\n 116.913718,\n 35.178791\n ],\n [\n 116.925721,\n 35.182266\n ],\n [\n 116.938277,\n 35.172168\n ],\n [\n 116.962047,\n 35.177319\n ],\n [\n 116.969706,\n 35.187377\n ],\n [\n 116.995687,\n 35.1978\n ],\n [\n 117.014639,\n 35.214844\n ],\n [\n 117.028774,\n 35.221219\n ],\n [\n 117.053333,\n 35.224202\n ],\n [\n 117.065336,\n 35.22792\n ],\n [\n 117.092896,\n 35.220361\n ],\n [\n 117.104899,\n 35.221464\n ],\n [\n 117.123536,\n 35.23078\n ],\n [\n 117.152675,\n 35.232047\n ],\n [\n 117.176681,\n 35.243159\n ],\n [\n 117.199108,\n 35.24749\n ],\n [\n 117.204873,\n 35.258518\n ],\n [\n 117.220824,\n 35.26489\n ],\n [\n 117.269231,\n 35.261296\n ],\n [\n 117.262203,\n 35.287472\n ],\n [\n 117.284472,\n 35.294331\n ],\n [\n 117.290079,\n 35.299394\n ],\n [\n 117.305794,\n 35.295229\n ],\n [\n 117.311163,\n 35.28588\n ],\n [\n 117.314085,\n 35.302129\n ],\n [\n 117.308557,\n 35.312579\n ],\n [\n 117.318034,\n 35.320252\n ],\n [\n 117.347568,\n 35.315109\n ],\n [\n 117.359571,\n 35.318375\n ],\n [\n 117.399528,\n 35.306374\n ],\n [\n 117.403635,\n 35.301394\n ],\n [\n 117.406004,\n 35.283348\n ],\n [\n 117.419191,\n 35.273997\n ],\n [\n 117.426456,\n 35.261786\n ],\n [\n 117.439486,\n 35.258927\n ],\n [\n 117.449752,\n 35.246795\n ],\n [\n 117.448331,\n 35.231842\n ],\n [\n 117.468073,\n 35.228369\n ],\n [\n 117.480628,\n 35.222771\n ],\n [\n 117.494843,\n 35.205893\n ],\n [\n 117.507162,\n 35.198986\n ],\n [\n 117.526825,\n 35.200621\n ],\n [\n 117.528009,\n 35.184351\n ],\n [\n 117.548462,\n 35.161741\n ],\n [\n 117.556043,\n 35.161291\n ],\n [\n 117.570336,\n 35.168365\n ],\n [\n 117.58376,\n 35.164317\n ],\n [\n 117.586208,\n 35.152989\n ],\n [\n 117.591025,\n 35.152539\n ],\n [\n 117.600344,\n 35.135524\n ],\n [\n 117.604371,\n 35.13401\n ],\n [\n 117.623007,\n 35.113063\n ],\n [\n 117.650725,\n 35.092724\n ],\n [\n 117.656885,\n 35.077497\n ],\n [\n 117.676469,\n 35.065543\n ],\n [\n 117.69321,\n 35.06018\n ],\n [\n 117.707345,\n 35.052318\n ],\n [\n 117.704423,\n 35.031227\n ],\n [\n 117.736247,\n 35.031514\n ],\n [\n 117.744618,\n 35.022748\n ],\n [\n 117.737985,\n 35.013203\n ],\n [\n 117.728035,\n 35.008041\n ],\n [\n 117.726534,\n 34.979561\n ],\n [\n 117.719506,\n 34.968331\n ],\n [\n 117.724323,\n 34.958329\n ],\n [\n 117.714689,\n 34.947833\n ],\n [\n 117.712004,\n 34.934999\n ],\n [\n 117.704265,\n 34.933605\n ],\n [\n 117.698501,\n 34.919989\n ],\n [\n 117.70466,\n 34.906699\n ],\n [\n 117.715163,\n 34.896238\n ],\n [\n 117.729298,\n 34.876994\n ],\n [\n 117.742407,\n 34.874163\n ],\n [\n 117.75291,\n 34.857623\n ],\n [\n 117.763175,\n 34.848839\n ],\n [\n 117.795315,\n 34.835907\n ],\n [\n 117.803686,\n 34.830734\n ],\n [\n 117.798632,\n 34.810653\n ],\n [\n 117.77739,\n 34.801248\n ],\n [\n 117.784023,\n 34.79484\n ],\n [\n 117.784576,\n 34.780667\n ],\n [\n 117.79958,\n 34.768875\n ],\n [\n 117.830614,\n 34.760246\n ],\n [\n 117.830061,\n 34.740888\n ],\n [\n 117.823665,\n 34.72868\n ],\n [\n 117.825244,\n 34.713139\n ],\n [\n 117.831719,\n 34.707793\n ],\n [\n 117.825639,\n 34.684392\n ],\n [\n 117.819243,\n 34.681842\n ],\n [\n 117.805818,\n 34.646254\n ],\n [\n 117.793657,\n 34.651768\n ],\n [\n 117.796026,\n 34.637736\n ],\n [\n 117.793657,\n 34.625594\n ],\n [\n 117.798553,\n 34.621848\n ],\n [\n 117.791446,\n 34.585082\n ],\n [\n 117.794605,\n 34.559751\n ],\n [\n 117.793499,\n 34.548463\n ],\n [\n 117.799185,\n 34.535155\n ],\n [\n 117.801712,\n 34.518753\n ],\n [\n 117.790498,\n 34.518918\n ],\n [\n 117.773994,\n 34.529056\n ],\n [\n 117.748645,\n 34.533383\n ],\n [\n 117.700712,\n 34.54525\n ],\n [\n 117.684523,\n 34.547351\n ],\n [\n 117.681996,\n 34.529551\n ],\n [\n 117.673389,\n 34.515827\n ],\n [\n 117.659096,\n 34.501071\n ],\n [\n 117.647014,\n 34.492908\n ],\n [\n 117.642039,\n 34.496825\n ],\n [\n 117.629246,\n 34.488538\n ],\n [\n 117.609662,\n 34.490476\n ],\n [\n 117.603187,\n 34.476828\n ],\n [\n 117.592289,\n 34.462518\n ],\n [\n 117.569783,\n 34.463054\n ],\n [\n 117.561334,\n 34.471962\n ],\n [\n 117.54783,\n 34.475179\n ],\n [\n 117.538275,\n 34.46722\n ],\n [\n 117.513005,\n 34.472581\n ],\n [\n 117.493263,\n 34.472663\n ],\n [\n 117.487341,\n 34.466354\n ],\n [\n 117.48663,\n 34.482065\n ],\n [\n 117.48205,\n 34.48594\n ],\n [\n 117.465467,\n 34.48458\n ],\n [\n 117.45141,\n 34.506264\n ],\n [\n 117.438223,\n 34.516445\n ],\n [\n 117.439486,\n 34.520031\n ],\n [\n 117.426772,\n 34.525224\n ],\n [\n 117.424482,\n 34.537009\n ],\n [\n 117.403793,\n 34.546898\n ],\n [\n 117.402529,\n 34.569431\n ],\n [\n 117.392342,\n 34.574909\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 370500,\n \"name\": \"东营市\",\n \"center\": [\n 118.66471,\n 37.434564\n ],\n \"centroid\": [\n 118.625299,\n 37.636119\n ],\n \"childrenNum\": 5,\n \"level\": \"city\",\n \"parent\": {\n \"adcode\": 370000\n },\n \"subFeatureIndex\": 4,\n \"acroutes\": [\n 100000,\n 370000\n ]\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 119.039928,\n 37.304466\n ],\n [\n 118.856959,\n 37.293842\n ],\n [\n 118.821897,\n 37.288788\n ],\n [\n 118.777991,\n 37.280112\n ],\n [\n 118.728399,\n 37.252764\n ],\n [\n 118.709684,\n 37.241256\n ],\n [\n 118.680624,\n 37.229269\n ],\n [\n 118.672332,\n 37.215129\n ],\n [\n 118.668779,\n 37.198436\n ],\n [\n 118.660408,\n 37.187877\n ],\n [\n 118.649274,\n 37.189112\n ],\n [\n 118.645483,\n 37.178153\n ],\n [\n 118.633638,\n 37.171178\n ],\n [\n 118.634191,\n 37.163366\n ],\n [\n 118.64572,\n 37.159579\n ],\n [\n 118.649195,\n 37.164243\n ],\n [\n 118.653617,\n 37.149692\n ],\n [\n 118.673754,\n 37.144309\n ],\n [\n 118.667041,\n 37.11392\n ],\n [\n 118.668384,\n 37.091539\n ],\n [\n 118.665146,\n 37.081763\n ],\n [\n 118.655512,\n 37.082681\n ],\n [\n 118.654091,\n 37.076935\n ],\n [\n 118.632138,\n 37.070429\n ],\n [\n 118.631901,\n 37.066757\n ],\n [\n 118.610895,\n 37.063005\n ],\n [\n 118.591469,\n 37.068474\n ],\n [\n 118.580414,\n 37.063325\n ],\n [\n 118.561303,\n 37.063325\n ],\n [\n 118.557592,\n 37.051469\n ],\n [\n 118.56004,\n 37.041408\n ],\n [\n 118.545431,\n 37.038494\n ],\n [\n 118.545826,\n 37.023519\n ],\n [\n 118.57149,\n 37.022081\n ],\n [\n 118.588389,\n 37.017409\n ],\n [\n 118.583572,\n 37.008422\n ],\n [\n 118.590206,\n 37.001351\n ],\n [\n 118.571174,\n 37.004148\n ],\n [\n 118.566199,\n 36.999034\n ],\n [\n 118.580493,\n 36.994999\n ],\n [\n 118.564146,\n 36.99416\n ],\n [\n 118.553959,\n 37.000233\n ],\n [\n 118.552301,\n 36.979657\n ],\n [\n 118.559803,\n 36.977059\n ],\n [\n 118.557434,\n 36.96539\n ],\n [\n 118.560751,\n 36.946564\n ],\n [\n 118.55467,\n 36.938368\n ],\n [\n 118.537771,\n 36.936769\n ],\n [\n 118.52711,\n 36.939687\n ],\n [\n 118.524583,\n 36.945284\n ],\n [\n 118.503183,\n 36.944285\n ],\n [\n 118.503736,\n 36.95156\n ],\n [\n 118.47665,\n 36.957077\n ],\n [\n 118.467411,\n 36.945484\n ],\n [\n 118.439061,\n 36.942206\n ],\n [\n 118.40321,\n 36.943125\n ],\n [\n 118.401788,\n 36.949802\n ],\n [\n 118.386548,\n 36.950481\n ],\n [\n 118.387574,\n 36.971305\n ],\n [\n 118.384652,\n 36.974382\n ],\n [\n 118.352276,\n 36.974582\n ],\n [\n 118.3443,\n 36.960714\n ],\n [\n 118.324637,\n 36.964751\n ],\n [\n 118.322347,\n 36.974502\n ],\n [\n 118.312476,\n 36.970905\n ],\n [\n 118.294629,\n 36.969666\n ],\n [\n 118.291628,\n 36.995878\n ],\n [\n 118.288785,\n 36.999993\n ],\n [\n 118.28997,\n 37.00946\n ],\n [\n 118.308212,\n 37.019885\n ],\n [\n 118.310186,\n 37.028231\n ],\n [\n 118.3259,\n 37.035459\n ],\n [\n 118.324558,\n 37.046279\n ],\n [\n 118.337588,\n 37.053904\n ],\n [\n 118.338535,\n 37.072265\n ],\n [\n 118.332928,\n 37.081923\n ],\n [\n 118.338851,\n 37.093894\n ],\n [\n 118.338298,\n 37.10311\n ],\n [\n 118.349354,\n 37.101753\n ],\n [\n 118.338219,\n 37.123134\n ],\n [\n 118.346116,\n 37.123931\n ],\n [\n 118.340667,\n 37.131748\n ],\n [\n 118.347616,\n 37.139803\n ],\n [\n 118.356224,\n 37.139325\n ],\n [\n 118.361594,\n 37.148495\n ],\n [\n 118.366569,\n 37.146781\n ],\n [\n 118.377545,\n 37.154157\n ],\n [\n 118.380467,\n 37.175164\n ],\n [\n 118.387574,\n 37.177834\n ],\n [\n 118.383389,\n 37.190587\n ],\n [\n 118.376598,\n 37.196962\n ],\n [\n 118.375966,\n 37.206126\n ],\n [\n 118.3642,\n 37.210189\n ],\n [\n 118.346669,\n 37.233252\n ],\n [\n 118.350459,\n 37.243765\n ],\n [\n 118.36033,\n 37.244561\n ],\n [\n 118.368385,\n 37.258576\n ],\n [\n 118.375729,\n 37.258497\n ],\n [\n 118.372096,\n 37.273703\n ],\n [\n 118.36262,\n 37.273783\n ],\n [\n 118.368069,\n 37.279594\n ],\n [\n 118.358277,\n 37.280669\n ],\n [\n 118.355197,\n 37.286997\n ],\n [\n 118.342168,\n 37.287076\n ],\n [\n 118.342168,\n 37.295075\n ],\n [\n 118.325584,\n 37.296866\n ],\n [\n 118.326058,\n 37.306535\n ],\n [\n 118.319741,\n 37.305978\n ],\n [\n 118.31524,\n 37.31477\n ],\n [\n 118.315398,\n 37.352514\n ],\n [\n 118.287285,\n 37.352434\n ],\n [\n 118.291865,\n 37.358518\n ],\n [\n 118.286495,\n 37.362772\n ],\n [\n 118.273624,\n 37.360029\n ],\n [\n 118.262015,\n 37.364283\n ],\n [\n 118.258541,\n 37.37911\n ],\n [\n 118.245827,\n 37.376646\n ],\n [\n 118.245353,\n 37.367781\n ],\n [\n 118.222768,\n 37.367861\n ],\n [\n 118.217951,\n 37.371478\n ],\n [\n 118.216925,\n 37.385191\n ],\n [\n 118.202,\n 37.382409\n ],\n [\n 118.161015,\n 37.362573\n ],\n [\n 118.156198,\n 37.364322\n ],\n [\n 118.154935,\n 37.377401\n ],\n [\n 118.141668,\n 37.376487\n ],\n [\n 118.135509,\n 37.384834\n ],\n [\n 118.144037,\n 37.392822\n ],\n [\n 118.16141,\n 37.389961\n ],\n [\n 118.160147,\n 37.399618\n ],\n [\n 118.165596,\n 37.4082\n ],\n [\n 118.163937,\n 37.416742\n ],\n [\n 118.14996,\n 37.438351\n ],\n [\n 118.136141,\n 37.441688\n ],\n [\n 118.114898,\n 37.439742\n ],\n [\n 118.118531,\n 37.456182\n ],\n [\n 118.125322,\n 37.45912\n ],\n [\n 118.112766,\n 37.463528\n ],\n [\n 118.120426,\n 37.480757\n ],\n [\n 118.128481,\n 37.483694\n ],\n [\n 118.127849,\n 37.491831\n ],\n [\n 118.135035,\n 37.496752\n ],\n [\n 118.134245,\n 37.507387\n ],\n [\n 118.139378,\n 37.507427\n ],\n [\n 118.136772,\n 37.516791\n ],\n [\n 118.142537,\n 37.518933\n ],\n [\n 118.150987,\n 37.530517\n ],\n [\n 118.156988,\n 37.530358\n ],\n [\n 118.159831,\n 37.539164\n ],\n [\n 118.173255,\n 37.546858\n ],\n [\n 118.176098,\n 37.557129\n ],\n [\n 118.173176,\n 37.563593\n ],\n [\n 118.141431,\n 37.556297\n ],\n [\n 118.134166,\n 37.558478\n ],\n [\n 118.13922,\n 37.571364\n ],\n [\n 118.131324,\n 37.571285\n ],\n [\n 118.127612,\n 37.578103\n ],\n [\n 118.134877,\n 37.590035\n ],\n [\n 118.148696,\n 37.594078\n ],\n [\n 118.146722,\n 37.599943\n ],\n [\n 118.154935,\n 37.605491\n ],\n [\n 118.157462,\n 37.62035\n ],\n [\n 118.154935,\n 37.628036\n ],\n [\n 118.163542,\n 37.63069\n ],\n [\n 118.165596,\n 37.644633\n ],\n [\n 118.172545,\n 37.644079\n ],\n [\n 118.177125,\n 37.657623\n ],\n [\n 118.195445,\n 37.661742\n ],\n [\n 118.200657,\n 37.667404\n ],\n [\n 118.207449,\n 37.661583\n ],\n [\n 118.22569,\n 37.663682\n ],\n [\n 118.239431,\n 37.65596\n ],\n [\n 118.246459,\n 37.658376\n ],\n [\n 118.260989,\n 37.654614\n ],\n [\n 118.2846,\n 37.662058\n ],\n [\n 118.293129,\n 37.670096\n ],\n [\n 118.294076,\n 37.678529\n ],\n [\n 118.305132,\n 37.683122\n ],\n [\n 118.3045,\n 37.690722\n ],\n [\n 118.316187,\n 37.714151\n ],\n [\n 118.319425,\n 37.712924\n ],\n [\n 118.31753,\n 37.728395\n ],\n [\n 118.337509,\n 37.729502\n ],\n [\n 118.341931,\n 37.74667\n ],\n [\n 118.353697,\n 37.750151\n ],\n [\n 118.353065,\n 37.75814\n ],\n [\n 118.340667,\n 37.763913\n ],\n [\n 118.340588,\n 37.774391\n ],\n [\n 118.348406,\n 37.790719\n ],\n [\n 118.36191,\n 37.792063\n ],\n [\n 118.352355,\n 37.814274\n ],\n [\n 118.356382,\n 37.820834\n ],\n [\n 118.344932,\n 37.824627\n ],\n [\n 118.346116,\n 37.832371\n ],\n [\n 118.334271,\n 37.832134\n ],\n [\n 118.340193,\n 37.838059\n ],\n [\n 118.328111,\n 37.865272\n ],\n [\n 118.313265,\n 37.861521\n ],\n [\n 118.301657,\n 37.870208\n ],\n [\n 118.286337,\n 37.8569\n ],\n [\n 118.269754,\n 37.853109\n ],\n [\n 118.258304,\n 37.844182\n ],\n [\n 118.258146,\n 37.854886\n ],\n [\n 118.247643,\n 37.871788\n ],\n [\n 118.248749,\n 37.858164\n ],\n [\n 118.239115,\n 37.868708\n ],\n [\n 118.236588,\n 37.884501\n ],\n [\n 118.243142,\n 37.895673\n ],\n [\n 118.235403,\n 37.905343\n ],\n [\n 118.232718,\n 37.922509\n ],\n [\n 118.225611,\n 37.923417\n ],\n [\n 118.226954,\n 37.939672\n ],\n [\n 118.224742,\n 37.950559\n ],\n [\n 118.215503,\n 37.949376\n ],\n [\n 118.213529,\n 37.95541\n ],\n [\n 118.223479,\n 37.959788\n ],\n [\n 118.220873,\n 37.98258\n ],\n [\n 118.22956,\n 37.986444\n ],\n [\n 118.2234,\n 38.00095\n ],\n [\n 118.40779,\n 38.026212\n ],\n [\n 118.419951,\n 38.025503\n ],\n [\n 118.419319,\n 38.053119\n ],\n [\n 118.410001,\n 38.053277\n ],\n [\n 118.227585,\n 38.037874\n ],\n [\n 118.230665,\n 38.056743\n ],\n [\n 118.226638,\n 38.079583\n ],\n [\n 118.235324,\n 38.082969\n ],\n [\n 118.245511,\n 38.103322\n ],\n [\n 118.241247,\n 38.112138\n ],\n [\n 118.227664,\n 38.119262\n ],\n [\n 118.236272,\n 38.125754\n ],\n [\n 118.245432,\n 38.144286\n ],\n [\n 118.274334,\n 38.138542\n ],\n [\n 118.330717,\n 38.125046\n ],\n [\n 118.360172,\n 38.120954\n ],\n [\n 118.38023,\n 38.119931\n ],\n [\n 118.39097,\n 38.123315\n ],\n [\n 118.404078,\n 38.120914\n ],\n [\n 118.420425,\n 38.107337\n ],\n [\n 118.43148,\n 38.106274\n ],\n [\n 118.449722,\n 38.124259\n ],\n [\n 118.461409,\n 38.126659\n ],\n [\n 118.483204,\n 38.123236\n ],\n [\n 118.504526,\n 38.113909\n ],\n [\n 118.513212,\n 38.10466\n ],\n [\n 118.517081,\n 38.088363\n ],\n [\n 118.526321,\n 38.071314\n ],\n [\n 118.534533,\n 38.063517\n ],\n [\n 118.552459,\n 38.055679\n ],\n [\n 118.565568,\n 38.060209\n ],\n [\n 118.597629,\n 38.078993\n ],\n [\n 118.603946,\n 38.101354\n ],\n [\n 118.607816,\n 38.12906\n ],\n [\n 118.62582,\n 38.138306\n ],\n [\n 118.726425,\n 38.154238\n ],\n [\n 118.777754,\n 38.156952\n ],\n [\n 118.811474,\n 38.15762\n ],\n [\n 118.853721,\n 38.154985\n ],\n [\n 118.877491,\n 38.149596\n ],\n [\n 118.908051,\n 38.139368\n ],\n [\n 118.931426,\n 38.127486\n ],\n [\n 118.958512,\n 38.110131\n ],\n [\n 118.974068,\n 38.09415\n ],\n [\n 118.985282,\n 38.062099\n ],\n [\n 118.996495,\n 38.013996\n ],\n [\n 119.00455,\n 37.992278\n ],\n [\n 119.045297,\n 37.967597\n ],\n [\n 119.110604,\n 37.921365\n ],\n [\n 119.120554,\n 37.897054\n ],\n [\n 119.122844,\n 37.866536\n ],\n [\n 119.128293,\n 37.855992\n ],\n [\n 119.126555,\n 37.845723\n ],\n [\n 119.119764,\n 37.839442\n ],\n [\n 119.121501,\n 37.827511\n ],\n [\n 119.128293,\n 37.814393\n ],\n [\n 119.15451,\n 37.80645\n ],\n [\n 119.180254,\n 37.809098\n ],\n [\n 119.204734,\n 37.815618\n ],\n [\n 119.217605,\n 37.810244\n ],\n [\n 119.219974,\n 37.793723\n ],\n [\n 119.21421,\n 37.769647\n ],\n [\n 119.215394,\n 37.76332\n ],\n [\n 119.225344,\n 37.752998\n ],\n [\n 119.275252,\n 37.739353\n ],\n [\n 119.278963,\n 37.729819\n ],\n [\n 119.275726,\n 37.717435\n ],\n [\n 119.26009,\n 37.702398\n ],\n [\n 119.247218,\n 37.698519\n ],\n [\n 119.22487,\n 37.697332\n ],\n [\n 119.196916,\n 37.699073\n ],\n [\n 119.138006,\n 37.705128\n ],\n [\n 119.107129,\n 37.703941\n ],\n [\n 119.080122,\n 37.696382\n ],\n [\n 119.047509,\n 37.679044\n ],\n [\n 119.020186,\n 37.657227\n ],\n [\n 118.997206,\n 37.632592\n ],\n [\n 118.972331,\n 37.594474\n ],\n [\n 118.9518,\n 37.556019\n ],\n [\n 118.939638,\n 37.527066\n ],\n [\n 118.942955,\n 37.497466\n ],\n [\n 118.958275,\n 37.454912\n ],\n [\n 118.973121,\n 37.404346\n ],\n [\n 118.977385,\n 37.382052\n ],\n [\n 118.982597,\n 37.378077\n ],\n [\n 119.003444,\n 37.383403\n ],\n [\n 119.012842,\n 37.376089\n ],\n [\n 119.009841,\n 37.370763\n ],\n [\n 118.985598,\n 37.365754\n ],\n [\n 118.981412,\n 37.35983\n ],\n [\n 118.98694,\n 37.339511\n ],\n [\n 119.001233,\n 37.318748\n ],\n [\n 119.010315,\n 37.313218\n ],\n [\n 119.039928,\n 37.304466\n ]\n ]\n ],\n [\n [\n [\n 118.410001,\n 38.053277\n ],\n [\n 118.40779,\n 38.026212\n ],\n [\n 118.2234,\n 38.00095\n ],\n [\n 118.227585,\n 38.037874\n ],\n [\n 118.410001,\n 38.053277\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 370600,\n \"name\": \"烟台市\",\n \"center\": [\n 121.391382,\n 37.539297\n ],\n \"centroid\": [\n 120.805129,\n 37.241857\n ],\n \"childrenNum\": 12,\n \"level\": \"city\",\n \"parent\": {\n \"adcode\": 370000\n },\n \"subFeatureIndex\": 5,\n \"acroutes\": [\n 100000,\n 370000\n ]\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 119.576514,\n 37.127561\n ],\n [\n 119.629423,\n 37.142116\n ],\n [\n 119.678541,\n 37.157984\n ],\n [\n 119.68628,\n 37.15611\n ],\n [\n 119.687069,\n 37.14395\n ],\n [\n 119.698598,\n 37.127002\n ],\n [\n 119.744795,\n 37.135257\n ],\n [\n 119.754034,\n 37.147459\n ],\n [\n 119.771091,\n 37.160456\n ],\n [\n 119.780488,\n 37.175204\n ],\n [\n 119.790517,\n 37.185008\n ],\n [\n 119.80789,\n 37.196404\n ],\n [\n 119.822104,\n 37.220068\n ],\n [\n 119.83008,\n 37.225724\n ],\n [\n 119.865063,\n 37.233969\n ],\n [\n 119.877066,\n 37.24046\n ],\n [\n 119.885989,\n 37.252286\n ],\n [\n 119.858982,\n 37.253719\n ],\n [\n 119.860956,\n 37.262557\n ],\n [\n 119.892149,\n 37.263911\n ],\n [\n 119.895781,\n 37.275495\n ],\n [\n 119.887332,\n 37.283972\n ],\n [\n 119.889227,\n 37.298457\n ],\n [\n 119.883383,\n 37.310871\n ],\n [\n 119.874697,\n 37.313099\n ],\n [\n 119.869406,\n 37.321016\n ],\n [\n 119.85306,\n 37.326226\n ],\n [\n 119.848085,\n 37.337323\n ],\n [\n 119.838214,\n 37.34309\n ],\n [\n 119.842715,\n 37.361341\n ],\n [\n 119.839714,\n 37.37112\n ],\n [\n 119.843978,\n 37.376725\n ],\n [\n 119.927131,\n 37.386702\n ],\n [\n 119.937397,\n 37.393339\n ],\n [\n 119.949874,\n 37.42004\n ],\n [\n 119.986357,\n 37.425681\n ],\n [\n 120.012654,\n 37.442919\n ],\n [\n 120.06493,\n 37.449114\n ],\n [\n 120.086252,\n 37.465275\n ],\n [\n 120.108758,\n 37.470515\n ],\n [\n 120.144372,\n 37.481908\n ],\n [\n 120.194517,\n 37.512982\n ],\n [\n 120.199492,\n 37.524646\n ],\n [\n 120.222313,\n 37.532857\n ],\n [\n 120.235975,\n 37.548128\n ],\n [\n 120.246793,\n 37.556614\n ],\n [\n 120.208178,\n 37.588648\n ],\n [\n 120.217575,\n 37.603787\n ],\n [\n 120.210152,\n 37.616745\n ],\n [\n 120.215048,\n 37.621143\n ],\n [\n 120.24861,\n 37.623876\n ],\n [\n 120.265667,\n 37.628868\n ],\n [\n 120.2723,\n 37.63683\n ],\n [\n 120.273563,\n 37.650891\n ],\n [\n 120.269299,\n 37.658495\n ],\n [\n 120.244661,\n 37.657703\n ],\n [\n 120.232895,\n 37.662138\n ],\n [\n 120.220339,\n 37.672036\n ],\n [\n 120.216154,\n 37.686605\n ],\n [\n 120.227209,\n 37.693611\n ],\n [\n 120.341555,\n 37.693215\n ],\n [\n 120.368246,\n 37.698005\n ],\n [\n 120.386408,\n 37.707701\n ],\n [\n 120.437817,\n 37.74141\n ],\n [\n 120.447924,\n 37.754659\n ],\n [\n 120.47201,\n 37.757626\n ],\n [\n 120.482354,\n 37.755015\n ],\n [\n 120.518443,\n 37.750586\n ],\n [\n 120.528235,\n 37.757151\n ],\n [\n 120.579959,\n 37.760868\n ],\n [\n 120.595357,\n 37.767551\n ],\n [\n 120.621654,\n 37.790877\n ],\n [\n 120.63421,\n 37.796371\n ],\n [\n 120.657031,\n 37.793051\n ],\n [\n 120.733393,\n 37.833556\n ],\n [\n 120.743185,\n 37.833082\n ],\n [\n 120.754241,\n 37.837506\n ],\n [\n 120.762611,\n 37.829961\n ],\n [\n 120.778563,\n 37.831146\n ],\n [\n 120.797278,\n 37.827709\n ],\n [\n 120.811887,\n 37.822098\n ],\n [\n 120.832972,\n 37.821624\n ],\n [\n 120.865112,\n 37.832963\n ],\n [\n 120.890381,\n 37.832963\n ],\n [\n 120.900489,\n 37.823679\n ],\n [\n 120.915019,\n 37.824034\n ],\n [\n 120.921653,\n 37.819885\n ],\n [\n 120.935788,\n 37.822375\n ],\n [\n 120.94637,\n 37.813405\n ],\n [\n 120.947712,\n 37.798624\n ],\n [\n 120.941158,\n 37.793367\n ],\n [\n 120.943448,\n 37.78554\n ],\n [\n 120.952924,\n 37.776882\n ],\n [\n 120.975588,\n 37.762371\n ],\n [\n 120.995724,\n 37.759049\n ],\n [\n 121.016098,\n 37.741766\n ],\n [\n 121.019573,\n 37.731085\n ],\n [\n 121.037735,\n 37.718583\n ],\n [\n 121.055108,\n 37.715734\n ],\n [\n 121.064584,\n 37.717119\n ],\n [\n 121.068375,\n 37.72519\n ],\n [\n 121.075482,\n 37.717791\n ],\n [\n 121.096329,\n 37.722698\n ],\n [\n 121.139841,\n 37.723054\n ],\n [\n 121.148527,\n 37.719651\n ],\n [\n 121.159583,\n 37.70687\n ],\n [\n 121.160057,\n 37.699034\n ],\n [\n 121.146079,\n 37.678846\n ],\n [\n 121.142684,\n 37.661267\n ],\n [\n 121.156582,\n 37.657386\n ],\n [\n 121.161715,\n 37.646336\n ],\n [\n 121.150107,\n 37.628987\n ],\n [\n 121.149554,\n 37.619875\n ],\n [\n 121.16977,\n 37.600617\n ],\n [\n 121.182483,\n 37.594276\n ],\n [\n 121.215887,\n 37.583098\n ],\n [\n 121.251264,\n 37.581116\n ],\n [\n 121.304963,\n 37.582979\n ],\n [\n 121.354791,\n 37.596178\n ],\n [\n 121.361583,\n 37.600855\n ],\n [\n 121.358266,\n 37.616467\n ],\n [\n 121.344289,\n 37.627759\n ],\n [\n 121.349264,\n 37.635206\n ],\n [\n 121.361898,\n 37.634216\n ],\n [\n 121.374849,\n 37.628749\n ],\n [\n 121.386142,\n 37.627798\n ],\n [\n 121.411174,\n 37.609494\n ],\n [\n 121.43676,\n 37.600815\n ],\n [\n 121.439603,\n 37.596218\n ],\n [\n 121.427047,\n 37.590788\n ],\n [\n 121.411016,\n 37.591263\n ],\n [\n 121.389774,\n 37.59705\n ],\n [\n 121.385905,\n 37.591303\n ],\n [\n 121.395934,\n 37.589876\n ],\n [\n 121.401066,\n 37.557804\n ],\n [\n 121.412438,\n 37.547652\n ],\n [\n 121.436444,\n 37.541227\n ],\n [\n 121.459819,\n 37.522623\n ],\n [\n 121.45666,\n 37.502665\n ],\n [\n 121.46045,\n 37.493855\n ],\n [\n 121.479245,\n 37.474961\n ],\n [\n 121.514938,\n 37.46186\n ],\n [\n 121.532074,\n 37.462456\n ],\n [\n 121.537207,\n 37.451219\n ],\n [\n 121.56532,\n 37.440377\n ],\n [\n 121.571558,\n 37.441449\n ],\n [\n 121.576059,\n 37.460391\n ],\n [\n 121.586562,\n 37.467299\n ],\n [\n 121.599118,\n 37.46992\n ],\n [\n 121.618939,\n 37.481948\n ],\n [\n 121.633469,\n 37.49318\n ],\n [\n 121.653843,\n 37.493061\n ],\n [\n 121.660239,\n 37.487187\n ],\n [\n 121.665767,\n 37.473453\n ],\n [\n 121.747893,\n 37.467458\n ],\n [\n 121.773084,\n 37.466505\n ],\n [\n 121.838943,\n 37.471468\n ],\n [\n 121.887587,\n 37.470039\n ],\n [\n 121.923992,\n 37.473096\n ],\n [\n 121.92944,\n 37.460868\n ],\n [\n 121.929519,\n 37.454713\n ],\n [\n 121.920438,\n 37.429931\n ],\n [\n 121.91878,\n 37.420755\n ],\n [\n 121.908435,\n 37.400969\n ],\n [\n 121.90038,\n 37.391232\n ],\n [\n 121.882454,\n 37.381694\n ],\n [\n 121.870293,\n 37.368894\n ],\n [\n 121.865239,\n 37.336727\n ],\n [\n 121.859396,\n 37.329249\n ],\n [\n 121.834047,\n 37.318311\n ],\n [\n 121.822281,\n 37.303988\n ],\n [\n 121.815253,\n 37.300447\n ],\n [\n 121.794879,\n 37.30375\n ],\n [\n 121.790615,\n 37.299532\n ],\n [\n 121.792431,\n 37.288469\n ],\n [\n 121.784692,\n 37.268409\n ],\n [\n 121.778296,\n 37.260487\n ],\n [\n 121.7749,\n 37.248225\n ],\n [\n 121.757211,\n 37.247667\n ],\n [\n 121.74813,\n 37.241575\n ],\n [\n 121.748525,\n 37.223255\n ],\n [\n 121.755632,\n 37.220506\n ],\n [\n 121.754527,\n 37.212022\n ],\n [\n 121.761634,\n 37.217997\n ],\n [\n 121.769057,\n 37.196364\n ],\n [\n 121.759738,\n 37.19222\n ],\n [\n 121.760686,\n 37.178831\n ],\n [\n 121.749315,\n 37.176439\n ],\n [\n 121.753895,\n 37.172493\n ],\n [\n 121.761002,\n 37.177954\n ],\n [\n 121.767872,\n 37.170979\n ],\n [\n 121.747656,\n 37.135776\n ],\n [\n 121.737706,\n 37.136175\n ],\n [\n 121.733995,\n 37.125607\n ],\n [\n 121.699328,\n 37.125926\n ],\n [\n 121.694037,\n 37.141239\n ],\n [\n 121.683455,\n 37.141917\n ],\n [\n 121.688983,\n 37.133503\n ],\n [\n 121.682271,\n 37.13127\n ],\n [\n 121.683692,\n 37.123014\n ],\n [\n 121.678007,\n 37.121658\n ],\n [\n 121.669162,\n 37.110649\n ],\n [\n 121.666714,\n 37.12082\n ],\n [\n 121.654316,\n 37.121897\n ],\n [\n 121.639865,\n 37.131908\n ],\n [\n 121.638839,\n 37.139524\n ],\n [\n 121.628889,\n 37.137969\n ],\n [\n 121.625414,\n 37.131908\n ],\n [\n 121.612147,\n 37.125846\n ],\n [\n 121.600539,\n 37.141079\n ],\n [\n 121.590747,\n 37.144269\n ],\n [\n 121.585377,\n 37.132306\n ],\n [\n 121.590352,\n 37.128518\n ],\n [\n 121.589168,\n 37.116712\n ],\n [\n 121.580323,\n 37.10674\n ],\n [\n 121.574954,\n 37.110091\n ],\n [\n 121.547868,\n 37.104945\n ],\n [\n 121.49946,\n 37.104426\n ],\n [\n 121.465425,\n 37.12086\n ],\n [\n 121.447578,\n 37.123333\n ],\n [\n 121.441656,\n 37.12106\n ],\n [\n 121.427363,\n 37.100796\n ],\n [\n 121.391432,\n 37.098282\n ],\n [\n 121.382746,\n 37.112125\n ],\n [\n 121.376823,\n 37.115915\n ],\n [\n 121.369795,\n 37.110889\n ],\n [\n 121.351475,\n 37.126962\n ],\n [\n 121.363715,\n 37.129236\n ],\n [\n 121.358187,\n 37.140282\n ],\n [\n 121.348316,\n 37.135975\n ],\n [\n 121.34113,\n 37.127002\n ],\n [\n 121.326916,\n 37.12768\n ],\n [\n 121.317992,\n 37.132825\n ],\n [\n 121.314044,\n 37.141079\n ],\n [\n 121.306542,\n 37.141996\n ],\n [\n 121.287827,\n 37.136055\n ],\n [\n 121.26153,\n 37.117989\n ],\n [\n 121.246368,\n 37.102631\n ],\n [\n 121.243131,\n 37.092138\n ],\n [\n 121.204279,\n 37.07897\n ],\n [\n 121.191407,\n 37.072026\n ],\n [\n 121.192512,\n 37.052108\n ],\n [\n 121.188011,\n 37.041169\n ],\n [\n 121.188564,\n 37.029948\n ],\n [\n 121.19496,\n 37.027273\n ],\n [\n 121.194565,\n 37.019485\n ],\n [\n 121.181299,\n 37.016131\n ],\n [\n 121.177587,\n 37.003748\n ],\n [\n 121.182404,\n 36.99456\n ],\n [\n 121.19038,\n 36.996558\n ],\n [\n 121.209096,\n 36.985371\n ],\n [\n 121.222915,\n 36.986649\n ],\n [\n 121.22639,\n 36.971065\n ],\n [\n 121.233734,\n 36.956917\n ],\n [\n 121.248501,\n 36.953679\n ],\n [\n 121.252607,\n 36.938088\n ],\n [\n 121.263189,\n 36.926093\n ],\n [\n 121.272191,\n 36.927532\n ],\n [\n 121.282615,\n 36.918535\n ],\n [\n 121.304173,\n 36.918335\n ],\n [\n 121.308358,\n 36.905177\n ],\n [\n 121.312938,\n 36.904097\n ],\n [\n 121.347605,\n 36.920574\n ],\n [\n 121.360951,\n 36.921494\n ],\n [\n 121.366557,\n 36.903617\n ],\n [\n 121.36482,\n 36.897417\n ],\n [\n 121.385431,\n 36.877333\n ],\n [\n 121.363873,\n 36.871651\n ],\n [\n 121.357397,\n 36.864048\n ],\n [\n 121.357239,\n 36.852401\n ],\n [\n 121.36174,\n 36.841273\n ],\n [\n 121.373428,\n 36.840593\n ],\n [\n 121.376665,\n 36.830384\n ],\n [\n 121.396802,\n 36.803834\n ],\n [\n 121.395855,\n 36.794342\n ],\n [\n 121.409121,\n 36.790176\n ],\n [\n 121.417334,\n 36.792739\n ],\n [\n 121.450184,\n 36.790056\n ],\n [\n 121.462424,\n 36.784888\n ],\n [\n 121.478218,\n 36.770825\n ],\n [\n 121.460687,\n 36.76245\n ],\n [\n 121.454291,\n 36.752351\n ],\n [\n 121.412596,\n 36.748103\n ],\n [\n 121.394038,\n 36.737962\n ],\n [\n 121.390406,\n 36.728742\n ],\n [\n 121.404304,\n 36.726457\n ],\n [\n 121.410385,\n 36.714709\n ],\n [\n 121.405489,\n 36.704443\n ],\n [\n 121.394354,\n 36.699029\n ],\n [\n 121.374691,\n 36.699791\n ],\n [\n 121.365531,\n 36.711461\n ],\n [\n 121.357792,\n 36.713105\n ],\n [\n 121.318308,\n 36.702117\n ],\n [\n 121.298724,\n 36.702318\n ],\n [\n 121.285536,\n 36.699871\n ],\n [\n 121.274876,\n 36.692652\n ],\n [\n 121.251896,\n 36.671351\n ],\n [\n 121.239261,\n 36.668342\n ],\n [\n 121.220941,\n 36.671271\n ],\n [\n 121.194881,\n 36.653295\n ],\n [\n 121.176877,\n 36.65482\n ],\n [\n 121.161399,\n 36.651288\n ],\n [\n 121.146079,\n 36.640372\n ],\n [\n 121.113939,\n 36.621907\n ],\n [\n 121.07793,\n 36.607614\n ],\n [\n 121.055582,\n 36.592675\n ],\n [\n 121.045237,\n 36.579581\n ],\n [\n 121.02897,\n 36.573194\n ],\n [\n 121.016019,\n 36.574721\n ],\n [\n 120.955609,\n 36.576087\n ],\n [\n 120.928681,\n 36.589783\n ],\n [\n 120.924495,\n 36.596892\n ],\n [\n 120.925917,\n 36.613837\n ],\n [\n 120.90578,\n 36.623473\n ],\n [\n 120.89504,\n 36.622188\n ],\n [\n 120.882011,\n 36.627086\n ],\n [\n 120.847107,\n 36.618615\n ],\n [\n 120.850108,\n 36.612271\n ],\n [\n 120.786223,\n 36.589663\n ],\n [\n 120.779747,\n 36.591551\n ],\n [\n 120.777062,\n 36.600546\n ],\n [\n 120.765533,\n 36.607011\n ],\n [\n 120.757557,\n 36.606088\n ],\n [\n 120.751556,\n 36.615042\n ],\n [\n 120.725733,\n 36.624436\n ],\n [\n 120.708281,\n 36.621385\n ],\n [\n 120.70836,\n 36.612914\n ],\n [\n 120.699121,\n 36.60665\n ],\n [\n 120.702991,\n 36.598338\n ],\n [\n 120.679695,\n 36.589181\n ],\n [\n 120.665402,\n 36.587454\n ],\n [\n 120.664059,\n 36.583478\n ],\n [\n 120.637763,\n 36.574199\n ],\n [\n 120.635947,\n 36.597775\n ],\n [\n 120.643449,\n 36.613436\n ],\n [\n 120.644712,\n 36.626524\n ],\n [\n 120.657426,\n 36.626644\n ],\n [\n 120.660585,\n 36.647998\n ],\n [\n 120.648977,\n 36.655863\n ],\n [\n 120.652135,\n 36.663327\n ],\n [\n 120.642027,\n 36.666095\n ],\n [\n 120.627339,\n 36.659836\n ],\n [\n 120.625128,\n 36.671231\n ],\n [\n 120.631446,\n 36.673357\n ],\n [\n 120.619206,\n 36.681541\n ],\n [\n 120.616521,\n 36.689764\n ],\n [\n 120.589751,\n 36.694497\n ],\n [\n 120.586118,\n 36.698829\n ],\n [\n 120.596542,\n 36.708052\n ],\n [\n 120.58525,\n 36.728501\n ],\n [\n 120.584065,\n 36.735236\n ],\n [\n 120.562586,\n 36.736479\n ],\n [\n 120.560375,\n 36.742492\n ],\n [\n 120.546397,\n 36.744616\n ],\n [\n 120.544502,\n 36.76213\n ],\n [\n 120.540791,\n 36.7679\n ],\n [\n 120.5554,\n 36.778718\n ],\n [\n 120.56377,\n 36.795343\n ],\n [\n 120.563454,\n 36.802953\n ],\n [\n 120.590382,\n 36.801552\n ],\n [\n 120.601517,\n 36.804996\n ],\n [\n 120.612336,\n 36.829223\n ],\n [\n 120.609809,\n 36.832906\n ],\n [\n 120.589751,\n 36.838791\n ],\n [\n 120.58754,\n 36.843635\n ],\n [\n 120.595989,\n 36.852681\n ],\n [\n 120.588408,\n 36.859045\n ],\n [\n 120.57988,\n 36.858885\n ],\n [\n 120.576642,\n 36.879894\n ],\n [\n 120.592909,\n 36.882134\n ],\n [\n 120.622838,\n 36.890856\n ],\n [\n 120.622838,\n 36.907377\n ],\n [\n 120.617389,\n 36.911136\n ],\n [\n 120.592909,\n 36.912216\n ],\n [\n 120.574984,\n 36.927053\n ],\n [\n 120.571114,\n 36.948682\n ],\n [\n 120.563218,\n 36.95172\n ],\n [\n 120.560296,\n 36.960674\n ],\n [\n 120.566534,\n 36.96559\n ],\n [\n 120.568508,\n 36.983293\n ],\n [\n 120.574036,\n 36.987568\n ],\n [\n 120.575931,\n 36.999074\n ],\n [\n 120.582328,\n 37.001791\n ],\n [\n 120.593857,\n 36.991244\n ],\n [\n 120.606413,\n 37.001192\n ],\n [\n 120.601754,\n 37.012696\n ],\n [\n 120.613915,\n 37.023839\n ],\n [\n 120.606176,\n 37.047157\n ],\n [\n 120.586513,\n 37.048515\n ],\n [\n 120.58446,\n 37.058136\n ],\n [\n 120.570877,\n 37.046399\n ],\n [\n 120.558953,\n 37.047437\n ],\n [\n 120.549793,\n 37.041288\n ],\n [\n 120.541738,\n 37.044163\n ],\n [\n 120.533289,\n 37.053944\n ],\n [\n 120.539843,\n 37.060371\n ],\n [\n 120.536368,\n 37.081963\n ],\n [\n 120.547661,\n 37.113003\n ],\n [\n 120.542528,\n 37.128677\n ],\n [\n 120.527998,\n 37.136733\n ],\n [\n 120.527129,\n 37.143352\n ],\n [\n 120.517258,\n 37.148974\n ],\n [\n 120.506834,\n 37.148854\n ],\n [\n 120.505729,\n 37.143551\n ],\n [\n 120.493805,\n 37.1345\n ],\n [\n 120.493015,\n 37.126723\n ],\n [\n 120.478643,\n 37.124211\n ],\n [\n 120.462928,\n 37.115157\n ],\n [\n 120.440265,\n 37.122655\n ],\n [\n 120.439475,\n 37.116912\n ],\n [\n 120.415153,\n 37.110569\n ],\n [\n 120.407098,\n 37.112803\n ],\n [\n 120.412942,\n 37.103149\n ],\n [\n 120.408914,\n 37.09517\n ],\n [\n 120.398096,\n 37.096447\n ],\n [\n 120.388225,\n 37.104227\n ],\n [\n 120.369667,\n 37.104626\n ],\n [\n 120.362244,\n 37.100477\n ],\n [\n 120.357822,\n 37.084357\n ],\n [\n 120.348583,\n 37.077094\n ],\n [\n 120.34574,\n 37.087789\n ],\n [\n 120.336343,\n 37.092058\n ],\n [\n 120.336896,\n 37.104267\n ],\n [\n 120.331684,\n 37.111966\n ],\n [\n 120.320628,\n 37.10654\n ],\n [\n 120.315337,\n 37.113043\n ],\n [\n 120.300176,\n 37.119584\n ],\n [\n 120.303413,\n 37.130153\n ],\n [\n 120.280828,\n 37.13111\n ],\n [\n 120.264087,\n 37.114718\n ],\n [\n 120.245688,\n 37.118906\n ],\n [\n 120.236606,\n 37.125965\n ],\n [\n 120.231237,\n 37.106301\n ],\n [\n 120.229894,\n 37.089544\n ],\n [\n 120.220497,\n 37.08711\n ],\n [\n 120.214101,\n 37.07019\n ],\n [\n 120.21647,\n 37.056699\n ],\n [\n 120.205335,\n 37.038374\n ],\n [\n 120.193411,\n 37.034261\n ],\n [\n 120.189621,\n 37.038094\n ],\n [\n 120.180697,\n 37.032544\n ],\n [\n 120.173037,\n 37.034421\n ],\n [\n 120.166404,\n 37.025795\n ],\n [\n 120.167273,\n 37.017968\n ],\n [\n 120.159929,\n 37.013375\n ],\n [\n 120.142319,\n 37.015292\n ],\n [\n 120.138134,\n 37.022201\n ],\n [\n 120.123051,\n 37.01645\n ],\n [\n 120.101571,\n 37.014293\n ],\n [\n 120.09249,\n 37.017928\n ],\n [\n 120.049374,\n 37.020045\n ],\n [\n 120.035238,\n 36.998395\n ],\n [\n 120.024104,\n 36.999913\n ],\n [\n 120.002309,\n 37.013494\n ],\n [\n 119.993543,\n 37.012176\n ],\n [\n 119.980198,\n 37.018088\n ],\n [\n 119.975618,\n 37.011098\n ],\n [\n 119.961561,\n 37.013654\n ],\n [\n 119.949716,\n 37.006185\n ],\n [\n 119.939608,\n 37.004108\n ],\n [\n 119.923341,\n 36.993961\n ],\n [\n 119.902257,\n 36.9948\n ],\n [\n 119.900045,\n 36.997556\n ],\n [\n 119.85148,\n 37.002031\n ],\n [\n 119.829606,\n 37.002031\n ],\n [\n 119.820209,\n 36.999594\n ],\n [\n 119.804968,\n 37.013814\n ],\n [\n 119.771881,\n 37.006984\n ],\n [\n 119.769906,\n 36.996597\n ],\n [\n 119.750559,\n 36.990844\n ],\n [\n 119.743057,\n 36.992483\n ],\n [\n 119.731133,\n 36.988487\n ],\n [\n 119.722289,\n 36.993401\n ],\n [\n 119.716998,\n 37.007144\n ],\n [\n 119.681699,\n 36.998475\n ],\n [\n 119.66251,\n 37.008262\n ],\n [\n 119.629344,\n 37.01621\n ],\n [\n 119.61971,\n 37.012895\n ],\n [\n 119.619078,\n 37.017848\n ],\n [\n 119.60976,\n 37.013894\n ],\n [\n 119.613155,\n 37.034101\n ],\n [\n 119.606048,\n 37.04037\n ],\n [\n 119.563406,\n 37.058495\n ],\n [\n 119.559615,\n 37.071786\n ],\n [\n 119.576198,\n 37.087509\n ],\n [\n 119.568696,\n 37.100157\n ],\n [\n 119.576514,\n 37.127561\n ]\n ]\n ],\n [\n [\n [\n 121.508621,\n 37.55253\n ],\n [\n 121.50712,\n 37.556892\n ],\n [\n 121.520308,\n 37.565139\n ],\n [\n 121.526625,\n 37.562522\n ],\n [\n 121.508621,\n 37.55253\n ]\n ]\n ],\n [\n [\n [\n 120.728339,\n 37.92393\n ],\n [\n 120.725733,\n 37.928586\n ],\n [\n 120.721548,\n 37.931308\n ],\n [\n 120.722101,\n 37.94551\n ],\n [\n 120.732446,\n 37.948192\n ],\n [\n 120.737736,\n 37.955174\n ],\n [\n 120.746423,\n 37.951466\n ],\n [\n 120.758031,\n 37.929454\n ],\n [\n 120.765375,\n 37.922904\n ],\n [\n 120.759058,\n 37.911776\n ],\n [\n 120.764901,\n 37.896186\n ],\n [\n 120.760558,\n 37.890581\n ],\n [\n 120.753056,\n 37.894883\n ],\n [\n 120.740974,\n 37.908777\n ],\n [\n 120.727708,\n 37.909448\n ],\n [\n 120.721627,\n 37.917182\n ],\n [\n 120.728339,\n 37.92393\n ]\n ]\n ],\n [\n [\n [\n 120.692409,\n 37.983842\n ],\n [\n 120.685539,\n 37.991332\n ],\n [\n 120.697147,\n 37.995117\n ],\n [\n 120.71602,\n 37.987311\n ],\n [\n 120.724707,\n 37.987429\n ],\n [\n 120.730787,\n 37.974142\n ],\n [\n 120.736631,\n 37.971146\n ],\n [\n 120.732525,\n 37.961484\n ],\n [\n 120.706465,\n 37.966808\n ],\n [\n 120.696278,\n 37.974024\n ],\n [\n 120.692409,\n 37.983842\n ]\n ]\n ],\n [\n [\n [\n 120.653004,\n 37.980017\n ],\n [\n 120.658611,\n 37.975483\n ],\n [\n 120.653952,\n 37.963969\n ],\n [\n 120.64416,\n 37.964757\n ],\n [\n 120.653004,\n 37.980017\n ]\n ]\n ],\n [\n [\n [\n 120.452584,\n 37.768856\n ],\n [\n 120.443976,\n 37.770991\n ],\n [\n 120.435526,\n 37.786608\n ],\n [\n 120.453136,\n 37.788387\n ],\n [\n 120.463323,\n 37.786054\n ],\n [\n 120.452584,\n 37.768856\n ]\n ]\n ],\n [\n [\n [\n 120.682775,\n 37.92831\n ],\n [\n 120.673536,\n 37.929178\n ],\n [\n 120.679379,\n 37.937147\n ],\n [\n 120.678511,\n 37.944642\n ],\n [\n 120.692804,\n 37.94693\n ],\n [\n 120.687829,\n 37.931308\n ],\n [\n 120.682775,\n 37.92831\n ]\n ]\n ],\n [\n [\n [\n 120.750687,\n 38.150304\n ],\n [\n 120.73821,\n 38.161711\n ],\n [\n 120.738052,\n 38.174688\n ],\n [\n 120.742554,\n 38.198986\n ],\n [\n 120.747607,\n 38.202759\n ],\n [\n 120.753688,\n 38.195291\n ],\n [\n 120.760321,\n 38.176615\n ],\n [\n 120.777694,\n 38.172565\n ],\n [\n 120.787328,\n 38.158682\n ],\n [\n 120.771456,\n 38.156558\n ],\n [\n 120.760479,\n 38.15939\n ],\n [\n 120.750687,\n 38.150304\n ]\n ]\n ],\n [\n [\n [\n 120.91881,\n 38.34511\n ],\n [\n 120.90657,\n 38.349778\n ],\n [\n 120.895277,\n 38.363232\n ],\n [\n 120.900015,\n 38.3719\n ],\n [\n 120.91494,\n 38.373429\n ],\n [\n 120.913993,\n 38.364566\n ],\n [\n 120.921021,\n 38.362997\n ],\n [\n 120.914151,\n 38.354682\n ],\n [\n 120.91881,\n 38.34511\n ]\n ]\n ],\n [\n [\n [\n 120.841342,\n 38.335655\n ],\n [\n 120.842843,\n 38.355898\n ],\n [\n 120.85682,\n 38.343188\n ],\n [\n 120.841342,\n 38.335655\n ]\n ]\n ],\n [\n [\n [\n 120.62655,\n 37.945786\n ],\n [\n 120.604913,\n 37.956712\n ],\n [\n 120.598279,\n 37.970633\n ],\n [\n 120.60207,\n 37.97848\n ],\n [\n 120.614152,\n 37.984512\n ],\n [\n 120.632472,\n 37.978913\n ],\n [\n 120.630972,\n 37.952018\n ],\n [\n 120.62655,\n 37.945786\n ]\n ]\n ],\n [\n [\n [\n 120.903332,\n 38.381742\n ],\n [\n 120.898515,\n 38.386487\n ],\n [\n 120.91573,\n 38.401933\n ],\n [\n 120.931997,\n 38.391231\n ],\n [\n 120.931918,\n 38.382291\n ],\n [\n 120.922126,\n 38.385271\n ],\n [\n 120.903332,\n 38.381742\n ]\n ]\n ],\n [\n [\n [\n 120.802253,\n 38.284041\n ],\n [\n 120.797041,\n 38.288282\n ],\n [\n 120.808492,\n 38.311913\n ],\n [\n 120.816546,\n 38.318075\n ],\n [\n 120.835262,\n 38.320077\n ],\n [\n 120.849871,\n 38.310343\n ],\n [\n 120.84308,\n 38.30057\n ],\n [\n 120.82389,\n 38.297939\n ],\n [\n 120.81552,\n 38.288714\n ],\n [\n 120.802253,\n 38.284041\n ]\n ]\n ],\n [\n [\n [\n 120.943843,\n 38.019907\n ],\n [\n 120.932708,\n 38.026882\n ],\n [\n 120.931287,\n 38.035353\n ],\n [\n 120.94787,\n 38.032398\n ],\n [\n 120.951108,\n 38.02436\n ],\n [\n 120.943843,\n 38.019907\n ]\n ]\n ],\n [\n [\n [\n 119.821394,\n 37.309121\n ],\n [\n 119.818867,\n 37.31656\n ],\n [\n 119.825895,\n 37.315168\n ],\n [\n 119.821394,\n 37.309121\n ]\n ]\n ],\n [\n [\n [\n 121.388668,\n 36.266442\n ],\n [\n 121.391432,\n 36.271926\n ],\n [\n 121.396644,\n 36.264183\n ],\n [\n 121.388668,\n 36.266442\n ]\n ]\n ],\n [\n [\n [\n 120.645818,\n 38.132011\n ],\n [\n 120.637763,\n 38.139171\n ],\n [\n 120.640922,\n 38.148141\n ],\n [\n 120.647318,\n 38.149557\n ],\n [\n 120.653715,\n 38.141532\n ],\n [\n 120.645818,\n 38.132011\n ]\n ]\n ],\n [\n [\n [\n 120.878141,\n 38.026961\n ],\n [\n 120.87672,\n 38.018213\n ],\n [\n 120.872693,\n 38.027552\n ],\n [\n 120.878141,\n 38.026961\n ]\n ]\n ],\n [\n [\n [\n 120.645423,\n 38.05501\n ],\n [\n 120.641238,\n 38.061233\n ],\n [\n 120.644791,\n 38.06966\n ],\n [\n 120.652056,\n 38.069109\n ],\n [\n 120.652767,\n 38.058988\n ],\n [\n 120.645423,\n 38.05501\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 370700,\n \"name\": \"潍坊市\",\n \"center\": [\n 119.107078,\n 36.70925\n ],\n \"centroid\": [\n 119.077723,\n 36.554349\n ],\n \"childrenNum\": 12,\n \"level\": \"city\",\n \"parent\": {\n \"adcode\": 370000\n },\n \"subFeatureIndex\": 6,\n \"acroutes\": [\n 100000,\n 370000\n ]\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 118.467411,\n 36.945484\n ],\n [\n 118.47665,\n 36.957077\n ],\n [\n 118.503736,\n 36.95156\n ],\n [\n 118.503183,\n 36.944285\n ],\n [\n 118.524583,\n 36.945284\n ],\n [\n 118.52711,\n 36.939687\n ],\n [\n 118.537771,\n 36.936769\n ],\n [\n 118.55467,\n 36.938368\n ],\n [\n 118.560751,\n 36.946564\n ],\n [\n 118.557434,\n 36.96539\n ],\n [\n 118.559803,\n 36.977059\n ],\n [\n 118.552301,\n 36.979657\n ],\n [\n 118.553959,\n 37.000233\n ],\n [\n 118.564146,\n 36.99416\n ],\n [\n 118.580493,\n 36.994999\n ],\n [\n 118.566199,\n 36.999034\n ],\n [\n 118.571174,\n 37.004148\n ],\n [\n 118.590206,\n 37.001351\n ],\n [\n 118.583572,\n 37.008422\n ],\n [\n 118.588389,\n 37.017409\n ],\n [\n 118.57149,\n 37.022081\n ],\n [\n 118.545826,\n 37.023519\n ],\n [\n 118.545431,\n 37.038494\n ],\n [\n 118.56004,\n 37.041408\n ],\n [\n 118.557592,\n 37.051469\n ],\n [\n 118.561303,\n 37.063325\n ],\n [\n 118.580414,\n 37.063325\n ],\n [\n 118.591469,\n 37.068474\n ],\n [\n 118.610895,\n 37.063005\n ],\n [\n 118.631901,\n 37.066757\n ],\n [\n 118.632138,\n 37.070429\n ],\n [\n 118.654091,\n 37.076935\n ],\n [\n 118.655512,\n 37.082681\n ],\n [\n 118.665146,\n 37.081763\n ],\n [\n 118.668384,\n 37.091539\n ],\n [\n 118.667041,\n 37.11392\n ],\n [\n 118.673754,\n 37.144309\n ],\n [\n 118.653617,\n 37.149692\n ],\n [\n 118.649195,\n 37.164243\n ],\n [\n 118.64572,\n 37.159579\n ],\n [\n 118.634191,\n 37.163366\n ],\n [\n 118.633638,\n 37.171178\n ],\n [\n 118.645483,\n 37.178153\n ],\n [\n 118.649274,\n 37.189112\n ],\n [\n 118.660408,\n 37.187877\n ],\n [\n 118.668779,\n 37.198436\n ],\n [\n 118.672332,\n 37.215129\n ],\n [\n 118.680624,\n 37.229269\n ],\n [\n 118.709684,\n 37.241256\n ],\n [\n 118.728399,\n 37.252764\n ],\n [\n 118.777991,\n 37.280112\n ],\n [\n 118.821897,\n 37.288788\n ],\n [\n 118.856959,\n 37.293842\n ],\n [\n 119.039928,\n 37.304466\n ],\n [\n 119.045376,\n 37.298935\n ],\n [\n 119.052089,\n 37.276848\n ],\n [\n 119.054142,\n 37.254953\n ],\n [\n 119.066935,\n 37.241814\n ],\n [\n 119.084465,\n 37.239424\n ],\n [\n 119.091336,\n 37.257581\n ],\n [\n 119.108393,\n 37.260328\n ],\n [\n 119.128214,\n 37.254874\n ],\n [\n 119.134294,\n 37.263314\n ],\n [\n 119.135479,\n 37.282102\n ],\n [\n 119.139032,\n 37.288191\n ],\n [\n 119.157748,\n 37.288191\n ],\n [\n 119.16983,\n 37.278599\n ],\n [\n 119.166513,\n 37.27438\n ],\n [\n 119.15759,\n 37.281226\n ],\n [\n 119.142586,\n 37.279475\n ],\n [\n 119.141559,\n 37.262557\n ],\n [\n 119.128451,\n 37.235721\n ],\n [\n 119.136979,\n 37.231181\n ],\n [\n 119.20426,\n 37.280112\n ],\n [\n 119.212788,\n 37.273305\n ],\n [\n 119.190993,\n 37.259452\n ],\n [\n 119.191941,\n 37.254117\n ],\n [\n 119.202365,\n 37.253759\n ],\n [\n 119.204418,\n 37.246313\n ],\n [\n 119.194231,\n 37.221741\n ],\n [\n 119.191941,\n 37.197639\n ],\n [\n 119.205365,\n 37.194292\n ],\n [\n 119.204102,\n 37.21007\n ],\n [\n 119.206945,\n 37.223175\n ],\n [\n 119.222106,\n 37.225007\n ],\n [\n 119.232767,\n 37.221821\n ],\n [\n 119.244533,\n 37.211424\n ],\n [\n 119.261432,\n 37.207998\n ],\n [\n 119.282201,\n 37.21242\n ],\n [\n 119.296336,\n 37.20505\n ],\n [\n 119.298389,\n 37.19736\n ],\n [\n 119.291519,\n 37.177635\n ],\n [\n 119.291756,\n 37.164801\n ],\n [\n 119.297126,\n 37.158781\n ],\n [\n 119.299337,\n 37.142594\n ],\n [\n 119.30826,\n 37.136733\n ],\n [\n 119.320421,\n 37.120501\n ],\n [\n 119.329582,\n 37.115715\n ],\n [\n 119.342296,\n 37.11735\n ],\n [\n 119.351298,\n 37.122894\n ],\n [\n 119.36567,\n 37.126045\n ],\n [\n 119.425528,\n 37.125447\n ],\n [\n 119.445585,\n 37.130831\n ],\n [\n 119.489729,\n 37.13446\n ],\n [\n 119.489965,\n 37.142355\n ],\n [\n 119.479068,\n 37.153399\n ],\n [\n 119.481832,\n 37.155791\n ],\n [\n 119.493282,\n 37.143591\n ],\n [\n 119.493282,\n 37.133383\n ],\n [\n 119.503153,\n 37.128279\n ],\n [\n 119.51942,\n 37.130312\n ],\n [\n 119.576514,\n 37.127561\n ],\n [\n 119.568696,\n 37.100157\n ],\n [\n 119.576198,\n 37.087509\n ],\n [\n 119.559615,\n 37.071786\n ],\n [\n 119.563406,\n 37.058495\n ],\n [\n 119.606048,\n 37.04037\n ],\n [\n 119.613155,\n 37.034101\n ],\n [\n 119.60976,\n 37.013894\n ],\n [\n 119.604548,\n 36.996038\n ],\n [\n 119.598072,\n 36.989406\n ],\n [\n 119.5837,\n 36.950441\n ],\n [\n 119.599968,\n 36.920614\n ],\n [\n 119.599652,\n 36.878253\n ],\n [\n 119.597757,\n 36.857244\n ],\n [\n 119.56767,\n 36.805717\n ],\n [\n 119.563721,\n 36.802753\n ],\n [\n 119.550613,\n 36.80868\n ],\n [\n 119.539162,\n 36.799949\n ],\n [\n 119.539162,\n 36.787732\n ],\n [\n 119.532766,\n 36.78008\n ],\n [\n 119.530555,\n 36.765256\n ],\n [\n 119.534977,\n 36.743333\n ],\n [\n 119.547059,\n 36.725454\n ],\n [\n 119.561036,\n 36.720884\n ],\n [\n 119.567433,\n 36.713065\n ],\n [\n 119.579831,\n 36.711581\n ],\n [\n 119.587412,\n 36.696101\n ],\n [\n 119.596651,\n 36.689884\n ],\n [\n 119.607154,\n 36.667379\n ],\n [\n 119.61355,\n 36.66453\n ],\n [\n 119.617025,\n 36.652532\n ],\n [\n 119.625079,\n 36.638807\n ],\n [\n 119.651297,\n 36.623633\n ],\n [\n 119.670328,\n 36.616246\n ],\n [\n 119.681857,\n 36.606891\n ],\n [\n 119.701125,\n 36.602634\n ],\n [\n 119.730107,\n 36.581027\n ],\n [\n 119.72758,\n 36.562749\n ],\n [\n 119.74748,\n 36.571788\n ],\n [\n 119.755929,\n 36.565521\n ],\n [\n 119.784516,\n 36.554673\n ],\n [\n 119.798019,\n 36.551619\n ],\n [\n 119.826763,\n 36.54101\n ],\n [\n 119.917576,\n 36.525858\n ],\n [\n 119.920261,\n 36.522079\n ],\n [\n 119.923025,\n 36.495464\n ],\n [\n 119.936687,\n 36.496389\n ],\n [\n 119.936292,\n 36.511507\n ],\n [\n 119.951375,\n 36.519788\n ],\n [\n 119.971985,\n 36.522441\n ],\n [\n 119.974749,\n 36.515688\n ],\n [\n 119.997571,\n 36.504431\n ],\n [\n 120.010364,\n 36.509255\n ],\n [\n 120.004204,\n 36.489512\n ],\n [\n 120.010758,\n 36.484445\n ],\n [\n 120.004125,\n 36.477447\n ],\n [\n 120.006889,\n 36.468799\n ],\n [\n 120.012812,\n 36.467833\n ],\n [\n 120.011864,\n 36.454236\n ],\n [\n 119.996623,\n 36.446309\n ],\n [\n 119.994175,\n 36.450333\n ],\n [\n 119.968432,\n 36.450051\n ],\n [\n 119.953981,\n 36.444217\n ],\n [\n 119.949795,\n 36.446511\n ],\n [\n 119.935976,\n 36.427436\n ],\n [\n 119.933923,\n 36.42007\n ],\n [\n 119.925236,\n 36.419346\n ],\n [\n 119.926421,\n 36.403324\n ],\n [\n 119.941425,\n 36.39503\n ],\n [\n 119.945452,\n 36.384682\n ],\n [\n 119.936371,\n 36.380655\n ],\n [\n 119.93029,\n 36.385165\n ],\n [\n 119.909837,\n 36.384359\n ],\n [\n 119.90431,\n 36.38154\n ],\n [\n 119.904784,\n 36.369942\n ],\n [\n 119.895939,\n 36.34827\n ],\n [\n 119.896966,\n 36.334047\n ],\n [\n 119.891991,\n 36.318773\n ],\n [\n 119.865379,\n 36.308898\n ],\n [\n 119.862773,\n 36.302368\n ],\n [\n 119.854402,\n 36.302328\n ],\n [\n 119.848795,\n 36.292692\n ],\n [\n 119.83387,\n 36.278822\n ],\n [\n 119.82929,\n 36.258859\n ],\n [\n 119.820446,\n 36.257367\n ],\n [\n 119.82092,\n 36.244499\n ],\n [\n 119.808048,\n 36.232839\n ],\n [\n 119.819498,\n 36.211856\n ],\n [\n 119.828816,\n 36.210685\n ],\n [\n 119.823131,\n 36.19894\n ],\n [\n 119.831738,\n 36.180612\n ],\n [\n 119.82242,\n 36.177987\n ],\n [\n 119.821315,\n 36.171285\n ],\n [\n 119.81326,\n 36.175242\n ],\n [\n 119.813023,\n 36.167691\n ],\n [\n 119.792333,\n 36.171648\n ],\n [\n 119.782778,\n 36.165308\n ],\n [\n 119.772354,\n 36.167691\n ],\n [\n 119.748111,\n 36.158645\n ],\n [\n 119.733818,\n 36.163572\n ],\n [\n 119.732792,\n 36.172536\n ],\n [\n 119.723473,\n 36.175565\n ],\n [\n 119.691728,\n 36.176292\n ],\n [\n 119.681305,\n 36.18045\n ],\n [\n 119.671039,\n 36.177866\n ],\n [\n 119.660852,\n 36.154122\n ],\n [\n 119.649954,\n 36.137157\n ],\n [\n 119.651218,\n 36.130531\n ],\n [\n 119.643716,\n 36.127178\n ],\n [\n 119.657614,\n 36.108631\n ],\n [\n 119.657061,\n 36.100872\n ],\n [\n 119.632187,\n 36.091535\n ],\n [\n 119.633608,\n 36.067683\n ],\n [\n 119.666695,\n 36.062993\n ],\n [\n 119.675698,\n 36.064085\n ],\n [\n 119.695677,\n 36.053045\n ],\n [\n 119.704126,\n 36.055269\n ],\n [\n 119.717314,\n 36.044229\n ],\n [\n 119.706495,\n 36.028292\n ],\n [\n 119.681068,\n 36.012068\n ],\n [\n 119.689122,\n 36.000212\n ],\n [\n 119.684858,\n 35.982648\n ],\n [\n 119.690149,\n 35.963702\n ],\n [\n 119.701757,\n 35.944469\n ],\n [\n 119.701362,\n 35.923732\n ],\n [\n 119.716208,\n 35.927337\n ],\n [\n 119.721262,\n 35.906718\n ],\n [\n 119.727738,\n 35.902544\n ],\n [\n 119.738003,\n 35.873123\n ],\n [\n 119.736898,\n 35.86303\n ],\n [\n 119.72221,\n 35.865138\n ],\n [\n 119.725211,\n 35.856746\n ],\n [\n 119.71834,\n 35.853138\n ],\n [\n 119.704047,\n 35.863962\n ],\n [\n 119.68699,\n 35.861814\n ],\n [\n 119.676014,\n 35.842515\n ],\n [\n 119.664326,\n 35.841015\n ],\n [\n 119.649796,\n 35.845191\n ],\n [\n 119.629344,\n 35.833878\n ],\n [\n 119.622631,\n 35.816114\n ],\n [\n 119.612445,\n 35.812707\n ],\n [\n 119.60897,\n 35.799279\n ],\n [\n 119.617972,\n 35.789623\n ],\n [\n 119.611576,\n 35.776597\n ],\n [\n 119.596256,\n 35.773756\n ],\n [\n 119.591992,\n 35.753218\n ],\n [\n 119.605495,\n 35.747454\n ],\n [\n 119.627843,\n 35.722077\n ],\n [\n 119.624685,\n 35.712817\n ],\n [\n 119.614182,\n 35.716675\n ],\n [\n 119.601231,\n 35.709446\n ],\n [\n 119.588833,\n 35.715701\n ],\n [\n 119.576988,\n 35.71237\n ],\n [\n 119.566485,\n 35.714523\n ],\n [\n 119.560563,\n 35.721752\n ],\n [\n 119.545085,\n 35.726747\n ],\n [\n 119.527317,\n 35.723214\n ],\n [\n 119.525422,\n 35.730604\n ],\n [\n 119.504101,\n 35.752325\n ],\n [\n 119.48807,\n 35.754599\n ],\n [\n 119.48657,\n 35.771646\n ],\n [\n 119.496599,\n 35.779235\n ],\n [\n 119.493282,\n 35.789866\n ],\n [\n 119.482385,\n 35.799725\n ],\n [\n 119.464696,\n 35.80861\n ],\n [\n 119.455693,\n 35.809056\n ],\n [\n 119.444322,\n 35.804026\n ],\n [\n 119.427739,\n 35.802078\n ],\n [\n 119.397731,\n 35.786823\n ],\n [\n 119.390466,\n 35.778707\n ],\n [\n 119.375857,\n 35.770712\n ],\n [\n 119.368829,\n 35.770834\n ],\n [\n 119.374041,\n 35.816154\n ],\n [\n 119.372382,\n 35.830025\n ],\n [\n 119.358247,\n 35.84511\n ],\n [\n 119.371435,\n 35.860476\n ],\n [\n 119.360695,\n 35.884066\n ],\n [\n 119.345533,\n 35.893792\n ],\n [\n 119.315999,\n 35.887552\n ],\n [\n 119.298153,\n 35.893022\n ],\n [\n 119.294441,\n 35.911336\n ],\n [\n 119.281964,\n 35.910202\n ],\n [\n 119.240427,\n 35.884269\n ],\n [\n 119.217053,\n 35.879527\n ],\n [\n 119.190598,\n 35.879446\n ],\n [\n 119.169119,\n 35.894846\n ],\n [\n 119.161854,\n 35.894481\n ],\n [\n 119.158221,\n 35.882486\n ],\n [\n 119.135637,\n 35.892982\n ],\n [\n 119.144718,\n 35.904449\n ],\n [\n 119.151746,\n 35.905502\n ],\n [\n 119.169672,\n 35.91721\n ],\n [\n 119.183412,\n 35.91875\n ],\n [\n 119.179385,\n 35.926163\n ],\n [\n 119.182623,\n 35.962285\n ],\n [\n 119.178595,\n 35.97107\n ],\n [\n 119.155063,\n 35.965767\n ],\n [\n 119.153246,\n 35.971192\n ],\n [\n 119.134373,\n 35.968601\n ],\n [\n 119.121817,\n 35.962731\n ],\n [\n 119.088888,\n 35.963176\n ],\n [\n 119.07878,\n 35.959289\n ],\n [\n 119.066619,\n 35.963986\n ],\n [\n 119.060538,\n 35.978195\n ],\n [\n 119.05201,\n 35.9803\n ],\n [\n 119.021054,\n 35.977426\n ],\n [\n 119.015606,\n 35.995923\n ],\n [\n 119.024924,\n 36.003571\n ],\n [\n 119.023739,\n 36.011219\n ],\n [\n 119.014105,\n 36.013404\n ],\n [\n 119.017659,\n 36.024044\n ],\n [\n 119.024134,\n 36.02631\n ],\n [\n 119.035584,\n 36.02275\n ],\n [\n 119.047903,\n 36.024813\n ],\n [\n 119.052089,\n 36.037838\n ],\n [\n 119.040322,\n 36.042934\n ],\n [\n 119.042534,\n 36.055512\n ],\n [\n 119.049641,\n 36.066632\n ],\n [\n 119.063539,\n 36.075042\n ],\n [\n 119.066935,\n 36.081631\n ],\n [\n 119.048851,\n 36.092707\n ],\n [\n 119.038506,\n 36.090444\n ],\n [\n 119.020344,\n 36.104307\n ],\n [\n 119.013868,\n 36.09881\n ],\n [\n 119.000523,\n 36.099497\n ],\n [\n 118.988756,\n 36.092343\n ],\n [\n 118.970278,\n 36.09873\n ],\n [\n 118.970041,\n 36.104671\n ],\n [\n 118.958512,\n 36.104145\n ],\n [\n 118.954642,\n 36.1115\n ],\n [\n 118.943271,\n 36.119582\n ],\n [\n 118.936322,\n 36.11344\n ],\n [\n 118.916185,\n 36.111702\n ],\n [\n 118.920765,\n 36.105721\n ],\n [\n 118.908288,\n 36.091292\n ],\n [\n 118.886493,\n 36.088584\n ],\n [\n 118.880886,\n 36.08438\n ],\n [\n 118.875911,\n 36.091535\n ],\n [\n 118.860513,\n 36.101316\n ],\n [\n 118.865961,\n 36.113682\n ],\n [\n 118.860197,\n 36.114733\n ],\n [\n 118.858302,\n 36.129966\n ],\n [\n 118.863908,\n 36.139298\n ],\n [\n 118.858302,\n 36.143256\n ],\n [\n 118.859802,\n 36.16232\n ],\n [\n 118.85459,\n 36.170194\n ],\n [\n 118.846614,\n 36.172092\n ],\n [\n 118.844561,\n 36.18473\n ],\n [\n 118.848746,\n 36.188606\n ],\n [\n 118.847009,\n 36.199263\n ],\n [\n 118.835796,\n 36.203138\n ],\n [\n 118.809026,\n 36.198738\n ],\n [\n 118.802076,\n 36.202855\n ],\n [\n 118.78573,\n 36.197487\n ],\n [\n 118.766383,\n 36.206649\n ],\n [\n 118.745535,\n 36.191754\n ],\n [\n 118.751142,\n 36.183115\n ],\n [\n 118.741824,\n 36.165551\n ],\n [\n 118.733532,\n 36.166802\n ],\n [\n 118.73298,\n 36.1519\n ],\n [\n 118.736454,\n 36.146528\n ],\n [\n 118.72603,\n 36.141035\n ],\n [\n 118.714659,\n 36.154485\n ],\n [\n 118.703761,\n 36.150446\n ],\n [\n 118.701235,\n 36.144509\n ],\n [\n 118.679913,\n 36.152062\n ],\n [\n 118.683388,\n 36.158564\n ],\n [\n 118.675491,\n 36.170194\n ],\n [\n 118.666015,\n 36.168983\n ],\n [\n 118.653143,\n 36.176695\n ],\n [\n 118.644299,\n 36.177018\n ],\n [\n 118.640824,\n 36.171042\n ],\n [\n 118.622109,\n 36.17718\n ],\n [\n 118.606236,\n 36.164218\n ],\n [\n 118.581914,\n 36.151456\n ],\n [\n 118.572201,\n 36.156424\n ],\n [\n 118.563988,\n 36.147094\n ],\n [\n 118.565015,\n 36.130087\n ],\n [\n 118.556881,\n 36.130935\n ],\n [\n 118.541719,\n 36.124996\n ],\n [\n 118.535797,\n 36.118531\n ],\n [\n 118.515502,\n 36.109884\n ],\n [\n 118.509974,\n 36.114612\n ],\n [\n 118.504762,\n 36.105802\n ],\n [\n 118.526716,\n 36.104671\n ],\n [\n 118.529479,\n 36.093879\n ],\n [\n 118.522925,\n 36.084784\n ],\n [\n 118.507842,\n 36.074961\n ],\n [\n 118.496866,\n 36.067683\n ],\n [\n 118.48044,\n 36.074071\n ],\n [\n 118.482099,\n 36.092546\n ],\n [\n 118.478545,\n 36.098245\n ],\n [\n 118.484468,\n 36.104064\n ],\n [\n 118.479493,\n 36.118814\n ],\n [\n 118.492601,\n 36.127057\n ],\n [\n 118.487863,\n 36.131784\n ],\n [\n 118.462594,\n 36.14059\n ],\n [\n 118.457303,\n 36.13247\n ],\n [\n 118.447116,\n 36.140913\n ],\n [\n 118.440956,\n 36.132511\n ],\n [\n 118.428953,\n 36.132672\n ],\n [\n 118.412844,\n 36.127218\n ],\n [\n 118.402183,\n 36.131622\n ],\n [\n 118.405263,\n 36.141641\n ],\n [\n 118.402262,\n 36.162926\n ],\n [\n 118.387653,\n 36.174555\n ],\n [\n 118.374387,\n 36.203097\n ],\n [\n 118.382046,\n 36.207335\n ],\n [\n 118.386548,\n 36.239053\n ],\n [\n 118.379756,\n 36.245265\n ],\n [\n 118.368385,\n 36.248412\n ],\n [\n 118.350775,\n 36.263538\n ],\n [\n 118.31524,\n 36.24938\n ],\n [\n 118.306948,\n 36.252123\n ],\n [\n 118.315003,\n 36.266361\n ],\n [\n 118.31366,\n 36.277371\n ],\n [\n 118.317609,\n 36.288903\n ],\n [\n 118.310107,\n 36.295716\n ],\n [\n 118.315477,\n 36.304464\n ],\n [\n 118.30908,\n 36.307125\n ],\n [\n 118.304105,\n 36.321393\n ],\n [\n 118.291075,\n 36.326189\n ],\n [\n 118.300157,\n 36.338116\n ],\n [\n 118.269912,\n 36.339849\n ],\n [\n 118.261857,\n 36.345852\n ],\n [\n 118.262726,\n 36.352218\n ],\n [\n 118.256093,\n 36.363175\n ],\n [\n 118.239825,\n 36.376748\n ],\n [\n 118.235403,\n 36.389634\n ],\n [\n 118.251592,\n 36.401995\n ],\n [\n 118.250407,\n 36.411214\n ],\n [\n 118.227427,\n 36.408034\n ],\n [\n 118.224427,\n 36.414234\n ],\n [\n 118.228533,\n 36.430736\n ],\n [\n 118.232797,\n 36.432869\n ],\n [\n 118.22719,\n 36.451379\n ],\n [\n 118.233508,\n 36.456609\n ],\n [\n 118.229638,\n 36.467793\n ],\n [\n 118.216135,\n 36.478573\n ],\n [\n 118.212818,\n 36.490075\n ],\n [\n 118.218346,\n 36.497354\n ],\n [\n 118.210528,\n 36.503466\n ],\n [\n 118.213766,\n 36.513075\n ],\n [\n 118.210844,\n 36.526099\n ],\n [\n 118.221663,\n 36.531887\n ],\n [\n 118.214556,\n 36.539322\n ],\n [\n 118.191892,\n 36.546074\n ],\n [\n 118.183916,\n 36.561142\n ],\n [\n 118.180915,\n 36.5607\n ],\n [\n 118.180678,\n 36.577412\n ],\n [\n 118.176967,\n 36.582996\n ],\n [\n 118.180363,\n 36.593599\n ],\n [\n 118.189523,\n 36.599141\n ],\n [\n 118.200657,\n 36.612071\n ],\n [\n 118.214793,\n 36.621144\n ],\n [\n 118.20658,\n 36.637482\n ],\n [\n 118.199631,\n 36.639047\n ],\n [\n 118.215898,\n 36.648921\n ],\n [\n 118.221189,\n 36.664169\n ],\n [\n 118.230191,\n 36.660357\n ],\n [\n 118.226796,\n 36.668382\n ],\n [\n 118.215819,\n 36.668262\n ],\n [\n 118.21653,\n 36.6811\n ],\n [\n 118.228059,\n 36.694016\n ],\n [\n 118.245037,\n 36.690647\n ],\n [\n 118.238246,\n 36.697305\n ],\n [\n 118.227585,\n 36.697625\n ],\n [\n 118.237614,\n 36.712704\n ],\n [\n 118.227743,\n 36.717957\n ],\n [\n 118.234219,\n 36.726457\n ],\n [\n 118.254276,\n 36.731789\n ],\n [\n 118.264147,\n 36.72373\n ],\n [\n 118.277019,\n 36.719801\n ],\n [\n 118.284363,\n 36.72337\n ],\n [\n 118.276151,\n 36.731749\n ],\n [\n 118.27157,\n 36.744015\n ],\n [\n 118.279546,\n 36.753033\n ],\n [\n 118.298183,\n 36.753914\n ],\n [\n 118.297788,\n 36.777677\n ],\n [\n 118.307501,\n 36.776234\n ],\n [\n 118.318161,\n 36.77972\n ],\n [\n 118.321636,\n 36.770905\n ],\n [\n 118.350222,\n 36.768301\n ],\n [\n 118.388522,\n 36.791217\n ],\n [\n 118.419872,\n 36.796304\n ],\n [\n 118.424531,\n 36.802673\n ],\n [\n 118.438666,\n 36.809682\n ],\n [\n 118.44072,\n 36.828142\n ],\n [\n 118.435508,\n 36.838391\n ],\n [\n 118.450038,\n 36.83747\n ],\n [\n 118.453828,\n 36.857564\n ],\n [\n 118.461488,\n 36.854322\n ],\n [\n 118.460462,\n 36.846597\n ],\n [\n 118.480993,\n 36.852641\n ],\n [\n 118.479967,\n 36.860166\n ],\n [\n 118.465042,\n 36.861366\n ],\n [\n 118.476966,\n 36.876893\n ],\n [\n 118.482809,\n 36.879214\n ],\n [\n 118.483046,\n 36.900777\n ],\n [\n 118.474913,\n 36.905297\n ],\n [\n 118.481862,\n 36.914136\n ],\n [\n 118.48968,\n 36.914096\n ],\n [\n 118.496708,\n 36.924733\n ],\n [\n 118.492365,\n 36.931611\n ],\n [\n 118.494339,\n 36.941846\n ],\n [\n 118.467411,\n 36.945484\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 370800,\n \"name\": \"济宁市\",\n \"center\": [\n 116.587245,\n 35.415393\n ],\n \"centroid\": [\n 116.74105,\n 35.371092\n ],\n \"childrenNum\": 11,\n \"level\": \"city\",\n \"parent\": {\n \"adcode\": 370000\n },\n \"subFeatureIndex\": 7,\n \"acroutes\": [\n 100000,\n 370000\n ]\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 117.392342,\n 34.574909\n ],\n [\n 117.363045,\n 34.589241\n ],\n [\n 117.357991,\n 34.582693\n ],\n [\n 117.344014,\n 34.582075\n ],\n [\n 117.325378,\n 34.570996\n ],\n [\n 117.333037,\n 34.56177\n ],\n [\n 117.32135,\n 34.565436\n ],\n [\n 117.294264,\n 34.554025\n ],\n [\n 117.30303,\n 34.548999\n ],\n [\n 117.302477,\n 34.541253\n ],\n [\n 117.285341,\n 34.533012\n ],\n [\n 117.268047,\n 34.532806\n ],\n [\n 117.27547,\n 34.520113\n ],\n [\n 117.269705,\n 34.511664\n ],\n [\n 117.274364,\n 34.503544\n ],\n [\n 117.259282,\n 34.49736\n ],\n [\n 117.267494,\n 34.480003\n ],\n [\n 117.263625,\n 34.472622\n ],\n [\n 117.256044,\n 34.476292\n ],\n [\n 117.252332,\n 34.486518\n ],\n [\n 117.242698,\n 34.478519\n ],\n [\n 117.255096,\n 34.472539\n ],\n [\n 117.255886,\n 34.462023\n ],\n [\n 117.24791,\n 34.451052\n ],\n [\n 117.234644,\n 34.454476\n ],\n [\n 117.222325,\n 34.450599\n ],\n [\n 117.222088,\n 34.445731\n ],\n [\n 117.200214,\n 34.441606\n ],\n [\n 117.199503,\n 34.43451\n ],\n [\n 117.166099,\n 34.434675\n ],\n [\n 117.159861,\n 34.453115\n ],\n [\n 117.156623,\n 34.48091\n ],\n [\n 117.145963,\n 34.503956\n ],\n [\n 117.139803,\n 34.522875\n ],\n [\n 117.140593,\n 34.538699\n ],\n [\n 117.151253,\n 34.559257\n ],\n [\n 117.147621,\n 34.570255\n ],\n [\n 117.133486,\n 34.58607\n ],\n [\n 117.123694,\n 34.604682\n ],\n [\n 117.115244,\n 34.628146\n ],\n [\n 117.103952,\n 34.64897\n ],\n [\n 117.095897,\n 34.64753\n ],\n [\n 117.081525,\n 34.638188\n ],\n [\n 117.072996,\n 34.639094\n ],\n [\n 117.062336,\n 34.657735\n ],\n [\n 117.061704,\n 34.675713\n ],\n [\n 117.072049,\n 34.694181\n ],\n [\n 117.07734,\n 34.696484\n ],\n [\n 117.069048,\n 34.708287\n ],\n [\n 117.070469,\n 34.713714\n ],\n [\n 117.061151,\n 34.723993\n ],\n [\n 117.043225,\n 34.736531\n ],\n [\n 117.021904,\n 34.759219\n ],\n [\n 116.995687,\n 34.758274\n ],\n [\n 116.989685,\n 34.765136\n ],\n [\n 116.978472,\n 34.763616\n ],\n [\n 116.976814,\n 34.771259\n ],\n [\n 116.96789,\n 34.772984\n ],\n [\n 116.965837,\n 34.785063\n ],\n [\n 116.951623,\n 34.794553\n ],\n [\n 116.951149,\n 34.810571\n ],\n [\n 116.971681,\n 34.811885\n ],\n [\n 116.979183,\n 34.814966\n ],\n [\n 116.966074,\n 34.844487\n ],\n [\n 116.92888,\n 34.842886\n ],\n [\n 116.930144,\n 34.859675\n ],\n [\n 116.936303,\n 34.865093\n ],\n [\n 116.951465,\n 34.864313\n ],\n [\n 116.976892,\n 34.868541\n ],\n [\n 116.966943,\n 34.875599\n ],\n [\n 116.945226,\n 34.876789\n ],\n [\n 116.945305,\n 34.873794\n ],\n [\n 116.922168,\n 34.871413\n ],\n [\n 116.922326,\n 34.894515\n ],\n [\n 116.89903,\n 34.904689\n ],\n [\n 116.876129,\n 34.912524\n ],\n [\n 116.858125,\n 34.928355\n ],\n [\n 116.822115,\n 34.929299\n ],\n [\n 116.815877,\n 34.965298\n ],\n [\n 116.80877,\n 34.968823\n ],\n [\n 116.812166,\n 34.927945\n ],\n [\n 116.803874,\n 34.928314\n ],\n [\n 116.803716,\n 34.970339\n ],\n [\n 116.789107,\n 34.975094\n ],\n [\n 116.789107,\n 34.959804\n ],\n [\n 116.781605,\n 34.961895\n ],\n [\n 116.785474,\n 34.9473\n ],\n [\n 116.796925,\n 34.944143\n ],\n [\n 116.797635,\n 34.938771\n ],\n [\n 116.786975,\n 34.940453\n ],\n [\n 116.78121,\n 34.916585\n ],\n [\n 116.756572,\n 34.917487\n ],\n [\n 116.74599,\n 34.915764\n ],\n [\n 116.74528,\n 34.920973\n ],\n [\n 116.720405,\n 34.926141\n ],\n [\n 116.706191,\n 34.933974\n ],\n [\n 116.696951,\n 34.932743\n ],\n [\n 116.677999,\n 34.939182\n ],\n [\n 116.675709,\n 34.933154\n ],\n [\n 116.658415,\n 34.933441\n ],\n [\n 116.657862,\n 34.929012\n ],\n [\n 116.640016,\n 34.932579\n ],\n [\n 116.631803,\n 34.94074\n ],\n [\n 116.622485,\n 34.940043\n ],\n [\n 116.613877,\n 34.922778\n ],\n [\n 116.5601,\n 34.909324\n ],\n [\n 116.546123,\n 34.909406\n ],\n [\n 116.523064,\n 34.903951\n ],\n [\n 116.502769,\n 34.906125\n ],\n [\n 116.500558,\n 34.90112\n ],\n [\n 116.480737,\n 34.897387\n ],\n [\n 116.455784,\n 34.900628\n ],\n [\n 116.445044,\n 34.895418\n ],\n [\n 116.445281,\n 34.888648\n ],\n [\n 116.436042,\n 34.883026\n ],\n [\n 116.409745,\n 34.852944\n ],\n [\n 116.373815,\n 34.86538\n ],\n [\n 116.339543,\n 34.867022\n ],\n [\n 116.325803,\n 34.874943\n ],\n [\n 116.299032,\n 34.877733\n ],\n [\n 116.286713,\n 34.88159\n ],\n [\n 116.266261,\n 34.89751\n ],\n [\n 116.226935,\n 34.911786\n ],\n [\n 116.213826,\n 34.913098\n ],\n [\n 116.201586,\n 34.919702\n ],\n [\n 116.192505,\n 34.939182\n ],\n [\n 116.162181,\n 34.94361\n ],\n [\n 116.155153,\n 34.947259\n ],\n [\n 116.162023,\n 34.957632\n ],\n [\n 116.171499,\n 34.964683\n ],\n [\n 116.170789,\n 34.974684\n ],\n [\n 116.139754,\n 34.995421\n ],\n [\n 116.115748,\n 35.025574\n ],\n [\n 116.114564,\n 35.039828\n ],\n [\n 116.119381,\n 35.053383\n ],\n [\n 116.141413,\n 35.055062\n ],\n [\n 116.140228,\n 35.06018\n ],\n [\n 116.15389,\n 35.088467\n ],\n [\n 116.141018,\n 35.09076\n ],\n [\n 116.154284,\n 35.113513\n ],\n [\n 116.181765,\n 35.11204\n ],\n [\n 116.204903,\n 35.145668\n ],\n [\n 116.214537,\n 35.155606\n ],\n [\n 116.223618,\n 35.173231\n ],\n [\n 116.221881,\n 35.181817\n ],\n [\n 116.213115,\n 35.196697\n ],\n [\n 116.228356,\n 35.194367\n ],\n [\n 116.234516,\n 35.200008\n ],\n [\n 116.234437,\n 35.208264\n ],\n [\n 116.248256,\n 35.195634\n ],\n [\n 116.269104,\n 35.191178\n ],\n [\n 116.284265,\n 35.22506\n ],\n [\n 116.285608,\n 35.242669\n ],\n [\n 116.269656,\n 35.269872\n ],\n [\n 116.265866,\n 35.271547\n ],\n [\n 116.237201,\n 35.261745\n ],\n [\n 116.223539,\n 35.260438\n ],\n [\n 116.215642,\n 35.29131\n ],\n [\n 116.199612,\n 35.304986\n ],\n [\n 116.193452,\n 35.337555\n ],\n [\n 116.201744,\n 35.345185\n ],\n [\n 116.215169,\n 35.350734\n ],\n [\n 116.22117,\n 35.358608\n ],\n [\n 116.223855,\n 35.371702\n ],\n [\n 116.215879,\n 35.393438\n ],\n [\n 116.212642,\n 35.409054\n ],\n [\n 116.215958,\n 35.419857\n ],\n [\n 116.215484,\n 35.435957\n ],\n [\n 116.204429,\n 35.436079\n ],\n [\n 116.20206,\n 35.458247\n ],\n [\n 116.206798,\n 35.465703\n ],\n [\n 116.19669,\n 35.46334\n ],\n [\n 116.188319,\n 35.467781\n ],\n [\n 116.188319,\n 35.477313\n ],\n [\n 116.177817,\n 35.466151\n ],\n [\n 116.178685,\n 35.450342\n ],\n [\n 116.167946,\n 35.452217\n ],\n [\n 116.15689,\n 35.446838\n ],\n [\n 116.160918,\n 35.471569\n ],\n [\n 116.15002,\n 35.469573\n ],\n [\n 116.129567,\n 35.475235\n ],\n [\n 116.128778,\n 35.489614\n ],\n [\n 116.121276,\n 35.497881\n ],\n [\n 116.12554,\n 35.516042\n ],\n [\n 116.123408,\n 35.540589\n ],\n [\n 116.115274,\n 35.566471\n ],\n [\n 116.114327,\n 35.577456\n ],\n [\n 116.125145,\n 35.587871\n ],\n [\n 116.125145,\n 35.59385\n ],\n [\n 116.116222,\n 35.606621\n ],\n [\n 116.115906,\n 35.618414\n ],\n [\n 116.134384,\n 35.638539\n ],\n [\n 116.127514,\n 35.649433\n ],\n [\n 116.121829,\n 35.67459\n ],\n [\n 116.103034,\n 35.687348\n ],\n [\n 116.089847,\n 35.699373\n ],\n [\n 116.079897,\n 35.712452\n ],\n [\n 116.071052,\n 35.719072\n ],\n [\n 116.041518,\n 35.733893\n ],\n [\n 116.026909,\n 35.749687\n ],\n [\n 116.017591,\n 35.756263\n ],\n [\n 115.970289,\n 35.782156\n ],\n [\n 115.945493,\n 35.791976\n ],\n [\n 115.922119,\n 35.799157\n ],\n [\n 115.925988,\n 35.804756\n ],\n [\n 115.911932,\n 35.811733\n ],\n [\n 115.898192,\n 35.805202\n ],\n [\n 115.883583,\n 35.808163\n ],\n [\n 115.877107,\n 35.820657\n ],\n [\n 115.875212,\n 35.835095\n ],\n [\n 115.876002,\n 35.867124\n ],\n [\n 115.876081,\n 35.875069\n ],\n [\n 115.882872,\n 35.879892\n ],\n [\n 115.883267,\n 35.895413\n ],\n [\n 115.88911,\n 35.897561\n ],\n [\n 115.884767,\n 35.909108\n ],\n [\n 115.872369,\n 35.909351\n ],\n [\n 115.875133,\n 35.920168\n ],\n [\n 115.907826,\n 35.926851\n ],\n [\n 115.909958,\n 35.935762\n ],\n [\n 115.906325,\n 35.9454\n ],\n [\n 115.911853,\n 35.960261\n ],\n [\n 115.957654,\n 35.967994\n ],\n [\n 115.985135,\n 35.974107\n ],\n [\n 116.00006,\n 35.974349\n ],\n [\n 116.036069,\n 35.96771\n ],\n [\n 116.048704,\n 35.970301\n ],\n [\n 116.0506,\n 35.981919\n ],\n [\n 116.061892,\n 35.97358\n ],\n [\n 116.065367,\n 35.964714\n ],\n [\n 116.060392,\n 35.956374\n ],\n [\n 116.048704,\n 35.948114\n ],\n [\n 116.05897,\n 35.936167\n ],\n [\n 116.07279,\n 35.940055\n ],\n [\n 116.074606,\n 35.927459\n ],\n [\n 116.086767,\n 35.923246\n ],\n [\n 116.081634,\n 35.914172\n ],\n [\n 116.09261,\n 35.904935\n ],\n [\n 116.126172,\n 35.891037\n ],\n [\n 116.142834,\n 35.895656\n ],\n [\n 116.154284,\n 35.886012\n ],\n [\n 116.161155,\n 35.900397\n ],\n [\n 116.166998,\n 35.90457\n ],\n [\n 116.185398,\n 35.900478\n ],\n [\n 116.190057,\n 35.892536\n ],\n [\n 116.20814,\n 35.886863\n ],\n [\n 116.214774,\n 35.889659\n ],\n [\n 116.218485,\n 35.879811\n ],\n [\n 116.221091,\n 35.892779\n ],\n [\n 116.233963,\n 35.888403\n ],\n [\n 116.230804,\n 35.860963\n ],\n [\n 116.233963,\n 35.851273\n ],\n [\n 116.245808,\n 35.834162\n ],\n [\n 116.250072,\n 35.823536\n ],\n [\n 116.274868,\n 35.803377\n ],\n [\n 116.277395,\n 35.806581\n ],\n [\n 116.304007,\n 35.799401\n ],\n [\n 116.297295,\n 35.795546\n ],\n [\n 116.301875,\n 35.777084\n ],\n [\n 116.309377,\n 35.77404\n ],\n [\n 116.32983,\n 35.787594\n ],\n [\n 116.336621,\n 35.796723\n ],\n [\n 116.355652,\n 35.800537\n ],\n [\n 116.362838,\n 35.795952\n ],\n [\n 116.377921,\n 35.796642\n ],\n [\n 116.385581,\n 35.801754\n ],\n [\n 116.400822,\n 35.794613\n ],\n [\n 116.421196,\n 35.799279\n ],\n [\n 116.428698,\n 35.796398\n ],\n [\n 116.436989,\n 35.807271\n ],\n [\n 116.459811,\n 35.81583\n ],\n [\n 116.459732,\n 35.828241\n ],\n [\n 116.468024,\n 35.836149\n ],\n [\n 116.475841,\n 35.83327\n ],\n [\n 116.486976,\n 35.84138\n ],\n [\n 116.507508,\n 35.84361\n ],\n [\n 116.515325,\n 35.841866\n ],\n [\n 116.520616,\n 35.853057\n ],\n [\n 116.525275,\n 35.847462\n ],\n [\n 116.53641,\n 35.847178\n ],\n [\n 116.549834,\n 35.857517\n ],\n [\n 116.55702,\n 35.890753\n ],\n [\n 116.566023,\n 35.899222\n ],\n [\n 116.595715,\n 35.905056\n ],\n [\n 116.599663,\n 35.916157\n ],\n [\n 116.618536,\n 35.935195\n ],\n [\n 116.62817,\n 35.938556\n ],\n [\n 116.665996,\n 35.940176\n ],\n [\n 116.676973,\n 35.925596\n ],\n [\n 116.672392,\n 35.92118\n ],\n [\n 116.666944,\n 35.898209\n ],\n [\n 116.647518,\n 35.884674\n ],\n [\n 116.62438,\n 35.878068\n ],\n [\n 116.614904,\n 35.865746\n ],\n [\n 116.617036,\n 35.855206\n ],\n [\n 116.641042,\n 35.836879\n ],\n [\n 116.656441,\n 35.828525\n ],\n [\n 116.676736,\n 35.822198\n ],\n [\n 116.686607,\n 35.814005\n ],\n [\n 116.687317,\n 35.798062\n ],\n [\n 116.670497,\n 35.761499\n ],\n [\n 116.662679,\n 35.758252\n ],\n [\n 116.636699,\n 35.764137\n ],\n [\n 116.619563,\n 35.756628\n ],\n [\n 116.614588,\n 35.74924\n ],\n [\n 116.612061,\n 35.71237\n ],\n [\n 116.615615,\n 35.705222\n ],\n [\n 116.627539,\n 35.705791\n ],\n [\n 116.648939,\n 35.713426\n ],\n [\n 116.664969,\n 35.716716\n ],\n [\n 116.68866,\n 35.724838\n ],\n [\n 116.698847,\n 35.72098\n ],\n [\n 116.705322,\n 35.70839\n ],\n [\n 116.733829,\n 35.703435\n ],\n [\n 116.743069,\n 35.703597\n ],\n [\n 116.743069,\n 35.703597\n ],\n [\n 116.762732,\n 35.708309\n ],\n [\n 116.770076,\n 35.703557\n ],\n [\n 116.77742,\n 35.690882\n ],\n [\n 116.795345,\n 35.682188\n ],\n [\n 116.8049,\n 35.686292\n ],\n [\n 116.811376,\n 35.706034\n ],\n [\n 116.8218,\n 35.705222\n ],\n [\n 116.8233,\n 35.696935\n ],\n [\n 116.836882,\n 35.697382\n ],\n [\n 116.861994,\n 35.679059\n ],\n [\n 116.879367,\n 35.685479\n ],\n [\n 116.88071,\n 35.696732\n ],\n [\n 116.897135,\n 35.701851\n ],\n [\n 116.909849,\n 35.699982\n ],\n [\n 116.91814,\n 35.706278\n ],\n [\n 116.930538,\n 35.709406\n ],\n [\n 116.931012,\n 35.713629\n ],\n [\n 116.949649,\n 35.715741\n ],\n [\n 116.954939,\n 35.719072\n ],\n [\n 116.952412,\n 35.737507\n ],\n [\n 116.946253,\n 35.744368\n ],\n [\n 116.952412,\n 35.7561\n ],\n [\n 116.974366,\n 35.760444\n ],\n [\n 116.993397,\n 35.794045\n ],\n [\n 116.991423,\n 35.805973\n ],\n [\n 117.009506,\n 35.807636\n ],\n [\n 117.0268,\n 35.799401\n ],\n [\n 117.049622,\n 35.801307\n ],\n [\n 117.070864,\n 35.790394\n ],\n [\n 117.083815,\n 35.80431\n ],\n [\n 117.097318,\n 35.802687\n ],\n [\n 117.103241,\n 35.790272\n ],\n [\n 117.131275,\n 35.786498\n ],\n [\n 117.137908,\n 35.783374\n ],\n [\n 117.135855,\n 35.774811\n ],\n [\n 117.128353,\n 35.769901\n ],\n [\n 117.135381,\n 35.767303\n ],\n [\n 117.143436,\n 35.771727\n ],\n [\n 117.163651,\n 35.775014\n ],\n [\n 117.175023,\n 35.780209\n ],\n [\n 117.200214,\n 35.775095\n ],\n [\n 117.21806,\n 35.778464\n ],\n [\n 117.226984,\n 35.773959\n ],\n [\n 117.260308,\n 35.771037\n ],\n [\n 117.297581,\n 35.788487\n ],\n [\n 117.306504,\n 35.798833\n ],\n [\n 117.318428,\n 35.793802\n ],\n [\n 117.341013,\n 35.793558\n ],\n [\n 117.343382,\n 35.784267\n ],\n [\n 117.350331,\n 35.782725\n ],\n [\n 117.364467,\n 35.770225\n ],\n [\n 117.379155,\n 35.775785\n ],\n [\n 117.391,\n 35.767141\n ],\n [\n 117.415559,\n 35.775177\n ],\n [\n 117.431195,\n 35.760971\n ],\n [\n 117.440197,\n 35.744571\n ],\n [\n 117.452832,\n 35.742298\n ],\n [\n 117.478733,\n 35.732675\n ],\n [\n 117.488683,\n 35.721102\n ],\n [\n 117.49121,\n 35.707903\n ],\n [\n 117.511031,\n 35.712411\n ],\n [\n 117.530931,\n 35.707131\n ],\n [\n 117.520586,\n 35.697626\n ],\n [\n 117.529431,\n 35.682879\n ],\n [\n 117.576022,\n 35.650206\n ],\n [\n 117.596948,\n 35.630449\n ],\n [\n 117.588893,\n 35.619878\n ],\n [\n 117.585577,\n 35.593972\n ],\n [\n 117.592763,\n 35.589701\n ],\n [\n 117.590394,\n 35.573551\n ],\n [\n 117.593473,\n 35.567448\n ],\n [\n 117.582418,\n 35.554141\n ],\n [\n 117.528641,\n 35.547182\n ],\n [\n 117.515058,\n 35.551008\n ],\n [\n 117.499502,\n 35.550845\n ],\n [\n 117.496264,\n 35.543031\n ],\n [\n 117.50424,\n 35.531675\n ],\n [\n 117.516401,\n 35.527319\n ],\n [\n 117.520033,\n 35.51991\n ],\n [\n 117.513795,\n 35.514576\n ],\n [\n 117.501634,\n 35.512947\n ],\n [\n 117.498396,\n 35.503093\n ],\n [\n 117.481734,\n 35.507898\n ],\n [\n 117.472416,\n 35.514372\n ],\n [\n 117.467441,\n 35.512255\n ],\n [\n 117.462703,\n 35.497922\n ],\n [\n 117.452279,\n 35.490306\n ],\n [\n 117.442171,\n 35.469247\n ],\n [\n 117.42851,\n 35.458614\n ],\n [\n 117.453779,\n 35.442396\n ],\n [\n 117.455833,\n 35.424953\n ],\n [\n 117.467441,\n 35.418186\n ],\n [\n 117.474785,\n 35.400941\n ],\n [\n 117.463334,\n 35.39038\n ],\n [\n 117.463887,\n 35.375617\n ],\n [\n 117.439644,\n 35.359668\n ],\n [\n 117.439012,\n 35.348939\n ],\n [\n 117.446988,\n 35.330292\n ],\n [\n 117.453937,\n 35.325027\n ],\n [\n 117.478891,\n 35.314375\n ],\n [\n 117.463098,\n 35.287472\n ],\n [\n 117.439565,\n 35.282368\n ],\n [\n 117.419191,\n 35.273997\n ],\n [\n 117.406004,\n 35.283348\n ],\n [\n 117.403635,\n 35.301394\n ],\n [\n 117.399528,\n 35.306374\n ],\n [\n 117.359571,\n 35.318375\n ],\n [\n 117.347568,\n 35.315109\n ],\n [\n 117.318034,\n 35.320252\n ],\n [\n 117.308557,\n 35.312579\n ],\n [\n 117.314085,\n 35.302129\n ],\n [\n 117.311163,\n 35.28588\n ],\n [\n 117.305794,\n 35.295229\n ],\n [\n 117.290079,\n 35.299394\n ],\n [\n 117.284472,\n 35.294331\n ],\n [\n 117.262203,\n 35.287472\n ],\n [\n 117.269231,\n 35.261296\n ],\n [\n 117.220824,\n 35.26489\n ],\n [\n 117.204873,\n 35.258518\n ],\n [\n 117.199108,\n 35.24749\n ],\n [\n 117.176681,\n 35.243159\n ],\n [\n 117.152675,\n 35.232047\n ],\n [\n 117.123536,\n 35.23078\n ],\n [\n 117.104899,\n 35.221464\n ],\n [\n 117.092896,\n 35.220361\n ],\n [\n 117.065336,\n 35.22792\n ],\n [\n 117.053333,\n 35.224202\n ],\n [\n 117.028774,\n 35.221219\n ],\n [\n 117.014639,\n 35.214844\n ],\n [\n 116.995687,\n 35.1978\n ],\n [\n 116.969706,\n 35.187377\n ],\n [\n 116.962047,\n 35.177319\n ],\n [\n 116.938277,\n 35.172168\n ],\n [\n 116.925721,\n 35.182266\n ],\n [\n 116.913718,\n 35.178791\n ],\n [\n 116.904716,\n 35.182471\n ],\n [\n 116.898398,\n 35.195757\n ],\n [\n 116.876603,\n 35.188031\n ],\n [\n 116.86618,\n 35.172617\n ],\n [\n 116.85394,\n 35.16861\n ],\n [\n 116.832776,\n 35.184392\n ],\n [\n 116.811218,\n 35.17736\n ],\n [\n 116.81564,\n 35.170777\n ],\n [\n 116.813192,\n 35.159573\n ],\n [\n 116.81793,\n 35.150699\n ],\n [\n 116.825748,\n 35.147631\n ],\n [\n 116.832065,\n 35.123783\n ],\n [\n 116.848649,\n 35.103774\n ],\n [\n 116.863179,\n 35.091496\n ],\n [\n 116.888922,\n 35.093829\n ],\n [\n 116.888212,\n 35.085193\n ],\n [\n 116.900373,\n 35.068737\n ],\n [\n 116.880473,\n 35.062595\n ],\n [\n 116.881183,\n 35.058133\n ],\n [\n 116.900767,\n 35.05977\n ],\n [\n 116.907875,\n 35.046995\n ],\n [\n 116.937172,\n 35.0275\n ],\n [\n 116.951702,\n 35.020618\n ],\n [\n 116.956993,\n 35.01054\n ],\n [\n 116.954466,\n 34.993331\n ],\n [\n 116.943015,\n 34.975627\n ],\n [\n 116.955334,\n 34.967142\n ],\n [\n 116.9671,\n 34.951072\n ],\n [\n 116.980367,\n 34.941027\n ],\n [\n 116.989448,\n 34.93873\n ],\n [\n 117.017719,\n 34.942503\n ],\n [\n 117.038487,\n 34.937869\n ],\n [\n 117.043462,\n 34.932825\n ],\n [\n 117.041093,\n 34.925157\n ],\n [\n 117.05815,\n 34.926961\n ],\n [\n 117.06123,\n 34.930406\n ],\n [\n 117.073707,\n 34.925485\n ],\n [\n 117.082551,\n 34.934917\n ],\n [\n 117.103399,\n 34.937459\n ],\n [\n 117.111059,\n 34.917774\n ],\n [\n 117.110111,\n 34.90514\n ],\n [\n 117.12093,\n 34.903581\n ],\n [\n 117.125826,\n 34.863451\n ],\n [\n 117.139013,\n 34.854052\n ],\n [\n 117.140593,\n 34.846499\n ],\n [\n 117.156623,\n 34.834306\n ],\n [\n 117.17755,\n 34.828722\n ],\n [\n 117.194686,\n 34.816239\n ],\n [\n 117.180314,\n 34.800221\n ],\n [\n 117.172733,\n 34.799194\n ],\n [\n 117.162467,\n 34.782105\n ],\n [\n 117.176523,\n 34.779065\n ],\n [\n 117.180551,\n 34.784201\n ],\n [\n 117.191369,\n 34.780914\n ],\n [\n 117.212927,\n 34.761027\n ],\n [\n 117.22422,\n 34.745533\n ],\n [\n 117.236697,\n 34.746355\n ],\n [\n 117.242067,\n 34.729995\n ],\n [\n 117.253675,\n 34.721444\n ],\n [\n 117.271443,\n 34.726501\n ],\n [\n 117.278787,\n 34.715647\n ],\n [\n 117.304609,\n 34.714866\n ],\n [\n 117.310611,\n 34.717333\n ],\n [\n 117.326167,\n 34.703434\n ],\n [\n 117.324272,\n 34.697307\n ],\n [\n 117.335485,\n 34.692454\n ],\n [\n 117.329247,\n 34.677359\n ],\n [\n 117.346067,\n 34.670982\n ],\n [\n 117.35657,\n 34.661643\n ],\n [\n 117.354201,\n 34.653538\n ],\n [\n 117.366915,\n 34.650246\n ],\n [\n 117.374022,\n 34.636172\n ],\n [\n 117.376707,\n 34.622301\n ],\n [\n 117.384051,\n 34.628228\n ],\n [\n 117.402687,\n 34.628434\n ],\n [\n 117.4109,\n 34.623454\n ],\n [\n 117.407978,\n 34.610651\n ],\n [\n 117.397949,\n 34.604393\n ],\n [\n 117.398976,\n 34.588335\n ],\n [\n 117.393922,\n 34.587676\n ],\n [\n 117.392342,\n 34.574909\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 370900,\n \"name\": \"泰安市\",\n \"center\": [\n 117.129063,\n 36.194968\n ],\n \"centroid\": [\n 117.030947,\n 36.002333\n ],\n \"childrenNum\": 6,\n \"level\": \"city\",\n \"parent\": {\n \"adcode\": 370000\n },\n \"subFeatureIndex\": 8,\n \"acroutes\": [\n 100000,\n 370000\n ]\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 117.596948,\n 35.630449\n ],\n [\n 117.576022,\n 35.650206\n ],\n [\n 117.529431,\n 35.682879\n ],\n [\n 117.520586,\n 35.697626\n ],\n [\n 117.530931,\n 35.707131\n ],\n [\n 117.511031,\n 35.712411\n ],\n [\n 117.49121,\n 35.707903\n ],\n [\n 117.488683,\n 35.721102\n ],\n [\n 117.478733,\n 35.732675\n ],\n [\n 117.452832,\n 35.742298\n ],\n [\n 117.440197,\n 35.744571\n ],\n [\n 117.431195,\n 35.760971\n ],\n [\n 117.415559,\n 35.775177\n ],\n [\n 117.391,\n 35.767141\n ],\n [\n 117.379155,\n 35.775785\n ],\n [\n 117.364467,\n 35.770225\n ],\n [\n 117.350331,\n 35.782725\n ],\n [\n 117.343382,\n 35.784267\n ],\n [\n 117.341013,\n 35.793558\n ],\n [\n 117.318428,\n 35.793802\n ],\n [\n 117.306504,\n 35.798833\n ],\n [\n 117.297581,\n 35.788487\n ],\n [\n 117.260308,\n 35.771037\n ],\n [\n 117.226984,\n 35.773959\n ],\n [\n 117.21806,\n 35.778464\n ],\n [\n 117.200214,\n 35.775095\n ],\n [\n 117.175023,\n 35.780209\n ],\n [\n 117.163651,\n 35.775014\n ],\n [\n 117.143436,\n 35.771727\n ],\n [\n 117.135381,\n 35.767303\n ],\n [\n 117.128353,\n 35.769901\n ],\n [\n 117.135855,\n 35.774811\n ],\n [\n 117.137908,\n 35.783374\n ],\n [\n 117.131275,\n 35.786498\n ],\n [\n 117.103241,\n 35.790272\n ],\n [\n 117.097318,\n 35.802687\n ],\n [\n 117.083815,\n 35.80431\n ],\n [\n 117.070864,\n 35.790394\n ],\n [\n 117.049622,\n 35.801307\n ],\n [\n 117.0268,\n 35.799401\n ],\n [\n 117.009506,\n 35.807636\n ],\n [\n 116.991423,\n 35.805973\n ],\n [\n 116.993397,\n 35.794045\n ],\n [\n 116.974366,\n 35.760444\n ],\n [\n 116.952412,\n 35.7561\n ],\n [\n 116.946253,\n 35.744368\n ],\n [\n 116.952412,\n 35.737507\n ],\n [\n 116.954939,\n 35.719072\n ],\n [\n 116.949649,\n 35.715741\n ],\n [\n 116.931012,\n 35.713629\n ],\n [\n 116.930538,\n 35.709406\n ],\n [\n 116.91814,\n 35.706278\n ],\n [\n 116.909849,\n 35.699982\n ],\n [\n 116.897135,\n 35.701851\n ],\n [\n 116.88071,\n 35.696732\n ],\n [\n 116.879367,\n 35.685479\n ],\n [\n 116.861994,\n 35.679059\n ],\n [\n 116.836882,\n 35.697382\n ],\n [\n 116.8233,\n 35.696935\n ],\n [\n 116.8218,\n 35.705222\n ],\n [\n 116.811376,\n 35.706034\n ],\n [\n 116.8049,\n 35.686292\n ],\n [\n 116.795345,\n 35.682188\n ],\n [\n 116.77742,\n 35.690882\n ],\n [\n 116.770076,\n 35.703557\n ],\n [\n 116.762732,\n 35.708309\n ],\n [\n 116.743069,\n 35.703597\n ],\n [\n 116.743069,\n 35.703597\n ],\n [\n 116.733829,\n 35.703435\n ],\n [\n 116.705322,\n 35.70839\n ],\n [\n 116.698847,\n 35.72098\n ],\n [\n 116.68866,\n 35.724838\n ],\n [\n 116.664969,\n 35.716716\n ],\n [\n 116.648939,\n 35.713426\n ],\n [\n 116.627539,\n 35.705791\n ],\n [\n 116.615615,\n 35.705222\n ],\n [\n 116.612061,\n 35.71237\n ],\n [\n 116.614588,\n 35.74924\n ],\n [\n 116.619563,\n 35.756628\n ],\n [\n 116.636699,\n 35.764137\n ],\n [\n 116.662679,\n 35.758252\n ],\n [\n 116.670497,\n 35.761499\n ],\n [\n 116.687317,\n 35.798062\n ],\n [\n 116.686607,\n 35.814005\n ],\n [\n 116.676736,\n 35.822198\n ],\n [\n 116.656441,\n 35.828525\n ],\n [\n 116.641042,\n 35.836879\n ],\n [\n 116.617036,\n 35.855206\n ],\n [\n 116.614904,\n 35.865746\n ],\n [\n 116.62438,\n 35.878068\n ],\n [\n 116.647518,\n 35.884674\n ],\n [\n 116.666944,\n 35.898209\n ],\n [\n 116.672392,\n 35.92118\n ],\n [\n 116.676973,\n 35.925596\n ],\n [\n 116.665996,\n 35.940176\n ],\n [\n 116.62817,\n 35.938556\n ],\n [\n 116.618536,\n 35.935195\n ],\n [\n 116.599663,\n 35.916157\n ],\n [\n 116.595715,\n 35.905056\n ],\n [\n 116.566023,\n 35.899222\n ],\n [\n 116.55702,\n 35.890753\n ],\n [\n 116.549834,\n 35.857517\n ],\n [\n 116.53641,\n 35.847178\n ],\n [\n 116.525275,\n 35.847462\n ],\n [\n 116.520616,\n 35.853057\n ],\n [\n 116.515325,\n 35.841866\n ],\n [\n 116.507508,\n 35.84361\n ],\n [\n 116.486976,\n 35.84138\n ],\n [\n 116.475841,\n 35.83327\n ],\n [\n 116.468024,\n 35.836149\n ],\n [\n 116.459732,\n 35.828241\n ],\n [\n 116.459811,\n 35.81583\n ],\n [\n 116.436989,\n 35.807271\n ],\n [\n 116.428698,\n 35.796398\n ],\n [\n 116.421196,\n 35.799279\n ],\n [\n 116.400822,\n 35.794613\n ],\n [\n 116.385581,\n 35.801754\n ],\n [\n 116.377921,\n 35.796642\n ],\n [\n 116.362838,\n 35.795952\n ],\n [\n 116.355652,\n 35.800537\n ],\n [\n 116.336621,\n 35.796723\n ],\n [\n 116.32983,\n 35.787594\n ],\n [\n 116.309377,\n 35.77404\n ],\n [\n 116.301875,\n 35.777084\n ],\n [\n 116.297295,\n 35.795546\n ],\n [\n 116.304007,\n 35.799401\n ],\n [\n 116.277395,\n 35.806581\n ],\n [\n 116.274868,\n 35.803377\n ],\n [\n 116.250072,\n 35.823536\n ],\n [\n 116.245808,\n 35.834162\n ],\n [\n 116.233963,\n 35.851273\n ],\n [\n 116.230804,\n 35.860963\n ],\n [\n 116.233963,\n 35.888403\n ],\n [\n 116.221091,\n 35.892779\n ],\n [\n 116.218485,\n 35.879811\n ],\n [\n 116.214774,\n 35.889659\n ],\n [\n 116.20814,\n 35.886863\n ],\n [\n 116.190057,\n 35.892536\n ],\n [\n 116.185398,\n 35.900478\n ],\n [\n 116.166998,\n 35.90457\n ],\n [\n 116.161155,\n 35.900397\n ],\n [\n 116.154284,\n 35.886012\n ],\n [\n 116.142834,\n 35.895656\n ],\n [\n 116.126172,\n 35.891037\n ],\n [\n 116.09261,\n 35.904935\n ],\n [\n 116.081634,\n 35.914172\n ],\n [\n 116.086767,\n 35.923246\n ],\n [\n 116.074606,\n 35.927459\n ],\n [\n 116.07279,\n 35.940055\n ],\n [\n 116.05897,\n 35.936167\n ],\n [\n 116.048704,\n 35.948114\n ],\n [\n 116.060392,\n 35.956374\n ],\n [\n 116.065367,\n 35.964714\n ],\n [\n 116.061892,\n 35.97358\n ],\n [\n 116.0506,\n 35.981919\n ],\n [\n 116.052574,\n 35.99912\n ],\n [\n 116.06284,\n 36.028899\n ],\n [\n 116.073658,\n 36.026148\n ],\n [\n 116.079502,\n 36.042611\n ],\n [\n 116.076106,\n 36.056887\n ],\n [\n 116.087162,\n 36.071403\n ],\n [\n 116.091742,\n 36.089474\n ],\n [\n 116.096875,\n 36.092182\n ],\n [\n 116.099323,\n 36.112066\n ],\n [\n 116.114011,\n 36.122047\n ],\n [\n 116.123882,\n 36.136429\n ],\n [\n 116.164313,\n 36.146084\n ],\n [\n 116.164392,\n 36.168862\n ],\n [\n 116.169446,\n 36.171325\n ],\n [\n 116.213036,\n 36.169831\n ],\n [\n 116.226066,\n 36.173748\n ],\n [\n 116.246677,\n 36.149436\n ],\n [\n 116.261444,\n 36.122693\n ],\n [\n 116.27171,\n 36.109843\n ],\n [\n 116.273368,\n 36.093758\n ],\n [\n 116.267287,\n 36.074233\n ],\n [\n 116.267998,\n 36.052964\n ],\n [\n 116.271552,\n 36.043824\n ],\n [\n 116.294689,\n 36.031407\n ],\n [\n 116.301244,\n 36.031123\n ],\n [\n 116.304718,\n 36.046251\n ],\n [\n 116.310404,\n 36.052196\n ],\n [\n 116.324855,\n 36.054178\n ],\n [\n 116.338753,\n 36.060082\n ],\n [\n 116.352731,\n 36.070797\n ],\n [\n 116.360233,\n 36.084744\n ],\n [\n 116.386845,\n 36.090807\n ],\n [\n 116.398058,\n 36.084582\n ],\n [\n 116.401059,\n 36.074031\n ],\n [\n 116.409508,\n 36.068007\n ],\n [\n 116.427829,\n 36.067441\n ],\n [\n 116.433357,\n 36.059839\n ],\n [\n 116.429566,\n 36.052439\n ],\n [\n 116.436121,\n 36.046534\n ],\n [\n 116.434541,\n 36.038607\n ],\n [\n 116.449387,\n 36.047302\n ],\n [\n 116.452072,\n 36.058019\n ],\n [\n 116.471182,\n 36.06457\n ],\n [\n 116.504112,\n 36.064732\n ],\n [\n 116.532303,\n 36.074274\n ],\n [\n 116.543359,\n 36.086604\n ],\n [\n 116.546597,\n 36.101195\n ],\n [\n 116.554651,\n 36.108187\n ],\n [\n 116.566891,\n 36.108752\n ],\n [\n 116.569024,\n 36.118774\n ],\n [\n 116.562153,\n 36.121643\n ],\n [\n 116.5586,\n 36.133804\n ],\n [\n 116.543122,\n 36.13958\n ],\n [\n 116.525275,\n 36.135298\n ],\n [\n 116.528513,\n 36.145276\n ],\n [\n 116.519748,\n 36.141196\n ],\n [\n 116.507192,\n 36.141277\n ],\n [\n 116.510192,\n 36.148346\n ],\n [\n 116.52188,\n 36.157151\n ],\n [\n 116.525986,\n 36.168297\n ],\n [\n 116.51035,\n 36.176857\n ],\n [\n 116.502059,\n 36.192764\n ],\n [\n 116.481922,\n 36.197002\n ],\n [\n 116.472604,\n 36.21464\n ],\n [\n 116.487529,\n 36.228441\n ],\n [\n 116.485239,\n 36.236067\n ],\n [\n 116.506402,\n 36.240344\n ],\n [\n 116.512325,\n 36.253414\n ],\n [\n 116.525591,\n 36.255229\n ],\n [\n 116.53641,\n 36.245588\n ],\n [\n 116.552361,\n 36.247767\n ],\n [\n 116.558837,\n 36.261037\n ],\n [\n 116.574393,\n 36.263457\n ],\n [\n 116.581264,\n 36.255471\n ],\n [\n 116.587502,\n 36.268862\n ],\n [\n 116.595794,\n 36.270999\n ],\n [\n 116.610403,\n 36.282451\n ],\n [\n 116.615536,\n 36.294587\n ],\n [\n 116.649018,\n 36.295797\n ],\n [\n 116.675709,\n 36.276645\n ],\n [\n 116.686528,\n 36.275435\n ],\n [\n 116.701058,\n 36.280153\n ],\n [\n 116.710376,\n 36.279185\n ],\n [\n 116.732961,\n 36.294144\n ],\n [\n 116.762574,\n 36.305391\n ],\n [\n 116.772761,\n 36.312002\n ],\n [\n 116.786659,\n 36.311357\n ],\n [\n 116.808612,\n 36.299022\n ],\n [\n 116.830644,\n 36.294587\n ],\n [\n 116.855756,\n 36.301642\n ],\n [\n 116.855519,\n 36.289709\n ],\n [\n 116.867759,\n 36.28108\n ],\n [\n 116.873129,\n 36.264062\n ],\n [\n 116.891133,\n 36.255471\n ],\n [\n 116.928722,\n 36.26991\n ],\n [\n 116.932828,\n 36.261925\n ],\n [\n 116.950201,\n 36.257327\n ],\n [\n 116.956835,\n 36.259787\n ],\n [\n 116.975471,\n 36.243208\n ],\n [\n 116.987632,\n 36.250711\n ],\n [\n 117.002794,\n 36.254503\n ],\n [\n 117.003347,\n 36.265353\n ],\n [\n 117.027353,\n 36.268983\n ],\n [\n 117.030275,\n 36.277532\n ],\n [\n 117.0482,\n 36.283701\n ],\n [\n 117.051201,\n 36.288741\n ],\n [\n 117.066995,\n 36.296885\n ],\n [\n 117.074102,\n 36.296724\n ],\n [\n 117.077655,\n 36.307205\n ],\n [\n 117.07734,\n 36.321957\n ],\n [\n 117.088711,\n 36.346013\n ],\n [\n 117.107347,\n 36.338882\n ],\n [\n 117.111691,\n 36.340413\n ],\n [\n 117.137039,\n 36.335135\n ],\n [\n 117.142567,\n 36.345731\n ],\n [\n 117.161361,\n 36.351895\n ],\n [\n 117.179603,\n 36.353144\n ],\n [\n 117.18292,\n 36.360798\n ],\n [\n 117.180945,\n 36.37256\n ],\n [\n 117.191685,\n 36.378762\n ],\n [\n 117.200924,\n 36.389755\n ],\n [\n 117.208742,\n 36.405297\n ],\n [\n 117.218297,\n 36.406182\n ],\n [\n 117.242145,\n 36.41528\n ],\n [\n 117.249726,\n 36.436732\n ],\n [\n 117.263862,\n 36.449206\n ],\n [\n 117.275786,\n 36.451218\n ],\n [\n 117.288973,\n 36.468718\n ],\n [\n 117.288184,\n 36.476039\n ],\n [\n 117.30682,\n 36.472097\n ],\n [\n 117.30682,\n 36.467029\n ],\n [\n 117.335328,\n 36.466345\n ],\n [\n 117.346383,\n 36.46373\n ],\n [\n 117.346936,\n 36.455724\n ],\n [\n 117.339118,\n 36.438181\n ],\n [\n 117.339434,\n 36.425786\n ],\n [\n 117.344962,\n 36.403968\n ],\n [\n 117.35041,\n 36.393379\n ],\n [\n 117.351753,\n 36.377997\n ],\n [\n 117.362729,\n 36.360234\n ],\n [\n 117.387762,\n 36.337915\n ],\n [\n 117.38871,\n 36.326148\n ],\n [\n 117.379707,\n 36.315146\n ],\n [\n 117.38792,\n 36.296361\n ],\n [\n 117.387604,\n 36.285556\n ],\n [\n 117.397791,\n 36.283782\n ],\n [\n 117.394553,\n 36.266522\n ],\n [\n 117.413901,\n 36.267934\n ],\n [\n 117.417217,\n 36.243652\n ],\n [\n 117.392895,\n 36.237439\n ],\n [\n 117.393132,\n 36.226747\n ],\n [\n 117.385235,\n 36.226989\n ],\n [\n 117.396607,\n 36.215972\n ],\n [\n 117.412716,\n 36.210927\n ],\n [\n 117.427878,\n 36.221662\n ],\n [\n 117.447383,\n 36.218313\n ],\n [\n 117.447778,\n 36.203541\n ],\n [\n 117.452437,\n 36.203138\n ],\n [\n 117.440434,\n 36.191189\n ],\n [\n 117.446988,\n 36.18691\n ],\n [\n 117.461202,\n 36.170194\n ],\n [\n 117.475653,\n 36.173102\n ],\n [\n 117.487972,\n 36.15921\n ],\n [\n 117.476601,\n 36.150123\n ],\n [\n 117.469178,\n 36.154687\n ],\n [\n 117.459623,\n 36.1498\n ],\n [\n 117.44683,\n 36.120834\n ],\n [\n 117.463571,\n 36.116875\n ],\n [\n 117.454885,\n 36.111177\n ],\n [\n 117.456148,\n 36.100467\n ],\n [\n 117.447067,\n 36.09206\n ],\n [\n 117.451963,\n 36.087412\n ],\n [\n 117.473758,\n 36.089797\n ],\n [\n 117.484893,\n 36.10075\n ],\n [\n 117.491052,\n 36.096587\n ],\n [\n 117.505898,\n 36.098245\n ],\n [\n 117.534879,\n 36.111419\n ],\n [\n 117.547672,\n 36.106166\n ],\n [\n 117.552884,\n 36.087978\n ],\n [\n 117.561649,\n 36.079327\n ],\n [\n 117.575943,\n 36.074516\n ],\n [\n 117.601844,\n 36.075648\n ],\n [\n 117.630588,\n 36.059879\n ],\n [\n 117.656569,\n 36.049729\n ],\n [\n 117.689972,\n 36.052358\n ],\n [\n 117.701186,\n 36.04528\n ],\n [\n 117.720454,\n 36.038243\n ],\n [\n 117.725824,\n 36.029667\n ],\n [\n 117.741696,\n 36.036058\n ],\n [\n 117.757016,\n 36.019392\n ],\n [\n 117.750304,\n 36.011947\n ],\n [\n 117.756542,\n 36.002236\n ],\n [\n 117.756621,\n 35.991916\n ],\n [\n 117.762307,\n 35.990621\n ],\n [\n 117.781022,\n 35.995437\n ],\n [\n 117.782286,\n 36.007294\n ],\n [\n 117.794763,\n 36.015143\n ],\n [\n 117.801159,\n 36.012959\n ],\n [\n 117.825244,\n 36.013363\n ],\n [\n 117.828719,\n 36.008022\n ],\n [\n 117.841827,\n 36.011947\n ],\n [\n 117.854462,\n 36.006889\n ],\n [\n 117.866386,\n 36.007415\n ],\n [\n 117.877047,\n 36.016357\n ],\n [\n 117.895052,\n 36.020363\n ],\n [\n 117.914557,\n 36.020039\n ],\n [\n 117.922848,\n 36.015467\n ],\n [\n 117.926165,\n 36.005068\n ],\n [\n 117.935088,\n 36.004421\n ],\n [\n 117.937536,\n 35.99653\n ],\n [\n 117.937221,\n 35.98119\n ],\n [\n 117.946065,\n 35.970949\n ],\n [\n 117.947013,\n 35.960382\n ],\n [\n 117.953962,\n 35.957913\n ],\n [\n 117.971414,\n 35.969937\n ],\n [\n 117.992577,\n 35.971273\n ],\n [\n 117.984443,\n 35.956293\n ],\n [\n 117.988471,\n 35.947709\n ],\n [\n 117.997394,\n 35.934587\n ],\n [\n 117.99921,\n 35.925393\n ],\n [\n 117.988234,\n 35.908703\n ],\n [\n 117.981364,\n 35.906191\n ],\n [\n 117.97931,\n 35.889699\n ],\n [\n 117.968097,\n 35.884066\n ],\n [\n 117.960516,\n 35.87057\n ],\n [\n 117.937615,\n 35.874826\n ],\n [\n 117.924586,\n 35.880946\n ],\n [\n 117.906265,\n 35.884634\n ],\n [\n 117.883364,\n 35.882648\n ],\n [\n 117.86686,\n 35.86984\n ],\n [\n 117.85541,\n 35.850219\n ],\n [\n 117.842143,\n 35.84507\n ],\n [\n 117.827376,\n 35.827754\n ],\n [\n 117.828403,\n 35.821792\n ],\n [\n 117.840959,\n 35.812058\n ],\n [\n 117.846092,\n 35.796398\n ],\n [\n 117.831167,\n 35.786661\n ],\n [\n 117.828482,\n 35.773837\n ],\n [\n 117.833694,\n 35.760484\n ],\n [\n 117.837405,\n 35.741445\n ],\n [\n 117.823033,\n 35.739496\n ],\n [\n 117.811504,\n 35.732919\n ],\n [\n 117.781733,\n 35.734096\n ],\n [\n 117.769019,\n 35.726625\n ],\n [\n 117.754173,\n 35.709609\n ],\n [\n 117.732615,\n 35.71237\n ],\n [\n 117.707424,\n 35.726016\n ],\n [\n 117.679154,\n 35.713305\n ],\n [\n 117.663913,\n 35.70969\n ],\n [\n 117.634616,\n 35.709324\n ],\n [\n 117.62585,\n 35.703841\n ],\n [\n 117.605319,\n 35.674834\n ],\n [\n 117.599001,\n 35.649149\n ],\n [\n 117.596948,\n 35.630449\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 371000,\n \"name\": \"威海市\",\n \"center\": [\n 122.116394,\n 37.509691\n ],\n \"centroid\": [\n 122.000809,\n 37.118689\n ],\n \"childrenNum\": 4,\n \"level\": \"city\",\n \"parent\": {\n \"adcode\": 370000\n },\n \"subFeatureIndex\": 9,\n \"acroutes\": [\n 100000,\n 370000\n ]\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 121.923992,\n 37.473096\n ],\n [\n 121.966002,\n 37.489648\n ],\n [\n 121.979111,\n 37.488378\n ],\n [\n 121.996958,\n 37.493974\n ],\n [\n 121.999485,\n 37.506236\n ],\n [\n 122.013225,\n 37.510006\n ],\n [\n 122.017253,\n 37.530914\n ],\n [\n 122.036284,\n 37.529446\n ],\n [\n 122.045207,\n 37.531628\n ],\n [\n 122.053736,\n 37.543448\n ],\n [\n 122.069924,\n 37.537062\n ],\n [\n 122.075215,\n 37.540473\n ],\n [\n 122.074583,\n 37.551816\n ],\n [\n 122.066529,\n 37.562364\n ],\n [\n 122.069529,\n 37.568747\n ],\n [\n 122.088797,\n 37.554116\n ],\n [\n 122.107434,\n 37.550309\n ],\n [\n 122.123148,\n 37.552926\n ],\n [\n 122.119437,\n 37.564227\n ],\n [\n 122.125833,\n 37.56732\n ],\n [\n 122.133572,\n 37.556455\n ],\n [\n 122.150471,\n 37.557129\n ],\n [\n 122.144154,\n 37.550388\n ],\n [\n 122.150708,\n 37.544281\n ],\n [\n 122.171398,\n 37.541147\n ],\n [\n 122.171714,\n 37.534285\n ],\n [\n 122.163106,\n 37.518973\n ],\n [\n 122.15442,\n 37.518219\n ],\n [\n 122.14755,\n 37.51199\n ],\n [\n 122.136336,\n 37.512307\n ],\n [\n 122.131993,\n 37.499371\n ],\n [\n 122.149524,\n 37.493418\n ],\n [\n 122.153946,\n 37.488616\n ],\n [\n 122.148892,\n 37.481948\n ],\n [\n 122.156947,\n 37.459438\n ],\n [\n 122.165712,\n 37.450027\n ],\n [\n 122.167213,\n 37.438073\n ],\n [\n 122.183717,\n 37.431282\n ],\n [\n 122.185849,\n 37.441688\n ],\n [\n 122.194456,\n 37.456222\n ],\n [\n 122.212461,\n 37.455666\n ],\n [\n 122.220595,\n 37.463289\n ],\n [\n 122.233151,\n 37.46051\n ],\n [\n 122.235046,\n 37.469205\n ],\n [\n 122.24089,\n 37.465354\n ],\n [\n 122.252656,\n 37.467855\n ],\n [\n 122.260316,\n 37.46047\n ],\n [\n 122.27682,\n 37.456778\n ],\n [\n 122.286138,\n 37.447287\n ],\n [\n 122.280373,\n 37.442641\n ],\n [\n 122.280216,\n 37.433863\n ],\n [\n 122.285664,\n 37.425403\n ],\n [\n 122.31046,\n 37.423059\n ],\n [\n 122.312355,\n 37.416663\n ],\n [\n 122.336993,\n 37.414438\n ],\n [\n 122.387375,\n 37.42\n ],\n [\n 122.393376,\n 37.415114\n ],\n [\n 122.416751,\n 37.414676\n ],\n [\n 122.437046,\n 37.420358\n ],\n [\n 122.464684,\n 37.42441\n ],\n [\n 122.480952,\n 37.433665\n ],\n [\n 122.489559,\n 37.431917\n ],\n [\n 122.487348,\n 37.420278\n ],\n [\n 122.495245,\n 37.413683\n ],\n [\n 122.513408,\n 37.410703\n ],\n [\n 122.553602,\n 37.406929\n ],\n [\n 122.580293,\n 37.410187\n ],\n [\n 122.595929,\n 37.421152\n ],\n [\n 122.606511,\n 37.424131\n ],\n [\n 122.626648,\n 37.424688\n ],\n [\n 122.643862,\n 37.428064\n ],\n [\n 122.649548,\n 37.419881\n ],\n [\n 122.656655,\n 37.428461\n ],\n [\n 122.665816,\n 37.424251\n ],\n [\n 122.659735,\n 37.421589\n ],\n [\n 122.666526,\n 37.414438\n ],\n [\n 122.675923,\n 37.413326\n ],\n [\n 122.669527,\n 37.42858\n ],\n [\n 122.684847,\n 37.4287\n ],\n [\n 122.688558,\n 37.422423\n ],\n [\n 122.704273,\n 37.414955\n ],\n [\n 122.706958,\n 37.404108\n ],\n [\n 122.715802,\n 37.396121\n ],\n [\n 122.697877,\n 37.384118\n ],\n [\n 122.69456,\n 37.376328\n ],\n [\n 122.680662,\n 37.37438\n ],\n [\n 122.675134,\n 37.383761\n ],\n [\n 122.655629,\n 37.388292\n ],\n [\n 122.641809,\n 37.385867\n ],\n [\n 122.626884,\n 37.36957\n ],\n [\n 122.611486,\n 37.366907\n ],\n [\n 122.594823,\n 37.347981\n ],\n [\n 122.59356,\n 37.336289\n ],\n [\n 122.611486,\n 37.339431\n ],\n [\n 122.610459,\n 37.331119\n ],\n [\n 122.594192,\n 37.319822\n ],\n [\n 122.573897,\n 37.296349\n ],\n [\n 122.581083,\n 37.286957\n ],\n [\n 122.57137,\n 37.279037\n ],\n [\n 122.577056,\n 37.271395\n ],\n [\n 122.567185,\n 37.261164\n ],\n [\n 122.584716,\n 37.258736\n ],\n [\n 122.592454,\n 37.261284\n ],\n [\n 122.590638,\n 37.248065\n ],\n [\n 122.60043,\n 37.242212\n ],\n [\n 122.60043,\n 37.22895\n ],\n [\n 122.604063,\n 37.221462\n ],\n [\n 122.623963,\n 37.212739\n ],\n [\n 122.628859,\n 37.203456\n ],\n [\n 122.624042,\n 37.191144\n ],\n [\n 122.606274,\n 37.193057\n ],\n [\n 122.596877,\n 37.181262\n ],\n [\n 122.57903,\n 37.183493\n ],\n [\n 122.573344,\n 37.17624\n ],\n [\n 122.587243,\n 37.163684\n ],\n [\n 122.586374,\n 37.153519\n ],\n [\n 122.581083,\n 37.147738\n ],\n [\n 122.559762,\n 37.147419\n ],\n [\n 122.533544,\n 37.153359\n ],\n [\n 122.501562,\n 37.148695\n ],\n [\n 122.493113,\n 37.142036\n ],\n [\n 122.484505,\n 37.128877\n ],\n [\n 122.481189,\n 37.117829\n ],\n [\n 122.477951,\n 37.091539\n ],\n [\n 122.481031,\n 37.071786\n ],\n [\n 122.480083,\n 37.06105\n ],\n [\n 122.45963,\n 37.04584\n ],\n [\n 122.461447,\n 37.039532\n ],\n [\n 122.487901,\n 37.034301\n ],\n [\n 122.498641,\n 37.034301\n ],\n [\n 122.524226,\n 37.04033\n ],\n [\n 122.548706,\n 37.05091\n ],\n [\n 122.575634,\n 37.054423\n ],\n [\n 122.585268,\n 37.042965\n ],\n [\n 122.583373,\n 37.037296\n ],\n [\n 122.555971,\n 37.02324\n ],\n [\n 122.544837,\n 37.004587\n ],\n [\n 122.545232,\n 36.990205\n ],\n [\n 122.556919,\n 36.978898\n ],\n [\n 122.557551,\n 36.968707\n ],\n [\n 122.545863,\n 36.956317\n ],\n [\n 122.546574,\n 36.923494\n ],\n [\n 122.542468,\n 36.913536\n ],\n [\n 122.532123,\n 36.901457\n ],\n [\n 122.516408,\n 36.890256\n ],\n [\n 122.497061,\n 36.886095\n ],\n [\n 122.484663,\n 36.891536\n ],\n [\n 122.485453,\n 36.903777\n ],\n [\n 122.492639,\n 36.912176\n ],\n [\n 122.483005,\n 36.914056\n ],\n [\n 122.434124,\n 36.914256\n ],\n [\n 122.428833,\n 36.908856\n ],\n [\n 122.446601,\n 36.898217\n ],\n [\n 122.454498,\n 36.878813\n ],\n [\n 122.464448,\n 36.879294\n ],\n [\n 122.457025,\n 36.86913\n ],\n [\n 122.445732,\n 36.873052\n ],\n [\n 122.416119,\n 36.859485\n ],\n [\n 122.403326,\n 36.860686\n ],\n [\n 122.392587,\n 36.866209\n ],\n [\n 122.3839,\n 36.865368\n ],\n [\n 122.386506,\n 36.860046\n ],\n [\n 122.378373,\n 36.844275\n ],\n [\n 122.350655,\n 36.835228\n ],\n [\n 122.342758,\n 36.828502\n ],\n [\n 122.335414,\n 36.83767\n ],\n [\n 122.32657,\n 36.830424\n ],\n [\n 122.298141,\n 36.83707\n ],\n [\n 122.280452,\n 36.835829\n ],\n [\n 122.263869,\n 36.841633\n ],\n [\n 122.250603,\n 36.839912\n ],\n [\n 122.245865,\n 36.835428\n ],\n [\n 122.220437,\n 36.848919\n ],\n [\n 122.196115,\n 36.842874\n ],\n [\n 122.174714,\n 36.842474\n ],\n [\n 122.17203,\n 36.852441\n ],\n [\n 122.181427,\n 36.856323\n ],\n [\n 122.188534,\n 36.866209\n ],\n [\n 122.175662,\n 36.894537\n ],\n [\n 122.164291,\n 36.892536\n ],\n [\n 122.155999,\n 36.883055\n ],\n [\n 122.119674,\n 36.892096\n ],\n [\n 122.117463,\n 36.895737\n ],\n [\n 122.127176,\n 36.918535\n ],\n [\n 122.14139,\n 36.938288\n ],\n [\n 122.136731,\n 36.944325\n ],\n [\n 122.12765,\n 36.945484\n ],\n [\n 122.112409,\n 36.939607\n ],\n [\n 122.106486,\n 36.941686\n ],\n [\n 122.0993,\n 36.93289\n ],\n [\n 122.100801,\n 36.921934\n ],\n [\n 122.09322,\n 36.914136\n ],\n [\n 122.073636,\n 36.914376\n ],\n [\n 122.051998,\n 36.904977\n ],\n [\n 122.05342,\n 36.895697\n ],\n [\n 122.046234,\n 36.891176\n ],\n [\n 122.042522,\n 36.872011\n ],\n [\n 122.037784,\n 36.875492\n ],\n [\n 122.03731,\n 36.895817\n ],\n [\n 122.025307,\n 36.908856\n ],\n [\n 122.022464,\n 36.942006\n ],\n [\n 122.013936,\n 36.959994\n ],\n [\n 121.994668,\n 36.953719\n ],\n [\n 121.98306,\n 36.958436\n ],\n [\n 121.977611,\n 36.947163\n ],\n [\n 121.964818,\n 36.938128\n ],\n [\n 121.927545,\n 36.932371\n ],\n [\n 121.897616,\n 36.921694\n ],\n [\n 121.870846,\n 36.915736\n ],\n [\n 121.862791,\n 36.909256\n ],\n [\n 121.829388,\n 36.898057\n ],\n [\n 121.816121,\n 36.891856\n ],\n [\n 121.790457,\n 36.884255\n ],\n [\n 121.767714,\n 36.874852\n ],\n [\n 121.76195,\n 36.866049\n ],\n [\n 121.763766,\n 36.85084\n ],\n [\n 121.757606,\n 36.841753\n ],\n [\n 121.73818,\n 36.835068\n ],\n [\n 121.726256,\n 36.82626\n ],\n [\n 121.718517,\n 36.829223\n ],\n [\n 121.70683,\n 36.822296\n ],\n [\n 121.670742,\n 36.817651\n ],\n [\n 121.64176,\n 36.805757\n ],\n [\n 121.628494,\n 36.797306\n ],\n [\n 121.628968,\n 36.783245\n ],\n [\n 121.634416,\n 36.766858\n ],\n [\n 121.653527,\n 36.72798\n ],\n [\n 121.651473,\n 36.723851\n ],\n [\n 121.620834,\n 36.737241\n ],\n [\n 121.606067,\n 36.738122\n ],\n [\n 121.599671,\n 36.745578\n ],\n [\n 121.60125,\n 36.763412\n ],\n [\n 121.586009,\n 36.756399\n ],\n [\n 121.570531,\n 36.766257\n ],\n [\n 121.556317,\n 36.764294\n ],\n [\n 121.574638,\n 36.745538\n ],\n [\n 121.574322,\n 36.737\n ],\n [\n 121.565477,\n 36.728822\n ],\n [\n 121.542024,\n 36.734595\n ],\n [\n 121.531995,\n 36.731027\n ],\n [\n 121.532153,\n 36.736198\n ],\n [\n 121.546051,\n 36.741971\n ],\n [\n 121.547394,\n 36.74642\n ],\n [\n 121.53239,\n 36.753273\n ],\n [\n 121.520466,\n 36.749386\n ],\n [\n 121.517702,\n 36.761088\n ],\n [\n 121.507594,\n 36.760928\n ],\n [\n 121.505857,\n 36.770665\n ],\n [\n 121.482245,\n 36.77355\n ],\n [\n 121.481061,\n 36.780401\n ],\n [\n 121.496302,\n 36.792379\n ],\n [\n 121.528205,\n 36.805637\n ],\n [\n 121.546051,\n 36.806558\n ],\n [\n 121.554027,\n 36.81709\n ],\n [\n 121.569979,\n 36.827501\n ],\n [\n 121.565083,\n 36.830504\n ],\n [\n 121.539339,\n 36.823417\n ],\n [\n 121.530179,\n 36.818772\n ],\n [\n 121.522914,\n 36.80824\n ],\n [\n 121.506962,\n 36.803834\n ],\n [\n 121.480271,\n 36.784487\n ],\n [\n 121.478218,\n 36.770825\n ],\n [\n 121.462424,\n 36.784888\n ],\n [\n 121.450184,\n 36.790056\n ],\n [\n 121.417334,\n 36.792739\n ],\n [\n 121.409121,\n 36.790176\n ],\n [\n 121.395855,\n 36.794342\n ],\n [\n 121.396802,\n 36.803834\n ],\n [\n 121.376665,\n 36.830384\n ],\n [\n 121.373428,\n 36.840593\n ],\n [\n 121.36174,\n 36.841273\n ],\n [\n 121.357239,\n 36.852401\n ],\n [\n 121.357397,\n 36.864048\n ],\n [\n 121.363873,\n 36.871651\n ],\n [\n 121.385431,\n 36.877333\n ],\n [\n 121.36482,\n 36.897417\n ],\n [\n 121.366557,\n 36.903617\n ],\n [\n 121.360951,\n 36.921494\n ],\n [\n 121.347605,\n 36.920574\n ],\n [\n 121.312938,\n 36.904097\n ],\n [\n 121.308358,\n 36.905177\n ],\n [\n 121.304173,\n 36.918335\n ],\n [\n 121.282615,\n 36.918535\n ],\n [\n 121.272191,\n 36.927532\n ],\n [\n 121.263189,\n 36.926093\n ],\n [\n 121.252607,\n 36.938088\n ],\n [\n 121.248501,\n 36.953679\n ],\n [\n 121.233734,\n 36.956917\n ],\n [\n 121.22639,\n 36.971065\n ],\n [\n 121.222915,\n 36.986649\n ],\n [\n 121.209096,\n 36.985371\n ],\n [\n 121.19038,\n 36.996558\n ],\n [\n 121.182404,\n 36.99456\n ],\n [\n 121.177587,\n 37.003748\n ],\n [\n 121.181299,\n 37.016131\n ],\n [\n 121.194565,\n 37.019485\n ],\n [\n 121.19496,\n 37.027273\n ],\n [\n 121.188564,\n 37.029948\n ],\n [\n 121.188011,\n 37.041169\n ],\n [\n 121.192512,\n 37.052108\n ],\n [\n 121.191407,\n 37.072026\n ],\n [\n 121.204279,\n 37.07897\n ],\n [\n 121.243131,\n 37.092138\n ],\n [\n 121.246368,\n 37.102631\n ],\n [\n 121.26153,\n 37.117989\n ],\n [\n 121.287827,\n 37.136055\n ],\n [\n 121.306542,\n 37.141996\n ],\n [\n 121.314044,\n 37.141079\n ],\n [\n 121.317992,\n 37.132825\n ],\n [\n 121.326916,\n 37.12768\n ],\n [\n 121.34113,\n 37.127002\n ],\n [\n 121.348316,\n 37.135975\n ],\n [\n 121.358187,\n 37.140282\n ],\n [\n 121.363715,\n 37.129236\n ],\n [\n 121.351475,\n 37.126962\n ],\n [\n 121.369795,\n 37.110889\n ],\n [\n 121.376823,\n 37.115915\n ],\n [\n 121.382746,\n 37.112125\n ],\n [\n 121.391432,\n 37.098282\n ],\n [\n 121.427363,\n 37.100796\n ],\n [\n 121.441656,\n 37.12106\n ],\n [\n 121.447578,\n 37.123333\n ],\n [\n 121.465425,\n 37.12086\n ],\n [\n 121.49946,\n 37.104426\n ],\n [\n 121.547868,\n 37.104945\n ],\n [\n 121.574954,\n 37.110091\n ],\n [\n 121.580323,\n 37.10674\n ],\n [\n 121.589168,\n 37.116712\n ],\n [\n 121.590352,\n 37.128518\n ],\n [\n 121.585377,\n 37.132306\n ],\n [\n 121.590747,\n 37.144269\n ],\n [\n 121.600539,\n 37.141079\n ],\n [\n 121.612147,\n 37.125846\n ],\n [\n 121.625414,\n 37.131908\n ],\n [\n 121.628889,\n 37.137969\n ],\n [\n 121.638839,\n 37.139524\n ],\n [\n 121.639865,\n 37.131908\n ],\n [\n 121.654316,\n 37.121897\n ],\n [\n 121.666714,\n 37.12082\n ],\n [\n 121.669162,\n 37.110649\n ],\n [\n 121.678007,\n 37.121658\n ],\n [\n 121.683692,\n 37.123014\n ],\n [\n 121.682271,\n 37.13127\n ],\n [\n 121.688983,\n 37.133503\n ],\n [\n 121.683455,\n 37.141917\n ],\n [\n 121.694037,\n 37.141239\n ],\n [\n 121.699328,\n 37.125926\n ],\n [\n 121.733995,\n 37.125607\n ],\n [\n 121.737706,\n 37.136175\n ],\n [\n 121.747656,\n 37.135776\n ],\n [\n 121.767872,\n 37.170979\n ],\n [\n 121.761002,\n 37.177954\n ],\n [\n 121.753895,\n 37.172493\n ],\n [\n 121.749315,\n 37.176439\n ],\n [\n 121.760686,\n 37.178831\n ],\n [\n 121.759738,\n 37.19222\n ],\n [\n 121.769057,\n 37.196364\n ],\n [\n 121.761634,\n 37.217997\n ],\n [\n 121.754527,\n 37.212022\n ],\n [\n 121.755632,\n 37.220506\n ],\n [\n 121.748525,\n 37.223255\n ],\n [\n 121.74813,\n 37.241575\n ],\n [\n 121.757211,\n 37.247667\n ],\n [\n 121.7749,\n 37.248225\n ],\n [\n 121.778296,\n 37.260487\n ],\n [\n 121.784692,\n 37.268409\n ],\n [\n 121.792431,\n 37.288469\n ],\n [\n 121.790615,\n 37.299532\n ],\n [\n 121.794879,\n 37.30375\n ],\n [\n 121.815253,\n 37.300447\n ],\n [\n 121.822281,\n 37.303988\n ],\n [\n 121.834047,\n 37.318311\n ],\n [\n 121.859396,\n 37.329249\n ],\n [\n 121.865239,\n 37.336727\n ],\n [\n 121.870293,\n 37.368894\n ],\n [\n 121.882454,\n 37.381694\n ],\n [\n 121.90038,\n 37.391232\n ],\n [\n 121.908435,\n 37.400969\n ],\n [\n 121.91878,\n 37.420755\n ],\n [\n 121.920438,\n 37.429931\n ],\n [\n 121.933941,\n 37.452529\n ],\n [\n 121.929519,\n 37.454713\n ],\n [\n 121.92944,\n 37.460868\n ],\n [\n 121.923992,\n 37.473096\n ]\n ]\n ],\n [\n [\n [\n 122.183559,\n 37.49957\n ],\n [\n 122.171951,\n 37.501792\n ],\n [\n 122.184901,\n 37.5156\n ],\n [\n 122.188218,\n 37.510165\n ],\n [\n 122.199747,\n 37.510323\n ],\n [\n 122.202748,\n 37.501951\n ],\n [\n 122.216173,\n 37.497824\n ],\n [\n 122.183559,\n 37.49957\n ]\n ]\n ],\n [\n [\n [\n 122.257631,\n 36.755638\n ],\n [\n 122.267028,\n 36.754195\n ],\n [\n 122.260316,\n 36.748704\n ],\n [\n 122.257631,\n 36.755638\n ]\n ]\n ],\n [\n [\n [\n 121.484614,\n 36.732871\n ],\n [\n 121.492274,\n 36.740207\n ],\n [\n 121.499776,\n 36.73712\n ],\n [\n 121.484614,\n 36.732871\n ]\n ]\n ],\n [\n [\n [\n 121.620834,\n 36.713827\n ],\n [\n 121.623124,\n 36.728702\n ],\n [\n 121.631179,\n 36.725855\n ],\n [\n 121.620834,\n 36.713827\n ]\n ]\n ],\n [\n [\n [\n 122.482215,\n 37.447089\n ],\n [\n 122.483479,\n 37.454991\n ],\n [\n 122.490586,\n 37.449829\n ],\n [\n 122.482215,\n 37.447089\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 371100,\n \"name\": \"日照市\",\n \"center\": [\n 119.461208,\n 35.428588\n ],\n \"centroid\": [\n 119.146499,\n 35.578656\n ],\n \"childrenNum\": 4,\n \"level\": \"city\",\n \"parent\": {\n \"adcode\": 370000\n },\n \"subFeatureIndex\": 10,\n \"acroutes\": [\n 100000,\n 370000\n ]\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 119.662115,\n 35.589294\n ],\n [\n 119.665748,\n 35.570255\n ],\n [\n 119.649875,\n 35.537658\n ],\n [\n 119.639215,\n 35.509446\n ],\n [\n 119.628712,\n 35.500854\n ],\n [\n 119.618999,\n 35.459469\n ],\n [\n 119.612997,\n 35.449813\n ],\n [\n 119.600205,\n 35.443537\n ],\n [\n 119.592545,\n 35.43339\n ],\n [\n 119.579673,\n 35.406527\n ],\n [\n 119.578804,\n 35.385568\n ],\n [\n 119.588991,\n 35.376106\n ],\n [\n 119.586938,\n 35.36387\n ],\n [\n 119.57912,\n 35.357629\n ],\n [\n 119.543743,\n 35.34796\n ],\n [\n 119.539794,\n 35.329802\n ],\n [\n 119.552745,\n 35.330006\n ],\n [\n 119.552113,\n 35.324456\n ],\n [\n 119.53861,\n 35.320456\n ],\n [\n 119.538452,\n 35.29674\n ],\n [\n 119.528502,\n 35.303721\n ],\n [\n 119.520447,\n 35.303803\n ],\n [\n 119.516025,\n 35.318089\n ],\n [\n 119.502442,\n 35.321721\n ],\n [\n 119.476541,\n 35.308334\n ],\n [\n 119.451113,\n 35.28539\n ],\n [\n 119.42458,\n 35.255332\n ],\n [\n 119.411313,\n 35.231638\n ],\n [\n 119.397652,\n 35.166893\n ],\n [\n 119.416604,\n 35.167465\n ],\n [\n 119.416999,\n 35.158183\n ],\n [\n 119.396073,\n 35.157815\n ],\n [\n 119.393546,\n 35.143582\n ],\n [\n 119.397731,\n 35.137692\n ],\n [\n 119.418973,\n 35.128283\n ],\n [\n 119.428292,\n 35.121205\n ],\n [\n 119.432398,\n 35.111385\n ],\n [\n 119.426633,\n 35.108234\n ],\n [\n 119.412893,\n 35.11073\n ],\n [\n 119.403259,\n 35.106802\n ],\n [\n 119.396467,\n 35.091701\n ],\n [\n 119.386518,\n 35.088918\n ],\n [\n 119.374041,\n 35.078685\n ],\n [\n 119.360379,\n 35.075655\n ],\n [\n 119.350508,\n 35.083883\n ],\n [\n 119.305812,\n 35.076679\n ],\n [\n 119.301785,\n 35.093174\n ],\n [\n 119.286702,\n 35.11515\n ],\n [\n 119.267276,\n 35.117154\n ],\n [\n 119.25551,\n 35.122637\n ],\n [\n 119.240743,\n 35.122923\n ],\n [\n 119.220685,\n 35.10717\n ],\n [\n 119.203233,\n 35.110894\n ],\n [\n 119.196679,\n 35.129919\n ],\n [\n 119.189967,\n 35.138101\n ],\n [\n 119.174252,\n 35.139042\n ],\n [\n 119.164223,\n 35.143173\n ],\n [\n 119.163433,\n 35.154134\n ],\n [\n 119.173146,\n 35.1617\n ],\n [\n 119.164855,\n 35.166525\n ],\n [\n 119.157274,\n 35.18243\n ],\n [\n 119.149219,\n 35.189298\n ],\n [\n 119.1354,\n 35.191669\n ],\n [\n 119.139032,\n 35.202338\n ],\n [\n 119.161301,\n 35.204136\n ],\n [\n 119.170225,\n 35.21231\n ],\n [\n 119.174568,\n 35.230331\n ],\n [\n 119.182149,\n 35.241852\n ],\n [\n 119.181991,\n 35.25231\n ],\n [\n 119.187519,\n 35.258192\n ],\n [\n 119.179543,\n 35.287595\n ],\n [\n 119.164065,\n 35.289554\n ],\n [\n 119.155931,\n 35.293882\n ],\n [\n 119.157669,\n 35.301721\n ],\n [\n 119.143218,\n 35.314048\n ],\n [\n 119.141322,\n 35.320823\n ],\n [\n 119.148193,\n 35.326741\n ],\n [\n 119.146455,\n 35.334862\n ],\n [\n 119.133741,\n 35.335596\n ],\n [\n 119.105708,\n 35.330659\n ],\n [\n 119.096153,\n 35.326864\n ],\n [\n 119.087229,\n 35.340575\n ],\n [\n 119.085571,\n 35.354243\n ],\n [\n 119.078385,\n 35.357506\n ],\n [\n 119.075542,\n 35.366113\n ],\n [\n 119.06575,\n 35.364563\n ],\n [\n 119.04893,\n 35.371498\n ],\n [\n 119.044587,\n 35.377004\n ],\n [\n 119.024371,\n 35.386873\n ],\n [\n 118.999654,\n 35.388953\n ],\n [\n 118.984413,\n 35.382224\n ],\n [\n 118.98852,\n 35.36697\n ],\n [\n 118.986861,\n 35.353141\n ],\n [\n 118.973042,\n 35.340167\n ],\n [\n 118.961828,\n 35.334168\n ],\n [\n 118.947219,\n 35.336943\n ],\n [\n 118.930478,\n 35.331271\n ],\n [\n 118.923213,\n 35.339187\n ],\n [\n 118.92195,\n 35.348408\n ],\n [\n 118.904814,\n 35.355507\n ],\n [\n 118.889573,\n 35.357261\n ],\n [\n 118.871015,\n 35.367215\n ],\n [\n 118.874174,\n 35.388464\n ],\n [\n 118.865725,\n 35.391685\n ],\n [\n 118.859644,\n 35.381694\n ],\n [\n 118.84314,\n 35.370804\n ],\n [\n 118.816764,\n 35.373292\n ],\n [\n 118.797575,\n 35.369417\n ],\n [\n 118.784151,\n 35.371049\n ],\n [\n 118.776412,\n 35.37627\n ],\n [\n 118.768989,\n 35.368031\n ],\n [\n 118.739455,\n 35.359505\n ],\n [\n 118.723898,\n 35.368479\n ],\n [\n 118.712527,\n 35.363544\n ],\n [\n 118.709605,\n 35.369825\n ],\n [\n 118.696891,\n 35.379818\n ],\n [\n 118.682914,\n 35.368642\n ],\n [\n 118.652274,\n 35.373578\n ],\n [\n 118.632059,\n 35.368438\n ],\n [\n 118.625425,\n 35.370315\n ],\n [\n 118.624952,\n 35.387036\n ],\n [\n 118.606157,\n 35.390747\n ],\n [\n 118.601419,\n 35.414517\n ],\n [\n 118.619029,\n 35.423118\n ],\n [\n 118.635691,\n 35.421039\n ],\n [\n 118.642246,\n 35.425156\n ],\n [\n 118.632611,\n 35.430903\n ],\n [\n 118.6289,\n 35.449324\n ],\n [\n 118.64801,\n 35.453276\n ],\n [\n 118.651011,\n 35.458614\n ],\n [\n 118.662066,\n 35.461547\n ],\n [\n 118.667831,\n 35.456821\n ],\n [\n 118.693575,\n 35.459103\n ],\n [\n 118.698234,\n 35.455436\n ],\n [\n 118.709131,\n 35.457677\n ],\n [\n 118.723898,\n 35.468758\n ],\n [\n 118.734322,\n 35.48607\n ],\n [\n 118.725004,\n 35.496578\n ],\n [\n 118.698865,\n 35.513558\n ],\n [\n 118.696575,\n 35.528622\n ],\n [\n 118.725083,\n 35.553205\n ],\n [\n 118.724056,\n 35.562972\n ],\n [\n 118.734875,\n 35.569767\n ],\n [\n 118.74056,\n 35.581484\n ],\n [\n 118.735822,\n 35.593443\n ],\n [\n 118.739692,\n 35.62496\n ],\n [\n 118.751458,\n 35.640409\n ],\n [\n 118.76662,\n 35.653539\n ],\n [\n 118.791416,\n 35.68296\n ],\n [\n 118.794101,\n 35.697504\n ],\n [\n 118.806499,\n 35.718056\n ],\n [\n 118.804209,\n 35.728655\n ],\n [\n 118.798918,\n 35.730117\n ],\n [\n 118.757223,\n 35.725935\n ],\n [\n 118.743482,\n 35.729346\n ],\n [\n 118.722161,\n 35.73101\n ],\n [\n 118.707078,\n 35.738075\n ],\n [\n 118.703288,\n 35.745221\n ],\n [\n 118.706525,\n 35.765152\n ],\n [\n 118.702182,\n 35.772295\n ],\n [\n 118.700603,\n 35.791367\n ],\n [\n 118.716712,\n 35.80723\n ],\n [\n 118.724609,\n 35.820454\n ],\n [\n 118.722082,\n 35.834932\n ],\n [\n 118.732822,\n 35.848111\n ],\n [\n 118.7498,\n 35.849489\n ],\n [\n 118.75438,\n 35.853544\n ],\n [\n 118.756038,\n 35.877379\n ],\n [\n 118.765198,\n 35.898331\n ],\n [\n 118.777281,\n 35.896791\n ],\n [\n 118.775148,\n 35.917251\n ],\n [\n 118.805709,\n 35.923854\n ],\n [\n 118.80413,\n 35.939731\n ],\n [\n 118.813922,\n 35.948761\n ],\n [\n 118.837217,\n 35.948883\n ],\n [\n 118.883571,\n 35.957305\n ],\n [\n 118.893047,\n 35.963257\n ],\n [\n 118.897312,\n 35.97605\n ],\n [\n 118.87986,\n 35.992321\n ],\n [\n 118.896048,\n 36.006404\n ],\n [\n 118.956853,\n 36.008427\n ],\n [\n 118.981886,\n 36.017409\n ],\n [\n 118.999022,\n 36.038404\n ],\n [\n 119.012526,\n 36.03533\n ],\n [\n 119.024134,\n 36.02631\n ],\n [\n 119.017659,\n 36.024044\n ],\n [\n 119.014105,\n 36.013404\n ],\n [\n 119.023739,\n 36.011219\n ],\n [\n 119.024924,\n 36.003571\n ],\n [\n 119.015606,\n 35.995923\n ],\n [\n 119.021054,\n 35.977426\n ],\n [\n 119.05201,\n 35.9803\n ],\n [\n 119.060538,\n 35.978195\n ],\n [\n 119.066619,\n 35.963986\n ],\n [\n 119.07878,\n 35.959289\n ],\n [\n 119.088888,\n 35.963176\n ],\n [\n 119.121817,\n 35.962731\n ],\n [\n 119.134373,\n 35.968601\n ],\n [\n 119.153246,\n 35.971192\n ],\n [\n 119.155063,\n 35.965767\n ],\n [\n 119.178595,\n 35.97107\n ],\n [\n 119.182623,\n 35.962285\n ],\n [\n 119.179385,\n 35.926163\n ],\n [\n 119.183412,\n 35.91875\n ],\n [\n 119.169672,\n 35.91721\n ],\n [\n 119.151746,\n 35.905502\n ],\n [\n 119.144718,\n 35.904449\n ],\n [\n 119.135637,\n 35.892982\n ],\n [\n 119.158221,\n 35.882486\n ],\n [\n 119.161854,\n 35.894481\n ],\n [\n 119.169119,\n 35.894846\n ],\n [\n 119.190598,\n 35.879446\n ],\n [\n 119.217053,\n 35.879527\n ],\n [\n 119.240427,\n 35.884269\n ],\n [\n 119.281964,\n 35.910202\n ],\n [\n 119.294441,\n 35.911336\n ],\n [\n 119.298153,\n 35.893022\n ],\n [\n 119.315999,\n 35.887552\n ],\n [\n 119.345533,\n 35.893792\n ],\n [\n 119.360695,\n 35.884066\n ],\n [\n 119.371435,\n 35.860476\n ],\n [\n 119.358247,\n 35.84511\n ],\n [\n 119.372382,\n 35.830025\n ],\n [\n 119.374041,\n 35.816154\n ],\n [\n 119.368829,\n 35.770834\n ],\n [\n 119.375857,\n 35.770712\n ],\n [\n 119.390466,\n 35.778707\n ],\n [\n 119.397731,\n 35.786823\n ],\n [\n 119.427739,\n 35.802078\n ],\n [\n 119.444322,\n 35.804026\n ],\n [\n 119.455693,\n 35.809056\n ],\n [\n 119.464696,\n 35.80861\n ],\n [\n 119.482385,\n 35.799725\n ],\n [\n 119.493282,\n 35.789866\n ],\n [\n 119.496599,\n 35.779235\n ],\n [\n 119.48657,\n 35.771646\n ],\n [\n 119.48807,\n 35.754599\n ],\n [\n 119.504101,\n 35.752325\n ],\n [\n 119.525422,\n 35.730604\n ],\n [\n 119.517762,\n 35.723742\n ],\n [\n 119.521079,\n 35.716879\n ],\n [\n 119.518473,\n 35.700632\n ],\n [\n 119.51484,\n 35.697992\n ],\n [\n 119.519105,\n 35.68552\n ],\n [\n 119.528265,\n 35.674305\n ],\n [\n 119.524474,\n 35.632279\n ],\n [\n 119.517762,\n 35.625774\n ],\n [\n 119.518157,\n 35.615446\n ],\n [\n 119.536872,\n 35.606011\n ],\n [\n 119.538215,\n 35.589294\n ],\n [\n 119.556535,\n 35.592508\n ],\n [\n 119.57762,\n 35.586243\n ],\n [\n 119.592308,\n 35.600683\n ],\n [\n 119.600599,\n 35.590271\n ],\n [\n 119.609286,\n 35.59202\n ],\n [\n 119.614972,\n 35.606336\n ],\n [\n 119.634713,\n 35.598731\n ],\n [\n 119.651455,\n 35.588766\n ],\n [\n 119.662115,\n 35.589294\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 371300,\n \"name\": \"临沂市\",\n \"center\": [\n 118.326443,\n 35.065282\n ],\n \"centroid\": [\n 118.286436,\n 35.311894\n ],\n \"childrenNum\": 12,\n \"level\": \"city\",\n \"parent\": {\n \"adcode\": 370000\n },\n \"subFeatureIndex\": 11,\n \"acroutes\": [\n 100000,\n 370000\n ]\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 117.419191,\n 35.273997\n ],\n [\n 117.439565,\n 35.282368\n ],\n [\n 117.463098,\n 35.287472\n ],\n [\n 117.478891,\n 35.314375\n ],\n [\n 117.453937,\n 35.325027\n ],\n [\n 117.446988,\n 35.330292\n ],\n [\n 117.439012,\n 35.348939\n ],\n [\n 117.439644,\n 35.359668\n ],\n [\n 117.463887,\n 35.375617\n ],\n [\n 117.463334,\n 35.39038\n ],\n [\n 117.474785,\n 35.400941\n ],\n [\n 117.467441,\n 35.418186\n ],\n [\n 117.455833,\n 35.424953\n ],\n [\n 117.453779,\n 35.442396\n ],\n [\n 117.42851,\n 35.458614\n ],\n [\n 117.442171,\n 35.469247\n ],\n [\n 117.452279,\n 35.490306\n ],\n [\n 117.462703,\n 35.497922\n ],\n [\n 117.467441,\n 35.512255\n ],\n [\n 117.472416,\n 35.514372\n ],\n [\n 117.481734,\n 35.507898\n ],\n [\n 117.498396,\n 35.503093\n ],\n [\n 117.501634,\n 35.512947\n ],\n [\n 117.513795,\n 35.514576\n ],\n [\n 117.520033,\n 35.51991\n ],\n [\n 117.516401,\n 35.527319\n ],\n [\n 117.50424,\n 35.531675\n ],\n [\n 117.496264,\n 35.543031\n ],\n [\n 117.499502,\n 35.550845\n ],\n [\n 117.515058,\n 35.551008\n ],\n [\n 117.528641,\n 35.547182\n ],\n [\n 117.582418,\n 35.554141\n ],\n [\n 117.593473,\n 35.567448\n ],\n [\n 117.590394,\n 35.573551\n ],\n [\n 117.592763,\n 35.589701\n ],\n [\n 117.585577,\n 35.593972\n ],\n [\n 117.588893,\n 35.619878\n ],\n [\n 117.596948,\n 35.630449\n ],\n [\n 117.599001,\n 35.649149\n ],\n [\n 117.605319,\n 35.674834\n ],\n [\n 117.62585,\n 35.703841\n ],\n [\n 117.634616,\n 35.709324\n ],\n [\n 117.663913,\n 35.70969\n ],\n [\n 117.679154,\n 35.713305\n ],\n [\n 117.707424,\n 35.726016\n ],\n [\n 117.732615,\n 35.71237\n ],\n [\n 117.754173,\n 35.709609\n ],\n [\n 117.769019,\n 35.726625\n ],\n [\n 117.781733,\n 35.734096\n ],\n [\n 117.811504,\n 35.732919\n ],\n [\n 117.823033,\n 35.739496\n ],\n [\n 117.837405,\n 35.741445\n ],\n [\n 117.833694,\n 35.760484\n ],\n [\n 117.828482,\n 35.773837\n ],\n [\n 117.831167,\n 35.786661\n ],\n [\n 117.846092,\n 35.796398\n ],\n [\n 117.840959,\n 35.812058\n ],\n [\n 117.828403,\n 35.821792\n ],\n [\n 117.827376,\n 35.827754\n ],\n [\n 117.842143,\n 35.84507\n ],\n [\n 117.85541,\n 35.850219\n ],\n [\n 117.86686,\n 35.86984\n ],\n [\n 117.883364,\n 35.882648\n ],\n [\n 117.906265,\n 35.884634\n ],\n [\n 117.924586,\n 35.880946\n ],\n [\n 117.937615,\n 35.874826\n ],\n [\n 117.960516,\n 35.87057\n ],\n [\n 117.968097,\n 35.884066\n ],\n [\n 117.97931,\n 35.889699\n ],\n [\n 117.981364,\n 35.906191\n ],\n [\n 117.988234,\n 35.908703\n ],\n [\n 117.99921,\n 35.925393\n ],\n [\n 117.997394,\n 35.934587\n ],\n [\n 117.988471,\n 35.947709\n ],\n [\n 118.021084,\n 35.949004\n ],\n [\n 118.02298,\n 35.958965\n ],\n [\n 118.03293,\n 35.964998\n ],\n [\n 118.032693,\n 35.974268\n ],\n [\n 118.042248,\n 35.986371\n ],\n [\n 118.058989,\n 35.992968\n ],\n [\n 118.066807,\n 36.009155\n ],\n [\n 118.075888,\n 36.009034\n ],\n [\n 118.078415,\n 36.017652\n ],\n [\n 118.084338,\n 36.012149\n ],\n [\n 118.093261,\n 36.014618\n ],\n [\n 118.096104,\n 36.024246\n ],\n [\n 118.10937,\n 36.030031\n ],\n [\n 118.132666,\n 36.030436\n ],\n [\n 118.135588,\n 36.02364\n ],\n [\n 118.178388,\n 36.017005\n ],\n [\n 118.197578,\n 36.004947\n ],\n [\n 118.206106,\n 35.97864\n ],\n [\n 118.193787,\n 35.974026\n ],\n [\n 118.207054,\n 35.964391\n ],\n [\n 118.209897,\n 35.955767\n ],\n [\n 118.22569,\n 35.948235\n ],\n [\n 118.236351,\n 35.947749\n ],\n [\n 118.236904,\n 35.939245\n ],\n [\n 118.245906,\n 35.932157\n ],\n [\n 118.257119,\n 35.930699\n ],\n [\n 118.257593,\n 35.925717\n ],\n [\n 118.26928,\n 35.928512\n ],\n [\n 118.281362,\n 35.935964\n ],\n [\n 118.293523,\n 35.937503\n ],\n [\n 118.303552,\n 35.948923\n ],\n [\n 118.314134,\n 35.950827\n ],\n [\n 118.320136,\n 35.946575\n ],\n [\n 118.344774,\n 35.955888\n ],\n [\n 118.352828,\n 35.956698\n ],\n [\n 118.360725,\n 35.970908\n ],\n [\n 118.382283,\n 35.975078\n ],\n [\n 118.387021,\n 35.987586\n ],\n [\n 118.415213,\n 35.990783\n ],\n [\n 118.430612,\n 35.969694\n ],\n [\n 118.459356,\n 35.952689\n ],\n [\n 118.470964,\n 35.960868\n ],\n [\n 118.502157,\n 35.962488\n ],\n [\n 118.505157,\n 35.965808\n ],\n [\n 118.499393,\n 35.976212\n ],\n [\n 118.486521,\n 35.988759\n ],\n [\n 118.49268,\n 35.995437\n ],\n [\n 118.487074,\n 36.005797\n ],\n [\n 118.476571,\n 36.012797\n ],\n [\n 118.469859,\n 36.022992\n ],\n [\n 118.476097,\n 36.031407\n ],\n [\n 118.489206,\n 36.025784\n ],\n [\n 118.503341,\n 36.024246\n ],\n [\n 118.507447,\n 36.029789\n ],\n [\n 118.516845,\n 36.026107\n ],\n [\n 118.522609,\n 36.043622\n ],\n [\n 118.522214,\n 36.05349\n ],\n [\n 118.513449,\n 36.064085\n ],\n [\n 118.516608,\n 36.068573\n ],\n [\n 118.507842,\n 36.074961\n ],\n [\n 118.522925,\n 36.084784\n ],\n [\n 118.529479,\n 36.093879\n ],\n [\n 118.526716,\n 36.104671\n ],\n [\n 118.504762,\n 36.105802\n ],\n [\n 118.509974,\n 36.114612\n ],\n [\n 118.515502,\n 36.109884\n ],\n [\n 118.535797,\n 36.118531\n ],\n [\n 118.541719,\n 36.124996\n ],\n [\n 118.556881,\n 36.130935\n ],\n [\n 118.565015,\n 36.130087\n ],\n [\n 118.563988,\n 36.147094\n ],\n [\n 118.572201,\n 36.156424\n ],\n [\n 118.581914,\n 36.151456\n ],\n [\n 118.606236,\n 36.164218\n ],\n [\n 118.622109,\n 36.17718\n ],\n [\n 118.640824,\n 36.171042\n ],\n [\n 118.644299,\n 36.177018\n ],\n [\n 118.653143,\n 36.176695\n ],\n [\n 118.666015,\n 36.168983\n ],\n [\n 118.675491,\n 36.170194\n ],\n [\n 118.683388,\n 36.158564\n ],\n [\n 118.679913,\n 36.152062\n ],\n [\n 118.701235,\n 36.144509\n ],\n [\n 118.703761,\n 36.150446\n ],\n [\n 118.714659,\n 36.154485\n ],\n [\n 118.72603,\n 36.141035\n ],\n [\n 118.736454,\n 36.146528\n ],\n [\n 118.73298,\n 36.1519\n ],\n [\n 118.733532,\n 36.166802\n ],\n [\n 118.741824,\n 36.165551\n ],\n [\n 118.751142,\n 36.183115\n ],\n [\n 118.745535,\n 36.191754\n ],\n [\n 118.766383,\n 36.206649\n ],\n [\n 118.78573,\n 36.197487\n ],\n [\n 118.802076,\n 36.202855\n ],\n [\n 118.809026,\n 36.198738\n ],\n [\n 118.835796,\n 36.203138\n ],\n [\n 118.847009,\n 36.199263\n ],\n [\n 118.848746,\n 36.188606\n ],\n [\n 118.844561,\n 36.18473\n ],\n [\n 118.846614,\n 36.172092\n ],\n [\n 118.85459,\n 36.170194\n ],\n [\n 118.859802,\n 36.16232\n ],\n [\n 118.858302,\n 36.143256\n ],\n [\n 118.863908,\n 36.139298\n ],\n [\n 118.858302,\n 36.129966\n ],\n [\n 118.860197,\n 36.114733\n ],\n [\n 118.865961,\n 36.113682\n ],\n [\n 118.860513,\n 36.101316\n ],\n [\n 118.875911,\n 36.091535\n ],\n [\n 118.880886,\n 36.08438\n ],\n [\n 118.886493,\n 36.088584\n ],\n [\n 118.908288,\n 36.091292\n ],\n [\n 118.920765,\n 36.105721\n ],\n [\n 118.916185,\n 36.111702\n ],\n [\n 118.936322,\n 36.11344\n ],\n [\n 118.943271,\n 36.119582\n ],\n [\n 118.954642,\n 36.1115\n ],\n [\n 118.958512,\n 36.104145\n ],\n [\n 118.970041,\n 36.104671\n ],\n [\n 118.970278,\n 36.09873\n ],\n [\n 118.988756,\n 36.092343\n ],\n [\n 119.000523,\n 36.099497\n ],\n [\n 119.013868,\n 36.09881\n ],\n [\n 119.020344,\n 36.104307\n ],\n [\n 119.038506,\n 36.090444\n ],\n [\n 119.048851,\n 36.092707\n ],\n [\n 119.066935,\n 36.081631\n ],\n [\n 119.063539,\n 36.075042\n ],\n [\n 119.049641,\n 36.066632\n ],\n [\n 119.042534,\n 36.055512\n ],\n [\n 119.040322,\n 36.042934\n ],\n [\n 119.052089,\n 36.037838\n ],\n [\n 119.047903,\n 36.024813\n ],\n [\n 119.035584,\n 36.02275\n ],\n [\n 119.024134,\n 36.02631\n ],\n [\n 119.012526,\n 36.03533\n ],\n [\n 118.999022,\n 36.038404\n ],\n [\n 118.981886,\n 36.017409\n ],\n [\n 118.956853,\n 36.008427\n ],\n [\n 118.896048,\n 36.006404\n ],\n [\n 118.87986,\n 35.992321\n ],\n [\n 118.897312,\n 35.97605\n ],\n [\n 118.893047,\n 35.963257\n ],\n [\n 118.883571,\n 35.957305\n ],\n [\n 118.837217,\n 35.948883\n ],\n [\n 118.813922,\n 35.948761\n ],\n [\n 118.80413,\n 35.939731\n ],\n [\n 118.805709,\n 35.923854\n ],\n [\n 118.775148,\n 35.917251\n ],\n [\n 118.777281,\n 35.896791\n ],\n [\n 118.765198,\n 35.898331\n ],\n [\n 118.756038,\n 35.877379\n ],\n [\n 118.75438,\n 35.853544\n ],\n [\n 118.7498,\n 35.849489\n ],\n [\n 118.732822,\n 35.848111\n ],\n [\n 118.722082,\n 35.834932\n ],\n [\n 118.724609,\n 35.820454\n ],\n [\n 118.716712,\n 35.80723\n ],\n [\n 118.700603,\n 35.791367\n ],\n [\n 118.702182,\n 35.772295\n ],\n [\n 118.706525,\n 35.765152\n ],\n [\n 118.703288,\n 35.745221\n ],\n [\n 118.707078,\n 35.738075\n ],\n [\n 118.722161,\n 35.73101\n ],\n [\n 118.743482,\n 35.729346\n ],\n [\n 118.757223,\n 35.725935\n ],\n [\n 118.798918,\n 35.730117\n ],\n [\n 118.804209,\n 35.728655\n ],\n [\n 118.806499,\n 35.718056\n ],\n [\n 118.794101,\n 35.697504\n ],\n [\n 118.791416,\n 35.68296\n ],\n [\n 118.76662,\n 35.653539\n ],\n [\n 118.751458,\n 35.640409\n ],\n [\n 118.739692,\n 35.62496\n ],\n [\n 118.735822,\n 35.593443\n ],\n [\n 118.74056,\n 35.581484\n ],\n [\n 118.734875,\n 35.569767\n ],\n [\n 118.724056,\n 35.562972\n ],\n [\n 118.725083,\n 35.553205\n ],\n [\n 118.696575,\n 35.528622\n ],\n [\n 118.698865,\n 35.513558\n ],\n [\n 118.725004,\n 35.496578\n ],\n [\n 118.734322,\n 35.48607\n ],\n [\n 118.723898,\n 35.468758\n ],\n [\n 118.709131,\n 35.457677\n ],\n [\n 118.698234,\n 35.455436\n ],\n [\n 118.693575,\n 35.459103\n ],\n [\n 118.667831,\n 35.456821\n ],\n [\n 118.662066,\n 35.461547\n ],\n [\n 118.651011,\n 35.458614\n ],\n [\n 118.64801,\n 35.453276\n ],\n [\n 118.6289,\n 35.449324\n ],\n [\n 118.632611,\n 35.430903\n ],\n [\n 118.642246,\n 35.425156\n ],\n [\n 118.635691,\n 35.421039\n ],\n [\n 118.619029,\n 35.423118\n ],\n [\n 118.601419,\n 35.414517\n ],\n [\n 118.606157,\n 35.390747\n ],\n [\n 118.624952,\n 35.387036\n ],\n [\n 118.625425,\n 35.370315\n ],\n [\n 118.632059,\n 35.368438\n ],\n [\n 118.652274,\n 35.373578\n ],\n [\n 118.682914,\n 35.368642\n ],\n [\n 118.696891,\n 35.379818\n ],\n [\n 118.709605,\n 35.369825\n ],\n [\n 118.712527,\n 35.363544\n ],\n [\n 118.723898,\n 35.368479\n ],\n [\n 118.739455,\n 35.359505\n ],\n [\n 118.768989,\n 35.368031\n ],\n [\n 118.776412,\n 35.37627\n ],\n [\n 118.784151,\n 35.371049\n ],\n [\n 118.797575,\n 35.369417\n ],\n [\n 118.816764,\n 35.373292\n ],\n [\n 118.84314,\n 35.370804\n ],\n [\n 118.859644,\n 35.381694\n ],\n [\n 118.865725,\n 35.391685\n ],\n [\n 118.874174,\n 35.388464\n ],\n [\n 118.871015,\n 35.367215\n ],\n [\n 118.889573,\n 35.357261\n ],\n [\n 118.904814,\n 35.355507\n ],\n [\n 118.92195,\n 35.348408\n ],\n [\n 118.923213,\n 35.339187\n ],\n [\n 118.930478,\n 35.331271\n ],\n [\n 118.947219,\n 35.336943\n ],\n [\n 118.961828,\n 35.334168\n ],\n [\n 118.973042,\n 35.340167\n ],\n [\n 118.986861,\n 35.353141\n ],\n [\n 118.98852,\n 35.36697\n ],\n [\n 118.984413,\n 35.382224\n ],\n [\n 118.999654,\n 35.388953\n ],\n [\n 119.024371,\n 35.386873\n ],\n [\n 119.044587,\n 35.377004\n ],\n [\n 119.04893,\n 35.371498\n ],\n [\n 119.06575,\n 35.364563\n ],\n [\n 119.075542,\n 35.366113\n ],\n [\n 119.078385,\n 35.357506\n ],\n [\n 119.085571,\n 35.354243\n ],\n [\n 119.087229,\n 35.340575\n ],\n [\n 119.096153,\n 35.326864\n ],\n [\n 119.105708,\n 35.330659\n ],\n [\n 119.133741,\n 35.335596\n ],\n [\n 119.146455,\n 35.334862\n ],\n [\n 119.148193,\n 35.326741\n ],\n [\n 119.141322,\n 35.320823\n ],\n [\n 119.143218,\n 35.314048\n ],\n [\n 119.157669,\n 35.301721\n ],\n [\n 119.155931,\n 35.293882\n ],\n [\n 119.164065,\n 35.289554\n ],\n [\n 119.179543,\n 35.287595\n ],\n [\n 119.187519,\n 35.258192\n ],\n [\n 119.181991,\n 35.25231\n ],\n [\n 119.182149,\n 35.241852\n ],\n [\n 119.174568,\n 35.230331\n ],\n [\n 119.170225,\n 35.21231\n ],\n [\n 119.161301,\n 35.204136\n ],\n [\n 119.139032,\n 35.202338\n ],\n [\n 119.1354,\n 35.191669\n ],\n [\n 119.149219,\n 35.189298\n ],\n [\n 119.157274,\n 35.18243\n ],\n [\n 119.164855,\n 35.166525\n ],\n [\n 119.173146,\n 35.1617\n ],\n [\n 119.163433,\n 35.154134\n ],\n [\n 119.164223,\n 35.143173\n ],\n [\n 119.174252,\n 35.139042\n ],\n [\n 119.189967,\n 35.138101\n ],\n [\n 119.196679,\n 35.129919\n ],\n [\n 119.203233,\n 35.110894\n ],\n [\n 119.171409,\n 35.10717\n ],\n [\n 119.159011,\n 35.100991\n ],\n [\n 119.138085,\n 35.096285\n ],\n [\n 119.129477,\n 35.076187\n ],\n [\n 119.120475,\n 35.070088\n ],\n [\n 119.120396,\n 35.05801\n ],\n [\n 119.114631,\n 35.05498\n ],\n [\n 119.073647,\n 35.056659\n ],\n [\n 119.061407,\n 35.051581\n ],\n [\n 119.037401,\n 35.051335\n ],\n [\n 119.00534,\n 35.05412\n ],\n [\n 118.992152,\n 35.048182\n ],\n [\n 118.965619,\n 35.046462\n ],\n [\n 118.945166,\n 35.040811\n ],\n [\n 118.928504,\n 35.050885\n ],\n [\n 118.911131,\n 35.047773\n ],\n [\n 118.903787,\n 35.041343\n ],\n [\n 118.885782,\n 35.034258\n ],\n [\n 118.86533,\n 35.029834\n ],\n [\n 118.862487,\n 35.025697\n ],\n [\n 118.865093,\n 34.993208\n ],\n [\n 118.859249,\n 34.962633\n ],\n [\n 118.86075,\n 34.943979\n ],\n [\n 118.829715,\n 34.911129\n ],\n [\n 118.805235,\n 34.873055\n ],\n [\n 118.802471,\n 34.845637\n ],\n [\n 118.768989,\n 34.846129\n ],\n [\n 118.768278,\n 34.838822\n ],\n [\n 118.78194,\n 34.82749\n ],\n [\n 118.776649,\n 34.818785\n ],\n [\n 118.779018,\n 34.809627\n ],\n [\n 118.773569,\n 34.795333\n ],\n [\n 118.756512,\n 34.789541\n ],\n [\n 118.73756,\n 34.792088\n ],\n [\n 118.728399,\n 34.786871\n ],\n [\n 118.740166,\n 34.781243\n ],\n [\n 118.738507,\n 34.766862\n ],\n [\n 118.727215,\n 34.768752\n ],\n [\n 118.716475,\n 34.763821\n ],\n [\n 118.719239,\n 34.745533\n ],\n [\n 118.730374,\n 34.745451\n ],\n [\n 118.740087,\n 34.736901\n ],\n [\n 118.759197,\n 34.740847\n ],\n [\n 118.768515,\n 34.738093\n ],\n [\n 118.78344,\n 34.722061\n ],\n [\n 118.758723,\n 34.703434\n ],\n [\n 118.739376,\n 34.69377\n ],\n [\n 118.720108,\n 34.694222\n ],\n [\n 118.704077,\n 34.688752\n ],\n [\n 118.690258,\n 34.678593\n ],\n [\n 118.681335,\n 34.678346\n ],\n [\n 118.664357,\n 34.693441\n ],\n [\n 118.650537,\n 34.695086\n ],\n [\n 118.633717,\n 34.687025\n ],\n [\n 118.604894,\n 34.696484\n ],\n [\n 118.60134,\n 34.714167\n ],\n [\n 118.570464,\n 34.712522\n ],\n [\n 118.558934,\n 34.706847\n ],\n [\n 118.546063,\n 34.70619\n ],\n [\n 118.53935,\n 34.711494\n ],\n [\n 118.525215,\n 34.712563\n ],\n [\n 118.522688,\n 34.692289\n ],\n [\n 118.508158,\n 34.687066\n ],\n [\n 118.500814,\n 34.675178\n ],\n [\n 118.484231,\n 34.6709\n ],\n [\n 118.468437,\n 34.674315\n ],\n [\n 118.460856,\n 34.65757\n ],\n [\n 118.466463,\n 34.643127\n ],\n [\n 118.474913,\n 34.637201\n ],\n [\n 118.473807,\n 34.623412\n ],\n [\n 118.46362,\n 34.625265\n ],\n [\n 118.452881,\n 34.617691\n ],\n [\n 118.439219,\n 34.626294\n ],\n [\n 118.42382,\n 34.591094\n ],\n [\n 118.428322,\n 34.563253\n ],\n [\n 118.440956,\n 34.52477\n ],\n [\n 118.439535,\n 34.507996\n ],\n [\n 118.430928,\n 34.489074\n ],\n [\n 118.421372,\n 34.483219\n ],\n [\n 118.41624,\n 34.473859\n ],\n [\n 118.411344,\n 34.446391\n ],\n [\n 118.405342,\n 34.437027\n ],\n [\n 118.404947,\n 34.427744\n ],\n [\n 118.395155,\n 34.427084\n ],\n [\n 118.379993,\n 34.415531\n ],\n [\n 118.353223,\n 34.41747\n ],\n [\n 118.352197,\n 34.422834\n ],\n [\n 118.320925,\n 34.421349\n ],\n [\n 118.290681,\n 34.424567\n ],\n [\n 118.28918,\n 34.412271\n ],\n [\n 118.279862,\n 34.412188\n ],\n [\n 118.277414,\n 34.404677\n ],\n [\n 118.242431,\n 34.405709\n ],\n [\n 118.230981,\n 34.398693\n ],\n [\n 118.220241,\n 34.405957\n ],\n [\n 118.217714,\n 34.379127\n ],\n [\n 118.204369,\n 34.377352\n ],\n [\n 118.189602,\n 34.380654\n ],\n [\n 118.183363,\n 34.390355\n ],\n [\n 118.179336,\n 34.379416\n ],\n [\n 118.170413,\n 34.381356\n ],\n [\n 118.177125,\n 34.408722\n ],\n [\n 118.178862,\n 34.425186\n ],\n [\n 118.177757,\n 34.453238\n ],\n [\n 118.139931,\n 34.475344\n ],\n [\n 118.132824,\n 34.483425\n ],\n [\n 118.141826,\n 34.497154\n ],\n [\n 118.164964,\n 34.504904\n ],\n [\n 118.16757,\n 34.519701\n ],\n [\n 118.184706,\n 34.544179\n ],\n [\n 118.163542,\n 34.551471\n ],\n [\n 118.153671,\n 34.549164\n ],\n [\n 118.140721,\n 34.554025\n ],\n [\n 118.137167,\n 34.563253\n ],\n [\n 118.126428,\n 34.55522\n ],\n [\n 118.100447,\n 34.564736\n ],\n [\n 118.078968,\n 34.569761\n ],\n [\n 118.082363,\n 34.579893\n ],\n [\n 118.102816,\n 34.593441\n ],\n [\n 118.11474,\n 34.614397\n ],\n [\n 118.113003,\n 34.621437\n ],\n [\n 118.100526,\n 34.626582\n ],\n [\n 118.094603,\n 34.636583\n ],\n [\n 118.102658,\n 34.647736\n ],\n [\n 118.084022,\n 34.655924\n ],\n [\n 118.077783,\n 34.653702\n ],\n [\n 118.05741,\n 34.655019\n ],\n [\n 118.053935,\n 34.650945\n ],\n [\n 118.02069,\n 34.660409\n ],\n [\n 118.018242,\n 34.647036\n ],\n [\n 118.007818,\n 34.64753\n ],\n [\n 118.007423,\n 34.65613\n ],\n [\n 117.99084,\n 34.661726\n ],\n [\n 117.991708,\n 34.670077\n ],\n [\n 117.96328,\n 34.678552\n ],\n [\n 117.951672,\n 34.678469\n ],\n [\n 117.939669,\n 34.664852\n ],\n [\n 117.90974,\n 34.67016\n ],\n [\n 117.903106,\n 34.644567\n ],\n [\n 117.880995,\n 34.645184\n ],\n [\n 117.877916,\n 34.650205\n ],\n [\n 117.863465,\n 34.645184\n ],\n [\n 117.849408,\n 34.647201\n ],\n [\n 117.847513,\n 34.652386\n ],\n [\n 117.834483,\n 34.647324\n ],\n [\n 117.831798,\n 34.653455\n ],\n [\n 117.820111,\n 34.646172\n ],\n [\n 117.805818,\n 34.646254\n ],\n [\n 117.819243,\n 34.681842\n ],\n [\n 117.825639,\n 34.684392\n ],\n [\n 117.831719,\n 34.707793\n ],\n [\n 117.825244,\n 34.713139\n ],\n [\n 117.823665,\n 34.72868\n ],\n [\n 117.830061,\n 34.740888\n ],\n [\n 117.830614,\n 34.760246\n ],\n [\n 117.79958,\n 34.768875\n ],\n [\n 117.784576,\n 34.780667\n ],\n [\n 117.784023,\n 34.79484\n ],\n [\n 117.77739,\n 34.801248\n ],\n [\n 117.798632,\n 34.810653\n ],\n [\n 117.803686,\n 34.830734\n ],\n [\n 117.795315,\n 34.835907\n ],\n [\n 117.763175,\n 34.848839\n ],\n [\n 117.75291,\n 34.857623\n ],\n [\n 117.742407,\n 34.874163\n ],\n [\n 117.729298,\n 34.876994\n ],\n [\n 117.715163,\n 34.896238\n ],\n [\n 117.70466,\n 34.906699\n ],\n [\n 117.698501,\n 34.919989\n ],\n [\n 117.704265,\n 34.933605\n ],\n [\n 117.712004,\n 34.934999\n ],\n [\n 117.714689,\n 34.947833\n ],\n [\n 117.724323,\n 34.958329\n ],\n [\n 117.719506,\n 34.968331\n ],\n [\n 117.726534,\n 34.979561\n ],\n [\n 117.728035,\n 35.008041\n ],\n [\n 117.737985,\n 35.013203\n ],\n [\n 117.744618,\n 35.022748\n ],\n [\n 117.736247,\n 35.031514\n ],\n [\n 117.704423,\n 35.031227\n ],\n [\n 117.707345,\n 35.052318\n ],\n [\n 117.69321,\n 35.06018\n ],\n [\n 117.676469,\n 35.065543\n ],\n [\n 117.656885,\n 35.077497\n ],\n [\n 117.650725,\n 35.092724\n ],\n [\n 117.623007,\n 35.113063\n ],\n [\n 117.604371,\n 35.13401\n ],\n [\n 117.600344,\n 35.135524\n ],\n [\n 117.591025,\n 35.152539\n ],\n [\n 117.586208,\n 35.152989\n ],\n [\n 117.58376,\n 35.164317\n ],\n [\n 117.570336,\n 35.168365\n ],\n [\n 117.556043,\n 35.161291\n ],\n [\n 117.548462,\n 35.161741\n ],\n [\n 117.528009,\n 35.184351\n ],\n [\n 117.526825,\n 35.200621\n ],\n [\n 117.507162,\n 35.198986\n ],\n [\n 117.494843,\n 35.205893\n ],\n [\n 117.480628,\n 35.222771\n ],\n [\n 117.468073,\n 35.228369\n ],\n [\n 117.448331,\n 35.231842\n ],\n [\n 117.449752,\n 35.246795\n ],\n [\n 117.439486,\n 35.258927\n ],\n [\n 117.426456,\n 35.261786\n ],\n [\n 117.419191,\n 35.273997\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 371400,\n \"name\": \"德州市\",\n \"center\": [\n 116.307428,\n 37.453968\n ],\n \"centroid\": [\n 116.653994,\n 37.251363\n ],\n \"childrenNum\": 11,\n \"level\": \"city\",\n \"parent\": {\n \"adcode\": 370000\n },\n \"subFeatureIndex\": 12,\n \"acroutes\": [\n 100000,\n 370000\n ]\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 115.768684,\n 36.921014\n ],\n [\n 115.761972,\n 36.924413\n ],\n [\n 115.762683,\n 36.939327\n ],\n [\n 115.772791,\n 36.936849\n ],\n [\n 115.788189,\n 36.9526\n ],\n [\n 115.796876,\n 36.968747\n ],\n [\n 115.791743,\n 36.975261\n ],\n [\n 115.784478,\n 36.970625\n ],\n [\n 115.786373,\n 36.983093\n ],\n [\n 115.776265,\n 36.990884\n ],\n [\n 115.790874,\n 37.005985\n ],\n [\n 115.808089,\n 37.010259\n ],\n [\n 115.813222,\n 37.019126\n ],\n [\n 115.812354,\n 37.02895\n ],\n [\n 115.825778,\n 37.032384\n ],\n [\n 115.831938,\n 37.045281\n ],\n [\n 115.85626,\n 37.06073\n ],\n [\n 115.855154,\n 37.071108\n ],\n [\n 115.865025,\n 37.070828\n ],\n [\n 115.868263,\n 37.084038\n ],\n [\n 115.879476,\n 37.105583\n ],\n [\n 115.885399,\n 37.128757\n ],\n [\n 115.879397,\n 37.138647\n ],\n [\n 115.87995,\n 37.152004\n ],\n [\n 115.892269,\n 37.157625\n ],\n [\n 115.912485,\n 37.178751\n ],\n [\n 115.904825,\n 37.189391\n ],\n [\n 115.9098,\n 37.206803\n ],\n [\n 115.920145,\n 37.214173\n ],\n [\n 115.920934,\n 37.223534\n ],\n [\n 115.926778,\n 37.219511\n ],\n [\n 115.941387,\n 37.227716\n ],\n [\n 115.953232,\n 37.223693\n ],\n [\n 115.969421,\n 37.239464\n ],\n [\n 115.971079,\n 37.245636\n ],\n [\n 115.963972,\n 37.250096\n ],\n [\n 115.972895,\n 37.257103\n ],\n [\n 115.966973,\n 37.265742\n ],\n [\n 115.975185,\n 37.268967\n ],\n [\n 115.976212,\n 37.276171\n ],\n [\n 115.96871,\n 37.28632\n ],\n [\n 115.970763,\n 37.295553\n ],\n [\n 115.981503,\n 37.30737\n ],\n [\n 115.984346,\n 37.319265\n ],\n [\n 115.975659,\n 37.317515\n ],\n [\n 115.972974,\n 37.324039\n ],\n [\n 115.984503,\n 37.326067\n ],\n [\n 115.975738,\n 37.337283\n ],\n [\n 115.986951,\n 37.341738\n ],\n [\n 116.009457,\n 37.343169\n ],\n [\n 116.000376,\n 37.350804\n ],\n [\n 116.013643,\n 37.349571\n ],\n [\n 116.024461,\n 37.359949\n ],\n [\n 116.031252,\n 37.356411\n ],\n [\n 116.051942,\n 37.357484\n ],\n [\n 116.056206,\n 37.369053\n ],\n [\n 116.072474,\n 37.368099\n ],\n [\n 116.087557,\n 37.373307\n ],\n [\n 116.106588,\n 37.368815\n ],\n [\n 116.116459,\n 37.374301\n ],\n [\n 116.126646,\n 37.373466\n ],\n [\n 116.168814,\n 37.384118\n ],\n [\n 116.18524,\n 37.369928\n ],\n [\n 116.195506,\n 37.365674\n ],\n [\n 116.234437,\n 37.361221\n ],\n [\n 116.251652,\n 37.376566\n ],\n [\n 116.261602,\n 37.389802\n ],\n [\n 116.270446,\n 37.389126\n ],\n [\n 116.273052,\n 37.398425\n ],\n [\n 116.282923,\n 37.401326\n ],\n [\n 116.270446,\n 37.413802\n ],\n [\n 116.275026,\n 37.418252\n ],\n [\n 116.263023,\n 37.422423\n ],\n [\n 116.270999,\n 37.426714\n ],\n [\n 116.250072,\n 37.425919\n ],\n [\n 116.247151,\n 37.422066\n ],\n [\n 116.231515,\n 37.424529\n ],\n [\n 116.22733,\n 37.434261\n ],\n [\n 116.243123,\n 37.448201\n ],\n [\n 116.243597,\n 37.455904\n ],\n [\n 116.229936,\n 37.459676\n ],\n [\n 116.224803,\n 37.479963\n ],\n [\n 116.235068,\n 37.479725\n ],\n [\n 116.241307,\n 37.491434\n ],\n [\n 116.258285,\n 37.482662\n ],\n [\n 116.256469,\n 37.478812\n ],\n [\n 116.276448,\n 37.466902\n ],\n [\n 116.271473,\n 37.478931\n ],\n [\n 116.290899,\n 37.484766\n ],\n [\n 116.286082,\n 37.491117\n ],\n [\n 116.292952,\n 37.497387\n ],\n [\n 116.284344,\n 37.500721\n ],\n [\n 116.297532,\n 37.508816\n ],\n [\n 116.280317,\n 37.510879\n ],\n [\n 116.283555,\n 37.517584\n ],\n [\n 116.278422,\n 37.524765\n ],\n [\n 116.291373,\n 37.523813\n ],\n [\n 116.286082,\n 37.532619\n ],\n [\n 116.291373,\n 37.545589\n ],\n [\n 116.287898,\n 37.549317\n ],\n [\n 116.299348,\n 37.55935\n ],\n [\n 116.299664,\n 37.56958\n ],\n [\n 116.304481,\n 37.564505\n ],\n [\n 116.334805,\n 37.574773\n ],\n [\n 116.319406,\n 37.580046\n ],\n [\n 116.33591,\n 37.581235\n ],\n [\n 116.344913,\n 37.570492\n ],\n [\n 116.343491,\n 37.566011\n ],\n [\n 116.367655,\n 37.566289\n ],\n [\n 116.375473,\n 37.560341\n ],\n [\n 116.376895,\n 37.546581\n ],\n [\n 116.367892,\n 37.533809\n ],\n [\n 116.368919,\n 37.526392\n ],\n [\n 116.382738,\n 37.523615\n ],\n [\n 116.388661,\n 37.516315\n ],\n [\n 116.402164,\n 37.509847\n ],\n [\n 116.414089,\n 37.490997\n ],\n [\n 116.434146,\n 37.473334\n ],\n [\n 116.438648,\n 37.477224\n ],\n [\n 116.446702,\n 37.500562\n ],\n [\n 116.46218,\n 37.517426\n ],\n [\n 116.482633,\n 37.52179\n ],\n [\n 116.49969,\n 37.537855\n ],\n [\n 116.507113,\n 37.541822\n ],\n [\n 116.51959,\n 37.559905\n ],\n [\n 116.538463,\n 37.56843\n ],\n [\n 116.545807,\n 37.582504\n ],\n [\n 116.563496,\n 37.596495\n ],\n [\n 116.556547,\n 37.596852\n ],\n [\n 116.580316,\n 37.613258\n ],\n [\n 116.60448,\n 37.625105\n ],\n [\n 116.630776,\n 37.652713\n ],\n [\n 116.640884,\n 37.666454\n ],\n [\n 116.636462,\n 37.675877\n ],\n [\n 116.641042,\n 37.68233\n ],\n [\n 116.646412,\n 37.676233\n ],\n [\n 116.653677,\n 37.67754\n ],\n [\n 116.664022,\n 37.687793\n ],\n [\n 116.675235,\n 37.720838\n ],\n [\n 116.679736,\n 37.72879\n ],\n [\n 116.69932,\n 37.73065\n ],\n [\n 116.698768,\n 37.738759\n ],\n [\n 116.709586,\n 37.735199\n ],\n [\n 116.724511,\n 37.744297\n ],\n [\n 116.718826,\n 37.762331\n ],\n [\n 116.723169,\n 37.766721\n ],\n [\n 116.73912,\n 37.756914\n ],\n [\n 116.744174,\n 37.757349\n ],\n [\n 116.753808,\n 37.770517\n ],\n [\n 116.75365,\n 37.793011\n ],\n [\n 116.74599,\n 37.795778\n ],\n [\n 116.758941,\n 37.801865\n ],\n [\n 116.766838,\n 37.81135\n ],\n [\n 116.786185,\n 37.826326\n ],\n [\n 116.788159,\n 37.843432\n ],\n [\n 116.794556,\n 37.846987\n ],\n [\n 116.811771,\n 37.847935\n ],\n [\n 116.812718,\n 37.84359\n ],\n [\n 116.828038,\n 37.840627\n ],\n [\n 116.843753,\n 37.834465\n ],\n [\n 116.879604,\n 37.843748\n ],\n [\n 116.919325,\n 37.84592\n ],\n [\n 116.950359,\n 37.839719\n ],\n [\n 116.976656,\n 37.841062\n ],\n [\n 117.008874,\n 37.833872\n ],\n [\n 117.027195,\n 37.832371\n ],\n [\n 117.040541,\n 37.839324\n ],\n [\n 117.074339,\n 37.848725\n ],\n [\n 117.093765,\n 37.849515\n ],\n [\n 117.150148,\n 37.8396\n ],\n [\n 117.163651,\n 37.839798\n ],\n [\n 117.185368,\n 37.849791\n ],\n [\n 117.208821,\n 37.843748\n ],\n [\n 117.259755,\n 37.838257\n ],\n [\n 117.271364,\n 37.839916\n ],\n [\n 117.284472,\n 37.84675\n ],\n [\n 117.302951,\n 37.852358\n ],\n [\n 117.320166,\n 37.861402\n ],\n [\n 117.344251,\n 37.862666\n ],\n [\n 117.364704,\n 37.854136\n ],\n [\n 117.381919,\n 37.854531\n ],\n [\n 117.40632,\n 37.843511\n ],\n [\n 117.423614,\n 37.847263\n ],\n [\n 117.438539,\n 37.853859\n ],\n [\n 117.466809,\n 37.890739\n ],\n [\n 117.481181,\n 37.914854\n ],\n [\n 117.49271,\n 37.927481\n ],\n [\n 117.512847,\n 37.943459\n ],\n [\n 117.520902,\n 37.966729\n ],\n [\n 117.524377,\n 37.989479\n ],\n [\n 117.541039,\n 38.011237\n ],\n [\n 117.54933,\n 38.010252\n ],\n [\n 117.563545,\n 37.998585\n ],\n [\n 117.570652,\n 37.957264\n ],\n [\n 117.567809,\n 37.946772\n ],\n [\n 117.529036,\n 37.932295\n ],\n [\n 117.539302,\n 37.913552\n ],\n [\n 117.542776,\n 37.890146\n ],\n [\n 117.547198,\n 37.883198\n ],\n [\n 117.568835,\n 37.882409\n ],\n [\n 117.580602,\n 37.875302\n ],\n [\n 117.581076,\n 37.858993\n ],\n [\n 117.595685,\n 37.853504\n ],\n [\n 117.606582,\n 37.845209\n ],\n [\n 117.605003,\n 37.838968\n ],\n [\n 117.59529,\n 37.834741\n ],\n [\n 117.588025,\n 37.82273\n ],\n [\n 117.56623,\n 37.812733\n ],\n [\n 117.568599,\n 37.804987\n ],\n [\n 117.559912,\n 37.800008\n ],\n [\n 117.546567,\n 37.776368\n ],\n [\n 117.547356,\n 37.767512\n ],\n [\n 117.526509,\n 37.762964\n ],\n [\n 117.522165,\n 37.755371\n ],\n [\n 117.531563,\n 37.748213\n ],\n [\n 117.544119,\n 37.747699\n ],\n [\n 117.547198,\n 37.737494\n ],\n [\n 117.542618,\n 37.726258\n ],\n [\n 117.556201,\n 37.716683\n ],\n [\n 117.539775,\n 37.713993\n ],\n [\n 117.543092,\n 37.703625\n ],\n [\n 117.531247,\n 37.688901\n ],\n [\n 117.506451,\n 37.686803\n ],\n [\n 117.50345,\n 37.680548\n ],\n [\n 117.488604,\n 37.677025\n ],\n [\n 117.477075,\n 37.654416\n ],\n [\n 117.465625,\n 37.655564\n ],\n [\n 117.451963,\n 37.669978\n ],\n [\n 117.444224,\n 37.671918\n ],\n [\n 117.428825,\n 37.665741\n ],\n [\n 117.415401,\n 37.669582\n ],\n [\n 117.407188,\n 37.678846\n ],\n [\n 117.392974,\n 37.660039\n ],\n [\n 117.373074,\n 37.648594\n ],\n [\n 117.363835,\n 37.649624\n ],\n [\n 117.357596,\n 37.658495\n ],\n [\n 117.358149,\n 37.672947\n ],\n [\n 117.363598,\n 37.679559\n ],\n [\n 117.36573,\n 37.698361\n ],\n [\n 117.352543,\n 37.707345\n ],\n [\n 117.344567,\n 37.693136\n ],\n [\n 117.347489,\n 37.683319\n ],\n [\n 117.329405,\n 37.673343\n ],\n [\n 117.318428,\n 37.662019\n ],\n [\n 117.312506,\n 37.64194\n ],\n [\n 117.304925,\n 37.640514\n ],\n [\n 117.312585,\n 37.633701\n ],\n [\n 117.317797,\n 37.615081\n ],\n [\n 117.314875,\n 37.600458\n ],\n [\n 117.308321,\n 37.589956\n ],\n [\n 117.288973,\n 37.577112\n ],\n [\n 117.280682,\n 37.56621\n ],\n [\n 117.277681,\n 37.545391\n ],\n [\n 117.273417,\n 37.532619\n ],\n [\n 117.260861,\n 37.530081\n ],\n [\n 117.238197,\n 37.532897\n ],\n [\n 117.230063,\n 37.528891\n ],\n [\n 117.22114,\n 37.51318\n ],\n [\n 117.199345,\n 37.487148\n ],\n [\n 117.176049,\n 37.486116\n ],\n [\n 117.163809,\n 37.478971\n ],\n [\n 117.135618,\n 37.475239\n ],\n [\n 117.124878,\n 37.483853\n ],\n [\n 117.109795,\n 37.47901\n ],\n [\n 117.098819,\n 37.469721\n ],\n [\n 117.104978,\n 37.455309\n ],\n [\n 117.096845,\n 37.440099\n ],\n [\n 117.085631,\n 37.437517\n ],\n [\n 117.029406,\n 37.435174\n ],\n [\n 117.018193,\n 37.418967\n ],\n [\n 117.019693,\n 37.405419\n ],\n [\n 117.008164,\n 37.392464\n ],\n [\n 116.99924,\n 37.376964\n ],\n [\n 117.009664,\n 37.359671\n ],\n [\n 117.006663,\n 37.355138\n ],\n [\n 116.987158,\n 37.342692\n ],\n [\n 116.986684,\n 37.335335\n ],\n [\n 116.993397,\n 37.32201\n ],\n [\n 117.002241,\n 37.285962\n ],\n [\n 117.024273,\n 37.278918\n ],\n [\n 117.038961,\n 37.266538\n ],\n [\n 117.030275,\n 37.264229\n ],\n [\n 117.032328,\n 37.253241\n ],\n [\n 117.041251,\n 37.247667\n ],\n [\n 117.042673,\n 37.238867\n ],\n [\n 117.036592,\n 37.237393\n ],\n [\n 117.03596,\n 37.224091\n ],\n [\n 117.022299,\n 37.215089\n ],\n [\n 117.037777,\n 37.207361\n ],\n [\n 117.037382,\n 37.195169\n ],\n [\n 117.045358,\n 37.197161\n ],\n [\n 117.05744,\n 37.192141\n ],\n [\n 117.06352,\n 37.182656\n ],\n [\n 117.061783,\n 37.16496\n ],\n [\n 117.050648,\n 37.160894\n ],\n [\n 117.054676,\n 37.141717\n ],\n [\n 117.059809,\n 37.137251\n ],\n [\n 117.047411,\n 37.134739\n ],\n [\n 117.044884,\n 37.122615\n ],\n [\n 117.024273,\n 37.119664\n ],\n [\n 117.004531,\n 37.121219\n ],\n [\n 116.982578,\n 37.113601\n ],\n [\n 116.931486,\n 37.100477\n ],\n [\n 116.919009,\n 37.093056\n ],\n [\n 116.91972,\n 37.081364\n ],\n [\n 116.925247,\n 37.069831\n ],\n [\n 116.928643,\n 37.05103\n ],\n [\n 116.944279,\n 37.042327\n ],\n [\n 116.948701,\n 37.036537\n ],\n [\n 116.943173,\n 37.030907\n ],\n [\n 116.907796,\n 37.019046\n ],\n [\n 116.891607,\n 37.00271\n ],\n [\n 116.875024,\n 36.999274\n ],\n [\n 116.885764,\n 36.991444\n ],\n [\n 116.886158,\n 36.983573\n ],\n [\n 116.899188,\n 36.977499\n ],\n [\n 116.897767,\n 36.962712\n ],\n [\n 116.907717,\n 36.963272\n ],\n [\n 116.933381,\n 36.959595\n ],\n [\n 116.931881,\n 36.946204\n ],\n [\n 116.935434,\n 36.93457\n ],\n [\n 116.922563,\n 36.93453\n ],\n [\n 116.934408,\n 36.925973\n ],\n [\n 116.957466,\n 36.916495\n ],\n [\n 116.963152,\n 36.893896\n ],\n [\n 116.96181,\n 36.867529\n ],\n [\n 116.962836,\n 36.842674\n ],\n [\n 116.948069,\n 36.839231\n ],\n [\n 116.9442,\n 36.844916\n ],\n [\n 116.934724,\n 36.845116\n ],\n [\n 116.935908,\n 36.829743\n ],\n [\n 116.933223,\n 36.823697\n ],\n [\n 116.919404,\n 36.822776\n ],\n [\n 116.892476,\n 36.830023\n ],\n [\n 116.887106,\n 36.833427\n ],\n [\n 116.882447,\n 36.824058\n ],\n [\n 116.887975,\n 36.811404\n ],\n [\n 116.872813,\n 36.812004\n ],\n [\n 116.868233,\n 36.801872\n ],\n [\n 116.865548,\n 36.777877\n ],\n [\n 116.87076,\n 36.759164\n ],\n [\n 116.883868,\n 36.758243\n ],\n [\n 116.88679,\n 36.745538\n ],\n [\n 116.873997,\n 36.739846\n ],\n [\n 116.861757,\n 36.730345\n ],\n [\n 116.842489,\n 36.72786\n ],\n [\n 116.830881,\n 36.723851\n ],\n [\n 116.802768,\n 36.706729\n ],\n [\n 116.799689,\n 36.694417\n ],\n [\n 116.780657,\n 36.691048\n ],\n [\n 116.780736,\n 36.671552\n ],\n [\n 116.777262,\n 36.660718\n ],\n [\n 116.763126,\n 36.651971\n ],\n [\n 116.759494,\n 36.632746\n ],\n [\n 116.742042,\n 36.620381\n ],\n [\n 116.71314,\n 36.608858\n ],\n [\n 116.693319,\n 36.607895\n ],\n [\n 116.694345,\n 36.591149\n ],\n [\n 116.682421,\n 36.580586\n ],\n [\n 116.661258,\n 36.578376\n ],\n [\n 116.662916,\n 36.563111\n ],\n [\n 116.658968,\n 36.553026\n ],\n [\n 116.646728,\n 36.544105\n ],\n [\n 116.629592,\n 36.544587\n ],\n [\n 116.622801,\n 36.532651\n ],\n [\n 116.60835,\n 36.52011\n ],\n [\n 116.610087,\n 36.51609\n ],\n [\n 116.627223,\n 36.508853\n ],\n [\n 116.624301,\n 36.497233\n ],\n [\n 116.602032,\n 36.495223\n ],\n [\n 116.593267,\n 36.485973\n ],\n [\n 116.595636,\n 36.480383\n ],\n [\n 116.613009,\n 36.473425\n ],\n [\n 116.611429,\n 36.459104\n ],\n [\n 116.620905,\n 36.44144\n ],\n [\n 116.6198,\n 36.428522\n ],\n [\n 116.612377,\n 36.42333\n ],\n [\n 116.591213,\n 36.416286\n ],\n [\n 116.546202,\n 36.40892\n ],\n [\n 116.549518,\n 36.417333\n ],\n [\n 116.535857,\n 36.41842\n ],\n [\n 116.539647,\n 36.427597\n ],\n [\n 116.527092,\n 36.424337\n ],\n [\n 116.511851,\n 36.430012\n ],\n [\n 116.512798,\n 36.441239\n ],\n [\n 116.507271,\n 36.447999\n ],\n [\n 116.489345,\n 36.454477\n ],\n [\n 116.481685,\n 36.448361\n ],\n [\n 116.461548,\n 36.449971\n ],\n [\n 116.455705,\n 36.46192\n ],\n [\n 116.459258,\n 36.47978\n ],\n [\n 116.445676,\n 36.488587\n ],\n [\n 116.443544,\n 36.498319\n ],\n [\n 116.431304,\n 36.500611\n ],\n [\n 116.412983,\n 36.519145\n ],\n [\n 116.400901,\n 36.524813\n ],\n [\n 116.399322,\n 36.540126\n ],\n [\n 116.403507,\n 36.564878\n ],\n [\n 116.410298,\n 36.593237\n ],\n [\n 116.411325,\n 36.615242\n ],\n [\n 116.406034,\n 36.631983\n ],\n [\n 116.41322,\n 36.643181\n ],\n [\n 116.411246,\n 36.676647\n ],\n [\n 116.40706,\n 36.689042\n ],\n [\n 116.407139,\n 36.704804\n ],\n [\n 116.397584,\n 36.715431\n ],\n [\n 116.393399,\n 36.731708\n ],\n [\n 116.401849,\n 36.74634\n ],\n [\n 116.405639,\n 36.761208\n ],\n [\n 116.396242,\n 36.792459\n ],\n [\n 116.376026,\n 36.797025\n ],\n [\n 116.391978,\n 36.802913\n ],\n [\n 116.397663,\n 36.809441\n ],\n [\n 116.409193,\n 36.807038\n ],\n [\n 116.408008,\n 36.815729\n ],\n [\n 116.399874,\n 36.823857\n ],\n [\n 116.409587,\n 36.83759\n ],\n [\n 116.407218,\n 36.846717\n ],\n [\n 116.415352,\n 36.855923\n ],\n [\n 116.412746,\n 36.861086\n ],\n [\n 116.429645,\n 36.865208\n ],\n [\n 116.434146,\n 36.876453\n ],\n [\n 116.419537,\n 36.877213\n ],\n [\n 116.415905,\n 36.881374\n ],\n [\n 116.422143,\n 36.890536\n ],\n [\n 116.417958,\n 36.894297\n ],\n [\n 116.421591,\n 36.905257\n ],\n [\n 116.433988,\n 36.908417\n ],\n [\n 116.447966,\n 36.899977\n ],\n [\n 116.452467,\n 36.906417\n ],\n [\n 116.449308,\n 36.915496\n ],\n [\n 116.439911,\n 36.916495\n ],\n [\n 116.444728,\n 36.923694\n ],\n [\n 116.443149,\n 36.932211\n ],\n [\n 116.461548,\n 36.940687\n ],\n [\n 116.470551,\n 36.940007\n ],\n [\n 116.471103,\n 36.947043\n ],\n [\n 116.458074,\n 36.955358\n ],\n [\n 116.442675,\n 36.954319\n ],\n [\n 116.434383,\n 36.968228\n ],\n [\n 116.405876,\n 36.969067\n ],\n [\n 116.379343,\n 36.966309\n ],\n [\n 116.370261,\n 36.963272\n ],\n [\n 116.366471,\n 36.971864\n ],\n [\n 116.341359,\n 36.980256\n ],\n [\n 116.340175,\n 36.971944\n ],\n [\n 116.324065,\n 36.972024\n ],\n [\n 116.317037,\n 36.981854\n ],\n [\n 116.304955,\n 36.990245\n ],\n [\n 116.30535,\n 36.994999\n ],\n [\n 116.290741,\n 36.995759\n ],\n [\n 116.26784,\n 37.010499\n ],\n [\n 116.254731,\n 37.008262\n ],\n [\n 116.247624,\n 37.019685\n ],\n [\n 116.250388,\n 37.025476\n ],\n [\n 116.232857,\n 37.032225\n ],\n [\n 116.225592,\n 37.025396\n ],\n [\n 116.222276,\n 37.010339\n ],\n [\n 116.235779,\n 37.010139\n ],\n [\n 116.229225,\n 36.996438\n ],\n [\n 116.211694,\n 36.990085\n ],\n [\n 116.212089,\n 36.982454\n ],\n [\n 116.219196,\n 36.979617\n ],\n [\n 116.210588,\n 36.970146\n ],\n [\n 116.211536,\n 36.963112\n ],\n [\n 116.191478,\n 36.963312\n ],\n [\n 116.18366,\n 36.959595\n ],\n [\n 116.172842,\n 36.947723\n ],\n [\n 116.173237,\n 36.929692\n ],\n [\n 116.164392,\n 36.916975\n ],\n [\n 116.146388,\n 36.910776\n ],\n [\n 116.123724,\n 36.890656\n ],\n [\n 116.114958,\n 36.897697\n ],\n [\n 116.097349,\n 36.891336\n ],\n [\n 116.098217,\n 36.883895\n ],\n [\n 116.082424,\n 36.883855\n ],\n [\n 116.075948,\n 36.889496\n ],\n [\n 116.061892,\n 36.888576\n ],\n [\n 116.050126,\n 36.894497\n ],\n [\n 116.005667,\n 36.884375\n ],\n [\n 115.947704,\n 36.888576\n ],\n [\n 115.920461,\n 36.892976\n ],\n [\n 115.894796,\n 36.905657\n ],\n [\n 115.885241,\n 36.907017\n ],\n [\n 115.881687,\n 36.917575\n ],\n [\n 115.875844,\n 36.916255\n ],\n [\n 115.868421,\n 36.901457\n ],\n [\n 115.853733,\n 36.904777\n ],\n [\n 115.85855,\n 36.908337\n ],\n [\n 115.85397,\n 36.916215\n ],\n [\n 115.848995,\n 36.912656\n ],\n [\n 115.832964,\n 36.918575\n ],\n [\n 115.83178,\n 36.910856\n ],\n [\n 115.823251,\n 36.913496\n ],\n [\n 115.81875,\n 36.908577\n ],\n [\n 115.813064,\n 36.913416\n ],\n [\n 115.791348,\n 36.914336\n ],\n [\n 115.779819,\n 36.904977\n ],\n [\n 115.780293,\n 36.912216\n ],\n [\n 115.768684,\n 36.921014\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 371500,\n \"name\": \"聊城市\",\n \"center\": [\n 115.980367,\n 36.456013\n ],\n \"centroid\": [\n 115.887733,\n 36.460089\n ],\n \"childrenNum\": 8,\n \"level\": \"city\",\n \"parent\": {\n \"adcode\": 370000\n },\n \"subFeatureIndex\": 13,\n \"acroutes\": [\n 100000,\n 370000\n ]\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 115.768684,\n 36.921014\n ],\n [\n 115.780293,\n 36.912216\n ],\n [\n 115.779819,\n 36.904977\n ],\n [\n 115.791348,\n 36.914336\n ],\n [\n 115.813064,\n 36.913416\n ],\n [\n 115.81875,\n 36.908577\n ],\n [\n 115.823251,\n 36.913496\n ],\n [\n 115.83178,\n 36.910856\n ],\n [\n 115.832964,\n 36.918575\n ],\n [\n 115.848995,\n 36.912656\n ],\n [\n 115.85397,\n 36.916215\n ],\n [\n 115.85855,\n 36.908337\n ],\n [\n 115.853733,\n 36.904777\n ],\n [\n 115.868421,\n 36.901457\n ],\n [\n 115.875844,\n 36.916255\n ],\n [\n 115.881687,\n 36.917575\n ],\n [\n 115.885241,\n 36.907017\n ],\n [\n 115.894796,\n 36.905657\n ],\n [\n 115.920461,\n 36.892976\n ],\n [\n 115.947704,\n 36.888576\n ],\n [\n 116.005667,\n 36.884375\n ],\n [\n 116.050126,\n 36.894497\n ],\n [\n 116.061892,\n 36.888576\n ],\n [\n 116.075948,\n 36.889496\n ],\n [\n 116.082424,\n 36.883855\n ],\n [\n 116.098217,\n 36.883895\n ],\n [\n 116.097349,\n 36.891336\n ],\n [\n 116.114958,\n 36.897697\n ],\n [\n 116.123724,\n 36.890656\n ],\n [\n 116.146388,\n 36.910776\n ],\n [\n 116.164392,\n 36.916975\n ],\n [\n 116.173237,\n 36.929692\n ],\n [\n 116.172842,\n 36.947723\n ],\n [\n 116.18366,\n 36.959595\n ],\n [\n 116.191478,\n 36.963312\n ],\n [\n 116.211536,\n 36.963112\n ],\n [\n 116.210588,\n 36.970146\n ],\n [\n 116.219196,\n 36.979617\n ],\n [\n 116.212089,\n 36.982454\n ],\n [\n 116.211694,\n 36.990085\n ],\n [\n 116.229225,\n 36.996438\n ],\n [\n 116.235779,\n 37.010139\n ],\n [\n 116.222276,\n 37.010339\n ],\n [\n 116.225592,\n 37.025396\n ],\n [\n 116.232857,\n 37.032225\n ],\n [\n 116.250388,\n 37.025476\n ],\n [\n 116.247624,\n 37.019685\n ],\n [\n 116.254731,\n 37.008262\n ],\n [\n 116.26784,\n 37.010499\n ],\n [\n 116.290741,\n 36.995759\n ],\n [\n 116.30535,\n 36.994999\n ],\n [\n 116.304955,\n 36.990245\n ],\n [\n 116.317037,\n 36.981854\n ],\n [\n 116.324065,\n 36.972024\n ],\n [\n 116.340175,\n 36.971944\n ],\n [\n 116.341359,\n 36.980256\n ],\n [\n 116.366471,\n 36.971864\n ],\n [\n 116.370261,\n 36.963272\n ],\n [\n 116.379343,\n 36.966309\n ],\n [\n 116.405876,\n 36.969067\n ],\n [\n 116.434383,\n 36.968228\n ],\n [\n 116.442675,\n 36.954319\n ],\n [\n 116.458074,\n 36.955358\n ],\n [\n 116.471103,\n 36.947043\n ],\n [\n 116.470551,\n 36.940007\n ],\n [\n 116.461548,\n 36.940687\n ],\n [\n 116.443149,\n 36.932211\n ],\n [\n 116.444728,\n 36.923694\n ],\n [\n 116.439911,\n 36.916495\n ],\n [\n 116.449308,\n 36.915496\n ],\n [\n 116.452467,\n 36.906417\n ],\n [\n 116.447966,\n 36.899977\n ],\n [\n 116.433988,\n 36.908417\n ],\n [\n 116.421591,\n 36.905257\n ],\n [\n 116.417958,\n 36.894297\n ],\n [\n 116.422143,\n 36.890536\n ],\n [\n 116.415905,\n 36.881374\n ],\n [\n 116.419537,\n 36.877213\n ],\n [\n 116.434146,\n 36.876453\n ],\n [\n 116.429645,\n 36.865208\n ],\n [\n 116.412746,\n 36.861086\n ],\n [\n 116.415352,\n 36.855923\n ],\n [\n 116.407218,\n 36.846717\n ],\n [\n 116.409587,\n 36.83759\n ],\n [\n 116.399874,\n 36.823857\n ],\n [\n 116.408008,\n 36.815729\n ],\n [\n 116.409193,\n 36.807038\n ],\n [\n 116.397663,\n 36.809441\n ],\n [\n 116.391978,\n 36.802913\n ],\n [\n 116.376026,\n 36.797025\n ],\n [\n 116.396242,\n 36.792459\n ],\n [\n 116.405639,\n 36.761208\n ],\n [\n 116.401849,\n 36.74634\n ],\n [\n 116.393399,\n 36.731708\n ],\n [\n 116.397584,\n 36.715431\n ],\n [\n 116.407139,\n 36.704804\n ],\n [\n 116.40706,\n 36.689042\n ],\n [\n 116.411246,\n 36.676647\n ],\n [\n 116.41322,\n 36.643181\n ],\n [\n 116.406034,\n 36.631983\n ],\n [\n 116.411325,\n 36.615242\n ],\n [\n 116.410298,\n 36.593237\n ],\n [\n 116.403507,\n 36.564878\n ],\n [\n 116.399322,\n 36.540126\n ],\n [\n 116.400901,\n 36.524813\n ],\n [\n 116.412983,\n 36.519145\n ],\n [\n 116.431304,\n 36.500611\n ],\n [\n 116.443544,\n 36.498319\n ],\n [\n 116.445676,\n 36.488587\n ],\n [\n 116.459258,\n 36.47978\n ],\n [\n 116.455705,\n 36.46192\n ],\n [\n 116.461548,\n 36.449971\n ],\n [\n 116.481685,\n 36.448361\n ],\n [\n 116.489345,\n 36.454477\n ],\n [\n 116.507271,\n 36.447999\n ],\n [\n 116.512798,\n 36.441239\n ],\n [\n 116.511851,\n 36.430012\n ],\n [\n 116.527092,\n 36.424337\n ],\n [\n 116.539647,\n 36.427597\n ],\n [\n 116.535857,\n 36.41842\n ],\n [\n 116.549518,\n 36.417333\n ],\n [\n 116.546202,\n 36.40892\n ],\n [\n 116.528592,\n 36.387259\n ],\n [\n 116.519984,\n 36.384158\n ],\n [\n 116.503717,\n 36.369982\n ],\n [\n 116.484607,\n 36.336948\n ],\n [\n 116.449071,\n 36.337149\n ],\n [\n 116.441411,\n 36.321755\n ],\n [\n 116.430593,\n 36.318007\n ],\n [\n 116.406745,\n 36.319015\n ],\n [\n 116.374526,\n 36.3039\n ],\n [\n 116.331251,\n 36.290677\n ],\n [\n 116.322644,\n 36.284669\n ],\n [\n 116.310799,\n 36.270515\n ],\n [\n 116.307166,\n 36.259464\n ],\n [\n 116.28624,\n 36.239174\n ],\n [\n 116.280159,\n 36.221945\n ],\n [\n 116.255047,\n 36.203703\n ],\n [\n 116.234911,\n 36.180935\n ],\n [\n 116.226066,\n 36.173748\n ],\n [\n 116.213036,\n 36.169831\n ],\n [\n 116.169446,\n 36.171325\n ],\n [\n 116.164392,\n 36.168862\n ],\n [\n 116.164313,\n 36.146084\n ],\n [\n 116.123882,\n 36.136429\n ],\n [\n 116.114011,\n 36.122047\n ],\n [\n 116.099323,\n 36.112066\n ],\n [\n 116.057391,\n 36.104913\n ],\n [\n 116.028804,\n 36.072292\n ],\n [\n 116.016406,\n 36.061375\n ],\n [\n 115.989794,\n 36.045442\n ],\n [\n 115.964051,\n 36.0416\n ],\n [\n 115.935859,\n 36.031447\n ],\n [\n 115.919276,\n 36.019675\n ],\n [\n 115.895981,\n 36.026188\n ],\n [\n 115.869447,\n 36.015346\n ],\n [\n 115.859655,\n 36.003693\n ],\n [\n 115.846231,\n 36.004987\n ],\n [\n 115.837465,\n 36.011016\n ],\n [\n 115.81725,\n 36.012756\n ],\n [\n 115.797508,\n 36.00697\n ],\n [\n 115.779819,\n 35.993778\n ],\n [\n 115.786689,\n 35.991228\n ],\n [\n 115.774528,\n 35.981878\n ],\n [\n 115.774686,\n 35.974511\n ],\n [\n 115.764341,\n 35.970989\n ],\n [\n 115.73307,\n 35.96682\n ],\n [\n 115.717908,\n 35.971394\n ],\n [\n 115.698719,\n 35.96605\n ],\n [\n 115.686953,\n 35.9552\n ],\n [\n 115.68411,\n 35.944388\n ],\n [\n 115.675423,\n 35.938435\n ],\n [\n 115.651812,\n 35.928917\n ],\n [\n 115.642415,\n 35.920046\n ],\n [\n 115.607353,\n 35.925839\n ],\n [\n 115.583742,\n 35.921707\n ],\n [\n 115.548206,\n 35.898006\n ],\n [\n 115.513302,\n 35.890348\n ],\n [\n 115.504932,\n 35.8991\n ],\n [\n 115.510775,\n 35.908014\n ],\n [\n 115.505406,\n 35.914415\n ],\n [\n 115.490717,\n 35.908379\n ],\n [\n 115.495377,\n 35.896021\n ],\n [\n 115.488033,\n 35.880784\n ],\n [\n 115.460078,\n 35.867732\n ],\n [\n 115.433861,\n 35.839069\n ],\n [\n 115.432834,\n 35.833878\n ],\n [\n 115.417909,\n 35.824996\n ],\n [\n 115.407564,\n 35.80865\n ],\n [\n 115.370923,\n 35.788852\n ],\n [\n 115.3635,\n 35.779925\n ],\n [\n 115.334993,\n 35.796723\n ],\n [\n 115.335704,\n 35.814329\n ],\n [\n 115.344074,\n 35.838744\n ],\n [\n 115.349602,\n 35.860963\n ],\n [\n 115.338152,\n 35.864692\n ],\n [\n 115.3436,\n 35.87215\n ],\n [\n 115.354893,\n 35.869273\n ],\n [\n 115.36429,\n 35.894035\n ],\n [\n 115.367449,\n 35.92033\n ],\n [\n 115.364132,\n 35.929484\n ],\n [\n 115.354182,\n 35.937503\n ],\n [\n 115.356472,\n 35.954633\n ],\n [\n 115.363105,\n 35.972002\n ],\n [\n 115.386322,\n 35.974471\n ],\n [\n 115.395956,\n 35.991673\n ],\n [\n 115.419646,\n 36.004745\n ],\n [\n 115.4431,\n 36.008872\n ],\n [\n 115.447522,\n 36.011826\n ],\n [\n 115.448865,\n 36.047383\n ],\n [\n 115.441599,\n 36.055755\n ],\n [\n 115.459604,\n 36.063357\n ],\n [\n 115.455103,\n 36.071282\n ],\n [\n 115.459762,\n 36.080378\n ],\n [\n 115.466395,\n 36.079691\n ],\n [\n 115.468843,\n 36.092222\n ],\n [\n 115.473976,\n 36.098123\n ],\n [\n 115.484242,\n 36.125845\n ],\n [\n 115.48519,\n 36.139702\n ],\n [\n 115.480689,\n 36.171729\n ],\n [\n 115.47595,\n 36.193046\n ],\n [\n 115.479109,\n 36.209555\n ],\n [\n 115.47595,\n 36.218878\n ],\n [\n 115.476503,\n 36.246516\n ],\n [\n 115.465369,\n 36.250389\n ],\n [\n 115.467817,\n 36.267894\n ],\n [\n 115.462684,\n 36.27612\n ],\n [\n 115.446101,\n 36.273782\n ],\n [\n 115.436388,\n 36.276362\n ],\n [\n 115.428491,\n 36.286201\n ],\n [\n 115.41704,\n 36.292773\n ],\n [\n 115.422963,\n 36.30261\n ],\n [\n 115.41941,\n 36.310914\n ],\n [\n 115.422963,\n 36.322199\n ],\n [\n 115.414987,\n 36.326551\n ],\n [\n 115.394614,\n 36.322602\n ],\n [\n 115.366659,\n 36.308938\n ],\n [\n 115.359789,\n 36.318733\n ],\n [\n 115.370449,\n 36.332757\n ],\n [\n 115.368712,\n 36.342629\n ],\n [\n 115.349602,\n 36.363094\n ],\n [\n 115.348575,\n 36.384641\n ],\n [\n 115.339968,\n 36.39809\n ],\n [\n 115.324885,\n 36.405095\n ],\n [\n 115.313514,\n 36.406625\n ],\n [\n 115.297404,\n 36.413469\n ],\n [\n 115.312092,\n 36.433593\n ],\n [\n 115.316909,\n 36.432587\n ],\n [\n 115.317067,\n 36.454035\n ],\n [\n 115.300247,\n 36.465902\n ],\n [\n 115.291403,\n 36.460592\n ],\n [\n 115.288876,\n 36.470006\n ],\n [\n 115.293693,\n 36.476079\n ],\n [\n 115.28469,\n 36.476441\n ],\n [\n 115.283506,\n 36.486416\n ],\n [\n 115.276083,\n 36.486938\n ],\n [\n 115.272845,\n 36.497394\n ],\n [\n 115.289744,\n 36.497796\n ],\n [\n 115.296536,\n 36.508853\n ],\n [\n 115.292587,\n 36.514401\n ],\n [\n 115.295193,\n 36.523205\n ],\n [\n 115.288323,\n 36.528511\n ],\n [\n 115.295035,\n 36.533254\n ],\n [\n 115.300484,\n 36.525938\n ],\n [\n 115.307433,\n 36.527426\n ],\n [\n 115.331281,\n 36.550213\n ],\n [\n 115.334282,\n 36.582473\n ],\n [\n 115.337836,\n 36.58898\n ],\n [\n 115.35055,\n 36.590065\n ],\n [\n 115.351576,\n 36.595004\n ],\n [\n 115.340363,\n 36.595245\n ],\n [\n 115.341468,\n 36.603478\n ],\n [\n 115.350707,\n 36.60665\n ],\n [\n 115.345022,\n 36.612392\n ],\n [\n 115.35513,\n 36.627407\n ],\n [\n 115.366027,\n 36.621947\n ],\n [\n 115.378504,\n 36.632866\n ],\n [\n 115.38798,\n 36.646432\n ],\n [\n 115.386322,\n 36.656305\n ],\n [\n 115.406459,\n 36.663246\n ],\n [\n 115.412144,\n 36.676486\n ],\n [\n 115.420594,\n 36.686756\n ],\n [\n 115.446653,\n 36.694617\n ],\n [\n 115.451391,\n 36.702197\n ],\n [\n 115.450523,\n 36.713626\n ],\n [\n 115.459762,\n 36.717395\n ],\n [\n 115.460947,\n 36.731869\n ],\n [\n 115.475477,\n 36.744215\n ],\n [\n 115.478398,\n 36.758804\n ],\n [\n 115.491428,\n 36.761609\n ],\n [\n 115.506511,\n 36.770465\n ],\n [\n 115.523568,\n 36.763853\n ],\n [\n 115.52878,\n 36.77395\n ],\n [\n 115.536835,\n 36.772628\n ],\n [\n 115.53873,\n 36.784127\n ],\n [\n 115.54947,\n 36.782885\n ],\n [\n 115.552628,\n 36.775874\n ],\n [\n 115.561315,\n 36.775753\n ],\n [\n 115.560525,\n 36.783806\n ],\n [\n 115.572133,\n 36.775353\n ],\n [\n 115.584689,\n 36.781042\n ],\n [\n 115.63744,\n 36.797506\n ],\n [\n 115.650469,\n 36.807519\n ],\n [\n 115.666184,\n 36.812485\n ],\n [\n 115.671554,\n 36.809281\n ],\n [\n 115.684189,\n 36.812966\n ],\n [\n 115.692243,\n 36.829343\n ],\n [\n 115.688532,\n 36.840312\n ],\n [\n 115.700772,\n 36.860726\n ],\n [\n 115.699982,\n 36.866929\n ],\n [\n 115.711275,\n 36.882374\n ],\n [\n 115.726121,\n 36.893616\n ],\n [\n 115.735202,\n 36.897017\n ],\n [\n 115.740572,\n 36.906417\n ],\n [\n 115.757787,\n 36.903017\n ],\n [\n 115.765131,\n 36.909096\n ],\n [\n 115.768684,\n 36.921014\n ]\n ]\n ],\n [\n [\n [\n 115.495377,\n 35.896021\n ],\n [\n 115.504932,\n 35.8991\n ],\n [\n 115.513302,\n 35.890348\n ],\n [\n 115.503431,\n 35.888686\n ],\n [\n 115.488033,\n 35.880784\n ],\n [\n 115.495377,\n 35.896021\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 371600,\n \"name\": \"滨州市\",\n \"center\": [\n 118.016974,\n 37.383542\n ],\n \"centroid\": [\n 117.847396,\n 37.542717\n ],\n \"childrenNum\": 7,\n \"level\": \"city\",\n \"parent\": {\n \"adcode\": 370000\n },\n \"subFeatureIndex\": 14,\n \"acroutes\": [\n 100000,\n 370000\n ]\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 117.273417,\n 37.532619\n ],\n [\n 117.277681,\n 37.545391\n ],\n [\n 117.280682,\n 37.56621\n ],\n [\n 117.288973,\n 37.577112\n ],\n [\n 117.308321,\n 37.589956\n ],\n [\n 117.314875,\n 37.600458\n ],\n [\n 117.317797,\n 37.615081\n ],\n [\n 117.312585,\n 37.633701\n ],\n [\n 117.304925,\n 37.640514\n ],\n [\n 117.312506,\n 37.64194\n ],\n [\n 117.318428,\n 37.662019\n ],\n [\n 117.329405,\n 37.673343\n ],\n [\n 117.347489,\n 37.683319\n ],\n [\n 117.344567,\n 37.693136\n ],\n [\n 117.352543,\n 37.707345\n ],\n [\n 117.36573,\n 37.698361\n ],\n [\n 117.363598,\n 37.679559\n ],\n [\n 117.358149,\n 37.672947\n ],\n [\n 117.357596,\n 37.658495\n ],\n [\n 117.363835,\n 37.649624\n ],\n [\n 117.373074,\n 37.648594\n ],\n [\n 117.392974,\n 37.660039\n ],\n [\n 117.407188,\n 37.678846\n ],\n [\n 117.415401,\n 37.669582\n ],\n [\n 117.428825,\n 37.665741\n ],\n [\n 117.444224,\n 37.671918\n ],\n [\n 117.451963,\n 37.669978\n ],\n [\n 117.465625,\n 37.655564\n ],\n [\n 117.477075,\n 37.654416\n ],\n [\n 117.488604,\n 37.677025\n ],\n [\n 117.50345,\n 37.680548\n ],\n [\n 117.506451,\n 37.686803\n ],\n [\n 117.531247,\n 37.688901\n ],\n [\n 117.543092,\n 37.703625\n ],\n [\n 117.539775,\n 37.713993\n ],\n [\n 117.556201,\n 37.716683\n ],\n [\n 117.542618,\n 37.726258\n ],\n [\n 117.547198,\n 37.737494\n ],\n [\n 117.544119,\n 37.747699\n ],\n [\n 117.531563,\n 37.748213\n ],\n [\n 117.522165,\n 37.755371\n ],\n [\n 117.526509,\n 37.762964\n ],\n [\n 117.547356,\n 37.767512\n ],\n [\n 117.546567,\n 37.776368\n ],\n [\n 117.559912,\n 37.800008\n ],\n [\n 117.568599,\n 37.804987\n ],\n [\n 117.56623,\n 37.812733\n ],\n [\n 117.588025,\n 37.82273\n ],\n [\n 117.59529,\n 37.834741\n ],\n [\n 117.605003,\n 37.838968\n ],\n [\n 117.606582,\n 37.845209\n ],\n [\n 117.595685,\n 37.853504\n ],\n [\n 117.581076,\n 37.858993\n ],\n [\n 117.580602,\n 37.875302\n ],\n [\n 117.568835,\n 37.882409\n ],\n [\n 117.547198,\n 37.883198\n ],\n [\n 117.542776,\n 37.890146\n ],\n [\n 117.539302,\n 37.913552\n ],\n [\n 117.529036,\n 37.932295\n ],\n [\n 117.567809,\n 37.946772\n ],\n [\n 117.570652,\n 37.957264\n ],\n [\n 117.563545,\n 37.998585\n ],\n [\n 117.54933,\n 38.010252\n ],\n [\n 117.541039,\n 38.011237\n ],\n [\n 117.545935,\n 38.026842\n ],\n [\n 117.560386,\n 38.040987\n ],\n [\n 117.556517,\n 38.057215\n ],\n [\n 117.564887,\n 38.063674\n ],\n [\n 117.57618,\n 38.065132\n ],\n [\n 117.58376,\n 38.070645\n ],\n [\n 117.605082,\n 38.073008\n ],\n [\n 117.616769,\n 38.06903\n ],\n [\n 117.644961,\n 38.072377\n ],\n [\n 117.666045,\n 38.072535\n ],\n [\n 117.679469,\n 38.079544\n ],\n [\n 117.704502,\n 38.07604\n ],\n [\n 117.729219,\n 38.093796\n ],\n [\n 117.730641,\n 38.108321\n ],\n [\n 117.743197,\n 38.123393\n ],\n [\n 117.768782,\n 38.131893\n ],\n [\n 117.772099,\n 38.138817\n ],\n [\n 117.766966,\n 38.158682\n ],\n [\n 117.771704,\n 38.166076\n ],\n [\n 117.79421,\n 38.167846\n ],\n [\n 117.801317,\n 38.175239\n ],\n [\n 117.789235,\n 38.180744\n ],\n [\n 117.796105,\n 38.1936\n ],\n [\n 117.797842,\n 38.207712\n ],\n [\n 117.805897,\n 38.217734\n ],\n [\n 117.808582,\n 38.228383\n ],\n [\n 117.823586,\n 38.235652\n ],\n [\n 117.847513,\n 38.25392\n ],\n [\n 117.860859,\n 38.274578\n ],\n [\n 117.895683,\n 38.301629\n ],\n [\n 117.893393,\n 38.287968\n ],\n [\n 117.89671,\n 38.279605\n ],\n [\n 117.935404,\n 38.255098\n ],\n [\n 117.997631,\n 38.211918\n ],\n [\n 118.018794,\n 38.202641\n ],\n [\n 118.033009,\n 38.205904\n ],\n [\n 118.04517,\n 38.214001\n ],\n [\n 118.112134,\n 38.210227\n ],\n [\n 118.177915,\n 38.186406\n ],\n [\n 118.216846,\n 38.146921\n ],\n [\n 118.245432,\n 38.144286\n ],\n [\n 118.236272,\n 38.125754\n ],\n [\n 118.227664,\n 38.119262\n ],\n [\n 118.241247,\n 38.112138\n ],\n [\n 118.245511,\n 38.103322\n ],\n [\n 118.235324,\n 38.082969\n ],\n [\n 118.226638,\n 38.079583\n ],\n [\n 118.230665,\n 38.056743\n ],\n [\n 118.227585,\n 38.037874\n ],\n [\n 118.2234,\n 38.00095\n ],\n [\n 118.22956,\n 37.986444\n ],\n [\n 118.220873,\n 37.98258\n ],\n [\n 118.223479,\n 37.959788\n ],\n [\n 118.213529,\n 37.95541\n ],\n [\n 118.215503,\n 37.949376\n ],\n [\n 118.224742,\n 37.950559\n ],\n [\n 118.226954,\n 37.939672\n ],\n [\n 118.225611,\n 37.923417\n ],\n [\n 118.232718,\n 37.922509\n ],\n [\n 118.235403,\n 37.905343\n ],\n [\n 118.243142,\n 37.895673\n ],\n [\n 118.236588,\n 37.884501\n ],\n [\n 118.239115,\n 37.868708\n ],\n [\n 118.248749,\n 37.858164\n ],\n [\n 118.247643,\n 37.871788\n ],\n [\n 118.258146,\n 37.854886\n ],\n [\n 118.258304,\n 37.844182\n ],\n [\n 118.269754,\n 37.853109\n ],\n [\n 118.286337,\n 37.8569\n ],\n [\n 118.301657,\n 37.870208\n ],\n [\n 118.313265,\n 37.861521\n ],\n [\n 118.328111,\n 37.865272\n ],\n [\n 118.340193,\n 37.838059\n ],\n [\n 118.334271,\n 37.832134\n ],\n [\n 118.346116,\n 37.832371\n ],\n [\n 118.344932,\n 37.824627\n ],\n [\n 118.356382,\n 37.820834\n ],\n [\n 118.352355,\n 37.814274\n ],\n [\n 118.36191,\n 37.792063\n ],\n [\n 118.348406,\n 37.790719\n ],\n [\n 118.340588,\n 37.774391\n ],\n [\n 118.340667,\n 37.763913\n ],\n [\n 118.353065,\n 37.75814\n ],\n [\n 118.353697,\n 37.750151\n ],\n [\n 118.341931,\n 37.74667\n ],\n [\n 118.337509,\n 37.729502\n ],\n [\n 118.31753,\n 37.728395\n ],\n [\n 118.319425,\n 37.712924\n ],\n [\n 118.316187,\n 37.714151\n ],\n [\n 118.3045,\n 37.690722\n ],\n [\n 118.305132,\n 37.683122\n ],\n [\n 118.294076,\n 37.678529\n ],\n [\n 118.293129,\n 37.670096\n ],\n [\n 118.2846,\n 37.662058\n ],\n [\n 118.260989,\n 37.654614\n ],\n [\n 118.246459,\n 37.658376\n ],\n [\n 118.239431,\n 37.65596\n ],\n [\n 118.22569,\n 37.663682\n ],\n [\n 118.207449,\n 37.661583\n ],\n [\n 118.200657,\n 37.667404\n ],\n [\n 118.195445,\n 37.661742\n ],\n [\n 118.177125,\n 37.657623\n ],\n [\n 118.172545,\n 37.644079\n ],\n [\n 118.165596,\n 37.644633\n ],\n [\n 118.163542,\n 37.63069\n ],\n [\n 118.154935,\n 37.628036\n ],\n [\n 118.157462,\n 37.62035\n ],\n [\n 118.154935,\n 37.605491\n ],\n [\n 118.146722,\n 37.599943\n ],\n [\n 118.148696,\n 37.594078\n ],\n [\n 118.134877,\n 37.590035\n ],\n [\n 118.127612,\n 37.578103\n ],\n [\n 118.131324,\n 37.571285\n ],\n [\n 118.13922,\n 37.571364\n ],\n [\n 118.134166,\n 37.558478\n ],\n [\n 118.141431,\n 37.556297\n ],\n [\n 118.173176,\n 37.563593\n ],\n [\n 118.176098,\n 37.557129\n ],\n [\n 118.173255,\n 37.546858\n ],\n [\n 118.159831,\n 37.539164\n ],\n [\n 118.156988,\n 37.530358\n ],\n [\n 118.150987,\n 37.530517\n ],\n [\n 118.142537,\n 37.518933\n ],\n [\n 118.136772,\n 37.516791\n ],\n [\n 118.139378,\n 37.507427\n ],\n [\n 118.134245,\n 37.507387\n ],\n [\n 118.135035,\n 37.496752\n ],\n [\n 118.127849,\n 37.491831\n ],\n [\n 118.128481,\n 37.483694\n ],\n [\n 118.120426,\n 37.480757\n ],\n [\n 118.112766,\n 37.463528\n ],\n [\n 118.125322,\n 37.45912\n ],\n [\n 118.118531,\n 37.456182\n ],\n [\n 118.114898,\n 37.439742\n ],\n [\n 118.136141,\n 37.441688\n ],\n [\n 118.14996,\n 37.438351\n ],\n [\n 118.163937,\n 37.416742\n ],\n [\n 118.165596,\n 37.4082\n ],\n [\n 118.160147,\n 37.399618\n ],\n [\n 118.16141,\n 37.389961\n ],\n [\n 118.144037,\n 37.392822\n ],\n [\n 118.135509,\n 37.384834\n ],\n [\n 118.141668,\n 37.376487\n ],\n [\n 118.154935,\n 37.377401\n ],\n [\n 118.156198,\n 37.364322\n ],\n [\n 118.161015,\n 37.362573\n ],\n [\n 118.202,\n 37.382409\n ],\n [\n 118.216925,\n 37.385191\n ],\n [\n 118.217951,\n 37.371478\n ],\n [\n 118.222768,\n 37.367861\n ],\n [\n 118.245353,\n 37.367781\n ],\n [\n 118.245827,\n 37.376646\n ],\n [\n 118.258541,\n 37.37911\n ],\n [\n 118.262015,\n 37.364283\n ],\n [\n 118.273624,\n 37.360029\n ],\n [\n 118.286495,\n 37.362772\n ],\n [\n 118.291865,\n 37.358518\n ],\n [\n 118.287285,\n 37.352434\n ],\n [\n 118.315398,\n 37.352514\n ],\n [\n 118.31524,\n 37.31477\n ],\n [\n 118.319741,\n 37.305978\n ],\n [\n 118.326058,\n 37.306535\n ],\n [\n 118.325584,\n 37.296866\n ],\n [\n 118.342168,\n 37.295075\n ],\n [\n 118.342168,\n 37.287076\n ],\n [\n 118.355197,\n 37.286997\n ],\n [\n 118.358277,\n 37.280669\n ],\n [\n 118.368069,\n 37.279594\n ],\n [\n 118.36262,\n 37.273783\n ],\n [\n 118.372096,\n 37.273703\n ],\n [\n 118.375729,\n 37.258497\n ],\n [\n 118.368385,\n 37.258576\n ],\n [\n 118.36033,\n 37.244561\n ],\n [\n 118.350459,\n 37.243765\n ],\n [\n 118.346669,\n 37.233252\n ],\n [\n 118.3642,\n 37.210189\n ],\n [\n 118.375966,\n 37.206126\n ],\n [\n 118.376598,\n 37.196962\n ],\n [\n 118.383389,\n 37.190587\n ],\n [\n 118.387574,\n 37.177834\n ],\n [\n 118.380467,\n 37.175164\n ],\n [\n 118.377545,\n 37.154157\n ],\n [\n 118.366569,\n 37.146781\n ],\n [\n 118.361594,\n 37.148495\n ],\n [\n 118.356224,\n 37.139325\n ],\n [\n 118.347616,\n 37.139803\n ],\n [\n 118.340667,\n 37.131748\n ],\n [\n 118.346116,\n 37.123931\n ],\n [\n 118.338219,\n 37.123134\n ],\n [\n 118.349354,\n 37.101753\n ],\n [\n 118.338298,\n 37.10311\n ],\n [\n 118.338851,\n 37.093894\n ],\n [\n 118.332928,\n 37.081923\n ],\n [\n 118.338535,\n 37.072265\n ],\n [\n 118.337588,\n 37.053904\n ],\n [\n 118.324558,\n 37.046279\n ],\n [\n 118.3259,\n 37.035459\n ],\n [\n 118.310186,\n 37.028231\n ],\n [\n 118.308212,\n 37.019885\n ],\n [\n 118.28997,\n 37.00946\n ],\n [\n 118.288785,\n 36.999993\n ],\n [\n 118.271412,\n 37.006744\n ],\n [\n 118.262568,\n 37.00271\n ],\n [\n 118.250802,\n 37.002949\n ],\n [\n 118.247327,\n 36.98613\n ],\n [\n 118.235087,\n 36.98557\n ],\n [\n 118.231376,\n 36.974822\n ],\n [\n 118.222531,\n 36.967109\n ],\n [\n 118.209739,\n 36.963152\n ],\n [\n 118.195209,\n 36.967348\n ],\n [\n 118.192918,\n 36.977739\n ],\n [\n 118.160936,\n 36.981934\n ],\n [\n 118.161331,\n 36.988567\n ],\n [\n 118.15146,\n 36.988527\n ],\n [\n 118.153198,\n 37.000512\n ],\n [\n 118.138983,\n 37.005985\n ],\n [\n 118.139299,\n 37.014693\n ],\n [\n 118.134008,\n 37.025955\n ],\n [\n 118.139299,\n 37.033103\n ],\n [\n 118.139615,\n 37.044363\n ],\n [\n 118.15146,\n 37.047038\n ],\n [\n 118.150829,\n 37.054743\n ],\n [\n 118.15762,\n 37.057776\n ],\n [\n 118.156909,\n 37.065281\n ],\n [\n 118.13622,\n 37.06536\n ],\n [\n 118.136062,\n 37.077773\n ],\n [\n 118.130455,\n 37.091101\n ],\n [\n 118.115925,\n 37.100636\n ],\n [\n 118.111187,\n 37.094652\n ],\n [\n 118.086075,\n 37.091899\n ],\n [\n 118.063016,\n 37.082841\n ],\n [\n 118.056857,\n 37.093654\n ],\n [\n 118.045959,\n 37.098202\n ],\n [\n 118.045485,\n 37.105982\n ],\n [\n 118.057252,\n 37.106141\n ],\n [\n 118.068623,\n 37.115875\n ],\n [\n 118.079679,\n 37.120781\n ],\n [\n 118.065069,\n 37.139564\n ],\n [\n 118.059858,\n 37.151087\n ],\n [\n 118.062385,\n 37.162528\n ],\n [\n 118.074467,\n 37.170341\n ],\n [\n 118.071545,\n 37.177675\n ],\n [\n 118.082995,\n 37.185605\n ],\n [\n 118.077941,\n 37.188953\n ],\n [\n 118.074072,\n 37.204094\n ],\n [\n 118.064122,\n 37.21007\n ],\n [\n 118.048012,\n 37.205568\n ],\n [\n 118.046275,\n 37.216324\n ],\n [\n 118.036799,\n 37.220905\n ],\n [\n 118.022348,\n 37.2221\n ],\n [\n 118.019584,\n 37.210309\n ],\n [\n 118.010898,\n 37.20756\n ],\n [\n 117.994393,\n 37.212699\n ],\n [\n 117.984364,\n 37.210349\n ],\n [\n 117.98089,\n 37.218674\n ],\n [\n 117.973862,\n 37.216483\n ],\n [\n 117.981048,\n 37.238429\n ],\n [\n 117.996446,\n 37.246273\n ],\n [\n 117.990761,\n 37.248981\n ],\n [\n 117.990603,\n 37.262358\n ],\n [\n 117.963833,\n 37.271753\n ],\n [\n 117.947013,\n 37.262159\n ],\n [\n 117.948829,\n 37.26829\n ],\n [\n 117.941327,\n 37.280549\n ],\n [\n 117.909266,\n 37.265065\n ],\n [\n 117.888497,\n 37.262319\n ],\n [\n 117.8776,\n 37.273027\n ],\n [\n 117.850909,\n 37.28246\n ],\n [\n 117.83859,\n 37.282659\n ],\n [\n 117.818848,\n 37.276012\n ],\n [\n 117.782128,\n 37.248702\n ],\n [\n 117.773678,\n 37.244959\n ],\n [\n 117.760333,\n 37.244959\n ],\n [\n 117.729851,\n 37.249101\n ],\n [\n 117.693447,\n 37.257661\n ],\n [\n 117.675995,\n 37.270121\n ],\n [\n 117.659491,\n 37.274101\n ],\n [\n 117.644329,\n 37.265862\n ],\n [\n 117.63043,\n 37.247269\n ],\n [\n 117.627193,\n 37.228074\n ],\n [\n 117.615348,\n 37.212699\n ],\n [\n 117.598212,\n 37.203058\n ],\n [\n 117.592052,\n 37.169624\n ],\n [\n 117.586366,\n 37.160216\n ],\n [\n 117.574284,\n 37.151366\n ],\n [\n 117.551305,\n 37.146781\n ],\n [\n 117.557464,\n 37.124211\n ],\n [\n 117.574442,\n 37.12106\n ],\n [\n 117.576969,\n 37.114758\n ],\n [\n 117.567888,\n 37.11029\n ],\n [\n 117.575074,\n 37.089185\n ],\n [\n 117.590946,\n 37.084996\n ],\n [\n 117.608477,\n 37.090622\n ],\n [\n 117.619375,\n 37.090103\n ],\n [\n 117.644645,\n 37.083878\n ],\n [\n 117.673942,\n 37.073143\n ],\n [\n 117.703002,\n 37.068673\n ],\n [\n 117.726692,\n 37.068753\n ],\n [\n 117.739801,\n 37.064921\n ],\n [\n 117.761991,\n 37.065839\n ],\n [\n 117.771783,\n 37.069032\n ],\n [\n 117.800369,\n 37.070789\n ],\n [\n 117.847355,\n 37.065959\n ],\n [\n 117.840327,\n 37.035539\n ],\n [\n 117.841827,\n 37.026354\n ],\n [\n 117.865992,\n 37.023719\n ],\n [\n 117.870493,\n 37.013375\n ],\n [\n 117.866386,\n 37.007024\n ],\n [\n 117.866623,\n 36.993282\n ],\n [\n 117.870493,\n 36.985451\n ],\n [\n 117.906581,\n 36.981695\n ],\n [\n 117.911951,\n 36.975141\n ],\n [\n 117.910292,\n 36.962592\n ],\n [\n 117.913372,\n 36.953679\n ],\n [\n 117.931772,\n 36.941886\n ],\n [\n 117.936115,\n 36.93489\n ],\n [\n 117.935404,\n 36.915736\n ],\n [\n 117.94338,\n 36.930012\n ],\n [\n 117.949145,\n 36.918375\n ],\n [\n 117.96178,\n 36.922494\n ],\n [\n 117.960674,\n 36.910376\n ],\n [\n 117.950645,\n 36.902137\n ],\n [\n 117.9403,\n 36.901177\n ],\n [\n 117.940616,\n 36.891616\n ],\n [\n 117.929719,\n 36.890216\n ],\n [\n 117.9189,\n 36.880094\n ],\n [\n 117.917005,\n 36.86973\n ],\n [\n 117.891814,\n 36.871811\n ],\n [\n 117.891103,\n 36.864408\n ],\n [\n 117.875152,\n 36.861246\n ],\n [\n 117.865597,\n 36.866529\n ],\n [\n 117.856594,\n 36.859926\n ],\n [\n 117.832825,\n 36.859966\n ],\n [\n 117.828008,\n 36.855883\n ],\n [\n 117.831877,\n 36.836629\n ],\n [\n 117.822085,\n 36.825139\n ],\n [\n 117.820901,\n 36.801511\n ],\n [\n 117.814662,\n 36.797306\n ],\n [\n 117.815531,\n 36.788573\n ],\n [\n 117.824297,\n 36.787933\n ],\n [\n 117.825639,\n 36.775834\n ],\n [\n 117.840327,\n 36.777516\n ],\n [\n 117.850672,\n 36.764735\n ],\n [\n 117.852488,\n 36.750708\n ],\n [\n 117.832983,\n 36.744816\n ],\n [\n 117.834404,\n 36.751871\n ],\n [\n 117.826429,\n 36.763011\n ],\n [\n 117.820743,\n 36.756359\n ],\n [\n 117.810161,\n 36.734394\n ],\n [\n 117.795157,\n 36.719761\n ],\n [\n 117.793025,\n 36.707451\n ],\n [\n 117.78197,\n 36.70304\n ],\n [\n 117.777942,\n 36.695219\n ],\n [\n 117.754173,\n 36.696944\n ],\n [\n 117.725666,\n 36.695219\n ],\n [\n 117.718006,\n 36.697826\n ],\n [\n 117.71848,\n 36.704724\n ],\n [\n 117.739959,\n 36.721004\n ],\n [\n 117.736642,\n 36.729423\n ],\n [\n 117.747303,\n 36.748584\n ],\n [\n 117.724165,\n 36.755998\n ],\n [\n 117.695974,\n 36.754115\n ],\n [\n 117.687603,\n 36.763853\n ],\n [\n 117.677811,\n 36.783245\n ],\n [\n 117.648119,\n 36.805436\n ],\n [\n 117.608556,\n 36.821815\n ],\n [\n 117.580523,\n 36.85136\n ],\n [\n 117.577364,\n 36.862847\n ],\n [\n 117.579891,\n 36.878093\n ],\n [\n 117.585024,\n 36.886815\n ],\n [\n 117.58376,\n 36.894176\n ],\n [\n 117.56923,\n 36.915736\n ],\n [\n 117.534248,\n 36.931611\n ],\n [\n 117.539538,\n 36.941486\n ],\n [\n 117.551305,\n 36.93385\n ],\n [\n 117.553674,\n 36.940727\n ],\n [\n 117.56465,\n 36.945084\n ],\n [\n 117.56544,\n 36.959954\n ],\n [\n 117.54933,\n 36.96507\n ],\n [\n 117.555253,\n 36.970785\n ],\n [\n 117.549094,\n 36.979817\n ],\n [\n 117.536854,\n 36.978498\n ],\n [\n 117.519875,\n 36.957117\n ],\n [\n 117.509847,\n 36.969267\n ],\n [\n 117.494527,\n 36.972344\n ],\n [\n 117.476522,\n 36.968348\n ],\n [\n 117.477628,\n 36.961154\n ],\n [\n 117.458754,\n 36.957676\n ],\n [\n 117.444461,\n 36.958116\n ],\n [\n 117.432853,\n 36.954878\n ],\n [\n 117.415322,\n 36.964311\n ],\n [\n 117.40403,\n 36.955038\n ],\n [\n 117.391632,\n 36.952\n ],\n [\n 117.378286,\n 36.956997\n ],\n [\n 117.365335,\n 36.99496\n ],\n [\n 117.35349,\n 37.003349\n ],\n [\n 117.328457,\n 37.011218\n ],\n [\n 117.317323,\n 37.020923\n ],\n [\n 117.315349,\n 37.030547\n ],\n [\n 117.326088,\n 37.036178\n ],\n [\n 117.33667,\n 37.046838\n ],\n [\n 117.339434,\n 37.056419\n ],\n [\n 117.336433,\n 37.073941\n ],\n [\n 117.365256,\n 37.069272\n ],\n [\n 117.391158,\n 37.083479\n ],\n [\n 117.409241,\n 37.089425\n ],\n [\n 117.442092,\n 37.093574\n ],\n [\n 117.459781,\n 37.109931\n ],\n [\n 117.455596,\n 37.11767\n ],\n [\n 117.4507,\n 37.143711\n ],\n [\n 117.4507,\n 37.153957\n ],\n [\n 117.444066,\n 37.156868\n ],\n [\n 117.442724,\n 37.170859\n ],\n [\n 117.436091,\n 37.184251\n ],\n [\n 117.417928,\n 37.20003\n ],\n [\n 117.404977,\n 37.21716\n ],\n [\n 117.402371,\n 37.224808\n ],\n [\n 117.408768,\n 37.239703\n ],\n [\n 117.429141,\n 37.239783\n ],\n [\n 117.424403,\n 37.243367\n ],\n [\n 117.431037,\n 37.254396\n ],\n [\n 117.443908,\n 37.250056\n ],\n [\n 117.438302,\n 37.25786\n ],\n [\n 117.43688,\n 37.27235\n ],\n [\n 117.432379,\n 37.272032\n ],\n [\n 117.430168,\n 37.285166\n ],\n [\n 117.417612,\n 37.296587\n ],\n [\n 117.411611,\n 37.308604\n ],\n [\n 117.409163,\n 37.329488\n ],\n [\n 117.41319,\n 37.342255\n ],\n [\n 117.415401,\n 37.364203\n ],\n [\n 117.401029,\n 37.379071\n ],\n [\n 117.368652,\n 37.396399\n ],\n [\n 117.360202,\n 37.405697\n ],\n [\n 117.368257,\n 37.419563\n ],\n [\n 117.369758,\n 37.436048\n ],\n [\n 117.353332,\n 37.450901\n ],\n [\n 117.309189,\n 37.447486\n ],\n [\n 117.295449,\n 37.4538\n ],\n [\n 117.307768,\n 37.46194\n ],\n [\n 117.304609,\n 37.466069\n ],\n [\n 117.283998,\n 37.471587\n ],\n [\n 117.285894,\n 37.479328\n ],\n [\n 117.312585,\n 37.487068\n ],\n [\n 117.317718,\n 37.499371\n ],\n [\n 117.307215,\n 37.507744\n ],\n [\n 117.286525,\n 37.510046\n ],\n [\n 117.284393,\n 37.522266\n ],\n [\n 117.275549,\n 37.526193\n ],\n [\n 117.273417,\n 37.532619\n ]\n ]\n ],\n [\n [\n [\n 118.40779,\n 38.026212\n ],\n [\n 118.410001,\n 38.053277\n ],\n [\n 118.419319,\n 38.053119\n ],\n [\n 118.419951,\n 38.025503\n ],\n [\n 118.40779,\n 38.026212\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 371700,\n \"name\": \"菏泽市\",\n \"center\": [\n 115.469381,\n 35.246531\n ],\n \"centroid\": [\n 115.698013,\n 35.152536\n ],\n \"childrenNum\": 9,\n \"level\": \"city\",\n \"parent\": {\n \"adcode\": 370000\n },\n \"subFeatureIndex\": 15,\n \"acroutes\": [\n 100000,\n 370000\n ]\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 116.409745,\n 34.852944\n ],\n [\n 116.40635,\n 34.82014\n ],\n [\n 116.403191,\n 34.756301\n ],\n [\n 116.371525,\n 34.750136\n ],\n [\n 116.365681,\n 34.742779\n ],\n [\n 116.36197,\n 34.723705\n ],\n [\n 116.382896,\n 34.716264\n ],\n [\n 116.39182,\n 34.710343\n ],\n [\n 116.392688,\n 34.703887\n ],\n [\n 116.385502,\n 34.694716\n ],\n [\n 116.385186,\n 34.686696\n ],\n [\n 116.378079,\n 34.684146\n ],\n [\n 116.378237,\n 34.66802\n ],\n [\n 116.364418,\n 34.651851\n ],\n [\n 116.37421,\n 34.639958\n ],\n [\n 116.356521,\n 34.629504\n ],\n [\n 116.331014,\n 34.624977\n ],\n [\n 116.325171,\n 34.620572\n ],\n [\n 116.323591,\n 34.607687\n ],\n [\n 116.318064,\n 34.601017\n ],\n [\n 116.301086,\n 34.607769\n ],\n [\n 116.286082,\n 34.608799\n ],\n [\n 116.278659,\n 34.602129\n ],\n [\n 116.277079,\n 34.586029\n ],\n [\n 116.256627,\n 34.580634\n ],\n [\n 116.249204,\n 34.571614\n ],\n [\n 116.240754,\n 34.552377\n ],\n [\n 116.23341,\n 34.555137\n ],\n [\n 116.216906,\n 34.575115\n ],\n [\n 116.199059,\n 34.577463\n ],\n [\n 116.190136,\n 34.570502\n ],\n [\n 116.156653,\n 34.553737\n ],\n [\n 116.146861,\n 34.553201\n ],\n [\n 116.134542,\n 34.55971\n ],\n [\n 116.124829,\n 34.572314\n ],\n [\n 116.11788,\n 34.589776\n ],\n [\n 116.101297,\n 34.605793\n ],\n [\n 116.082661,\n 34.608305\n ],\n [\n 116.055101,\n 34.595417\n ],\n [\n 116.03757,\n 34.593029\n ],\n [\n 116.023908,\n 34.601964\n ],\n [\n 116.010168,\n 34.615838\n ],\n [\n 116.001561,\n 34.619049\n ],\n [\n 115.991374,\n 34.615344\n ],\n [\n 115.98474,\n 34.607234\n ],\n [\n 115.98403,\n 34.589282\n ],\n [\n 115.969973,\n 34.582611\n ],\n [\n 115.946204,\n 34.581622\n ],\n [\n 115.858313,\n 34.569967\n ],\n [\n 115.849705,\n 34.565601\n ],\n [\n 115.838097,\n 34.567784\n ],\n [\n 115.838808,\n 34.560575\n ],\n [\n 115.827436,\n 34.558268\n ],\n [\n 115.802404,\n 34.572479\n ],\n [\n 115.795928,\n 34.578492\n ],\n [\n 115.762051,\n 34.587717\n ],\n [\n 115.718224,\n 34.591094\n ],\n [\n 115.711433,\n 34.59867\n ],\n [\n 115.699114,\n 34.598876\n ],\n [\n 115.697297,\n 34.569019\n ],\n [\n 115.684426,\n 34.555591\n ],\n [\n 115.669422,\n 34.55695\n ],\n [\n 115.643599,\n 34.567701\n ],\n [\n 115.639493,\n 34.571532\n ],\n [\n 115.621883,\n 34.574744\n ],\n [\n 115.610354,\n 34.572067\n ],\n [\n 115.593771,\n 34.573179\n ],\n [\n 115.576792,\n 34.570667\n ],\n [\n 115.561157,\n 34.572232\n ],\n [\n 115.55476,\n 34.56906\n ],\n [\n 115.52112,\n 34.578739\n ],\n [\n 115.494982,\n 34.604723\n ],\n [\n 115.486295,\n 34.616867\n ],\n [\n 115.479583,\n 34.632673\n ],\n [\n 115.46142,\n 34.637283\n ],\n [\n 115.458183,\n 34.656171\n ],\n [\n 115.444758,\n 34.674479\n ],\n [\n 115.447048,\n 34.698623\n ],\n [\n 115.444916,\n 34.710302\n ],\n [\n 115.433861,\n 34.725103\n ],\n [\n 115.445548,\n 34.752561\n ],\n [\n 115.436546,\n 34.776805\n ],\n [\n 115.43465,\n 34.790322\n ],\n [\n 115.426754,\n 34.805396\n ],\n [\n 115.413882,\n 34.80782\n ],\n [\n 115.416172,\n 34.813323\n ],\n [\n 115.408512,\n 34.82593\n ],\n [\n 115.393982,\n 34.831801\n ],\n [\n 115.379215,\n 34.828763\n ],\n [\n 115.356946,\n 34.837303\n ],\n [\n 115.345969,\n 34.846212\n ],\n [\n 115.329623,\n 34.851466\n ],\n [\n 115.317146,\n 34.859183\n ],\n [\n 115.302379,\n 34.858813\n ],\n [\n 115.289586,\n 34.851589\n ],\n [\n 115.274661,\n 34.85475\n ],\n [\n 115.256104,\n 34.845308\n ],\n [\n 115.243469,\n 34.850152\n ],\n [\n 115.239363,\n 34.874655\n ],\n [\n 115.240784,\n 34.883847\n ],\n [\n 115.249234,\n 34.894515\n ],\n [\n 115.252156,\n 34.906576\n ],\n [\n 115.239363,\n 34.911868\n ],\n [\n 115.204933,\n 34.914247\n ],\n [\n 115.202722,\n 34.925608\n ],\n [\n 115.211724,\n 34.943364\n ],\n [\n 115.222148,\n 34.945578\n ],\n [\n 115.219147,\n 34.960624\n ],\n [\n 115.208249,\n 34.958329\n ],\n [\n 115.201616,\n 34.95099\n ],\n [\n 115.175004,\n 34.962469\n ],\n [\n 115.15692,\n 34.958001\n ],\n [\n 115.157236,\n 34.966978\n ],\n [\n 115.146576,\n 34.980135\n ],\n [\n 115.131177,\n 34.983578\n ],\n [\n 115.132993,\n 34.999683\n ],\n [\n 115.128097,\n 35.004354\n ],\n [\n 115.106144,\n 35.000789\n ],\n [\n 115.074952,\n 35.000379\n ],\n [\n 115.051656,\n 34.985996\n ],\n [\n 115.0376,\n 34.981611\n ],\n [\n 115.028835,\n 34.971815\n ],\n [\n 115.016042,\n 34.977348\n ],\n [\n 115.008066,\n 34.988496\n ],\n [\n 114.970319,\n 34.990504\n ],\n [\n 114.946787,\n 34.988701\n ],\n [\n 114.934784,\n 34.980709\n ],\n [\n 114.923807,\n 34.968741\n ],\n [\n 114.913936,\n 34.977881\n ],\n [\n 114.907935,\n 34.989356\n ],\n [\n 114.889693,\n 34.993987\n ],\n [\n 114.880296,\n 35.003493\n ],\n [\n 114.884402,\n 35.021929\n ],\n [\n 114.869951,\n 35.024468\n ],\n [\n 114.859291,\n 35.002674\n ],\n [\n 114.827072,\n 35.01013\n ],\n [\n 114.846972,\n 35.023444\n ],\n [\n 114.855263,\n 35.036183\n ],\n [\n 114.85092,\n 35.041917\n ],\n [\n 114.834021,\n 35.042162\n ],\n [\n 114.819254,\n 35.051786\n ],\n [\n 114.83181,\n 35.074182\n ],\n [\n 114.861186,\n 35.082983\n ],\n [\n 114.876269,\n 35.091128\n ],\n [\n 114.882902,\n 35.098781\n ],\n [\n 114.883613,\n 35.109667\n ],\n [\n 114.872557,\n 35.125992\n ],\n [\n 114.860633,\n 35.137405\n ],\n [\n 114.841681,\n 35.151189\n ],\n [\n 114.841049,\n 35.159246\n ],\n [\n 114.850288,\n 35.172617\n ],\n [\n 114.86166,\n 35.182389\n ],\n [\n 114.876584,\n 35.189012\n ],\n [\n 114.909356,\n 35.19449\n ],\n [\n 114.928308,\n 35.194776\n ],\n [\n 114.932494,\n 35.198659\n ],\n [\n 114.92973,\n 35.248225\n ],\n [\n 114.954605,\n 35.255455\n ],\n [\n 114.957684,\n 35.261132\n ],\n [\n 114.975531,\n 35.261541\n ],\n [\n 114.975768,\n 35.270281\n ],\n [\n 114.963607,\n 35.273752\n ],\n [\n 114.987613,\n 35.30221\n ],\n [\n 115.004749,\n 35.317273\n ],\n [\n 115.014541,\n 35.318089\n ],\n [\n 115.0177,\n 35.340575\n ],\n [\n 115.02536,\n 35.346328\n ],\n [\n 115.035152,\n 35.368316\n ],\n [\n 115.043286,\n 35.376963\n ],\n [\n 115.057737,\n 35.378472\n ],\n [\n 115.075426,\n 35.375168\n ],\n [\n 115.088613,\n 35.39299\n ],\n [\n 115.084823,\n 35.410074\n ],\n [\n 115.091614,\n 35.416066\n ],\n [\n 115.105907,\n 35.403958\n ],\n [\n 115.114831,\n 35.404121\n ],\n [\n 115.117989,\n 35.41839\n ],\n [\n 115.117831,\n 35.400125\n ],\n [\n 115.126597,\n 35.408728\n ],\n [\n 115.126439,\n 35.418023\n ],\n [\n 115.136863,\n 35.421529\n ],\n [\n 115.16766,\n 35.426094\n ],\n [\n 115.189534,\n 35.425116\n ],\n [\n 115.197905,\n 35.420673\n ],\n [\n 115.209829,\n 35.423118\n ],\n [\n 115.23731,\n 35.423118\n ],\n [\n 115.257446,\n 35.43559\n ],\n [\n 115.272608,\n 35.448305\n ],\n [\n 115.270792,\n 35.456821\n ],\n [\n 115.286665,\n 35.464481\n ],\n [\n 115.307117,\n 35.480001\n ],\n [\n 115.357973,\n 35.498451\n ],\n [\n 115.357973,\n 35.506555\n ],\n [\n 115.350313,\n 35.529476\n ],\n [\n 115.35355,\n 35.540548\n ],\n [\n 115.360499,\n 35.543275\n ],\n [\n 115.345969,\n 35.546979\n ],\n [\n 115.345101,\n 35.553612\n ],\n [\n 115.357973,\n 35.554711\n ],\n [\n 115.359236,\n 35.565454\n ],\n [\n 115.369502,\n 35.559757\n ],\n [\n 115.370765,\n 35.571028\n ],\n [\n 115.383242,\n 35.568912\n ],\n [\n 115.383716,\n 35.57766\n ],\n [\n 115.389718,\n 35.577334\n ],\n [\n 115.394456,\n 35.586894\n ],\n [\n 115.411908,\n 35.603571\n ],\n [\n 115.416251,\n 35.623985\n ],\n [\n 115.439388,\n 35.643458\n ],\n [\n 115.452418,\n 35.660732\n ],\n [\n 115.461499,\n 35.680847\n ],\n [\n 115.485979,\n 35.710137\n ],\n [\n 115.511486,\n 35.727153\n ],\n [\n 115.524121,\n 35.726341\n ],\n [\n 115.533202,\n 35.734137\n ],\n [\n 115.552786,\n 35.73032\n ],\n [\n 115.562499,\n 35.738644\n ],\n [\n 115.583031,\n 35.730564\n ],\n [\n 115.588875,\n 35.738522\n ],\n [\n 115.619514,\n 35.739212\n ],\n [\n 115.643046,\n 35.743841\n ],\n [\n 115.665079,\n 35.751067\n ],\n [\n 115.693586,\n 35.754071\n ],\n [\n 115.698245,\n 35.768399\n ],\n [\n 115.696271,\n 35.788892\n ],\n [\n 115.704404,\n 35.788933\n ],\n [\n 115.706379,\n 35.805608\n ],\n [\n 115.717434,\n 35.802727\n ],\n [\n 115.720277,\n 35.817087\n ],\n [\n 115.727937,\n 35.815627\n ],\n [\n 115.734886,\n 35.832945\n ],\n [\n 115.753128,\n 35.832945\n ],\n [\n 115.752891,\n 35.838379\n ],\n [\n 115.763709,\n 35.838379\n ],\n [\n 115.773343,\n 35.854192\n ],\n [\n 115.816776,\n 35.844259\n ],\n [\n 115.821356,\n 35.852652\n ],\n [\n 115.841335,\n 35.850016\n ],\n [\n 115.840861,\n 35.857192\n ],\n [\n 115.859971,\n 35.857882\n ],\n [\n 115.865499,\n 35.868624\n ],\n [\n 115.872606,\n 35.872799\n ],\n [\n 115.871422,\n 35.858327\n ],\n [\n 115.876002,\n 35.867124\n ],\n [\n 115.875212,\n 35.835095\n ],\n [\n 115.877107,\n 35.820657\n ],\n [\n 115.883583,\n 35.808163\n ],\n [\n 115.898192,\n 35.805202\n ],\n [\n 115.911932,\n 35.811733\n ],\n [\n 115.925988,\n 35.804756\n ],\n [\n 115.922119,\n 35.799157\n ],\n [\n 115.945493,\n 35.791976\n ],\n [\n 115.970289,\n 35.782156\n ],\n [\n 116.017591,\n 35.756263\n ],\n [\n 116.026909,\n 35.749687\n ],\n [\n 116.041518,\n 35.733893\n ],\n [\n 116.071052,\n 35.719072\n ],\n [\n 116.079897,\n 35.712452\n ],\n [\n 116.089847,\n 35.699373\n ],\n [\n 116.103034,\n 35.687348\n ],\n [\n 116.121829,\n 35.67459\n ],\n [\n 116.127514,\n 35.649433\n ],\n [\n 116.134384,\n 35.638539\n ],\n [\n 116.115906,\n 35.618414\n ],\n [\n 116.116222,\n 35.606621\n ],\n [\n 116.125145,\n 35.59385\n ],\n [\n 116.125145,\n 35.587871\n ],\n [\n 116.114327,\n 35.577456\n ],\n [\n 116.115274,\n 35.566471\n ],\n [\n 116.123408,\n 35.540589\n ],\n [\n 116.12554,\n 35.516042\n ],\n [\n 116.121276,\n 35.497881\n ],\n [\n 116.128778,\n 35.489614\n ],\n [\n 116.129567,\n 35.475235\n ],\n [\n 116.15002,\n 35.469573\n ],\n [\n 116.160918,\n 35.471569\n ],\n [\n 116.15689,\n 35.446838\n ],\n [\n 116.167946,\n 35.452217\n ],\n [\n 116.178685,\n 35.450342\n ],\n [\n 116.177817,\n 35.466151\n ],\n [\n 116.188319,\n 35.477313\n ],\n [\n 116.188319,\n 35.467781\n ],\n [\n 116.19669,\n 35.46334\n ],\n [\n 116.206798,\n 35.465703\n ],\n [\n 116.20206,\n 35.458247\n ],\n [\n 116.204429,\n 35.436079\n ],\n [\n 116.215484,\n 35.435957\n ],\n [\n 116.215958,\n 35.419857\n ],\n [\n 116.212642,\n 35.409054\n ],\n [\n 116.215879,\n 35.393438\n ],\n [\n 116.223855,\n 35.371702\n ],\n [\n 116.22117,\n 35.358608\n ],\n [\n 116.215169,\n 35.350734\n ],\n [\n 116.201744,\n 35.345185\n ],\n [\n 116.193452,\n 35.337555\n ],\n [\n 116.199612,\n 35.304986\n ],\n [\n 116.215642,\n 35.29131\n ],\n [\n 116.223539,\n 35.260438\n ],\n [\n 116.237201,\n 35.261745\n ],\n [\n 116.265866,\n 35.271547\n ],\n [\n 116.269656,\n 35.269872\n ],\n [\n 116.285608,\n 35.242669\n ],\n [\n 116.284265,\n 35.22506\n ],\n [\n 116.269104,\n 35.191178\n ],\n [\n 116.248256,\n 35.195634\n ],\n [\n 116.234437,\n 35.208264\n ],\n [\n 116.234516,\n 35.200008\n ],\n [\n 116.228356,\n 35.194367\n ],\n [\n 116.213115,\n 35.196697\n ],\n [\n 116.221881,\n 35.181817\n ],\n [\n 116.223618,\n 35.173231\n ],\n [\n 116.214537,\n 35.155606\n ],\n [\n 116.204903,\n 35.145668\n ],\n [\n 116.181765,\n 35.11204\n ],\n [\n 116.154284,\n 35.113513\n ],\n [\n 116.141018,\n 35.09076\n ],\n [\n 116.15389,\n 35.088467\n ],\n [\n 116.140228,\n 35.06018\n ],\n [\n 116.141413,\n 35.055062\n ],\n [\n 116.119381,\n 35.053383\n ],\n [\n 116.114564,\n 35.039828\n ],\n [\n 116.115748,\n 35.025574\n ],\n [\n 116.139754,\n 34.995421\n ],\n [\n 116.170789,\n 34.974684\n ],\n [\n 116.171499,\n 34.964683\n ],\n [\n 116.162023,\n 34.957632\n ],\n [\n 116.155153,\n 34.947259\n ],\n [\n 116.162181,\n 34.94361\n ],\n [\n 116.192505,\n 34.939182\n ],\n [\n 116.201586,\n 34.919702\n ],\n [\n 116.213826,\n 34.913098\n ],\n [\n 116.226935,\n 34.911786\n ],\n [\n 116.266261,\n 34.89751\n ],\n [\n 116.286713,\n 34.88159\n ],\n [\n 116.299032,\n 34.877733\n ],\n [\n 116.325803,\n 34.874943\n ],\n [\n 116.339543,\n 34.867022\n ],\n [\n 116.373815,\n 34.86538\n ],\n [\n 116.409745,\n 34.852944\n ]\n ]\n ]\n ]\n }\n }\n ]\n}', 'admin', '2020-12-07 19:27:59', 'admin', '2021-02-01 17:41:17', '0', NULL); +INSERT INTO `jimu_report_map` VALUES ('1335896227857940481', '杭州', 'hangzhou', '{\"type\":\"FeatureCollection\",\"features\":[{\"type\":\"Feature\",\"properties\":{\"adcode\":330102,\"name\":\"上城区\",\"center\":[120.171465,30.250236],\"centroid\":[120.173932,30.226977],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":330100},\"subFeatureIndex\":0,\"acroutes\":[100000,330000,330100]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[120.188063,30.257783],[120.187445,30.250124],[120.186613,30.246239],[120.19132,30.245676],[120.197999,30.242341],[120.19983,30.240158],[120.213307,30.230548],[120.196573,30.216571],[120.182858,30.207933],[120.177628,30.205626],[120.140166,30.19284],[120.138169,30.19512],[120.1371,30.1981],[120.137551,30.201012],[120.141545,30.204061],[120.141069,30.206464],[120.138431,30.207947],[120.139405,30.210474],[120.145253,30.209581],[120.147368,30.210268],[120.150173,30.212849],[120.160347,30.227486],[120.15923,30.231578],[120.154381,30.23442],[120.154666,30.241119],[120.160442,30.246843],[120.15797,30.24672],[120.159848,30.249493],[120.16251,30.251565],[120.15923,30.256397],[120.156948,30.258058],[120.164079,30.25836],[120.171804,30.258003],[120.188063,30.257783]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":330103,\"name\":\"下城区\",\"center\":[120.172763,30.276271],\"centroid\":[120.180095,30.303745],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":330100},\"subFeatureIndex\":1,\"acroutes\":[100000,330000,330100]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[120.199853,30.35099],[120.201042,30.348124],[120.20437,30.345738],[120.212285,30.34534],[120.212095,30.334149],[120.211168,30.332119],[120.205939,30.332202],[120.203157,30.329733],[120.202349,30.326236],[120.204417,30.325961],[120.202421,30.322176],[120.197833,30.322244],[120.196906,30.320118],[120.204322,30.320488],[120.207198,30.320118],[120.200186,30.312148],[120.197952,30.314329],[120.194838,30.312093],[120.190607,30.312642],[120.18987,30.308856],[120.188301,30.30876],[120.188253,30.304507],[120.193007,30.30474],[120.190892,30.300295],[120.186494,30.29714],[120.183975,30.285367],[120.184926,30.28121],[120.18899,30.274321],[120.188182,30.270849],[120.188658,30.267294],[120.188063,30.257783],[120.171804,30.258003],[120.164079,30.25836],[120.156948,30.258058],[120.156472,30.260295],[120.158469,30.259142],[120.154666,30.272688],[120.161892,30.273305],[120.160822,30.279096],[120.159681,30.280524],[120.154547,30.282637],[120.153073,30.284983],[120.154024,30.289895],[120.165553,30.293463],[120.166266,30.294807],[120.164816,30.30009],[120.157162,30.308197],[120.156972,30.309213],[120.169522,30.325399],[120.174348,30.331146],[120.17827,30.336604],[120.187041,30.347561],[120.195789,30.348892],[120.199853,30.35099]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":330104,\"name\":\"江干区\",\"center\":[120.202633,30.266603],\"centroid\":[120.296023,30.310268],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":330100},\"subFeatureIndex\":2,\"acroutes\":[100000,330000,330100]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[120.188063,30.257783],[120.188658,30.267294],[120.188182,30.270849],[120.18899,30.274321],[120.184926,30.28121],[120.183975,30.285367],[120.186494,30.29714],[120.190892,30.300295],[120.193007,30.30474],[120.188253,30.304507],[120.188301,30.30876],[120.18987,30.308856],[120.190607,30.312642],[120.194838,30.312093],[120.197952,30.314329],[120.200186,30.312148],[120.207198,30.320118],[120.204322,30.320488],[120.196906,30.320118],[120.197833,30.322244],[120.202421,30.322176],[120.204417,30.325961],[120.202349,30.326236],[120.203157,30.329733],[120.205939,30.332202],[120.211168,30.332119],[120.212095,30.334149],[120.212285,30.34534],[120.20437,30.345738],[120.201042,30.348124],[120.199853,30.35099],[120.204251,30.352662],[120.210407,30.357736],[120.211739,30.359971],[120.213093,30.36503],[120.211881,30.369198],[120.208957,30.374243],[120.208815,30.376478],[120.210502,30.37911],[120.221294,30.387156],[120.228592,30.393544],[120.232395,30.392529],[120.237577,30.390062],[120.240334,30.387622],[120.23791,30.380028],[120.23482,30.376683],[120.239978,30.372146],[120.2468,30.363947],[120.247109,30.362343],[120.244233,30.359902],[120.243567,30.358188],[120.243947,30.354116],[120.242236,30.348261],[120.239883,30.344997],[120.234772,30.340691],[120.236056,30.339786],[120.243543,30.344174],[120.246015,30.342871],[120.248012,30.338853],[120.252552,30.337043],[120.261466,30.337523],[120.260872,30.335452],[120.258471,30.334355],[120.264437,30.326578],[120.268051,30.328663],[120.266553,30.331338],[120.277868,30.337948],[120.279318,30.336686],[120.281885,30.328499],[120.276251,30.3233],[120.272591,30.320516],[120.275562,30.319857],[120.291964,30.317814],[120.291631,30.315331],[120.295767,30.314851],[120.299475,30.315605],[120.300212,30.32127],[120.300117,30.324987],[120.29358,30.325001],[120.296623,30.33596],[120.299618,30.341816],[120.301567,30.343927],[120.300759,30.347575],[120.307224,30.350619],[120.310766,30.350839],[120.316281,30.352539],[120.325717,30.353389],[120.328261,30.358655],[120.335986,30.361068],[120.341192,30.36588],[120.34433,30.368087],[120.347206,30.36928],[120.350629,30.372173],[120.355953,30.374065],[120.362847,30.374682],[120.371143,30.377286],[120.379486,30.380714],[120.383194,30.381235],[120.398312,30.384799],[120.400095,30.384264],[120.400903,30.377026],[120.399596,30.37327],[120.396197,30.370624],[120.388543,30.370117],[120.380817,30.356378],[120.38241,30.355761],[120.378084,30.344929],[120.384169,30.340005],[120.383955,30.339155],[120.395198,30.332215],[120.40309,30.325248],[120.406584,30.324878],[120.413739,30.318307],[120.408866,30.305413],[120.403423,30.293188],[120.396149,30.281141],[120.389779,30.272756],[120.37642,30.259773],[120.369027,30.254763],[120.364154,30.252801],[120.355098,30.250522],[120.350676,30.25011],[120.340859,30.252595],[120.336058,30.255697],[120.324149,30.267239],[120.320535,30.270218],[120.317731,30.27395],[120.311004,30.280359],[120.3043,30.28604],[120.298952,30.287878],[120.288136,30.288235],[120.278961,30.286822],[120.270594,30.284722],[120.269786,30.284105],[120.252838,30.276091],[120.248036,30.272468],[120.241665,30.26514],[120.221057,30.23766],[120.213307,30.230548],[120.19983,30.240158],[120.197999,30.242341],[120.19132,30.245676],[120.186613,30.246239],[120.187445,30.250124],[120.188063,30.257783]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":330105,\"name\":\"拱墅区\",\"center\":[120.150053,30.314697],\"centroid\":[120.152502,30.339314],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":330100},\"subFeatureIndex\":3,\"acroutes\":[100000,330000,330100]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[120.085779,30.331187],[120.090011,30.334931],[120.091746,30.333395],[120.096405,30.335685],[120.099019,30.338305],[120.097641,30.340581],[120.103702,30.3415],[120.106127,30.343283],[120.1081,30.342803],[120.108409,30.339978],[120.111737,30.33969],[120.114137,30.337262],[120.121387,30.337948],[120.123265,30.339224],[120.123764,30.33644],[120.124953,30.339498],[120.129446,30.342515],[120.129446,30.341144],[120.136957,30.343379],[120.133843,30.354568],[120.131537,30.357708],[120.130182,30.362754],[120.129279,30.371666],[120.129208,30.38203],[120.130943,30.383222],[120.1342,30.380947],[120.139073,30.380316],[120.138526,30.378095],[120.140736,30.376176],[120.146132,30.375683],[120.146204,30.377835],[120.149175,30.38033],[120.152741,30.380686],[120.153002,30.375861],[120.159254,30.375559],[120.159016,30.372543],[120.167882,30.371035],[120.170782,30.372475],[120.171044,30.37401],[120.168595,30.3746],[120.171828,30.37582],[120.173444,30.374942],[120.174348,30.371954],[120.177699,30.376807],[120.183832,30.381618],[120.186162,30.38802],[120.192485,30.396148],[120.19838,30.394174],[120.209908,30.392557],[120.212998,30.39109],[120.216778,30.387896],[120.221294,30.387156],[120.210502,30.37911],[120.208815,30.376478],[120.208957,30.374243],[120.211881,30.369198],[120.213093,30.36503],[120.211739,30.359971],[120.210407,30.357736],[120.204251,30.352662],[120.199853,30.35099],[120.195789,30.348892],[120.187041,30.347561],[120.17827,30.336604],[120.174348,30.331146],[120.169522,30.325399],[120.156972,30.309213],[120.157162,30.308197],[120.164816,30.30009],[120.166266,30.294807],[120.165553,30.293463],[120.154024,30.289895],[120.153073,30.284983],[120.154547,30.282637],[120.159681,30.280524],[120.160822,30.279096],[120.161892,30.273305],[120.154666,30.272688],[120.154024,30.27535],[120.150934,30.278506],[120.149294,30.28206],[120.146132,30.286589],[120.144112,30.291144],[120.141188,30.293902],[120.135198,30.292626],[120.132512,30.292791],[120.128709,30.294286],[120.118012,30.29264],[120.109241,30.291995],[120.104677,30.292461],[120.102205,30.298292],[120.102823,30.304672],[120.102038,30.312697],[120.095597,30.325481],[120.092007,30.326071],[120.088489,30.330529],[120.085779,30.331187]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":330106,\"name\":\"西湖区\",\"center\":[120.147376,30.272934],\"centroid\":[120.083604,30.200677],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":330100},\"subFeatureIndex\":4,\"acroutes\":[100000,330000,330100]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[120.140166,30.19284],[120.134128,30.190588],[120.129659,30.186852],[120.126664,30.182827],[120.12462,30.177346],[120.124596,30.167263],[120.125999,30.15946],[120.130373,30.151161],[120.138597,30.142078],[120.146132,30.137172],[120.160014,30.12637],[120.16831,30.121793],[120.177723,30.11712],[120.181835,30.111457],[120.182953,30.10846],[120.182168,30.104818],[120.177295,30.102604],[120.170354,30.101546],[120.162011,30.097985],[120.150459,30.091455],[120.146869,30.088664],[120.134818,30.097669],[120.130349,30.099305],[120.124739,30.092953],[120.123812,30.089461],[120.118131,30.083796],[120.115088,30.082229],[120.108955,30.08062],[120.09795,30.079603],[120.091579,30.078475],[120.084615,30.078269],[120.076747,30.080868],[120.067928,30.086794],[120.061748,30.091853],[120.059513,30.092788],[120.054902,30.09272],[120.052953,30.091661],[120.049125,30.086849],[120.044894,30.086368],[120.043635,30.092156],[120.041258,30.093091],[120.036361,30.092555],[120.030846,30.094768],[120.030442,30.098837],[120.025213,30.105519],[120.02324,30.10633],[120.019151,30.10567],[120.016465,30.108323],[120.017725,30.113189],[120.016417,30.115718],[120.01095,30.116254],[120.001822,30.114357],[120.000468,30.116034],[120.001941,30.119567],[120.003819,30.12659],[120.007004,30.130026],[120.008787,30.134204],[120.008858,30.136719],[120.011663,30.142779],[120.016417,30.148935],[120.017178,30.153167],[120.014825,30.15891],[120.018438,30.162963],[120.018913,30.165202],[120.017772,30.168417],[120.014397,30.173816],[120.016156,30.177072],[120.013494,30.181042],[120.011449,30.181852],[120.005459,30.182346],[119.998994,30.182305],[119.996332,30.181536],[120.0013,30.188006],[120.003439,30.191865],[120.009096,30.195615],[120.009263,30.200202],[120.006529,30.205379],[120.007171,30.208757],[120.013351,30.210254],[120.017487,30.211792],[120.018034,30.214319],[120.015704,30.213426],[120.009999,30.215637],[120.007123,30.2208],[120.010356,30.221184],[120.013755,30.2162],[120.015443,30.218067],[120.018367,30.216447],[120.020268,30.217985],[120.01889,30.219742],[120.016845,30.224823],[120.025046,30.228461],[120.030894,30.230479],[120.032153,30.229697],[120.038571,30.233019],[120.040639,30.232841],[120.041162,30.236122],[120.044538,30.238058],[120.0443,30.240474],[120.046178,30.242725],[120.052216,30.243494],[120.052691,30.245333],[120.055234,30.245388],[120.055306,30.251483],[120.058515,30.252801],[120.05773,30.257289],[120.057255,30.268351],[120.056494,30.273374],[120.052382,30.273237],[120.049815,30.274266],[120.049815,30.27594],[120.05281,30.282897],[120.056732,30.2884],[120.052263,30.289319],[120.051621,30.29054],[120.052953,30.293847],[120.054807,30.295246],[120.053784,30.298772],[120.051907,30.299513],[120.048008,30.30319],[120.042089,30.304096],[120.030799,30.299843],[120.028493,30.303835],[120.026116,30.305948],[120.026686,30.310996],[120.02179,30.311874],[120.020554,30.315674],[120.023881,30.316195],[120.023406,30.319967],[120.023572,30.326743],[120.021362,30.329088],[120.01782,30.329733],[120.01763,30.33238],[120.026425,30.333272],[120.027185,30.335905],[120.025545,30.342474],[120.025973,30.34523],[120.023881,30.348357],[120.029444,30.350016],[120.032795,30.351634],[120.038595,30.350948],[120.046511,30.35221],[120.046463,30.353759],[120.048674,30.353526],[120.050195,30.349865],[120.053951,30.351401],[120.060607,30.351497],[120.060868,30.353348],[120.063673,30.352128],[120.065361,30.352813],[120.06517,30.355309],[120.067334,30.355446],[120.069449,30.350702],[120.074655,30.34774],[120.0762,30.345285],[120.079742,30.341816],[120.081881,30.33563],[120.085779,30.331187],[120.088489,30.330529],[120.092007,30.326071],[120.095597,30.325481],[120.102038,30.312697],[120.102823,30.304672],[120.102205,30.298292],[120.104677,30.292461],[120.109241,30.291995],[120.118012,30.29264],[120.128709,30.294286],[120.132512,30.292791],[120.135198,30.292626],[120.141188,30.293902],[120.144112,30.291144],[120.146132,30.286589],[120.149294,30.28206],[120.150934,30.278506],[120.154024,30.27535],[120.154666,30.272688],[120.158469,30.259142],[120.156472,30.260295],[120.156948,30.258058],[120.15923,30.256397],[120.16251,30.251565],[120.159848,30.249493],[120.15797,30.24672],[120.160442,30.246843],[120.154666,30.241119],[120.154381,30.23442],[120.15923,30.231578],[120.160347,30.227486],[120.150173,30.212849],[120.147368,30.210268],[120.145253,30.209581],[120.139405,30.210474],[120.138431,30.207947],[120.141069,30.206464],[120.141545,30.204061],[120.137551,30.201012],[120.1371,30.1981],[120.138169,30.19512],[120.140166,30.19284]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":330108,\"name\":\"滨江区\",\"center\":[120.21062,30.206615],\"centroid\":[120.185259,30.180456],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":330100},\"subFeatureIndex\":5,\"acroutes\":[100000,330000,330100]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[120.221057,30.23766],[120.223957,30.2363],[120.226524,30.232896],[120.231896,30.230177],[120.234439,30.229793],[120.235224,30.228132],[120.234962,30.21366],[120.234463,30.21355],[120.234202,30.188788],[120.233488,30.182044],[120.224575,30.181879],[120.224646,30.179173],[120.222055,30.178885],[120.222293,30.173637],[120.224384,30.171247],[120.220557,30.170519],[120.219963,30.16703],[120.217943,30.164749],[120.216849,30.161314],[120.220534,30.162578],[120.224979,30.162716],[120.226167,30.16016],[120.223148,30.156684],[120.224598,30.153868],[120.221651,30.153758],[120.219892,30.150515],[120.216944,30.143081],[120.219464,30.139948],[120.214543,30.136911],[120.213307,30.137887],[120.211572,30.136375],[120.208743,30.137131],[120.208054,30.139302],[120.205273,30.143026],[120.204084,30.141061],[120.201375,30.139563],[120.197167,30.140759],[120.19189,30.147121],[120.186185,30.144428],[120.186661,30.146599],[120.184141,30.145362],[120.181717,30.147245],[120.180338,30.149814],[120.178864,30.149416],[120.175203,30.153881],[120.170473,30.15112],[120.168286,30.148646],[120.164816,30.150062],[120.16232,30.147382],[120.159087,30.148894],[120.154737,30.145953],[120.155902,30.144332],[120.152764,30.142751],[120.146132,30.137172],[120.138597,30.142078],[120.130373,30.151161],[120.125999,30.15946],[120.124596,30.167263],[120.12462,30.177346],[120.126664,30.182827],[120.129659,30.186852],[120.134128,30.190588],[120.140166,30.19284],[120.177628,30.205626],[120.182858,30.207933],[120.196573,30.216571],[120.213307,30.230548],[120.221057,30.23766]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":330109,\"name\":\"萧山区\",\"center\":[120.27069,30.162932],\"centroid\":[120.388786,30.16844],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":330100},\"subFeatureIndex\":6,\"acroutes\":[100000,330000,330100]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[120.146132,30.137172],[120.152764,30.142751],[120.155902,30.144332],[120.154737,30.145953],[120.159087,30.148894],[120.16232,30.147382],[120.164816,30.150062],[120.168286,30.148646],[120.170473,30.15112],[120.175203,30.153881],[120.178864,30.149416],[120.180338,30.149814],[120.181717,30.147245],[120.184141,30.145362],[120.186661,30.146599],[120.186185,30.144428],[120.19189,30.147121],[120.197167,30.140759],[120.201375,30.139563],[120.204084,30.141061],[120.205273,30.143026],[120.208054,30.139302],[120.208743,30.137131],[120.211572,30.136375],[120.213307,30.137887],[120.214543,30.136911],[120.219464,30.139948],[120.216944,30.143081],[120.219892,30.150515],[120.221651,30.153758],[120.224598,30.153868],[120.223148,30.156684],[120.226167,30.16016],[120.224979,30.162716],[120.220534,30.162578],[120.216849,30.161314],[120.217943,30.164749],[120.219963,30.16703],[120.220557,30.170519],[120.224384,30.171247],[120.222293,30.173637],[120.222055,30.178885],[120.224646,30.179173],[120.224575,30.181879],[120.233488,30.182044],[120.234202,30.188788],[120.234463,30.21355],[120.234962,30.21366],[120.235224,30.228132],[120.234439,30.229793],[120.231896,30.230177],[120.226524,30.232896],[120.223957,30.2363],[120.221057,30.23766],[120.241665,30.26514],[120.248036,30.272468],[120.252838,30.276091],[120.269786,30.284105],[120.270594,30.284722],[120.278961,30.286822],[120.288136,30.288235],[120.298952,30.287878],[120.3043,30.28604],[120.311004,30.280359],[120.317731,30.27395],[120.320535,30.270218],[120.324149,30.267239],[120.336058,30.255697],[120.340859,30.252595],[120.350676,30.25011],[120.355098,30.250522],[120.364154,30.252801],[120.369027,30.254763],[120.37642,30.259773],[120.389779,30.272756],[120.396149,30.281141],[120.403423,30.293188],[120.408866,30.305413],[120.413739,30.318307],[120.418945,30.326441],[120.419159,30.331077],[120.421108,30.334643],[120.433492,30.36141],[120.438436,30.37268],[120.443262,30.376903],[120.450227,30.380042],[120.460234,30.382688],[120.47616,30.385457],[120.497791,30.388924],[120.510152,30.389144],[120.567866,30.387869],[120.589188,30.388527],[120.619543,30.389007],[120.6339,30.389459],[120.642719,30.388582],[120.659002,30.385594],[120.662686,30.384661],[120.684935,30.379973],[120.69354,30.377835],[120.698199,30.375038],[120.702478,30.369431],[120.70388,30.365853],[120.704546,30.344462],[120.704142,30.330803],[120.705045,30.315605],[120.706043,30.30946],[120.710845,30.297538],[120.71403,30.293353],[120.71926,30.28818],[120.721946,30.286314],[120.705663,30.271412],[120.700529,30.267761],[120.693944,30.262052],[120.679088,30.244249],[120.669033,30.233129],[120.646831,30.21955],[120.642695,30.217257],[120.641911,30.214758],[120.624606,30.187868],[120.612768,30.166288],[120.609179,30.152851],[120.608181,30.15182],[120.601953,30.150735],[120.593491,30.146764],[120.590852,30.146283],[120.585932,30.147272],[120.583864,30.150405],[120.568342,30.151312],[120.563421,30.147946],[120.559808,30.148179],[120.558144,30.151463],[120.550918,30.15564],[120.540411,30.156547],[120.533779,30.157454],[120.529382,30.157522],[120.524889,30.155695],[120.518495,30.155393],[120.51058,30.157536],[120.506158,30.159776],[120.50245,30.165917],[120.4981,30.169187],[120.494891,30.170148],[120.484076,30.172209],[120.483719,30.170423],[120.480867,30.170134],[120.479203,30.168664],[120.47509,30.169818],[120.466153,30.169557],[120.463728,30.162207],[120.465012,30.155489],[120.464394,30.154115],[120.461042,30.153991],[120.459545,30.151546],[120.451177,30.150982],[120.45006,30.145665],[120.447636,30.143576],[120.446923,30.135454],[120.438484,30.133792],[120.429594,30.132445],[120.424008,30.133187],[120.422891,30.13588],[120.424127,30.1408],[120.426076,30.144277],[120.422201,30.146846],[120.423152,30.151065],[120.42194,30.151037],[120.421678,30.148193],[120.419396,30.152851],[120.417923,30.148509],[120.414476,30.148042],[120.414214,30.149114],[120.410887,30.149526],[120.41072,30.146118],[120.411362,30.132623],[120.40927,30.12938],[120.404944,30.129476],[120.405562,30.1361],[120.404231,30.137296],[120.399001,30.136348],[120.397433,30.137832],[120.397813,30.143191],[120.392631,30.146091],[120.390492,30.149347],[120.387806,30.156176],[120.384763,30.157303],[120.381958,30.155352],[120.379201,30.154981],[120.373163,30.155503],[120.36646,30.153881],[120.361872,30.152068],[120.358758,30.147836],[120.355074,30.151133],[120.352031,30.150694],[120.352055,30.146736],[120.353957,30.144222],[120.35341,30.142188],[120.339623,30.142119],[120.339124,30.138464],[120.334299,30.134616],[120.331351,30.129298],[120.327999,30.125202],[120.326217,30.1249],[120.323198,30.126755],[120.318016,30.125999],[120.316542,30.132376],[120.314688,30.136471],[120.31224,30.13742],[120.303397,30.133008],[120.298904,30.129545],[120.29831,30.126549],[120.303754,30.126686],[120.300307,30.118357],[120.295624,30.115457],[120.293651,30.111911],[120.286853,30.10677],[120.28885,30.101161],[120.294483,30.098274],[120.299285,30.097366],[120.304681,30.09969],[120.309482,30.106013],[120.313333,30.107072],[120.31823,30.102893],[120.325408,30.097793],[120.33128,30.09705],[120.333704,30.095483],[120.335677,30.090877],[120.335796,30.081363],[120.333776,30.074845],[120.337579,30.071998],[120.338601,30.070211],[120.337508,30.059333],[120.33437,30.056912],[120.332088,30.053487],[120.327096,30.05108],[120.324957,30.048632],[120.325551,30.044946],[120.33185,30.037903],[120.335582,30.036885],[120.340479,30.0376],[120.343617,30.034918],[120.346279,30.023609],[120.344805,30.021381],[120.345827,30.019716],[120.351271,30.017886],[120.353291,30.016317],[120.356904,30.011694],[120.357284,30.004718],[120.358164,30.00286],[120.362847,29.997741],[120.36085,29.99214],[120.36047,29.988589],[120.362657,29.985506],[120.362276,29.982726],[120.364297,29.978528],[120.362276,29.97433],[120.357213,29.973449],[120.346469,29.973779],[120.342095,29.963758],[120.342333,29.960412],[120.340526,29.956048],[120.333681,29.95189],[120.331517,29.949302],[120.326074,29.946231],[120.325194,29.938548],[120.321676,29.937033],[120.315258,29.928867],[120.313547,29.9276],[120.307058,29.929336],[120.299309,29.932544],[120.297122,29.932654],[120.291345,29.935684],[120.288968,29.932131],[120.287233,29.926815],[120.284167,29.922161],[120.282123,29.921059],[120.277844,29.920742],[120.274373,29.91953],[120.265269,29.924516],[120.264746,29.930961],[120.262298,29.934748],[120.260753,29.938865],[120.258899,29.941206],[120.255215,29.943643],[120.25279,29.941577],[120.250722,29.936703],[120.24573,29.935808],[120.241689,29.939044],[120.239788,29.939567],[120.232038,29.939732],[120.226524,29.940545],[120.224004,29.942073],[120.221009,29.942238],[120.214567,29.939484],[120.207246,29.93377],[120.20185,29.931856],[120.200424,29.92946],[120.204798,29.924061],[120.203157,29.921541],[120.197643,29.917354],[120.190155,29.906914],[120.187184,29.904724],[120.185092,29.904503],[120.180623,29.907368],[120.175822,29.90909],[120.176273,29.91358],[120.172993,29.916238],[120.166313,29.917271],[120.160276,29.909145],[120.159729,29.906211],[120.155046,29.906101],[120.151742,29.908084],[120.150031,29.905054],[120.14946,29.899324],[120.149888,29.895191],[120.148723,29.891637],[120.150268,29.887587],[120.148486,29.881277],[120.144754,29.874112],[120.141188,29.870199],[120.136719,29.866327],[120.133748,29.86284],[120.1313,29.858816],[120.122101,29.852876],[120.118369,29.852229],[120.11226,29.847171],[120.10993,29.845972],[120.104796,29.845531],[120.102466,29.846812],[120.102442,29.849445],[120.104059,29.8534],[120.099566,29.856694],[120.096666,29.862399],[120.088156,29.871232],[120.082095,29.876688],[120.078149,29.884115],[120.077222,29.88822],[120.078268,29.88975],[120.082523,29.891788],[120.084805,29.894585],[120.085827,29.897437],[120.085542,29.906859],[120.081097,29.912933],[120.084448,29.91734],[120.089606,29.916514],[120.092126,29.916955],[120.096975,29.920866],[120.098449,29.924309],[120.097546,29.931126],[120.101325,29.936896],[120.100826,29.938039],[120.091151,29.946851],[120.090676,29.949123],[120.096001,29.952703],[120.101801,29.958499],[120.102965,29.967282],[120.104962,29.973614],[120.104463,29.981377],[120.110239,29.983524],[120.114137,29.987667],[120.118535,29.988272],[120.120294,29.990791],[120.124858,29.993337],[120.126926,29.997768],[120.134105,30.01058],[120.135555,30.021271],[120.136981,30.024806],[120.137171,30.029278],[120.134532,30.043983],[120.131133,30.044327],[120.129873,30.045757],[120.126474,30.045936],[120.124478,30.04833],[120.12569,30.050241],[120.12897,30.052208],[120.130349,30.055509],[120.136386,30.058934],[120.136886,30.061547],[120.134081,30.064999],[120.1371,30.069674],[120.137718,30.072177],[120.135079,30.080689],[120.140808,30.083769],[120.146869,30.088664],[120.150459,30.091455],[120.162011,30.097985],[120.170354,30.101546],[120.177295,30.102604],[120.182168,30.104818],[120.182953,30.10846],[120.181835,30.111457],[120.177723,30.11712],[120.16831,30.121793],[120.160014,30.12637],[120.146132,30.137172]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":330110,\"name\":\"余杭区\",\"center\":[120.301737,30.421187],\"centroid\":[119.990852,30.381676],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":330100},\"subFeatureIndex\":7,\"acroutes\":[100000,330000,330100]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[120.221294,30.387156],[120.216778,30.387896],[120.212998,30.39109],[120.209908,30.392557],[120.19838,30.394174],[120.192485,30.396148],[120.186162,30.38802],[120.183832,30.381618],[120.177699,30.376807],[120.174348,30.371954],[120.173444,30.374942],[120.171828,30.37582],[120.168595,30.3746],[120.171044,30.37401],[120.170782,30.372475],[120.167882,30.371035],[120.159016,30.372543],[120.159254,30.375559],[120.153002,30.375861],[120.152741,30.380686],[120.149175,30.38033],[120.146204,30.377835],[120.146132,30.375683],[120.140736,30.376176],[120.138526,30.378095],[120.139073,30.380316],[120.1342,30.380947],[120.130943,30.383222],[120.129208,30.38203],[120.129279,30.371666],[120.130182,30.362754],[120.131537,30.357708],[120.133843,30.354568],[120.136957,30.343379],[120.129446,30.341144],[120.129446,30.342515],[120.124953,30.339498],[120.123764,30.33644],[120.123265,30.339224],[120.121387,30.337948],[120.114137,30.337262],[120.111737,30.33969],[120.108409,30.339978],[120.1081,30.342803],[120.106127,30.343283],[120.103702,30.3415],[120.097641,30.340581],[120.099019,30.338305],[120.096405,30.335685],[120.091746,30.333395],[120.090011,30.334931],[120.085779,30.331187],[120.081881,30.33563],[120.079742,30.341816],[120.0762,30.345285],[120.074655,30.34774],[120.069449,30.350702],[120.067334,30.355446],[120.06517,30.355309],[120.065361,30.352813],[120.063673,30.352128],[120.060868,30.353348],[120.060607,30.351497],[120.053951,30.351401],[120.050195,30.349865],[120.048674,30.353526],[120.046463,30.353759],[120.046511,30.35221],[120.038595,30.350948],[120.032795,30.351634],[120.029444,30.350016],[120.023881,30.348357],[120.025973,30.34523],[120.025545,30.342474],[120.027185,30.335905],[120.026425,30.333272],[120.01763,30.33238],[120.01782,30.329733],[120.021362,30.329088],[120.023572,30.326743],[120.023406,30.319967],[120.023881,30.316195],[120.020554,30.315674],[120.02179,30.311874],[120.026686,30.310996],[120.026116,30.305948],[120.028493,30.303835],[120.030799,30.299843],[120.042089,30.304096],[120.048008,30.30319],[120.051907,30.299513],[120.053784,30.298772],[120.054807,30.295246],[120.052953,30.293847],[120.051621,30.29054],[120.052263,30.289319],[120.056732,30.2884],[120.05281,30.282897],[120.049815,30.27594],[120.049815,30.274266],[120.052382,30.273237],[120.056494,30.273374],[120.057255,30.268351],[120.05773,30.257289],[120.058515,30.252801],[120.055306,30.251483],[120.055234,30.245388],[120.052691,30.245333],[120.052216,30.243494],[120.046178,30.242725],[120.0443,30.240474],[120.044538,30.238058],[120.041162,30.236122],[120.040639,30.232841],[120.038571,30.233019],[120.032153,30.229697],[120.030894,30.230479],[120.025046,30.228461],[120.016845,30.224823],[120.01889,30.219742],[120.020268,30.217985],[120.018367,30.216447],[120.015443,30.218067],[120.013755,30.2162],[120.010356,30.221184],[120.007123,30.2208],[120.009999,30.215637],[120.015704,30.213426],[120.018034,30.214319],[120.017487,30.211792],[120.013351,30.210254],[120.007171,30.208757],[120.006529,30.205379],[120.009263,30.200202],[120.009096,30.195615],[120.003439,30.191865],[120.0013,30.188006],[119.996332,30.181536],[119.987988,30.174901],[119.980168,30.17405],[119.974296,30.175107],[119.964669,30.172854],[119.963101,30.170464],[119.959274,30.168005],[119.955993,30.168733],[119.951168,30.168307],[119.945392,30.16501],[119.942016,30.160476],[119.938736,30.158704],[119.934338,30.160202],[119.933102,30.163952],[119.932841,30.169626],[119.935265,30.177896],[119.935028,30.178981],[119.929751,30.188129],[119.926613,30.189681],[119.92155,30.190904],[119.914514,30.191824],[119.909166,30.19089],[119.903936,30.187648],[119.901393,30.188843],[119.894975,30.193417],[119.887677,30.18975],[119.880499,30.187703],[119.871656,30.182662],[119.861981,30.180726],[119.85718,30.177951],[119.853472,30.174929],[119.850168,30.181357],[119.84905,30.188074],[119.845413,30.190437],[119.842656,30.191123],[119.839495,30.19387],[119.836095,30.197949],[119.836452,30.199378],[119.84161,30.20667],[119.843132,30.214442],[119.845057,30.217189],[119.844914,30.221047],[119.846412,30.222502],[119.849787,30.223093],[119.853876,30.225276],[119.856657,30.227843],[119.86298,30.237852],[119.86752,30.249795],[119.868304,30.252718],[119.864477,30.256232],[119.865,30.258922],[119.862837,30.260501],[119.863479,30.263218],[119.86569,30.265236],[119.86588,30.268392],[119.867282,30.26938],[119.864976,30.271068],[119.864715,30.273264],[119.859985,30.272825],[119.853686,30.273841],[119.846816,30.270245],[119.844225,30.272194],[119.839471,30.27148],[119.829083,30.268516],[119.828513,30.269216],[119.829273,30.278548],[119.827657,30.282074],[119.827871,30.283789],[119.830438,30.286328],[119.836761,30.289525],[119.837118,30.29382],[119.836286,30.29928],[119.833433,30.307127],[119.83108,30.307745],[119.826302,30.306743],[119.821001,30.304096],[119.808023,30.295342],[119.799893,30.297483],[119.799085,30.30175],[119.802365,30.307868],[119.803554,30.311462],[119.803839,30.316099],[119.80227,30.322614],[119.806549,30.325851],[119.807666,30.328992],[119.807262,30.334437],[119.804647,30.342392],[119.798895,30.344215],[119.795163,30.348988],[119.791764,30.356899],[119.788602,30.35971],[119.78033,30.365647],[119.774578,30.367471],[119.772771,30.3739],[119.771107,30.375998],[119.768825,30.376752],[119.757534,30.378561],[119.749904,30.381399],[119.749262,30.383757],[119.750237,30.385292],[119.753303,30.386553],[119.755585,30.388815],[119.749048,30.392543],[119.744722,30.393804],[119.742321,30.393338],[119.735571,30.395682],[119.726253,30.389624],[119.723258,30.388472],[119.718385,30.390199],[119.704027,30.399684],[119.696445,30.401918],[119.685011,30.406605],[119.681089,30.408729],[119.686033,30.417541],[119.693521,30.424488],[119.696397,30.42668],[119.707284,30.430023],[119.709209,30.434065],[119.707617,30.437422],[119.704764,30.440326],[119.704146,30.443203],[119.699749,30.448587],[119.694923,30.452738],[119.69528,30.4596],[119.694282,30.462942],[119.695375,30.464476],[119.699368,30.465339],[119.701722,30.467996],[119.702577,30.473255],[119.704408,30.476446],[119.708235,30.485156],[119.708877,30.487963],[119.704717,30.494563],[119.708568,30.498287],[119.709186,30.508829],[119.706785,30.515852],[119.706381,30.521423],[119.704883,30.525981],[119.700272,30.531142],[119.694995,30.542351],[119.692404,30.556145],[119.693735,30.558868],[119.701341,30.558307],[119.707118,30.561057],[119.711729,30.566516],[119.716911,30.564806],[119.721617,30.560934],[119.729058,30.551766],[119.743248,30.550165],[119.74843,30.550206],[119.752091,30.551232],[119.768944,30.551355],[119.770846,30.549658],[119.772034,30.546429],[119.770727,30.544048],[119.768588,30.537259],[119.767684,30.524722],[119.766876,30.520835],[119.761813,30.51885],[119.761837,30.517125],[119.766401,30.514072],[119.784062,30.511019],[119.790433,30.506899],[119.794188,30.505625],[119.798277,30.505927],[119.806905,30.507802],[119.815891,30.510663],[119.818363,30.510102],[119.823711,30.507145],[119.829582,30.502969],[119.832459,30.49878],[119.836024,30.496589],[119.841325,30.496384],[119.846032,30.498424],[119.847149,30.50197],[119.848765,30.503188],[119.851118,30.502025],[119.854113,30.493974],[119.860175,30.48621],[119.864763,30.482526],[119.867116,30.477775],[119.869612,30.47698],[119.874128,30.478281],[119.877812,30.477925],[119.880808,30.476213],[119.88038,30.474214],[119.874366,30.471174],[119.872821,30.467065],[119.872607,30.46249],[119.873676,30.460915],[119.877622,30.460038],[119.882115,30.460367],[119.888034,30.458313],[119.891005,30.456135],[119.894571,30.455327],[119.897613,30.456011],[119.90106,30.458874],[119.903033,30.459408],[119.907407,30.456696],[119.909308,30.456326],[119.91487,30.458984],[119.918816,30.4616],[119.92155,30.462531],[119.924925,30.462189],[119.929299,30.459367],[119.931415,30.456463],[119.93151,30.449299],[119.93498,30.446779],[119.939188,30.44619],[119.944179,30.447149],[119.95074,30.444231],[119.952333,30.441861],[119.952737,30.438751],[119.955874,30.433668],[119.959606,30.432339],[119.965026,30.431572],[119.970612,30.432914],[119.973369,30.437751],[119.982973,30.445286],[119.987109,30.446135],[119.990793,30.445272],[120.0037,30.444285],[120.005459,30.443505],[120.008407,30.438669],[120.011901,30.436011],[120.013827,30.4356],[120.027732,30.434832],[120.031108,30.435161],[120.041543,30.43338],[120.044134,30.431969],[120.046107,30.427434],[120.049815,30.427338],[120.057089,30.429242],[120.061938,30.429325],[120.064743,30.430092],[120.062342,30.435572],[120.065907,30.437353],[120.067952,30.441135],[120.068118,30.445943],[120.065075,30.449546],[120.062413,30.451587],[120.059252,30.459011],[120.06025,30.464956],[120.059489,30.473433],[120.060416,30.476145],[120.063839,30.479418],[120.06586,30.483581],[120.066454,30.489496],[120.068284,30.496603],[120.076081,30.495357],[120.08074,30.497151],[120.090034,30.495987],[120.093766,30.496589],[120.099233,30.495795],[120.099804,30.494125],[120.097047,30.489852],[120.096761,30.486758],[120.099542,30.483293],[120.107315,30.481226],[120.111237,30.476186],[120.115136,30.475871],[120.122623,30.479117],[120.129707,30.479897],[120.146013,30.482705],[120.147796,30.48087],[120.146655,30.474666],[120.147083,30.471283],[120.149817,30.467503],[120.160371,30.469914],[120.162463,30.473146],[120.165624,30.474159],[120.169784,30.473981],[120.172945,30.475022],[120.175061,30.47683],[120.173159,30.483266],[120.174419,30.484129],[120.178246,30.481499],[120.180219,30.481787],[120.180005,30.483964],[120.177699,30.486018],[120.177747,30.488606],[120.173801,30.49203],[120.177058,30.493782],[120.179149,30.491947],[120.1859,30.494631],[120.182287,30.496233],[120.182216,30.499629],[120.185092,30.502627],[120.194553,30.503668],[120.197001,30.505092],[120.195812,30.509459],[120.196573,30.512032],[120.200234,30.514921],[120.201755,30.514428],[120.2033,30.507816],[120.205416,30.505858],[120.208268,30.507939],[120.212523,30.509774],[120.220724,30.510253],[120.224598,30.50976],[120.233869,30.506392],[120.239288,30.505242],[120.251934,30.506543],[120.261228,30.505242],[120.2671,30.505817],[120.27744,30.504831],[120.282123,30.508692],[120.285831,30.507802],[120.286853,30.510992],[120.289277,30.513032],[120.296527,30.514798],[120.299808,30.517809],[120.299903,30.519822],[120.311598,30.520739],[120.314593,30.521861],[120.317707,30.521601],[120.319894,30.518494],[120.322295,30.509979],[120.322651,30.506488],[120.326145,30.500437],[120.325765,30.496945],[120.327667,30.491071],[120.327904,30.484197],[120.325789,30.480774],[120.326026,30.478596],[120.328332,30.473584],[120.329188,30.468421],[120.331327,30.468407],[120.335059,30.471352],[120.341382,30.472269],[120.340645,30.466038],[120.337246,30.464312],[120.336866,30.458121],[120.337864,30.451916],[120.339813,30.450149],[120.340978,30.441614],[120.339433,30.440011],[120.340336,30.433887],[120.335939,30.431243],[120.330757,30.427269],[120.332682,30.424666],[120.332967,30.417308],[120.324838,30.411963],[120.32151,30.407715],[120.322057,30.404741],[120.320512,30.40433],[120.31533,30.400657],[120.310481,30.400205],[120.306273,30.39745],[120.306677,30.395092],[120.308936,30.393338],[120.31571,30.394325],[120.318824,30.388801],[120.318372,30.38547],[120.319276,30.379329],[120.324386,30.378493],[120.332635,30.375271],[120.339409,30.373325],[120.342927,30.371611],[120.34433,30.368087],[120.341192,30.36588],[120.335986,30.361068],[120.328261,30.358655],[120.325717,30.353389],[120.316281,30.352539],[120.310766,30.350839],[120.307224,30.350619],[120.300759,30.347575],[120.301567,30.343927],[120.299618,30.341816],[120.296623,30.33596],[120.29358,30.325001],[120.300117,30.324987],[120.300212,30.32127],[120.299475,30.315605],[120.295767,30.314851],[120.291631,30.315331],[120.291964,30.317814],[120.275562,30.319857],[120.272591,30.320516],[120.276251,30.3233],[120.281885,30.328499],[120.279318,30.336686],[120.277868,30.337948],[120.266553,30.331338],[120.268051,30.328663],[120.264437,30.326578],[120.258471,30.334355],[120.260872,30.335452],[120.261466,30.337523],[120.252552,30.337043],[120.248012,30.338853],[120.246015,30.342871],[120.243543,30.344174],[120.236056,30.339786],[120.234772,30.340691],[120.239883,30.344997],[120.242236,30.348261],[120.243947,30.354116],[120.243567,30.358188],[120.244233,30.359902],[120.247109,30.362343],[120.2468,30.363947],[120.239978,30.372146],[120.23482,30.376683],[120.23791,30.380028],[120.240334,30.387622],[120.237577,30.390062],[120.232395,30.392529],[120.228592,30.393544],[120.221294,30.387156]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":330111,\"name\":\"富阳区\",\"center\":[119.949869,30.049871],\"centroid\":[119.839625,29.995216],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":330100},\"subFeatureIndex\":8,\"acroutes\":[100000,330000,330100]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[119.996332,30.181536],[119.998994,30.182305],[120.005459,30.182346],[120.011449,30.181852],[120.013494,30.181042],[120.016156,30.177072],[120.014397,30.173816],[120.017772,30.168417],[120.018913,30.165202],[120.018438,30.162963],[120.014825,30.15891],[120.017178,30.153167],[120.016417,30.148935],[120.011663,30.142779],[120.008858,30.136719],[120.008787,30.134204],[120.007004,30.130026],[120.003819,30.12659],[120.001941,30.119567],[120.000468,30.116034],[120.001822,30.114357],[120.01095,30.116254],[120.016417,30.115718],[120.017725,30.113189],[120.016465,30.108323],[120.019151,30.10567],[120.02324,30.10633],[120.025213,30.105519],[120.030442,30.098837],[120.030846,30.094768],[120.036361,30.092555],[120.041258,30.093091],[120.043635,30.092156],[120.044894,30.086368],[120.049125,30.086849],[120.052953,30.091661],[120.054902,30.09272],[120.059513,30.092788],[120.061748,30.091853],[120.067928,30.086794],[120.076747,30.080868],[120.084615,30.078269],[120.091579,30.078475],[120.09795,30.079603],[120.108955,30.08062],[120.115088,30.082229],[120.118131,30.083796],[120.123812,30.089461],[120.124739,30.092953],[120.130349,30.099305],[120.134818,30.097669],[120.146869,30.088664],[120.140808,30.083769],[120.135079,30.080689],[120.137718,30.072177],[120.1371,30.069674],[120.134081,30.064999],[120.136886,30.061547],[120.136386,30.058934],[120.130349,30.055509],[120.12897,30.052208],[120.12569,30.050241],[120.124478,30.04833],[120.126474,30.045936],[120.129873,30.045757],[120.131133,30.044327],[120.134532,30.043983],[120.137171,30.029278],[120.136981,30.024806],[120.135555,30.021271],[120.134105,30.01058],[120.126926,29.997768],[120.124858,29.993337],[120.120294,29.990791],[120.118535,29.988272],[120.114137,29.987667],[120.110239,29.983524],[120.104463,29.981377],[120.104962,29.973614],[120.102965,29.967282],[120.101801,29.958499],[120.096001,29.952703],[120.090676,29.949123],[120.091151,29.946851],[120.100826,29.938039],[120.101325,29.936896],[120.097546,29.931126],[120.098449,29.924309],[120.096975,29.920866],[120.092126,29.916955],[120.089606,29.916514],[120.084448,29.91734],[120.081097,29.912933],[120.085542,29.906859],[120.085827,29.897437],[120.084805,29.894585],[120.082523,29.891788],[120.078268,29.88975],[120.077222,29.88822],[120.078149,29.884115],[120.082095,29.876688],[120.088156,29.871232],[120.096666,29.862399],[120.099566,29.856694],[120.104059,29.8534],[120.102442,29.849445],[120.102466,29.846812],[120.104796,29.845531],[120.10993,29.845972],[120.102015,29.832905],[120.101111,29.830258],[120.102728,29.823972],[120.09871,29.819023],[120.095834,29.816596],[120.091888,29.816679],[120.085328,29.820967],[120.080384,29.826522],[120.077198,29.828149],[120.074275,29.827336],[120.065646,29.822042],[120.061961,29.821628],[120.054355,29.823559],[120.049553,29.823917],[120.038453,29.822828],[120.036076,29.816596],[120.03106,29.810254],[120.030038,29.806283],[120.032296,29.803898],[120.034649,29.799568],[120.036218,29.79346],[120.036622,29.78884],[120.035481,29.787213],[120.030062,29.782758],[120.029776,29.779324],[120.030038,29.770552],[120.02835,29.768938],[120.025522,29.769311],[120.021718,29.767049],[120.020292,29.764855],[120.015229,29.764235],[120.011497,29.761503],[120.011212,29.757324],[120.008977,29.75713],[120.003439,29.75513],[120.000087,29.754909],[119.991958,29.753157],[119.987845,29.754909],[119.986871,29.75673],[119.981214,29.757972],[119.979859,29.759641],[119.978718,29.76589],[119.977078,29.766469],[119.973132,29.765793],[119.968639,29.762897],[119.967165,29.759986],[119.962316,29.75571],[119.960272,29.755144],[119.94765,29.756179],[119.94456,29.755503],[119.93933,29.752675],[119.937024,29.750564],[119.933079,29.749046],[119.927184,29.744438],[119.924949,29.745252],[119.924331,29.748867],[119.923166,29.750357],[119.916416,29.752344],[119.913539,29.755861],[119.907692,29.754523],[119.904364,29.754606],[119.896448,29.761159],[119.892574,29.763117],[119.89053,29.763241],[119.883921,29.763421],[119.878003,29.764966],[119.872654,29.767255],[119.870301,29.769324],[119.866403,29.776552],[119.863313,29.778772],[119.860793,29.781862],[119.860222,29.786564],[119.865761,29.797404],[119.867021,29.801389],[119.868304,29.80245],[119.871822,29.801816],[119.875364,29.802423],[119.881568,29.80587],[119.884896,29.812088],[119.882971,29.819726],[119.882329,29.826729],[119.885371,29.830934],[119.886061,29.83489],[119.889103,29.838639],[119.888889,29.842622],[119.887059,29.845668],[119.885015,29.846137],[119.865642,29.837757],[119.859937,29.837591],[119.852568,29.841216],[119.843892,29.85103],[119.840659,29.855853],[119.836618,29.85945],[119.828537,29.864563],[119.827039,29.867277],[119.82528,29.874691],[119.821786,29.879458],[119.817792,29.880629],[119.813942,29.880229],[119.802841,29.876275],[119.794307,29.874677],[119.787295,29.875131],[119.777502,29.874222],[119.763952,29.871328],[119.756607,29.871949],[119.752186,29.870019],[119.744889,29.868393],[119.74042,29.868931],[119.736688,29.870901],[119.72718,29.8655],[119.712157,29.860291],[119.710731,29.860938],[119.705549,29.867897],[119.702863,29.870419],[119.699915,29.875421],[119.692261,29.880905],[119.685748,29.881993],[119.679045,29.885437],[119.675479,29.888702],[119.675384,29.893607],[119.676311,29.899035],[119.674243,29.905109],[119.675503,29.908842],[119.675146,29.912671],[119.676121,29.916665],[119.675432,29.920012],[119.673744,29.92205],[119.668087,29.92256],[119.66628,29.927876],[119.654228,29.930616],[119.643413,29.92789],[119.637874,29.925342],[119.635426,29.924943],[119.630957,29.926568],[119.626726,29.933054],[119.627677,29.938837],[119.626061,29.942968],[119.619619,29.946039],[119.617432,29.953831],[119.611632,29.95631],[119.611466,29.962587],[119.604192,29.962298],[119.60065,29.964955],[119.599081,29.970874],[119.596324,29.972141],[119.593115,29.972279],[119.587315,29.974068],[119.58218,29.973311],[119.575121,29.977179],[119.568322,29.98157],[119.565375,29.982492],[119.560526,29.981707],[119.557958,29.980427],[119.553395,29.976683],[119.547951,29.975293],[119.540392,29.980124],[119.539204,29.982547],[119.539441,29.985988],[119.541438,29.989649],[119.53937,29.993956],[119.542769,30.002874],[119.542508,30.006727],[119.535258,30.008736],[119.530932,30.012423],[119.52449,30.014831],[119.522541,30.0164],[119.514055,30.015464],[119.508873,30.011777],[119.507161,30.011447],[119.502407,30.017432],[119.500719,30.022454],[119.501385,30.025893],[119.504047,30.031974],[119.506805,30.036335],[119.509063,30.037958],[119.511369,30.041301],[119.510798,30.043845],[119.506424,30.051246],[119.50602,30.054863],[119.50892,30.06416],[119.508635,30.066457],[119.505212,30.070128],[119.502669,30.070967],[119.499816,30.073374],[119.494706,30.072947],[119.490902,30.073924],[119.485459,30.077403],[119.481679,30.079011],[119.47519,30.080043],[119.473217,30.079671],[119.467013,30.074034],[119.465634,30.074061],[119.463043,30.077306],[119.461118,30.083535],[119.459407,30.086945],[119.4576,30.088403],[119.454106,30.088801],[119.446975,30.086629],[119.440081,30.087193],[119.437229,30.089874],[119.436373,30.094411],[119.436944,30.097037],[119.440676,30.0998],[119.446523,30.10314],[119.454201,30.105725],[119.457077,30.107264],[119.459502,30.109794],[119.460785,30.112845],[119.461332,30.118343],[119.460738,30.120185],[119.458028,30.122426],[119.452466,30.123168],[119.447307,30.125655],[119.442577,30.13015],[119.441341,30.135784],[119.443766,30.139082],[119.445834,30.140072],[119.452062,30.139288],[119.455152,30.142215],[119.459502,30.143177],[119.463828,30.145527],[119.468368,30.143205],[119.479754,30.146805],[119.483676,30.141927],[119.486695,30.141982],[119.489785,30.144923],[119.492828,30.142628],[119.498651,30.141212],[119.499412,30.14337],[119.497819,30.146091],[119.503643,30.149086],[119.503429,30.156025],[119.505664,30.158567],[119.520449,30.158938],[119.526201,30.157412],[119.529434,30.158443],[119.530195,30.160147],[119.529315,30.166411],[119.535424,30.183967],[119.539774,30.185698],[119.546549,30.186275],[119.550518,30.189228],[119.556413,30.192346],[119.561595,30.194241],[119.571246,30.196947],[119.574907,30.19615],[119.577521,30.194557],[119.580231,30.191412],[119.582513,30.186852],[119.583226,30.182429],[119.580707,30.167332],[119.582109,30.1649],[119.586126,30.164103],[119.594589,30.159212],[119.605166,30.156698],[119.607948,30.153222],[119.610063,30.146544],[119.610301,30.138505],[119.611727,30.137461],[119.615673,30.137516],[119.61679,30.136238],[119.615934,30.132926],[119.616148,30.126961],[119.619191,30.123195],[119.623375,30.122055],[119.632954,30.122659],[119.64491,30.126961],[119.651733,30.130713],[119.655797,30.130081],[119.65991,30.123498],[119.662239,30.120927],[119.672246,30.116502],[119.673221,30.115581],[119.67498,30.110041],[119.67971,30.105106],[119.687578,30.099896],[119.691049,30.098356],[119.70039,30.09617],[119.701413,30.092087],[119.736165,30.084814],[119.73916,30.085625],[119.741228,30.089901],[119.744698,30.092073],[119.747432,30.091455],[119.751116,30.08733],[119.7553,30.085199],[119.76747,30.082133],[119.770822,30.082091],[119.777573,30.083054],[119.779237,30.08458],[119.780188,30.096363],[119.782113,30.099484],[119.783824,30.100034],[119.78827,30.098521],[119.790005,30.099346],[119.789791,30.105189],[119.791003,30.107361],[119.797136,30.110344],[119.80208,30.111691],[119.802532,30.117807],[119.804671,30.122302],[119.807809,30.124762],[119.81059,30.125807],[119.814512,30.130479],[119.821762,30.132582],[119.826136,30.133365],[119.828584,30.140608],[119.831199,30.14359],[119.829582,30.156464],[119.834455,30.160545],[119.840564,30.166453],[119.853472,30.174929],[119.85718,30.177951],[119.861981,30.180726],[119.871656,30.182662],[119.880499,30.187703],[119.887677,30.18975],[119.894975,30.193417],[119.901393,30.188843],[119.903936,30.187648],[119.909166,30.19089],[119.914514,30.191824],[119.92155,30.190904],[119.926613,30.189681],[119.929751,30.188129],[119.935028,30.178981],[119.935265,30.177896],[119.932841,30.169626],[119.933102,30.163952],[119.934338,30.160202],[119.938736,30.158704],[119.942016,30.160476],[119.945392,30.16501],[119.951168,30.168307],[119.955993,30.168733],[119.959274,30.168005],[119.963101,30.170464],[119.964669,30.172854],[119.974296,30.175107],[119.980168,30.17405],[119.987988,30.174901],[119.996332,30.181536]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":330112,\"name\":\"临安区\",\"center\":[119.715101,30.231153],\"centroid\":[119.343878,30.201776],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":330100},\"subFeatureIndex\":9,\"acroutes\":[100000,330000,330100]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[119.236369,29.950968],[119.235537,29.955332],[119.233184,29.957618],[119.228121,29.959614],[119.224769,29.959476],[119.217662,29.956282],[119.210673,29.958127],[119.208534,29.957989],[119.204279,29.961624],[119.197006,29.962436],[119.19363,29.963744],[119.184431,29.965588],[119.178251,29.964859],[119.173734,29.962766],[119.169741,29.964749],[119.161588,29.966318],[119.158616,29.970227],[119.153553,29.969291],[119.14937,29.970737],[119.14956,29.973366],[119.14811,29.974687],[119.142001,29.975637],[119.135512,29.980909],[119.132089,29.981721],[119.12182,29.978652],[119.12037,29.978872],[119.115901,29.98691],[119.113334,29.993447],[119.110196,29.997768],[119.11312,30.001498],[119.114546,30.009506],[119.11205,30.010965],[119.107986,30.011873],[119.097764,30.012616],[119.089896,30.013854],[119.085332,30.012754],[119.081458,30.009933],[119.077013,30.008763],[119.064414,30.008364],[119.058805,30.009217],[119.054051,30.008282],[119.051911,30.007098],[119.046824,30.011158],[119.039883,30.01058],[119.034963,30.013373],[119.031112,30.01845],[119.025122,30.021078],[119.024243,30.022454],[119.031683,30.031066],[119.032015,30.032662],[119.030138,30.035083],[119.026952,30.035],[119.021247,30.032744],[119.016161,30.032662],[119.004751,30.024311],[118.999355,30.021614],[118.988326,30.017996],[118.9864,30.025329],[118.987113,30.027283],[118.9864,30.031424],[118.982454,30.034643],[118.979721,30.032442],[118.975894,30.027943],[118.970664,30.026375],[118.969381,30.023458],[118.966457,30.022137],[118.96263,30.023444],[118.956093,30.021449],[118.95412,30.018766],[118.949199,30.016813],[118.940286,30.010249],[118.93634,30.010951],[118.932703,30.009575],[118.932109,30.008158],[118.927973,30.011584],[118.923789,30.009795],[118.917086,30.013056],[118.913211,30.012382],[118.909313,30.01391],[118.90501,30.012836],[118.898355,30.015547],[118.897404,30.01673],[118.89883,30.018766],[118.902586,30.029057],[118.901516,30.031314],[118.895597,30.032455],[118.892269,30.039017],[118.890582,30.041273],[118.891342,30.043034],[118.897333,30.049623],[118.897356,30.051864],[118.89391,30.054932],[118.88811,30.062372],[118.885067,30.064036],[118.878815,30.064655],[118.875464,30.07204],[118.87506,30.079039],[118.873729,30.081748],[118.872992,30.087028],[118.872611,30.095401],[118.868856,30.101463],[118.869117,30.107402],[118.871637,30.11301],[118.873895,30.115058],[118.878055,30.116735],[118.883855,30.116392],[118.88723,30.11745],[118.888609,30.122357],[118.888656,30.128432],[118.893387,30.133091],[118.895978,30.138794],[118.896952,30.1444],[118.896786,30.148083],[118.895098,30.148495],[118.890938,30.147451],[118.881026,30.146805],[118.874988,30.148193],[118.870543,30.151161],[118.865718,30.151491],[118.862081,30.148894],[118.8564,30.14822],[118.852145,30.149924],[118.846987,30.153881],[118.845703,30.156135],[118.846797,30.161053],[118.84808,30.163046],[118.852858,30.166549],[118.858349,30.168087],[118.864411,30.168994],[118.870282,30.171055],[118.873681,30.172923],[118.884259,30.176811],[118.891628,30.18041],[118.9028,30.183226],[118.904796,30.18655],[118.91081,30.187484],[118.912165,30.1885],[118.915707,30.194392],[118.920651,30.199021],[118.929232,30.201918],[118.92909,30.20667],[118.926142,30.212643],[118.923385,30.214511],[118.919368,30.215225],[118.911452,30.215321],[118.905201,30.216571],[118.90318,30.21793],[118.899876,30.223422],[118.896168,30.234557],[118.893529,30.23976],[118.892531,30.243247],[118.889726,30.24499],[118.882429,30.247475],[118.881549,30.251153],[118.882357,30.252348],[118.888965,30.253775],[118.889441,30.255724],[118.886541,30.260734],[118.885043,30.268379],[118.879861,30.278355],[118.878079,30.282719],[118.877199,30.288071],[118.877508,30.290815],[118.880574,30.294519],[118.881811,30.298512],[118.881549,30.304603],[118.879196,30.312189],[118.879885,30.314878],[118.889607,30.317018],[118.894124,30.319089],[118.899781,30.322587],[118.90841,30.330871],[118.911143,30.332229],[118.917894,30.332449],[118.9226,30.334753],[118.928282,30.339978],[118.933559,30.342131],[118.93634,30.345066],[118.937362,30.348713],[118.936435,30.350811],[118.94977,30.358778],[118.954191,30.360341],[118.955404,30.359189],[118.956592,30.352059],[118.959373,30.347287],[118.964056,30.350578],[118.969048,30.351332],[118.972708,30.347534],[118.975751,30.347164],[118.985735,30.34955],[118.988112,30.348672],[118.988539,30.346547],[118.987755,30.340705],[118.98804,30.333477],[118.989157,30.33238],[118.996312,30.330501],[119.004442,30.328938],[119.007152,30.327717],[119.010598,30.323561],[119.01376,30.321531],[119.018538,30.32042],[119.02158,30.315509],[119.024742,30.313657],[119.028783,30.312587],[119.037197,30.312066],[119.046872,30.313191],[119.048322,30.31267],[119.050414,30.309268],[119.050842,30.30673],[119.052672,30.305221],[119.05676,30.303876],[119.059874,30.303849],[119.062988,30.30496],[119.067077,30.308197],[119.069858,30.312135],[119.0734,30.31588],[119.08267,30.321627],[119.090253,30.324014],[119.0932,30.322957],[119.094959,30.320653],[119.102328,30.31758],[119.105466,30.314631],[119.111028,30.311298],[119.119467,30.310104],[119.125671,30.305371],[119.128499,30.304727],[119.151271,30.304603],[119.154599,30.302833],[119.156739,30.299541],[119.160875,30.298114],[119.163584,30.299664],[119.166294,30.298827],[119.170525,30.295342],[119.173996,30.294711],[119.179629,30.295384],[119.18821,30.291652],[119.19092,30.291954],[119.201046,30.291021],[119.203709,30.296262],[119.204065,30.299349],[119.205682,30.301558],[119.210602,30.299431],[119.212908,30.299239],[119.218019,30.301338],[119.222606,30.299623],[119.224032,30.296564],[119.223747,30.291281],[119.225482,30.288798],[119.229191,30.289662],[119.233731,30.293394],[119.238152,30.301365],[119.243072,30.313287],[119.245925,30.321613],[119.244095,30.324452],[119.239982,30.327031],[119.241575,30.33153],[119.247137,30.340814],[119.248849,30.341541],[119.252747,30.340334],[119.257121,30.337756],[119.261209,30.337249],[119.26506,30.338058],[119.270599,30.342062],[119.272334,30.34257],[119.275757,30.34091],[119.278158,30.341582],[119.289448,30.349646],[119.297507,30.35764],[119.300668,30.363686],[119.31077,30.366387],[119.326554,30.371762],[119.329074,30.371515],[119.336347,30.366264],[119.342647,30.363152],[119.343788,30.360684],[119.344881,30.354143],[119.349445,30.349152],[119.356077,30.349426],[119.368247,30.35295],[119.375616,30.354815],[119.381083,30.35812],[119.386146,30.363906],[119.391875,30.366305],[119.395845,30.36625],[119.399981,30.3678],[119.403047,30.373325],[119.407136,30.373325],[119.418141,30.376108],[119.421113,30.379727],[119.426556,30.383949],[119.430502,30.384058],[119.432784,30.386485],[119.434186,30.390254],[119.435708,30.391501],[119.441032,30.392461],[119.445739,30.399191],[119.448425,30.405235],[119.450231,30.410826],[119.451848,30.412169],[119.455865,30.411991],[119.467013,30.40814],[119.477329,30.40729],[119.483819,30.408318],[119.490403,30.408208],[119.498889,30.406865],[119.506092,30.404673],[119.513151,30.401671],[119.516907,30.402535],[119.522232,30.404673],[119.528626,30.408524],[119.533451,30.409414],[119.535733,30.411662],[119.536446,30.414403],[119.53483,30.420788],[119.535305,30.424049],[119.544386,30.431065],[119.54662,30.434805],[119.551731,30.439765],[119.565922,30.443381],[119.569107,30.44097],[119.571864,30.436915],[119.572839,30.431325],[119.579708,30.424748],[119.5818,30.423625],[119.591665,30.421638],[119.597893,30.422446],[119.602789,30.425886],[119.606569,30.427146],[119.613011,30.426023],[119.618026,30.427324],[119.623018,30.429763],[119.627653,30.433024],[119.633881,30.440217],[119.63709,30.441833],[119.642296,30.440217],[119.645101,30.437764],[119.645671,30.429845],[119.637161,30.428708],[119.632193,30.42716],[119.631052,30.423282],[119.634071,30.414992],[119.635878,30.406249],[119.635973,30.403617],[119.632383,30.399766],[119.640014,30.39793],[119.644411,30.395764],[119.649783,30.395449],[119.658151,30.397464],[119.661859,30.397409],[119.667397,30.399108],[119.677856,30.40618],[119.681089,30.408729],[119.685011,30.406605],[119.696445,30.401918],[119.704027,30.399684],[119.718385,30.390199],[119.723258,30.388472],[119.726253,30.389624],[119.735571,30.395682],[119.742321,30.393338],[119.744722,30.393804],[119.749048,30.392543],[119.755585,30.388815],[119.753303,30.386553],[119.750237,30.385292],[119.749262,30.383757],[119.749904,30.381399],[119.757534,30.378561],[119.768825,30.376752],[119.771107,30.375998],[119.772771,30.3739],[119.774578,30.367471],[119.78033,30.365647],[119.788602,30.35971],[119.791764,30.356899],[119.795163,30.348988],[119.798895,30.344215],[119.804647,30.342392],[119.807262,30.334437],[119.807666,30.328992],[119.806549,30.325851],[119.80227,30.322614],[119.803839,30.316099],[119.803554,30.311462],[119.802365,30.307868],[119.799085,30.30175],[119.799893,30.297483],[119.808023,30.295342],[119.821001,30.304096],[119.826302,30.306743],[119.83108,30.307745],[119.833433,30.307127],[119.836286,30.29928],[119.837118,30.29382],[119.836761,30.289525],[119.830438,30.286328],[119.827871,30.283789],[119.827657,30.282074],[119.829273,30.278548],[119.828513,30.269216],[119.829083,30.268516],[119.839471,30.27148],[119.844225,30.272194],[119.846816,30.270245],[119.853686,30.273841],[119.859985,30.272825],[119.864715,30.273264],[119.864976,30.271068],[119.867282,30.26938],[119.86588,30.268392],[119.86569,30.265236],[119.863479,30.263218],[119.862837,30.260501],[119.865,30.258922],[119.864477,30.256232],[119.868304,30.252718],[119.86752,30.249795],[119.86298,30.237852],[119.856657,30.227843],[119.853876,30.225276],[119.849787,30.223093],[119.846412,30.222502],[119.844914,30.221047],[119.845057,30.217189],[119.843132,30.214442],[119.84161,30.20667],[119.836452,30.199378],[119.836095,30.197949],[119.839495,30.19387],[119.842656,30.191123],[119.845413,30.190437],[119.84905,30.188074],[119.850168,30.181357],[119.853472,30.174929],[119.840564,30.166453],[119.834455,30.160545],[119.829582,30.156464],[119.831199,30.14359],[119.828584,30.140608],[119.826136,30.133365],[119.821762,30.132582],[119.814512,30.130479],[119.81059,30.125807],[119.807809,30.124762],[119.804671,30.122302],[119.802532,30.117807],[119.80208,30.111691],[119.797136,30.110344],[119.791003,30.107361],[119.789791,30.105189],[119.790005,30.099346],[119.78827,30.098521],[119.783824,30.100034],[119.782113,30.099484],[119.780188,30.096363],[119.779237,30.08458],[119.777573,30.083054],[119.770822,30.082091],[119.76747,30.082133],[119.7553,30.085199],[119.751116,30.08733],[119.747432,30.091455],[119.744698,30.092073],[119.741228,30.089901],[119.73916,30.085625],[119.736165,30.084814],[119.701413,30.092087],[119.70039,30.09617],[119.691049,30.098356],[119.687578,30.099896],[119.67971,30.105106],[119.67498,30.110041],[119.673221,30.115581],[119.672246,30.116502],[119.662239,30.120927],[119.65991,30.123498],[119.655797,30.130081],[119.651733,30.130713],[119.64491,30.126961],[119.632954,30.122659],[119.623375,30.122055],[119.619191,30.123195],[119.616148,30.126961],[119.615934,30.132926],[119.61679,30.136238],[119.615673,30.137516],[119.611727,30.137461],[119.610301,30.138505],[119.610063,30.146544],[119.607948,30.153222],[119.605166,30.156698],[119.594589,30.159212],[119.586126,30.164103],[119.582109,30.1649],[119.580707,30.167332],[119.583226,30.182429],[119.582513,30.186852],[119.580231,30.191412],[119.577521,30.194557],[119.574907,30.19615],[119.571246,30.196947],[119.561595,30.194241],[119.556413,30.192346],[119.550518,30.189228],[119.546549,30.186275],[119.539774,30.185698],[119.535424,30.183967],[119.529315,30.166411],[119.530195,30.160147],[119.529434,30.158443],[119.526201,30.157412],[119.520449,30.158938],[119.505664,30.158567],[119.503429,30.156025],[119.503643,30.149086],[119.497819,30.146091],[119.499412,30.14337],[119.498651,30.141212],[119.492828,30.142628],[119.489785,30.144923],[119.486695,30.141982],[119.483676,30.141927],[119.479754,30.146805],[119.468368,30.143205],[119.463828,30.145527],[119.459502,30.143177],[119.455152,30.142215],[119.452062,30.139288],[119.445834,30.140072],[119.443766,30.139082],[119.441341,30.135784],[119.442577,30.13015],[119.447307,30.125655],[119.452466,30.123168],[119.458028,30.122426],[119.460738,30.120185],[119.461332,30.118343],[119.460785,30.112845],[119.459502,30.109794],[119.457077,30.107264],[119.454201,30.105725],[119.446523,30.10314],[119.440676,30.0998],[119.436944,30.097037],[119.436373,30.094411],[119.437229,30.089874],[119.440081,30.087193],[119.43623,30.086038],[119.431785,30.082559],[119.429741,30.079314],[119.430597,30.074542],[119.433164,30.071531],[119.434044,30.068877],[119.43257,30.067405],[119.42299,30.06537],[119.420399,30.063514],[119.420304,30.062083],[119.427673,30.057173],[119.430169,30.053116],[119.430502,30.050021],[119.433497,30.044588],[119.433117,30.040407],[119.431476,30.037559],[119.430763,30.032813],[119.431096,30.029773],[119.430335,30.024683],[119.432308,30.015423],[119.433568,30.013166],[119.426603,30.000548],[119.426485,29.994741],[119.425058,29.991589],[119.420542,29.991837],[119.412817,29.99525],[119.405353,29.997245],[119.397176,29.995608],[119.38926,29.993186],[119.386978,29.989428],[119.381582,29.991438],[119.36858,29.998828],[119.358287,30.002268],[119.345071,30.004264],[119.338915,30.007195],[119.334374,30.007814],[119.321752,29.999805],[119.318543,29.996034],[119.314098,29.997493],[119.309487,29.993805],[119.30547,29.994204],[119.297958,30.001223],[119.29734,30.003342],[119.299384,30.007222],[119.296532,30.011103],[119.29444,30.012726],[119.290494,30.013744],[119.282603,30.009933],[119.278514,30.005571],[119.274901,30.002736],[119.270456,30.001016],[119.268364,30.001897],[119.265274,30.005557],[119.263135,30.005007],[119.260876,30.002846],[119.256217,30.000108],[119.250346,29.999599],[119.248373,29.998718],[119.246472,29.992291],[119.247922,29.98852],[119.253769,29.983964],[119.255148,29.981212],[119.252961,29.975775],[119.253817,29.968025],[119.255433,29.962078],[119.259569,29.95547],[119.259403,29.951395],[119.258048,29.9463],[119.258214,29.943794],[119.259854,29.940572],[119.25762,29.936799],[119.25472,29.935188],[119.24747,29.934376],[119.24476,29.935491],[119.241171,29.940641],[119.240434,29.943588],[119.237819,29.946906],[119.236369,29.950968]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":330122,\"name\":\"桐庐县\",\"center\":[119.685045,29.797437],\"centroid\":[119.553936,29.830649],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":330100},\"subFeatureIndex\":10,\"acroutes\":[100000,330000,330100]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[119.440081,30.087193],[119.446975,30.086629],[119.454106,30.088801],[119.4576,30.088403],[119.459407,30.086945],[119.461118,30.083535],[119.463043,30.077306],[119.465634,30.074061],[119.467013,30.074034],[119.473217,30.079671],[119.47519,30.080043],[119.481679,30.079011],[119.485459,30.077403],[119.490902,30.073924],[119.494706,30.072947],[119.499816,30.073374],[119.502669,30.070967],[119.505212,30.070128],[119.508635,30.066457],[119.50892,30.06416],[119.50602,30.054863],[119.506424,30.051246],[119.510798,30.043845],[119.511369,30.041301],[119.509063,30.037958],[119.506805,30.036335],[119.504047,30.031974],[119.501385,30.025893],[119.500719,30.022454],[119.502407,30.017432],[119.507161,30.011447],[119.508873,30.011777],[119.514055,30.015464],[119.522541,30.0164],[119.52449,30.014831],[119.530932,30.012423],[119.535258,30.008736],[119.542508,30.006727],[119.542769,30.002874],[119.53937,29.993956],[119.541438,29.989649],[119.539441,29.985988],[119.539204,29.982547],[119.540392,29.980124],[119.547951,29.975293],[119.553395,29.976683],[119.557958,29.980427],[119.560526,29.981707],[119.565375,29.982492],[119.568322,29.98157],[119.575121,29.977179],[119.58218,29.973311],[119.587315,29.974068],[119.593115,29.972279],[119.596324,29.972141],[119.599081,29.970874],[119.60065,29.964955],[119.604192,29.962298],[119.611466,29.962587],[119.611632,29.95631],[119.617432,29.953831],[119.619619,29.946039],[119.626061,29.942968],[119.627677,29.938837],[119.626726,29.933054],[119.630957,29.926568],[119.635426,29.924943],[119.637874,29.925342],[119.643413,29.92789],[119.654228,29.930616],[119.66628,29.927876],[119.668087,29.92256],[119.673744,29.92205],[119.675432,29.920012],[119.676121,29.916665],[119.675146,29.912671],[119.675503,29.908842],[119.674243,29.905109],[119.676311,29.899035],[119.675384,29.893607],[119.675479,29.888702],[119.679045,29.885437],[119.685748,29.881993],[119.692261,29.880905],[119.699915,29.875421],[119.702863,29.870419],[119.705549,29.867897],[119.710731,29.860938],[119.712157,29.860291],[119.72718,29.8655],[119.736688,29.870901],[119.74042,29.868931],[119.744889,29.868393],[119.752186,29.870019],[119.756607,29.871949],[119.763952,29.871328],[119.777502,29.874222],[119.787295,29.875131],[119.794307,29.874677],[119.802841,29.876275],[119.813942,29.880229],[119.817792,29.880629],[119.821786,29.879458],[119.82528,29.874691],[119.827039,29.867277],[119.828537,29.864563],[119.836618,29.85945],[119.840659,29.855853],[119.843892,29.85103],[119.852568,29.841216],[119.859937,29.837591],[119.865642,29.837757],[119.885015,29.846137],[119.887059,29.845668],[119.888889,29.842622],[119.889103,29.838639],[119.886061,29.83489],[119.885371,29.830934],[119.882329,29.826729],[119.882971,29.819726],[119.884896,29.812088],[119.881568,29.80587],[119.875364,29.802423],[119.871822,29.801816],[119.868304,29.80245],[119.867021,29.801389],[119.865761,29.797404],[119.860222,29.786564],[119.860793,29.781862],[119.863313,29.778772],[119.866403,29.776552],[119.870301,29.769324],[119.872654,29.767255],[119.878003,29.764966],[119.883921,29.763421],[119.89053,29.763241],[119.890221,29.758496],[119.888794,29.755972],[119.88908,29.753102],[119.890981,29.750426],[119.894476,29.748757],[119.900466,29.744645],[119.898612,29.740617],[119.901393,29.728612],[119.905648,29.72766],[119.911376,29.722582],[119.91247,29.720402],[119.911376,29.715944],[119.91178,29.71364],[119.915584,29.707967],[119.914252,29.705524],[119.919529,29.699562],[119.922525,29.697753],[119.928657,29.698858],[119.931676,29.696691],[119.933768,29.698582],[119.930084,29.701936],[119.930226,29.704503],[119.933578,29.706739],[119.937761,29.70747],[119.941517,29.705234],[119.94494,29.704903],[119.948149,29.703068],[119.951287,29.699299],[119.957942,29.698416],[119.960129,29.696967],[119.967403,29.694896],[119.973441,29.689941],[119.973797,29.678648],[119.973155,29.673098],[119.970778,29.670765],[119.966832,29.670958],[119.959083,29.672822],[119.948862,29.668017],[119.945653,29.667368],[119.940733,29.667506],[119.936169,29.666526],[119.924806,29.669895],[119.92281,29.668487],[119.921265,29.664027],[119.918246,29.664386],[119.914514,29.66625],[119.911709,29.666498],[119.908595,29.663074],[119.902344,29.661403],[119.895712,29.660644],[119.887178,29.662039],[119.883494,29.663433],[119.879286,29.667934],[119.875816,29.668984],[119.873058,29.668666],[119.869992,29.66995],[119.863384,29.669481],[119.859533,29.671345],[119.856538,29.671027],[119.852521,29.668887],[119.842157,29.675556],[119.837664,29.676453],[119.835454,29.678124],[119.836904,29.68076],[119.835359,29.682251],[119.824472,29.671856],[119.821738,29.671193],[119.817602,29.673057],[119.814132,29.671359],[119.810709,29.667493],[119.809972,29.665201],[119.805313,29.664952],[119.802484,29.663254],[119.79918,29.660078],[119.798253,29.656929],[119.796351,29.655687],[119.793214,29.656101],[119.79117,29.654969],[119.788151,29.645205],[119.781067,29.638618],[119.777525,29.628645],[119.776527,29.62685],[119.776218,29.620233],[119.779831,29.613285],[119.780069,29.609458],[119.779308,29.604001],[119.774364,29.599179],[119.76728,29.597659],[119.765307,29.596402],[119.762312,29.597811],[119.757843,29.598447],[119.750142,29.602978],[119.746434,29.606419],[119.742393,29.609195],[119.731126,29.613547],[119.728368,29.613506],[119.723899,29.610535],[119.718575,29.610439],[119.717315,29.608781],[119.715247,29.601804],[119.709376,29.595863],[119.708282,29.589673],[119.704075,29.587641],[119.701318,29.58959],[119.698322,29.593721],[119.695256,29.596719],[119.692998,29.602633],[119.695375,29.616034],[119.694876,29.619985],[119.693307,29.620965],[119.688363,29.62109],[119.679663,29.62685],[119.678593,29.634018],[119.676192,29.636325],[119.673031,29.636905],[119.670226,29.640979],[119.672104,29.648658],[119.674505,29.653809],[119.670844,29.657137],[119.667968,29.657316],[119.665305,29.653836],[119.658792,29.652013],[119.651043,29.651641],[119.64705,29.65229],[119.643579,29.653961],[119.636733,29.652939],[119.634689,29.653243],[119.62946,29.656239],[119.621972,29.65472],[119.616148,29.656805],[119.617479,29.662757],[119.616909,29.664648],[119.613581,29.669757],[119.612749,29.673029],[119.614128,29.684999],[119.610776,29.688229],[119.610895,29.695227],[119.602528,29.700859],[119.604144,29.708837],[119.603978,29.713419],[119.601815,29.716055],[119.596229,29.717352],[119.593448,29.723203],[119.59176,29.724818],[119.583726,29.729385],[119.581895,29.73111],[119.578306,29.738299],[119.577212,29.741569],[119.574099,29.745197],[119.571698,29.749847],[119.569131,29.751695],[119.560431,29.752316],[119.549472,29.749916],[119.544695,29.747432],[119.543696,29.746122],[119.540511,29.737319],[119.537064,29.736933],[119.531954,29.733925],[119.528269,29.733897],[119.522969,29.731013],[119.520187,29.728792],[119.50835,29.725273],[119.504879,29.722872],[119.50022,29.722679],[119.493802,29.721285],[119.492376,29.722334],[119.484556,29.731262],[119.478019,29.732338],[119.476379,29.733373],[119.472932,29.739361],[119.465753,29.741693],[119.458955,29.744935],[119.454938,29.741983],[119.451206,29.741555],[119.447094,29.743183],[119.44203,29.741651],[119.439867,29.742231],[119.434519,29.748384],[119.425938,29.753171],[119.425439,29.75582],[119.42261,29.758469],[119.417547,29.757048],[119.415431,29.750233],[119.411343,29.745266],[119.407088,29.7431],[119.398792,29.744328],[119.393563,29.748301],[119.392374,29.750357],[119.394323,29.759807],[119.391495,29.7624],[119.390924,29.764979],[119.388357,29.769628],[119.383579,29.770952],[119.380489,29.766993],[119.374142,29.760662],[119.373405,29.758758],[119.373857,29.754978],[119.370624,29.752688],[119.365823,29.750398],[119.36423,29.746397],[119.360332,29.741638],[119.358074,29.737968],[119.355768,29.73231],[119.354056,29.730185],[119.354508,29.725825],[119.352915,29.722334],[119.350015,29.719643],[119.34828,29.715116],[119.344168,29.717435],[119.341434,29.717366],[119.334184,29.714992],[119.327933,29.714316],[119.32218,29.716248],[119.31745,29.717173],[119.316547,29.719808],[119.31707,29.723617],[119.314431,29.724983],[119.308893,29.724721],[119.302451,29.725715],[119.298529,29.724831],[119.291184,29.725356],[119.287547,29.728198],[119.286881,29.730917],[119.28807,29.737954],[119.290233,29.740575],[119.292016,29.746218],[119.293299,29.760607],[119.294369,29.764028],[119.293989,29.768373],[119.294892,29.771766],[119.294369,29.775379],[119.286002,29.781793],[119.28246,29.786151],[119.273118,29.791612],[119.270765,29.795404],[119.272334,29.799624],[119.278609,29.804739],[119.279417,29.807938],[119.278823,29.813329],[119.27502,29.818527],[119.273903,29.828135],[119.274402,29.830175],[119.272215,29.83267],[119.267675,29.833759],[119.26594,29.833043],[119.257739,29.823503],[119.255409,29.821808],[119.251297,29.822235],[119.247209,29.824317],[119.241718,29.828397],[119.239079,29.831568],[119.233564,29.831568],[119.225506,29.834283],[119.222036,29.839177],[119.219017,29.839645],[119.213478,29.836213],[119.204232,29.833718],[119.196221,29.837123],[119.193939,29.83868],[119.189946,29.846495],[119.182933,29.852243],[119.182482,29.860497],[119.185382,29.865706],[119.188329,29.86776],[119.191419,29.873189],[119.191348,29.878741],[119.194581,29.884115],[119.198669,29.889612],[119.205705,29.896582],[119.207726,29.897271],[119.213692,29.896155],[119.219088,29.896541],[119.222368,29.897561],[119.225934,29.900302],[119.227669,29.902588],[119.228644,29.910605],[119.226766,29.912451],[119.227717,29.91617],[119.221703,29.917905],[119.218613,29.922298],[119.218328,29.927559],[119.222036,29.932916],[119.220277,29.936083],[119.216925,29.936662],[119.21141,29.935932],[119.208106,29.93629],[119.204113,29.937901],[119.197338,29.935119],[119.190968,29.936965],[119.18802,29.936689],[119.181127,29.941701],[119.180865,29.945144],[119.183242,29.949026],[119.190136,29.952042],[119.194462,29.953033],[119.205254,29.949192],[119.212076,29.946452],[119.217234,29.945529],[119.223509,29.946094],[119.226956,29.947787],[119.23114,29.951339],[119.236369,29.950968],[119.237819,29.946906],[119.240434,29.943588],[119.241171,29.940641],[119.24476,29.935491],[119.24747,29.934376],[119.25472,29.935188],[119.25762,29.936799],[119.259854,29.940572],[119.258214,29.943794],[119.258048,29.9463],[119.259403,29.951395],[119.259569,29.95547],[119.255433,29.962078],[119.253817,29.968025],[119.252961,29.975775],[119.255148,29.981212],[119.253769,29.983964],[119.247922,29.98852],[119.246472,29.992291],[119.248373,29.998718],[119.250346,29.999599],[119.256217,30.000108],[119.260876,30.002846],[119.263135,30.005007],[119.265274,30.005557],[119.268364,30.001897],[119.270456,30.001016],[119.274901,30.002736],[119.278514,30.005571],[119.282603,30.009933],[119.290494,30.013744],[119.29444,30.012726],[119.296532,30.011103],[119.299384,30.007222],[119.29734,30.003342],[119.297958,30.001223],[119.30547,29.994204],[119.309487,29.993805],[119.314098,29.997493],[119.318543,29.996034],[119.321752,29.999805],[119.334374,30.007814],[119.338915,30.007195],[119.345071,30.004264],[119.358287,30.002268],[119.36858,29.998828],[119.381582,29.991438],[119.386978,29.989428],[119.38926,29.993186],[119.397176,29.995608],[119.405353,29.997245],[119.412817,29.99525],[119.420542,29.991837],[119.425058,29.991589],[119.426485,29.994741],[119.426603,30.000548],[119.433568,30.013166],[119.432308,30.015423],[119.430335,30.024683],[119.431096,30.029773],[119.430763,30.032813],[119.431476,30.037559],[119.433117,30.040407],[119.433497,30.044588],[119.430502,30.050021],[119.430169,30.053116],[119.427673,30.057173],[119.420304,30.062083],[119.420399,30.063514],[119.42299,30.06537],[119.43257,30.067405],[119.434044,30.068877],[119.433164,30.071531],[119.430597,30.074542],[119.429741,30.079314],[119.431785,30.082559],[119.43623,30.086038],[119.440081,30.087193]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":330127,\"name\":\"淳安县\",\"center\":[119.044276,29.604177],\"centroid\":[118.889354,29.608818],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":330100},\"subFeatureIndex\":11,\"acroutes\":[100000,330000,330100]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[118.897404,30.01673],[118.898355,30.015547],[118.90501,30.012836],[118.909313,30.01391],[118.913211,30.012382],[118.917086,30.013056],[118.923789,30.009795],[118.927973,30.011584],[118.932109,30.008158],[118.932703,30.009575],[118.93634,30.010951],[118.940286,30.010249],[118.949199,30.016813],[118.95412,30.018766],[118.956093,30.021449],[118.96263,30.023444],[118.966457,30.022137],[118.969381,30.023458],[118.970664,30.026375],[118.975894,30.027943],[118.979721,30.032442],[118.982454,30.034643],[118.9864,30.031424],[118.987113,30.027283],[118.9864,30.025329],[118.988326,30.017996],[118.999355,30.021614],[119.004751,30.024311],[119.016161,30.032662],[119.021247,30.032744],[119.026952,30.035],[119.030138,30.035083],[119.032015,30.032662],[119.031683,30.031066],[119.024243,30.022454],[119.025122,30.021078],[119.031112,30.01845],[119.034963,30.013373],[119.039883,30.01058],[119.046824,30.011158],[119.051911,30.007098],[119.054051,30.008282],[119.058805,30.009217],[119.064414,30.008364],[119.077013,30.008763],[119.081458,30.009933],[119.085332,30.012754],[119.089896,30.013854],[119.097764,30.012616],[119.107986,30.011873],[119.11205,30.010965],[119.114546,30.009506],[119.11312,30.001498],[119.110196,29.997768],[119.113334,29.993447],[119.115901,29.98691],[119.12037,29.978872],[119.12182,29.978652],[119.132089,29.981721],[119.135512,29.980909],[119.142001,29.975637],[119.14811,29.974687],[119.14956,29.973366],[119.14937,29.970737],[119.153553,29.969291],[119.158616,29.970227],[119.161588,29.966318],[119.169741,29.964749],[119.173734,29.962766],[119.178251,29.964859],[119.184431,29.965588],[119.19363,29.963744],[119.197006,29.962436],[119.204279,29.961624],[119.208534,29.957989],[119.210673,29.958127],[119.217662,29.956282],[119.224769,29.959476],[119.228121,29.959614],[119.233184,29.957618],[119.235537,29.955332],[119.236369,29.950968],[119.23114,29.951339],[119.226956,29.947787],[119.223509,29.946094],[119.217234,29.945529],[119.212076,29.946452],[119.205254,29.949192],[119.194462,29.953033],[119.190136,29.952042],[119.183242,29.949026],[119.180865,29.945144],[119.181127,29.941701],[119.18802,29.936689],[119.190968,29.936965],[119.197338,29.935119],[119.204113,29.937901],[119.208106,29.93629],[119.21141,29.935932],[119.216925,29.936662],[119.220277,29.936083],[119.222036,29.932916],[119.218328,29.927559],[119.218613,29.922298],[119.221703,29.917905],[119.227717,29.91617],[119.226766,29.912451],[119.228644,29.910605],[119.227669,29.902588],[119.225934,29.900302],[119.222368,29.897561],[119.219088,29.896541],[119.213692,29.896155],[119.207726,29.897271],[119.205705,29.896582],[119.198669,29.889612],[119.194581,29.884115],[119.191348,29.878741],[119.191419,29.873189],[119.188329,29.86776],[119.185382,29.865706],[119.182482,29.860497],[119.182933,29.852243],[119.189946,29.846495],[119.193939,29.83868],[119.196221,29.837123],[119.204232,29.833718],[119.213478,29.836213],[119.219017,29.839645],[119.222036,29.839177],[119.225506,29.834283],[119.233564,29.831568],[119.239079,29.831568],[119.241718,29.828397],[119.247209,29.824317],[119.251297,29.822235],[119.255409,29.821808],[119.257739,29.823503],[119.26594,29.833043],[119.267675,29.833759],[119.272215,29.83267],[119.274402,29.830175],[119.273903,29.828135],[119.27502,29.818527],[119.278823,29.813329],[119.279417,29.807938],[119.278609,29.804739],[119.272334,29.799624],[119.270765,29.795404],[119.273118,29.791612],[119.28246,29.786151],[119.286002,29.781793],[119.294369,29.775379],[119.294892,29.771766],[119.293989,29.768373],[119.294369,29.764028],[119.293299,29.760607],[119.292016,29.746218],[119.290233,29.740575],[119.28807,29.737954],[119.286881,29.730917],[119.287547,29.728198],[119.291184,29.725356],[119.298529,29.724831],[119.302451,29.725715],[119.308893,29.724721],[119.314431,29.724983],[119.31707,29.723617],[119.316547,29.719808],[119.31745,29.717173],[119.32218,29.716248],[119.327933,29.714316],[119.334184,29.714992],[119.341434,29.717366],[119.344168,29.717435],[119.34828,29.715116],[119.345642,29.711224],[119.336942,29.702336],[119.33504,29.701715],[119.332924,29.702791],[119.330619,29.702115],[119.329763,29.699769],[119.323297,29.693171],[119.321657,29.688422],[119.320588,29.6792],[119.31852,29.676964],[119.315548,29.670309],[119.314621,29.669453],[119.309035,29.668017],[119.30673,29.661776],[119.306706,29.654154],[119.305517,29.651392],[119.303259,29.649735],[119.299194,29.649113],[119.293085,29.65066],[119.286572,29.647401],[119.277777,29.640758],[119.276969,29.63812],[119.274853,29.636228],[119.267508,29.633093],[119.263824,29.630745],[119.257382,29.628866],[119.254292,29.626629],[119.252913,29.623314],[119.251654,29.61747],[119.248849,29.614887],[119.251249,29.610826],[119.248231,29.605617],[119.246971,29.599483],[119.247304,29.59759],[119.243025,29.590087],[119.234967,29.582086],[119.237582,29.581202],[119.241955,29.577706],[119.243072,29.575246],[119.243667,29.56951],[119.24602,29.567893],[119.254078,29.566152],[119.255837,29.564784],[119.264371,29.564825],[119.274996,29.569856],[119.278229,29.572896],[119.282626,29.572896],[119.284457,29.571625],[119.285954,29.568474],[119.282531,29.565544],[119.279441,29.56148],[119.274449,29.560969],[119.268222,29.561895],[119.26613,29.559324],[119.267675,29.548832],[119.265702,29.546704],[119.249562,29.535851],[119.241575,29.533045],[119.230569,29.523961],[119.2295,29.522246],[119.230997,29.51955],[119.2295,29.517877],[119.226552,29.516964],[119.223795,29.519965],[119.216878,29.524279],[119.215499,29.526464],[119.210388,29.529409],[119.206276,29.529063],[119.202092,29.527252],[119.199145,29.524846],[119.199929,29.52226],[119.202401,29.51991],[119.204042,29.516632],[119.20542,29.510382],[119.206656,29.508142],[119.205919,29.504989],[119.201546,29.501739],[119.198646,29.495211],[119.193559,29.49149],[119.191705,29.483703],[119.192941,29.470796],[119.192608,29.465581],[119.190897,29.462606],[119.185929,29.460434],[119.179083,29.453931],[119.172023,29.454927],[119.167316,29.453668],[119.159139,29.452202],[119.156192,29.450721],[119.146303,29.447829],[119.141335,29.447373],[119.138459,29.449393],[119.132255,29.448549],[119.126883,29.450334],[119.122248,29.445975],[119.11728,29.445588],[119.114784,29.44639],[119.110719,29.443982],[119.106583,29.440025],[119.101948,29.436468],[119.099595,29.431085],[119.102399,29.426213],[119.102281,29.423002],[119.098881,29.417673],[119.096504,29.416358],[119.083597,29.414116],[119.078154,29.414462],[119.070428,29.413825],[119.067196,29.412552],[119.061633,29.408122],[119.059328,29.405603],[119.057878,29.402045],[119.057236,29.398086],[119.055405,29.395497],[119.052767,29.394459],[119.050865,29.391482],[119.04806,29.389987],[119.044637,29.386595],[119.039717,29.385889],[119.034725,29.382787],[119.030518,29.376404],[119.016874,29.372],[119.01124,29.368428],[119.007556,29.367444],[119.003206,29.368289],[118.99453,29.368372],[118.990607,29.365436],[118.98621,29.360146],[118.984308,29.358872],[118.98148,29.359218],[118.976036,29.364813],[118.972209,29.364689],[118.967431,29.362431],[118.962368,29.363899],[118.959611,29.362985],[118.958375,29.360922],[118.9574,29.355756],[118.95576,29.353637],[118.946704,29.349759],[118.94214,29.348374],[118.936102,29.345673],[118.92909,29.341808],[118.923195,29.342196],[118.919391,29.341614],[118.91314,29.336627],[118.908219,29.336156],[118.900446,29.332652],[118.893054,29.3288],[118.890629,29.324049],[118.886327,29.322372],[118.87834,29.326556],[118.873206,29.324492],[118.869545,29.322317],[118.863222,29.317495],[118.860679,29.314974],[118.857161,29.309182],[118.855734,29.303335],[118.849412,29.298346],[118.842684,29.297487],[118.838786,29.293191],[118.835078,29.290488],[118.828755,29.287453],[118.828636,29.285042],[118.826544,29.280288],[118.824476,29.279484],[118.819699,29.280343],[118.816894,29.281716],[118.812377,29.280801],[118.809525,29.278278],[118.80073,29.272942],[118.793622,29.267952],[118.786373,29.266732],[118.78478,29.259108],[118.781832,29.258068],[118.778267,29.252564],[118.77501,29.251011],[118.768188,29.251912],[118.766382,29.251164],[118.763886,29.248294],[118.762412,29.240322],[118.766691,29.235621],[118.767261,29.234137],[118.766239,29.229256],[118.767,29.223058],[118.765431,29.220589],[118.759298,29.218065],[118.757349,29.215985],[118.753023,29.213863],[118.743752,29.213655],[118.734173,29.207427],[118.73258,29.205416],[118.731701,29.201519],[118.72949,29.199674],[118.723333,29.198911],[118.718651,29.192807],[118.715442,29.189867],[118.708834,29.188757],[118.70137,29.192169],[118.693882,29.196955],[118.688748,29.20095],[118.684612,29.202531],[118.676577,29.200659],[118.670159,29.200506],[118.655374,29.196886],[118.651904,29.196414],[118.638307,29.192169],[118.628894,29.19235],[118.62685,29.195665],[118.628205,29.199063],[118.631984,29.202004],[118.633672,29.205624],[118.632317,29.214168],[118.631841,29.219618],[118.628109,29.220229],[118.624377,29.218883],[118.620123,29.219272],[118.618863,29.220714],[118.616486,29.226316],[118.613847,29.229464],[118.613063,29.231919],[118.607786,29.238228],[118.607596,29.239711],[118.614632,29.246325],[118.615464,29.250762],[118.611423,29.25768],[118.610091,29.262324],[118.606669,29.267134],[118.606669,29.268492],[118.609854,29.273108],[118.609497,29.277003],[118.610614,29.27947],[118.615511,29.278971],[118.619196,29.276809],[118.621145,29.278084],[118.623997,29.272346],[118.630582,29.265207],[118.634908,29.261852],[118.636928,29.263627],[118.636382,29.267078],[118.634147,29.27297],[118.629916,29.279886],[118.62452,29.284238],[118.619124,29.292928],[118.614394,29.296586],[118.617223,29.303127],[118.6138,29.307311],[118.604814,29.314614],[118.603483,29.316442],[118.60384,29.323564],[118.60094,29.327789],[118.596043,29.330823],[118.594593,29.330698],[118.589031,29.327872],[118.587533,29.328496],[118.587129,29.332056],[118.584253,29.333663],[118.579856,29.332153],[118.575149,29.336558],[118.571679,29.338317],[118.562266,29.338539],[118.551498,29.335713],[118.54237,29.33696],[118.541039,29.342528],[118.528559,29.345257],[118.523401,29.345368],[118.519099,29.344384],[118.518885,29.346448],[118.523995,29.355229],[118.524352,29.36142],[118.517482,29.363484],[118.509994,29.361642],[118.50574,29.359274],[118.502887,29.360991],[118.498989,29.361891],[118.494163,29.362057],[118.491596,29.365215],[118.488839,29.367237],[118.479164,29.366544],[118.473341,29.362764],[118.470132,29.360091],[118.464664,29.360312],[118.45625,29.365893],[118.448738,29.375241],[118.445957,29.37639],[118.441251,29.375919],[118.437685,29.377705],[118.430102,29.382455],[118.423637,29.387356],[118.422733,29.390471],[118.425847,29.395179],[118.4258,29.397643],[118.422139,29.400232],[118.418122,29.40163],[118.415293,29.403762],[118.409684,29.404495],[118.407021,29.405575],[118.405405,29.408136],[118.410825,29.413479],[118.413297,29.41813],[118.413154,29.420552],[118.40859,29.42339],[118.40203,29.425175],[118.395231,29.423473],[118.390263,29.423971],[118.386698,29.427652],[118.384154,29.433258],[118.378093,29.43388],[118.375169,29.435195],[118.372935,29.437824],[118.366374,29.450154],[118.363426,29.451067],[118.357341,29.451565],[118.35254,29.452797],[118.350686,29.454775],[118.350186,29.458746],[118.345741,29.465138],[118.345028,29.468251],[118.344957,29.475707],[118.347619,29.473978],[118.353609,29.47503],[118.35872,29.477063],[118.360479,29.479097],[118.362951,29.484159],[118.365708,29.48629],[118.371104,29.492154],[118.373505,29.496483],[118.379804,29.502555],[118.381444,29.504933],[118.383013,29.510133],[118.393044,29.507298],[118.402814,29.507464],[118.407473,29.508059],[118.41256,29.509677],[118.414984,29.509746],[118.420238,29.508031],[118.425491,29.504754],[118.430578,29.50373],[118.436544,29.505749],[118.439872,29.510036],[118.443105,29.50893],[118.448976,29.513397],[118.45045,29.512733],[118.45827,29.506358],[118.459815,29.50557],[118.464213,29.505888],[118.470393,29.507464],[118.479022,29.510935],[118.481969,29.512996],[118.489433,29.51684],[118.495162,29.518361],[118.496065,29.520642],[118.495162,29.525703],[118.4949,29.5314],[118.495875,29.533321],[118.497563,29.540331],[118.497848,29.544008],[118.494948,29.550602],[118.4949,29.553712],[118.498371,29.56137],[118.49868,29.567672],[118.499678,29.573615],[118.50177,29.576379],[118.50574,29.57725],[118.515462,29.583316],[118.521547,29.585956],[118.532172,29.588954],[118.535239,29.590612],[118.540896,29.599331],[118.542037,29.603821],[118.54855,29.611212],[118.549905,29.613395],[118.553447,29.612373],[118.555087,29.613409],[118.559746,29.620689],[118.567519,29.627292],[118.568065,29.633438],[118.569302,29.635496],[118.573865,29.638383],[118.584015,29.640523],[118.595544,29.644059],[118.602057,29.643672],[118.614228,29.650425],[118.620004,29.654112],[118.633482,29.648782],[118.636928,29.644832],[118.640945,29.641932],[118.642918,29.641656],[118.647316,29.643382],[118.653401,29.648685],[118.656872,29.654444],[118.659629,29.65646],[118.666712,29.663309],[118.672275,29.667009],[118.673915,29.669094],[118.674153,29.674009],[118.67508,29.675625],[118.681498,29.67978],[118.682353,29.68105],[118.682924,29.688326],[118.685467,29.69052],[118.691648,29.69393],[118.692884,29.699148],[118.700823,29.706463],[118.718698,29.709182],[118.72407,29.715958],[118.724641,29.72261],[118.726947,29.725825],[118.733626,29.730089],[118.737406,29.735029],[118.739711,29.736809],[118.744703,29.738768],[118.745559,29.740327],[118.74651,29.746287],[118.748673,29.750426],[118.749029,29.761145],[118.745535,29.76738],[118.747365,29.772428],[118.746628,29.775352],[118.744299,29.779641],[118.738356,29.784799],[118.736526,29.788454],[118.738618,29.807952],[118.739925,29.813288],[118.742278,29.816321],[118.74601,29.818168],[118.754972,29.816982],[118.759441,29.817162],[118.765906,29.82309],[118.765669,29.824524],[118.76013,29.828921],[118.753855,29.829541],[118.750955,29.831609],[118.75471,29.839232],[118.754164,29.843697],[118.755614,29.84542],[118.766952,29.848949],[118.770066,29.846826],[118.774178,29.845324],[118.778742,29.841906],[118.781975,29.842595],[118.786634,29.845227],[118.788916,29.851016],[118.798091,29.858816],[118.802608,29.860663],[118.807718,29.867649],[118.812972,29.87086],[118.81649,29.873946],[118.819057,29.874815],[118.823383,29.87881],[118.830134,29.882489],[118.84133,29.891306],[118.843968,29.89515],[118.845537,29.899103],[118.844848,29.905288],[118.844895,29.915261],[118.843112,29.920591],[118.8419,29.928151],[118.840141,29.929859],[118.838715,29.9345],[118.838976,29.938273],[118.841163,29.939925],[118.848294,29.941261],[118.857921,29.938011],[118.863911,29.936978],[118.867239,29.939484],[118.868951,29.943904],[118.87197,29.946892],[118.876248,29.945736],[118.880337,29.942982],[118.883688,29.939429],[118.887634,29.939223],[118.893553,29.937598],[118.89467,29.938066],[118.894005,29.943106],[118.892365,29.9482],[118.893006,29.957081],[118.891533,29.959889],[118.893173,29.969291],[118.896453,29.975761],[118.898093,29.977495],[118.899472,29.981446],[118.897214,29.987116],[118.893197,29.990956],[118.892079,29.994796],[118.893981,29.997411],[118.895098,30.001195],[118.894028,30.006713],[118.889845,30.010593],[118.890344,30.012024],[118.897404,30.01673]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":330182,\"name\":\"建德市\",\"center\":[119.279089,29.472284],\"centroid\":[119.372981,29.48107],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":330100},\"subFeatureIndex\":12,\"acroutes\":[100000,330000,330100]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[119.765307,29.596402],[119.766829,29.589341],[119.765236,29.587572],[119.765616,29.584712],[119.768421,29.582459],[119.769182,29.579544],[119.766187,29.570906],[119.761647,29.566525],[119.764832,29.563111],[119.765521,29.560015],[119.76419,29.557334],[119.758842,29.556034],[119.756417,29.553726],[119.750665,29.550726],[119.747266,29.550588],[119.741109,29.551901],[119.730412,29.548197],[119.724803,29.545128],[119.72264,29.542764],[119.724755,29.538188],[119.731862,29.532962],[119.734311,29.528385],[119.744033,29.520781],[119.745602,29.518389],[119.744936,29.516425],[119.740348,29.513341],[119.735404,29.510935],[119.726894,29.511557],[119.727536,29.509442],[119.72554,29.506925],[119.718836,29.505293],[119.717862,29.502652],[119.718337,29.496691],[119.719549,29.491158],[119.718741,29.48853],[119.716673,29.486331],[119.712632,29.484132],[119.706785,29.472374],[119.708449,29.467725],[119.707118,29.464225],[119.709518,29.458885],[119.71344,29.456187],[119.715817,29.449005],[119.71344,29.445006],[119.710659,29.442266],[119.709518,29.439111],[119.710636,29.436122],[119.709637,29.434185],[119.70726,29.433216],[119.700509,29.433008],[119.697372,29.434116],[119.693663,29.438765],[119.691168,29.438779],[119.689836,29.433327],[119.690312,29.42685],[119.688909,29.421756],[119.683442,29.418628],[119.678973,29.41777],[119.676311,29.41921],[119.673387,29.425023],[119.67006,29.425424],[119.664402,29.424068],[119.6601,29.426891],[119.655488,29.425922],[119.649094,29.428344],[119.646741,29.43323],[119.644459,29.434102],[119.642486,29.432953],[119.638659,29.428275],[119.633596,29.423348],[119.626631,29.42022],[119.62492,29.41777],[119.625633,29.415293],[119.625538,29.410476],[119.617361,29.399733],[119.612155,29.394763],[119.607068,29.393877],[119.605547,29.392742],[119.606236,29.388076],[119.613866,29.383244],[119.617598,29.38035],[119.618573,29.378467],[119.619643,29.372956],[119.619381,29.371059],[119.616291,29.368261],[119.614057,29.368275],[119.608518,29.370242],[119.604596,29.369632],[119.597988,29.372928],[119.592925,29.377705],[119.589454,29.378702],[119.582085,29.379132],[119.578425,29.378121],[119.574598,29.372762],[119.565898,29.371183],[119.560573,29.372083],[119.55677,29.371585],[119.551469,29.36732],[119.545408,29.367361],[119.540915,29.369799],[119.538847,29.371931],[119.536042,29.37315],[119.529838,29.370546],[119.523872,29.36599],[119.525773,29.36347],[119.526605,29.360021],[119.52506,29.35516],[119.522707,29.350022],[119.512082,29.336724],[119.510418,29.333469],[119.501979,29.335879],[119.50003,29.335713],[119.492329,29.331059],[119.485364,29.332541],[119.480206,29.33297],[119.477543,29.335048],[119.47771,29.341586],[119.476022,29.345216],[119.471482,29.349025],[119.469652,29.349662],[119.464565,29.349177],[119.461427,29.350908],[119.459834,29.356656],[119.454819,29.365284],[119.457576,29.370366],[119.453369,29.378827],[119.451824,29.385598],[119.453607,29.389253],[119.451348,29.397283],[119.448876,29.400688],[119.443148,29.404565],[119.440676,29.408745],[119.441674,29.413036],[119.438798,29.415749],[119.439416,29.421424],[119.438964,29.423597],[119.437134,29.424123],[119.427768,29.422158],[119.428553,29.419057],[119.432332,29.415154],[119.426746,29.405548],[119.421255,29.404758],[119.415883,29.403],[119.410725,29.402557],[119.409204,29.400716],[119.405614,29.399927],[119.404758,29.400688],[119.404901,29.405326],[119.403974,29.407223],[119.399933,29.411237],[119.393515,29.411251],[119.391709,29.416884],[119.389783,29.425826],[119.388547,29.429715],[119.382129,29.43186],[119.378112,29.429798],[119.375283,29.424538],[119.372455,29.421037],[119.370814,29.417715],[119.368319,29.415708],[119.362162,29.416746],[119.360237,29.416289],[119.355578,29.410794],[119.353201,29.409866],[119.346378,29.408731],[119.343906,29.409008],[119.338392,29.411707],[119.334897,29.40815],[119.334042,29.405354],[119.331094,29.400356],[119.32779,29.396923],[119.328646,29.39342],[119.333875,29.390734],[119.336038,29.385847],[119.339105,29.384296],[119.340151,29.382358],[119.339295,29.379145],[119.340198,29.377304],[119.336466,29.372499],[119.335016,29.366987],[119.336704,29.363373],[119.332806,29.353748],[119.334303,29.348983],[119.340008,29.348581],[119.34557,29.342265],[119.348447,29.336253],[119.348233,29.333441],[119.344287,29.324395],[119.347092,29.322719],[119.348779,29.319504],[119.347282,29.317163],[119.340531,29.315389],[119.324201,29.30799],[119.323131,29.305011],[119.328646,29.299274],[119.329026,29.294383],[119.328337,29.292789],[119.32577,29.292248],[119.324177,29.295408],[119.322632,29.29617],[119.322608,29.290488],[119.323345,29.288146],[119.322727,29.284931],[119.318306,29.2799],[119.312672,29.278639],[119.305066,29.279332],[119.298648,29.279276],[119.292562,29.281799],[119.288117,29.280995],[119.286026,29.279332],[119.286216,29.275257],[119.288094,29.268839],[119.287167,29.267453],[119.282317,29.264944],[119.282056,29.26127],[119.278657,29.260646],[119.275781,29.258636],[119.273475,29.25377],[119.270646,29.251649],[119.260924,29.247809],[119.257644,29.247989],[119.249205,29.250193],[119.244237,29.250997],[119.238746,29.250152],[119.237772,29.25072],[119.239293,29.258913],[119.236298,29.26346],[119.234016,29.270682],[119.231544,29.273274],[119.228786,29.27437],[119.227099,29.276837],[119.229,29.282575],[119.228739,29.284183],[119.225031,29.285153],[119.219397,29.2827],[119.214833,29.283753],[119.208178,29.284404],[119.205111,29.288257],[119.200286,29.290391],[119.198836,29.286026],[119.200737,29.280524],[119.200999,29.275811],[119.204255,29.274771],[119.203328,29.272318],[119.200405,29.272152],[119.19779,29.26992],[119.192299,29.263571],[119.191515,29.261741],[119.192228,29.258456],[119.195484,29.256446],[119.198622,29.257985],[119.200904,29.257472],[119.204303,29.252356],[119.210293,29.248724],[119.214786,29.246935],[119.212195,29.246076],[119.211268,29.244426],[119.211648,29.235413],[119.210269,29.230657],[119.213645,29.225207],[119.211838,29.222905],[119.209033,29.222059],[119.204469,29.223557],[119.203233,29.228383],[119.201736,29.229367],[119.196102,29.227883],[119.194153,29.22927],[119.190825,29.22848],[119.189518,29.227093],[119.189779,29.223709],[119.193963,29.220145],[119.194938,29.216304],[119.189518,29.205194],[119.181032,29.206304],[119.177704,29.207233],[119.175826,29.211893],[119.168053,29.219022],[119.165652,29.219202],[119.160257,29.220991],[119.156453,29.223806],[119.15372,29.227024],[119.151771,29.227897],[119.145709,29.222974],[119.141525,29.223377],[119.138126,29.220242],[119.131542,29.221116],[119.130163,29.2226],[119.129117,29.227079],[119.132588,29.235441],[119.126455,29.237119],[119.123508,29.236716],[119.106393,29.227509],[119.10045,29.228313],[119.094222,29.228258],[119.091893,29.230546],[119.08519,29.230601],[119.082908,29.228826],[119.081981,29.22658],[119.07775,29.224222],[119.075658,29.223987],[119.068384,29.226455],[119.062941,29.226275],[119.055144,29.222239],[119.050033,29.221546],[119.045588,29.221823],[119.037126,29.217205],[119.030589,29.215069],[119.01307,29.212379],[119.003253,29.207691],[119.001851,29.208551],[118.998903,29.216345],[118.995742,29.21708],[118.993127,29.219244],[118.991867,29.221837],[118.987137,29.226053],[118.985711,29.229728],[118.98583,29.235344],[118.984831,29.239476],[118.988254,29.243552],[118.982597,29.249736],[118.981408,29.254325],[118.979245,29.258955],[118.977344,29.258775],[118.970189,29.264944],[118.966837,29.269352],[118.963295,29.267674],[118.959492,29.271403],[118.958565,29.273801],[118.954881,29.277918],[118.952337,29.278763],[118.949651,29.281743],[118.949176,29.283919],[118.951268,29.286275],[118.961893,29.290211],[118.963533,29.291999],[118.962083,29.29617],[118.952622,29.298554],[118.948035,29.301117],[118.944113,29.306286],[118.927069,29.310374],[118.923456,29.31478],[118.916753,29.31816],[118.911262,29.324409],[118.908362,29.325143],[118.905414,29.327374],[118.903917,29.330186],[118.900446,29.332652],[118.908219,29.336156],[118.91314,29.336627],[118.919391,29.341614],[118.923195,29.342196],[118.92909,29.341808],[118.936102,29.345673],[118.94214,29.348374],[118.946704,29.349759],[118.95576,29.353637],[118.9574,29.355756],[118.958375,29.360922],[118.959611,29.362985],[118.962368,29.363899],[118.967431,29.362431],[118.972209,29.364689],[118.976036,29.364813],[118.98148,29.359218],[118.984308,29.358872],[118.98621,29.360146],[118.990607,29.365436],[118.99453,29.368372],[119.003206,29.368289],[119.007556,29.367444],[119.01124,29.368428],[119.016874,29.372],[119.030518,29.376404],[119.034725,29.382787],[119.039717,29.385889],[119.044637,29.386595],[119.04806,29.389987],[119.050865,29.391482],[119.052767,29.394459],[119.055405,29.395497],[119.057236,29.398086],[119.057878,29.402045],[119.059328,29.405603],[119.061633,29.408122],[119.067196,29.412552],[119.070428,29.413825],[119.078154,29.414462],[119.083597,29.414116],[119.096504,29.416358],[119.098881,29.417673],[119.102281,29.423002],[119.102399,29.426213],[119.099595,29.431085],[119.101948,29.436468],[119.106583,29.440025],[119.110719,29.443982],[119.114784,29.44639],[119.11728,29.445588],[119.122248,29.445975],[119.126883,29.450334],[119.132255,29.448549],[119.138459,29.449393],[119.141335,29.447373],[119.146303,29.447829],[119.156192,29.450721],[119.159139,29.452202],[119.167316,29.453668],[119.172023,29.454927],[119.179083,29.453931],[119.185929,29.460434],[119.190897,29.462606],[119.192608,29.465581],[119.192941,29.470796],[119.191705,29.483703],[119.193559,29.49149],[119.198646,29.495211],[119.201546,29.501739],[119.205919,29.504989],[119.206656,29.508142],[119.20542,29.510382],[119.204042,29.516632],[119.202401,29.51991],[119.199929,29.52226],[119.199145,29.524846],[119.202092,29.527252],[119.206276,29.529063],[119.210388,29.529409],[119.215499,29.526464],[119.216878,29.524279],[119.223795,29.519965],[119.226552,29.516964],[119.2295,29.517877],[119.230997,29.51955],[119.2295,29.522246],[119.230569,29.523961],[119.241575,29.533045],[119.249562,29.535851],[119.265702,29.546704],[119.267675,29.548832],[119.26613,29.559324],[119.268222,29.561895],[119.274449,29.560969],[119.279441,29.56148],[119.282531,29.565544],[119.285954,29.568474],[119.284457,29.571625],[119.282626,29.572896],[119.278229,29.572896],[119.274996,29.569856],[119.264371,29.564825],[119.255837,29.564784],[119.254078,29.566152],[119.24602,29.567893],[119.243667,29.56951],[119.243072,29.575246],[119.241955,29.577706],[119.237582,29.581202],[119.234967,29.582086],[119.243025,29.590087],[119.247304,29.59759],[119.246971,29.599483],[119.248231,29.605617],[119.251249,29.610826],[119.248849,29.614887],[119.251654,29.61747],[119.252913,29.623314],[119.254292,29.626629],[119.257382,29.628866],[119.263824,29.630745],[119.267508,29.633093],[119.274853,29.636228],[119.276969,29.63812],[119.277777,29.640758],[119.286572,29.647401],[119.293085,29.65066],[119.299194,29.649113],[119.303259,29.649735],[119.305517,29.651392],[119.306706,29.654154],[119.30673,29.661776],[119.309035,29.668017],[119.314621,29.669453],[119.315548,29.670309],[119.31852,29.676964],[119.320588,29.6792],[119.321657,29.688422],[119.323297,29.693171],[119.329763,29.699769],[119.330619,29.702115],[119.332924,29.702791],[119.33504,29.701715],[119.336942,29.702336],[119.345642,29.711224],[119.34828,29.715116],[119.350015,29.719643],[119.352915,29.722334],[119.354508,29.725825],[119.354056,29.730185],[119.355768,29.73231],[119.358074,29.737968],[119.360332,29.741638],[119.36423,29.746397],[119.365823,29.750398],[119.370624,29.752688],[119.373857,29.754978],[119.373405,29.758758],[119.374142,29.760662],[119.380489,29.766993],[119.383579,29.770952],[119.388357,29.769628],[119.390924,29.764979],[119.391495,29.7624],[119.394323,29.759807],[119.392374,29.750357],[119.393563,29.748301],[119.398792,29.744328],[119.407088,29.7431],[119.411343,29.745266],[119.415431,29.750233],[119.417547,29.757048],[119.42261,29.758469],[119.425439,29.75582],[119.425938,29.753171],[119.434519,29.748384],[119.439867,29.742231],[119.44203,29.741651],[119.447094,29.743183],[119.451206,29.741555],[119.454938,29.741983],[119.458955,29.744935],[119.465753,29.741693],[119.472932,29.739361],[119.476379,29.733373],[119.478019,29.732338],[119.484556,29.731262],[119.492376,29.722334],[119.493802,29.721285],[119.50022,29.722679],[119.504879,29.722872],[119.50835,29.725273],[119.520187,29.728792],[119.522969,29.731013],[119.528269,29.733897],[119.531954,29.733925],[119.537064,29.736933],[119.540511,29.737319],[119.543696,29.746122],[119.544695,29.747432],[119.549472,29.749916],[119.560431,29.752316],[119.569131,29.751695],[119.571698,29.749847],[119.574099,29.745197],[119.577212,29.741569],[119.578306,29.738299],[119.581895,29.73111],[119.583726,29.729385],[119.59176,29.724818],[119.593448,29.723203],[119.596229,29.717352],[119.601815,29.716055],[119.603978,29.713419],[119.604144,29.708837],[119.602528,29.700859],[119.610895,29.695227],[119.610776,29.688229],[119.614128,29.684999],[119.612749,29.673029],[119.613581,29.669757],[119.616909,29.664648],[119.617479,29.662757],[119.616148,29.656805],[119.621972,29.65472],[119.62946,29.656239],[119.634689,29.653243],[119.636733,29.652939],[119.643579,29.653961],[119.64705,29.65229],[119.651043,29.651641],[119.658792,29.652013],[119.665305,29.653836],[119.667968,29.657316],[119.670844,29.657137],[119.674505,29.653809],[119.672104,29.648658],[119.670226,29.640979],[119.673031,29.636905],[119.676192,29.636325],[119.678593,29.634018],[119.679663,29.62685],[119.688363,29.62109],[119.693307,29.620965],[119.694876,29.619985],[119.695375,29.616034],[119.692998,29.602633],[119.695256,29.596719],[119.698322,29.593721],[119.701318,29.58959],[119.704075,29.587641],[119.708282,29.589673],[119.709376,29.595863],[119.715247,29.601804],[119.717315,29.608781],[119.718575,29.610439],[119.723899,29.610535],[119.728368,29.613506],[119.731126,29.613547],[119.742393,29.609195],[119.746434,29.606419],[119.750142,29.602978],[119.757843,29.598447],[119.762312,29.597811],[119.765307,29.596402]]]]}}]}', 'admin', '2020-12-07 18:37:35', NULL, '2020-12-07 18:37:35', '0', NULL); +INSERT INTO `jimu_report_map` VALUES ('1335907956524433409', '上海', 'shanghai', '{\"type\":\"FeatureCollection\",\"features\":[{\"type\":\"Feature\",\"properties\":{\"adcode\":310101,\"name\":\"黄浦区\",\"center\":[121.490317,31.222771],\"centroid\":[121.483572,31.215946],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":310000},\"subFeatureIndex\":0,\"acroutes\":[100000,310000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[121.475987,31.187885],[121.474944,31.189886],[121.470356,31.191431],[121.469605,31.196404],[121.46745,31.203065],[121.466449,31.204395],[121.462264,31.203173],[121.461555,31.210194],[121.460707,31.213488],[121.457689,31.220196],[121.456758,31.223898],[121.467464,31.223862],[121.467658,31.225634],[121.466129,31.234917],[121.462973,31.241396],[121.469563,31.239216],[121.474847,31.24142],[121.47892,31.240294],[121.482994,31.241923],[121.485969,31.244091],[121.487805,31.244186],[121.494826,31.24221],[121.493491,31.240163],[121.493491,31.23615],[121.495744,31.232977],[121.502014,31.228018],[121.506741,31.223119],[121.509397,31.218459],[121.509911,31.214506],[121.508368,31.210158],[121.501319,31.199747],[121.498066,31.195601],[121.494631,31.192857],[121.490752,31.191467],[121.475987,31.187885]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":310104,\"name\":\"徐汇区\",\"center\":[121.43752,31.179973],\"centroid\":[121.439404,31.162992],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":310000},\"subFeatureIndex\":1,\"acroutes\":[100000,310000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[121.412572,31.19112],[121.419719,31.190796],[121.422027,31.192294],[121.421638,31.19535],[121.423793,31.197314],[121.433025,31.20128],[121.437933,31.203976],[121.435235,31.21114],[121.43746,31.211535],[121.439462,31.214482],[121.44697,31.215812],[121.452184,31.217429],[121.457689,31.220196],[121.460707,31.213488],[121.461555,31.210194],[121.462264,31.203173],[121.466449,31.204395],[121.46745,31.203065],[121.469605,31.196404],[121.470356,31.191431],[121.474944,31.189886],[121.475987,31.187885],[121.468729,31.184122],[121.466254,31.18109],[121.464905,31.178022],[121.464905,31.17541],[121.468159,31.167092],[121.469369,31.162298],[121.468354,31.158091],[121.46574,31.155118],[121.460387,31.150276],[121.457453,31.146451],[121.457453,31.142232],[121.462431,31.134463],[121.468729,31.127868],[121.469674,31.124859],[121.469299,31.118731],[121.465211,31.1121],[121.463237,31.108586],[121.462862,31.101954],[121.455423,31.100755],[121.452629,31.101234],[121.451878,31.103849],[121.446275,31.105744],[121.447623,31.107423],[121.452364,31.108586],[121.450154,31.112819],[121.450807,31.115398],[121.446706,31.114282],[121.445788,31.114954],[121.441547,31.112568],[121.438002,31.1121],[121.435736,31.113539],[121.438836,31.119103],[121.43853,31.121729],[121.436445,31.129043],[121.421526,31.127137],[121.418398,31.131669],[121.41381,31.13728],[121.411293,31.14174],[121.404953,31.156689],[121.400977,31.155214],[121.401449,31.153776],[121.396931,31.152685],[121.395874,31.15585],[121.401867,31.157528],[121.404578,31.157588],[121.402645,31.162226],[121.394567,31.159601],[121.391508,31.168686],[121.394053,31.169489],[121.39269,31.173085],[121.395415,31.174595],[121.394442,31.177879],[121.398071,31.178226],[121.398349,31.179904],[121.400101,31.178813],[121.41146,31.182037],[121.415158,31.183391],[121.415256,31.187357],[121.41356,31.18683],[121.412572,31.19112]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":310105,\"name\":\"长宁区\",\"center\":[121.4222,31.218123],\"centroid\":[121.380949,31.20737],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":310000},\"subFeatureIndex\":2,\"acroutes\":[100000,310000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[121.439462,31.214482],[121.43746,31.211535],[121.435235,31.21114],[121.437933,31.203976],[121.433025,31.20128],[121.423793,31.197314],[121.421638,31.19535],[121.422027,31.192294],[121.419719,31.190796],[121.412572,31.19112],[121.391425,31.191911],[121.38001,31.190065],[121.365954,31.185572],[121.360253,31.185296],[121.358321,31.186015],[121.356958,31.182768],[121.353301,31.181629],[121.351424,31.183499],[121.341414,31.179436],[121.338341,31.180108],[121.331806,31.189622],[121.338049,31.192618],[121.33734,31.195817],[121.338925,31.196644],[121.338438,31.20666],[121.338508,31.212182],[121.339996,31.212278],[121.33937,31.216615],[121.342457,31.217789],[121.343096,31.223071],[121.345627,31.223526],[121.340997,31.224269],[121.341581,31.226293],[121.345362,31.227886],[121.345376,31.23039],[121.343513,31.234306],[121.338355,31.237528],[121.340872,31.239947],[121.345585,31.239887],[121.344612,31.243552],[121.346822,31.241037],[121.347281,31.243192],[121.348922,31.243863],[121.350131,31.241839],[121.348741,31.239372],[121.352856,31.238342],[121.354177,31.237121],[121.359071,31.229827],[121.362102,31.22597],[121.366065,31.226006],[121.366691,31.224065],[121.371404,31.222508],[121.373197,31.220089],[121.37691,31.220687],[121.388658,31.218639],[121.399712,31.218711],[121.400462,31.220807],[121.403799,31.22058],[121.408707,31.222364],[121.414157,31.223359],[121.415965,31.224473],[121.414853,31.228054],[121.415617,31.228581],[121.419941,31.225191],[121.423334,31.228114],[121.427519,31.229288],[121.427713,31.224221],[121.429034,31.223095],[121.434304,31.225886],[121.435416,31.225071],[121.436167,31.220675],[121.439462,31.214482]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":310106,\"name\":\"静安区\",\"center\":[121.448224,31.229003],\"centroid\":[121.450659,31.270821],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":310000},\"subFeatureIndex\":3,\"acroutes\":[100000,310000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[121.482994,31.241923],[121.47892,31.240294],[121.474847,31.24142],[121.469563,31.239216],[121.462973,31.241396],[121.466129,31.234917],[121.467658,31.225634],[121.467464,31.223862],[121.456758,31.223898],[121.457689,31.220196],[121.452184,31.217429],[121.44697,31.215812],[121.439462,31.214482],[121.436167,31.220675],[121.435416,31.225071],[121.434304,31.225886],[121.429034,31.223095],[121.427713,31.224221],[121.427519,31.229288],[121.427908,31.231144],[121.431009,31.235108],[121.435166,31.235252],[121.445774,31.241348],[121.449987,31.2433],[121.448318,31.245216],[121.450404,31.247743],[121.451461,31.251994],[121.44932,31.252928],[121.451044,31.256269],[121.442952,31.267117],[121.437098,31.269439],[121.432413,31.271942],[121.429841,31.274923],[121.425252,31.270661],[121.424571,31.27193],[121.424432,31.280238],[121.422833,31.28426],[121.423806,31.291011],[121.419691,31.291071],[121.418648,31.292256],[121.420039,31.296912],[121.42364,31.297259],[121.426935,31.298528],[121.426434,31.303207],[121.431287,31.303638],[121.432441,31.305912],[121.431676,31.309478],[121.432163,31.31168],[121.434623,31.312303],[121.432468,31.318669],[121.433595,31.32087],[121.436459,31.32087],[121.436765,31.319662],[121.44672,31.319817],[121.447887,31.317101],[121.4547,31.319243],[121.457133,31.321002],[121.465378,31.321397],[121.468145,31.32032],[121.468312,31.316036],[121.467672,31.306307],[121.463529,31.306008],[121.46453,31.297989],[121.462445,31.292747],[121.460081,31.289778],[121.461805,31.284691],[121.461457,31.278921],[121.462834,31.275389],[121.464627,31.274396],[121.469605,31.267799],[121.474124,31.263453],[121.480491,31.258568],[121.480589,31.255239],[121.479629,31.253383],[121.481673,31.250689],[121.479588,31.249815],[121.481228,31.247959],[121.482994,31.241923]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":310107,\"name\":\"普陀区\",\"center\":[121.392499,31.241701],\"centroid\":[121.392058,31.257885],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":310000},\"subFeatureIndex\":4,\"acroutes\":[100000,310000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[121.354177,31.237121],[121.356054,31.237803],[121.356068,31.240151],[121.360086,31.240498],[121.36067,31.238642],[121.363117,31.240091],[121.366718,31.246342],[121.368387,31.247384],[121.372349,31.243755],[121.3731,31.245683],[121.375686,31.244486],[121.377216,31.247719],[121.380886,31.257766],[121.377508,31.259478],[121.375158,31.25949],[121.374574,31.257059],[121.365884,31.257682],[121.366023,31.259358],[121.361783,31.259945],[121.358918,31.263609],[121.35985,31.266997],[121.362227,31.26756],[121.366996,31.266662],[121.367441,31.269631],[121.361268,31.27084],[121.358918,31.268793],[121.35732,31.271415],[121.344723,31.273917],[121.343541,31.271439],[121.338272,31.272839],[121.338883,31.275006],[121.336228,31.275461],[121.336061,31.280046],[121.335004,31.279711],[121.332738,31.286067],[121.328998,31.284595],[121.327316,31.285182],[121.326384,31.288928],[121.33353,31.291107],[121.332891,31.292998],[121.336506,31.294901],[121.338675,31.293225],[121.341011,31.293716],[121.340927,31.297439],[121.34685,31.297654],[121.346892,31.296349],[121.349659,31.297582],[121.348894,31.299246],[121.352954,31.301663],[121.354803,31.299808],[121.360309,31.302717],[121.363534,31.302741],[121.360295,31.294674],[121.358585,31.293465],[121.363785,31.292028],[121.363785,31.291334],[121.369666,31.28912],[121.370153,31.290329],[121.374838,31.289096],[121.376242,31.290592],[121.38154,31.289431],[121.381623,31.292711],[121.384765,31.294446],[121.388394,31.29526],[121.394762,31.294674],[121.393483,31.291274],[121.39789,31.29052],[121.399559,31.288904],[121.398446,31.287145],[121.400379,31.286115],[121.404453,31.286223],[121.400087,31.278071],[121.404564,31.276227],[121.406496,31.276862],[121.40544,31.273067],[121.41096,31.273175],[121.410598,31.270373],[121.41527,31.26914],[121.41577,31.265896],[121.419496,31.265237],[121.425252,31.270661],[121.429841,31.274923],[121.432413,31.271942],[121.437098,31.269439],[121.442952,31.267117],[121.451044,31.256269],[121.44932,31.252928],[121.451461,31.251994],[121.450404,31.247743],[121.448318,31.245216],[121.449987,31.2433],[121.445774,31.241348],[121.435166,31.235252],[121.431009,31.235108],[121.427908,31.231144],[121.427519,31.229288],[121.423334,31.228114],[121.419941,31.225191],[121.415617,31.228581],[121.414853,31.228054],[121.415965,31.224473],[121.414157,31.223359],[121.408707,31.222364],[121.403799,31.22058],[121.400462,31.220807],[121.399712,31.218711],[121.388658,31.218639],[121.37691,31.220687],[121.373197,31.220089],[121.371404,31.222508],[121.366691,31.224065],[121.366065,31.226006],[121.362102,31.22597],[121.359071,31.229827],[121.354177,31.237121]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":310109,\"name\":\"虹口区\",\"center\":[121.491832,31.26097],\"centroid\":[121.485443,31.276649],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":310000},\"subFeatureIndex\":5,\"acroutes\":[100000,310000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[121.485413,31.311573],[121.485664,31.303483],[121.490168,31.292603],[121.493644,31.293884],[121.500652,31.295488],[121.502709,31.289658],[121.498149,31.286259],[121.496049,31.282991],[121.496564,31.276407],[121.499915,31.275904],[121.506505,31.270589],[121.50631,31.266746],[121.508479,31.262639],[121.514569,31.256317],[121.517642,31.251862],[121.516001,31.251599],[121.516488,31.246953],[121.50688,31.246474],[121.500012,31.244989],[121.494826,31.24221],[121.487805,31.244186],[121.485969,31.244091],[121.482994,31.241923],[121.481228,31.247959],[121.479588,31.249815],[121.481673,31.250689],[121.479629,31.253383],[121.480589,31.255239],[121.480491,31.258568],[121.474124,31.263453],[121.469605,31.267799],[121.464627,31.274396],[121.462834,31.275389],[121.461457,31.278921],[121.461805,31.284691],[121.460081,31.289778],[121.462445,31.292747],[121.46453,31.297989],[121.463529,31.306008],[121.467672,31.306307],[121.468312,31.316036],[121.472956,31.315797],[121.479171,31.314696],[121.485372,31.314636],[121.485413,31.311573]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":310110,\"name\":\"杨浦区\",\"center\":[121.522797,31.270755],\"centroid\":[121.529302,31.29835],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":310000},\"subFeatureIndex\":6,\"acroutes\":[100000,310000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[121.516488,31.246953],[121.516001,31.251599],[121.517642,31.251862],[121.514569,31.256317],[121.508479,31.262639],[121.50631,31.266746],[121.506505,31.270589],[121.499915,31.275904],[121.496564,31.276407],[121.496049,31.282991],[121.498149,31.286259],[121.502709,31.289658],[121.500652,31.295488],[121.493644,31.293884],[121.490168,31.292603],[121.485664,31.303483],[121.485413,31.311573],[121.496717,31.311489],[121.496216,31.323347],[121.498928,31.325322],[121.497593,31.328109],[121.493575,31.330299],[121.50556,31.345732],[121.517628,31.340779],[121.520256,31.344033],[121.522883,31.342885],[121.525483,31.346797],[121.549398,31.337789],[121.555779,31.333948],[121.558574,31.331256],[121.560493,31.32781],[121.561883,31.321158],[121.561758,31.303339],[121.562523,31.29976],[121.565456,31.294135],[121.569141,31.285254],[121.56953,31.279567],[121.568515,31.275701],[121.563537,31.268805],[121.559074,31.264219],[121.541542,31.251826],[121.536384,31.249623],[121.527555,31.247252],[121.516488,31.246953]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":310112,\"name\":\"闵行区\",\"center\":[121.375972,31.111658],\"centroid\":[121.418901,31.087213],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":310000},\"subFeatureIndex\":7,\"acroutes\":[100000,310000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[121.35871,30.97786],[121.351258,30.975986],[121.34375,30.976599],[121.334406,30.980694],[121.329554,30.981318],[121.327371,30.980658],[121.3258,30.9833],[121.326898,30.989964],[121.326773,30.994479],[121.327482,30.995896],[121.330347,30.996905],[121.33823,31.006197],[121.339829,31.010267],[121.34425,31.013941],[121.34279,31.014817],[121.339898,31.013857],[121.333072,31.01334],[121.333725,31.015657],[121.333892,31.026917],[121.333308,31.030686],[121.334017,31.031922],[121.33367,31.040695],[121.335102,31.04564],[121.335338,31.060435],[121.341456,31.062763],[121.343444,31.059139],[121.35344,31.061287],[121.358195,31.064047],[121.357278,31.066758],[121.363743,31.068354],[121.364424,31.069878],[121.362116,31.072601],[121.364341,31.073705],[121.365481,31.077892],[121.368804,31.079127],[121.370625,31.078372],[121.372016,31.079871],[121.368289,31.088976],[121.362756,31.099771],[121.359085,31.098931],[121.35839,31.100791],[121.351341,31.099255],[121.348532,31.106655],[121.351675,31.107735],[121.352217,31.106487],[121.357014,31.110529],[121.356026,31.112532],[121.353774,31.111512],[121.35066,31.115554],[121.353065,31.117604],[121.349589,31.117748],[121.346753,31.121657],[121.347545,31.121969],[121.34489,31.12577],[121.346002,31.126202],[121.344014,31.129451],[121.344681,31.130338],[121.342095,31.134655],[121.33677,31.138971],[121.338814,31.14017],[121.336728,31.14355],[121.335477,31.143862],[121.333711,31.148765],[121.331292,31.149772],[121.331528,31.15205],[121.328775,31.156665],[121.327218,31.156856],[121.323854,31.162933],[121.318584,31.170256],[121.318042,31.173624],[121.316304,31.176836],[121.310784,31.18423],[121.30856,31.188388],[121.300565,31.197027],[121.297506,31.201412],[121.294837,31.203077],[121.292431,31.202514],[121.292126,31.200621],[121.287329,31.196332],[121.284034,31.194391],[121.277388,31.193576],[121.271701,31.198309],[121.266724,31.203257],[121.264777,31.203317],[121.263053,31.205701],[121.26468,31.206731],[121.263846,31.208912],[121.259397,31.212769],[121.261218,31.215081],[121.259675,31.218148],[121.25745,31.220208],[121.258215,31.222772],[121.256588,31.226329],[121.258006,31.226868],[121.257158,31.230701],[121.254155,31.23312],[121.252792,31.236965],[121.251082,31.238198],[121.249692,31.236534],[121.247912,31.240917],[121.241391,31.240222],[121.239932,31.241061],[121.241683,31.247348],[121.24591,31.248821],[121.247314,31.253287],[121.254183,31.258688],[121.254405,31.259634],[121.260217,31.258328],[121.263985,31.259155],[121.264444,31.256496],[121.271284,31.252258],[121.275302,31.253527],[121.280363,31.251886],[121.284228,31.251838],[121.28142,31.248174],[121.283742,31.245192],[121.287301,31.243276],[121.288538,31.238198],[121.29264,31.232761],[121.296922,31.231048],[121.302998,31.230605],[121.315386,31.227204],[121.322853,31.229623],[121.32612,31.229575],[121.333878,31.232006],[121.334935,31.235887],[121.338355,31.237528],[121.343513,31.234306],[121.345376,31.23039],[121.345362,31.227886],[121.341581,31.226293],[121.340997,31.224269],[121.345627,31.223526],[121.343096,31.223071],[121.342457,31.217789],[121.33937,31.216615],[121.339996,31.212278],[121.338508,31.212182],[121.338438,31.20666],[121.338925,31.196644],[121.33734,31.195817],[121.338049,31.192618],[121.331806,31.189622],[121.338341,31.180108],[121.341414,31.179436],[121.351424,31.183499],[121.353301,31.181629],[121.356958,31.182768],[121.358321,31.186015],[121.360253,31.185296],[121.365954,31.185572],[121.38001,31.190065],[121.391425,31.191911],[121.412572,31.19112],[121.41356,31.18683],[121.415256,31.187357],[121.415158,31.183391],[121.41146,31.182037],[121.400101,31.178813],[121.398349,31.179904],[121.398071,31.178226],[121.394442,31.177879],[121.395415,31.174595],[121.39269,31.173085],[121.394053,31.169489],[121.391508,31.168686],[121.394567,31.159601],[121.402645,31.162226],[121.404578,31.157588],[121.401867,31.157528],[121.395874,31.15585],[121.396931,31.152685],[121.401449,31.153776],[121.400977,31.155214],[121.404953,31.156689],[121.411293,31.14174],[121.41381,31.13728],[121.418398,31.131669],[121.421526,31.127137],[121.436445,31.129043],[121.43853,31.121729],[121.438836,31.119103],[121.435736,31.113539],[121.438002,31.1121],[121.441547,31.112568],[121.445788,31.114954],[121.446706,31.114282],[121.450807,31.115398],[121.450154,31.112819],[121.452364,31.108586],[121.447623,31.107423],[121.446275,31.105744],[121.451878,31.103849],[121.452629,31.101234],[121.455423,31.100755],[121.462862,31.101954],[121.463237,31.108586],[121.465211,31.1121],[121.470286,31.110937],[121.473984,31.112915],[121.474137,31.114354],[121.477321,31.110853],[121.481353,31.110697],[121.477446,31.117328],[121.481256,31.118024],[121.48191,31.120086],[121.485705,31.121933],[121.485969,31.124523],[121.490266,31.124283],[121.49281,31.118719],[121.498538,31.121501],[121.501583,31.114666],[121.505295,31.115494],[121.503863,31.118324],[121.50549,31.120002],[121.511343,31.12119],[121.513749,31.118012],[121.514513,31.115278],[121.521424,31.116309],[121.522869,31.115242],[121.525289,31.116741],[121.53142,31.11842],[121.532254,31.117208],[121.535341,31.117976],[121.537885,31.113983],[121.539526,31.115626],[121.542251,31.116153],[121.544225,31.111464],[121.547687,31.109653],[121.550426,31.11162],[121.549217,31.113419],[121.552317,31.113899],[121.553332,31.112688],[121.555279,31.114882],[121.556697,31.113083],[121.559867,31.111896],[121.557851,31.109797],[121.561396,31.106224],[121.561132,31.105264],[121.563649,31.101858],[121.562064,31.101258],[121.563315,31.098955],[121.566819,31.096569],[121.567264,31.09363],[121.564358,31.091891],[121.561855,31.091867],[121.561563,31.09357],[121.559088,31.091951],[121.551608,31.090128],[121.551539,31.088148],[121.548549,31.086889],[121.550565,31.082834],[121.553555,31.080303],[121.556405,31.081059],[121.557031,31.082702],[121.561563,31.08365],[121.563579,31.082486],[121.569766,31.081611],[121.571643,31.080063],[121.572658,31.081323],[121.575272,31.080063],[121.567639,31.0762],[121.56262,31.075121],[121.562675,31.074305],[121.557531,31.073357],[121.559033,31.072169],[121.555599,31.071689],[121.55279,31.069506],[121.556753,31.06737],[121.551789,31.065643],[121.551094,31.063795],[121.548549,31.063639],[121.547201,31.061647],[121.548383,31.056896],[121.543308,31.055696],[121.54328,31.054016],[121.540791,31.052528],[121.542307,31.049072],[121.541472,31.046396],[121.54588,31.047044],[121.547799,31.048544],[121.54955,31.047908],[121.550538,31.049396],[121.552693,31.0493],[121.554737,31.050824],[121.556127,31.047632],[121.557031,31.04798],[121.559811,31.044812],[121.562119,31.043635],[121.559464,31.041391],[121.559505,31.030278],[121.558254,31.029533],[121.558407,31.024528],[121.555765,31.022908],[121.552804,31.023268],[121.552262,31.020915],[121.554139,31.01861],[121.556516,31.01873],[121.556474,31.020255],[121.558699,31.020255],[121.56027,31.024132],[121.564302,31.021191],[121.569057,31.024396],[121.56839,31.025284],[121.572325,31.026677],[121.574758,31.020951],[121.574674,31.018634],[121.571018,31.016426],[121.569822,31.012452],[121.565859,31.011912],[121.568181,31.010063],[121.569725,31.010603],[121.571463,31.005633],[121.570253,31.004565],[121.570712,31.002295],[121.567959,31.000879],[121.570475,30.998345],[121.561494,30.995644],[121.555918,30.995152],[121.556224,30.993374],[121.553304,30.993026],[121.55279,30.98886],[121.549537,30.988307],[121.54613,30.99305],[121.543294,30.994203],[121.538233,30.993146],[121.537774,30.994683],[121.534507,30.995848],[121.531962,30.994815],[121.528612,30.99592],[121.522897,30.99981],[121.520325,30.999354],[121.520089,31.00256],[121.522105,31.002199],[121.520853,31.004445],[121.517002,31.007626],[121.510412,31.004553],[121.507881,31.004745],[121.503057,31.002716],[121.49883,30.999426],[121.498872,30.998213],[121.495924,30.998297],[121.491948,31.010039],[121.492879,31.012752],[121.489153,31.014949],[121.485872,31.014073],[121.476362,31.01334],[121.47144,31.011948],[121.465587,31.008755],[121.459942,31.007398],[121.448305,31.007458],[121.440811,31.005789],[121.436834,31.00406],[121.433636,31.001779],[121.431426,30.999174],[121.423973,30.994515],[121.413184,30.991069],[121.409333,30.990229],[121.394261,30.988247],[121.375227,30.982832],[121.35871,30.97786]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":310113,\"name\":\"宝山区\",\"center\":[121.489934,31.398896],\"centroid\":[121.404861,31.392111],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":310000},\"subFeatureIndex\":8,\"acroutes\":[100000,310000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[121.425252,31.270661],[121.419496,31.265237],[121.41577,31.265896],[121.41527,31.26914],[121.410598,31.270373],[121.41096,31.273175],[121.40544,31.273067],[121.406496,31.276862],[121.404564,31.276227],[121.400087,31.278071],[121.404453,31.286223],[121.400379,31.286115],[121.398446,31.287145],[121.399559,31.288904],[121.39789,31.29052],[121.393483,31.291274],[121.394762,31.294674],[121.388394,31.29526],[121.384765,31.294446],[121.381623,31.292711],[121.38154,31.289431],[121.376242,31.290592],[121.374838,31.289096],[121.370153,31.290329],[121.369666,31.28912],[121.363785,31.291334],[121.363785,31.292028],[121.358585,31.293465],[121.360295,31.294674],[121.363534,31.302741],[121.360309,31.302717],[121.354803,31.299808],[121.352954,31.301663],[121.348894,31.299246],[121.349659,31.297582],[121.346892,31.296349],[121.34685,31.297654],[121.340927,31.297439],[121.341011,31.293716],[121.338675,31.293225],[121.336506,31.294901],[121.33588,31.297044],[121.334198,31.296122],[121.331306,31.301436],[121.335686,31.303339],[121.338981,31.310101],[121.340357,31.311525],[121.343458,31.317185],[121.347698,31.316706],[121.347782,31.319542],[121.3492,31.321313],[121.345585,31.320835],[121.344848,31.323335],[121.347517,31.324077],[121.345932,31.32513],[121.342318,31.331005],[121.341692,31.33329],[121.342846,31.336066],[121.34628,31.336329],[121.344347,31.341928],[121.342401,31.341306],[121.338925,31.344775],[121.337521,31.344536],[121.336464,31.346821],[121.332502,31.347084],[121.332251,31.351307],[121.334643,31.3509],[121.337743,31.3534],[121.337118,31.356019],[121.341428,31.357802],[121.340329,31.360517],[121.338911,31.360995],[121.337576,31.364189],[121.335018,31.366963],[121.335991,31.370097],[121.333336,31.371281],[121.334003,31.37262],[121.331389,31.37433],[121.328734,31.377344],[121.331306,31.378456],[121.330527,31.381135],[121.326607,31.381063],[121.323061,31.388489],[121.320419,31.389123],[121.323339,31.393331],[121.323145,31.395866],[121.321476,31.397576],[121.317444,31.39742],[121.314747,31.398365],[121.315637,31.402729],[121.317375,31.403661],[121.314316,31.4072],[121.32847,31.411958],[121.330444,31.410308],[121.333141,31.410739],[121.332488,31.413117],[121.334101,31.413655],[121.33239,31.416943],[121.336561,31.419058],[121.336422,31.424999],[121.335143,31.429158],[121.336645,31.429493],[121.336603,31.432254],[121.333656,31.440118],[121.331236,31.439652],[121.328261,31.441098],[121.326106,31.448041],[121.327399,31.448829],[121.324132,31.455007],[121.319794,31.454876],[121.318654,31.456895],[121.320531,31.457289],[121.317778,31.460109],[121.317277,31.466262],[121.320058,31.466728],[121.320572,31.469058],[121.317958,31.468472],[121.31426,31.472474],[121.318807,31.475055],[121.315956,31.481219],[121.313342,31.480598],[121.310214,31.487311],[121.308629,31.488649],[121.31027,31.489735],[121.309171,31.492495],[121.306544,31.493307],[121.304667,31.495779],[121.300857,31.496747],[121.299926,31.499756],[121.302595,31.502599],[121.305876,31.503435],[121.305529,31.505333],[121.310353,31.505919],[121.311938,31.502909],[121.315345,31.501273],[121.316652,31.505775],[121.320169,31.505883],[121.321879,31.503399],[121.32003,31.502993],[121.319905,31.49972],[121.323701,31.499649],[121.323131,31.502288],[121.327218,31.504247],[121.329512,31.504247],[121.335838,31.508295],[121.343499,31.512057],[121.357751,31.508259],[121.362255,31.50679],[121.376298,31.501106],[121.405426,31.487215],[121.406288,31.485388],[121.403966,31.481494],[121.404328,31.479212],[121.409694,31.476321],[121.41869,31.470682],[121.434276,31.458496],[121.446024,31.450717],[121.463696,31.438277],[121.481339,31.427294],[121.49427,31.417851],[121.505991,31.407021],[121.507228,31.409722],[121.501319,31.411982],[121.502362,31.413404],[121.510801,31.409973],[121.517239,31.406303],[121.516585,31.405287],[121.509425,31.408288],[121.507353,31.405933],[121.521229,31.39479],[121.512372,31.385858],[121.507284,31.379102],[121.503835,31.373744],[121.50346,31.369403],[121.503835,31.36493],[121.508424,31.357251],[121.514903,31.352],[121.525483,31.346797],[121.522883,31.342885],[121.520256,31.344033],[121.517628,31.340779],[121.50556,31.345732],[121.493575,31.330299],[121.497593,31.328109],[121.498928,31.325322],[121.496216,31.323347],[121.496717,31.311489],[121.485413,31.311573],[121.485372,31.314636],[121.479171,31.314696],[121.472956,31.315797],[121.468312,31.316036],[121.468145,31.32032],[121.465378,31.321397],[121.457133,31.321002],[121.4547,31.319243],[121.447887,31.317101],[121.44672,31.319817],[121.436765,31.319662],[121.436459,31.32087],[121.433595,31.32087],[121.432468,31.318669],[121.434623,31.312303],[121.432163,31.31168],[121.431676,31.309478],[121.432441,31.305912],[121.431287,31.303638],[121.426434,31.303207],[121.426935,31.298528],[121.42364,31.297259],[121.420039,31.296912],[121.418648,31.292256],[121.419691,31.291071],[121.423806,31.291011],[121.422833,31.28426],[121.424432,31.280238],[121.424571,31.27193],[121.425252,31.270661]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":310114,\"name\":\"嘉定区\",\"center\":[121.250333,31.383524],\"centroid\":[121.244394,31.358136],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":310000},\"subFeatureIndex\":9,\"acroutes\":[100000,310000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[121.336506,31.294901],[121.332891,31.292998],[121.33353,31.291107],[121.326384,31.288928],[121.327316,31.285182],[121.328998,31.284595],[121.332738,31.286067],[121.335004,31.279711],[121.336061,31.280046],[121.336228,31.275461],[121.338883,31.275006],[121.338272,31.272839],[121.343541,31.271439],[121.344723,31.273917],[121.35732,31.271415],[121.358918,31.268793],[121.361268,31.27084],[121.367441,31.269631],[121.366996,31.266662],[121.362227,31.26756],[121.35985,31.266997],[121.358918,31.263609],[121.361783,31.259945],[121.366023,31.259358],[121.365884,31.257682],[121.374574,31.257059],[121.375158,31.25949],[121.377508,31.259478],[121.380886,31.257766],[121.377216,31.247719],[121.375686,31.244486],[121.3731,31.245683],[121.372349,31.243755],[121.368387,31.247384],[121.366718,31.246342],[121.363117,31.240091],[121.36067,31.238642],[121.360086,31.240498],[121.356068,31.240151],[121.356054,31.237803],[121.354177,31.237121],[121.352856,31.238342],[121.348741,31.239372],[121.350131,31.241839],[121.348922,31.243863],[121.347281,31.243192],[121.346822,31.241037],[121.344612,31.243552],[121.345585,31.239887],[121.340872,31.239947],[121.338355,31.237528],[121.334935,31.235887],[121.333878,31.232006],[121.32612,31.229575],[121.322853,31.229623],[121.315386,31.227204],[121.302998,31.230605],[121.296922,31.231048],[121.29264,31.232761],[121.288538,31.238198],[121.287301,31.243276],[121.283742,31.245192],[121.28142,31.248174],[121.284228,31.251838],[121.280363,31.251886],[121.275302,31.253527],[121.271284,31.252258],[121.264444,31.256496],[121.263985,31.259155],[121.260217,31.258328],[121.254405,31.259634],[121.254183,31.258688],[121.246758,31.258448],[121.246577,31.259801],[121.242253,31.25937],[121.237693,31.262088],[121.235177,31.262699],[121.229087,31.262711],[121.229198,31.261717],[121.223539,31.260532],[121.223859,31.259035],[121.220216,31.257406],[121.221273,31.256293],[121.214182,31.254353],[121.212625,31.259837],[121.209761,31.260831],[121.209816,31.258017],[121.208482,31.25749],[121.206368,31.260065],[121.202865,31.257131],[121.203143,31.255814],[121.199848,31.255239],[121.19608,31.253395],[121.19626,31.251228],[121.193368,31.251455],[121.193021,31.253623],[121.188377,31.25476],[121.186444,31.252329],[121.183928,31.252246],[121.181537,31.254413],[121.17934,31.253419],[121.178798,31.255862],[121.176768,31.254605],[121.174251,31.256856],[121.171415,31.254928],[121.16894,31.256197],[121.170386,31.259119],[121.168036,31.259622],[121.167661,31.263944],[121.162614,31.269176],[121.161057,31.26762],[121.157845,31.270541],[121.155537,31.266147],[121.151783,31.267632],[121.153924,31.272061],[121.153743,31.276646],[121.155481,31.278442],[121.155537,31.280765],[121.159402,31.281579],[121.161293,31.283985],[121.159305,31.28766],[121.156399,31.287408],[121.154967,31.290209],[121.153145,31.28997],[121.151282,31.291933],[121.152714,31.294075],[121.148933,31.298875],[121.150782,31.299018],[121.146903,31.305936],[121.143774,31.309706],[121.13895,31.305625],[121.139645,31.302992],[121.133778,31.30207],[121.129954,31.302597],[121.129134,31.307528],[121.129773,31.308306],[121.127966,31.311884],[121.128633,31.314265],[121.127076,31.316934],[121.127257,31.319315],[121.131637,31.32324],[121.131539,31.325441],[121.133305,31.325585],[121.132582,31.331962],[121.13115,31.332106],[121.130121,31.334702],[121.130816,31.341509],[121.130441,31.344213],[121.123948,31.342753],[121.117969,31.343447],[121.11733,31.34712],[121.120194,31.347562],[121.117246,31.351689],[121.111838,31.350517],[121.111157,31.351534],[121.10832,31.350649],[121.108418,31.354034],[121.107361,31.354763],[121.108251,31.360457],[121.106749,31.364535],[121.106958,31.366593],[121.10889,31.366509],[121.10928,31.364703],[121.112853,31.365133],[121.113173,31.36688],[121.120208,31.368674],[121.119082,31.370563],[121.11523,31.371137],[121.113757,31.37445],[121.118206,31.375837],[121.12328,31.37848],[121.124268,31.376722],[121.131247,31.379664],[121.131762,31.378815],[121.138408,31.381147],[121.137518,31.382785],[121.141049,31.384531],[121.141425,31.38355],[121.148432,31.385404],[121.148988,31.38691],[121.147097,31.3899],[121.14383,31.392327],[121.149475,31.394503],[121.147653,31.397325],[121.152742,31.398174],[121.149586,31.399381],[121.15049,31.402215],[121.153896,31.403685],[121.153104,31.405837],[121.157887,31.407893],[121.15886,31.410117],[121.154508,31.411575],[121.155523,31.413835],[121.153493,31.413679],[121.148905,31.415867],[121.149266,31.41913],[121.146208,31.419704],[121.146249,31.421078],[121.151157,31.421796],[121.155273,31.42574],[121.161362,31.425776],[121.162002,31.427951],[121.16431,31.427222],[121.16253,31.429565],[121.162711,31.432218],[121.158484,31.432254],[121.152492,31.433604],[121.14782,31.436186],[121.146569,31.439006],[121.147348,31.44393],[121.160917,31.449678],[121.163045,31.448865],[121.166048,31.450168],[121.16773,31.448315],[121.16983,31.450024],[121.174974,31.449295],[121.180814,31.451458],[121.186055,31.454362],[121.185457,31.457468],[121.186055,31.460814],[121.195051,31.467827],[121.202906,31.469356],[121.203421,31.472331],[121.206368,31.474995],[121.214377,31.479128],[121.21503,31.477528],[121.21364,31.475939],[121.219062,31.475222],[121.220731,31.47607],[121.225361,31.476022],[121.226209,31.477683],[121.230352,31.477432],[121.230839,31.481111],[121.22867,31.482127],[121.232994,31.487896],[121.235413,31.488099],[121.234746,31.492686],[121.237234,31.491957],[121.240877,31.493701],[121.241141,31.490906],[121.243797,31.487311],[121.244409,31.481183],[121.248176,31.481876],[121.245813,31.479881],[121.247064,31.477062],[121.249692,31.477623],[121.251221,31.479606],[121.253362,31.479809],[121.253627,31.483082],[121.255643,31.483632],[121.254794,31.477635],[121.261454,31.478854],[121.261732,31.480777],[121.265153,31.48313],[121.267433,31.483357],[121.267322,31.486224],[121.268879,31.487466],[121.272049,31.484337],[121.27622,31.485376],[121.276442,31.486654],[121.280321,31.488672],[121.279696,31.490404],[121.283686,31.489795],[121.285355,31.490679],[121.289387,31.489031],[121.29061,31.491694],[121.293488,31.489807],[121.298605,31.491515],[121.298563,31.493713],[121.300496,31.494537],[121.300857,31.496747],[121.304667,31.495779],[121.306544,31.493307],[121.309171,31.492495],[121.31027,31.489735],[121.308629,31.488649],[121.310214,31.487311],[121.313342,31.480598],[121.315956,31.481219],[121.318807,31.475055],[121.31426,31.472474],[121.317958,31.468472],[121.320572,31.469058],[121.320058,31.466728],[121.317277,31.466262],[121.317778,31.460109],[121.320531,31.457289],[121.318654,31.456895],[121.319794,31.454876],[121.324132,31.455007],[121.327399,31.448829],[121.326106,31.448041],[121.328261,31.441098],[121.331236,31.439652],[121.333656,31.440118],[121.336603,31.432254],[121.336645,31.429493],[121.335143,31.429158],[121.336422,31.424999],[121.336561,31.419058],[121.33239,31.416943],[121.334101,31.413655],[121.332488,31.413117],[121.333141,31.410739],[121.330444,31.410308],[121.32847,31.411958],[121.314316,31.4072],[121.317375,31.403661],[121.315637,31.402729],[121.314747,31.398365],[121.317444,31.39742],[121.321476,31.397576],[121.323145,31.395866],[121.323339,31.393331],[121.320419,31.389123],[121.323061,31.388489],[121.326607,31.381063],[121.330527,31.381135],[121.331306,31.378456],[121.328734,31.377344],[121.331389,31.37433],[121.334003,31.37262],[121.333336,31.371281],[121.335991,31.370097],[121.335018,31.366963],[121.337576,31.364189],[121.338911,31.360995],[121.340329,31.360517],[121.341428,31.357802],[121.337118,31.356019],[121.337743,31.3534],[121.334643,31.3509],[121.332251,31.351307],[121.332502,31.347084],[121.336464,31.346821],[121.337521,31.344536],[121.338925,31.344775],[121.342401,31.341306],[121.344347,31.341928],[121.34628,31.336329],[121.342846,31.336066],[121.341692,31.33329],[121.342318,31.331005],[121.345932,31.32513],[121.347517,31.324077],[121.344848,31.323335],[121.345585,31.320835],[121.3492,31.321313],[121.347782,31.319542],[121.347698,31.316706],[121.343458,31.317185],[121.340357,31.311525],[121.338981,31.310101],[121.335686,31.303339],[121.331306,31.301436],[121.334198,31.296122],[121.33588,31.297044],[121.336506,31.294901]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":310115,\"name\":\"浦东新区\",\"center\":[121.567706,31.245944],\"centroid\":[121.742177,31.083823],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":310000},\"subFeatureIndex\":10,\"acroutes\":[100000,310000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[121.570475,30.998345],[121.567959,31.000879],[121.570712,31.002295],[121.570253,31.004565],[121.571463,31.005633],[121.569725,31.010603],[121.568181,31.010063],[121.565859,31.011912],[121.569822,31.012452],[121.571018,31.016426],[121.574674,31.018634],[121.574758,31.020951],[121.572325,31.026677],[121.56839,31.025284],[121.569057,31.024396],[121.564302,31.021191],[121.56027,31.024132],[121.558699,31.020255],[121.556474,31.020255],[121.556516,31.01873],[121.554139,31.01861],[121.552262,31.020915],[121.552804,31.023268],[121.555765,31.022908],[121.558407,31.024528],[121.558254,31.029533],[121.559505,31.030278],[121.559464,31.041391],[121.562119,31.043635],[121.559811,31.044812],[121.557031,31.04798],[121.556127,31.047632],[121.554737,31.050824],[121.552693,31.0493],[121.550538,31.049396],[121.54955,31.047908],[121.547799,31.048544],[121.54588,31.047044],[121.541472,31.046396],[121.542307,31.049072],[121.540791,31.052528],[121.54328,31.054016],[121.543308,31.055696],[121.548383,31.056896],[121.547201,31.061647],[121.548549,31.063639],[121.551094,31.063795],[121.551789,31.065643],[121.556753,31.06737],[121.55279,31.069506],[121.555599,31.071689],[121.559033,31.072169],[121.557531,31.073357],[121.562675,31.074305],[121.56262,31.075121],[121.567639,31.0762],[121.575272,31.080063],[121.572658,31.081323],[121.571643,31.080063],[121.569766,31.081611],[121.563579,31.082486],[121.561563,31.08365],[121.557031,31.082702],[121.556405,31.081059],[121.553555,31.080303],[121.550565,31.082834],[121.548549,31.086889],[121.551539,31.088148],[121.551608,31.090128],[121.559088,31.091951],[121.561563,31.09357],[121.561855,31.091867],[121.564358,31.091891],[121.567264,31.09363],[121.566819,31.096569],[121.563315,31.098955],[121.562064,31.101258],[121.563649,31.101858],[121.561132,31.105264],[121.561396,31.106224],[121.557851,31.109797],[121.559867,31.111896],[121.556697,31.113083],[121.555279,31.114882],[121.553332,31.112688],[121.552317,31.113899],[121.549217,31.113419],[121.550426,31.11162],[121.547687,31.109653],[121.544225,31.111464],[121.542251,31.116153],[121.539526,31.115626],[121.537885,31.113983],[121.535341,31.117976],[121.532254,31.117208],[121.53142,31.11842],[121.525289,31.116741],[121.522869,31.115242],[121.521424,31.116309],[121.514513,31.115278],[121.513749,31.118012],[121.511343,31.12119],[121.50549,31.120002],[121.503863,31.118324],[121.505295,31.115494],[121.501583,31.114666],[121.498538,31.121501],[121.49281,31.118719],[121.490266,31.124283],[121.485969,31.124523],[121.485705,31.121933],[121.48191,31.120086],[121.481256,31.118024],[121.477446,31.117328],[121.481353,31.110697],[121.477321,31.110853],[121.474137,31.114354],[121.473984,31.112915],[121.470286,31.110937],[121.465211,31.1121],[121.469299,31.118731],[121.469674,31.124859],[121.468729,31.127868],[121.462431,31.134463],[121.457453,31.142232],[121.457453,31.146451],[121.460387,31.150276],[121.46574,31.155118],[121.468354,31.158091],[121.469369,31.162298],[121.468159,31.167092],[121.464905,31.17541],[121.464905,31.178022],[121.466254,31.18109],[121.468729,31.184122],[121.475987,31.187885],[121.490752,31.191467],[121.494631,31.192857],[121.498066,31.195601],[121.501319,31.199747],[121.508368,31.210158],[121.509911,31.214506],[121.509397,31.218459],[121.506741,31.223119],[121.502014,31.228018],[121.495744,31.232977],[121.493491,31.23615],[121.493491,31.240163],[121.494826,31.24221],[121.500012,31.244989],[121.50688,31.246474],[121.516488,31.246953],[121.527555,31.247252],[121.536384,31.249623],[121.541542,31.251826],[121.559074,31.264219],[121.563537,31.268805],[121.568515,31.275701],[121.56953,31.279567],[121.569141,31.285254],[121.565456,31.294135],[121.562523,31.29976],[121.561758,31.303339],[121.561883,31.321158],[121.560493,31.32781],[121.558574,31.331256],[121.555779,31.333948],[121.549398,31.337789],[121.525483,31.346797],[121.514903,31.352],[121.508424,31.357251],[121.503835,31.36493],[121.50346,31.369403],[121.503835,31.373744],[121.507284,31.379102],[121.512372,31.385858],[121.521229,31.39479],[121.538011,31.388489],[121.559811,31.38361],[121.593708,31.376411],[121.603038,31.372656],[121.610559,31.368195],[121.689448,31.322462],[121.712431,31.309407],[121.722511,31.303518],[121.729101,31.298288],[121.743742,31.283207],[121.809812,31.196907],[121.853358,31.155346],[121.884029,31.130638],[121.889465,31.121705],[121.94679,31.065883],[121.962682,31.047284],[121.977558,31.016101],[121.990934,30.968432],[121.996231,30.935458],[121.998497,30.899961],[121.996982,30.874898],[121.993951,30.863055],[121.985372,30.850694],[121.970732,30.839077],[121.954715,30.825811],[121.954326,30.821409],[121.955466,30.817138],[121.969703,30.789202],[121.943689,30.777096],[121.9246,30.8066],[121.915284,30.812892],[121.904467,30.814155],[121.793767,30.816862],[121.769338,30.85043],[121.768143,30.863272],[121.771605,30.875427],[121.772481,30.875703],[121.773134,30.880596],[121.776679,30.881005],[121.776012,30.886426],[121.778807,30.894588],[121.778987,30.899468],[121.778334,30.903807],[121.77896,30.910116],[121.780239,30.911811],[121.781115,30.917567],[121.777653,30.926723],[121.777806,30.931025],[121.77337,30.931553],[121.773023,30.933932],[121.769769,30.935278],[121.76799,30.93833],[121.766432,30.936539],[121.763846,30.936852],[121.764277,30.938522],[121.761469,30.938414],[121.761677,30.940132],[121.764542,30.941766],[121.760927,30.944613],[121.761024,30.947604],[121.759286,30.949154],[121.751987,30.952721],[121.749234,30.953046],[121.747857,30.951893],[121.743742,30.956589],[121.739988,30.956721],[121.73686,30.958703],[121.737916,30.960637],[121.733954,30.964469],[121.73191,30.967784],[121.712792,30.980934],[121.705507,30.984981],[121.699459,30.987419],[121.69298,30.98934],[121.688086,30.990145],[121.683595,30.989808],[121.674558,30.991802],[121.673348,30.989832],[121.669525,30.991609],[121.663115,30.992714],[121.654536,30.993254],[121.646695,30.99335],[121.62057,30.992678],[121.61772,30.995692],[121.614717,31.001251],[121.604066,31.001131],[121.595585,31.002043],[121.594682,31.000699],[121.584309,31.000819],[121.582933,30.999498],[121.576746,30.999474],[121.570475,30.998345]]],[[[121.943244,31.215465],[121.946595,31.224365],[121.951044,31.228821],[121.957259,31.230414],[121.969188,31.230282],[121.980659,31.22809],[121.989655,31.224521],[122.008563,31.220987],[122.011038,31.217405],[122.012609,31.210002],[122.012011,31.192043],[122.010593,31.188004],[121.999554,31.165079],[121.99573,31.1608],[121.975862,31.158834],[121.970773,31.157552],[121.965685,31.15754],[121.959637,31.159278],[121.952629,31.1672],[121.948027,31.176405],[121.944843,31.186878],[121.942619,31.198465],[121.941826,31.207678],[121.943244,31.215465]]],[[[121.882625,31.240857],[121.88991,31.242594],[121.897363,31.242115],[121.915451,31.236558],[121.923557,31.233863],[121.926727,31.229731],[121.927519,31.224017],[121.925448,31.205438],[121.922445,31.196859],[121.918788,31.194319],[121.913852,31.19384],[121.908777,31.195266],[121.901645,31.20146],[121.889271,31.214997],[121.885155,31.22052],[121.882541,31.225611],[121.880873,31.23633],[121.882625,31.240857]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":310116,\"name\":\"金山区\",\"center\":[121.330736,30.724697],\"centroid\":[121.255144,30.818932],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":310000},\"subFeatureIndex\":11,\"acroutes\":[100000,310000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[120.99673,30.950307],[121.002055,30.95104],[121.002653,30.947015],[121.00763,30.947628],[121.010175,30.950727],[121.015361,30.948169],[121.013345,30.946811],[121.011079,30.947184],[121.011607,30.943604],[121.013831,30.944168],[121.015291,30.940288],[121.017697,30.939219],[121.016932,30.941333],[121.019462,30.941165],[121.028041,30.94394],[121.02989,30.944457],[121.029612,30.941874],[121.031851,30.939771],[121.031503,30.936083],[121.028694,30.92754],[121.028319,30.922602],[121.025872,30.91675],[121.024885,30.911618],[121.025288,30.909059],[121.034659,30.90615],[121.034395,30.902737],[121.038788,30.902148],[121.040332,30.904504],[121.040874,30.900706],[121.04232,30.899408],[121.045184,30.901896],[121.053026,30.903374],[121.056529,30.90335],[121.067944,30.904504],[121.068973,30.902124],[121.072491,30.903182],[121.072421,30.904924],[121.080833,30.905946],[121.081806,30.904251],[121.083725,30.905285],[121.091664,30.90341],[121.094347,30.904804],[121.09425,30.902545],[121.097128,30.903206],[121.098782,30.906607],[121.096196,30.910332],[121.093805,30.909708],[121.089092,30.911979],[121.089022,30.915296],[121.091358,30.916185],[121.100395,30.926459],[121.104358,30.922758],[121.105122,30.920138],[121.110962,30.921749],[121.114591,30.921676],[121.121445,30.919958],[121.119346,30.911991],[121.117802,30.910705],[121.113506,30.903602],[121.110851,30.90103],[121.111087,30.899228],[121.113451,30.897425],[121.118164,30.901487],[121.122224,30.901114],[121.123545,30.902857],[121.130163,30.902593],[121.131706,30.899732],[121.134417,30.901812],[121.141258,30.901331],[121.14098,30.904984],[121.139673,30.907388],[121.14009,30.910332],[121.13742,30.913349],[121.139061,30.91961],[121.143246,30.918108],[121.142162,30.915596],[121.149836,30.912616],[121.152895,30.9102],[121.156649,30.909972],[121.156288,30.912616],[121.156746,30.918961],[121.158206,30.920295],[121.164616,30.919934],[121.16691,30.916978],[121.171262,30.914683],[121.174654,30.915115],[121.186472,30.915404],[121.187765,30.916593],[121.194828,30.917314],[121.207522,30.919886],[121.211026,30.92128],[121.218145,30.927684],[121.222997,30.930748],[121.227335,30.926783],[121.234495,30.928562],[121.234773,30.925978],[121.238166,30.924861],[121.240655,30.925149],[121.242935,30.91991],[121.244589,30.920307],[121.245507,30.917074],[121.243686,30.917855],[121.246619,30.9099],[121.255226,30.909551],[121.255893,30.907977],[121.258952,30.907208],[121.262122,30.908097],[121.262525,30.906835],[121.266932,30.906258],[121.266168,30.901715],[121.269046,30.901679],[121.270422,30.900165],[121.27298,30.900405],[121.274663,30.896078],[121.279098,30.897112],[121.27964,30.894456],[121.282073,30.894804],[121.28231,30.896571],[121.285257,30.896631],[121.285799,30.895429],[121.288413,30.896066],[121.288719,30.899961],[121.290151,30.900021],[121.291013,30.902677],[121.290068,30.909804],[121.288705,30.909912],[121.288844,30.916894],[121.294948,30.918504],[121.294809,30.914947],[121.296269,30.914959],[121.29848,30.909744],[121.301775,30.908458],[121.303443,30.909287],[121.303721,30.912099],[121.306502,30.912123],[121.306808,30.910212],[121.313829,30.910717],[121.314608,30.909143],[121.320127,30.91109],[121.321518,30.908986],[121.325939,30.908962],[121.327635,30.91014],[121.331097,30.907508],[121.334657,30.907737],[121.336631,30.906739],[121.340162,30.908554],[121.343819,30.909119],[121.347573,30.913145],[121.350604,30.911402],[121.351814,30.913217],[121.35668,30.908614],[121.358418,30.900598],[121.360476,30.897785],[121.361185,30.892977],[121.36327,30.886955],[121.367233,30.886667],[121.370166,30.883914],[121.371751,30.883698],[121.377535,30.879983],[121.382207,30.878961],[121.381498,30.876605],[121.382791,30.874489],[121.38286,30.869043],[121.381873,30.867324],[121.381929,30.863765],[121.384001,30.863488],[121.383472,30.859232],[121.384376,30.856238],[121.383722,30.851765],[121.384918,30.848073],[121.385446,30.843178],[121.379065,30.843238],[121.379259,30.840112],[121.383764,30.833906],[121.387588,30.832799],[121.387588,30.829864],[121.391717,30.829913],[121.392051,30.82782],[121.396986,30.827988],[121.397376,30.833292],[121.399712,30.834182],[121.404202,30.833797],[121.403632,30.829877],[121.400685,30.830105],[121.400991,30.827399],[121.404786,30.823081],[121.41235,30.821505],[121.414171,30.821757],[121.41552,30.819941],[121.415131,30.815803],[121.419288,30.81602],[121.420525,30.819797],[121.425989,30.81869],[121.437029,30.818101],[121.441645,30.806829],[121.445427,30.804868],[121.44672,30.805577],[121.451711,30.798323],[121.465072,30.776483],[121.478767,30.756347],[121.426365,30.730283],[121.406997,30.718086],[121.361894,30.67952],[121.35433,30.676991],[121.346642,30.675593],[121.326718,30.67593],[121.291041,30.678328],[121.274649,30.6774],[121.271604,30.69689],[121.270422,30.69807],[121.270672,30.701563],[121.268656,30.702129],[121.268031,30.706103],[121.266668,30.706296],[121.265862,30.709488],[121.268448,30.712149],[121.267057,30.715039],[121.270339,30.716894],[121.270102,30.72047],[121.272035,30.723252],[121.270339,30.725864],[121.271451,30.726948],[121.269755,30.730729],[121.271451,30.73227],[121.26817,30.734931],[121.266835,30.733498],[121.261343,30.738217],[121.256393,30.743948],[121.244756,30.749185],[121.243102,30.750533],[121.23729,30.752651],[121.232298,30.755817],[121.230686,30.763737],[121.229115,30.767974],[121.226918,30.770826],[121.226209,30.775087],[121.224624,30.776976],[121.2234,30.775977],[121.217992,30.784954],[121.213723,30.785929],[121.205534,30.785905],[121.200098,30.783294],[121.199166,30.780755],[121.20032,30.773618],[121.196956,30.773354],[121.191839,30.778853],[121.190963,30.781092],[121.189517,30.778974],[121.186361,30.779034],[121.185791,30.776651],[121.183441,30.775038],[121.179965,30.774376],[121.174668,30.772018],[121.170984,30.774677],[121.170789,30.777084],[121.168968,30.775953],[121.163434,30.775279],[121.160737,30.773221],[121.160681,30.776579],[121.155815,30.777205],[121.152687,30.778974],[121.144122,30.779479],[121.140618,30.776928],[121.1387,30.77842],[121.13603,30.777337],[121.131817,30.777313],[121.127521,30.778673],[121.12342,30.77895],[121.117219,30.786073],[121.120041,30.788552],[121.125255,30.788179],[121.126576,30.788998],[121.126047,30.79304],[121.128202,30.810221],[121.130218,30.815574],[121.132373,30.819279],[121.13742,30.825029],[121.13742,30.829985],[121.136239,30.827868],[121.134264,30.828505],[121.132916,30.831608],[121.134612,30.833028],[121.131609,30.83601],[121.129982,30.834892],[121.127688,30.83565],[121.120639,30.836335],[121.117747,30.835301],[121.119832,30.83773],[121.12025,30.843299],[121.123545,30.847267],[121.121153,30.850165],[121.120055,30.849119],[121.114744,30.851476],[121.113159,30.854049],[121.110906,30.851416],[121.104789,30.849335],[121.102272,30.850261],[121.097684,30.854927],[121.097712,30.857103],[121.080471,30.848746],[121.066999,30.84877],[121.06052,30.845187],[121.061674,30.843383],[121.060228,30.842793],[121.062049,30.83779],[121.056335,30.835602],[121.046755,30.831091],[121.048896,30.825186],[121.045101,30.825907],[121.043516,30.828157],[121.039956,30.827218],[121.04175,30.825378],[121.040276,30.82438],[121.039192,30.820867],[121.03769,30.820266],[121.03908,30.818582],[121.043752,30.820013],[121.044976,30.815526],[121.037912,30.81389],[121.036647,30.818449],[121.030057,30.828553],[121.014874,30.833954],[121.014402,30.835818],[121.010898,30.834615],[121.006935,30.830779],[121.003446,30.826304],[121.00054,30.829431],[120.994603,30.821493],[120.990918,30.822708],[120.992754,30.825691],[120.989153,30.828698],[120.992462,30.831572],[120.989125,30.832318],[120.989987,30.834724],[120.992865,30.838392],[120.995659,30.838572],[120.997759,30.84408],[120.9999,30.843335],[121.000985,30.845632],[121.003974,30.846101],[121.006463,30.850454],[121.008006,30.850574],[121.010133,30.853135],[121.013359,30.851692],[121.015013,30.853604],[121.010981,30.856033],[121.015403,30.86053],[121.016265,30.862851],[121.013971,30.86439],[121.01778,30.86938],[121.014819,30.871027],[121.01778,30.873359],[121.020463,30.87188],[121.019796,30.873996],[121.021896,30.875162],[121.019421,30.876665],[121.021465,30.878793],[121.0186,30.880716],[121.017474,30.882724],[121.011092,30.882219],[121.008298,30.882964],[121.00852,30.888121],[121.005017,30.888794],[120.993824,30.88966],[120.992907,30.893915],[120.99046,30.89579],[120.992656,30.899732],[120.992809,30.90216],[120.995715,30.903723],[120.998635,30.903386],[120.998704,30.905946],[121.00257,30.904852],[121.004516,30.906955],[121.004572,30.909299],[120.998982,30.909527],[120.999622,30.91395],[121.000025,30.934701],[121.000818,30.937729],[120.997481,30.941141],[120.995673,30.944336],[120.996813,30.944625],[120.99673,30.950307]]],[[[121.426671,30.682183],[121.428589,30.681749],[121.426796,30.680315],[121.426671,30.682183]]],[[[121.422458,30.691482],[121.426615,30.691277],[121.428909,30.689109],[121.425364,30.687374],[121.419482,30.689856],[121.419469,30.691626],[121.422458,30.691482]]],[[[121.406775,30.704995],[121.409291,30.704514],[121.406622,30.703093],[121.406775,30.704995]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":310117,\"name\":\"松江区\",\"center\":[121.223543,31.03047],\"centroid\":[121.220231,31.015194],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":310000},\"subFeatureIndex\":12,\"acroutes\":[100000,310000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[121.323854,31.162933],[121.327218,31.156856],[121.328775,31.156665],[121.331528,31.15205],[121.331292,31.149772],[121.333711,31.148765],[121.335477,31.143862],[121.336728,31.14355],[121.338814,31.14017],[121.33677,31.138971],[121.342095,31.134655],[121.344681,31.130338],[121.344014,31.129451],[121.346002,31.126202],[121.34489,31.12577],[121.347545,31.121969],[121.346753,31.121657],[121.349589,31.117748],[121.353065,31.117604],[121.35066,31.115554],[121.353774,31.111512],[121.356026,31.112532],[121.357014,31.110529],[121.352217,31.106487],[121.351675,31.107735],[121.348532,31.106655],[121.351341,31.099255],[121.35839,31.100791],[121.359085,31.098931],[121.362756,31.099771],[121.368289,31.088976],[121.372016,31.079871],[121.370625,31.078372],[121.368804,31.079127],[121.365481,31.077892],[121.364341,31.073705],[121.362116,31.072601],[121.364424,31.069878],[121.363743,31.068354],[121.357278,31.066758],[121.358195,31.064047],[121.35344,31.061287],[121.343444,31.059139],[121.341456,31.062763],[121.335338,31.060435],[121.335102,31.04564],[121.33367,31.040695],[121.334017,31.031922],[121.333308,31.030686],[121.333892,31.026917],[121.333725,31.015657],[121.333072,31.01334],[121.339898,31.013857],[121.34279,31.014817],[121.34425,31.013941],[121.339829,31.010267],[121.33823,31.006197],[121.330347,30.996905],[121.327482,30.995896],[121.326773,30.994479],[121.326898,30.989964],[121.3258,30.9833],[121.327371,30.980658],[121.329554,30.981318],[121.334406,30.980694],[121.34375,30.976599],[121.351258,30.975986],[121.35871,30.97786],[121.359961,30.976251],[121.361435,30.970438],[121.36099,30.965574],[121.362853,30.959544],[121.363117,30.956109],[121.362255,30.9517],[121.362478,30.948901],[121.365467,30.947232],[121.363868,30.945165],[121.361129,30.944048],[121.362408,30.939122],[121.362658,30.934761],[121.359336,30.935086],[121.357361,30.933632],[121.354706,30.933512],[121.355679,30.932058],[121.35116,30.930628],[121.352203,30.928213],[121.352161,30.923803],[121.355373,30.921388],[121.356054,30.919742],[121.355081,30.916341],[121.351814,30.913217],[121.350604,30.911402],[121.347573,30.913145],[121.343819,30.909119],[121.340162,30.908554],[121.336631,30.906739],[121.334657,30.907737],[121.331097,30.907508],[121.327635,30.91014],[121.325939,30.908962],[121.321518,30.908986],[121.320127,30.91109],[121.314608,30.909143],[121.313829,30.910717],[121.306808,30.910212],[121.306502,30.912123],[121.303721,30.912099],[121.303443,30.909287],[121.301775,30.908458],[121.29848,30.909744],[121.296269,30.914959],[121.294809,30.914947],[121.294948,30.918504],[121.288844,30.916894],[121.288705,30.909912],[121.290068,30.909804],[121.291013,30.902677],[121.290151,30.900021],[121.288719,30.899961],[121.288413,30.896066],[121.285799,30.895429],[121.285257,30.896631],[121.28231,30.896571],[121.282073,30.894804],[121.27964,30.894456],[121.279098,30.897112],[121.274663,30.896078],[121.27298,30.900405],[121.270422,30.900165],[121.269046,30.901679],[121.266168,30.901715],[121.266932,30.906258],[121.262525,30.906835],[121.262122,30.908097],[121.258952,30.907208],[121.255893,30.907977],[121.255226,30.909551],[121.246619,30.9099],[121.243686,30.917855],[121.245507,30.917074],[121.244589,30.920307],[121.242935,30.91991],[121.240655,30.925149],[121.238166,30.924861],[121.234773,30.925978],[121.234495,30.928562],[121.227335,30.926783],[121.222997,30.930748],[121.218145,30.927684],[121.211026,30.92128],[121.207522,30.919886],[121.194828,30.917314],[121.187765,30.916593],[121.186472,30.915404],[121.174654,30.915115],[121.171262,30.914683],[121.16691,30.916978],[121.164616,30.919934],[121.158206,30.920295],[121.156746,30.918961],[121.156288,30.912616],[121.156649,30.909972],[121.152895,30.9102],[121.149836,30.912616],[121.142162,30.915596],[121.143246,30.918108],[121.139061,30.91961],[121.13742,30.913349],[121.14009,30.910332],[121.139673,30.907388],[121.14098,30.904984],[121.141258,30.901331],[121.134417,30.901812],[121.131706,30.899732],[121.130163,30.902593],[121.123545,30.902857],[121.122224,30.901114],[121.118164,30.901487],[121.113451,30.897425],[121.111087,30.899228],[121.110851,30.90103],[121.113506,30.903602],[121.117802,30.910705],[121.119346,30.911991],[121.121445,30.919958],[121.114591,30.921676],[121.110962,30.921749],[121.105122,30.920138],[121.104358,30.922758],[121.100395,30.926459],[121.091358,30.916185],[121.089022,30.915296],[121.089092,30.911979],[121.093805,30.909708],[121.096196,30.910332],[121.098782,30.906607],[121.097128,30.903206],[121.09425,30.902545],[121.094347,30.904804],[121.091664,30.90341],[121.083725,30.905285],[121.081806,30.904251],[121.080833,30.905946],[121.072421,30.904924],[121.072491,30.903182],[121.068973,30.902124],[121.067944,30.904504],[121.056529,30.90335],[121.053026,30.903374],[121.045184,30.901896],[121.04232,30.899408],[121.040874,30.900706],[121.040332,30.904504],[121.038788,30.902148],[121.034395,30.902737],[121.034659,30.90615],[121.025288,30.909059],[121.024885,30.911618],[121.025872,30.91675],[121.028319,30.922602],[121.028694,30.92754],[121.031503,30.936083],[121.031851,30.939771],[121.029612,30.941874],[121.02989,30.944457],[121.028041,30.94394],[121.027902,30.945826],[121.033213,30.947111],[121.034659,30.952974],[121.036258,30.957094],[121.040401,30.956493],[121.043516,30.957514],[121.042626,30.960433],[121.045949,30.963448],[121.043112,30.969429],[121.0467,30.970246],[121.047409,30.969033],[121.051024,30.969369],[121.053262,30.964445],[121.05735,30.965346],[121.056891,30.96191],[121.059505,30.959184],[121.060339,30.956517],[121.065344,30.95516],[121.07231,30.955088],[121.076495,30.955809],[121.076634,30.957574],[121.079109,30.958283],[121.078539,30.960025],[121.080736,30.960181],[121.081236,30.962283],[121.088174,30.962151],[121.088035,30.964168],[121.093555,30.964673],[121.097489,30.965634],[121.095779,30.968408],[121.095557,30.974245],[121.099172,30.973068],[121.099686,30.980994],[121.099227,30.981979],[121.100145,30.994935],[121.104107,30.99508],[121.104205,31.007998],[121.10205,31.011756],[121.093026,31.020207],[121.085532,31.0255],[121.089509,31.027901],[121.091177,31.025933],[121.096405,31.026437],[121.096975,31.031454],[121.099936,31.031202],[121.100284,31.03341],[121.097767,31.038871],[121.095863,31.040479],[121.09311,31.040719],[121.09621,31.044812],[121.090259,31.048136],[121.089926,31.05194],[121.087159,31.052948],[121.085866,31.050224],[121.082404,31.054208],[121.080972,31.056896],[121.08442,31.058779],[121.086519,31.061167],[121.085935,31.062847],[121.088202,31.064671],[121.092929,31.064539],[121.094542,31.061899],[121.093012,31.058443],[121.094639,31.056332],[121.098337,31.05662],[121.101146,31.053644],[121.101813,31.05728],[121.10839,31.057939],[121.10864,31.05662],[121.118206,31.056068],[121.117997,31.058407],[121.120708,31.057268],[121.12588,31.057376],[121.127757,31.059751],[121.126395,31.059811],[121.126228,31.06665],[121.122238,31.067178],[121.121543,31.07019],[121.118386,31.075948],[121.117121,31.075624],[121.112603,31.077628],[121.107264,31.082115],[121.102912,31.080219],[121.100687,31.080939],[121.099408,31.085941],[121.10084,31.088688],[121.097601,31.093534],[121.099519,31.094158],[121.099853,31.096593],[121.097976,31.099339],[121.100618,31.098428],[121.103843,31.100539],[121.103551,31.102638],[121.108751,31.107159],[121.112589,31.111932],[121.114368,31.109797],[121.11612,31.110973],[121.117733,31.108874],[121.120959,31.107747],[121.125505,31.103369],[121.127688,31.103309],[121.130691,31.100527],[121.131942,31.10205],[121.133319,31.099075],[121.135766,31.09808],[121.141605,31.09868],[121.141897,31.096893],[121.144483,31.097456],[121.14586,31.093954],[121.149461,31.095297],[121.151157,31.091651],[121.152867,31.092035],[121.153465,31.09014],[121.155161,31.090475],[121.155384,31.093162],[121.156733,31.09315],[121.156788,31.098943],[121.154341,31.098884],[121.154397,31.101846],[121.159569,31.100539],[121.165492,31.101438],[121.1652,31.104269],[121.166799,31.104293],[121.166451,31.10831],[121.170567,31.107819],[121.170497,31.109054],[121.174487,31.108538],[121.172986,31.114091],[121.17521,31.115242],[121.174321,31.117868],[121.17642,31.119007],[121.178839,31.117149],[121.183817,31.118695],[121.183858,31.124295],[121.181815,31.124295],[121.181842,31.126957],[121.180341,31.127425],[121.179868,31.131873],[121.181662,31.131777],[121.181968,31.143478],[121.194717,31.138179],[121.199653,31.139582],[121.201627,31.140937],[121.200348,31.137832],[121.206174,31.138299],[121.208287,31.135686],[121.22055,31.138383],[121.227988,31.139091],[121.226765,31.134139],[121.223581,31.126442],[121.221732,31.119931],[121.221301,31.115074],[121.224095,31.115146],[121.233884,31.117316],[121.235816,31.118959],[121.236831,31.125698],[121.239848,31.126238],[121.244534,31.125398],[121.245326,31.129295],[121.239348,31.129955],[121.245479,31.130758],[121.246995,31.134163],[121.25378,31.13264],[121.258048,31.132353],[121.257965,31.127077],[121.261607,31.127173],[121.26062,31.132269],[121.263623,31.135422],[121.26557,31.134787],[121.265737,31.136393],[121.280989,31.133252],[121.287482,31.139954],[121.284173,31.142627],[121.281781,31.142016],[121.279293,31.145708],[121.277012,31.144174],[121.276415,31.145852],[121.278723,31.14825],[121.277763,31.152265],[121.28028,31.150539],[121.283825,31.150839],[121.28313,31.152158],[121.285438,31.153452],[121.287134,31.152313],[121.295435,31.15392],[121.301441,31.15549],[121.316221,31.160189],[121.318056,31.157564],[121.320934,31.158487],[121.322491,31.162394],[121.323854,31.162933]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":310118,\"name\":\"青浦区\",\"center\":[121.113021,31.151209],\"centroid\":[121.085182,31.124658],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":310000},\"subFeatureIndex\":13,\"acroutes\":[100000,310000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[121.323854,31.162933],[121.322491,31.162394],[121.320934,31.158487],[121.318056,31.157564],[121.316221,31.160189],[121.301441,31.15549],[121.295435,31.15392],[121.287134,31.152313],[121.285438,31.153452],[121.28313,31.152158],[121.283825,31.150839],[121.28028,31.150539],[121.277763,31.152265],[121.278723,31.14825],[121.276415,31.145852],[121.277012,31.144174],[121.279293,31.145708],[121.281781,31.142016],[121.284173,31.142627],[121.287482,31.139954],[121.280989,31.133252],[121.265737,31.136393],[121.26557,31.134787],[121.263623,31.135422],[121.26062,31.132269],[121.261607,31.127173],[121.257965,31.127077],[121.258048,31.132353],[121.25378,31.13264],[121.246995,31.134163],[121.245479,31.130758],[121.239348,31.129955],[121.245326,31.129295],[121.244534,31.125398],[121.239848,31.126238],[121.236831,31.125698],[121.235816,31.118959],[121.233884,31.117316],[121.224095,31.115146],[121.221301,31.115074],[121.221732,31.119931],[121.223581,31.126442],[121.226765,31.134139],[121.227988,31.139091],[121.22055,31.138383],[121.208287,31.135686],[121.206174,31.138299],[121.200348,31.137832],[121.201627,31.140937],[121.199653,31.139582],[121.194717,31.138179],[121.181968,31.143478],[121.181662,31.131777],[121.179868,31.131873],[121.180341,31.127425],[121.181842,31.126957],[121.181815,31.124295],[121.183858,31.124295],[121.183817,31.118695],[121.178839,31.117149],[121.17642,31.119007],[121.174321,31.117868],[121.17521,31.115242],[121.172986,31.114091],[121.174487,31.108538],[121.170497,31.109054],[121.170567,31.107819],[121.166451,31.10831],[121.166799,31.104293],[121.1652,31.104269],[121.165492,31.101438],[121.159569,31.100539],[121.154397,31.101846],[121.154341,31.098884],[121.156788,31.098943],[121.156733,31.09315],[121.155384,31.093162],[121.155161,31.090475],[121.153465,31.09014],[121.152867,31.092035],[121.151157,31.091651],[121.149461,31.095297],[121.14586,31.093954],[121.144483,31.097456],[121.141897,31.096893],[121.141605,31.09868],[121.135766,31.09808],[121.133319,31.099075],[121.131942,31.10205],[121.130691,31.100527],[121.127688,31.103309],[121.125505,31.103369],[121.120959,31.107747],[121.117733,31.108874],[121.11612,31.110973],[121.114368,31.109797],[121.112589,31.111932],[121.108751,31.107159],[121.103551,31.102638],[121.103843,31.100539],[121.100618,31.098428],[121.097976,31.099339],[121.099853,31.096593],[121.099519,31.094158],[121.097601,31.093534],[121.10084,31.088688],[121.099408,31.085941],[121.100687,31.080939],[121.102912,31.080219],[121.107264,31.082115],[121.112603,31.077628],[121.117121,31.075624],[121.118386,31.075948],[121.121543,31.07019],[121.122238,31.067178],[121.126228,31.06665],[121.126395,31.059811],[121.127757,31.059751],[121.12588,31.057376],[121.120708,31.057268],[121.117997,31.058407],[121.118206,31.056068],[121.10864,31.05662],[121.10839,31.057939],[121.101813,31.05728],[121.101146,31.053644],[121.098337,31.05662],[121.094639,31.056332],[121.093012,31.058443],[121.094542,31.061899],[121.092929,31.064539],[121.088202,31.064671],[121.085935,31.062847],[121.086519,31.061167],[121.08442,31.058779],[121.080972,31.056896],[121.082404,31.054208],[121.085866,31.050224],[121.087159,31.052948],[121.089926,31.05194],[121.090259,31.048136],[121.09621,31.044812],[121.09311,31.040719],[121.095863,31.040479],[121.097767,31.038871],[121.100284,31.03341],[121.099936,31.031202],[121.096975,31.031454],[121.096405,31.026437],[121.091177,31.025933],[121.089509,31.027901],[121.085532,31.0255],[121.093026,31.020207],[121.10205,31.011756],[121.104205,31.007998],[121.104107,30.99508],[121.100145,30.994935],[121.099227,30.981979],[121.099686,30.980994],[121.099172,30.973068],[121.095557,30.974245],[121.095779,30.968408],[121.097489,30.965634],[121.093555,30.964673],[121.088035,30.964168],[121.088174,30.962151],[121.081236,30.962283],[121.080736,30.960181],[121.078539,30.960025],[121.079109,30.958283],[121.076634,30.957574],[121.076495,30.955809],[121.07231,30.955088],[121.065344,30.95516],[121.060339,30.956517],[121.059505,30.959184],[121.056891,30.96191],[121.05735,30.965346],[121.053262,30.964445],[121.051024,30.969369],[121.047409,30.969033],[121.0467,30.970246],[121.043112,30.969429],[121.045949,30.963448],[121.042626,30.960433],[121.043516,30.957514],[121.040401,30.956493],[121.036258,30.957094],[121.034659,30.952974],[121.033213,30.947111],[121.027902,30.945826],[121.028041,30.94394],[121.019462,30.941165],[121.016932,30.941333],[121.017697,30.939219],[121.015291,30.940288],[121.013831,30.944168],[121.011607,30.943604],[121.011079,30.947184],[121.013345,30.946811],[121.015361,30.948169],[121.010175,30.950727],[121.00763,30.947628],[121.002653,30.947015],[121.002055,30.95104],[120.99673,30.950307],[120.995368,30.950367],[120.994797,30.954824],[120.992531,30.955028],[120.991683,30.958211],[120.994756,30.958703],[120.992601,30.962835],[120.993699,30.964024],[120.991433,30.968372],[120.993143,30.972119],[120.99737,30.972444],[121.000512,30.973933],[121.000567,30.977007],[121.002361,30.97762],[121.000832,30.980466],[120.999344,30.980106],[120.997133,30.989232],[120.994603,30.991922],[120.994839,30.99526],[120.990515,30.994551],[120.989834,30.996664],[120.992045,30.997109],[120.992086,31.003424],[120.991057,31.00747],[120.991933,31.008154],[120.989987,31.010495],[120.989514,31.014397],[120.983855,31.014445],[120.982993,31.016089],[120.970202,31.016149],[120.963209,31.016594],[120.964849,31.019751],[120.964293,31.020771],[120.960483,31.021659],[120.958301,31.028573],[120.952197,31.030254],[120.951085,31.029077],[120.949124,31.029953],[120.948735,31.025068],[120.951168,31.024012],[120.949972,31.017638],[120.936305,31.01711],[120.935749,31.015381],[120.940087,31.010027],[120.938085,31.009007],[120.933789,31.010027],[120.931383,31.01178],[120.92699,31.012068],[120.926155,31.010423],[120.918105,31.012788],[120.911014,31.010555],[120.909944,31.012644],[120.910055,31.016942],[120.901365,31.017494],[120.900559,31.020423],[120.901338,31.0255],[120.901977,31.037647],[120.899739,31.039603],[120.897027,31.04558],[120.897208,31.04822],[120.895442,31.050332],[120.894567,31.053896],[120.894622,31.058659],[120.895915,31.063075],[120.898863,31.070514],[120.899614,31.07836],[120.904619,31.078528],[120.90473,31.080495],[120.901671,31.084094],[120.902116,31.085653],[120.899294,31.086937],[120.896694,31.086649],[120.895415,31.090703],[120.892175,31.094194],[120.892842,31.096533],[120.891216,31.09718],[120.891021,31.094302],[120.887476,31.094074],[120.878077,31.095753],[120.878967,31.09838],[120.876005,31.097864],[120.876631,31.099939],[120.873169,31.100323],[120.872543,31.098884],[120.869818,31.098943],[120.869582,31.097216],[120.865744,31.097624],[120.863993,31.100299],[120.859766,31.100287],[120.856804,31.102829],[120.857917,31.108526],[120.860225,31.10933],[120.862241,31.112508],[120.865967,31.11475],[120.870597,31.119715],[120.871014,31.123804],[120.872349,31.127161],[120.876422,31.131489],[120.881289,31.134727],[120.89921,31.136057],[120.905397,31.134211],[120.916923,31.136189],[120.93034,31.141404],[120.952642,31.138251],[120.983911,31.131705],[120.991252,31.13318],[121.007269,31.13342],[121.018489,31.134103],[121.022813,31.138311],[121.022271,31.140457],[121.025677,31.140769],[121.02672,31.143766],[121.028375,31.143874],[121.028778,31.141249],[121.033088,31.142208],[121.036119,31.140325],[121.036258,31.137376],[121.038649,31.136909],[121.041819,31.138899],[121.044781,31.145528],[121.041541,31.146931],[121.041472,31.14982],[121.045254,31.151582],[121.04542,31.154028],[121.049133,31.154615],[121.050273,31.150719],[121.055834,31.150659],[121.057378,31.152781],[121.062564,31.153129],[121.064135,31.150839],[121.066067,31.150947],[121.06572,31.148597],[121.069126,31.148705],[121.067777,31.152289],[121.072046,31.153512],[121.073839,31.157072],[121.077023,31.158451],[121.07605,31.160536],[121.076787,31.162622],[121.0737,31.161711],[121.07313,31.163257],[121.077371,31.16454],[121.075466,31.170316],[121.072379,31.169609],[121.072532,31.172701],[121.075424,31.173444],[121.074229,31.176225],[121.071406,31.179472],[121.071225,31.181462],[121.075591,31.182852],[121.074993,31.184386],[121.069474,31.182888],[121.068751,31.184889],[121.071684,31.185955],[121.07035,31.188735],[121.070614,31.1913],[121.07256,31.191527],[121.072185,31.193169],[121.070113,31.193612],[121.069599,31.195314],[121.06679,31.194966],[121.066609,31.197183],[121.069209,31.196524],[121.067805,31.201005],[121.065608,31.211871],[121.062633,31.224664],[121.0628,31.226964],[121.064719,31.227275],[121.064649,31.230785],[121.06718,31.230917],[121.067388,31.232929],[121.06458,31.232965],[121.062605,31.234689],[121.061243,31.237827],[121.063898,31.238438],[121.063565,31.242222],[121.064343,31.246138],[121.061646,31.24524],[121.057669,31.246749],[121.060979,31.246486],[121.061952,31.257945],[121.063245,31.267907],[121.068695,31.268098],[121.072741,31.26914],[121.080416,31.270158],[121.082154,31.271535],[121.084545,31.275713],[121.081361,31.277257],[121.084698,31.2876],[121.087326,31.290664],[121.086909,31.291717],[121.090134,31.291909],[121.093096,31.28821],[121.095404,31.287001],[121.09881,31.276251],[121.105442,31.273654],[121.103829,31.27533],[121.106666,31.276706],[121.111115,31.281746],[121.114994,31.285265],[121.117719,31.285684],[121.131053,31.280106],[121.131678,31.281363],[121.138032,31.278753],[121.137601,31.277592],[121.140535,31.276491],[121.142885,31.277664],[121.142996,31.275473],[121.150392,31.275437],[121.153743,31.276646],[121.153924,31.272061],[121.151783,31.267632],[121.155537,31.266147],[121.157845,31.270541],[121.161057,31.26762],[121.162614,31.269176],[121.167661,31.263944],[121.168036,31.259622],[121.170386,31.259119],[121.16894,31.256197],[121.171415,31.254928],[121.174251,31.256856],[121.176768,31.254605],[121.178798,31.255862],[121.17934,31.253419],[121.181537,31.254413],[121.183928,31.252246],[121.186444,31.252329],[121.188377,31.25476],[121.193021,31.253623],[121.193368,31.251455],[121.19626,31.251228],[121.19608,31.253395],[121.199848,31.255239],[121.203143,31.255814],[121.202865,31.257131],[121.206368,31.260065],[121.208482,31.25749],[121.209816,31.258017],[121.209761,31.260831],[121.212625,31.259837],[121.214182,31.254353],[121.221273,31.256293],[121.220216,31.257406],[121.223859,31.259035],[121.223539,31.260532],[121.229198,31.261717],[121.229087,31.262711],[121.235177,31.262699],[121.237693,31.262088],[121.242253,31.25937],[121.246577,31.259801],[121.246758,31.258448],[121.254183,31.258688],[121.247314,31.253287],[121.24591,31.248821],[121.241683,31.247348],[121.239932,31.241061],[121.241391,31.240222],[121.247912,31.240917],[121.249692,31.236534],[121.251082,31.238198],[121.252792,31.236965],[121.254155,31.23312],[121.257158,31.230701],[121.258006,31.226868],[121.256588,31.226329],[121.258215,31.222772],[121.25745,31.220208],[121.259675,31.218148],[121.261218,31.215081],[121.259397,31.212769],[121.263846,31.208912],[121.26468,31.206731],[121.263053,31.205701],[121.264777,31.203317],[121.266724,31.203257],[121.271701,31.198309],[121.277388,31.193576],[121.284034,31.194391],[121.287329,31.196332],[121.292126,31.200621],[121.292431,31.202514],[121.294837,31.203077],[121.297506,31.201412],[121.300565,31.197027],[121.30856,31.188388],[121.310784,31.18423],[121.316304,31.176836],[121.318042,31.173624],[121.318584,31.170256],[121.323854,31.162933]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":310120,\"name\":\"奉贤区\",\"center\":[121.458472,30.912345],\"centroid\":[121.56251,30.897998],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":310000},\"subFeatureIndex\":14,\"acroutes\":[100000,310000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[121.570475,30.998345],[121.576746,30.999474],[121.582933,30.999498],[121.584309,31.000819],[121.594682,31.000699],[121.595585,31.002043],[121.604066,31.001131],[121.614717,31.001251],[121.61772,30.995692],[121.62057,30.992678],[121.646695,30.99335],[121.654536,30.993254],[121.663115,30.992714],[121.669525,30.991609],[121.673348,30.989832],[121.674558,30.991802],[121.683595,30.989808],[121.688086,30.990145],[121.69298,30.98934],[121.699459,30.987419],[121.705507,30.984981],[121.712792,30.980934],[121.73191,30.967784],[121.733954,30.964469],[121.737916,30.960637],[121.73686,30.958703],[121.739988,30.956721],[121.743742,30.956589],[121.747857,30.951893],[121.749234,30.953046],[121.751987,30.952721],[121.759286,30.949154],[121.761024,30.947604],[121.760927,30.944613],[121.764542,30.941766],[121.761677,30.940132],[121.761469,30.938414],[121.764277,30.938522],[121.763846,30.936852],[121.766432,30.936539],[121.76799,30.93833],[121.769769,30.935278],[121.773023,30.933932],[121.77337,30.931553],[121.777806,30.931025],[121.777653,30.926723],[121.781115,30.917567],[121.780239,30.911811],[121.77896,30.910116],[121.778334,30.903807],[121.778987,30.899468],[121.778807,30.894588],[121.776012,30.886426],[121.776679,30.881005],[121.773134,30.880596],[121.772481,30.875703],[121.771605,30.875427],[121.768143,30.863272],[121.769338,30.85043],[121.793767,30.816862],[121.77914,30.817222],[121.727071,30.817716],[121.68119,30.818401],[121.648419,30.8162],[121.601327,30.805084],[121.552832,30.789395],[121.517197,30.775387],[121.478767,30.756347],[121.465072,30.776483],[121.451711,30.798323],[121.44672,30.805577],[121.445427,30.804868],[121.441645,30.806829],[121.437029,30.818101],[121.425989,30.81869],[121.420525,30.819797],[121.419288,30.81602],[121.415131,30.815803],[121.41552,30.819941],[121.414171,30.821757],[121.41235,30.821505],[121.404786,30.823081],[121.400991,30.827399],[121.400685,30.830105],[121.403632,30.829877],[121.404202,30.833797],[121.399712,30.834182],[121.397376,30.833292],[121.396986,30.827988],[121.392051,30.82782],[121.391717,30.829913],[121.387588,30.829864],[121.387588,30.832799],[121.383764,30.833906],[121.379259,30.840112],[121.379065,30.843238],[121.385446,30.843178],[121.384918,30.848073],[121.383722,30.851765],[121.384376,30.856238],[121.383472,30.859232],[121.384001,30.863488],[121.381929,30.863765],[121.381873,30.867324],[121.38286,30.869043],[121.382791,30.874489],[121.381498,30.876605],[121.382207,30.878961],[121.377535,30.879983],[121.371751,30.883698],[121.370166,30.883914],[121.367233,30.886667],[121.36327,30.886955],[121.361185,30.892977],[121.360476,30.897785],[121.358418,30.900598],[121.35668,30.908614],[121.351814,30.913217],[121.355081,30.916341],[121.356054,30.919742],[121.355373,30.921388],[121.352161,30.923803],[121.352203,30.928213],[121.35116,30.930628],[121.355679,30.932058],[121.354706,30.933512],[121.357361,30.933632],[121.359336,30.935086],[121.362658,30.934761],[121.362408,30.939122],[121.361129,30.944048],[121.363868,30.945165],[121.365467,30.947232],[121.362478,30.948901],[121.362255,30.9517],[121.363117,30.956109],[121.362853,30.959544],[121.36099,30.965574],[121.361435,30.970438],[121.359961,30.976251],[121.35871,30.97786],[121.375227,30.982832],[121.394261,30.988247],[121.409333,30.990229],[121.413184,30.991069],[121.423973,30.994515],[121.431426,30.999174],[121.433636,31.001779],[121.436834,31.00406],[121.440811,31.005789],[121.448305,31.007458],[121.459942,31.007398],[121.465587,31.008755],[121.47144,31.011948],[121.476362,31.01334],[121.485872,31.014073],[121.489153,31.014949],[121.492879,31.012752],[121.491948,31.010039],[121.495924,30.998297],[121.498872,30.998213],[121.49883,30.999426],[121.503057,31.002716],[121.507881,31.004745],[121.510412,31.004553],[121.517002,31.007626],[121.520853,31.004445],[121.522105,31.002199],[121.520089,31.00256],[121.520325,30.999354],[121.522897,30.99981],[121.528612,30.99592],[121.531962,30.994815],[121.534507,30.995848],[121.537774,30.994683],[121.538233,30.993146],[121.543294,30.994203],[121.54613,30.99305],[121.549537,30.988307],[121.55279,30.98886],[121.553304,30.993026],[121.556224,30.993374],[121.555918,30.995152],[121.561494,30.995644],[121.570475,30.998345]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":310151,\"name\":\"崇明区\",\"center\":[121.397516,31.626946],\"centroid\":[121.568484,31.635916],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":310000},\"subFeatureIndex\":15,\"acroutes\":[100000,310000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[121.975181,31.617034],[121.98825,31.529597],[121.993867,31.51189],[121.995716,31.493104],[121.991698,31.476763],[121.981813,31.4641],[121.967284,31.456656],[121.934304,31.442364],[121.918051,31.434692],[121.901144,31.430126],[121.89055,31.428788],[121.882096,31.428656],[121.87299,31.429338],[121.857807,31.430043],[121.845377,31.431895],[121.834212,31.433975],[121.819183,31.438206],[121.763443,31.458233],[121.72988,31.471973],[121.682858,31.491061],[121.670609,31.494214],[121.638645,31.49972],[121.625784,31.501775],[121.617678,31.503673],[121.608794,31.50691],[121.547673,31.531125],[121.471176,31.57443],[121.43422,31.590336],[121.414797,31.591076],[121.403521,31.590002],[121.395457,31.585444],[121.37221,31.55321],[121.345585,31.571685],[121.289109,31.616283],[121.179868,31.720774],[121.145332,31.753927],[121.142064,31.755308],[121.118498,31.759084],[121.149225,31.787294],[121.181509,31.820411],[121.200334,31.835144],[121.225305,31.847043],[121.242073,31.853397],[121.252111,31.857727],[121.265584,31.864128],[121.281336,31.869041],[121.291166,31.870992],[121.3019,31.872716],[121.310367,31.872502],[121.315859,31.871479],[121.323061,31.868529],[121.369291,31.843283],[121.376381,31.838571],[121.385043,31.833525],[121.395388,31.821291],[121.399142,31.817483],[121.405468,31.809841],[121.411488,31.806341],[121.416312,31.79764],[121.410904,31.79558],[121.420915,31.779602],[121.425781,31.774267],[121.431481,31.769266],[121.445385,31.7643],[121.449751,31.761668],[121.455576,31.759346],[121.464141,31.757142],[121.476807,31.756142],[121.487749,31.753415],[121.498566,31.75326],[121.51304,31.743695],[121.514986,31.742873],[121.526693,31.740217],[121.528361,31.738347],[121.539429,31.735499],[121.540124,31.733307],[121.549509,31.726969],[121.551386,31.727386],[121.565025,31.716711],[121.578539,31.710527],[121.592262,31.706487],[121.593249,31.705379],[121.599659,31.703115],[121.60091,31.707],[121.602746,31.70694],[121.611755,31.704283],[121.627341,31.697776],[121.633278,31.696167],[121.642649,31.697454],[121.715267,31.673842],[121.817806,31.652025],[121.887616,31.63638],[121.975181,31.617034]]],[[[121.778862,31.310196],[121.770951,31.31168],[121.76425,31.315306],[121.76076,31.320344],[121.751166,31.337801],[121.744659,31.343675],[121.740766,31.346486],[121.727933,31.354799],[121.686682,31.376591],[121.641036,31.401115],[121.601425,31.421855],[121.590371,31.427545],[121.572255,31.436066],[121.558463,31.448793],[121.549773,31.457062],[121.54328,31.462403],[121.537413,31.466704],[121.529515,31.471172],[121.516849,31.477313],[121.510134,31.482581],[121.509105,31.485352],[121.509355,31.489795],[121.513457,31.493355],[121.516933,31.494298],[121.521132,31.493976],[121.549926,31.489747],[121.562356,31.486367],[121.567347,31.4835],[121.572811,31.469452],[121.575828,31.463813],[121.58303,31.456262],[121.585561,31.454672],[121.599812,31.450681],[121.606319,31.449403],[121.621752,31.444145],[121.673835,31.427748],[121.688294,31.425883],[121.697193,31.423995],[121.708316,31.419728],[121.723707,31.412364],[121.729296,31.410356],[121.737485,31.408814],[121.742185,31.407212],[121.753725,31.400362],[121.760857,31.395185],[121.76938,31.390749],[121.774135,31.386982],[121.780572,31.380154],[121.787886,31.37164],[121.790875,31.367059],[121.792377,31.363304],[121.793002,31.355074],[121.796005,31.345624],[121.796478,31.33542],[121.795866,31.329976],[121.794073,31.319542],[121.790986,31.314313],[121.7879,31.312003],[121.782004,31.310328],[121.778862,31.310196]]],[[[122.242018,31.419082],[122.245369,31.421318],[122.247149,31.419333],[122.243562,31.417839],[122.242018,31.419082]]],[[[121.801775,31.356976],[121.800566,31.363997],[121.797674,31.369642],[121.792808,31.377571],[121.793864,31.380477],[121.796756,31.381075],[121.803458,31.381219],[121.817445,31.380585],[121.824744,31.378588],[121.828401,31.376447],[121.831752,31.375526],[121.845586,31.374582],[121.852885,31.371376],[121.858516,31.369379],[121.870376,31.366007],[121.913074,31.350445],[121.951726,31.337274],[122.001556,31.329246],[122.04107,31.323814],[122.078012,31.323527],[122.116678,31.321229],[122.121975,31.315438],[122.122684,31.307205],[122.105207,31.262136],[122.097769,31.255658],[122.087285,31.257538],[122.072005,31.266829],[122.016447,31.282285],[121.975779,31.279998],[121.932261,31.283147],[121.900755,31.291167],[121.88959,31.292028],[121.865968,31.294937],[121.860782,31.294949],[121.856681,31.292818],[121.852885,31.292364],[121.840566,31.29544],[121.833601,31.299653],[121.832043,31.301711],[121.822617,31.307372],[121.81319,31.316228],[121.806642,31.324173],[121.80375,31.328445],[121.803152,31.332106],[121.802693,31.342789],[121.801775,31.356976]]],[[[121.627049,31.444993],[121.616872,31.446643],[121.613855,31.447885],[121.594153,31.458568],[121.58627,31.464076],[121.577886,31.472486],[121.57612,31.474768],[121.575814,31.478197],[121.577149,31.479343],[121.586896,31.479535],[121.595293,31.478292],[121.602134,31.476835],[121.608571,31.474446],[121.61366,31.471339],[121.625172,31.462212],[121.631609,31.456823],[121.635044,31.452988],[121.636295,31.449881],[121.634001,31.445937],[121.631512,31.445101],[121.627049,31.444993]]]]}}]}', 'admin', '2020-12-07 19:24:11', NULL, '2020-12-07 19:24:11', '0', NULL); +INSERT INTO `jimu_report_map` VALUES ('1336859680042913794', '北京', 'beijing', '{\"type\":\"FeatureCollection\",\"features\":[{\"type\":\"Feature\",\"properties\":{\"adcode\":110101,\"name\":\"东城区\",\"center\":[116.418757,39.917544],\"centroid\":[116.416739,39.912912],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":110000},\"subFeatureIndex\":0,\"acroutes\":[100000,110000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[116.387658,39.96093],[116.389498,39.96314],[116.40788,39.962182],[116.407504,39.973995],[116.411101,39.97146],[116.411415,39.964928],[116.414196,39.962182],[116.424861,39.962279],[116.429002,39.957274],[116.429483,39.950155],[116.436698,39.949245],[116.435422,39.952121],[116.442239,39.9497],[116.440566,39.945295],[116.446338,39.946205],[116.443703,39.936663],[116.443682,39.928664],[116.434314,39.92868],[116.434983,39.913964],[116.436488,39.902042],[116.448722,39.903246],[116.446819,39.900042],[116.447154,39.894186],[116.450876,39.894088],[116.450939,39.890249],[116.444059,39.890038],[116.445648,39.879283],[116.44364,39.87284],[116.442574,39.87188],[116.423209,39.872824],[116.413652,39.871148],[116.41589,39.863645],[116.41246,39.858942],[116.406856,39.859967],[116.3955,39.858682],[116.394956,39.862734],[116.387888,39.867372],[116.380632,39.866054],[116.38059,39.871148],[116.399097,39.872205],[116.397612,39.898675],[116.396086,39.89944],[116.395563,39.907995],[116.392259,39.907881],[116.392175,39.92242],[116.399474,39.923574],[116.396692,39.928306],[116.396169,39.94006],[116.394266,39.940629],[116.393723,39.957371],[116.38678,39.957014],[116.387658,39.96093]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":110102,\"name\":\"西城区\",\"center\":[116.366794,39.915309],\"centroid\":[116.365684,39.912236],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":110000},\"subFeatureIndex\":1,\"acroutes\":[100000,110000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[116.380903,39.972712],[116.394099,39.972858],[116.394162,39.969397],[116.390084,39.968406],[116.387658,39.96093],[116.38678,39.957014],[116.393723,39.957371],[116.394266,39.940629],[116.396169,39.94006],[116.396692,39.928306],[116.399474,39.923574],[116.392175,39.92242],[116.392259,39.907881],[116.395563,39.907995],[116.396086,39.89944],[116.397612,39.898675],[116.399097,39.872205],[116.38059,39.871148],[116.35058,39.86869],[116.349472,39.873588],[116.344286,39.873653],[116.341567,39.876159],[116.335273,39.875183],[116.326636,39.876859],[116.321345,39.875004],[116.325799,39.896789],[116.337301,39.89739],[116.335356,39.898448],[116.334645,39.922664],[116.333056,39.938565],[116.327953,39.942369],[116.332889,39.944092],[116.341442,39.941979],[116.35171,39.94375],[116.351814,39.950854],[116.355265,39.951796],[116.35698,39.944466],[116.371974,39.948594],[116.370384,39.967902],[116.380401,39.968178],[116.380903,39.972712]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":110105,\"name\":\"朝阳区\",\"center\":[116.486409,39.921489],\"centroid\":[116.513687,39.951064],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":110000},\"subFeatureIndex\":2,\"acroutes\":[100000,110000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[116.595548,40.01751],[116.60132,40.013873],[116.61989,40.011794],[116.628129,40.007653],[116.625766,40.003122],[116.63273,39.999825],[116.637582,40.002359],[116.642684,39.996755],[116.643751,39.989608],[116.640321,39.990177],[116.639129,39.986879],[116.63365,39.986197],[116.634026,39.981696],[116.639819,39.982606],[116.641827,39.969575],[116.643081,39.952983],[116.645277,39.945977],[116.632228,39.950545],[116.630492,39.946156],[116.633441,39.940906],[116.629677,39.938727],[116.6293,39.931314],[116.624156,39.929981],[116.630576,39.921672],[116.620956,39.923103],[116.623006,39.913818],[116.620245,39.90767],[116.623361,39.904271],[116.621019,39.898854],[116.61531,39.895503],[116.615603,39.889794],[116.627585,39.890477],[116.628987,39.881594],[116.624323,39.881155],[116.62493,39.87725],[116.619994,39.868951],[116.626958,39.860683],[116.613449,39.850185],[116.604185,39.850071],[116.604666,39.846132],[116.608367,39.846539],[116.601905,39.840727],[116.60224,39.831675],[116.598977,39.831659],[116.599228,39.825585],[116.59147,39.826367],[116.591595,39.823875],[116.583732,39.824917],[116.587015,39.828223],[116.577479,39.827539],[116.577145,39.830682],[116.569386,39.833498],[116.558596,39.834687],[116.543664,39.835078],[116.542681,39.830209],[116.533187,39.832733],[116.538143,39.828207],[116.534944,39.82482],[116.525868,39.826904],[116.525366,39.829754],[116.516164,39.829835],[116.510602,39.827637],[116.510142,39.821449],[116.502801,39.819006],[116.505813,39.817866],[116.498201,39.8157],[116.495357,39.818795],[116.485632,39.816889],[116.485256,39.81272],[116.474256,39.809772],[116.468463,39.814511],[116.462775,39.815945],[116.452737,39.823012],[116.443912,39.82096],[116.44592,39.826692],[116.436677,39.827425],[116.43699,39.830649],[116.430068,39.830112],[116.425217,39.831903],[116.432055,39.832929],[116.436739,39.841329],[116.440587,39.839653],[116.442323,39.843674],[116.446694,39.84426],[116.445983,39.848329],[116.450479,39.848704],[116.451148,39.852008],[116.460308,39.848622],[116.467794,39.856012],[116.463319,39.856224],[116.456062,39.86122],[116.454222,39.859381],[116.448178,39.863645],[116.446359,39.860862],[116.442971,39.866087],[116.44364,39.87284],[116.445648,39.879283],[116.444059,39.890038],[116.450939,39.890249],[116.450876,39.894088],[116.447154,39.894186],[116.446819,39.900042],[116.448722,39.903246],[116.436488,39.902042],[116.434983,39.913964],[116.434314,39.92868],[116.443682,39.928664],[116.443703,39.936663],[116.446338,39.946205],[116.440566,39.945295],[116.442239,39.9497],[116.435422,39.952121],[116.436698,39.949245],[116.429483,39.950155],[116.429002,39.957274],[116.424861,39.962279],[116.414196,39.962182],[116.411415,39.964928],[116.411101,39.97146],[116.407504,39.973995],[116.40788,39.962182],[116.389498,39.96314],[116.387658,39.96093],[116.390084,39.968406],[116.394162,39.969397],[116.394099,39.972858],[116.380903,39.972712],[116.381196,39.977976],[116.376554,39.992971],[116.350873,40.0267],[116.378708,40.031181],[116.395103,40.032854],[116.390251,40.036587],[116.390649,40.041279],[116.39297,40.041733],[116.395333,40.036766],[116.405266,40.038974],[116.408884,40.043291],[116.406124,40.049768],[116.409595,40.055626],[116.415618,40.056],[116.433268,40.06228],[116.442867,40.061323],[116.451629,40.058759],[116.45142,40.06129],[116.459408,40.059992],[116.462127,40.06731],[116.458635,40.070377],[116.458823,40.075796],[116.462608,40.076786],[116.461855,40.080825],[116.466247,40.08235],[116.466832,40.090185],[116.471015,40.08939],[116.473545,40.085562],[116.482935,40.083745],[116.486657,40.081036],[116.49933,40.080387],[116.506775,40.074352],[116.513948,40.070426],[116.525993,40.071334],[116.534379,40.066791],[116.543183,40.059408],[116.547784,40.062718],[116.551757,40.059765],[116.552761,40.05488],[116.54655,40.048956],[116.550753,40.045499],[116.564242,40.039655],[116.570474,40.032431],[116.578797,40.033097],[116.577814,40.027512],[116.595548,40.01751]]],[[[116.603683,40.052949],[116.598517,40.052543],[116.601633,40.047658],[116.599417,40.047171],[116.599814,40.041408],[116.590006,40.043616],[116.591198,40.051796],[116.587957,40.05053],[116.590131,40.056162],[116.586597,40.074336],[116.58139,40.073817],[116.581411,40.067846],[116.578149,40.076461],[116.574322,40.096138],[116.574071,40.107815],[116.578316,40.102739],[116.580365,40.088352],[116.595903,40.090218],[116.598705,40.09351],[116.598392,40.103874],[116.602909,40.093883],[116.603473,40.086811],[116.608409,40.054912],[116.603683,40.052949]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":110106,\"name\":\"丰台区\",\"center\":[116.286968,39.863642],\"centroid\":[116.250298,39.83569],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":110000},\"subFeatureIndex\":3,\"acroutes\":[100000,110000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[116.167033,39.888752],[116.179099,39.882684],[116.19035,39.881529],[116.199426,39.883286],[116.20457,39.879885],[116.208126,39.874125],[116.212099,39.874679],[116.210907,39.878079],[116.219105,39.876713],[116.219523,39.881334],[116.222952,39.883986],[116.22772,39.883839],[116.227783,39.889078],[116.234642,39.88955],[116.233534,39.89212],[116.252899,39.896382],[116.259089,39.896658],[116.266199,39.896252],[116.294975,39.896496],[116.294995,39.886735],[116.29922,39.889566],[116.30656,39.890883],[116.30449,39.892478],[116.313189,39.896772],[116.325799,39.896789],[116.321345,39.875004],[116.326636,39.876859],[116.335273,39.875183],[116.341567,39.876159],[116.344286,39.873653],[116.349472,39.873588],[116.35058,39.86869],[116.38059,39.871148],[116.380632,39.866054],[116.387888,39.867372],[116.394956,39.862734],[116.3955,39.858682],[116.406856,39.859967],[116.41246,39.858942],[116.41589,39.863645],[116.413652,39.871148],[116.423209,39.872824],[116.442574,39.87188],[116.44364,39.87284],[116.442971,39.866087],[116.446359,39.860862],[116.448178,39.863645],[116.454222,39.859381],[116.456062,39.86122],[116.463319,39.856224],[116.467794,39.856012],[116.460308,39.848622],[116.451148,39.852008],[116.450479,39.848704],[116.445983,39.848329],[116.446694,39.84426],[116.442323,39.843674],[116.440587,39.839653],[116.436739,39.841329],[116.432055,39.832929],[116.425217,39.831903],[116.420072,39.826611],[116.415785,39.829428],[116.414426,39.824282],[116.418441,39.822915],[116.419759,39.815375],[116.41016,39.817052],[116.410013,39.811336],[116.415262,39.812525],[116.417772,39.81013],[116.422456,39.81044],[116.425719,39.805358],[116.429399,39.803583],[116.429274,39.794102],[116.421034,39.794134],[116.42024,39.787439],[116.396023,39.786738],[116.397905,39.781068],[116.398888,39.765864],[116.391903,39.765277],[116.390649,39.780465],[116.385609,39.778852],[116.379209,39.77939],[116.378478,39.785646],[116.367582,39.784962],[116.365742,39.794151],[116.368189,39.794819],[116.367039,39.79982],[116.356833,39.800471],[116.355704,39.805668],[116.341755,39.807589],[116.340124,39.802149],[116.328225,39.801416],[116.326824,39.798386],[116.322872,39.798386],[116.321784,39.783626],[116.317978,39.783447],[116.31068,39.772057],[116.307062,39.770085],[116.301541,39.774941],[116.295205,39.790958],[116.291148,39.793271],[116.296083,39.795568],[116.289182,39.795894],[116.287237,39.799103],[116.27423,39.796936],[116.262184,39.792782],[116.259298,39.797621],[116.251519,39.793059],[116.250933,39.801432],[116.25361,39.807231],[116.251644,39.81329],[116.244304,39.818567],[116.243007,39.825145],[116.23962,39.826872],[116.228306,39.827197],[116.227219,39.825048],[116.214127,39.824706],[116.214462,39.818974],[116.216762,39.816905],[116.207415,39.810814],[116.208063,39.806352],[116.201852,39.799657],[116.201852,39.788269],[116.200388,39.778151],[116.194449,39.778493],[116.194407,39.780579],[116.188008,39.781785],[116.183365,39.780204],[116.182989,39.783707],[116.16971,39.784278],[116.166113,39.775039],[116.159923,39.767494],[116.150554,39.766565],[116.143444,39.764381],[116.133427,39.766336],[116.12847,39.762409],[116.121465,39.761626],[116.117491,39.77336],[116.121486,39.779047],[116.124351,39.77675],[116.127467,39.779047],[116.132569,39.778624],[116.131503,39.783121],[116.125062,39.785353],[116.120754,39.784848],[116.119792,39.789654],[116.106366,39.788612],[116.107014,39.78532],[116.101368,39.78576],[116.094613,39.781557],[116.091581,39.784082],[116.091916,39.787927],[116.0856,39.795324],[116.087127,39.803289],[116.084826,39.811596],[116.086186,39.816401],[116.089594,39.816352],[116.088214,39.82692],[116.089741,39.829721],[116.085747,39.832163],[116.084366,39.828581],[116.078615,39.831593],[116.07619,39.837015],[116.068975,39.840792],[116.061488,39.841899],[116.05465,39.845953],[116.056553,39.85095],[116.070982,39.853717],[116.070188,39.860423],[116.067344,39.865761],[116.07046,39.868446],[116.078323,39.870318],[116.087169,39.866152],[116.095826,39.869032],[116.104149,39.868837],[116.105425,39.872547],[116.112242,39.873247],[116.119729,39.877477],[116.125898,39.877949],[116.13167,39.881268],[116.147605,39.885287],[116.150972,39.884051],[116.156137,39.889029],[116.163352,39.886881],[116.167033,39.888752]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":110107,\"name\":\"石景山区\",\"center\":[116.195445,39.914601],\"centroid\":[116.176243,39.9332],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":110000},\"subFeatureIndex\":4,\"acroutes\":[100000,110000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[116.259089,39.896658],[116.252899,39.896382],[116.233534,39.89212],[116.234642,39.88955],[116.227783,39.889078],[116.22772,39.883839],[116.222952,39.883986],[116.219523,39.881334],[116.219105,39.876713],[116.210907,39.878079],[116.212099,39.874679],[116.208126,39.874125],[116.20457,39.879885],[116.199426,39.883286],[116.19035,39.881529],[116.179099,39.882684],[116.167033,39.888752],[116.161094,39.896805],[116.153503,39.900985],[116.152792,39.906629],[116.146852,39.910077],[116.139282,39.922095],[116.13029,39.924518],[116.127341,39.926615],[116.127822,39.930338],[116.124769,39.934907],[116.119875,39.932761],[116.11195,39.942921],[116.114522,39.949196],[116.120545,39.951],[116.115254,39.957745],[116.120712,39.96119],[116.122971,39.967561],[116.116592,39.971932],[116.113455,39.981518],[116.118934,39.986115],[116.144678,39.989186],[116.151579,39.993442],[116.156117,39.989137],[116.158124,39.984133],[116.166845,39.987561],[116.169229,39.979357],[116.171487,39.977001],[116.178012,39.982216],[116.178911,39.988292],[116.186586,39.983906],[116.18531,39.977976],[116.185812,39.970274],[116.190685,39.968259],[116.190747,39.965367],[116.20112,39.961109],[116.212831,39.948952],[116.215466,39.94375],[116.216281,39.936386],[116.213186,39.933232],[116.216198,39.931233],[116.213061,39.928891],[116.215696,39.927103],[116.207707,39.9259],[116.206787,39.916663],[116.230899,39.919525],[116.232426,39.91694],[116.237696,39.918452],[116.250975,39.919834],[116.252983,39.915558],[116.252983,39.896951],[116.259089,39.896658]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":110108,\"name\":\"海淀区\",\"center\":[116.310316,39.956074],\"centroid\":[116.233161,40.026971],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":110000},\"subFeatureIndex\":5,\"acroutes\":[100000,110000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[116.259089,39.896658],[116.252983,39.896951],[116.252983,39.915558],[116.250975,39.919834],[116.237696,39.918452],[116.232426,39.91694],[116.230899,39.919525],[116.206787,39.916663],[116.207707,39.9259],[116.215696,39.927103],[116.213061,39.928891],[116.216198,39.931233],[116.213186,39.933232],[116.216281,39.936386],[116.215466,39.94375],[116.212831,39.948952],[116.20112,39.961109],[116.190747,39.965367],[116.190685,39.968259],[116.185812,39.970274],[116.18531,39.977976],[116.186586,39.983906],[116.178911,39.988292],[116.178012,39.982216],[116.171487,39.977001],[116.169229,39.979357],[116.166845,39.987561],[116.158124,39.984133],[116.156117,39.989137],[116.151579,39.993442],[116.154527,39.997275],[116.161658,39.999987],[116.172115,40.000637],[116.175335,40.006403],[116.164774,40.014328],[116.163938,40.016796],[116.157309,40.021034],[116.149278,40.022154],[116.140098,40.02873],[116.129558,40.0311],[116.123598,40.029655],[116.114522,40.033],[116.105488,40.032204],[116.098398,40.033811],[116.095073,40.031782],[116.084241,40.030905],[116.078176,40.032756],[116.075123,40.039915],[116.068055,40.051926],[116.071129,40.062037],[116.064981,40.067456],[116.064019,40.073022],[116.054587,40.07823],[116.051325,40.084345],[116.048878,40.085303],[116.051848,40.091661],[116.055905,40.09643],[116.061969,40.09956],[116.062931,40.10282],[116.069456,40.104912],[116.072676,40.109258],[116.073847,40.115436],[116.077883,40.115047],[116.08445,40.120252],[116.089783,40.119327],[116.096056,40.121257],[116.102246,40.115987],[116.105864,40.118014],[116.113309,40.115598],[116.127676,40.116393],[116.132214,40.115079],[116.132925,40.121354],[116.152708,40.121776],[116.169563,40.124564],[116.167409,40.128455],[116.17178,40.127936],[116.168622,40.135442],[116.167681,40.141844],[116.174122,40.143595],[116.180417,40.14729],[116.183094,40.153335],[116.182696,40.158099],[116.192065,40.155669],[116.194282,40.160076],[116.202166,40.160984],[116.203211,40.153773],[116.205658,40.150175],[116.206285,40.143092],[116.212224,40.140548],[116.215445,40.143174],[116.233785,40.136577],[116.247043,40.136204],[116.245036,40.118825],[116.241836,40.118403],[116.243363,40.113279],[116.240498,40.108009],[116.245956,40.10535],[116.252732,40.106517],[116.255868,40.104474],[116.25957,40.106907],[116.258022,40.11195],[116.263334,40.110588],[116.263899,40.10402],[116.258273,40.101522],[116.265237,40.094694],[116.27333,40.09557],[116.2731,40.092699],[116.279897,40.079754],[116.290353,40.083145],[116.302942,40.060803],[116.305995,40.063043],[116.309446,40.060609],[116.318292,40.061663],[116.325946,40.054799],[116.338828,40.058921],[116.340271,40.055091],[116.343366,40.055448],[116.342676,40.059635],[116.346963,40.06043],[116.34667,40.063659],[116.357293,40.066012],[116.363023,40.065931],[116.363149,40.068965],[116.372538,40.06843],[116.373354,40.065623],[116.381928,40.066402],[116.382848,40.061582],[116.379272,40.059002],[116.372267,40.05785],[116.372999,40.054344],[116.367394,40.053436],[116.36959,40.04696],[116.376114,40.045466],[116.376888,40.042756],[116.38519,40.042853],[116.390649,40.041279],[116.390251,40.036587],[116.395103,40.032854],[116.378708,40.031181],[116.350873,40.0267],[116.376554,39.992971],[116.381196,39.977976],[116.380903,39.972712],[116.380401,39.968178],[116.370384,39.967902],[116.371974,39.948594],[116.35698,39.944466],[116.355265,39.951796],[116.351814,39.950854],[116.35171,39.94375],[116.341442,39.941979],[116.332889,39.944092],[116.327953,39.942369],[116.333056,39.938565],[116.334645,39.922664],[116.335356,39.898448],[116.337301,39.89739],[116.325799,39.896789],[116.313189,39.896772],[116.30449,39.892478],[116.30656,39.890883],[116.29922,39.889566],[116.294995,39.886735],[116.294975,39.896496],[116.266199,39.896252],[116.259089,39.896658]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":110109,\"name\":\"门头沟区\",\"center\":[116.105381,39.937183],\"centroid\":[115.791703,39.994114],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":110000},\"subFeatureIndex\":6,\"acroutes\":[100000,110000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[115.853348,40.149332],[115.856547,40.147468],[115.865184,40.148635],[115.870768,40.144276],[115.874155,40.14387],[115.8816,40.139073],[115.900442,40.138716],[115.904457,40.136123],[115.906549,40.138181],[115.921438,40.134485],[115.933588,40.124824],[115.947913,40.107409],[115.943229,40.103339],[115.952681,40.10102],[115.956717,40.096041],[115.957449,40.100679],[115.962552,40.10235],[115.962092,40.094419],[115.960461,40.092456],[115.966588,40.084556],[115.968575,40.075488],[115.977232,40.079041],[115.979993,40.081669],[115.986434,40.083469],[115.99735,40.082074],[116.005129,40.079803],[116.007785,40.080614],[116.020856,40.074579],[116.030914,40.082188],[116.033926,40.079657],[116.037899,40.084524],[116.043775,40.083502],[116.048878,40.085303],[116.051325,40.084345],[116.054587,40.07823],[116.064019,40.073022],[116.064981,40.067456],[116.071129,40.062037],[116.068055,40.051926],[116.075123,40.039915],[116.078176,40.032756],[116.084241,40.030905],[116.095073,40.031782],[116.098398,40.033811],[116.105488,40.032204],[116.114522,40.033],[116.123598,40.029655],[116.129558,40.0311],[116.140098,40.02873],[116.149278,40.022154],[116.157309,40.021034],[116.163938,40.016796],[116.164774,40.014328],[116.175335,40.006403],[116.172115,40.000637],[116.161658,39.999987],[116.154527,39.997275],[116.151579,39.993442],[116.144678,39.989186],[116.118934,39.986115],[116.113455,39.981518],[116.116592,39.971932],[116.122971,39.967561],[116.120712,39.96119],[116.115254,39.957745],[116.120545,39.951],[116.114522,39.949196],[116.11195,39.942921],[116.119875,39.932761],[116.124769,39.934907],[116.127822,39.930338],[116.127341,39.926615],[116.13029,39.924518],[116.139282,39.922095],[116.146852,39.910077],[116.152792,39.906629],[116.153503,39.900985],[116.161094,39.896805],[116.167033,39.888752],[116.163352,39.886881],[116.156137,39.889029],[116.150972,39.884051],[116.147605,39.885287],[116.13167,39.881268],[116.125898,39.877949],[116.119729,39.877477],[116.112242,39.873247],[116.105425,39.872547],[116.104149,39.868837],[116.095826,39.869032],[116.087169,39.866152],[116.078323,39.870318],[116.07046,39.868446],[116.067344,39.865761],[116.070188,39.860423],[116.070982,39.853717],[116.056553,39.85095],[116.05465,39.845953],[116.045825,39.84732],[116.04181,39.844878],[116.033089,39.845904],[116.030308,39.843462],[116.021023,39.840662],[116.018367,39.841525],[116.016694,39.849225],[116.00789,39.849469],[115.991285,39.840222],[115.98428,39.849111],[115.98817,39.859837],[115.986789,39.864703],[115.992875,39.867356],[115.997245,39.875167],[115.990177,39.876338],[115.97627,39.870497],[115.976563,39.868251],[115.968742,39.867714],[115.967822,39.872059],[115.961318,39.867877],[115.954145,39.866786],[115.949837,39.871278],[115.92744,39.876192],[115.921856,39.884164],[115.935805,39.898236],[115.944965,39.901847],[115.945697,39.910972],[115.941159,39.917509],[115.935868,39.917753],[115.927858,39.914257],[115.903935,39.914029],[115.890112,39.917281],[115.87884,39.915964],[115.87311,39.912484],[115.868321,39.905572],[115.860897,39.901359],[115.845255,39.897049],[115.838772,39.900644],[115.835112,39.899586],[115.826914,39.910581],[115.8188,39.913948],[115.811084,39.913785],[115.806839,39.919656],[115.797344,39.92216],[115.792848,39.920859],[115.774257,39.920599],[115.769385,39.925233],[115.76148,39.920989],[115.749622,39.917655],[115.74889,39.9152],[115.731261,39.907865],[115.721621,39.906824],[115.719592,39.904612],[115.709178,39.905117],[115.691779,39.8997],[115.68929,39.896187],[115.682556,39.893047],[115.678144,39.886556],[115.671055,39.88597],[115.667541,39.883888],[115.654869,39.882505],[115.648867,39.875411],[115.644705,39.875964],[115.640021,39.871554],[115.630987,39.871977],[115.623103,39.866949],[115.621973,39.863271],[115.616369,39.857542],[115.613086,39.843755],[115.607586,39.84089],[115.604533,39.834443],[115.599325,39.829151],[115.596649,39.821498],[115.59117,39.818534],[115.587322,39.813762],[115.577367,39.812541],[115.569274,39.813274],[115.563461,39.816417],[115.548027,39.822703],[115.546396,39.825992],[115.534957,39.830714],[115.530482,39.829916],[115.526509,39.835241],[115.514505,39.83835],[115.510992,39.84509],[115.515948,39.847678],[115.522368,39.858779],[115.521929,39.868186],[115.527345,39.869862],[115.529185,39.875948],[115.526299,39.875655],[115.516659,39.880406],[115.51003,39.88148],[115.509026,39.884164],[115.523016,39.898919],[115.52013,39.902547],[115.50386,39.915818],[115.494994,39.917948],[115.487277,39.923835],[115.48069,39.93585],[115.472387,39.93876],[115.464462,39.940142],[115.456787,39.944271],[115.452312,39.948188],[115.447042,39.948806],[115.444595,39.951358],[115.438468,39.95256],[115.43577,39.950919],[115.42615,39.95035],[115.423745,39.955697],[115.426924,39.965302],[115.423411,39.969819],[115.427635,39.979471],[115.428513,39.984328],[115.436815,39.991427],[115.443905,39.994644],[115.450346,39.993247],[115.449196,40.001985],[115.442817,40.007345],[115.442169,40.010885],[115.452082,40.02079],[115.454528,40.029704],[115.460656,40.032172],[115.468414,40.031896],[115.478557,40.036165],[115.488992,40.043746],[115.488323,40.046132],[115.500954,40.052478],[115.510427,40.062913],[115.509695,40.065477],[115.514944,40.066937],[115.527324,40.076072],[115.537885,40.077775],[115.544263,40.07591],[115.552168,40.079252],[115.555472,40.082626],[115.553736,40.091661],[115.563419,40.097922],[115.567769,40.096543],[115.576196,40.100825],[115.578538,40.096365],[115.584038,40.094889],[115.590709,40.096397],[115.592403,40.110182],[115.594432,40.108982],[115.59485,40.116279],[115.599116,40.120008],[115.606979,40.120057],[115.616223,40.117138],[115.621388,40.118711],[115.625048,40.116295],[115.631468,40.117852],[115.635943,40.115793],[115.643722,40.117511],[115.641882,40.120819],[115.64458,40.126639],[115.654806,40.131276],[115.657734,40.128098],[115.678667,40.130935],[115.681197,40.13267],[115.68699,40.13053],[115.693096,40.131924],[115.697216,40.12672],[115.702172,40.128196],[115.712064,40.126899],[115.711039,40.128941],[115.704765,40.129655],[115.699746,40.132394],[115.708697,40.134291],[115.715891,40.133383],[115.724841,40.128812],[115.734126,40.129379],[115.741111,40.132216],[115.749246,40.137711],[115.75485,40.145459],[115.749539,40.152995],[115.754328,40.163252],[115.762212,40.16262],[115.768213,40.165553],[115.773023,40.176197],[115.787014,40.178708],[115.78693,40.170414],[115.789837,40.168939],[115.802091,40.156754],[115.806567,40.153254],[115.822272,40.152606],[115.829047,40.149981],[115.83576,40.145426],[115.834234,40.15024],[115.846384,40.147096],[115.853348,40.149332]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":110111,\"name\":\"房山区\",\"center\":[116.139157,39.735535],\"centroid\":[115.853935,39.719211],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":110000},\"subFeatureIndex\":7,\"acroutes\":[100000,110000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[116.05465,39.845953],[116.061488,39.841899],[116.068975,39.840792],[116.07619,39.837015],[116.078615,39.831593],[116.084366,39.828581],[116.085747,39.832163],[116.089741,39.829721],[116.088214,39.82692],[116.089594,39.816352],[116.086186,39.816401],[116.084826,39.811596],[116.087127,39.803289],[116.0856,39.795324],[116.091916,39.787927],[116.091581,39.784082],[116.094613,39.781557],[116.101368,39.78576],[116.107014,39.78532],[116.106366,39.788612],[116.119792,39.789654],[116.120754,39.784848],[116.125062,39.785353],[116.131503,39.783121],[116.132569,39.778624],[116.127467,39.779047],[116.124351,39.77675],[116.121486,39.779047],[116.117491,39.77336],[116.121465,39.761626],[116.12847,39.762409],[116.133427,39.766336],[116.143444,39.764381],[116.150554,39.766565],[116.159923,39.767494],[116.166113,39.775039],[116.16971,39.784278],[116.182989,39.783707],[116.183365,39.780204],[116.188008,39.781785],[116.194407,39.780579],[116.194449,39.778493],[116.200388,39.778151],[116.201852,39.788269],[116.201852,39.799657],[116.208063,39.806352],[116.207415,39.810814],[116.216762,39.816905],[116.214462,39.818974],[116.214127,39.824706],[116.227219,39.825048],[116.228306,39.827197],[116.23962,39.826872],[116.243007,39.825145],[116.244304,39.818567],[116.251644,39.81329],[116.25361,39.807231],[116.250933,39.801432],[116.251519,39.793059],[116.251602,39.782518],[116.253777,39.77952],[116.252481,39.771747],[116.254426,39.76324],[116.252481,39.758676],[116.251895,39.749092],[116.243948,39.741658],[116.248026,39.732641],[116.248466,39.728027],[116.245768,39.72408],[116.245036,39.718421],[116.236629,39.71286],[116.231945,39.706025],[116.23435,39.703823],[116.230941,39.692355],[116.221238,39.678453],[116.22565,39.67359],[116.221342,39.667486],[116.223162,39.664728],[116.216992,39.651572],[116.215487,39.64305],[116.218875,39.628011],[116.219502,39.618931],[116.21808,39.608102],[116.223141,39.597222],[116.222597,39.593938],[116.226089,39.591993],[116.225085,39.584085],[116.221175,39.578921],[116.208105,39.577728],[116.206243,39.583219],[116.201726,39.586373],[116.196394,39.586095],[116.196854,39.588987],[116.19058,39.587386],[116.190768,39.589396],[116.184432,39.590915],[116.177071,39.590016],[116.176924,39.585899],[116.165527,39.583562],[116.151788,39.583415],[116.149613,39.573087],[116.13878,39.571044],[116.138425,39.568887],[116.130373,39.567743],[116.130311,39.569459],[116.121528,39.570554],[116.121465,39.574917],[116.116634,39.574002],[116.11379,39.570668],[116.106282,39.570979],[116.105801,39.576568],[116.101368,39.580049],[116.102016,39.576143],[116.098817,39.575146],[116.039237,39.571943],[116.032964,39.572302],[116.032859,39.574607],[116.024766,39.575604],[116.02623,39.587402],[116.020667,39.585981],[116.014038,39.588072],[116.013703,39.583039],[116.010588,39.583023],[116.007618,39.577205],[115.995196,39.577075],[115.996953,39.583203],[115.990721,39.586471],[115.990993,39.593791],[115.978445,39.595686],[115.977086,39.590931],[115.978153,39.572842],[115.974576,39.570832],[115.968909,39.570995],[115.967592,39.564604],[115.963409,39.565503],[115.957554,39.560927],[115.954982,39.566092],[115.950423,39.56637],[115.949147,39.573299],[115.943083,39.574672],[115.943187,39.577385],[115.937938,39.577467],[115.938105,39.581699],[115.934969,39.581814],[115.934174,39.588072],[115.929991,39.589935],[115.930221,39.593382],[115.924178,39.59384],[115.923759,39.597287],[115.912488,39.599149],[115.910187,39.600832],[115.9068,39.590016],[115.909665,39.588284],[115.908744,39.58402],[115.915604,39.582958],[115.911777,39.574182],[115.91276,39.572842],[115.907866,39.566876],[115.896009,39.569916],[115.890028,39.567873],[115.893416,39.561875],[115.89306,39.556219],[115.888752,39.555614],[115.887686,39.55066],[115.883587,39.551102],[115.88296,39.54811],[115.873298,39.548829],[115.872315,39.546099],[115.866355,39.546361],[115.866041,39.549843],[115.862026,39.548551],[115.855481,39.554993],[115.851361,39.550448],[115.847555,39.550284],[115.846028,39.543287],[115.84216,39.54157],[115.828692,39.541309],[115.828399,39.535455],[115.824321,39.534212],[115.822753,39.530533],[115.819219,39.530762],[115.819804,39.524923],[115.824112,39.522405],[115.824447,39.518774],[115.819762,39.518528],[115.822146,39.514145],[115.829487,39.512885],[115.828692,39.507045],[115.821456,39.509499],[115.792681,39.510742],[115.785006,39.51035],[115.777917,39.513834],[115.776537,39.512722],[115.767419,39.515862],[115.770828,39.510971],[115.768736,39.508878],[115.765328,39.514848],[115.759451,39.513916],[115.752508,39.515453],[115.743934,39.526771],[115.741487,39.536289],[115.73879,39.539314],[115.739124,39.545363],[115.726765,39.548143],[115.726953,39.543908],[115.7216,39.543499],[115.72022,39.554747],[115.717104,39.560403],[115.710161,39.563019],[115.698722,39.563248],[115.692072,39.565781],[115.694393,39.56941],[115.698596,39.570586],[115.697906,39.579248],[115.693431,39.580327],[115.694226,39.587778],[115.689269,39.592941],[115.68929,39.599035],[115.685317,39.603675],[115.673271,39.608526],[115.667479,39.615256],[115.667583,39.609637],[115.665304,39.605325],[115.657273,39.600081],[115.650268,39.600996],[115.643576,39.598937],[115.641589,39.603332],[115.634688,39.603871],[115.632555,39.597695],[115.625947,39.599394],[115.618439,39.604067],[115.6125,39.601126],[115.605285,39.600032],[115.599785,39.600865],[115.598719,39.597761],[115.592445,39.59665],[115.586109,39.589412],[115.571867,39.591569],[115.573875,39.596552],[115.567267,39.599623],[115.564569,39.605619],[115.55451,39.609408],[115.551875,39.614064],[115.545978,39.618751],[115.539119,39.616285],[115.533263,39.611434],[115.533891,39.608608],[115.530586,39.602874],[115.524229,39.598937],[115.518311,39.597156],[115.518834,39.593072],[115.515948,39.591193],[115.512121,39.605129],[115.514358,39.613508],[115.523414,39.620384],[115.521699,39.622311],[115.520423,39.633416],[115.522452,39.639964],[115.515864,39.641237],[115.511493,39.644388],[115.506705,39.652127],[115.496771,39.652551],[115.494659,39.649237],[115.478515,39.650331],[115.477971,39.654216],[115.482593,39.66303],[115.491334,39.668694],[115.486733,39.673362],[115.489724,39.678012],[115.488783,39.681619],[115.494408,39.686481],[115.496395,39.685665],[115.499783,39.691278],[115.49926,39.696189],[115.492631,39.701719],[115.490247,39.701409],[115.493404,39.707494],[115.491229,39.714719],[115.488866,39.733163],[115.492108,39.73887],[115.482321,39.742473],[115.470568,39.742391],[115.46672,39.740451],[115.457728,39.744918],[115.439158,39.752678],[115.434411,39.763859],[115.435414,39.769938],[115.430918,39.772073],[115.427029,39.769775],[115.425209,39.77336],[115.431169,39.775756],[115.434076,39.782274],[115.443382,39.785646],[115.452751,39.781964],[115.45777,39.782143],[115.475859,39.791821],[115.483241,39.798679],[115.49238,39.796057],[115.497336,39.791088],[115.508712,39.784082],[115.513815,39.788693],[115.536275,39.792131],[115.539432,39.794754],[115.554866,39.795601],[115.56229,39.803713],[115.566577,39.804609],[115.566367,39.809788],[115.569274,39.813274],[115.577367,39.812541],[115.587322,39.813762],[115.59117,39.818534],[115.596649,39.821498],[115.599325,39.829151],[115.604533,39.834443],[115.607586,39.84089],[115.613086,39.843755],[115.616369,39.857542],[115.621973,39.863271],[115.623103,39.866949],[115.630987,39.871977],[115.640021,39.871554],[115.644705,39.875964],[115.648867,39.875411],[115.654869,39.882505],[115.667541,39.883888],[115.671055,39.88597],[115.678144,39.886556],[115.682556,39.893047],[115.68929,39.896187],[115.691779,39.8997],[115.709178,39.905117],[115.719592,39.904612],[115.721621,39.906824],[115.731261,39.907865],[115.74889,39.9152],[115.749622,39.917655],[115.76148,39.920989],[115.769385,39.925233],[115.774257,39.920599],[115.792848,39.920859],[115.797344,39.92216],[115.806839,39.919656],[115.811084,39.913785],[115.8188,39.913948],[115.826914,39.910581],[115.835112,39.899586],[115.838772,39.900644],[115.845255,39.897049],[115.860897,39.901359],[115.868321,39.905572],[115.87311,39.912484],[115.87884,39.915964],[115.890112,39.917281],[115.903935,39.914029],[115.927858,39.914257],[115.935868,39.917753],[115.941159,39.917509],[115.945697,39.910972],[115.944965,39.901847],[115.935805,39.898236],[115.921856,39.884164],[115.92744,39.876192],[115.949837,39.871278],[115.954145,39.866786],[115.961318,39.867877],[115.967822,39.872059],[115.968742,39.867714],[115.976563,39.868251],[115.97627,39.870497],[115.990177,39.876338],[115.997245,39.875167],[115.992875,39.867356],[115.986789,39.864703],[115.98817,39.859837],[115.98428,39.849111],[115.991285,39.840222],[116.00789,39.849469],[116.016694,39.849225],[116.018367,39.841525],[116.021023,39.840662],[116.030308,39.843462],[116.033089,39.845904],[116.04181,39.844878],[116.045825,39.84732],[116.05465,39.845953]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":110112,\"name\":\"通州区\",\"center\":[116.658603,39.902486],\"centroid\":[116.73624,39.803923],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":110000},\"subFeatureIndex\":8,\"acroutes\":[100000,110000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[116.534944,39.82482],[116.538143,39.828207],[116.533187,39.832733],[116.542681,39.830209],[116.543664,39.835078],[116.558596,39.834687],[116.569386,39.833498],[116.577145,39.830682],[116.577479,39.827539],[116.587015,39.828223],[116.583732,39.824917],[116.591595,39.823875],[116.59147,39.826367],[116.599228,39.825585],[116.598977,39.831659],[116.60224,39.831675],[116.601905,39.840727],[116.608367,39.846539],[116.604666,39.846132],[116.604185,39.850071],[116.613449,39.850185],[116.626958,39.860683],[116.619994,39.868951],[116.62493,39.87725],[116.624323,39.881155],[116.628987,39.881594],[116.627585,39.890477],[116.615603,39.889794],[116.61531,39.895503],[116.621019,39.898854],[116.623361,39.904271],[116.620245,39.90767],[116.623006,39.913818],[116.620956,39.923103],[116.630576,39.921672],[116.624156,39.929981],[116.6293,39.931314],[116.629677,39.938727],[116.633441,39.940906],[116.630492,39.946156],[116.632228,39.950545],[116.645277,39.945977],[116.643081,39.952983],[116.641827,39.969575],[116.639819,39.982606],[116.634026,39.981696],[116.63365,39.986197],[116.639129,39.986879],[116.640321,39.990177],[116.643751,39.989608],[116.642684,39.996755],[116.637582,40.002359],[116.63273,39.999825],[116.625766,40.003122],[116.628129,40.007653],[116.61989,40.011794],[116.60132,40.013873],[116.595548,40.01751],[116.600839,40.018858],[116.602762,40.028503],[116.610061,40.031214],[116.614055,40.03175],[116.614139,40.028178],[116.619388,40.026733],[116.620099,40.022512],[116.624239,40.023664],[116.627063,40.021505],[116.633504,40.023664],[116.636159,40.019703],[116.651195,40.025759],[116.651676,40.021911],[116.655629,40.018566],[116.660125,40.021651],[116.664705,40.019037],[116.668615,40.013938],[116.678465,40.015058],[116.683777,40.014458],[116.686286,40.00827],[116.688378,40.00918],[116.685575,40.016569],[116.697244,40.016098],[116.703936,40.020141],[116.708621,40.026587],[116.716337,40.023762],[116.717383,40.019605],[116.719725,40.022512],[116.724221,40.021278],[116.724828,40.024265],[116.732043,40.022219],[116.732335,40.025109],[116.737145,40.02761],[116.747058,40.025385],[116.747037,40.021976],[116.751763,40.019962],[116.75329,40.015919],[116.764791,40.016049],[116.771755,40.014474],[116.770459,40.011632],[116.775749,40.002943],[116.775373,39.992759],[116.766757,39.982281],[116.766443,39.976351],[116.759605,39.969933],[116.757326,39.961483],[116.762826,39.956006],[116.78058,39.949716],[116.782567,39.947554],[116.78332,39.936045],[116.782358,39.928273],[116.78217,39.910419],[116.78424,39.902221],[116.7847,39.89142],[116.787084,39.886833],[116.794738,39.881252],[116.804148,39.877933],[116.804253,39.88488],[116.808247,39.884913],[116.80831,39.889631],[116.812304,39.889712],[116.81312,39.881301],[116.817009,39.878649],[116.823681,39.879137],[116.827277,39.877071],[116.836897,39.864736],[116.839407,39.865777],[116.847249,39.858616],[116.85254,39.859056],[116.85829,39.84846],[116.865505,39.846913],[116.866049,39.843902],[116.871507,39.842062],[116.878638,39.842257],[116.878304,39.84522],[116.885665,39.844585],[116.897501,39.832587],[116.903357,39.830682],[116.907581,39.834117],[116.902896,39.841346],[116.902813,39.848248],[116.910383,39.850608],[116.917431,39.846913],[116.9259,39.835403],[116.92887,39.820912],[116.92818,39.814153],[116.92979,39.811368],[116.942881,39.801677],[116.934809,39.801139],[116.938301,39.793124],[116.950828,39.791528],[116.953797,39.78607],[116.948004,39.785369],[116.94974,39.778542],[116.945788,39.777369],[116.939284,39.781361],[116.933784,39.781801],[116.921718,39.780628],[116.91649,39.775935],[116.920902,39.769107],[116.910613,39.762278],[116.908292,39.766711],[116.901809,39.763615],[116.901558,39.755204],[116.907163,39.75597],[116.913185,39.745962],[116.914461,39.741755],[116.910718,39.740989],[116.912934,39.73569],[116.916364,39.73587],[116.916678,39.731353],[116.911533,39.731516],[116.90229,39.729413],[116.89976,39.726168],[116.887589,39.725515],[116.8828,39.71847],[116.887108,39.714311],[116.886376,39.707004],[116.893841,39.695879],[116.89336,39.693187],[116.887819,39.690952],[116.88991,39.687656],[116.902896,39.690576],[116.909024,39.682859],[116.905197,39.681651],[116.906661,39.677425],[116.891144,39.67408],[116.883239,39.675352],[116.87318,39.671387],[116.863979,39.670391],[116.860486,39.667258],[116.849946,39.667552],[116.85141,39.652845],[116.839135,39.647523],[116.840766,39.644241],[116.833572,39.644127],[116.834555,39.641841],[116.826901,39.638217],[116.82893,39.635163],[116.826357,39.633122],[116.838445,39.62223],[116.834116,39.621495],[116.835391,39.617004],[116.82504,39.613884],[116.823994,39.617183],[116.81954,39.618996],[116.809711,39.614521],[116.802078,39.6123],[116.790012,39.610535],[116.792835,39.602155],[116.789384,39.602596],[116.790702,39.596045],[116.785474,39.596209],[116.785055,39.593497],[116.778196,39.593382],[116.774892,39.599166],[116.774202,39.605439],[116.762616,39.613819],[116.748689,39.619943],[116.744004,39.616824],[116.737877,39.61537],[116.730516,39.619143],[116.730202,39.622932],[116.725518,39.624075],[116.721398,39.629415],[116.723489,39.639033],[116.716003,39.640356],[116.710419,39.639686],[116.70609,39.642903],[116.702891,39.649923],[116.702138,39.657644],[116.704857,39.667192],[116.703769,39.674145],[116.693543,39.674944],[116.692706,39.676789],[116.685554,39.676886],[116.680786,39.674896],[116.675203,39.676234],[116.668574,39.674602],[116.666022,39.679693],[116.669577,39.683642],[116.666566,39.687101],[116.65818,39.68857],[116.658097,39.686155],[116.651321,39.687868],[116.651509,39.694459],[116.647097,39.694786],[116.64626,39.700447],[116.647912,39.703579],[116.653098,39.703823],[116.652994,39.708619],[116.644587,39.709647],[116.638502,39.717166],[116.637623,39.723934],[116.631203,39.722971],[116.628129,39.727749],[116.621646,39.728076],[116.621876,39.725825],[116.616251,39.725581],[116.609141,39.719367],[116.604561,39.718731],[116.604017,39.714752],[116.598371,39.711963],[116.590194,39.711522],[116.590152,39.713349],[116.581202,39.712517],[116.579884,39.710234],[116.573464,39.709125],[116.573276,39.714507],[116.544961,39.715045],[116.535676,39.711881],[116.530552,39.713268],[116.53256,39.71529],[116.527332,39.716578],[116.52936,39.719808],[116.534609,39.718079],[116.536972,39.72152],[116.53783,39.728043],[116.531849,39.730016],[116.532413,39.73962],[116.537997,39.738071],[116.53624,39.740663],[116.527562,39.743304],[116.536408,39.753917],[116.540716,39.760502],[116.548119,39.765554],[116.561565,39.771111],[116.576957,39.771943],[116.594377,39.776685],[116.574677,39.798386],[116.565078,39.793988],[116.562423,39.796936],[116.555145,39.793548],[116.546634,39.803501],[116.538373,39.81513],[116.533375,39.819658],[116.539586,39.821563],[116.534944,39.82482]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":110113,\"name\":\"顺义区\",\"center\":[116.653525,40.128936],\"centroid\":[116.726467,40.152366],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":110000},\"subFeatureIndex\":9,\"acroutes\":[100000,110000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[116.771755,40.014474],[116.764791,40.016049],[116.75329,40.015919],[116.751763,40.019962],[116.747037,40.021976],[116.747058,40.025385],[116.737145,40.02761],[116.732335,40.025109],[116.732043,40.022219],[116.724828,40.024265],[116.724221,40.021278],[116.719725,40.022512],[116.717383,40.019605],[116.716337,40.023762],[116.708621,40.026587],[116.703936,40.020141],[116.697244,40.016098],[116.685575,40.016569],[116.688378,40.00918],[116.686286,40.00827],[116.683777,40.014458],[116.678465,40.015058],[116.668615,40.013938],[116.664705,40.019037],[116.660125,40.021651],[116.655629,40.018566],[116.651676,40.021911],[116.651195,40.025759],[116.636159,40.019703],[116.633504,40.023664],[116.627063,40.021505],[116.624239,40.023664],[116.620099,40.022512],[116.619388,40.026733],[116.614139,40.028178],[116.614055,40.03175],[116.610061,40.031214],[116.603683,40.052949],[116.608409,40.054912],[116.603473,40.086811],[116.602909,40.093883],[116.598392,40.103874],[116.598705,40.09351],[116.595903,40.090218],[116.580365,40.088352],[116.578316,40.102739],[116.574071,40.107815],[116.574322,40.096138],[116.578149,40.076461],[116.551757,40.059765],[116.547784,40.062718],[116.543183,40.059408],[116.534379,40.066791],[116.525993,40.071334],[116.513948,40.070426],[116.506775,40.074352],[116.49933,40.080387],[116.486657,40.081036],[116.482935,40.083745],[116.473545,40.085562],[116.471015,40.08939],[116.466832,40.090185],[116.466498,40.094954],[116.473357,40.097516],[116.480885,40.096965],[116.489292,40.101668],[116.492199,40.111561],[116.487222,40.124678],[116.484754,40.140078],[116.482307,40.140629],[116.480781,40.14742],[116.490777,40.148992],[116.492303,40.156981],[116.484629,40.160465],[116.477916,40.159979],[116.476912,40.163576],[116.480802,40.171937],[116.483332,40.171742],[116.485151,40.176764],[116.490129,40.181316],[116.487975,40.184686],[116.488016,40.191796],[116.484503,40.196493],[116.472249,40.205092],[116.473712,40.221203],[116.477979,40.225201],[116.483771,40.225185],[116.481094,40.238248],[116.482098,40.245385],[116.493705,40.251179],[116.501024,40.251599],[116.503011,40.25969],[116.505959,40.261356],[116.509201,40.258056],[116.523965,40.257522],[116.526181,40.261324],[116.535717,40.261373],[116.540088,40.267165],[116.53693,40.277178],[116.540904,40.274946],[116.546236,40.276224],[116.552176,40.27383],[116.566187,40.27802],[116.565371,40.273377],[116.570516,40.273102],[116.570202,40.268863],[116.58254,40.268362],[116.585238,40.266226],[116.588396,40.269462],[116.590842,40.264139],[116.599647,40.265385],[116.600755,40.258978],[116.604624,40.256146],[116.603787,40.251324],[116.61324,40.251761],[116.622044,40.250467],[116.6238,40.252667],[116.623654,40.26058],[116.63526,40.261454],[116.637038,40.25846],[116.641492,40.259463],[116.643081,40.25715],[116.648519,40.260143],[116.666901,40.262085],[116.669494,40.253153],[116.673321,40.246777],[116.668783,40.238539],[116.670247,40.234865],[116.676311,40.238604],[116.678131,40.234379],[116.684007,40.234282],[116.69072,40.240886],[116.697265,40.243216],[116.696554,40.248072],[116.704585,40.251551],[116.704668,40.257101],[116.710837,40.256227],[116.738421,40.284392],[116.738965,40.284101],[116.741098,40.283001],[116.738337,40.278764],[116.74298,40.279087],[116.752788,40.275512],[116.762658,40.269058],[116.768597,40.270109],[116.771651,40.266501],[116.773512,40.269527],[116.782964,40.273248],[116.784073,40.279443],[116.787795,40.281449],[116.788025,40.289439],[116.794487,40.287417],[116.800572,40.289196],[116.809607,40.28601],[116.811823,40.282387],[116.825123,40.285347],[116.82458,40.290991],[116.827215,40.298333],[116.830101,40.299206],[116.828992,40.304413],[116.838382,40.310185],[116.848984,40.311204],[116.854547,40.303152],[116.857182,40.2929],[116.859462,40.290878],[116.871319,40.290943],[116.871737,40.281481],[116.876338,40.274348],[116.874247,40.268281],[116.879893,40.264139],[116.881273,40.259221],[116.886104,40.255256],[116.886585,40.251907],[116.892252,40.245709],[116.894343,40.240028],[116.901746,40.23684],[116.893946,40.233457],[116.900701,40.228763],[116.906598,40.228682],[116.908606,40.222401],[116.913917,40.220118],[116.915507,40.222271],[116.922031,40.220134],[116.92544,40.225768],[116.931065,40.230624],[116.935206,40.229847],[116.940978,40.223922],[116.938029,40.210549],[116.929685,40.211585],[116.930898,40.207084],[116.939556,40.192347],[116.945913,40.193141],[116.94997,40.186354],[116.945809,40.186224],[116.945349,40.1813],[116.951371,40.174788],[116.962037,40.175549],[116.961242,40.171937],[116.968749,40.163495],[116.972054,40.156301],[116.977763,40.151374],[116.970025,40.140321],[116.967829,40.129849],[116.96578,40.127823],[116.971594,40.124224],[116.969189,40.118776],[116.971301,40.114009],[116.976069,40.111188],[116.973329,40.103712],[116.967976,40.101214],[116.975462,40.095051],[116.979938,40.093867],[116.981862,40.089828],[116.981192,40.08149],[116.986274,40.078359],[116.982844,40.070685],[116.980816,40.071188],[116.978599,40.064893],[116.973476,40.066304],[116.970652,40.063805],[116.962288,40.063529],[116.961932,40.051358],[116.945265,40.041425],[116.945014,40.048631],[116.937632,40.046911],[116.938824,40.050887],[116.931693,40.052024],[116.928096,40.054929],[116.924164,40.047463],[116.917974,40.044704],[116.914252,40.052592],[116.906431,40.051423],[116.90137,40.047723],[116.890265,40.04597],[116.88075,40.046164],[116.873619,40.041522],[116.867826,40.041863],[116.857809,40.051894],[116.850197,40.054977],[116.849486,40.051926],[116.831502,40.051196],[116.831732,40.048485],[116.822739,40.046473],[116.823158,40.039834],[116.820816,40.038779],[116.82,40.028357],[116.815295,40.030905],[116.803375,40.032155],[116.800259,40.028844],[116.789531,40.032318],[116.790221,40.034477],[116.781542,40.034818],[116.77782,40.032448],[116.777485,40.027204],[116.771755,40.014474]]],[[[116.578149,40.076461],[116.581411,40.067846],[116.58139,40.073817],[116.586597,40.074336],[116.590131,40.056162],[116.587957,40.05053],[116.591198,40.051796],[116.590006,40.043616],[116.599814,40.041408],[116.599417,40.047171],[116.601633,40.047658],[116.598517,40.052543],[116.603683,40.052949],[116.610061,40.031214],[116.602762,40.028503],[116.600839,40.018858],[116.595548,40.01751],[116.577814,40.027512],[116.578797,40.033097],[116.570474,40.032431],[116.564242,40.039655],[116.550753,40.045499],[116.54655,40.048956],[116.552761,40.05488],[116.551757,40.059765],[116.578149,40.076461]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":110114,\"name\":\"昌平区\",\"center\":[116.235906,40.218085],\"centroid\":[116.210635,40.215461],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":110000},\"subFeatureIndex\":10,\"acroutes\":[100000,110000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[116.466832,40.090185],[116.466247,40.08235],[116.461855,40.080825],[116.462608,40.076786],[116.458823,40.075796],[116.458635,40.070377],[116.462127,40.06731],[116.459408,40.059992],[116.45142,40.06129],[116.451629,40.058759],[116.442867,40.061323],[116.433268,40.06228],[116.415618,40.056],[116.409595,40.055626],[116.406124,40.049768],[116.408884,40.043291],[116.405266,40.038974],[116.395333,40.036766],[116.39297,40.041733],[116.390649,40.041279],[116.38519,40.042853],[116.376888,40.042756],[116.376114,40.045466],[116.36959,40.04696],[116.367394,40.053436],[116.372999,40.054344],[116.372267,40.05785],[116.379272,40.059002],[116.382848,40.061582],[116.381928,40.066402],[116.373354,40.065623],[116.372538,40.06843],[116.363149,40.068965],[116.363023,40.065931],[116.357293,40.066012],[116.34667,40.063659],[116.346963,40.06043],[116.342676,40.059635],[116.343366,40.055448],[116.340271,40.055091],[116.338828,40.058921],[116.325946,40.054799],[116.318292,40.061663],[116.309446,40.060609],[116.305995,40.063043],[116.302942,40.060803],[116.290353,40.083145],[116.279897,40.079754],[116.2731,40.092699],[116.27333,40.09557],[116.265237,40.094694],[116.258273,40.101522],[116.263899,40.10402],[116.263334,40.110588],[116.258022,40.11195],[116.25957,40.106907],[116.255868,40.104474],[116.252732,40.106517],[116.245956,40.10535],[116.240498,40.108009],[116.243363,40.113279],[116.241836,40.118403],[116.245036,40.118825],[116.247043,40.136204],[116.233785,40.136577],[116.215445,40.143174],[116.212224,40.140548],[116.206285,40.143092],[116.205658,40.150175],[116.203211,40.153773],[116.202166,40.160984],[116.194282,40.160076],[116.192065,40.155669],[116.182696,40.158099],[116.183094,40.153335],[116.180417,40.14729],[116.174122,40.143595],[116.167681,40.141844],[116.168622,40.135442],[116.17178,40.127936],[116.167409,40.128455],[116.169563,40.124564],[116.152708,40.121776],[116.132925,40.121354],[116.132214,40.115079],[116.127676,40.116393],[116.113309,40.115598],[116.105864,40.118014],[116.102246,40.115987],[116.096056,40.121257],[116.089783,40.119327],[116.08445,40.120252],[116.077883,40.115047],[116.073847,40.115436],[116.072676,40.109258],[116.069456,40.104912],[116.062931,40.10282],[116.061969,40.09956],[116.055905,40.09643],[116.051848,40.091661],[116.048878,40.085303],[116.043775,40.083502],[116.037899,40.084524],[116.033926,40.079657],[116.030914,40.082188],[116.020856,40.074579],[116.007785,40.080614],[116.005129,40.079803],[115.99735,40.082074],[115.986434,40.083469],[115.979993,40.081669],[115.977232,40.079041],[115.968575,40.075488],[115.966588,40.084556],[115.960461,40.092456],[115.962092,40.094419],[115.962552,40.10235],[115.957449,40.100679],[115.956717,40.096041],[115.952681,40.10102],[115.943229,40.103339],[115.947913,40.107409],[115.933588,40.124824],[115.921438,40.134485],[115.906549,40.138181],[115.904457,40.136123],[115.900442,40.138716],[115.8816,40.139073],[115.874155,40.14387],[115.870768,40.144276],[115.865184,40.148635],[115.856547,40.147468],[115.853348,40.149332],[115.853557,40.154162],[115.84676,40.163171],[115.844418,40.168016],[115.846865,40.169458],[115.854205,40.179939],[115.848099,40.183843],[115.855502,40.188865],[115.863072,40.186095],[115.870308,40.186079],[115.873695,40.192687],[115.87633,40.193918],[115.877313,40.200849],[115.886326,40.206663],[115.883169,40.209594],[115.885072,40.212039],[115.883106,40.216119],[115.891366,40.225379],[115.891994,40.228147],[115.898476,40.234509],[115.898079,40.236419],[115.906695,40.23412],[115.911965,40.234477],[115.916628,40.242391],[115.916984,40.247068],[115.935826,40.25558],[115.942706,40.253557],[115.950276,40.256163],[115.960001,40.256648],[115.965605,40.259415],[115.968888,40.264269],[115.967006,40.265612],[115.976396,40.270983],[115.981812,40.276903],[115.978822,40.281627],[115.981227,40.28525],[115.978675,40.289633],[115.982732,40.297977],[115.990323,40.299498],[115.987919,40.303799],[115.975538,40.308698],[115.976417,40.311511],[115.973259,40.318997],[115.979658,40.320532],[115.982711,40.324202],[115.993398,40.328986],[115.999065,40.325463],[116.007597,40.33314],[116.01684,40.33466],[116.026481,40.324283],[116.026167,40.320484],[116.031144,40.312352],[116.040095,40.312724],[116.042479,40.316846],[116.051116,40.315812],[116.056971,40.322181],[116.053353,40.326853],[116.061802,40.336809],[116.06841,40.336971],[116.073429,40.339831],[116.077716,40.339346],[116.083342,40.33571],[116.086353,40.330813],[116.098649,40.330005],[116.102978,40.331524],[116.110381,40.330813],[116.116634,40.323668],[116.116237,40.321955],[116.122385,40.312805],[116.132737,40.31198],[116.141959,40.316879],[116.138383,40.324671],[116.13809,40.330974],[116.143904,40.336082],[116.137651,40.336534],[116.137567,40.340769],[116.140809,40.343047],[116.138404,40.345229],[116.144782,40.348541],[116.147543,40.340655],[116.144719,40.336631],[116.152603,40.337714],[116.155677,40.344906],[116.1507,40.349252],[116.145514,40.351046],[116.148651,40.35696],[116.148233,40.361807],[116.159295,40.366265],[116.168789,40.366718],[116.170713,40.369351],[116.177154,40.370934],[116.180354,40.367687],[116.192985,40.372775],[116.209129,40.376232],[116.211451,40.381756],[116.222221,40.382111],[116.226989,40.38111],[116.23184,40.374988],[116.23665,40.377427],[116.241962,40.377508],[116.24353,40.379818],[116.247796,40.374471],[116.252104,40.376297],[116.25338,40.381239],[116.258336,40.383193],[116.261264,40.380561],[116.270863,40.382693],[116.282845,40.375263],[116.290729,40.383177],[116.289872,40.391672],[116.293762,40.392415],[116.295581,40.384437],[116.302691,40.387473],[116.313106,40.389459],[116.32078,40.386859],[116.32398,40.387295],[116.337364,40.379769],[116.34506,40.373163],[116.355369,40.37137],[116.360033,40.366815],[116.357356,40.364084],[116.352797,40.364391],[116.348866,40.356427],[116.355641,40.356814],[116.363923,40.359028],[116.369673,40.356362],[116.367101,40.350351],[116.364508,40.349107],[116.369903,40.342401],[116.368231,40.334805],[116.365909,40.331702],[116.376135,40.334352],[116.375069,40.337375],[116.384563,40.339055],[116.391422,40.338393],[116.396358,40.334853],[116.408633,40.334886],[116.408989,40.333205],[116.417061,40.329843],[116.424359,40.331265],[116.427914,40.329213],[116.43423,40.329116],[116.438245,40.333221],[116.443745,40.322682],[116.449182,40.32113],[116.455184,40.316345],[116.44822,40.305982],[116.443766,40.302457],[116.448011,40.300484],[116.45096,40.293045],[116.449412,40.286722],[116.45533,40.284845],[116.460308,40.28711],[116.469634,40.283001],[116.472081,40.280122],[116.478794,40.280025],[116.484001,40.2759],[116.484273,40.267634],[116.493245,40.262489],[116.501839,40.262974],[116.505959,40.261356],[116.503011,40.25969],[116.501024,40.251599],[116.493705,40.251179],[116.482098,40.245385],[116.481094,40.238248],[116.483771,40.225185],[116.477979,40.225201],[116.473712,40.221203],[116.472249,40.205092],[116.484503,40.196493],[116.488016,40.191796],[116.487975,40.184686],[116.490129,40.181316],[116.485151,40.176764],[116.483332,40.171742],[116.480802,40.171937],[116.476912,40.163576],[116.477916,40.159979],[116.484629,40.160465],[116.492303,40.156981],[116.490777,40.148992],[116.480781,40.14742],[116.482307,40.140629],[116.484754,40.140078],[116.487222,40.124678],[116.492199,40.111561],[116.489292,40.101668],[116.480885,40.096965],[116.473357,40.097516],[116.466498,40.094954],[116.466832,40.090185]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":110115,\"name\":\"大兴区\",\"center\":[116.338033,39.728908],\"centroid\":[116.421058,39.649884],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":110000},\"subFeatureIndex\":11,\"acroutes\":[100000,110000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[116.534944,39.82482],[116.539586,39.821563],[116.533375,39.819658],[116.538373,39.81513],[116.546634,39.803501],[116.555145,39.793548],[116.562423,39.796936],[116.565078,39.793988],[116.574677,39.798386],[116.594377,39.776685],[116.576957,39.771943],[116.561565,39.771111],[116.548119,39.765554],[116.540716,39.760502],[116.536408,39.753917],[116.527562,39.743304],[116.53624,39.740663],[116.537997,39.738071],[116.532413,39.73962],[116.531849,39.730016],[116.53783,39.728043],[116.536972,39.72152],[116.534609,39.718079],[116.52936,39.719808],[116.527332,39.716578],[116.53256,39.71529],[116.530552,39.713268],[116.535676,39.711881],[116.544961,39.715045],[116.573276,39.714507],[116.573464,39.709125],[116.579884,39.710234],[116.581202,39.712517],[116.590152,39.713349],[116.590194,39.711522],[116.598371,39.711963],[116.604017,39.714752],[116.604561,39.718731],[116.609141,39.719367],[116.616251,39.725581],[116.621876,39.725825],[116.621646,39.728076],[116.628129,39.727749],[116.631203,39.722971],[116.637623,39.723934],[116.638502,39.717166],[116.644587,39.709647],[116.652994,39.708619],[116.653098,39.703823],[116.647912,39.703579],[116.64626,39.700447],[116.647097,39.694786],[116.651509,39.694459],[116.651321,39.687868],[116.658097,39.686155],[116.65818,39.68857],[116.666566,39.687101],[116.669577,39.683642],[116.666022,39.679693],[116.668574,39.674602],[116.675203,39.676234],[116.680786,39.674896],[116.685554,39.676886],[116.692706,39.676789],[116.693543,39.674944],[116.703769,39.674145],[116.704857,39.667192],[116.702138,39.657644],[116.702891,39.649923],[116.70609,39.642903],[116.710419,39.639686],[116.716003,39.640356],[116.723489,39.639033],[116.721398,39.629415],[116.725518,39.624075],[116.721858,39.621756],[116.716149,39.62156],[116.70929,39.618114],[116.705338,39.621462],[116.700737,39.62107],[116.702577,39.610421],[116.718282,39.603021],[116.718324,39.601077],[116.724953,39.598006],[116.727065,39.593055],[116.705108,39.587974],[116.700695,39.590964],[116.699127,39.595457],[116.696408,39.595392],[116.694087,39.601355],[116.6889,39.598496],[116.669975,39.603381],[116.670037,39.604916],[116.662384,39.60521],[116.6568,39.602776],[116.657678,39.60075],[116.646532,39.599117],[116.645549,39.60209],[116.635595,39.604818],[116.635407,39.599934],[116.628338,39.599558],[116.620517,39.601665],[116.620182,39.606893],[116.616857,39.607301],[116.616648,39.614096],[116.613177,39.613802],[116.611755,39.618882],[116.607781,39.619698],[116.607886,39.624696],[116.602177,39.624533],[116.600128,39.619649],[116.593561,39.618588],[116.591993,39.621299],[116.579194,39.623487],[116.579382,39.619666],[116.565936,39.61978],[116.565978,39.616138],[116.569637,39.61176],[116.566103,39.61114],[116.566605,39.604361],[116.562276,39.601714],[116.557132,39.601502],[116.549436,39.596143],[116.544187,39.596519],[116.544124,39.603609],[116.540883,39.60142],[116.541803,39.59348],[116.530866,39.596715],[116.530615,39.598774],[116.524446,39.596535],[116.525052,39.593807],[116.521267,39.590229],[116.52317,39.586242],[116.519699,39.581863],[116.520389,39.577156],[116.52614,39.577271],[116.527248,39.57294],[116.520389,39.57191],[116.519385,39.566484],[116.511564,39.565503],[116.510581,39.560502],[116.50805,39.560256],[116.508448,39.551053],[116.489773,39.550268],[116.48948,39.553472],[116.473378,39.553096],[116.470952,39.5546],[116.475134,39.545756],[116.47802,39.543205],[116.478188,39.535487],[116.468819,39.534359],[116.464595,39.531628],[116.464553,39.527638],[116.453846,39.528652],[116.45372,39.526477],[116.440985,39.527311],[116.436802,39.526346],[116.439876,39.523353],[116.440378,39.516271],[116.442741,39.516189],[116.443829,39.509875],[116.433017,39.507438],[116.431699,39.51053],[116.424631,39.509728],[116.423125,39.516337],[116.424046,39.522732],[116.421473,39.525103],[116.411247,39.524678],[116.402652,39.526886],[116.40282,39.51439],[116.407253,39.512116],[116.40857,39.508011],[116.418734,39.506391],[116.422895,39.496608],[116.418504,39.496575],[116.415827,39.48823],[116.411582,39.485105],[116.412376,39.482077],[116.423544,39.485154],[116.427329,39.487788],[116.429964,39.481325],[116.425342,39.481259],[116.428333,39.476219],[116.433644,39.478183],[116.436258,39.482912],[116.444142,39.482192],[116.444059,39.47887],[116.448764,39.476284],[116.448638,39.465122],[116.453992,39.45751],[116.454682,39.453302],[116.450667,39.452648],[116.450353,39.448522],[116.437241,39.445951],[116.434397,39.442758],[116.425635,39.446885],[116.408947,39.450257],[116.399787,39.450044],[116.391903,39.452893],[116.388557,39.450732],[116.373563,39.452058],[116.367791,39.451633],[116.362187,39.454874],[116.351124,39.455529],[116.350162,39.45291],[116.334499,39.457019],[116.325611,39.462961],[116.325088,39.466153],[116.320048,39.468543],[116.319944,39.473436],[116.314779,39.476104],[116.312708,39.480556],[116.306957,39.485023],[116.305284,39.489179],[116.283201,39.493941],[116.279269,39.491306],[116.275631,39.495201],[116.269315,39.495495],[116.257939,39.500518],[116.25706,39.505491],[116.253861,39.510055],[116.245831,39.514897],[116.246709,39.520098],[116.24353,39.524236],[116.246479,39.525299],[116.248256,39.530271],[116.245601,39.53014],[116.246521,39.539788],[116.242505,39.552966],[116.246186,39.557167],[116.243007,39.55836],[116.240644,39.564098],[116.234684,39.563934],[116.236462,39.568396],[116.229373,39.565471],[116.225817,39.568151],[116.221175,39.578921],[116.225085,39.584085],[116.226089,39.591993],[116.222597,39.593938],[116.223141,39.597222],[116.21808,39.608102],[116.219502,39.618931],[116.218875,39.628011],[116.215487,39.64305],[116.216992,39.651572],[116.223162,39.664728],[116.221342,39.667486],[116.22565,39.67359],[116.221238,39.678453],[116.230941,39.692355],[116.23435,39.703823],[116.231945,39.706025],[116.236629,39.71286],[116.245036,39.718421],[116.245768,39.72408],[116.248466,39.728027],[116.248026,39.732641],[116.243948,39.741658],[116.251895,39.749092],[116.252481,39.758676],[116.254426,39.76324],[116.252481,39.771747],[116.253777,39.77952],[116.251602,39.782518],[116.251519,39.793059],[116.259298,39.797621],[116.262184,39.792782],[116.27423,39.796936],[116.287237,39.799103],[116.289182,39.795894],[116.296083,39.795568],[116.291148,39.793271],[116.295205,39.790958],[116.301541,39.774941],[116.307062,39.770085],[116.31068,39.772057],[116.317978,39.783447],[116.321784,39.783626],[116.322872,39.798386],[116.326824,39.798386],[116.328225,39.801416],[116.340124,39.802149],[116.341755,39.807589],[116.355704,39.805668],[116.356833,39.800471],[116.367039,39.79982],[116.368189,39.794819],[116.365742,39.794151],[116.367582,39.784962],[116.378478,39.785646],[116.379209,39.77939],[116.385609,39.778852],[116.390649,39.780465],[116.391903,39.765277],[116.398888,39.765864],[116.397905,39.781068],[116.396023,39.786738],[116.42024,39.787439],[116.421034,39.794134],[116.429274,39.794102],[116.429399,39.803583],[116.425719,39.805358],[116.422456,39.81044],[116.417772,39.81013],[116.415262,39.812525],[116.410013,39.811336],[116.41016,39.817052],[116.419759,39.815375],[116.418441,39.822915],[116.414426,39.824282],[116.415785,39.829428],[116.420072,39.826611],[116.425217,39.831903],[116.430068,39.830112],[116.43699,39.830649],[116.436677,39.827425],[116.44592,39.826692],[116.443912,39.82096],[116.452737,39.823012],[116.462775,39.815945],[116.468463,39.814511],[116.474256,39.809772],[116.485256,39.81272],[116.485632,39.816889],[116.495357,39.818795],[116.498201,39.8157],[116.505813,39.817866],[116.502801,39.819006],[116.510142,39.821449],[116.510602,39.827637],[116.516164,39.829835],[116.525366,39.829754],[116.525868,39.826904],[116.534944,39.82482]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":110116,\"name\":\"怀柔区\",\"center\":[116.637122,40.324272],\"centroid\":[116.586079,40.63069],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":110000},\"subFeatureIndex\":12,\"acroutes\":[100000,110000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[116.289872,40.391672],[116.286003,40.396032],[116.289746,40.402539],[116.287864,40.404719],[116.291608,40.408448],[116.288513,40.413437],[116.289433,40.418021],[116.291942,40.416617],[116.296648,40.420701],[116.294452,40.429304],[116.290667,40.435856],[116.289788,40.440907],[116.294368,40.449975],[116.293824,40.452831],[116.300955,40.458429],[116.306853,40.466092],[116.301646,40.468108],[116.294786,40.47535],[116.291691,40.485317],[116.29717,40.486768],[116.303779,40.485817],[116.31022,40.491702],[116.31321,40.491799],[116.323227,40.500151],[116.330567,40.500748],[116.336653,40.498636],[116.34232,40.500457],[116.348636,40.499071],[116.357042,40.501941],[116.365909,40.499635],[116.369632,40.500312],[116.377537,40.49683],[116.378603,40.491525],[116.376825,40.485736],[116.387344,40.482043],[116.38609,40.475802],[116.393702,40.47256],[116.4065,40.481995],[116.413673,40.481527],[116.416664,40.483011],[116.420971,40.480301],[116.433142,40.478189],[116.443201,40.481801],[116.455937,40.480914],[116.457903,40.488445],[116.465577,40.48701],[116.468212,40.48493],[116.483541,40.484994],[116.487347,40.481737],[116.492157,40.481027],[116.508322,40.483172],[116.511543,40.486929],[116.519092,40.491799],[116.519155,40.496604],[116.51194,40.501135],[116.506398,40.508212],[116.500459,40.510904],[116.497762,40.518093],[116.492073,40.518093],[116.488581,40.515853],[116.476306,40.514192],[116.470345,40.518963],[116.46587,40.518802],[116.460956,40.524363],[116.467125,40.530068],[116.470617,40.535418],[116.479651,40.541396],[116.484587,40.552867],[116.496277,40.555106],[116.499999,40.560921],[116.505144,40.562581],[116.509577,40.57276],[116.513153,40.572792],[116.517796,40.579749],[116.525136,40.583002],[116.531577,40.59131],[116.530929,40.595883],[116.535948,40.59944],[116.532915,40.606459],[116.535634,40.615698],[116.538938,40.619673],[116.539294,40.625612],[116.545003,40.627076],[116.551674,40.625209],[116.561231,40.628557],[116.568989,40.625483],[116.574092,40.631678],[116.573903,40.63628],[116.563886,40.636908],[116.55389,40.642877],[116.551151,40.642828],[116.550335,40.647606],[116.545023,40.650116],[116.544103,40.653767],[116.540046,40.656679],[116.529507,40.654588],[116.527039,40.6584],[116.518381,40.660925],[116.520096,40.66411],[116.517273,40.665734],[116.513488,40.672344],[116.505938,40.673067],[116.501568,40.671186],[116.492826,40.673984],[116.487138,40.674338],[116.483374,40.679403],[116.488811,40.69196],[116.496653,40.696879],[116.502676,40.697361],[116.501066,40.70228],[116.501923,40.706796],[116.506064,40.710879],[116.503115,40.715893],[116.504119,40.720135],[116.506858,40.720039],[116.510748,40.72645],[116.509493,40.73548],[116.513697,40.741456],[116.506461,40.743432],[116.501819,40.746581],[116.502906,40.756635],[116.50025,40.760811],[116.495482,40.759735],[116.491404,40.7633],[116.485193,40.765179],[116.4803,40.771586],[116.471517,40.771233],[116.465452,40.772742],[116.465849,40.774525],[116.460663,40.78244],[116.461416,40.78854],[116.457233,40.7983],[116.452152,40.798059],[116.450981,40.801927],[116.440002,40.809133],[116.439897,40.815038],[116.436823,40.820735],[116.422477,40.822772],[116.414991,40.829318],[116.406458,40.833361],[116.406145,40.837933],[116.399306,40.850492],[116.391778,40.854838],[116.389707,40.861814],[116.38174,40.863465],[116.374881,40.871531],[116.366599,40.876645],[116.365972,40.880188],[116.360514,40.884885],[116.353864,40.887786],[116.344683,40.894694],[116.342236,40.899887],[116.334436,40.90463],[116.33544,40.910495],[116.334122,40.920829],[116.338828,40.925732],[116.339894,40.929416],[116.35012,40.936048],[116.358925,40.93608],[116.364801,40.942999],[116.370343,40.943655],[116.379941,40.935775],[116.379732,40.933228],[116.384019,40.928535],[116.384877,40.922848],[116.39274,40.913123],[116.396316,40.911264],[116.398533,40.906024],[116.404764,40.905736],[116.413715,40.899758],[116.418922,40.902339],[116.430905,40.903364],[116.436614,40.89939],[116.448492,40.899919],[116.45073,40.901345],[116.458676,40.900592],[116.464344,40.896329],[116.474047,40.896008],[116.477581,40.901746],[116.473608,40.91974],[116.468422,40.925091],[116.467209,40.931322],[116.461541,40.932684],[116.462315,40.935231],[116.455372,40.945433],[116.454829,40.949533],[116.447446,40.95384],[116.453302,40.964584],[116.451713,40.968667],[116.455519,40.980481],[116.464135,40.984498],[116.474193,40.978608],[116.47894,40.979104],[116.485612,40.982465],[116.493726,40.977919],[116.496737,40.978432],[116.504516,40.975919],[116.51629,40.975198],[116.519573,40.981569],[116.524718,40.981073],[116.533417,40.985698],[116.535634,40.988675],[116.541991,40.99026],[116.547826,40.988003],[116.558617,40.988627],[116.561231,40.993461],[116.569177,40.991636],[116.574928,40.986307],[116.589692,40.976703],[116.597764,40.97475],[116.614515,40.983314],[116.617067,40.998725],[116.614892,41.003574],[116.619179,41.01423],[116.621897,41.015749],[116.62288,41.020693],[116.621228,41.028978],[116.617589,41.034704],[116.614118,41.036096],[116.613491,41.040782],[116.617736,41.048649],[116.61646,41.053382],[116.624093,41.054437],[116.630848,41.0608],[116.637937,41.060497],[116.641158,41.058322],[116.647431,41.059393],[116.653914,41.05626],[116.657009,41.051303],[116.665207,41.046682],[116.673279,41.046378],[116.67698,41.042732],[116.682878,41.041789],[116.688629,41.044651],[116.692246,41.040813],[116.691347,41.037503],[116.69509,41.033265],[116.695739,41.025396],[116.698855,41.021253],[116.693836,41.013686],[116.690866,41.012982],[116.69095,41.007254],[116.683066,41.000486],[116.682543,40.986259],[116.685304,40.982641],[116.681267,40.980737],[116.677921,40.975983],[116.677921,40.970972],[116.687248,40.962551],[116.689298,40.951118],[116.696178,40.94452],[116.702368,40.940628],[116.702786,40.936512],[116.70722,40.934029],[116.712197,40.934846],[116.713891,40.929416],[116.722318,40.92743],[116.717111,40.921695],[116.713347,40.910431],[116.716881,40.910175],[116.723678,40.906313],[116.726145,40.901185],[116.730432,40.897771],[116.739759,40.896665],[116.750257,40.891665],[116.759501,40.889854],[116.758539,40.881983],[116.762135,40.880765],[116.769392,40.882961],[116.772362,40.87852],[116.776795,40.878376],[116.797226,40.860034],[116.796996,40.854886],[116.802413,40.851198],[116.802496,40.842392],[116.805947,40.840836],[116.813622,40.848423],[116.820732,40.848263],[116.823471,40.842681],[116.828009,40.841109],[116.831815,40.842585],[116.837775,40.841542],[116.839741,40.839024],[116.84819,40.839313],[116.848587,40.837147],[116.855425,40.835447],[116.860633,40.830457],[116.861448,40.825356],[116.870378,40.821601],[116.876171,40.8212],[116.876735,40.818456],[116.882172,40.814172],[116.880207,40.804367],[116.886961,40.801076],[116.878575,40.797545],[116.873326,40.798781],[116.871277,40.794785],[116.862577,40.792858],[116.867471,40.784559],[116.858039,40.78305],[116.856806,40.77955],[116.851264,40.778924],[116.850448,40.775006],[116.834785,40.770221],[116.840076,40.760682],[116.831795,40.751303],[116.826211,40.749343],[116.818662,40.75042],[116.810527,40.749118],[116.802977,40.745986],[116.793629,40.748267],[116.783759,40.757631],[116.780727,40.751512],[116.782818,40.747817],[116.786352,40.736026],[116.790472,40.728973],[116.789091,40.712454],[116.786687,40.7103],[116.787105,40.704482],[116.783989,40.700496],[116.769246,40.70281],[116.762867,40.706427],[116.756155,40.705687],[116.754963,40.702891],[116.748668,40.700544],[116.747518,40.697072],[116.74252,40.69593],[116.735807,40.69167],[116.725581,40.689114],[116.725413,40.68466],[116.714915,40.680014],[116.713221,40.669867],[116.714309,40.666104],[116.709855,40.662598],[116.712636,40.653896],[116.711151,40.648218],[116.712197,40.641268],[116.70149,40.632917],[116.70195,40.628444],[116.705128,40.626947],[116.704689,40.620076],[116.701322,40.621379],[116.697955,40.618402],[116.702598,40.612785],[116.70655,40.610998],[116.707993,40.606507],[116.705609,40.60303],[116.711235,40.600213],[116.708495,40.595206],[116.711611,40.59189],[116.708955,40.590054],[116.714351,40.58028],[116.71456,40.570682],[116.710503,40.568685],[116.709855,40.565512],[116.699336,40.563563],[116.686349,40.564497],[116.679636,40.562001],[116.682397,40.556766],[116.66872,40.557507],[116.665771,40.552432],[116.67698,40.554462],[116.68225,40.548904],[116.690699,40.549468],[116.702138,40.545456],[116.701469,40.539913],[116.706948,40.532582],[116.712573,40.529955],[116.717216,40.524798],[116.712239,40.522058],[116.711402,40.516465],[116.701071,40.510549],[116.699106,40.50444],[116.698353,40.493266],[116.693376,40.490783],[116.694149,40.485462],[116.704334,40.479043],[116.69348,40.481704],[116.693397,40.476108],[116.695571,40.466721],[116.698667,40.468043],[116.706174,40.459929],[116.716902,40.457074],[116.719223,40.460397],[116.723594,40.458542],[116.7196,40.455735],[116.719265,40.448636],[116.725811,40.443085],[116.72098,40.440988],[116.716421,40.441714],[116.723552,40.435065],[116.722339,40.423832],[116.72556,40.418053],[116.73244,40.420604],[116.733235,40.418312],[116.741139,40.414631],[116.728801,40.40982],[116.724389,40.409191],[116.723427,40.405316],[116.718512,40.402055],[116.713242,40.40157],[116.713849,40.395806],[116.711716,40.386908],[116.716254,40.384114],[116.707115,40.377007],[116.706509,40.373809],[116.714079,40.368608],[116.719872,40.369044],[116.718094,40.361338],[116.726773,40.361193],[116.725769,40.355619],[116.729031,40.355619],[116.727484,40.346522],[116.723887,40.344033],[116.722967,40.339152],[116.731185,40.339023],[116.73129,40.335031],[116.744046,40.339136],[116.744653,40.333706],[116.751491,40.335742],[116.758559,40.333884],[116.759689,40.326853],[116.762846,40.326707],[116.768639,40.317816],[116.773324,40.315973],[116.762888,40.310428],[116.756845,40.302586],[116.754461,40.303686],[116.738965,40.284101],[116.738421,40.284392],[116.710837,40.256227],[116.704668,40.257101],[116.704585,40.251551],[116.696554,40.248072],[116.697265,40.243216],[116.69072,40.240886],[116.684007,40.234282],[116.678131,40.234379],[116.676311,40.238604],[116.670247,40.234865],[116.668783,40.238539],[116.673321,40.246777],[116.669494,40.253153],[116.666901,40.262085],[116.648519,40.260143],[116.643081,40.25715],[116.641492,40.259463],[116.637038,40.25846],[116.63526,40.261454],[116.623654,40.26058],[116.6238,40.252667],[116.622044,40.250467],[116.61324,40.251761],[116.603787,40.251324],[116.604624,40.256146],[116.600755,40.258978],[116.599647,40.265385],[116.590842,40.264139],[116.588396,40.269462],[116.585238,40.266226],[116.58254,40.268362],[116.570202,40.268863],[116.570516,40.273102],[116.565371,40.273377],[116.566187,40.27802],[116.552176,40.27383],[116.546236,40.276224],[116.540904,40.274946],[116.53693,40.277178],[116.540088,40.267165],[116.535717,40.261373],[116.526181,40.261324],[116.523965,40.257522],[116.509201,40.258056],[116.505959,40.261356],[116.501839,40.262974],[116.493245,40.262489],[116.484273,40.267634],[116.484001,40.2759],[116.478794,40.280025],[116.472081,40.280122],[116.469634,40.283001],[116.460308,40.28711],[116.45533,40.284845],[116.449412,40.286722],[116.45096,40.293045],[116.448011,40.300484],[116.443766,40.302457],[116.44822,40.305982],[116.455184,40.316345],[116.449182,40.32113],[116.443745,40.322682],[116.438245,40.333221],[116.43423,40.329116],[116.427914,40.329213],[116.424359,40.331265],[116.417061,40.329843],[116.408989,40.333205],[116.408633,40.334886],[116.396358,40.334853],[116.391422,40.338393],[116.384563,40.339055],[116.375069,40.337375],[116.376135,40.334352],[116.365909,40.331702],[116.368231,40.334805],[116.369903,40.342401],[116.364508,40.349107],[116.367101,40.350351],[116.369673,40.356362],[116.363923,40.359028],[116.355641,40.356814],[116.348866,40.356427],[116.352797,40.364391],[116.357356,40.364084],[116.360033,40.366815],[116.355369,40.37137],[116.34506,40.373163],[116.337364,40.379769],[116.32398,40.387295],[116.32078,40.386859],[116.313106,40.389459],[116.302691,40.387473],[116.295581,40.384437],[116.293762,40.392415],[116.289872,40.391672]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":110117,\"name\":\"平谷区\",\"center\":[117.112335,40.144783],\"centroid\":[117.145392,40.208997],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":110000},\"subFeatureIndex\":13,\"acroutes\":[100000,110000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[116.961932,40.051358],[116.962288,40.063529],[116.970652,40.063805],[116.973476,40.066304],[116.978599,40.064893],[116.980816,40.071188],[116.982844,40.070685],[116.986274,40.078359],[116.981192,40.08149],[116.981862,40.089828],[116.979938,40.093867],[116.975462,40.095051],[116.967976,40.101214],[116.973329,40.103712],[116.976069,40.111188],[116.971301,40.114009],[116.969189,40.118776],[116.971594,40.124224],[116.96578,40.127823],[116.967829,40.129849],[116.970025,40.140321],[116.977763,40.151374],[116.972054,40.156301],[116.968749,40.163495],[116.961242,40.171937],[116.962037,40.175549],[116.951371,40.174788],[116.945349,40.1813],[116.945809,40.186224],[116.94997,40.186354],[116.945913,40.193141],[116.939556,40.192347],[116.930898,40.207084],[116.929685,40.211585],[116.938029,40.210549],[116.940978,40.223922],[116.935206,40.229847],[116.936837,40.232259],[116.945641,40.233441],[116.946896,40.236095],[116.953567,40.236079],[116.956286,40.232615],[116.959924,40.23268],[116.974082,40.24456],[116.975881,40.249463],[116.969293,40.253962],[116.961786,40.252635],[116.954341,40.25715],[116.950953,40.261081],[116.960468,40.2704],[116.961995,40.273442],[116.970527,40.276531],[116.971343,40.281724],[116.983765,40.287886],[116.991042,40.287724],[116.990833,40.290603],[116.99834,40.29083],[117.004091,40.293918],[117.002,40.299675],[117.011306,40.307113],[117.007563,40.314599],[117.006998,40.319255],[117.01024,40.320726],[117.012686,40.32674],[117.020842,40.336179],[117.026133,40.338458],[117.032762,40.33752],[117.039266,40.340057],[117.048279,40.341528],[117.052817,40.337649],[117.060931,40.337795],[117.066933,40.342983],[117.072286,40.342999],[117.072705,40.345584],[117.085231,40.350432],[117.0946,40.358285],[117.100915,40.360546],[117.117457,40.353744],[117.125362,40.35641],[117.128122,40.358866],[117.142385,40.362824],[117.147466,40.369965],[117.155329,40.371402],[117.157609,40.374859],[117.16796,40.371467],[117.170491,40.374342],[117.179943,40.375021],[117.185799,40.377767],[117.199747,40.375861],[117.204536,40.373082],[117.211124,40.373825],[117.218527,40.377718],[117.223901,40.375538],[117.22618,40.369044],[117.237055,40.370627],[117.242283,40.369981],[117.247762,40.364101],[117.250188,40.358381],[117.254182,40.357105],[117.25437,40.351191],[117.257089,40.341463],[117.261125,40.338781],[117.259828,40.336195],[117.267127,40.335694],[117.274969,40.331944],[117.271288,40.325285],[117.271853,40.319853],[117.274697,40.314405],[117.274342,40.308552],[117.285739,40.302214],[117.293309,40.296748],[117.294647,40.290894],[117.292368,40.286236],[117.29632,40.2781],[117.304309,40.278181],[117.316835,40.281999],[117.316794,40.285104],[117.32336,40.284441],[117.331244,40.289665],[117.334005,40.285654],[117.337999,40.265903],[117.337622,40.263266],[117.342202,40.256502],[117.339881,40.246194],[117.343457,40.242909],[117.345464,40.234946],[117.348246,40.234574],[117.351613,40.229459],[117.355691,40.229556],[117.36027,40.23255],[117.373989,40.232777],[117.386829,40.227111],[117.390029,40.227969],[117.39373,40.221656],[117.377586,40.218612],[117.378443,40.21029],[117.385679,40.207894],[117.393145,40.203376],[117.379552,40.201319],[117.381455,40.194906],[117.384382,40.195278],[117.38409,40.187828],[117.388356,40.188249],[117.397704,40.192914],[117.4077,40.187504],[117.404751,40.183244],[117.401217,40.183617],[117.391618,40.177607],[117.393186,40.174901],[117.380597,40.17691],[117.381225,40.172455],[117.377021,40.176327],[117.372023,40.176538],[117.368844,40.17299],[117.364014,40.176683],[117.359413,40.173346],[117.353746,40.17367],[117.351111,40.171661],[117.357343,40.164273],[117.360626,40.156965],[117.351717,40.150564],[117.355272,40.148587],[117.350525,40.144827],[117.356883,40.145037],[117.35636,40.140904],[117.351404,40.139932],[117.349082,40.136528],[117.330617,40.133691],[117.33093,40.13575],[117.323276,40.14071],[117.318571,40.138522],[117.313761,40.139964],[117.307613,40.136982],[117.302991,40.125926],[117.297073,40.121273],[117.297094,40.118857],[117.285425,40.121322],[117.275659,40.113636],[117.276663,40.109307],[117.274362,40.105804],[117.269908,40.107198],[117.266834,40.112177],[117.260393,40.114155],[117.255541,40.113279],[117.249268,40.116474],[117.245357,40.113215],[117.238226,40.111755],[117.236009,40.108382],[117.229025,40.103533],[117.228606,40.100257],[117.224403,40.098619],[117.224487,40.094662],[117.211249,40.096608],[117.21104,40.090785],[117.213989,40.086243],[117.204285,40.079657],[117.203616,40.076704],[117.208175,40.076834],[117.205247,40.07028],[117.197572,40.067748],[117.198576,40.070101],[117.191842,40.072973],[117.189207,40.082853],[117.18538,40.083875],[117.181533,40.080095],[117.186426,40.076202],[117.183603,40.072081],[117.175593,40.071642],[117.172227,40.074157],[117.158466,40.077435],[117.160139,40.075553],[117.15625,40.069338],[117.139227,40.064049],[117.128896,40.06546],[117.119507,40.072421],[117.107775,40.071805],[117.103927,40.075585],[117.085608,40.075131],[117.085064,40.068592],[117.080986,40.065087],[117.081049,40.068819],[117.069652,40.06757],[117.070634,40.064179],[117.064382,40.062783],[117.061182,40.060105],[117.052022,40.059375],[117.053382,40.052884],[117.051437,40.051163],[117.038639,40.049378],[117.033159,40.04235],[117.027032,40.038828],[117.028517,40.033957],[117.023916,40.033746],[117.024836,40.03011],[117.020884,40.032448],[117.018061,40.030467],[117.011369,40.031246],[117.000683,40.029915],[117.00016,40.032253],[116.991837,40.036896],[116.985626,40.038828],[116.972095,40.036977],[116.969293,40.048583],[116.964902,40.047836],[116.961932,40.051358]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":110118,\"name\":\"密云区\",\"center\":[116.843352,40.377362],\"centroid\":[116.994846,40.526834],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":110000},\"subFeatureIndex\":14,\"acroutes\":[100000,110000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[116.886961,40.801076],[116.889073,40.798348],[116.896686,40.796438],[116.89495,40.790675],[116.895013,40.781733],[116.898589,40.77674],[116.904569,40.777286],[116.923391,40.773722],[116.923181,40.766897],[116.927908,40.757824],[116.923516,40.750596],[116.926548,40.744894],[116.940706,40.739786],[116.942714,40.729857],[116.946645,40.726916],[116.960134,40.721083],[116.96647,40.71525],[116.965111,40.709593],[116.969628,40.706362],[116.977533,40.705559],[116.979938,40.702826],[116.988177,40.703164],[116.990456,40.701203],[117.002481,40.697345],[117.005513,40.694853],[117.013418,40.694082],[117.018291,40.696011],[117.027848,40.694355],[117.031047,40.692136],[117.035585,40.694467],[117.036108,40.697265],[117.044494,40.700367],[117.054887,40.699804],[117.058338,40.70154],[117.076804,40.700029],[117.081153,40.702617],[117.086047,40.702055],[117.095144,40.705559],[117.110661,40.708243],[117.117792,40.700078],[117.128792,40.700913],[117.132493,40.698663],[117.142531,40.6972],[117.147571,40.698968],[117.159491,40.696332],[117.16474,40.699628],[117.169236,40.699097],[117.176639,40.693567],[117.180947,40.694082],[117.182453,40.697072],[117.193996,40.696268],[117.197802,40.694291],[117.202361,40.695577],[117.208405,40.694435],[117.210622,40.691976],[117.217335,40.69196],[117.218715,40.689484],[117.233207,40.683583],[117.234336,40.680577],[117.241635,40.676669],[117.256775,40.679467],[117.261397,40.681155],[117.267754,40.676669],[117.273401,40.670076],[117.278629,40.667551],[117.278608,40.664463],[117.290423,40.660185],[117.321164,40.658287],[117.331851,40.661504],[117.337622,40.664447],[117.336681,40.666956],[117.342411,40.673437],[117.359748,40.673919],[117.37058,40.679708],[117.378192,40.678808],[117.386996,40.684178],[117.397223,40.683776],[117.409226,40.687281],[117.414852,40.685947],[117.419348,40.68696],[117.426437,40.685304],[117.432711,40.681622],[117.437332,40.683599],[117.442226,40.676605],[117.453958,40.677618],[117.465188,40.673534],[117.471503,40.674338],[117.482399,40.679033],[117.484741,40.677087],[117.493357,40.67527],[117.502934,40.669674],[117.514583,40.660523],[117.513913,40.656196],[117.50283,40.653076],[117.505026,40.646142],[117.501972,40.644518],[117.500425,40.6362],[117.489948,40.636023],[117.486163,40.633496],[117.477986,40.635331],[117.475539,40.644421],[117.473093,40.644453],[117.467885,40.649521],[117.464309,40.648652],[117.462009,40.653076],[117.449106,40.651596],[117.456467,40.649167],[117.451448,40.646577],[117.45402,40.642844],[117.448876,40.62838],[117.442289,40.627977],[117.438002,40.625692],[117.431561,40.625596],[117.42857,40.631887],[117.428884,40.637632],[117.421188,40.635427],[117.42054,40.629232],[117.424701,40.621862],[117.422987,40.618305],[117.41918,40.617114],[117.412739,40.605123],[117.414747,40.600728],[117.421753,40.593178],[117.420623,40.590875],[117.423217,40.58144],[117.429804,40.579298],[117.429992,40.576126],[117.42123,40.569104],[117.413471,40.569893],[117.40358,40.574257],[117.400589,40.569345],[117.39465,40.567912],[117.389297,40.561244],[117.378422,40.56337],[117.375453,40.567799],[117.369221,40.57036],[117.365917,40.575965],[117.353014,40.578831],[117.350023,40.582197],[117.342767,40.581585],[117.334611,40.576464],[117.328442,40.575948],[117.325451,40.578155],[117.311837,40.578026],[117.299562,40.566801],[117.285592,40.565061],[117.279256,40.560342],[117.273191,40.561501],[117.268507,40.559842],[117.25964,40.552867],[117.24954,40.548179],[117.250606,40.542024],[117.247427,40.540236],[117.252007,40.53632],[117.255123,40.527973],[117.26146,40.51906],[117.264115,40.517271],[117.263133,40.513145],[117.255562,40.514934],[117.246821,40.511968],[117.239543,40.516723],[117.230405,40.511162],[117.219969,40.514321],[117.215013,40.513273],[117.212504,40.507906],[117.214449,40.506922],[117.208572,40.501102],[117.208426,40.498071],[117.212065,40.494685],[117.21792,40.494589],[117.22846,40.481301],[117.225783,40.47585],[117.230907,40.470463],[117.237243,40.468785],[117.233207,40.463204],[117.236532,40.456558],[117.243308,40.455428],[117.252154,40.450459],[117.252635,40.446038],[117.263342,40.442375],[117.257654,40.435372],[117.246737,40.426883],[117.243872,40.422848],[117.234085,40.417149],[117.237515,40.407786],[117.236616,40.400844],[117.240484,40.39763],[117.240694,40.394417],[117.23695,40.394078],[117.235382,40.389556],[117.229045,40.386843],[117.226661,40.378558],[117.223901,40.375538],[117.218527,40.377718],[117.211124,40.373825],[117.204536,40.373082],[117.199747,40.375861],[117.185799,40.377767],[117.179943,40.375021],[117.170491,40.374342],[117.16796,40.371467],[117.157609,40.374859],[117.155329,40.371402],[117.147466,40.369965],[117.142385,40.362824],[117.128122,40.358866],[117.125362,40.35641],[117.117457,40.353744],[117.100915,40.360546],[117.0946,40.358285],[117.085231,40.350432],[117.072705,40.345584],[117.072286,40.342999],[117.066933,40.342983],[117.060931,40.337795],[117.052817,40.337649],[117.048279,40.341528],[117.039266,40.340057],[117.032762,40.33752],[117.026133,40.338458],[117.020842,40.336179],[117.012686,40.32674],[117.01024,40.320726],[117.006998,40.319255],[117.007563,40.314599],[117.011306,40.307113],[117.002,40.299675],[117.004091,40.293918],[116.99834,40.29083],[116.990833,40.290603],[116.991042,40.287724],[116.983765,40.287886],[116.971343,40.281724],[116.970527,40.276531],[116.961995,40.273442],[116.960468,40.2704],[116.950953,40.261081],[116.954341,40.25715],[116.961786,40.252635],[116.969293,40.253962],[116.975881,40.249463],[116.974082,40.24456],[116.959924,40.23268],[116.956286,40.232615],[116.953567,40.236079],[116.946896,40.236095],[116.945641,40.233441],[116.936837,40.232259],[116.935206,40.229847],[116.931065,40.230624],[116.92544,40.225768],[116.922031,40.220134],[116.915507,40.222271],[116.913917,40.220118],[116.908606,40.222401],[116.906598,40.228682],[116.900701,40.228763],[116.893946,40.233457],[116.901746,40.23684],[116.894343,40.240028],[116.892252,40.245709],[116.886585,40.251907],[116.886104,40.255256],[116.881273,40.259221],[116.879893,40.264139],[116.874247,40.268281],[116.876338,40.274348],[116.871737,40.281481],[116.871319,40.290943],[116.859462,40.290878],[116.857182,40.2929],[116.854547,40.303152],[116.848984,40.311204],[116.838382,40.310185],[116.828992,40.304413],[116.830101,40.299206],[116.827215,40.298333],[116.82458,40.290991],[116.825123,40.285347],[116.811823,40.282387],[116.809607,40.28601],[116.800572,40.289196],[116.794487,40.287417],[116.788025,40.289439],[116.787795,40.281449],[116.784073,40.279443],[116.782964,40.273248],[116.773512,40.269527],[116.771651,40.266501],[116.768597,40.270109],[116.762658,40.269058],[116.752788,40.275512],[116.74298,40.279087],[116.738337,40.278764],[116.741098,40.283001],[116.738965,40.284101],[116.754461,40.303686],[116.756845,40.302586],[116.762888,40.310428],[116.773324,40.315973],[116.768639,40.317816],[116.762846,40.326707],[116.759689,40.326853],[116.758559,40.333884],[116.751491,40.335742],[116.744653,40.333706],[116.744046,40.339136],[116.73129,40.335031],[116.731185,40.339023],[116.722967,40.339152],[116.723887,40.344033],[116.727484,40.346522],[116.729031,40.355619],[116.725769,40.355619],[116.726773,40.361193],[116.718094,40.361338],[116.719872,40.369044],[116.714079,40.368608],[116.706509,40.373809],[116.707115,40.377007],[116.716254,40.384114],[116.711716,40.386908],[116.713849,40.395806],[116.713242,40.40157],[116.718512,40.402055],[116.723427,40.405316],[116.724389,40.409191],[116.728801,40.40982],[116.741139,40.414631],[116.733235,40.418312],[116.73244,40.420604],[116.72556,40.418053],[116.722339,40.423832],[116.723552,40.435065],[116.716421,40.441714],[116.72098,40.440988],[116.725811,40.443085],[116.719265,40.448636],[116.7196,40.455735],[116.723594,40.458542],[116.719223,40.460397],[116.716902,40.457074],[116.706174,40.459929],[116.698667,40.468043],[116.695571,40.466721],[116.693397,40.476108],[116.69348,40.481704],[116.704334,40.479043],[116.694149,40.485462],[116.693376,40.490783],[116.698353,40.493266],[116.699106,40.50444],[116.701071,40.510549],[116.711402,40.516465],[116.712239,40.522058],[116.717216,40.524798],[116.712573,40.529955],[116.706948,40.532582],[116.701469,40.539913],[116.702138,40.545456],[116.690699,40.549468],[116.68225,40.548904],[116.67698,40.554462],[116.665771,40.552432],[116.66872,40.557507],[116.682397,40.556766],[116.679636,40.562001],[116.686349,40.564497],[116.699336,40.563563],[116.709855,40.565512],[116.710503,40.568685],[116.71456,40.570682],[116.714351,40.58028],[116.708955,40.590054],[116.711611,40.59189],[116.708495,40.595206],[116.711235,40.600213],[116.705609,40.60303],[116.707993,40.606507],[116.70655,40.610998],[116.702598,40.612785],[116.697955,40.618402],[116.701322,40.621379],[116.704689,40.620076],[116.705128,40.626947],[116.70195,40.628444],[116.70149,40.632917],[116.712197,40.641268],[116.711151,40.648218],[116.712636,40.653896],[116.709855,40.662598],[116.714309,40.666104],[116.713221,40.669867],[116.714915,40.680014],[116.725413,40.68466],[116.725581,40.689114],[116.735807,40.69167],[116.74252,40.69593],[116.747518,40.697072],[116.748668,40.700544],[116.754963,40.702891],[116.756155,40.705687],[116.762867,40.706427],[116.769246,40.70281],[116.783989,40.700496],[116.787105,40.704482],[116.786687,40.7103],[116.789091,40.712454],[116.790472,40.728973],[116.786352,40.736026],[116.782818,40.747817],[116.780727,40.751512],[116.783759,40.757631],[116.793629,40.748267],[116.802977,40.745986],[116.810527,40.749118],[116.818662,40.75042],[116.826211,40.749343],[116.831795,40.751303],[116.840076,40.760682],[116.834785,40.770221],[116.850448,40.775006],[116.851264,40.778924],[116.856806,40.77955],[116.858039,40.78305],[116.867471,40.784559],[116.862577,40.792858],[116.871277,40.794785],[116.873326,40.798781],[116.878575,40.797545],[116.886961,40.801076]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":110119,\"name\":\"延庆区\",\"center\":[115.985006,40.465325],\"centroid\":[116.16401,40.540016],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":110000},\"subFeatureIndex\":15,\"acroutes\":[100000,110000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[115.967006,40.265612],[115.961611,40.269219],[115.960231,40.274914],[115.955212,40.276984],[115.951698,40.282015],[115.950088,40.289228],[115.946115,40.289034],[115.945885,40.296199],[115.939757,40.304397],[115.943814,40.310945],[115.937185,40.313047],[115.935721,40.316717],[115.929239,40.32105],[115.926792,40.319611],[115.922672,40.325899],[115.92721,40.329601],[115.922881,40.332898],[115.921417,40.338668],[115.924094,40.341059],[115.920581,40.346473],[115.918301,40.35389],[115.909539,40.357622],[115.892997,40.355554],[115.890927,40.357897],[115.88526,40.357024],[115.883169,40.359545],[115.878066,40.359367],[115.876226,40.362146],[115.872754,40.359593],[115.864452,40.359335],[115.861901,40.363422],[115.861859,40.373422],[115.855962,40.37712],[115.846865,40.375085],[115.840633,40.381094],[115.837454,40.381255],[115.836555,40.38568],[115.796445,40.426834],[115.796884,40.432531],[115.78992,40.432483],[115.786679,40.437066],[115.77043,40.444166],[115.773546,40.44812],[115.77248,40.452831],[115.77547,40.45204],[115.7734,40.457397],[115.779527,40.464075],[115.772856,40.462301],[115.770367,40.46493],[115.771559,40.47285],[115.776683,40.477511],[115.776202,40.482704],[115.782204,40.492073],[115.774529,40.493911],[115.768088,40.498345],[115.744039,40.498249],[115.743077,40.494959],[115.73605,40.503988],[115.743098,40.513854],[115.743788,40.518464],[115.748702,40.526087],[115.755624,40.531019],[115.752968,40.536288],[115.75506,40.540042],[115.759577,40.538914],[115.763885,40.540574],[115.770179,40.548002],[115.773902,40.548582],[115.776327,40.552158],[115.784713,40.558376],[115.7922,40.561292],[115.79908,40.5577],[115.804915,40.55865],[115.815036,40.55741],[115.819804,40.559343],[115.82154,40.563305],[115.820662,40.568234],[115.827374,40.587027],[115.846175,40.593049],[115.854895,40.590151],[115.86623,40.593371],[115.867777,40.595786],[115.885406,40.595223],[115.888146,40.597026],[115.894733,40.606878],[115.897849,40.608101],[115.907803,40.617291],[115.920372,40.616632],[115.928297,40.612753],[115.935031,40.613316],[115.944672,40.611095],[115.948331,40.608809],[115.955107,40.609534],[115.967404,40.605896],[115.965877,40.601002],[115.971983,40.60237],[115.97512,40.590779],[115.982147,40.579008],[115.995238,40.579862],[115.996116,40.58392],[116.005109,40.584097],[116.025268,40.60654],[116.028509,40.607328],[116.030036,40.597364],[116.032357,40.599875],[116.04457,40.602032],[116.050907,40.606121],[116.058289,40.607006],[116.062722,40.610322],[116.069811,40.610258],[116.073492,40.612125],[116.076691,40.619883],[116.08583,40.623825],[116.088507,40.626626],[116.098879,40.630584],[116.1044,40.626996],[116.118349,40.627961],[116.122071,40.629989],[116.120419,40.633287],[116.112744,40.640946],[116.111531,40.646287],[116.113225,40.648845],[116.125229,40.654089],[116.13694,40.667648],[116.142858,40.666972],[116.151432,40.663338],[116.162683,40.662437],[116.167597,40.672633],[116.168413,40.67892],[116.171487,40.68167],[116.173683,40.689034],[116.171341,40.695979],[116.176213,40.700544],[116.177907,40.707889],[116.181128,40.712438],[116.184913,40.713675],[116.192274,40.724779],[116.197753,40.7269],[116.2057,40.733038],[116.204717,40.739946],[116.210551,40.741713],[116.213249,40.740139],[116.220359,40.744669],[116.220485,40.749183],[116.223308,40.753793],[116.23366,40.759896],[116.229979,40.762417],[116.231757,40.77149],[116.235625,40.775135],[116.235019,40.78313],[116.245224,40.78838],[116.247943,40.791831],[116.257834,40.787898],[116.261013,40.782938],[116.269587,40.777158],[116.26988,40.770703],[116.274167,40.766335],[116.273456,40.762883],[116.277366,40.76163],[116.281402,40.763926],[116.290918,40.763814],[116.29786,40.756812],[116.304762,40.755656],[116.30794,40.752122],[116.311119,40.75511],[116.30794,40.763734],[116.313168,40.770205],[116.31756,40.77218],[116.330149,40.77377],[116.33314,40.772694],[116.342947,40.773096],[116.353111,40.770221],[116.361204,40.772646],[116.367687,40.77088],[116.37097,40.772453],[116.379837,40.772325],[116.392635,40.778394],[116.403217,40.778635],[116.407838,40.780417],[116.4143,40.777912],[116.416496,40.76937],[116.424861,40.767443],[116.431846,40.768246],[116.437722,40.766865],[116.444414,40.76921],[116.45395,40.76587],[116.465452,40.772742],[116.471517,40.771233],[116.4803,40.771586],[116.485193,40.765179],[116.491404,40.7633],[116.495482,40.759735],[116.50025,40.760811],[116.502906,40.756635],[116.501819,40.746581],[116.506461,40.743432],[116.513697,40.741456],[116.509493,40.73548],[116.510748,40.72645],[116.506858,40.720039],[116.504119,40.720135],[116.503115,40.715893],[116.506064,40.710879],[116.501923,40.706796],[116.501066,40.70228],[116.502676,40.697361],[116.496653,40.696879],[116.488811,40.69196],[116.483374,40.679403],[116.487138,40.674338],[116.492826,40.673984],[116.501568,40.671186],[116.505938,40.673067],[116.513488,40.672344],[116.517273,40.665734],[116.520096,40.66411],[116.518381,40.660925],[116.527039,40.6584],[116.529507,40.654588],[116.540046,40.656679],[116.544103,40.653767],[116.545023,40.650116],[116.550335,40.647606],[116.551151,40.642828],[116.55389,40.642877],[116.563886,40.636908],[116.573903,40.63628],[116.574092,40.631678],[116.568989,40.625483],[116.561231,40.628557],[116.551674,40.625209],[116.545003,40.627076],[116.539294,40.625612],[116.538938,40.619673],[116.535634,40.615698],[116.532915,40.606459],[116.535948,40.59944],[116.530929,40.595883],[116.531577,40.59131],[116.525136,40.583002],[116.517796,40.579749],[116.513153,40.572792],[116.509577,40.57276],[116.505144,40.562581],[116.499999,40.560921],[116.496277,40.555106],[116.484587,40.552867],[116.479651,40.541396],[116.470617,40.535418],[116.467125,40.530068],[116.460956,40.524363],[116.46587,40.518802],[116.470345,40.518963],[116.476306,40.514192],[116.488581,40.515853],[116.492073,40.518093],[116.497762,40.518093],[116.500459,40.510904],[116.506398,40.508212],[116.51194,40.501135],[116.519155,40.496604],[116.519092,40.491799],[116.511543,40.486929],[116.508322,40.483172],[116.492157,40.481027],[116.487347,40.481737],[116.483541,40.484994],[116.468212,40.48493],[116.465577,40.48701],[116.457903,40.488445],[116.455937,40.480914],[116.443201,40.481801],[116.433142,40.478189],[116.420971,40.480301],[116.416664,40.483011],[116.413673,40.481527],[116.4065,40.481995],[116.393702,40.47256],[116.38609,40.475802],[116.387344,40.482043],[116.376825,40.485736],[116.378603,40.491525],[116.377537,40.49683],[116.369632,40.500312],[116.365909,40.499635],[116.357042,40.501941],[116.348636,40.499071],[116.34232,40.500457],[116.336653,40.498636],[116.330567,40.500748],[116.323227,40.500151],[116.31321,40.491799],[116.31022,40.491702],[116.303779,40.485817],[116.29717,40.486768],[116.291691,40.485317],[116.294786,40.47535],[116.301646,40.468108],[116.306853,40.466092],[116.300955,40.458429],[116.293824,40.452831],[116.294368,40.449975],[116.289788,40.440907],[116.290667,40.435856],[116.294452,40.429304],[116.296648,40.420701],[116.291942,40.416617],[116.289433,40.418021],[116.288513,40.413437],[116.291608,40.408448],[116.287864,40.404719],[116.289746,40.402539],[116.286003,40.396032],[116.289872,40.391672],[116.290729,40.383177],[116.282845,40.375263],[116.270863,40.382693],[116.261264,40.380561],[116.258336,40.383193],[116.25338,40.381239],[116.252104,40.376297],[116.247796,40.374471],[116.24353,40.379818],[116.241962,40.377508],[116.23665,40.377427],[116.23184,40.374988],[116.226989,40.38111],[116.222221,40.382111],[116.211451,40.381756],[116.209129,40.376232],[116.192985,40.372775],[116.180354,40.367687],[116.177154,40.370934],[116.170713,40.369351],[116.168789,40.366718],[116.159295,40.366265],[116.148233,40.361807],[116.148651,40.35696],[116.145514,40.351046],[116.1507,40.349252],[116.155677,40.344906],[116.152603,40.337714],[116.144719,40.336631],[116.147543,40.340655],[116.144782,40.348541],[116.138404,40.345229],[116.140809,40.343047],[116.137567,40.340769],[116.137651,40.336534],[116.143904,40.336082],[116.13809,40.330974],[116.138383,40.324671],[116.141959,40.316879],[116.132737,40.31198],[116.122385,40.312805],[116.116237,40.321955],[116.116634,40.323668],[116.110381,40.330813],[116.102978,40.331524],[116.098649,40.330005],[116.086353,40.330813],[116.083342,40.33571],[116.077716,40.339346],[116.073429,40.339831],[116.06841,40.336971],[116.061802,40.336809],[116.053353,40.326853],[116.056971,40.322181],[116.051116,40.315812],[116.042479,40.316846],[116.040095,40.312724],[116.031144,40.312352],[116.026167,40.320484],[116.026481,40.324283],[116.01684,40.33466],[116.007597,40.33314],[115.999065,40.325463],[115.993398,40.328986],[115.982711,40.324202],[115.979658,40.320532],[115.973259,40.318997],[115.976417,40.311511],[115.975538,40.308698],[115.987919,40.303799],[115.990323,40.299498],[115.982732,40.297977],[115.978675,40.289633],[115.981227,40.28525],[115.978822,40.281627],[115.981812,40.276903],[115.976396,40.270983],[115.967006,40.265612]]]]}}]}', 'admin', '2020-12-10 10:26:00', NULL, '2020-12-10 10:26:00', '0', NULL); +INSERT INTO `jimu_report_map` VALUES ('1338695077400154114', '无锡市', 'wuxi', '{\"type\":\"FeatureCollection\",\"features\":[{\"type\":\"Feature\",\"properties\":{\"adcode\":320205,\"name\":\"锡山区\",\"center\":[120.357298,31.585559],\"centroid\":[120.482864,31.624824],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":320200},\"subFeatureIndex\":0,\"acroutes\":[100000,320000,320200]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[120.581713,31.727632],[120.582451,31.721169],[120.58458,31.71792],[120.58509,31.714432],[120.589848,31.714115],[120.590836,31.712997],[120.596788,31.710822],[120.599079,31.710716],[120.600806,31.708849],[120.600231,31.706876],[120.595734,31.705608],[120.592802,31.700817],[120.587024,31.696166],[120.584917,31.69281],[120.578118,31.6937],[120.578367,31.689947],[120.575587,31.691824],[120.576836,31.689463],[120.572405,31.689692],[120.570059,31.688908],[120.568049,31.685199],[120.566235,31.685393],[120.566094,31.683112],[120.562858,31.680513],[120.564161,31.67891],[120.566626,31.678672],[120.566377,31.676143],[120.568766,31.668593],[120.568625,31.665174],[120.566789,31.659931],[120.558589,31.658504],[120.561066,31.655693],[120.571731,31.655781],[120.583429,31.651957],[120.586643,31.651816],[120.592128,31.650282],[120.595854,31.643761],[120.589587,31.636525],[120.595571,31.631395],[120.592107,31.62504],[120.6006,31.617115],[120.596266,31.613298],[120.591488,31.611499],[120.584482,31.613439],[120.577086,31.614162],[120.570026,31.609445],[120.567126,31.609172],[120.568343,31.606183],[120.566464,31.601933],[120.557058,31.600302],[120.553104,31.60561],[120.546251,31.604693],[120.54309,31.601739],[120.545078,31.585717],[120.547782,31.583283],[120.546848,31.579685],[120.548,31.576599],[120.550215,31.575011],[120.553072,31.575082],[120.563629,31.579597],[120.568256,31.576299],[120.573035,31.577472],[120.567419,31.583998],[120.570428,31.585665],[120.573838,31.585947],[120.584254,31.585144],[120.587045,31.583389],[120.594572,31.576008],[120.595962,31.571492],[120.597548,31.563862],[120.599264,31.54846],[120.60502,31.546078],[120.602805,31.541182],[120.602913,31.53827],[120.605118,31.535685],[120.60426,31.530867],[120.605759,31.525247],[120.602349,31.51899],[120.600035,31.51861],[120.598569,31.516166],[120.595636,31.517145],[120.593986,31.525502],[120.592758,31.52755],[120.589826,31.526967],[120.585775,31.524532],[120.576923,31.517498],[120.568549,31.512371],[120.559849,31.508964],[120.555201,31.507579],[120.551616,31.500632],[120.548499,31.497402],[120.548043,31.495089],[120.549086,31.489175],[120.553007,31.486738],[120.555244,31.480294],[120.555233,31.477866],[120.553441,31.477027],[120.551236,31.48213],[120.552062,31.483825],[120.547793,31.486244],[120.546197,31.487912],[120.542971,31.487612],[120.534999,31.487921],[120.533055,31.490675],[120.531024,31.495327],[120.528613,31.497887],[120.5253,31.499229],[120.525267,31.502583],[120.522389,31.504631],[120.519804,31.500888],[120.518295,31.501718],[120.519598,31.504604],[120.521118,31.504507],[120.521129,31.507402],[120.519196,31.508929],[120.518251,31.512759],[120.521542,31.512609],[120.523519,31.514524],[120.521455,31.515672],[120.52265,31.517869],[120.522606,31.521452],[120.528786,31.526588],[120.523888,31.529244],[120.518914,31.527453],[120.516959,31.529817],[120.513016,31.531547],[120.508096,31.534926],[120.506782,31.537476],[120.504544,31.538791],[120.505967,31.542099],[120.502774,31.544552],[120.504523,31.549493],[120.503295,31.552686],[120.498647,31.554697],[120.490707,31.557414],[120.486971,31.555941],[120.481334,31.554883],[120.481693,31.55954],[120.477033,31.558905],[120.47623,31.560511],[120.472819,31.561066],[120.473112,31.563986],[120.46614,31.564674],[120.466715,31.566791],[120.46085,31.565838],[120.457831,31.564171],[120.455116,31.568061],[120.45176,31.5665],[120.451477,31.568255],[120.448545,31.569631],[120.448968,31.571095],[120.444178,31.576475],[120.439237,31.574676],[120.434099,31.576466],[120.429288,31.577286],[120.422543,31.580823],[120.419404,31.581026],[120.415733,31.583425],[120.414267,31.580691],[120.399615,31.580197],[120.394522,31.57674],[120.394804,31.573635],[120.39374,31.573538],[120.39677,31.569516],[120.392588,31.567408],[120.388646,31.570919],[120.387321,31.573441],[120.385051,31.573776],[120.380435,31.575875],[120.37811,31.576025],[120.372028,31.573679],[120.369367,31.573397],[120.366913,31.57009],[120.362753,31.569031],[120.351881,31.568035],[120.348905,31.565847],[120.346135,31.569516],[120.348394,31.570857],[120.349557,31.574455],[120.345886,31.575858],[120.347135,31.581326],[120.34581,31.590876],[120.342334,31.598274],[120.340792,31.599958],[120.341096,31.60308],[120.349231,31.602762],[120.352848,31.603847],[120.352587,31.607479],[120.350013,31.610838],[120.340042,31.610486],[120.321741,31.613562],[120.31794,31.613792],[120.314432,31.612989],[120.314606,31.619072],[120.315779,31.632012],[120.317723,31.634551],[120.323903,31.636146],[120.329985,31.638737],[120.334123,31.637821],[120.334905,31.636199],[120.340683,31.635485],[120.343257,31.63664],[120.346668,31.636128],[120.345266,31.646017],[120.345288,31.65245],[120.357811,31.652714],[120.360461,31.655323],[120.362644,31.655349],[120.366326,31.653419],[120.368075,31.653499],[120.368716,31.655781],[120.374765,31.660962],[120.378751,31.665685],[120.382629,31.667377],[120.391176,31.674478],[120.390981,31.676689],[120.389373,31.677932],[120.383204,31.679491],[120.379349,31.682037],[120.378056,31.684407],[120.376981,31.690978],[120.3776,31.693383],[120.382857,31.694202],[120.384909,31.695171],[120.390307,31.699513],[120.394174,31.699231],[120.398106,31.697408],[120.399398,31.699998],[120.402982,31.699522],[120.411041,31.703538],[120.415375,31.704604],[120.41986,31.704498],[120.427376,31.70249],[120.430309,31.704604],[120.432948,31.705309],[120.44685,31.706084],[120.451173,31.707255],[120.452824,31.711456],[120.456701,31.710725],[120.458309,31.7132],[120.461339,31.714503],[120.46261,31.716132],[120.471907,31.712513],[120.485125,31.713728],[120.487297,31.715445],[120.491272,31.713719],[120.492163,31.711905],[120.491022,31.70965],[120.496312,31.710417],[120.498288,31.713402],[120.504827,31.713825],[120.507336,31.724119],[120.50853,31.724762],[120.518284,31.734896],[120.528504,31.725818],[120.535129,31.721653],[120.541755,31.723397],[120.546968,31.725977],[120.551953,31.726734],[120.562412,31.723062],[120.56806,31.722957],[120.576,31.726153],[120.580257,31.726329],[120.581713,31.727632]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":320206,\"name\":\"惠山区\",\"center\":[120.303543,31.681019],\"centroid\":[120.210639,31.65177],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":320200},\"subFeatureIndex\":1,\"acroutes\":[100000,320000,320200]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[120.074955,31.554424],[120.071827,31.554371],[120.069188,31.552492],[120.063899,31.555571],[120.058208,31.559523],[120.056155,31.563404],[120.05937,31.56904],[120.059457,31.57263],[120.055775,31.576669],[120.057067,31.5804],[120.061814,31.583072],[120.064692,31.586961],[120.068526,31.590127],[120.070622,31.590956],[120.07489,31.595364],[120.075585,31.607118],[120.084242,31.611808],[120.093962,31.618085],[120.10238,31.625877],[120.104476,31.628769],[120.116423,31.62995],[120.119486,31.630893],[120.121115,31.638147],[120.124482,31.648238],[120.125883,31.657843],[120.126024,31.673844],[120.126709,31.678725],[120.128533,31.684636],[120.143272,31.676073],[120.151037,31.682398],[120.151027,31.684829],[120.149365,31.686221],[120.143,31.688327],[120.143858,31.689965],[120.14527,31.697065],[120.147703,31.69821],[120.15359,31.699143],[120.153166,31.70212],[120.156837,31.703829],[120.155979,31.712601],[120.158912,31.713948],[120.159477,31.717206],[120.16141,31.718069],[120.158075,31.722393],[120.158108,31.725924],[120.155176,31.727086],[120.155979,31.729569],[120.157684,31.730696],[120.156131,31.737942],[120.154752,31.741429],[120.155968,31.742045],[120.156077,31.751509],[120.155241,31.752283],[120.155621,31.756843],[120.159998,31.759079],[120.169023,31.760962],[120.17239,31.75804],[120.178657,31.758401],[120.183121,31.753296],[120.183947,31.749915],[120.197056,31.752706],[120.201161,31.753269],[120.203779,31.740381],[120.202921,31.735372],[120.203942,31.728891],[120.206451,31.726065],[120.215357,31.724321],[120.220494,31.723969],[120.224991,31.724779],[120.228857,31.727306],[120.237361,31.728363],[120.248646,31.726928],[120.254446,31.724365],[120.256933,31.72013],[120.261104,31.721002],[120.264384,31.722692],[120.273714,31.724603],[120.276157,31.723168],[120.282435,31.70338],[120.283662,31.7019],[120.292558,31.69909],[120.298423,31.698932],[120.311336,31.700253],[120.319395,31.700746],[120.333862,31.698192],[120.336013,31.694396],[120.346624,31.691145],[120.349209,31.689128],[120.360135,31.687481],[120.366619,31.689137],[120.371322,31.691612],[120.3776,31.693383],[120.376981,31.690978],[120.378056,31.684407],[120.379349,31.682037],[120.383204,31.679491],[120.389373,31.677932],[120.390981,31.676689],[120.391176,31.674478],[120.382629,31.667377],[120.378751,31.665685],[120.374765,31.660962],[120.368716,31.655781],[120.368075,31.653499],[120.366326,31.653419],[120.362644,31.655349],[120.360461,31.655323],[120.357811,31.652714],[120.345288,31.65245],[120.345266,31.646017],[120.346668,31.636128],[120.343257,31.63664],[120.340683,31.635485],[120.334905,31.636199],[120.334123,31.637821],[120.329985,31.638737],[120.323903,31.636146],[120.317723,31.634551],[120.315779,31.632012],[120.314606,31.619072],[120.312553,31.618825],[120.305287,31.62288],[120.300258,31.624881],[120.290168,31.626538],[120.282935,31.626521],[120.283108,31.6292],[120.269728,31.630778],[120.266491,31.625578],[120.265481,31.621567],[120.262331,31.619583],[120.253012,31.626741],[120.248233,31.626627],[120.243878,31.625384],[120.246289,31.6208],[120.24516,31.618102],[120.241565,31.615969],[120.244106,31.608846],[120.246105,31.600523],[120.242531,31.59249],[120.240576,31.592331],[120.234787,31.594359],[120.228358,31.594553],[120.222156,31.592666],[120.215476,31.592578],[120.214043,31.590832],[120.220983,31.579562],[120.220266,31.576528],[120.217084,31.57681],[120.213684,31.574605],[120.197914,31.568634],[120.196947,31.566738],[120.199054,31.564974],[120.197371,31.561551],[120.194482,31.561269],[120.186336,31.565935],[120.184435,31.564991],[120.183697,31.560458],[120.181611,31.556991],[120.179157,31.555474],[120.176735,31.556585],[120.175323,31.561631],[120.173346,31.564118],[120.168144,31.5647],[120.165189,31.566844],[120.163061,31.573662],[120.16255,31.576987],[120.161551,31.59413],[120.153927,31.589501],[120.14956,31.587384],[120.135995,31.582146],[120.134018,31.582225],[120.132063,31.579227],[120.128913,31.577533],[120.122408,31.577128],[120.119301,31.575381],[120.118661,31.572859],[120.113762,31.572083],[120.111514,31.570733],[120.112882,31.568864],[120.102054,31.563545],[120.091562,31.559258],[120.085143,31.557194],[120.074955,31.554424]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":320211,\"name\":\"滨湖区\",\"center\":[120.266053,31.550228],\"centroid\":[120.196866,31.446924],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":320200},\"subFeatureIndex\":2,\"acroutes\":[100000,320000,320200]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[120.100153,31.335332],[120.100436,31.33939],[120.096145,31.352493],[120.093658,31.353138],[120.057252,31.356126],[120.044859,31.358805],[120.041905,31.361024],[120.040157,31.364498],[120.039711,31.378127],[120.044566,31.406228],[120.054786,31.434286],[120.060966,31.440424],[120.078757,31.450007],[120.087793,31.453416],[120.089987,31.45474],[120.091356,31.453186],[120.110069,31.461531],[120.105682,31.470493],[120.108733,31.480991],[120.111188,31.48514],[120.117607,31.493235],[120.123581,31.499202],[120.127501,31.501471],[120.129739,31.504701],[120.12319,31.511338],[120.12206,31.508479],[120.121984,31.505354],[120.118834,31.505504],[120.118378,31.51193],[120.120257,31.514983],[120.11626,31.516228],[120.117542,31.518037],[120.115771,31.519105],[120.111025,31.514039],[120.10743,31.511983],[120.102738,31.513545],[120.100501,31.516828],[120.103412,31.518557],[120.103955,31.521011],[120.10238,31.523146],[120.102358,31.527391],[120.103857,31.52815],[120.101587,31.529959],[120.102054,31.533523],[120.100729,31.533797],[120.10112,31.536841],[120.103151,31.538782],[120.101717,31.542002],[120.09948,31.542338],[120.096786,31.541138],[120.094169,31.541932],[120.095038,31.544173],[120.096732,31.543573],[120.099056,31.546299],[120.096949,31.547252],[120.097329,31.548743],[120.085339,31.550904],[120.082319,31.550286],[120.080191,31.55146],[120.081537,31.553418],[120.079561,31.555033],[120.074955,31.554424],[120.085143,31.557194],[120.091562,31.559258],[120.102054,31.563545],[120.112882,31.568864],[120.111514,31.570733],[120.113762,31.572083],[120.118661,31.572859],[120.119301,31.575381],[120.122408,31.577128],[120.128913,31.577533],[120.132063,31.579227],[120.134018,31.582225],[120.135995,31.582146],[120.14956,31.587384],[120.153927,31.589501],[120.161551,31.59413],[120.16255,31.576987],[120.163061,31.573662],[120.165189,31.566844],[120.168144,31.5647],[120.173346,31.564118],[120.175323,31.561631],[120.176735,31.556585],[120.179157,31.555474],[120.181611,31.556991],[120.183697,31.560458],[120.184435,31.564991],[120.186336,31.565935],[120.194482,31.561269],[120.197371,31.561551],[120.199054,31.564974],[120.196947,31.566738],[120.197914,31.568634],[120.213684,31.574605],[120.217084,31.57681],[120.220266,31.576528],[120.220983,31.579562],[120.214043,31.590832],[120.215476,31.592578],[120.222156,31.592666],[120.228358,31.594553],[120.234787,31.594359],[120.240576,31.592331],[120.242531,31.59249],[120.244454,31.587657],[120.250102,31.583045],[120.255489,31.580603],[120.25904,31.580259],[120.263189,31.578495],[120.269065,31.578856],[120.268011,31.580338],[120.271009,31.581229],[120.271954,31.579915],[120.27707,31.580497],[120.280643,31.577904],[120.279524,31.574755],[120.27985,31.570195],[120.283,31.565512],[120.289907,31.558191],[120.288267,31.554936],[120.285368,31.551451],[120.285096,31.549828],[120.287637,31.537626],[120.287855,31.535306],[120.291971,31.535262],[120.293046,31.532332],[120.297076,31.531432],[120.29675,31.528291],[120.295316,31.525847],[120.298227,31.523596],[120.303842,31.525114],[120.307937,31.524946],[120.310294,31.526605],[120.311532,31.521699],[120.310087,31.520269],[120.308241,31.520737],[120.307329,31.517401],[120.31126,31.514013],[120.313639,31.513227],[120.322121,31.513836],[120.323533,31.513077],[120.325695,31.516898],[120.330495,31.518805],[120.331679,31.522511],[120.334612,31.52657],[120.338055,31.529138],[120.347135,31.527338],[120.357453,31.518399],[120.362579,31.513439],[120.356269,31.509379],[120.351718,31.507879],[120.354031,31.500765],[120.354792,31.500879],[120.360429,31.491408],[120.359755,31.489907],[120.354998,31.488539],[120.357083,31.47384],[120.361221,31.471853],[120.359169,31.46795],[120.353293,31.461496],[120.355823,31.416459],[120.335546,31.407359],[120.308143,31.393266],[120.253121,31.366098],[120.209611,31.345668],[120.173715,31.30881],[120.110232,31.264001],[120.100153,31.335332]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":320213,\"name\":\"梁溪区\",\"center\":[120.296595,31.575706],\"centroid\":[120.299797,31.580629],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":320200},\"subFeatureIndex\":3,\"acroutes\":[100000,320000,320200]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[120.345886,31.575858],[120.342844,31.576228],[120.340346,31.575038],[120.336784,31.575187],[120.336762,31.573706],[120.334253,31.573812],[120.334156,31.576493],[120.332005,31.577992],[120.330593,31.576819],[120.332516,31.573873],[120.329844,31.574014],[120.330202,31.572427],[120.333015,31.571527],[120.333167,31.569746],[120.331332,31.568343],[120.326346,31.569349],[120.326879,31.570866],[120.329518,31.569657],[120.32967,31.574041],[120.327052,31.5742],[120.32702,31.575778],[120.323631,31.575461],[120.325673,31.573679],[120.323805,31.572321],[120.319189,31.578953],[120.321046,31.579553],[120.319015,31.581326],[120.317506,31.579624],[120.319091,31.577551],[120.316843,31.576475],[120.316571,31.578415],[120.315094,31.575919],[120.317017,31.574438],[120.313954,31.573891],[120.317332,31.572912],[120.317614,31.574755],[120.319656,31.573723],[120.31958,31.569993],[120.323718,31.569869],[120.320405,31.568687],[120.322491,31.567946],[120.323077,31.562248],[120.32122,31.559558],[120.323642,31.559911],[120.324391,31.556762],[120.334514,31.55677],[120.343073,31.545408],[120.33799,31.543652],[120.335502,31.538967],[120.346505,31.528573],[120.347135,31.527338],[120.338055,31.529138],[120.334612,31.52657],[120.331679,31.522511],[120.330495,31.518805],[120.325695,31.516898],[120.323533,31.513077],[120.322121,31.513836],[120.313639,31.513227],[120.31126,31.514013],[120.307329,31.517401],[120.308241,31.520737],[120.310087,31.520269],[120.311532,31.521699],[120.310294,31.526605],[120.307937,31.524946],[120.303842,31.525114],[120.298227,31.523596],[120.295316,31.525847],[120.29675,31.528291],[120.297076,31.531432],[120.293046,31.532332],[120.291971,31.535262],[120.287855,31.535306],[120.287637,31.537626],[120.285096,31.549828],[120.285368,31.551451],[120.288267,31.554936],[120.289907,31.558191],[120.283,31.565512],[120.27985,31.570195],[120.279524,31.574755],[120.280643,31.577904],[120.27707,31.580497],[120.271954,31.579915],[120.271009,31.581229],[120.268011,31.580338],[120.269065,31.578856],[120.263189,31.578495],[120.25904,31.580259],[120.255489,31.580603],[120.250102,31.583045],[120.244454,31.587657],[120.242531,31.59249],[120.246105,31.600523],[120.244106,31.608846],[120.241565,31.615969],[120.24516,31.618102],[120.246289,31.6208],[120.243878,31.625384],[120.248233,31.626627],[120.253012,31.626741],[120.262331,31.619583],[120.265481,31.621567],[120.266491,31.625578],[120.269728,31.630778],[120.283108,31.6292],[120.282935,31.626521],[120.290168,31.626538],[120.300258,31.624881],[120.305287,31.62288],[120.312553,31.618825],[120.314606,31.619072],[120.314432,31.612989],[120.31794,31.613792],[120.321741,31.613562],[120.340042,31.610486],[120.350013,31.610838],[120.352587,31.607479],[120.352848,31.603847],[120.349231,31.602762],[120.341096,31.60308],[120.340792,31.599958],[120.342334,31.598274],[120.34581,31.590876],[120.347135,31.581326],[120.345886,31.575858]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":320214,\"name\":\"新吴区\",\"center\":[120.352782,31.550966],\"centroid\":[120.429487,31.506686],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":320200},\"subFeatureIndex\":4,\"acroutes\":[100000,320000,320200]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[120.347135,31.527338],[120.346505,31.528573],[120.335502,31.538967],[120.33799,31.543652],[120.343073,31.545408],[120.334514,31.55677],[120.324391,31.556762],[120.323642,31.559911],[120.32122,31.559558],[120.323077,31.562248],[120.322491,31.567946],[120.320405,31.568687],[120.323718,31.569869],[120.31958,31.569993],[120.319656,31.573723],[120.317614,31.574755],[120.317332,31.572912],[120.313954,31.573891],[120.317017,31.574438],[120.315094,31.575919],[120.316571,31.578415],[120.316843,31.576475],[120.319091,31.577551],[120.317506,31.579624],[120.319015,31.581326],[120.321046,31.579553],[120.319189,31.578953],[120.323805,31.572321],[120.325673,31.573679],[120.323631,31.575461],[120.32702,31.575778],[120.327052,31.5742],[120.32967,31.574041],[120.329518,31.569657],[120.326879,31.570866],[120.326346,31.569349],[120.331332,31.568343],[120.333167,31.569746],[120.333015,31.571527],[120.330202,31.572427],[120.329844,31.574014],[120.332516,31.573873],[120.330593,31.576819],[120.332005,31.577992],[120.334156,31.576493],[120.334253,31.573812],[120.336762,31.573706],[120.336784,31.575187],[120.340346,31.575038],[120.342844,31.576228],[120.345886,31.575858],[120.349557,31.574455],[120.348394,31.570857],[120.346135,31.569516],[120.348905,31.565847],[120.351881,31.568035],[120.362753,31.569031],[120.366913,31.57009],[120.369367,31.573397],[120.372028,31.573679],[120.37811,31.576025],[120.380435,31.575875],[120.385051,31.573776],[120.387321,31.573441],[120.388646,31.570919],[120.392588,31.567408],[120.39677,31.569516],[120.39374,31.573538],[120.394804,31.573635],[120.394522,31.57674],[120.399615,31.580197],[120.414267,31.580691],[120.415733,31.583425],[120.419404,31.581026],[120.422543,31.580823],[120.429288,31.577286],[120.434099,31.576466],[120.439237,31.574676],[120.444178,31.576475],[120.448968,31.571095],[120.448545,31.569631],[120.451477,31.568255],[120.45176,31.5665],[120.455116,31.568061],[120.457831,31.564171],[120.46085,31.565838],[120.466715,31.566791],[120.46614,31.564674],[120.473112,31.563986],[120.472819,31.561066],[120.47623,31.560511],[120.477033,31.558905],[120.481693,31.55954],[120.481334,31.554883],[120.486971,31.555941],[120.490707,31.557414],[120.498647,31.554697],[120.503295,31.552686],[120.504523,31.549493],[120.502774,31.544552],[120.505967,31.542099],[120.504544,31.538791],[120.506782,31.537476],[120.508096,31.534926],[120.513016,31.531547],[120.516959,31.529817],[120.518914,31.527453],[120.523888,31.529244],[120.528786,31.526588],[120.522606,31.521452],[120.52265,31.517869],[120.521455,31.515672],[120.523519,31.514524],[120.521542,31.512609],[120.518251,31.512759],[120.519196,31.508929],[120.521129,31.507402],[120.521118,31.504507],[120.519598,31.504604],[120.518295,31.501718],[120.519804,31.500888],[120.522389,31.504631],[120.525267,31.502583],[120.5253,31.499229],[120.528613,31.497887],[120.531024,31.495327],[120.533055,31.490675],[120.534999,31.487921],[120.542971,31.487612],[120.546197,31.487912],[120.547793,31.486244],[120.552062,31.483825],[120.551236,31.48213],[120.553441,31.477027],[120.54636,31.473133],[120.543568,31.470264],[120.537312,31.468365],[120.53615,31.467094],[120.5311,31.466608],[120.526017,31.46833],[120.523845,31.468357],[120.516003,31.464427],[120.515981,31.460233],[120.517361,31.457831],[120.513852,31.456189],[120.512364,31.45708],[120.50853,31.45565],[120.505044,31.457964],[120.501406,31.457557],[120.495421,31.451093],[120.495758,31.447931],[120.487026,31.44862],[120.484799,31.447481],[120.485418,31.449901],[120.480552,31.449132],[120.474437,31.446571],[120.460177,31.445485],[120.438172,31.44877],[120.431721,31.448647],[120.437477,31.443047],[120.435001,31.442606],[120.430537,31.446395],[120.426584,31.445441],[120.422641,31.448991],[120.418818,31.448382],[120.355823,31.416459],[120.353293,31.461496],[120.359169,31.46795],[120.361221,31.471853],[120.357083,31.47384],[120.354998,31.488539],[120.359755,31.489907],[120.360429,31.491408],[120.354792,31.500879],[120.354031,31.500765],[120.351718,31.507879],[120.356269,31.509379],[120.362579,31.513439],[120.357453,31.518399],[120.347135,31.527338]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":320281,\"name\":\"江阴市\",\"center\":[120.275891,31.910984],\"centroid\":[120.303787,31.832204],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":320200},\"subFeatureIndex\":5,\"acroutes\":[100000,320000,320200]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[120.581713,31.727632],[120.580257,31.726329],[120.576,31.726153],[120.56806,31.722957],[120.562412,31.723062],[120.551953,31.726734],[120.546968,31.725977],[120.541755,31.723397],[120.535129,31.721653],[120.528504,31.725818],[120.518284,31.734896],[120.50853,31.724762],[120.507336,31.724119],[120.504827,31.713825],[120.498288,31.713402],[120.496312,31.710417],[120.491022,31.70965],[120.492163,31.711905],[120.491272,31.713719],[120.487297,31.715445],[120.485125,31.713728],[120.471907,31.712513],[120.46261,31.716132],[120.461339,31.714503],[120.458309,31.7132],[120.456701,31.710725],[120.452824,31.711456],[120.451173,31.707255],[120.44685,31.706084],[120.432948,31.705309],[120.430309,31.704604],[120.427376,31.70249],[120.41986,31.704498],[120.415375,31.704604],[120.411041,31.703538],[120.402982,31.699522],[120.399398,31.699998],[120.398106,31.697408],[120.394174,31.699231],[120.390307,31.699513],[120.384909,31.695171],[120.382857,31.694202],[120.3776,31.693383],[120.371322,31.691612],[120.366619,31.689137],[120.360135,31.687481],[120.349209,31.689128],[120.346624,31.691145],[120.336013,31.694396],[120.333862,31.698192],[120.319395,31.700746],[120.311336,31.700253],[120.298423,31.698932],[120.292558,31.69909],[120.283662,31.7019],[120.282435,31.70338],[120.276157,31.723168],[120.273714,31.724603],[120.264384,31.722692],[120.261104,31.721002],[120.256933,31.72013],[120.254446,31.724365],[120.248646,31.726928],[120.237361,31.728363],[120.228857,31.727306],[120.224991,31.724779],[120.220494,31.723969],[120.215357,31.724321],[120.206451,31.726065],[120.203942,31.728891],[120.202921,31.735372],[120.203779,31.740381],[120.201161,31.753269],[120.200043,31.757767],[120.196556,31.764774],[120.192527,31.767352],[120.186108,31.783633],[120.185098,31.787681],[120.181242,31.79399],[120.174248,31.801029],[120.176192,31.807267],[120.179244,31.812853],[120.177886,31.814137],[120.172217,31.814947],[120.17049,31.817251],[120.172043,31.823004],[120.165494,31.825564],[120.163919,31.830287],[120.164093,31.832697],[120.167079,31.835485],[120.16999,31.836065],[120.173194,31.838774],[120.172521,31.840867],[120.1768,31.844499],[120.180493,31.849002],[120.184251,31.856124],[120.185185,31.860415],[120.182719,31.864855],[120.175888,31.870209],[120.168795,31.870165],[120.158119,31.867835],[120.151657,31.864187],[120.146161,31.862481],[120.144228,31.858929],[120.122809,31.859342],[120.117401,31.855007],[120.114088,31.855342],[120.098665,31.855553],[120.085469,31.853055],[120.080299,31.84748],[120.060489,31.834517],[120.056405,31.833348],[120.056698,31.831976],[120.051887,31.829152],[120.047966,31.825713],[120.044979,31.821755],[120.032011,31.826074],[120.030251,31.831272],[120.028763,31.832116],[120.025277,31.831677],[120.02279,31.828669],[120.022225,31.826654],[120.019292,31.822802],[120.014557,31.824948],[120.011331,31.823849],[120.009811,31.826989],[120.006292,31.825317],[120.003359,31.828246],[120.003685,31.838598],[120.000709,31.837859],[120.001187,31.840559],[120.000459,31.845616],[119.997342,31.845941],[119.99681,31.848984],[119.992911,31.84945],[119.990152,31.852809],[119.990217,31.854867],[119.995029,31.855939],[120.003272,31.859158],[120.005097,31.862543],[120.007997,31.8638],[120.007997,31.866886],[120.010506,31.867809],[120.013199,31.871686],[120.010223,31.873814],[120.01069,31.875546],[120.014774,31.881787],[120.009018,31.882868],[120.008518,31.885496],[120.006324,31.889127],[120.002555,31.8891],[120.000188,31.892537],[119.997831,31.894348],[120.001915,31.901484],[120.000894,31.905571],[120.005477,31.911889],[120.014991,31.914754],[120.022409,31.919692],[120.014405,31.927073],[120.011342,31.929331],[120.007399,31.935929],[120.008192,31.94033],[120.007649,31.947999],[120.008779,31.951293],[120.010832,31.953805],[120.01485,31.955149],[120.022399,31.967752],[120.064909,31.955465],[120.134811,31.939381],[120.175247,31.933829],[120.205875,31.931519],[120.236601,31.932907],[120.262994,31.941841],[120.294165,31.954886],[120.353054,31.980635],[120.370703,31.99082],[120.368878,31.961086],[120.371594,31.954956],[120.373527,31.946435],[120.375341,31.941727],[120.385996,31.935621],[120.390307,31.932195],[120.391252,31.928602],[120.390481,31.925852],[120.381065,31.918884],[120.379349,31.914148],[120.379761,31.912188],[120.38265,31.910949],[120.385214,31.911722],[120.385138,31.909534],[120.38857,31.909218],[120.390905,31.907926],[120.392067,31.905307],[120.396411,31.908181],[120.39791,31.90616],[120.40131,31.90536],[120.402385,31.907381],[120.40774,31.905518],[120.424998,31.898399],[120.436847,31.895604],[120.449544,31.891948],[120.466498,31.889979],[120.466574,31.887791],[120.468822,31.879616],[120.471299,31.879203],[120.484593,31.87442],[120.490881,31.871335],[120.492261,31.86547],[120.496073,31.860881],[120.502057,31.85215],[120.503274,31.841711],[120.508292,31.84369],[120.514428,31.841527],[120.517393,31.837947],[120.521977,31.834183],[120.528808,31.831351],[120.531306,31.827851],[120.529319,31.821324],[120.530839,31.81704],[120.529959,31.814674],[120.523693,31.810531],[120.522541,31.80629],[120.523942,31.801293],[120.526516,31.795548],[120.531154,31.793207],[120.531556,31.787796],[120.544394,31.787136],[120.544502,31.789468],[120.546229,31.791922],[120.548923,31.792054],[120.555483,31.794069],[120.555852,31.786872],[120.558383,31.78571],[120.57071,31.793779],[120.580735,31.784795],[120.584243,31.782146],[120.58874,31.771603],[120.589402,31.766182],[120.588533,31.762556],[120.594833,31.760434],[120.597668,31.75503],[120.600024,31.744625],[120.598754,31.742802],[120.594822,31.741138],[120.593323,31.738171],[120.589435,31.73494],[120.585601,31.735407],[120.584352,31.734465],[120.581713,31.727632]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":320282,\"name\":\"宜兴市\",\"center\":[119.820538,31.364384],\"centroid\":[119.787423,31.352315],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":320200},\"subFeatureIndex\":6,\"acroutes\":[100000,320000,320200]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[120.100153,31.335332],[120.110232,31.264001],[119.920011,31.170918],[119.913103,31.169572],[119.900211,31.169182],[119.891305,31.16431],[119.885245,31.162875],[119.883463,31.161538],[119.878359,31.16082],[119.875242,31.162353],[119.86664,31.168314],[119.859406,31.168828],[119.856267,31.170121],[119.851304,31.167827],[119.8476,31.167579],[119.842148,31.168757],[119.837575,31.173673],[119.831808,31.172451],[119.82817,31.17447],[119.826464,31.173204],[119.823782,31.168226],[119.823445,31.165825],[119.82792,31.163363],[119.829744,31.161387],[119.829375,31.158269],[119.823304,31.154132],[119.813583,31.149614],[119.809858,31.148524],[119.806599,31.149392],[119.800995,31.156338],[119.798019,31.157436],[119.794066,31.156205],[119.791274,31.156612],[119.789233,31.159686],[119.789352,31.162158],[119.793392,31.168057],[119.792513,31.171459],[119.790492,31.173204],[119.786626,31.173762],[119.784606,31.176011],[119.779327,31.178784],[119.773039,31.178049],[119.765653,31.173779],[119.762286,31.173363],[119.755357,31.170777],[119.753163,31.171406],[119.747754,31.169661],[119.74467,31.169882],[119.74051,31.173416],[119.738609,31.173585],[119.732864,31.171494],[119.723708,31.169758],[119.715888,31.169572],[119.713107,31.167614],[119.710316,31.158862],[119.707937,31.154025],[119.703875,31.151899],[119.698727,31.153069],[119.693297,31.156958],[119.68275,31.160501],[119.679275,31.167118],[119.678048,31.16819],[119.672606,31.167995],[119.663733,31.165958],[119.66294,31.164798],[119.662516,31.159855],[119.660072,31.15896],[119.656401,31.155283],[119.649374,31.154105],[119.645768,31.150464],[119.641554,31.148116],[119.637775,31.140488],[119.638122,31.135526],[119.63078,31.131255],[119.621972,31.130032],[119.616052,31.130094],[119.613728,31.129181],[119.609775,31.123811],[119.602802,31.112139],[119.599782,31.10917],[119.592115,31.110056],[119.581992,31.108647],[119.576507,31.110269],[119.574096,31.113991],[119.571326,31.129013],[119.564039,31.135871],[119.560259,31.140718],[119.554188,31.143996],[119.545835,31.14785],[119.541382,31.152333],[119.534518,31.158109],[119.532596,31.159093],[119.536625,31.167889],[119.543022,31.17548],[119.546378,31.176038],[119.548963,31.177942],[119.552374,31.177969],[119.553579,31.179156],[119.553188,31.183168],[119.554296,31.191678],[119.552765,31.201083],[119.552971,31.208635],[119.552558,31.212389],[119.550745,31.21617],[119.553851,31.221048],[119.551233,31.224952],[119.544152,31.226864],[119.536115,31.233494],[119.534475,31.236761],[119.530793,31.237283],[119.529066,31.23931],[119.522593,31.242169],[119.528588,31.247506],[119.527122,31.25232],[119.531553,31.2564],[119.532183,31.258586],[119.530478,31.268965],[119.535669,31.272505],[119.535528,31.275964],[119.530956,31.277663],[119.530912,31.279946],[119.533041,31.285404],[119.531401,31.287864],[119.535094,31.290907],[119.533671,31.294269],[119.527187,31.29794],[119.523679,31.301142],[119.522929,31.310924],[119.51966,31.313418],[119.520029,31.318247],[119.52672,31.327152],[119.53051,31.330875],[119.530728,31.339293],[119.528523,31.344969],[119.527589,31.360334],[119.528164,31.36524],[119.530434,31.370826],[119.534833,31.378039],[119.535702,31.381733],[119.540687,31.390155],[119.541741,31.394715],[119.541111,31.398585],[119.539666,31.400732],[119.537364,31.40143],[119.535974,31.406078],[119.536484,31.408216],[119.546639,31.413243],[119.553351,31.411724],[119.553797,31.415399],[119.556034,31.415143],[119.553905,31.417263],[119.553004,31.421981],[119.554383,31.422051],[119.554818,31.426141],[119.554557,31.433888],[119.556914,31.433897],[119.567514,31.432369],[119.576703,31.430726],[119.578256,31.432228],[119.578343,31.434551],[119.582524,31.437501],[119.582589,31.444823],[119.583317,31.446059],[119.587868,31.445803],[119.589595,31.447658],[119.590029,31.45225],[119.588433,31.454873],[119.589519,31.458352],[119.59143,31.460878],[119.591745,31.463059],[119.588357,31.464577],[119.588335,31.466688],[119.58411,31.465822],[119.565146,31.464339],[119.563572,31.468507],[119.565179,31.471385],[119.571891,31.471103],[119.57301,31.472039],[119.57515,31.480797],[119.573118,31.482624],[119.571652,31.488566],[119.567981,31.490419],[119.566406,31.492812],[119.567025,31.494798],[119.567015,31.504719],[119.568883,31.506775],[119.574259,31.505805],[119.579266,31.503148],[119.583621,31.504542],[119.584783,31.507314],[119.58613,31.514171],[119.58852,31.520111],[119.59307,31.529279],[119.593603,31.532209],[119.595883,31.535306],[119.601227,31.539029],[119.605278,31.549219],[119.607863,31.55318],[119.613315,31.557899],[119.61779,31.559364],[119.627934,31.55992],[119.63078,31.563677],[119.637655,31.568211],[119.640653,31.569084],[119.644443,31.572956],[119.646789,31.577683],[119.642684,31.582357],[119.642488,31.588672],[119.640055,31.590797],[119.641131,31.592851],[119.641239,31.596176],[119.639382,31.600258],[119.644128,31.604711],[119.64982,31.60516],[119.657944,31.609304],[119.661148,31.610186],[119.666774,31.6106],[119.67303,31.609322],[119.674985,31.604226],[119.677885,31.603318],[119.684955,31.604023],[119.690342,31.595241],[119.694122,31.587966],[119.694567,31.584192],[119.698021,31.581414],[119.699791,31.576554],[119.707318,31.577472],[119.709968,31.575999],[119.710044,31.568555],[119.712694,31.560325],[119.712901,31.558305],[119.715247,31.555985],[119.721199,31.556867],[119.725619,31.561031],[119.727759,31.562125],[119.733265,31.563157],[119.737251,31.561481],[119.746114,31.560272],[119.74795,31.558773],[119.755976,31.557026],[119.763905,31.554442],[119.768553,31.553789],[119.778904,31.554689],[119.792176,31.553383],[119.804101,31.54989],[119.807403,31.548504],[119.820697,31.537247],[119.832351,31.529191],[119.84192,31.528467],[119.847796,31.5298],[119.852955,31.534282],[119.856202,31.538835],[119.860069,31.543052],[119.861882,31.546264],[119.864,31.546017],[119.87762,31.546925],[119.890121,31.546546],[119.897594,31.546749],[119.90247,31.547746],[119.911062,31.548257],[119.921369,31.549863],[119.935629,31.552712],[119.94157,31.547684],[119.942483,31.546325],[119.948359,31.543379],[119.958796,31.540264],[119.966171,31.537194],[119.971721,31.535967],[119.973795,31.528361],[119.973567,31.515857],[119.981539,31.511471],[119.989924,31.50373],[119.996115,31.497499],[119.996919,31.501338],[119.997157,31.508117],[120.005553,31.503316],[120.009083,31.504454],[120.015795,31.505443],[120.018489,31.50464],[120.022084,31.501736],[120.030979,31.500209],[120.036203,31.497878],[120.037626,31.494754],[120.045489,31.490252],[120.043361,31.486094],[120.046195,31.479782],[120.044251,31.46969],[120.037604,31.425894],[120.03453,31.418597],[120.027851,31.409047],[120.021074,31.383006],[120.020943,31.374203],[120.023702,31.364948],[120.032076,31.353377],[120.041764,31.34588],[120.060662,31.339143],[120.068743,31.336879],[120.089585,31.332449],[120.100153,31.335332]]]]}}]}', 'admin', '2020-12-15 11:59:13', NULL, '2020-12-15 11:59:13', '0', NULL); +INSERT INTO `jimu_report_map` VALUES ('570159017392984064', NULL, '100000', '{\n\"type\": \"FeatureCollection\",\n\"name\": \"100000_full\",\n\"features\": [\n{ \"type\": \"Feature\", \"properties\": { \"adcode\": \"110000\", \"name\": \"北京市\", \"center\": [ 116.405285, 39.904989 ], \"centroid\": [ 116.41995, 40.18994 ], \"childrenNum\": 16, \"level\": \"province\", \"parent\": { \"adcode\": 100000 }, \"subFeatureIndex\": 0, \"acroutes\": [ 100000 ] }, \"geometry\": { \"type\": \"MultiPolygon\", \"coordinates\": [ [ [ [ 117.348611, 40.581141 ], [ 117.348611, 40.581141 ], [ 117.269771, 40.560684 ], [ 117.247597, 40.539766 ], [ 117.262995, 40.512927 ], [ 117.208793, 40.501552 ], [ 117.263611, 40.442367 ], [ 117.234046, 40.417312 ], [ 117.226039, 40.368997 ], [ 117.243285, 40.369453 ], [ 117.271618, 40.325211 ], [ 117.271618, 40.325211 ], [ 117.295024, 40.2782 ], [ 117.331365, 40.289613 ], [ 117.351075, 40.229786 ], [ 117.389879, 40.227958 ], [ 117.383719, 40.188195 ], [ 117.367089, 40.172649 ], [ 117.367089, 40.173106 ], [ 117.367089, 40.173106 ], [ 117.367089, 40.172649 ], [ 117.349227, 40.136513 ], [ 117.307343, 40.136971 ], [ 117.274082, 40.105852 ], [ 117.254988, 40.114548 ], [ 117.254988, 40.114548 ], [ 117.254988, 40.114548 ], [ 117.224191, 40.094865 ], [ 117.224191, 40.094865 ], [ 117.210024, 40.082045 ], [ 117.204481, 40.069681 ], [ 117.159517, 40.077008 ], [ 117.140423, 40.064185 ], [ 117.105315, 40.074261 ], [ 117.105315, 40.074261 ], [ 117.051728, 40.059605 ], [ 117.025243, 40.030283 ], [ 116.945171, 40.04128 ], [ 116.927924, 40.055024 ], [ 116.867562, 40.041739 ], [ 116.831222, 40.051359 ], [ 116.820135, 40.02845 ], [ 116.781331, 40.034866 ], [ 116.757925, 39.967934 ], [ 116.782563, 39.947749 ], [ 116.78441, 39.891294 ], [ 116.812128, 39.889916 ], [ 116.865714, 39.843982 ], [ 116.907598, 39.832494 ], [ 116.918069, 39.84628 ], [ 116.949482, 39.778703 ], [ 116.902055, 39.763523 ], [ 116.916837, 39.731314 ], [ 116.887272, 39.72533 ], [ 116.889736, 39.687576 ], [ 116.90575, 39.688037 ], [ 116.906366, 39.677444 ], [ 116.8497, 39.66777 ], [ 116.812128, 39.615695 ], [ 116.79057, 39.595868 ], [ 116.748686, 39.619844 ], [ 116.709266, 39.618 ], [ 116.726512, 39.595407 ], [ 116.726512, 39.595407 ], [ 116.724048, 39.59264 ], [ 116.723432, 39.59264 ], [ 116.724048, 39.59264 ], [ 116.723432, 39.59264 ], [ 116.664918, 39.605552 ], [ 116.620571, 39.601863 ], [ 116.592237, 39.621227 ], [ 116.592237, 39.621227 ], [ 116.524484, 39.596329 ], [ 116.50847, 39.551122 ], [ 116.473361, 39.552968 ], [ 116.478289, 39.535431 ], [ 116.437637, 39.526661 ], [ 116.443796, 39.510041 ], [ 116.401912, 39.528046 ], [ 116.411767, 39.482794 ], [ 116.444412, 39.482332 ], [ 116.454883, 39.453226 ], [ 116.434557, 39.442597 ], [ 116.361876, 39.455074 ], [ 116.361876, 39.455074 ], [ 116.337854, 39.455536 ], [ 116.307057, 39.488337 ], [ 116.257782, 39.500344 ], [ 116.240536, 39.564041 ], [ 116.198652, 39.589412 ], [ 116.151841, 39.583416 ], [ 116.130283, 39.567732 ], [ 116.09887, 39.575113 ], [ 116.036044, 39.571884 ], [ 116.026189, 39.587567 ], [ 115.995392, 39.576958 ], [ 115.978146, 39.595868 ], [ 115.957204, 39.560812 ], [ 115.910393, 39.600479 ], [ 115.910393, 39.600479 ], [ 115.91532, 39.582955 ], [ 115.91532, 39.582955 ], [ 115.867893, 39.546507 ], [ 115.867893, 39.546507 ], [ 115.828473, 39.541431 ], [ 115.821081, 39.522968 ], [ 115.821081, 39.522968 ], [ 115.806299, 39.510041 ], [ 115.806299, 39.510041 ], [ 115.752712, 39.515581 ], [ 115.738545, 39.539585 ], [ 115.738545, 39.540046 ], [ 115.738545, 39.539585 ], [ 115.738545, 39.540046 ], [ 115.724995, 39.5442 ], [ 115.724995, 39.5442 ], [ 115.722531, 39.543738 ], [ 115.721299, 39.543738 ], [ 115.722531, 39.543738 ], [ 115.722531, 39.5442 ], [ 115.721299, 39.543738 ], [ 115.722531, 39.5442 ], [ 115.720683, 39.551122 ], [ 115.720683, 39.551122 ], [ 115.718835, 39.553891 ], [ 115.718835, 39.553891 ], [ 115.716988, 39.56035 ], [ 115.716988, 39.56035 ], [ 115.699125, 39.570039 ], [ 115.699125, 39.570039 ], [ 115.698509, 39.577881 ], [ 115.698509, 39.577881 ], [ 115.667712, 39.615234 ], [ 115.633836, 39.599557 ], [ 115.633836, 39.599557 ], [ 115.587024, 39.589873 ], [ 115.545756, 39.618922 ], [ 115.518039, 39.597252 ], [ 115.522351, 39.640124 ], [ 115.478619, 39.650723 ], [ 115.478619, 39.650723 ], [ 115.491554, 39.670074 ], [ 115.486626, 39.741899 ], [ 115.439815, 39.752022 ], [ 115.443511, 39.785601 ], [ 115.483547, 39.798477 ], [ 115.483547, 39.798477 ], [ 115.50572, 39.784222 ], [ 115.552532, 39.794799 ], [ 115.567314, 39.816407 ], [ 115.514344, 39.837549 ], [ 115.526046, 39.87568 ], [ 115.515575, 39.892212 ], [ 115.515575, 39.892212 ], [ 115.522967, 39.899099 ], [ 115.481083, 39.935819 ], [ 115.426264, 39.950502 ], [ 115.428728, 39.984443 ], [ 115.450286, 39.992697 ], [ 115.454597, 40.029825 ], [ 115.485394, 40.040364 ], [ 115.527278, 40.076092 ], [ 115.59072, 40.096239 ], [ 115.599959, 40.119583 ], [ 115.75456, 40.145663 ], [ 115.75456, 40.145663 ], [ 115.773654, 40.176307 ], [ 115.806299, 40.15344 ], [ 115.847567, 40.147036 ], [ 115.855574, 40.188652 ], [ 115.870356, 40.185909 ], [ 115.89869, 40.234354 ], [ 115.968907, 40.264045 ], [ 115.95166, 40.281852 ], [ 115.917784, 40.354405 ], [ 115.864197, 40.359422 ], [ 115.771806, 40.443734 ], [ 115.781045, 40.49336 ], [ 115.736082, 40.503372 ], [ 115.755176, 40.540221 ], [ 115.784741, 40.55841 ], [ 115.819849, 40.55932 ], [ 115.827857, 40.587504 ], [ 115.885139, 40.595229 ], [ 115.907929, 40.617493 ], [ 115.971986, 40.6025 ], [ 115.982457, 40.578868 ], [ 116.005247, 40.583868 ], [ 116.09887, 40.630665 ], [ 116.133979, 40.666536 ], [ 116.162928, 40.662451 ], [ 116.171551, 40.695582 ], [ 116.204812, 40.740035 ], [ 116.22021, 40.744115 ], [ 116.247311, 40.791707 ], [ 116.273181, 40.762703 ], [ 116.311369, 40.754996 ], [ 116.316912, 40.772221 ], [ 116.453651, 40.765876 ], [ 116.46597, 40.774487 ], [ 116.438253, 40.81934 ], [ 116.334159, 40.90443 ], [ 116.339702, 40.929303 ], [ 116.370499, 40.94377 ], [ 116.398216, 40.90624 ], [ 116.477057, 40.899907 ], [ 116.447492, 40.953715 ], [ 116.455499, 40.980828 ], [ 116.519557, 40.98128 ], [ 116.519557, 40.98128 ], [ 116.5676, 40.992574 ], [ 116.598397, 40.974503 ], [ 116.623034, 41.021026 ], [ 116.615643, 41.053076 ], [ 116.647672, 41.059394 ], [ 116.688324, 41.044501 ], [ 116.698795, 41.021477 ], [ 116.677853, 40.970888 ], [ 116.722201, 40.927495 ], [ 116.713577, 40.909858 ], [ 116.759773, 40.889954 ], [ 116.81336, 40.848319 ], [ 116.848468, 40.839264 ], [ 116.924229, 40.773581 ], [ 116.926692, 40.745022 ], [ 116.964881, 40.709647 ], [ 117.012308, 40.693767 ], [ 117.11209, 40.707379 ], [ 117.117018, 40.70012 ], [ 117.208177, 40.694675 ], [ 117.278394, 40.664267 ], [ 117.319662, 40.657911 ], [ 117.342451, 40.673799 ], [ 117.408973, 40.686961 ], [ 117.493973, 40.675161 ], [ 117.514914, 40.660181 ], [ 117.501364, 40.636569 ], [ 117.467487, 40.649738 ], [ 117.467487, 40.649738 ], [ 117.412669, 40.605226 ], [ 117.429915, 40.576141 ], [ 117.389879, 40.561593 ], [ 117.348611, 40.581141 ] ] ] ] } },\n{ \"type\": \"Feature\", \"properties\": { \"adcode\": \"120000\", \"name\": \"天津市\", \"center\": [ 117.190182, 39.125596 ], \"centroid\": [ 117.347019, 39.28803 ], \"childrenNum\": 16, \"level\": \"province\", \"parent\": { \"adcode\": 100000 }, \"subFeatureIndex\": 1, \"acroutes\": [ 100000 ] }, \"geometry\": { \"type\": \"MultiPolygon\", \"coordinates\": [ [ [ [ 117.765602, 39.400527 ], [ 117.699696, 39.407463 ], [ 117.673211, 39.386652 ], [ 117.668899, 39.412087 ], [ 117.614081, 39.407001 ], [ 117.601146, 39.419485 ], [ 117.570965, 39.404689 ], [ 117.521074, 39.357043 ], [ 117.536472, 39.338068 ], [ 117.594987, 39.349176 ], [ 117.669515, 39.322792 ], [ 117.670747, 39.35658 ], [ 117.74466, 39.354729 ], [ 117.784696, 39.376938 ], [ 117.805022, 39.373237 ], [ 117.810565, 39.354729 ], [ 117.850601, 39.363984 ], [ 117.850601, 39.363984 ], [ 117.854297, 39.328348 ], [ 117.854913, 39.328348 ], [ 117.854297, 39.328348 ], [ 117.854913, 39.328348 ], [ 117.88879, 39.332051 ], [ 117.919587, 39.318162 ], [ 117.919587, 39.318162 ], [ 117.965782, 39.314921 ], [ 117.965782, 39.314921 ], [ 117.973173, 39.312143 ], [ 117.973173, 39.312143 ], [ 117.979333, 39.300566 ], [ 117.979333, 39.300566 ], [ 117.982412, 39.298714 ], [ 117.982412, 39.298714 ], [ 118.024296, 39.289451 ], [ 118.024296, 39.289451 ], [ 118.036615, 39.264898 ], [ 118.064948, 39.256094 ], [ 118.064948, 39.231065 ], [ 118.037231, 39.220402 ], [ 117.977485, 39.206028 ], [ 117.96455, 39.172631 ], [ 117.871543, 39.122506 ], [ 117.837667, 39.057011 ], [ 117.855529, 38.957492 ], [ 117.898029, 38.948649 ], [ 117.875855, 38.920252 ], [ 117.847522, 38.855502 ], [ 117.778536, 38.869016 ], [ 117.752051, 38.847579 ], [ 117.64611, 38.828933 ], [ 117.646725, 38.788827 ], [ 117.671363, 38.772032 ], [ 117.740964, 38.753833 ], [ 117.740964, 38.700141 ], [ 117.729261, 38.680055 ], [ 117.65658, 38.66043 ], [ 117.639334, 38.626776 ], [ 117.55803, 38.613683 ], [ 117.47919, 38.616489 ], [ 117.432379, 38.601524 ], [ 117.368937, 38.564566 ], [ 117.25314, 38.556143 ], [ 117.238358, 38.580943 ], [ 117.258684, 38.608072 ], [ 117.258684, 38.608072 ], [ 117.213104, 38.639866 ], [ 117.213104, 38.639866 ], [ 117.183539, 38.61836 ], [ 117.183539, 38.61836 ], [ 117.150894, 38.617892 ], [ 117.109626, 38.584685 ], [ 117.070822, 38.608072 ], [ 117.055424, 38.639398 ], [ 117.068358, 38.680522 ], [ 117.038793, 38.688464 ], [ 116.95133, 38.689398 ], [ 116.948866, 38.689398 ], [ 116.950714, 38.689398 ], [ 116.95133, 38.689398 ], [ 116.950714, 38.689398 ], [ 116.948866, 38.689398 ], [ 116.877417, 38.680522 ], [ 116.858939, 38.741231 ], [ 116.794265, 38.744498 ], [ 116.794265, 38.744498 ], [ 116.746222, 38.754299 ], [ 116.737599, 38.784629 ], [ 116.75115, 38.831264 ], [ 116.723432, 38.852706 ], [ 116.722201, 38.896968 ], [ 116.708034, 38.931892 ], [ 116.72836, 38.975174 ], [ 116.754845, 39.003084 ], [ 116.754229, 39.034701 ], [ 116.754229, 39.034701 ], [ 116.783179, 39.05097 ], [ 116.783179, 39.05097 ], [ 116.812744, 39.05097 ], [ 116.812744, 39.05097 ], [ 116.871874, 39.054688 ], [ 116.912526, 39.110898 ], [ 116.91191, 39.111362 ], [ 116.91191, 39.111362 ], [ 116.912526, 39.110898 ], [ 116.909446, 39.150822 ], [ 116.870026, 39.153607 ], [ 116.855859, 39.215766 ], [ 116.881729, 39.225966 ], [ 116.881729, 39.225966 ], [ 116.87249, 39.291304 ], [ 116.889736, 39.338068 ], [ 116.870642, 39.357506 ], [ 116.829374, 39.338994 ], [ 116.818287, 39.3737 ], [ 116.840461, 39.378326 ], [ 116.839845, 39.413474 ], [ 116.876185, 39.43474 ], [ 116.832454, 39.435664 ], [ 116.785026, 39.465702 ], [ 116.820751, 39.482332 ], [ 116.819519, 39.528507 ], [ 116.78749, 39.554352 ], [ 116.808432, 39.576497 ], [ 116.812128, 39.615695 ], [ 116.8497, 39.66777 ], [ 116.906366, 39.677444 ], [ 116.90575, 39.688037 ], [ 116.932236, 39.706456 ], [ 116.932236, 39.706456 ], [ 116.944555, 39.695405 ], [ 116.944555, 39.695405 ], [ 116.948866, 39.680668 ], [ 116.948866, 39.680668 ], [ 116.964265, 39.64335 ], [ 116.983359, 39.638742 ], [ 116.983359, 39.638742 ], [ 117.016004, 39.653949 ], [ 117.10901, 39.625375 ], [ 117.10901, 39.625375 ], [ 117.152742, 39.623532 ], [ 117.177996, 39.645194 ], [ 117.165061, 39.718886 ], [ 117.165061, 39.718886 ], [ 117.161981, 39.748801 ], [ 117.205713, 39.763984 ], [ 117.15767, 39.796638 ], [ 117.156438, 39.817326 ], [ 117.192162, 39.832953 ], [ 117.251908, 39.834332 ], [ 117.247597, 39.860981 ], [ 117.227887, 39.852712 ], [ 117.162597, 39.876598 ], [ 117.162597, 39.876598 ], [ 117.150894, 39.944996 ], [ 117.198322, 39.992697 ], [ 117.192162, 40.066475 ], [ 117.210024, 40.082045 ], [ 117.224191, 40.094865 ], [ 117.224191, 40.094865 ], [ 117.254988, 40.114548 ], [ 117.254988, 40.114548 ], [ 117.254988, 40.114548 ], [ 117.274082, 40.105852 ], [ 117.307343, 40.136971 ], [ 117.349227, 40.136513 ], [ 117.367089, 40.172649 ], [ 117.367089, 40.173106 ], [ 117.367089, 40.173106 ], [ 117.367089, 40.172649 ], [ 117.383719, 40.188195 ], [ 117.389879, 40.227958 ], [ 117.415748, 40.248973 ], [ 117.450241, 40.252627 ], [ 117.505059, 40.227044 ], [ 117.548791, 40.232527 ], [ 117.571581, 40.219276 ], [ 117.576508, 40.178593 ], [ 117.609769, 40.160301 ], [ 117.609769, 40.160301 ], [ 117.613465, 40.158014 ], [ 117.613465, 40.158014 ], [ 117.651653, 40.122786 ], [ 117.651653, 40.122786 ], [ 117.654117, 40.114548 ], [ 117.654117, 40.114548 ], [ 117.655965, 40.109514 ], [ 117.655965, 40.109514 ], [ 117.675059, 40.082045 ], [ 117.71879, 40.082045 ], [ 117.71879, 40.082045 ], [ 117.752667, 40.081588 ], [ 117.776073, 40.059605 ], [ 117.74774, 40.047236 ], [ 117.744044, 40.018368 ], [ 117.768681, 40.022034 ], [ 117.768681, 40.022034 ], [ 117.793319, 40.005534 ], [ 117.793319, 40.005534 ], [ 117.795167, 39.996823 ], [ 117.795167, 39.996823 ], [ 117.781616, 39.966558 ], [ 117.781616, 39.966558 ], [ 117.756363, 39.965181 ], [ 117.691073, 39.984902 ], [ 117.671363, 39.973896 ], [ 117.614697, 39.97252 ], [ 117.594987, 39.994531 ], [ 117.594987, 39.994531 ], [ 117.546327, 39.999116 ], [ 117.534625, 39.954631 ], [ 117.514914, 39.946832 ], [ 117.513067, 39.910576 ], [ 117.513067, 39.910576 ], [ 117.512451, 39.90874 ], [ 117.512451, 39.90874 ], [ 117.508139, 39.901854 ], [ 117.508139, 39.901854 ], [ 117.529081, 39.859144 ], [ 117.529081, 39.859144 ], [ 117.561726, 39.799856 ], [ 117.546327, 39.775943 ], [ 117.56111, 39.754782 ], [ 117.595603, 39.74604 ], [ 117.57774, 39.726711 ], [ 117.627015, 39.703693 ], [ 117.668899, 39.666849 ], [ 117.66274, 39.636437 ], [ 117.637486, 39.603246 ], [ 117.654117, 39.575113 ], [ 117.684914, 39.58895 ], [ 117.707088, 39.576036 ], [ 117.715711, 39.529892 ], [ 117.745276, 39.547892 ], [ 117.753899, 39.579726 ], [ 117.753899, 39.579726 ], [ 117.766834, 39.598635 ], [ 117.829659, 39.589873 ], [ 117.868464, 39.59679 ], [ 117.933753, 39.574191 ], [ 117.904804, 39.533585 ], [ 117.912195, 39.517428 ], [ 117.912195, 39.517428 ], [ 117.899877, 39.474479 ], [ 117.870311, 39.455074 ], [ 117.871543, 39.411625 ], [ 117.846906, 39.407926 ], [ 117.765602, 39.400527 ] ] ], [ [ [ 117.805022, 39.373237 ], [ 117.784696, 39.376938 ], [ 117.765602, 39.400527 ], [ 117.846906, 39.407926 ], [ 117.852449, 39.380639 ], [ 117.805022, 39.373237 ] ] ] ] } },\n{ \"type\": \"Feature\", \"properties\": { \"adcode\": \"130000\", \"name\": \"河北省\", \"center\": [ 114.502461, 38.045474 ], \"childrenNum\": 11, \"level\": \"province\", \"parent\": { \"adcode\": 100000 }, \"subFeatureIndex\": 2, \"acroutes\": [ 100000 ] }, \"geometry\": { \"type\": \"MultiPolygon\", \"coordinates\": [ [ [ [ 117.467487, 40.649738 ], [ 117.467487, 40.649738 ], [ 117.501364, 40.636569 ], [ 117.514914, 40.660181 ], [ 117.493973, 40.675161 ], [ 117.408973, 40.686961 ], [ 117.342451, 40.673799 ], [ 117.319662, 40.657911 ], [ 117.278394, 40.664267 ], [ 117.208177, 40.694675 ], [ 117.117018, 40.70012 ], [ 117.11209, 40.707379 ], [ 117.012308, 40.693767 ], [ 116.964881, 40.709647 ], [ 116.926692, 40.745022 ], [ 116.924229, 40.773581 ], [ 116.848468, 40.839264 ], [ 116.81336, 40.848319 ], [ 116.759773, 40.889954 ], [ 116.713577, 40.909858 ], [ 116.722201, 40.927495 ], [ 116.677853, 40.970888 ], [ 116.698795, 41.021477 ], [ 116.688324, 41.044501 ], [ 116.647672, 41.059394 ], [ 116.615643, 41.053076 ], [ 116.623034, 41.021026 ], [ 116.598397, 40.974503 ], [ 116.5676, 40.992574 ], [ 116.519557, 40.98128 ], [ 116.519557, 40.98128 ], [ 116.455499, 40.980828 ], [ 116.447492, 40.953715 ], [ 116.477057, 40.899907 ], [ 116.398216, 40.90624 ], [ 116.370499, 40.94377 ], [ 116.339702, 40.929303 ], [ 116.334159, 40.90443 ], [ 116.438253, 40.81934 ], [ 116.46597, 40.774487 ], [ 116.453651, 40.765876 ], [ 116.316912, 40.772221 ], [ 116.311369, 40.754996 ], [ 116.273181, 40.762703 ], [ 116.247311, 40.791707 ], [ 116.22021, 40.744115 ], [ 116.204812, 40.740035 ], [ 116.171551, 40.695582 ], [ 116.162928, 40.662451 ], [ 116.133979, 40.666536 ], [ 116.09887, 40.630665 ], [ 116.005247, 40.583868 ], [ 115.982457, 40.578868 ], [ 115.971986, 40.6025 ], [ 115.907929, 40.617493 ], [ 115.885139, 40.595229 ], [ 115.827857, 40.587504 ], [ 115.819849, 40.55932 ], [ 115.784741, 40.55841 ], [ 115.755176, 40.540221 ], [ 115.736082, 40.503372 ], [ 115.781045, 40.49336 ], [ 115.771806, 40.443734 ], [ 115.864197, 40.359422 ], [ 115.917784, 40.354405 ], [ 115.95166, 40.281852 ], [ 115.968907, 40.264045 ], [ 115.89869, 40.234354 ], [ 115.870356, 40.185909 ], [ 115.855574, 40.188652 ], [ 115.847567, 40.147036 ], [ 115.806299, 40.15344 ], [ 115.773654, 40.176307 ], [ 115.75456, 40.145663 ], [ 115.75456, 40.145663 ], [ 115.599959, 40.119583 ], [ 115.59072, 40.096239 ], [ 115.527278, 40.076092 ], [ 115.485394, 40.040364 ], [ 115.454597, 40.029825 ], [ 115.450286, 39.992697 ], [ 115.428728, 39.984443 ], [ 115.426264, 39.950502 ], [ 115.481083, 39.935819 ], [ 115.522967, 39.899099 ], [ 115.515575, 39.892212 ], [ 115.515575, 39.892212 ], [ 115.526046, 39.87568 ], [ 115.514344, 39.837549 ], [ 115.567314, 39.816407 ], [ 115.552532, 39.794799 ], [ 115.50572, 39.784222 ], [ 115.483547, 39.798477 ], [ 115.483547, 39.798477 ], [ 115.443511, 39.785601 ], [ 115.439815, 39.752022 ], [ 115.486626, 39.741899 ], [ 115.491554, 39.670074 ], [ 115.478619, 39.650723 ], [ 115.478619, 39.650723 ], [ 115.522351, 39.640124 ], [ 115.518039, 39.597252 ], [ 115.545756, 39.618922 ], [ 115.587024, 39.589873 ], [ 115.633836, 39.599557 ], [ 115.633836, 39.599557 ], [ 115.667712, 39.615234 ], [ 115.698509, 39.577881 ], [ 115.698509, 39.577881 ], [ 115.699125, 39.570039 ], [ 115.699125, 39.570039 ], [ 115.716988, 39.56035 ], [ 115.716988, 39.56035 ], [ 115.718835, 39.553891 ], [ 115.718835, 39.553891 ], [ 115.720683, 39.551122 ], [ 115.720683, 39.551122 ], [ 115.722531, 39.5442 ], [ 115.721299, 39.543738 ], [ 115.722531, 39.5442 ], [ 115.722531, 39.543738 ], [ 115.721299, 39.543738 ], [ 115.722531, 39.543738 ], [ 115.724995, 39.5442 ], [ 115.724995, 39.5442 ], [ 115.738545, 39.540046 ], [ 115.738545, 39.539585 ], [ 115.738545, 39.540046 ], [ 115.738545, 39.539585 ], [ 115.752712, 39.515581 ], [ 115.806299, 39.510041 ], [ 115.806299, 39.510041 ], [ 115.821081, 39.522968 ], [ 115.821081, 39.522968 ], [ 115.828473, 39.541431 ], [ 115.867893, 39.546507 ], [ 115.867893, 39.546507 ], [ 115.91532, 39.582955 ], [ 115.91532, 39.582955 ], [ 115.910393, 39.600479 ], [ 115.910393, 39.600479 ], [ 115.957204, 39.560812 ], [ 115.978146, 39.595868 ], [ 115.995392, 39.576958 ], [ 116.026189, 39.587567 ], [ 116.036044, 39.571884 ], [ 116.09887, 39.575113 ], [ 116.130283, 39.567732 ], [ 116.151841, 39.583416 ], [ 116.198652, 39.589412 ], [ 116.240536, 39.564041 ], [ 116.257782, 39.500344 ], [ 116.307057, 39.488337 ], [ 116.337854, 39.455536 ], [ 116.361876, 39.455074 ], [ 116.361876, 39.455074 ], [ 116.434557, 39.442597 ], [ 116.454883, 39.453226 ], [ 116.444412, 39.482332 ], [ 116.411767, 39.482794 ], [ 116.401912, 39.528046 ], [ 116.443796, 39.510041 ], [ 116.437637, 39.526661 ], [ 116.478289, 39.535431 ], [ 116.473361, 39.552968 ], [ 116.50847, 39.551122 ], [ 116.524484, 39.596329 ], [ 116.592237, 39.621227 ], [ 116.592237, 39.621227 ], [ 116.620571, 39.601863 ], [ 116.664918, 39.605552 ], [ 116.723432, 39.59264 ], [ 116.724048, 39.59264 ], [ 116.723432, 39.59264 ], [ 116.724048, 39.59264 ], [ 116.726512, 39.595407 ], [ 116.726512, 39.595407 ], [ 116.709266, 39.618 ], [ 116.748686, 39.619844 ], [ 116.79057, 39.595868 ], [ 116.812128, 39.615695 ], [ 116.808432, 39.576497 ], [ 116.78749, 39.554352 ], [ 116.819519, 39.528507 ], [ 116.820751, 39.482332 ], [ 116.785026, 39.465702 ], [ 116.832454, 39.435664 ], [ 116.876185, 39.43474 ], [ 116.839845, 39.413474 ], [ 116.840461, 39.378326 ], [ 116.818287, 39.3737 ], [ 116.829374, 39.338994 ], [ 116.870642, 39.357506 ], [ 116.889736, 39.338068 ], [ 116.87249, 39.291304 ], [ 116.881729, 39.225966 ], [ 116.881729, 39.225966 ], [ 116.855859, 39.215766 ], [ 116.870026, 39.153607 ], [ 116.909446, 39.150822 ], [ 116.912526, 39.110898 ], [ 116.91191, 39.111362 ], [ 116.91191, 39.111362 ], [ 116.912526, 39.110898 ], [ 116.871874, 39.054688 ], [ 116.812744, 39.05097 ], [ 116.812744, 39.05097 ], [ 116.783179, 39.05097 ], [ 116.783179, 39.05097 ], [ 116.754229, 39.034701 ], [ 116.754229, 39.034701 ], [ 116.754845, 39.003084 ], [ 116.72836, 38.975174 ], [ 116.708034, 38.931892 ], [ 116.722201, 38.896968 ], [ 116.723432, 38.852706 ], [ 116.75115, 38.831264 ], [ 116.737599, 38.784629 ], [ 116.746222, 38.754299 ], [ 116.794265, 38.744498 ], [ 116.794265, 38.744498 ], [ 116.858939, 38.741231 ], [ 116.877417, 38.680522 ], [ 116.948866, 38.689398 ], [ 116.950714, 38.689398 ], [ 116.95133, 38.689398 ], [ 116.950714, 38.689398 ], [ 116.948866, 38.689398 ], [ 116.95133, 38.689398 ], [ 117.038793, 38.688464 ], [ 117.068358, 38.680522 ], [ 117.055424, 38.639398 ], [ 117.070822, 38.608072 ], [ 117.109626, 38.584685 ], [ 117.150894, 38.617892 ], [ 117.183539, 38.61836 ], [ 117.183539, 38.61836 ], [ 117.213104, 38.639866 ], [ 117.213104, 38.639866 ], [ 117.258684, 38.608072 ], [ 117.258684, 38.608072 ], [ 117.238358, 38.580943 ], [ 117.25314, 38.556143 ], [ 117.368937, 38.564566 ], [ 117.432379, 38.601524 ], [ 117.47919, 38.616489 ], [ 117.55803, 38.613683 ], [ 117.639334, 38.626776 ], [ 117.638102, 38.54491 ], [ 117.68553, 38.539293 ], [ 117.644878, 38.52759 ], [ 117.678754, 38.477008 ], [ 117.72495, 38.457328 ], [ 117.730493, 38.424985 ], [ 117.781, 38.373862 ], [ 117.84629, 38.368232 ], [ 117.937449, 38.387936 ], [ 117.957775, 38.376208 ], [ 117.948536, 38.346644 ], [ 117.895565, 38.301572 ], [ 117.848754, 38.255062 ], [ 117.808718, 38.22827 ], [ 117.789007, 38.180772 ], [ 117.766834, 38.158658 ], [ 117.771145, 38.134655 ], [ 117.746508, 38.12524 ], [ 117.704624, 38.076262 ], [ 117.586979, 38.071551 ], [ 117.557414, 38.046105 ], [ 117.557414, 38.046105 ], [ 117.524154, 37.989527 ], [ 117.513067, 37.94329 ], [ 117.481038, 37.914967 ], [ 117.438538, 37.854035 ], [ 117.400966, 37.844584 ], [ 117.320278, 37.861596 ], [ 117.271618, 37.839858 ], [ 117.185387, 37.849783 ], [ 117.150278, 37.839385 ], [ 117.074518, 37.848837 ], [ 117.027091, 37.832296 ], [ 116.919301, 37.846002 ], [ 116.837997, 37.835132 ], [ 116.804736, 37.848837 ], [ 116.753613, 37.793054 ], [ 116.753613, 37.77035 ], [ 116.724664, 37.744327 ], [ 116.679085, 37.728708 ], [ 116.66307, 37.686096 ], [ 116.604556, 37.624975 ], [ 116.575607, 37.610754 ], [ 116.4826, 37.521573 ], [ 116.448108, 37.503059 ], [ 116.433941, 37.473142 ], [ 116.38097, 37.522522 ], [ 116.379738, 37.522047 ], [ 116.38097, 37.522522 ], [ 116.379738, 37.522047 ], [ 116.36742, 37.566177 ], [ 116.336007, 37.581355 ], [ 116.295355, 37.554316 ], [ 116.278724, 37.524895 ], [ 116.290427, 37.484065 ], [ 116.27626, 37.466967 ], [ 116.240536, 37.489764 ], [ 116.240536, 37.489764 ], [ 116.224522, 37.479791 ], [ 116.243, 37.447965 ], [ 116.226369, 37.428007 ], [ 116.2855, 37.404241 ], [ 116.236224, 37.361442 ], [ 116.193109, 37.365723 ], [ 116.169087, 37.384271 ], [ 116.106261, 37.368577 ], [ 116.085935, 37.373809 ], [ 116.024341, 37.360015 ], [ 115.975682, 37.337179 ], [ 115.969523, 37.239572 ], [ 115.909777, 37.20669 ], [ 115.91224, 37.177132 ], [ 115.879596, 37.150901 ], [ 115.888219, 37.112254 ], [ 115.85619, 37.060694 ], [ 115.776734, 36.992848 ], [ 115.79706, 36.968945 ], [ 115.75764, 36.902453 ], [ 115.71206, 36.883308 ], [ 115.688654, 36.838777 ], [ 115.686807, 36.810034 ], [ 115.524815, 36.763543 ], [ 115.479851, 36.760187 ], [ 115.451518, 36.702151 ], [ 115.420105, 36.686795 ], [ 115.365902, 36.621979 ], [ 115.355431, 36.627262 ], [ 115.33141, 36.550378 ], [ 115.272895, 36.497476 ], [ 115.291374, 36.460423 ], [ 115.317243, 36.454166 ], [ 115.297533, 36.413239 ], [ 115.340033, 36.398307 ], [ 115.368982, 36.342409 ], [ 115.366518, 36.30914 ], [ 115.423185, 36.32216 ], [ 115.417025, 36.292742 ], [ 115.462605, 36.276339 ], [ 115.466916, 36.258969 ], [ 115.466916, 36.258969 ], [ 115.474923, 36.248352 ], [ 115.483547, 36.148865 ], [ 115.465068, 36.170125 ], [ 115.450902, 36.152248 ], [ 115.376989, 36.128083 ], [ 115.365902, 36.099074 ], [ 115.312931, 36.088436 ], [ 115.30246, 36.127599 ], [ 115.279055, 36.13775 ], [ 115.242098, 36.19138 ], [ 115.202678, 36.208765 ], [ 115.202678, 36.208765 ], [ 115.202678, 36.209248 ], [ 115.202678, 36.209248 ], [ 115.201446, 36.210214 ], [ 115.201446, 36.210214 ], [ 115.1842, 36.193312 ], [ 115.12507, 36.209731 ], [ 115.104744, 36.172058 ], [ 115.06286, 36.178338 ], [ 115.048693, 36.161912 ], [ 115.04623, 36.112613 ], [ 114.998186, 36.069572 ], [ 114.914419, 36.052155 ], [ 114.926737, 36.089403 ], [ 114.912571, 36.140649 ], [ 114.858368, 36.144516 ], [ 114.857752, 36.127599 ], [ 114.771521, 36.124699 ], [ 114.734564, 36.15563 ], [ 114.720398, 36.140166 ], [ 114.640326, 36.137266 ], [ 114.588587, 36.118414 ], [ 114.586739, 36.141133 ], [ 114.533152, 36.171575 ], [ 114.480181, 36.177855 ], [ 114.466015, 36.197658 ], [ 114.417356, 36.205868 ], [ 114.408117, 36.224699 ], [ 114.356378, 36.230492 ], [ 114.345291, 36.255591 ], [ 114.299095, 36.245938 ], [ 114.257827, 36.263794 ], [ 114.241197, 36.251247 ], [ 114.2104, 36.272962 ], [ 114.203009, 36.245456 ], [ 114.170364, 36.245938 ], [ 114.170364, 36.245938 ], [ 114.175907, 36.264759 ], [ 114.129096, 36.280199 ], [ 114.080437, 36.269585 ], [ 114.04348, 36.303353 ], [ 114.056415, 36.329392 ], [ 114.002828, 36.334214 ], [ 113.981887, 36.31782 ], [ 113.962792, 36.353977 ], [ 113.911054, 36.314927 ], [ 113.882104, 36.353977 ], [ 113.84946, 36.347711 ], [ 113.856851, 36.329392 ], [ 113.813119, 36.332285 ], [ 113.755221, 36.366026 ], [ 113.731199, 36.363135 ], [ 113.708409, 36.423352 ], [ 113.670221, 36.425278 ], [ 113.635729, 36.451277 ], [ 113.587069, 36.460904 ], [ 113.554425, 36.494589 ], [ 113.559968, 36.528741 ], [ 113.588917, 36.547974 ], [ 113.569823, 36.585947 ], [ 113.539642, 36.594116 ], [ 113.54457, 36.62342 ], [ 113.486671, 36.635427 ], [ 113.476816, 36.655114 ], [ 113.506997, 36.705029 ], [ 113.465113, 36.707908 ], [ 113.499606, 36.740527 ], [ 113.535946, 36.732373 ], [ 113.549497, 36.752515 ], [ 113.600004, 36.752995 ], [ 113.680692, 36.789907 ], [ 113.676381, 36.855539 ], [ 113.696707, 36.882351 ], [ 113.731815, 36.878521 ], [ 113.731815, 36.858891 ], [ 113.773083, 36.85506 ], [ 113.792793, 36.894796 ], [ 113.76138, 36.956034 ], [ 113.791561, 36.98759 ], [ 113.771851, 37.016745 ], [ 113.788482, 37.059739 ], [ 113.758301, 37.075497 ], [ 113.773699, 37.107004 ], [ 113.773083, 37.151855 ], [ 113.832213, 37.167594 ], [ 113.853155, 37.215269 ], [ 113.886416, 37.239095 ], [ 113.90243, 37.310052 ], [ 113.962792, 37.355734 ], [ 113.973879, 37.40329 ], [ 114.014531, 37.42468 ], [ 114.036705, 37.494037 ], [ 114.118625, 37.59084 ], [ 114.115545, 37.619761 ], [ 114.139567, 37.675676 ], [ 114.12848, 37.698409 ], [ 114.068118, 37.721608 ], [ 113.993589, 37.706932 ], [ 113.996669, 37.730128 ], [ 114.044712, 37.761834 ], [ 114.006524, 37.813386 ], [ 113.976959, 37.816696 ], [ 113.959097, 37.906468 ], [ 113.936307, 37.922993 ], [ 113.901198, 37.984811 ], [ 113.872249, 37.990471 ], [ 113.876561, 38.055059 ], [ 113.811271, 38.117707 ], [ 113.831597, 38.16854 ], [ 113.797105, 38.162894 ], [ 113.720728, 38.174656 ], [ 113.711489, 38.213695 ], [ 113.678844, 38.20523 ], [ 113.64312, 38.232031 ], [ 113.598772, 38.22733 ], [ 113.570439, 38.237202 ], [ 113.54457, 38.270569 ], [ 113.557504, 38.343359 ], [ 113.525475, 38.383245 ], [ 113.537794, 38.417952 ], [ 113.583374, 38.459671 ], [ 113.5612, 38.485909 ], [ 113.561816, 38.558483 ], [ 113.603084, 38.587024 ], [ 113.612939, 38.645942 ], [ 113.70225, 38.651551 ], [ 113.720728, 38.713218 ], [ 113.775547, 38.709949 ], [ 113.802648, 38.763166 ], [ 113.839605, 38.7585 ], [ 113.836525, 38.795824 ], [ 113.855619, 38.828933 ], [ 113.795257, 38.860628 ], [ 113.776163, 38.885788 ], [ 113.76754, 38.959819 ], [ 113.776779, 38.986804 ], [ 113.80696, 38.989595 ], [ 113.898119, 39.067699 ], [ 113.930148, 39.063517 ], [ 113.961561, 39.100681 ], [ 113.994821, 39.095572 ], [ 114.006524, 39.122971 ], [ 114.050872, 39.135969 ], [ 114.064422, 39.094179 ], [ 114.082901, 39.09325 ], [ 114.082901, 39.09325 ], [ 114.10877, 39.052364 ], [ 114.157429, 39.061194 ], [ 114.180835, 39.049111 ], [ 114.252284, 39.073739 ], [ 114.345907, 39.075133 ], [ 114.369928, 39.107648 ], [ 114.360689, 39.134112 ], [ 114.388406, 39.176807 ], [ 114.443841, 39.174023 ], [ 114.47587, 39.21623 ], [ 114.416124, 39.242654 ], [ 114.437066, 39.259337 ], [ 114.430906, 39.307513 ], [ 114.466631, 39.329736 ], [ 114.469095, 39.400989 ], [ 114.496812, 39.438437 ], [ 114.501739, 39.476789 ], [ 114.532536, 39.486027 ], [ 114.568877, 39.573729 ], [ 114.51529, 39.564964 ], [ 114.49558, 39.608318 ], [ 114.431522, 39.613851 ], [ 114.408117, 39.652106 ], [ 114.409964, 39.761683 ], [ 114.41674, 39.775943 ], [ 114.390254, 39.819165 ], [ 114.406885, 39.833413 ], [ 114.395182, 39.867412 ], [ 114.285545, 39.858225 ], [ 114.286776, 39.871087 ], [ 114.215943, 39.8619 ], [ 114.204241, 39.885324 ], [ 114.229494, 39.899558 ], [ 114.212248, 39.918839 ], [ 114.17406, 39.897722 ], [ 114.067502, 39.922511 ], [ 114.047176, 39.916085 ], [ 114.028082, 39.959218 ], [ 114.029314, 39.985819 ], [ 113.910438, 40.015618 ], [ 113.959097, 40.033491 ], [ 113.989278, 40.11226 ], [ 114.018227, 40.103563 ], [ 114.045944, 40.056856 ], [ 114.086596, 40.071513 ], [ 114.101995, 40.099901 ], [ 114.073046, 40.168533 ], [ 114.073046, 40.168533 ], [ 114.097683, 40.193681 ], [ 114.135871, 40.175392 ], [ 114.180219, 40.191395 ], [ 114.235654, 40.198252 ], [ 114.255364, 40.236182 ], [ 114.292936, 40.230242 ], [ 114.362537, 40.249886 ], [ 114.406269, 40.246232 ], [ 114.46971, 40.268155 ], [ 114.510978, 40.302851 ], [ 114.530688, 40.345283 ], [ 114.481413, 40.34802 ], [ 114.438914, 40.371733 ], [ 114.390254, 40.351213 ], [ 114.381015, 40.36307 ], [ 114.31203, 40.372645 ], [ 114.286161, 40.425057 ], [ 114.299711, 40.44009 ], [ 114.267066, 40.474242 ], [ 114.282465, 40.494725 ], [ 114.293552, 40.55159 ], [ 114.273842, 40.552954 ], [ 114.283081, 40.590685 ], [ 114.236269, 40.607043 ], [ 114.183299, 40.67153 ], [ 114.162357, 40.71373 ], [ 114.134639, 40.737314 ], [ 114.103227, 40.770861 ], [ 114.104458, 40.797597 ], [ 114.080437, 40.790348 ], [ 114.044712, 40.830661 ], [ 114.073661, 40.857372 ], [ 114.055183, 40.867782 ], [ 114.041633, 40.917546 ], [ 114.057647, 40.925234 ], [ 113.994821, 40.938798 ], [ 113.973263, 40.983087 ], [ 113.868554, 41.06887 ], [ 113.819279, 41.09774 ], [ 113.877793, 41.115777 ], [ 113.920293, 41.172112 ], [ 113.960945, 41.171211 ], [ 113.996669, 41.19238 ], [ 114.016379, 41.231999 ], [ 113.992357, 41.269794 ], [ 113.971416, 41.239649 ], [ 113.95109, 41.282837 ], [ 113.914749, 41.294529 ], [ 113.899351, 41.316108 ], [ 113.92522, 41.325546 ], [ 113.94493, 41.392477 ], [ 113.871017, 41.413126 ], [ 113.877793, 41.431076 ], [ 113.919677, 41.454404 ], [ 113.933227, 41.487139 ], [ 113.953553, 41.483553 ], [ 113.976959, 41.505966 ], [ 114.032394, 41.529715 ], [ 114.101379, 41.537779 ], [ 114.230726, 41.513584 ], [ 114.221487, 41.582111 ], [ 114.226414, 41.616572 ], [ 114.259059, 41.623282 ], [ 114.215328, 41.68499 ], [ 114.237501, 41.698843 ], [ 114.206704, 41.7386 ], [ 114.215328, 41.75646 ], [ 114.200545, 41.789934 ], [ 114.282465, 41.863517 ], [ 114.343443, 41.926774 ], [ 114.352066, 41.953484 ], [ 114.419203, 41.942356 ], [ 114.478334, 41.951704 ], [ 114.511594, 41.981962 ], [ 114.467863, 42.025989 ], [ 114.480181, 42.064654 ], [ 114.502355, 42.06732 ], [ 114.510978, 42.110844 ], [ 114.560254, 42.132595 ], [ 114.647717, 42.109512 ], [ 114.675434, 42.12061 ], [ 114.75489, 42.115727 ], [ 114.789383, 42.130819 ], [ 114.79431, 42.149457 ], [ 114.825723, 42.139695 ], [ 114.86268, 42.097967 ], [ 114.860832, 42.054879 ], [ 114.9021, 42.015763 ], [ 114.915035, 41.960605 ], [ 114.923658, 41.871093 ], [ 114.939056, 41.846132 ], [ 114.922426, 41.825175 ], [ 114.868839, 41.813579 ], [ 114.89594, 41.76762 ], [ 114.902716, 41.695715 ], [ 114.895325, 41.636255 ], [ 114.860832, 41.60091 ], [ 115.016049, 41.615229 ], [ 115.056085, 41.602253 ], [ 115.0992, 41.62373 ], [ 115.195287, 41.602253 ], [ 115.20391, 41.571367 ], [ 115.256881, 41.580768 ], [ 115.26612, 41.616124 ], [ 115.290142, 41.622835 ], [ 115.310468, 41.592854 ], [ 115.377605, 41.603148 ], [ 115.345576, 41.635807 ], [ 115.360975, 41.661297 ], [ 115.319091, 41.691693 ], [ 115.346808, 41.712247 ], [ 115.42996, 41.728775 ], [ 115.488474, 41.760924 ], [ 115.519887, 41.76762 ], [ 115.57409, 41.80555 ], [ 115.654162, 41.829189 ], [ 115.688038, 41.867528 ], [ 115.726227, 41.870202 ], [ 115.811226, 41.912525 ], [ 115.834632, 41.93835 ], [ 115.85311, 41.927665 ], [ 115.916552, 41.945027 ], [ 115.954124, 41.874213 ], [ 115.994776, 41.828743 ], [ 116.007095, 41.797966 ], [ 116.007095, 41.79752 ], [ 116.007095, 41.797966 ], [ 116.007095, 41.79752 ], [ 116.034196, 41.782795 ], [ 116.09887, 41.776547 ], [ 116.129051, 41.805996 ], [ 116.106877, 41.831419 ], [ 116.122892, 41.861734 ], [ 116.194341, 41.861734 ], [ 116.212819, 41.885352 ], [ 116.223906, 41.932562 ], [ 116.298434, 41.96817 ], [ 116.310137, 41.997086 ], [ 116.373579, 42.009983 ], [ 116.414231, 41.982407 ], [ 116.393289, 41.942802 ], [ 116.453651, 41.945917 ], [ 116.4826, 41.975734 ], [ 116.510933, 41.974399 ], [ 116.553433, 41.928555 ], [ 116.597165, 41.935679 ], [ 116.639049, 41.929891 ], [ 116.66923, 41.947698 ], [ 116.727744, 41.951259 ], [ 116.748686, 41.984186 ], [ 116.796113, 41.977958 ], [ 116.879881, 42.018431 ], [ 116.890352, 42.092639 ], [ 116.850316, 42.156556 ], [ 116.825062, 42.155669 ], [ 116.789338, 42.200462 ], [ 116.903287, 42.190708 ], [ 116.918685, 42.229716 ], [ 116.897743, 42.297479 ], [ 116.886656, 42.366496 ], [ 116.910678, 42.394789 ], [ 116.910678, 42.394789 ], [ 116.910062, 42.395231 ], [ 116.910062, 42.395231 ], [ 116.921765, 42.403628 ], [ 116.921765, 42.403628 ], [ 116.936547, 42.410256 ], [ 116.936547, 42.410256 ], [ 116.944555, 42.415116 ], [ 116.944555, 42.415116 ], [ 116.97104, 42.427486 ], [ 116.97104, 42.427486 ], [ 116.974736, 42.426603 ], [ 116.974736, 42.426603 ], [ 116.99075, 42.425719 ], [ 116.99075, 42.425719 ], [ 117.005533, 42.43367 ], [ 117.005533, 42.43367 ], [ 117.009228, 42.44957 ], [ 117.009228, 42.44957 ], [ 117.01662, 42.456193 ], [ 117.01662, 42.456193 ], [ 117.080061, 42.463699 ], [ 117.080061, 42.463699 ], [ 117.09546, 42.484004 ], [ 117.135496, 42.468996 ], [ 117.188467, 42.468114 ], [ 117.188467, 42.468114 ], [ 117.275314, 42.481797 ], [ 117.275314, 42.481797 ], [ 117.332596, 42.46105 ], [ 117.332596, 42.46105 ], [ 117.390495, 42.461933 ], [ 117.413284, 42.471645 ], [ 117.410205, 42.519743 ], [ 117.387415, 42.517537 ], [ 117.387415, 42.517537 ], [ 117.434226, 42.557224 ], [ 117.435458, 42.585431 ], [ 117.475494, 42.602613 ], [ 117.530313, 42.590278 ], [ 117.537088, 42.603054 ], [ 117.60053, 42.603054 ], [ 117.667051, 42.582347 ], [ 117.708935, 42.588515 ], [ 117.779768, 42.61847 ], [ 117.801326, 42.612744 ], [ 117.797631, 42.585431 ], [ 117.856761, 42.539148 ], [ 117.874007, 42.510038 ], [ 117.997811, 42.416884 ], [ 118.024296, 42.385064 ], [ 118.008898, 42.346595 ], [ 118.060021, 42.298364 ], [ 118.047702, 42.280656 ], [ 117.974405, 42.25054 ], [ 117.977485, 42.229716 ], [ 118.033535, 42.199132 ], [ 118.106216, 42.172082 ], [ 118.089586, 42.12283 ], [ 118.097593, 42.105072 ], [ 118.155491, 42.081091 ], [ 118.116687, 42.037102 ], [ 118.194296, 42.031324 ], [ 118.220165, 42.058434 ], [ 118.212774, 42.081091 ], [ 118.239259, 42.092639 ], [ 118.27252, 42.083312 ], [ 118.296541, 42.057545 ], [ 118.286686, 42.033991 ], [ 118.239875, 42.024655 ], [ 118.291614, 42.007759 ], [ 118.313788, 41.98819 ], [ 118.306396, 41.940131 ], [ 118.268824, 41.930336 ], [ 118.340273, 41.87243 ], [ 118.335346, 41.845241 ], [ 118.29223, 41.772976 ], [ 118.247266, 41.773869 ], [ 118.236179, 41.80778 ], [ 118.178281, 41.814917 ], [ 118.140093, 41.784134 ], [ 118.132702, 41.733241 ], [ 118.155491, 41.712694 ], [ 118.159187, 41.67605 ], [ 118.206614, 41.650566 ], [ 118.215237, 41.59554 ], [ 118.302701, 41.55256 ], [ 118.315636, 41.512688 ], [ 118.271904, 41.471446 ], [ 118.327338, 41.450816 ], [ 118.348896, 41.428384 ], [ 118.361215, 41.384844 ], [ 118.348896, 41.342622 ], [ 118.380309, 41.312062 ], [ 118.412338, 41.331838 ], [ 118.528135, 41.355202 ], [ 118.629765, 41.346666 ], [ 118.677192, 41.35026 ], [ 118.741866, 41.324198 ], [ 118.770199, 41.352956 ], [ 118.843496, 41.374516 ], [ 118.844727, 41.342622 ], [ 118.890923, 41.300823 ], [ 118.949437, 41.317906 ], [ 118.980234, 41.305769 ], [ 119.092951, 41.293629 ], [ 119.168712, 41.294978 ], [ 119.197661, 41.282837 ], [ 119.211827, 41.308016 ], [ 119.239545, 41.31431 ], [ 119.2494, 41.279689 ], [ 119.209364, 41.244599 ], [ 119.204436, 41.222546 ], [ 119.169943, 41.222996 ], [ 119.189038, 41.198234 ], [ 119.126212, 41.138767 ], [ 119.081248, 41.131555 ], [ 119.080632, 41.095936 ], [ 119.037516, 41.067516 ], [ 118.964836, 41.079246 ], [ 118.937118, 41.052625 ], [ 118.951901, 41.018317 ], [ 119.013495, 41.007479 ], [ 119.00056, 40.967273 ], [ 118.977154, 40.959138 ], [ 118.977154, 40.959138 ], [ 118.916792, 40.969984 ], [ 118.90201, 40.960946 ], [ 118.873061, 40.847866 ], [ 118.845959, 40.822057 ], [ 118.878604, 40.783098 ], [ 118.907553, 40.775394 ], [ 118.895234, 40.75409 ], [ 118.950053, 40.747743 ], [ 118.96114, 40.72008 ], [ 119.011031, 40.687414 ], [ 119.028277, 40.692406 ], [ 119.054763, 40.664721 ], [ 119.115125, 40.666536 ], [ 119.165632, 40.69286 ], [ 119.184726, 40.680153 ], [ 119.14469, 40.632482 ], [ 119.162552, 40.600228 ], [ 119.177951, 40.609315 ], [ 119.230921, 40.603863 ], [ 119.22045, 40.569322 ], [ 119.256175, 40.543404 ], [ 119.30237, 40.530215 ], [ 119.429254, 40.540221 ], [ 119.477913, 40.533399 ], [ 119.503783, 40.553864 ], [ 119.559217, 40.547952 ], [ 119.572152, 40.523846 ], [ 119.553674, 40.502007 ], [ 119.604797, 40.455119 ], [ 119.586934, 40.375381 ], [ 119.598021, 40.334335 ], [ 119.651608, 40.271808 ], [ 119.639289, 40.231613 ], [ 119.639289, 40.231613 ], [ 119.671934, 40.23938 ], [ 119.716898, 40.195966 ], [ 119.745847, 40.207851 ], [ 119.760629, 40.136056 ], [ 119.736608, 40.104936 ], [ 119.772332, 40.08113 ], [ 119.783419, 40.046778 ], [ 119.783419, 40.046778 ], [ 119.787115, 40.041739 ], [ 119.787115, 40.041739 ], [ 119.81668, 40.050443 ], [ 119.81668, 40.050443 ], [ 119.854252, 40.033033 ], [ 119.845629, 40.000949 ], [ 119.845629, 40.000949 ], [ 119.854252, 39.98857 ], [ 119.872114, 39.960594 ], [ 119.842549, 39.956007 ], [ 119.820375, 39.979399 ], [ 119.787115, 39.950502 ], [ 119.726137, 39.940867 ], [ 119.681789, 39.922511 ], [ 119.642369, 39.925264 ], [ 119.620195, 39.904609 ], [ 119.588166, 39.910576 ], [ 119.540739, 39.888079 ], [ 119.520413, 39.840306 ], [ 119.536427, 39.809052 ], [ 119.474217, 39.813189 ], [ 119.366428, 39.734996 ], [ 119.269726, 39.498497 ], [ 119.316537, 39.437051 ], [ 119.317153, 39.4107 ], [ 119.272805, 39.363521 ], [ 119.185342, 39.342234 ], [ 119.121284, 39.281576 ], [ 119.096031, 39.24219 ], [ 119.038132, 39.211593 ], [ 119.023966, 39.187012 ], [ 118.97777, 39.163352 ], [ 118.926031, 39.123435 ], [ 118.890307, 39.118792 ], [ 118.896466, 39.139683 ], [ 118.951285, 39.178662 ], [ 118.920488, 39.171703 ], [ 118.897082, 39.151286 ], [ 118.857662, 39.162888 ], [ 118.814546, 39.138754 ], [ 118.76096, 39.133648 ], [ 118.637156, 39.157319 ], [ 118.578642, 39.130863 ], [ 118.588497, 39.107648 ], [ 118.533062, 39.090928 ], [ 118.570634, 38.999363 ], [ 118.604511, 38.971452 ], [ 118.539837, 38.910008 ], [ 118.491178, 38.909077 ], [ 118.377845, 38.971917 ], [ 118.366143, 39.016104 ], [ 118.319331, 39.009594 ], [ 118.225092, 39.034701 ], [ 118.1906, 39.080708 ], [ 118.162883, 39.136433 ], [ 118.12531, 39.182838 ], [ 118.065564, 39.218084 ], [ 118.056941, 39.219939 ], [ 118.037231, 39.220402 ], [ 118.064948, 39.231065 ], [ 118.064948, 39.256094 ], [ 118.036615, 39.264898 ], [ 118.024296, 39.289451 ], [ 118.024296, 39.289451 ], [ 117.982412, 39.298714 ], [ 117.982412, 39.298714 ], [ 117.979333, 39.300566 ], [ 117.979333, 39.300566 ], [ 117.973173, 39.312143 ], [ 117.973173, 39.312143 ], [ 117.965782, 39.314921 ], [ 117.965782, 39.314921 ], [ 117.919587, 39.318162 ], [ 117.919587, 39.318162 ], [ 117.88879, 39.332051 ], [ 117.854913, 39.328348 ], [ 117.854297, 39.328348 ], [ 117.854913, 39.328348 ], [ 117.854297, 39.328348 ], [ 117.850601, 39.363984 ], [ 117.850601, 39.363984 ], [ 117.810565, 39.354729 ], [ 117.805022, 39.373237 ], [ 117.852449, 39.380639 ], [ 117.846906, 39.407926 ], [ 117.871543, 39.411625 ], [ 117.870311, 39.455074 ], [ 117.899877, 39.474479 ], [ 117.912195, 39.517428 ], [ 117.912195, 39.517428 ], [ 117.904804, 39.533585 ], [ 117.933753, 39.574191 ], [ 117.868464, 39.59679 ], [ 117.829659, 39.589873 ], [ 117.766834, 39.598635 ], [ 117.753899, 39.579726 ], [ 117.753899, 39.579726 ], [ 117.745276, 39.547892 ], [ 117.715711, 39.529892 ], [ 117.707088, 39.576036 ], [ 117.684914, 39.58895 ], [ 117.654117, 39.575113 ], [ 117.637486, 39.603246 ], [ 117.66274, 39.636437 ], [ 117.668899, 39.666849 ], [ 117.627015, 39.703693 ], [ 117.57774, 39.726711 ], [ 117.595603, 39.74604 ], [ 117.56111, 39.754782 ], [ 117.546327, 39.775943 ], [ 117.561726, 39.799856 ], [ 117.529081, 39.859144 ], [ 117.529081, 39.859144 ], [ 117.508139, 39.901854 ], [ 117.508139, 39.901854 ], [ 117.512451, 39.90874 ], [ 117.512451, 39.90874 ], [ 117.513067, 39.910576 ], [ 117.513067, 39.910576 ], [ 117.514914, 39.946832 ], [ 117.534625, 39.954631 ], [ 117.546327, 39.999116 ], [ 117.594987, 39.994531 ], [ 117.594987, 39.994531 ], [ 117.614697, 39.97252 ], [ 117.671363, 39.973896 ], [ 117.691073, 39.984902 ], [ 117.756363, 39.965181 ], [ 117.781616, 39.966558 ], [ 117.781616, 39.966558 ], [ 117.795167, 39.996823 ], [ 117.795167, 39.996823 ], [ 117.793319, 40.005534 ], [ 117.793319, 40.005534 ], [ 117.768681, 40.022034 ], [ 117.768681, 40.022034 ], [ 117.744044, 40.018368 ], [ 117.74774, 40.047236 ], [ 117.776073, 40.059605 ], [ 117.752667, 40.081588 ], [ 117.71879, 40.082045 ], [ 117.71879, 40.082045 ], [ 117.675059, 40.082045 ], [ 117.655965, 40.109514 ], [ 117.655965, 40.109514 ], [ 117.654117, 40.114548 ], [ 117.654117, 40.114548 ], [ 117.651653, 40.122786 ], [ 117.651653, 40.122786 ], [ 117.613465, 40.158014 ], [ 117.613465, 40.158014 ], [ 117.609769, 40.160301 ], [ 117.609769, 40.160301 ], [ 117.576508, 40.178593 ], [ 117.571581, 40.219276 ], [ 117.548791, 40.232527 ], [ 117.505059, 40.227044 ], [ 117.450241, 40.252627 ], [ 117.415748, 40.248973 ], [ 117.389879, 40.227958 ], [ 117.351075, 40.229786 ], [ 117.331365, 40.289613 ], [ 117.295024, 40.2782 ], [ 117.271618, 40.325211 ], [ 117.271618, 40.325211 ], [ 117.243285, 40.369453 ], [ 117.226039, 40.368997 ], [ 117.234046, 40.417312 ], [ 117.263611, 40.442367 ], [ 117.208793, 40.501552 ], [ 117.262995, 40.512927 ], [ 117.247597, 40.539766 ], [ 117.269771, 40.560684 ], [ 117.348611, 40.581141 ], [ 117.348611, 40.581141 ], [ 117.389879, 40.561593 ], [ 117.429915, 40.576141 ], [ 117.412669, 40.605226 ], [ 117.467487, 40.649738 ] ] ], [ [ [ 117.210024, 40.082045 ], [ 117.192162, 40.066475 ], [ 117.198322, 39.992697 ], [ 117.150894, 39.944996 ], [ 117.162597, 39.876598 ], [ 117.162597, 39.876598 ], [ 117.227887, 39.852712 ], [ 117.247597, 39.860981 ], [ 117.251908, 39.834332 ], [ 117.192162, 39.832953 ], [ 117.156438, 39.817326 ], [ 117.15767, 39.796638 ], [ 117.205713, 39.763984 ], [ 117.161981, 39.748801 ], [ 117.165061, 39.718886 ], [ 117.165061, 39.718886 ], [ 117.177996, 39.645194 ], [ 117.152742, 39.623532 ], [ 117.10901, 39.625375 ], [ 117.10901, 39.625375 ], [ 117.016004, 39.653949 ], [ 116.983359, 39.638742 ], [ 116.983359, 39.638742 ], [ 116.964265, 39.64335 ], [ 116.948866, 39.680668 ], [ 116.948866, 39.680668 ], [ 116.944555, 39.695405 ], [ 116.944555, 39.695405 ], [ 116.932236, 39.706456 ], [ 116.932236, 39.706456 ], [ 116.90575, 39.688037 ], [ 116.889736, 39.687576 ], [ 116.887272, 39.72533 ], [ 116.916837, 39.731314 ], [ 116.902055, 39.763523 ], [ 116.949482, 39.778703 ], [ 116.918069, 39.84628 ], [ 116.907598, 39.832494 ], [ 116.865714, 39.843982 ], [ 116.812128, 39.889916 ], [ 116.78441, 39.891294 ], [ 116.782563, 39.947749 ], [ 116.757925, 39.967934 ], [ 116.781331, 40.034866 ], [ 116.820135, 40.02845 ], [ 116.831222, 40.051359 ], [ 116.867562, 40.041739 ], [ 116.927924, 40.055024 ], [ 116.945171, 40.04128 ], [ 117.025243, 40.030283 ], [ 117.051728, 40.059605 ], [ 117.105315, 40.074261 ], [ 117.105315, 40.074261 ], [ 117.140423, 40.064185 ], [ 117.159517, 40.077008 ], [ 117.204481, 40.069681 ], [ 117.210024, 40.082045 ] ] ], [ [ [ 117.784696, 39.376938 ], [ 117.74466, 39.354729 ], [ 117.670747, 39.35658 ], [ 117.669515, 39.322792 ], [ 117.594987, 39.349176 ], [ 117.536472, 39.338068 ], [ 117.521074, 39.357043 ], [ 117.570965, 39.404689 ], [ 117.601146, 39.419485 ], [ 117.614081, 39.407001 ], [ 117.668899, 39.412087 ], [ 117.673211, 39.386652 ], [ 117.699696, 39.407463 ], [ 117.765602, 39.400527 ], [ 117.784696, 39.376938 ] ] ], [ [ [ 118.869365, 39.142932 ], [ 118.857662, 39.098824 ], [ 118.82009, 39.108576 ], [ 118.869365, 39.142932 ] ] ] ] } },\n{ \"type\": \"Feature\", \"properties\": { \"adcode\": \"140000\", \"name\": \"山西省\", \"center\": [ 112.549248, 37.857014 ], \"centroid\": [ 112.304761, 37.618555 ], \"childrenNum\": 11, \"level\": \"province\", \"parent\": { \"adcode\": 100000 }, \"subFeatureIndex\": 3, \"acroutes\": [ 100000 ] }, \"geometry\": { \"type\": \"MultiPolygon\", \"coordinates\": [ [ [ [ 114.134639, 40.737314 ], [ 114.162357, 40.71373 ], [ 114.183299, 40.67153 ], [ 114.236269, 40.607043 ], [ 114.283081, 40.590685 ], [ 114.273842, 40.552954 ], [ 114.293552, 40.55159 ], [ 114.282465, 40.494725 ], [ 114.267066, 40.474242 ], [ 114.299711, 40.44009 ], [ 114.286161, 40.425057 ], [ 114.31203, 40.372645 ], [ 114.381015, 40.36307 ], [ 114.390254, 40.351213 ], [ 114.438914, 40.371733 ], [ 114.481413, 40.34802 ], [ 114.530688, 40.345283 ], [ 114.510978, 40.302851 ], [ 114.46971, 40.268155 ], [ 114.406269, 40.246232 ], [ 114.362537, 40.249886 ], [ 114.292936, 40.230242 ], [ 114.255364, 40.236182 ], [ 114.235654, 40.198252 ], [ 114.180219, 40.191395 ], [ 114.135871, 40.175392 ], [ 114.097683, 40.193681 ], [ 114.073046, 40.168533 ], [ 114.073046, 40.168533 ], [ 114.101995, 40.099901 ], [ 114.086596, 40.071513 ], [ 114.045944, 40.056856 ], [ 114.018227, 40.103563 ], [ 113.989278, 40.11226 ], [ 113.959097, 40.033491 ], [ 113.910438, 40.015618 ], [ 114.029314, 39.985819 ], [ 114.028082, 39.959218 ], [ 114.047176, 39.916085 ], [ 114.067502, 39.922511 ], [ 114.17406, 39.897722 ], [ 114.212248, 39.918839 ], [ 114.229494, 39.899558 ], [ 114.204241, 39.885324 ], [ 114.215943, 39.8619 ], [ 114.286776, 39.871087 ], [ 114.285545, 39.858225 ], [ 114.395182, 39.867412 ], [ 114.406885, 39.833413 ], [ 114.390254, 39.819165 ], [ 114.41674, 39.775943 ], [ 114.409964, 39.761683 ], [ 114.408117, 39.652106 ], [ 114.431522, 39.613851 ], [ 114.49558, 39.608318 ], [ 114.51529, 39.564964 ], [ 114.568877, 39.573729 ], [ 114.532536, 39.486027 ], [ 114.501739, 39.476789 ], [ 114.496812, 39.438437 ], [ 114.469095, 39.400989 ], [ 114.466631, 39.329736 ], [ 114.430906, 39.307513 ], [ 114.437066, 39.259337 ], [ 114.416124, 39.242654 ], [ 114.47587, 39.21623 ], [ 114.443841, 39.174023 ], [ 114.388406, 39.176807 ], [ 114.360689, 39.134112 ], [ 114.369928, 39.107648 ], [ 114.345907, 39.075133 ], [ 114.252284, 39.073739 ], [ 114.180835, 39.049111 ], [ 114.157429, 39.061194 ], [ 114.10877, 39.052364 ], [ 114.082901, 39.09325 ], [ 114.082901, 39.09325 ], [ 114.064422, 39.094179 ], [ 114.050872, 39.135969 ], [ 114.006524, 39.122971 ], [ 113.994821, 39.095572 ], [ 113.961561, 39.100681 ], [ 113.930148, 39.063517 ], [ 113.898119, 39.067699 ], [ 113.80696, 38.989595 ], [ 113.776779, 38.986804 ], [ 113.76754, 38.959819 ], [ 113.776163, 38.885788 ], [ 113.795257, 38.860628 ], [ 113.855619, 38.828933 ], [ 113.836525, 38.795824 ], [ 113.839605, 38.7585 ], [ 113.802648, 38.763166 ], [ 113.775547, 38.709949 ], [ 113.720728, 38.713218 ], [ 113.70225, 38.651551 ], [ 113.612939, 38.645942 ], [ 113.603084, 38.587024 ], [ 113.561816, 38.558483 ], [ 113.5612, 38.485909 ], [ 113.583374, 38.459671 ], [ 113.537794, 38.417952 ], [ 113.525475, 38.383245 ], [ 113.557504, 38.343359 ], [ 113.54457, 38.270569 ], [ 113.570439, 38.237202 ], [ 113.598772, 38.22733 ], [ 113.64312, 38.232031 ], [ 113.678844, 38.20523 ], [ 113.711489, 38.213695 ], [ 113.720728, 38.174656 ], [ 113.797105, 38.162894 ], [ 113.831597, 38.16854 ], [ 113.811271, 38.117707 ], [ 113.876561, 38.055059 ], [ 113.872249, 37.990471 ], [ 113.901198, 37.984811 ], [ 113.936307, 37.922993 ], [ 113.959097, 37.906468 ], [ 113.976959, 37.816696 ], [ 114.006524, 37.813386 ], [ 114.044712, 37.761834 ], [ 113.996669, 37.730128 ], [ 113.993589, 37.706932 ], [ 114.068118, 37.721608 ], [ 114.12848, 37.698409 ], [ 114.139567, 37.675676 ], [ 114.115545, 37.619761 ], [ 114.118625, 37.59084 ], [ 114.036705, 37.494037 ], [ 114.014531, 37.42468 ], [ 113.973879, 37.40329 ], [ 113.962792, 37.355734 ], [ 113.90243, 37.310052 ], [ 113.886416, 37.239095 ], [ 113.853155, 37.215269 ], [ 113.832213, 37.167594 ], [ 113.773083, 37.151855 ], [ 113.773699, 37.107004 ], [ 113.758301, 37.075497 ], [ 113.788482, 37.059739 ], [ 113.771851, 37.016745 ], [ 113.791561, 36.98759 ], [ 113.76138, 36.956034 ], [ 113.792793, 36.894796 ], [ 113.773083, 36.85506 ], [ 113.731815, 36.858891 ], [ 113.731815, 36.878521 ], [ 113.696707, 36.882351 ], [ 113.676381, 36.855539 ], [ 113.680692, 36.789907 ], [ 113.600004, 36.752995 ], [ 113.549497, 36.752515 ], [ 113.535946, 36.732373 ], [ 113.499606, 36.740527 ], [ 113.465113, 36.707908 ], [ 113.506997, 36.705029 ], [ 113.476816, 36.655114 ], [ 113.486671, 36.635427 ], [ 113.54457, 36.62342 ], [ 113.539642, 36.594116 ], [ 113.569823, 36.585947 ], [ 113.588917, 36.547974 ], [ 113.559968, 36.528741 ], [ 113.554425, 36.494589 ], [ 113.587069, 36.460904 ], [ 113.635729, 36.451277 ], [ 113.670221, 36.425278 ], [ 113.708409, 36.423352 ], [ 113.731199, 36.363135 ], [ 113.736127, 36.324571 ], [ 113.712105, 36.303353 ], [ 113.716417, 36.262347 ], [ 113.681924, 36.216491 ], [ 113.697939, 36.181719 ], [ 113.651127, 36.174473 ], [ 113.705946, 36.148865 ], [ 113.712721, 36.129533 ], [ 113.655439, 36.125182 ], [ 113.671453, 36.115514 ], [ 113.68562, 36.056026 ], [ 113.660366, 36.034735 ], [ 113.694859, 36.026991 ], [ 113.678844, 35.985841 ], [ 113.648663, 35.994073 ], [ 113.654207, 35.931586 ], [ 113.637576, 35.870019 ], [ 113.660982, 35.837035 ], [ 113.582758, 35.818111 ], [ 113.604932, 35.797727 ], [ 113.587685, 35.736542 ], [ 113.592613, 35.691838 ], [ 113.622794, 35.674825 ], [ 113.625258, 35.632518 ], [ 113.578446, 35.633491 ], [ 113.547649, 35.656835 ], [ 113.55812, 35.621816 ], [ 113.513773, 35.57364 ], [ 113.49899, 35.532254 ], [ 113.439244, 35.507412 ], [ 113.391817, 35.506925 ], [ 113.348085, 35.468429 ], [ 113.31236, 35.481101 ], [ 113.304353, 35.426989 ], [ 113.243375, 35.449418 ], [ 113.189789, 35.44893 ], [ 113.188557, 35.412357 ], [ 113.165151, 35.412845 ], [ 113.149137, 35.350878 ], [ 113.126347, 35.332327 ], [ 113.067217, 35.353806 ], [ 112.996384, 35.362104 ], [ 112.985913, 35.33965 ], [ 112.992072, 35.29619 ], [ 112.936022, 35.284466 ], [ 112.934174, 35.262968 ], [ 112.884283, 35.243909 ], [ 112.822073, 35.258082 ], [ 112.772798, 35.207732 ], [ 112.720443, 35.206265 ], [ 112.628052, 35.263457 ], [ 112.637291, 35.225822 ], [ 112.513487, 35.218489 ], [ 112.390915, 35.239021 ], [ 112.36751, 35.219956 ], [ 112.288053, 35.219956 ], [ 112.304684, 35.251728 ], [ 112.242474, 35.234622 ], [ 112.21722, 35.253195 ], [ 112.094033, 35.279092 ], [ 112.058924, 35.280069 ], [ 112.078634, 35.219467 ], [ 112.03983, 35.194039 ], [ 112.066315, 35.153437 ], [ 112.05646, 35.098615 ], [ 112.062004, 35.056005 ], [ 112.039214, 35.045717 ], [ 112.018888, 35.068742 ], [ 111.97762, 35.067272 ], [ 111.933272, 35.083435 ], [ 111.810084, 35.062374 ], [ 111.807005, 35.032977 ], [ 111.739251, 35.00406 ], [ 111.664107, 34.984449 ], [ 111.681969, 34.9511 ], [ 111.646861, 34.938836 ], [ 111.617911, 34.894671 ], [ 111.592042, 34.881416 ], [ 111.570484, 34.843114 ], [ 111.543999, 34.853428 ], [ 111.502731, 34.829851 ], [ 111.439289, 34.838202 ], [ 111.389398, 34.815113 ], [ 111.345666, 34.831816 ], [ 111.29208, 34.806759 ], [ 111.255123, 34.819535 ], [ 111.232949, 34.789559 ], [ 111.148566, 34.807742 ], [ 111.118385, 34.756623 ], [ 111.035233, 34.740887 ], [ 110.976103, 34.706456 ], [ 110.929907, 34.731543 ], [ 110.89911, 34.661673 ], [ 110.870777, 34.636072 ], [ 110.812263, 34.624746 ], [ 110.780234, 34.648874 ], [ 110.749437, 34.65232 ], [ 110.710017, 34.605045 ], [ 110.610851, 34.607508 ], [ 110.533242, 34.583368 ], [ 110.488279, 34.610956 ], [ 110.424837, 34.588295 ], [ 110.379257, 34.600612 ], [ 110.29549, 34.610956 ], [ 110.23636, 34.670533 ], [ 110.231432, 34.701044 ], [ 110.259149, 34.737937 ], [ 110.232664, 34.80332 ], [ 110.233896, 34.83722 ], [ 110.259149, 34.884853 ], [ 110.257301, 34.934912 ], [ 110.272084, 34.942761 ], [ 110.325671, 35.014844 ], [ 110.369402, 35.158329 ], [ 110.374946, 35.251728 ], [ 110.45009, 35.327933 ], [ 110.477808, 35.413821 ], [ 110.531394, 35.511309 ], [ 110.567735, 35.539559 ], [ 110.609619, 35.632031 ], [ 110.57759, 35.701559 ], [ 110.571431, 35.800639 ], [ 110.550489, 35.838005 ], [ 110.549257, 35.877778 ], [ 110.511684, 35.879718 ], [ 110.516612, 35.918501 ], [ 110.502445, 35.947575 ], [ 110.516612, 35.971796 ], [ 110.49259, 35.994073 ], [ 110.491974, 36.034735 ], [ 110.467953, 36.074893 ], [ 110.447011, 36.164328 ], [ 110.45625, 36.22663 ], [ 110.474112, 36.248352 ], [ 110.474112, 36.306729 ], [ 110.459946, 36.327946 ], [ 110.487047, 36.393972 ], [ 110.489511, 36.430094 ], [ 110.47288, 36.453203 ], [ 110.503677, 36.488335 ], [ 110.488895, 36.556628 ], [ 110.496902, 36.582102 ], [ 110.447627, 36.621018 ], [ 110.426685, 36.657514 ], [ 110.394656, 36.676716 ], [ 110.402663, 36.697352 ], [ 110.438388, 36.685835 ], [ 110.447011, 36.737649 ], [ 110.407591, 36.776007 ], [ 110.423605, 36.818179 ], [ 110.406975, 36.824886 ], [ 110.424221, 36.855539 ], [ 110.376178, 36.882351 ], [ 110.408823, 36.892403 ], [ 110.424221, 36.963685 ], [ 110.381721, 37.002408 ], [ 110.382953, 37.022001 ], [ 110.426685, 37.008621 ], [ 110.417446, 37.027257 ], [ 110.460561, 37.044932 ], [ 110.49567, 37.086956 ], [ 110.535706, 37.115118 ], [ 110.53509, 37.138021 ], [ 110.590525, 37.187145 ], [ 110.651503, 37.256722 ], [ 110.660126, 37.281011 ], [ 110.690307, 37.287201 ], [ 110.678604, 37.317668 ], [ 110.695234, 37.34955 ], [ 110.641648, 37.360015 ], [ 110.630561, 37.372858 ], [ 110.644111, 37.435135 ], [ 110.740198, 37.44939 ], [ 110.759292, 37.474567 ], [ 110.770995, 37.538184 ], [ 110.795017, 37.558586 ], [ 110.771611, 37.594634 ], [ 110.763604, 37.639668 ], [ 110.793169, 37.650567 ], [ 110.775306, 37.680886 ], [ 110.706321, 37.705511 ], [ 110.716792, 37.728708 ], [ 110.750669, 37.736281 ], [ 110.735886, 37.77035 ], [ 110.680452, 37.790216 ], [ 110.59422, 37.922049 ], [ 110.522771, 37.955088 ], [ 110.528315, 37.990471 ], [ 110.507989, 38.013107 ], [ 110.501829, 38.097929 ], [ 110.519692, 38.130889 ], [ 110.509221, 38.192061 ], [ 110.528315, 38.211814 ], [ 110.565887, 38.215105 ], [ 110.57759, 38.297345 ], [ 110.601612, 38.308147 ], [ 110.661358, 38.308617 ], [ 110.701394, 38.353215 ], [ 110.746973, 38.366355 ], [ 110.77777, 38.440924 ], [ 110.796864, 38.453579 ], [ 110.840596, 38.439986 ], [ 110.874473, 38.453579 ], [ 110.870777, 38.510265 ], [ 110.907733, 38.521035 ], [ 110.920052, 38.581878 ], [ 110.898494, 38.587024 ], [ 110.880632, 38.626776 ], [ 110.916357, 38.673981 ], [ 110.915125, 38.704345 ], [ 110.965016, 38.755699 ], [ 111.009363, 38.847579 ], [ 110.995813, 38.868084 ], [ 111.016755, 38.889981 ], [ 111.009979, 38.932823 ], [ 110.980414, 38.970056 ], [ 110.998276, 38.998433 ], [ 111.038313, 39.020289 ], [ 111.094363, 39.030053 ], [ 111.138095, 39.064447 ], [ 111.147334, 39.100681 ], [ 111.173819, 39.135041 ], [ 111.163348, 39.152678 ], [ 111.219399, 39.244044 ], [ 111.213239, 39.257021 ], [ 111.247732, 39.302419 ], [ 111.202152, 39.305197 ], [ 111.179363, 39.326959 ], [ 111.186138, 39.35149 ], [ 111.155341, 39.338531 ], [ 111.159037, 39.362596 ], [ 111.125776, 39.366297 ], [ 111.143022, 39.407926 ], [ 111.171971, 39.423183 ], [ 111.287152, 39.417173 ], [ 111.358601, 39.432428 ], [ 111.385086, 39.489722 ], [ 111.431282, 39.508656 ], [ 111.422043, 39.539123 ], [ 111.441137, 39.59679 ], [ 111.460847, 39.606935 ], [ 111.445448, 39.640124 ], [ 111.497187, 39.661781 ], [ 111.525521, 39.662242 ], [ 111.61668, 39.633211 ], [ 111.646245, 39.644272 ], [ 111.707839, 39.621227 ], [ 111.722621, 39.606013 ], [ 111.783599, 39.58895 ], [ 111.842729, 39.620305 ], [ 111.87907, 39.606013 ], [ 111.9382, 39.623071 ], [ 111.925265, 39.66731 ], [ 111.959758, 39.692642 ], [ 111.970229, 39.796638 ], [ 112.012729, 39.827438 ], [ 112.042294, 39.886243 ], [ 112.07617, 39.919298 ], [ 112.133453, 40.001866 ], [ 112.142076, 40.027076 ], [ 112.182112, 40.061437 ], [ 112.183344, 40.083877 ], [ 112.232003, 40.133311 ], [ 112.232619, 40.169905 ], [ 112.299756, 40.21105 ], [ 112.310227, 40.256281 ], [ 112.349031, 40.257194 ], [ 112.418017, 40.295091 ], [ 112.456205, 40.300112 ], [ 112.511639, 40.269068 ], [ 112.6299, 40.235725 ], [ 112.712436, 40.178593 ], [ 112.744464, 40.167161 ], [ 112.848558, 40.206937 ], [ 112.898449, 40.329317 ], [ 113.03334, 40.368997 ], [ 113.083231, 40.374925 ], [ 113.251382, 40.413211 ], [ 113.27602, 40.388601 ], [ 113.316672, 40.319736 ], [ 113.387505, 40.319279 ], [ 113.500222, 40.334335 ], [ 113.559968, 40.348476 ], [ 113.688699, 40.448288 ], [ 113.763228, 40.473787 ], [ 113.794641, 40.517932 ], [ 113.850691, 40.460583 ], [ 113.890112, 40.466503 ], [ 113.948626, 40.514747 ], [ 114.011452, 40.515657 ], [ 114.061959, 40.52885 ], [ 114.080437, 40.547952 ], [ 114.076741, 40.575686 ], [ 114.041633, 40.608861 ], [ 114.07243, 40.679246 ], [ 114.063806, 40.706925 ], [ 114.084748, 40.729605 ], [ 114.134639, 40.737314 ] ] ] ] } },\n{ \"type\": \"Feature\", \"properties\": { \"adcode\": \"150000\", \"name\": \"内蒙古自治区\", \"center\": [ 111.670801, 40.818311 ], \"centroid\": [ 114.077404, 44.331072 ], \"childrenNum\": 12, \"level\": \"province\", \"parent\": { \"adcode\": 100000 }, \"subFeatureIndex\": 4, \"acroutes\": [ 100000 ] }, \"geometry\": { \"type\": \"Polygon\", \"coordinates\": [ [ [ 111.125776, 39.366297 ], [ 111.087588, 39.376013 ], [ 111.098059, 39.401914 ], [ 111.064182, 39.400989 ], [ 111.058639, 39.447681 ], [ 111.10545, 39.472631 ], [ 111.10545, 39.497573 ], [ 111.148566, 39.531277 ], [ 111.154725, 39.569116 ], [ 111.136863, 39.587106 ], [ 111.101138, 39.559428 ], [ 111.017371, 39.552045 ], [ 110.958856, 39.519275 ], [ 110.891103, 39.509118 ], [ 110.869545, 39.494341 ], [ 110.782698, 39.38804 ], [ 110.73835, 39.348713 ], [ 110.731575, 39.30705 ], [ 110.702626, 39.273701 ], [ 110.626249, 39.266751 ], [ 110.596684, 39.282966 ], [ 110.566503, 39.320014 ], [ 110.559728, 39.351027 ], [ 110.524003, 39.382952 ], [ 110.482735, 39.360745 ], [ 110.434692, 39.381101 ], [ 110.429764, 39.341308 ], [ 110.385417, 39.310291 ], [ 110.257917, 39.407001 ], [ 110.243751, 39.423645 ], [ 110.152592, 39.45415 ], [ 110.12549, 39.432891 ], [ 110.136577, 39.39174 ], [ 110.161831, 39.387115 ], [ 110.184005, 39.355192 ], [ 110.217881, 39.281113 ], [ 110.109476, 39.249606 ], [ 110.041107, 39.21623 ], [ 109.962267, 39.212056 ], [ 109.90252, 39.271848 ], [ 109.871723, 39.243581 ], [ 109.961035, 39.191651 ], [ 109.893897, 39.141075 ], [ 109.92223, 39.107183 ], [ 109.890818, 39.103932 ], [ 109.851397, 39.122971 ], [ 109.793499, 39.074204 ], [ 109.762086, 39.057476 ], [ 109.72513, 39.018429 ], [ 109.665384, 38.981687 ], [ 109.685094, 38.968195 ], [ 109.672159, 38.928167 ], [ 109.624116, 38.85457 ], [ 109.549587, 38.805618 ], [ 109.511399, 38.833595 ], [ 109.444262, 38.782763 ], [ 109.404226, 38.720689 ], [ 109.338936, 38.701542 ], [ 109.329081, 38.66043 ], [ 109.367269, 38.627711 ], [ 109.331545, 38.597783 ], [ 109.276726, 38.623035 ], [ 109.196654, 38.552867 ], [ 109.175712, 38.518694 ], [ 109.128901, 38.480288 ], [ 109.054372, 38.433892 ], [ 109.051292, 38.385122 ], [ 109.007561, 38.359316 ], [ 108.961981, 38.26493 ], [ 108.976148, 38.245192 ], [ 108.938575, 38.207582 ], [ 108.964445, 38.154894 ], [ 109.069155, 38.091336 ], [ 109.050676, 38.055059 ], [ 109.06977, 38.023008 ], [ 109.037742, 38.021593 ], [ 109.018648, 37.971602 ], [ 108.982923, 37.964053 ], [ 108.9743, 37.931962 ], [ 108.93488, 37.922521 ], [ 108.893612, 37.978207 ], [ 108.883141, 38.01405 ], [ 108.830786, 38.049875 ], [ 108.797525, 38.04799 ], [ 108.82709, 37.989056 ], [ 108.798141, 37.93385 ], [ 108.791982, 37.872934 ], [ 108.799989, 37.784068 ], [ 108.784591, 37.764673 ], [ 108.791982, 37.700303 ], [ 108.777815, 37.683728 ], [ 108.720533, 37.683728 ], [ 108.699591, 37.669518 ], [ 108.628142, 37.651988 ], [ 108.532671, 37.690832 ], [ 108.485244, 37.678044 ], [ 108.422418, 37.648672 ], [ 108.301078, 37.640616 ], [ 108.293071, 37.656726 ], [ 108.24626, 37.665728 ], [ 108.205608, 37.655779 ], [ 108.193905, 37.638246 ], [ 108.134159, 37.622131 ], [ 108.055318, 37.652462 ], [ 108.025137, 37.649619 ], [ 108.012819, 37.66857 ], [ 108.025753, 37.696041 ], [ 107.993109, 37.735335 ], [ 107.982022, 37.787378 ], [ 107.884703, 37.808186 ], [ 107.842819, 37.828987 ], [ 107.732566, 37.84931 ], [ 107.684523, 37.888522 ], [ 107.65003, 37.86443 ], [ 107.560719, 37.893717 ], [ 107.49235, 37.944706 ], [ 107.448618, 37.933378 ], [ 107.411662, 37.948009 ], [ 107.440611, 37.995659 ], [ 107.3938, 38.014993 ], [ 107.33159, 38.086625 ], [ 107.240431, 38.111586 ], [ 107.19054, 38.153953 ], [ 107.138801, 38.161011 ], [ 107.119091, 38.134185 ], [ 107.071047, 38.138892 ], [ 107.051337, 38.122886 ], [ 107.010069, 38.120532 ], [ 106.942316, 38.132302 ], [ 106.858548, 38.156306 ], [ 106.779092, 38.171833 ], [ 106.737824, 38.197706 ], [ 106.654672, 38.22921 ], [ 106.627571, 38.232501 ], [ 106.555506, 38.263521 ], [ 106.482209, 38.319417 ], [ 106.599854, 38.389812 ], [ 106.647897, 38.470917 ], [ 106.66268, 38.601524 ], [ 106.709491, 38.718821 ], [ 106.756302, 38.748699 ], [ 106.837606, 38.847579 ], [ 106.954019, 38.941202 ], [ 106.971881, 39.026333 ], [ 106.96757, 39.054688 ], [ 106.933693, 39.076527 ], [ 106.878874, 39.091392 ], [ 106.859164, 39.107648 ], [ 106.825288, 39.19397 ], [ 106.795723, 39.214375 ], [ 106.790795, 39.241263 ], [ 106.806193, 39.277407 ], [ 106.806809, 39.318625 ], [ 106.781556, 39.371849 ], [ 106.751375, 39.381564 ], [ 106.683622, 39.357506 ], [ 106.643586, 39.357969 ], [ 106.602318, 39.37555 ], [ 106.556122, 39.322329 ], [ 106.525325, 39.308439 ], [ 106.511774, 39.272311 ], [ 106.402753, 39.291767 ], [ 106.280181, 39.262118 ], [ 106.29558, 39.167992 ], [ 106.285109, 39.146181 ], [ 106.251232, 39.131327 ], [ 106.192718, 39.142932 ], [ 106.170544, 39.163352 ], [ 106.145907, 39.153142 ], [ 106.096631, 39.084889 ], [ 106.078153, 39.026333 ], [ 106.087392, 39.006339 ], [ 106.060907, 38.96866 ], [ 106.021487, 38.953769 ], [ 105.97098, 38.909077 ], [ 105.992538, 38.857366 ], [ 105.909386, 38.791159 ], [ 105.908154, 38.737496 ], [ 105.88598, 38.716953 ], [ 105.894603, 38.696405 ], [ 105.852719, 38.641735 ], [ 105.874277, 38.593105 ], [ 105.856415, 38.569714 ], [ 105.863806, 38.53508 ], [ 105.836705, 38.476071 ], [ 105.850872, 38.443736 ], [ 105.827466, 38.432486 ], [ 105.835473, 38.387467 ], [ 105.821307, 38.366824 ], [ 105.86627, 38.296406 ], [ 105.842248, 38.240962 ], [ 105.802828, 38.220277 ], [ 105.775111, 38.186887 ], [ 105.76772, 38.121474 ], [ 105.780655, 38.084741 ], [ 105.840401, 38.004147 ], [ 105.799749, 37.939986 ], [ 105.80406, 37.862068 ], [ 105.760944, 37.799674 ], [ 105.677177, 37.771769 ], [ 105.622358, 37.777919 ], [ 105.616199, 37.722555 ], [ 105.598952, 37.699356 ], [ 105.467141, 37.695094 ], [ 105.4037, 37.710246 ], [ 105.315004, 37.702197 ], [ 105.221998, 37.677097 ], [ 105.187505, 37.657674 ], [ 105.111128, 37.633981 ], [ 105.027977, 37.580881 ], [ 104.866601, 37.566651 ], [ 104.805007, 37.539133 ], [ 104.623305, 37.522522 ], [ 104.433595, 37.515402 ], [ 104.419429, 37.511604 ], [ 104.407726, 37.464592 ], [ 104.322726, 37.44844 ], [ 104.287002, 37.428007 ], [ 104.237727, 37.411847 ], [ 104.183524, 37.406618 ], [ 104.089285, 37.465067 ], [ 103.935916, 37.572818 ], [ 103.874938, 37.604117 ], [ 103.841062, 37.64725 ], [ 103.683381, 37.777919 ], [ 103.627947, 37.797783 ], [ 103.40744, 37.860651 ], [ 103.362477, 38.037621 ], [ 103.368636, 38.08898 ], [ 103.53494, 38.156776 ], [ 103.507838, 38.280905 ], [ 103.465339, 38.353215 ], [ 103.416063, 38.404821 ], [ 103.85954, 38.64454 ], [ 104.011677, 38.85923 ], [ 104.044322, 38.895105 ], [ 104.173053, 38.94446 ], [ 104.196459, 38.9882 ], [ 104.190915, 39.042139 ], [ 104.207546, 39.083495 ], [ 104.171205, 39.160567 ], [ 104.047401, 39.297788 ], [ 104.073271, 39.351953 ], [ 104.089901, 39.419947 ], [ 103.955626, 39.456923 ], [ 103.85338, 39.461543 ], [ 103.728961, 39.430117 ], [ 103.595302, 39.386652 ], [ 103.428998, 39.353341 ], [ 103.344615, 39.331588 ], [ 103.259615, 39.263971 ], [ 103.188166, 39.215302 ], [ 103.133347, 39.192579 ], [ 103.007696, 39.099753 ], [ 102.883892, 39.120649 ], [ 102.616574, 39.171703 ], [ 102.579002, 39.183301 ], [ 102.45335, 39.255167 ], [ 102.3548, 39.231993 ], [ 102.276576, 39.188868 ], [ 102.050526, 39.141075 ], [ 102.012338, 39.127149 ], [ 101.902701, 39.111827 ], [ 101.833715, 39.08907 ], [ 101.926106, 39.000758 ], [ 101.955055, 38.985874 ], [ 102.045599, 38.904885 ], [ 102.075164, 38.891378 ], [ 101.941505, 38.808883 ], [ 101.873751, 38.733761 ], [ 101.777049, 38.66043 ], [ 101.672955, 38.6908 ], [ 101.601506, 38.65529 ], [ 101.562702, 38.713218 ], [ 101.412413, 38.764099 ], [ 101.331109, 38.777164 ], [ 101.307087, 38.80282 ], [ 101.34158, 38.822406 ], [ 101.33542, 38.847113 ], [ 101.24303, 38.860628 ], [ 101.237486, 38.907214 ], [ 101.198682, 38.943064 ], [ 101.228863, 39.020754 ], [ 101.117378, 38.975174 ], [ 100.969553, 38.946788 ], [ 100.961545, 39.005874 ], [ 100.901799, 39.030053 ], [ 100.875314, 39.002619 ], [ 100.835278, 39.025869 ], [ 100.829118, 39.075133 ], [ 100.864227, 39.106719 ], [ 100.842669, 39.199999 ], [ 100.842053, 39.405614 ], [ 100.707778, 39.404689 ], [ 100.606764, 39.387577 ], [ 100.498975, 39.400527 ], [ 100.500823, 39.481408 ], [ 100.44354, 39.485565 ], [ 100.326512, 39.509118 ], [ 100.301258, 39.572345 ], [ 100.314193, 39.606935 ], [ 100.250135, 39.685274 ], [ 100.128179, 39.702312 ], [ 100.040716, 39.757083 ], [ 99.958796, 39.769504 ], [ 99.904593, 39.785601 ], [ 99.822058, 39.860063 ], [ 99.672384, 39.888079 ], [ 99.469124, 39.875221 ], [ 99.440791, 39.885783 ], [ 99.459885, 39.898181 ], [ 99.491298, 39.884406 ], [ 99.533182, 39.891753 ], [ 99.714268, 39.972061 ], [ 99.751225, 40.006909 ], [ 99.841152, 40.013326 ], [ 99.927383, 40.063727 ], [ 99.955716, 40.150695 ], [ 100.007455, 40.20008 ], [ 100.169447, 40.277743 ], [ 100.169447, 40.541131 ], [ 100.242744, 40.618855 ], [ 100.237201, 40.716905 ], [ 100.224882, 40.727337 ], [ 100.107853, 40.875475 ], [ 100.057346, 40.908049 ], [ 99.985897, 40.909858 ], [ 99.673, 40.93292 ], [ 99.565827, 40.846961 ], [ 99.174705, 40.858278 ], [ 99.172858, 40.747289 ], [ 99.12543, 40.715091 ], [ 99.102025, 40.676522 ], [ 99.041662, 40.693767 ], [ 98.984996, 40.782644 ], [ 98.790975, 40.705564 ], [ 98.80699, 40.660181 ], [ 98.802678, 40.607043 ], [ 98.762642, 40.639748 ], [ 98.72199, 40.657911 ], [ 98.689345, 40.691952 ], [ 98.668403, 40.773128 ], [ 98.569853, 40.746836 ], [ 98.627751, 40.677884 ], [ 98.344419, 40.568413 ], [ 98.333332, 40.918903 ], [ 98.25018, 40.93925 ], [ 98.184891, 40.988056 ], [ 98.142391, 41.001607 ], [ 97.971776, 41.09774 ], [ 97.903407, 41.168057 ], [ 97.629314, 41.440498 ], [ 97.613915, 41.477276 ], [ 97.84674, 41.656379 ], [ 97.653335, 41.986856 ], [ 97.500582, 42.243894 ], [ 97.371235, 42.457076 ], [ 97.172903, 42.795257 ], [ 97.28254, 42.782081 ], [ 97.831958, 42.706047 ], [ 98.195362, 42.653251 ], [ 98.546447, 42.638284 ], [ 98.962822, 42.607018 ], [ 99.51224, 42.568244 ], [ 99.969267, 42.647969 ], [ 100.004376, 42.648849 ], [ 100.272309, 42.636523 ], [ 100.32528, 42.690213 ], [ 100.826655, 42.675255 ], [ 100.862995, 42.671295 ], [ 101.291689, 42.586312 ], [ 101.557775, 42.529887 ], [ 101.770274, 42.509597 ], [ 101.803534, 42.503861 ], [ 101.877447, 42.432345 ], [ 102.070236, 42.232374 ], [ 102.093642, 42.223512 ], [ 102.449039, 42.144133 ], [ 102.540814, 42.162323 ], [ 102.621502, 42.154338 ], [ 102.712045, 42.153007 ], [ 103.021862, 42.028212 ], [ 103.20726, 41.96283 ], [ 103.418527, 41.882233 ], [ 103.454868, 41.877332 ], [ 103.868779, 41.802427 ], [ 104.080046, 41.805104 ], [ 104.30856, 41.840782 ], [ 104.418813, 41.860397 ], [ 104.530298, 41.875104 ], [ 104.524138, 41.661745 ], [ 104.68921, 41.6452 ], [ 104.803775, 41.652355 ], [ 104.923267, 41.654143 ], [ 105.009498, 41.583007 ], [ 105.230621, 41.751103 ], [ 105.291599, 41.749763 ], [ 105.385221, 41.797073 ], [ 105.589713, 41.888471 ], [ 105.74185, 41.949033 ], [ 106.01348, 42.032213 ], [ 106.344855, 42.149457 ], [ 106.372572, 42.161436 ], [ 106.612789, 42.241679 ], [ 106.785867, 42.291281 ], [ 107.051337, 42.319166 ], [ 107.271844, 42.364285 ], [ 107.303872, 42.412465 ], [ 107.46648, 42.458842 ], [ 107.501589, 42.456635 ], [ 107.57427, 42.412907 ], [ 107.736262, 42.415116 ], [ 107.939522, 42.403628 ], [ 107.986949, 42.413349 ], [ 108.022058, 42.433229 ], [ 108.089195, 42.436321 ], [ 108.238252, 42.460167 ], [ 108.298614, 42.438529 ], [ 108.532671, 42.442945 ], [ 108.705134, 42.413349 ], [ 108.798757, 42.415116 ], [ 108.845569, 42.395673 ], [ 108.983539, 42.449128 ], [ 109.026039, 42.458401 ], [ 109.291509, 42.435879 ], [ 109.486761, 42.458842 ], [ 109.544044, 42.472528 ], [ 109.683862, 42.558988 ], [ 109.733753, 42.579262 ], [ 109.906216, 42.635643 ], [ 110.108244, 42.642687 ], [ 110.139657, 42.674815 ], [ 110.34846, 42.742098 ], [ 110.437156, 42.781203 ], [ 110.469801, 42.839156 ], [ 110.631177, 42.936061 ], [ 110.689691, 43.02144 ], [ 110.687227, 43.036314 ], [ 110.736502, 43.089657 ], [ 110.769763, 43.099272 ], [ 110.82027, 43.149067 ], [ 111.02045, 43.329998 ], [ 111.069725, 43.357852 ], [ 111.151029, 43.38004 ], [ 111.183674, 43.396132 ], [ 111.354289, 43.436125 ], [ 111.400485, 43.472618 ], [ 111.456535, 43.494329 ], [ 111.564325, 43.490422 ], [ 111.606209, 43.513863 ], [ 111.79407, 43.672068 ], [ 111.891388, 43.6738 ], [ 111.951135, 43.693275 ], [ 111.970845, 43.748205 ], [ 111.959758, 43.823382 ], [ 111.870447, 43.940279 ], [ 111.773128, 44.010479 ], [ 111.702295, 44.034147 ], [ 111.662875, 44.061247 ], [ 111.559397, 44.171238 ], [ 111.541535, 44.206855 ], [ 111.534144, 44.26217 ], [ 111.507042, 44.294305 ], [ 111.428818, 44.319573 ], [ 111.415883, 44.35724 ], [ 111.427586, 44.394455 ], [ 111.478709, 44.488884 ], [ 111.514434, 44.507666 ], [ 111.530448, 44.55033 ], [ 111.569868, 44.57634 ], [ 111.560629, 44.647062 ], [ 111.585267, 44.705789 ], [ 111.624687, 44.778477 ], [ 111.69244, 44.859983 ], [ 111.764505, 44.969325 ], [ 111.903707, 45.052252 ], [ 112.002874, 45.090713 ], [ 112.071243, 45.096206 ], [ 112.113743, 45.072965 ], [ 112.396459, 45.064512 ], [ 112.438959, 45.071697 ], [ 112.540589, 45.001072 ], [ 112.599719, 44.930783 ], [ 112.712436, 44.879494 ], [ 112.850406, 44.840466 ], [ 112.937869, 44.840042 ], [ 113.037652, 44.822641 ], [ 113.11526, 44.799714 ], [ 113.503918, 44.777628 ], [ 113.540874, 44.759358 ], [ 113.631417, 44.745333 ], [ 113.712105, 44.788247 ], [ 113.798953, 44.849377 ], [ 113.861778, 44.863377 ], [ 113.907358, 44.915104 ], [ 114.065038, 44.931206 ], [ 114.116777, 44.957045 ], [ 114.158045, 44.994301 ], [ 114.19069, 45.036607 ], [ 114.313262, 45.107189 ], [ 114.347139, 45.119436 ], [ 114.409348, 45.179371 ], [ 114.459855, 45.21353 ], [ 114.519602, 45.283893 ], [ 114.539928, 45.325985 ], [ 114.551014, 45.387383 ], [ 114.600906, 45.403773 ], [ 114.745035, 45.438217 ], [ 114.920578, 45.386122 ], [ 114.983404, 45.379397 ], [ 115.178041, 45.396209 ], [ 115.36467, 45.392427 ], [ 115.586408, 45.440317 ], [ 115.699741, 45.45963 ], [ 115.864197, 45.572853 ], [ 115.936878, 45.632727 ], [ 116.026805, 45.661177 ], [ 116.035428, 45.685013 ], [ 116.1155, 45.679577 ], [ 116.17463, 45.688775 ], [ 116.217746, 45.72221 ], [ 116.22329, 45.747273 ], [ 116.260862, 45.776082 ], [ 116.286731, 45.775247 ], [ 116.278108, 45.831152 ], [ 116.288579, 45.839074 ], [ 116.243, 45.876169 ], [ 116.271949, 45.966926 ], [ 116.414231, 46.133896 ], [ 116.439484, 46.137628 ], [ 116.536187, 46.23251 ], [ 116.573143, 46.258998 ], [ 116.585462, 46.292504 ], [ 116.673541, 46.325163 ], [ 116.745606, 46.327642 ], [ 116.81336, 46.355737 ], [ 116.834302, 46.384229 ], [ 116.876801, 46.375559 ], [ 117.097308, 46.356976 ], [ 117.247597, 46.366888 ], [ 117.372017, 46.36028 ], [ 117.383719, 46.394962 ], [ 117.375712, 46.416421 ], [ 117.392343, 46.463023 ], [ 117.447777, 46.528117 ], [ 117.42006, 46.582029 ], [ 117.49582, 46.600535 ], [ 117.596218, 46.603414 ], [ 117.622704, 46.596012 ], [ 117.641182, 46.558166 ], [ 117.704008, 46.516587 ], [ 117.748355, 46.521941 ], [ 117.769913, 46.537586 ], [ 117.813645, 46.530588 ], [ 117.870927, 46.549935 ], [ 117.868464, 46.575447 ], [ 117.914659, 46.607936 ], [ 117.982412, 46.614925 ], [ 117.992883, 46.631366 ], [ 118.04647, 46.631366 ], [ 118.124078, 46.678195 ], [ 118.192448, 46.682711 ], [ 118.238643, 46.709392 ], [ 118.274984, 46.715957 ], [ 118.316252, 46.73934 ], [ 118.41049, 46.728265 ], [ 118.446831, 46.704467 ], [ 118.586033, 46.692975 ], [ 118.639004, 46.721291 ], [ 118.677192, 46.6979 ], [ 118.788061, 46.687227 ], [ 118.788061, 46.717598 ], [ 118.845343, 46.771731 ], [ 118.914329, 46.77501 ], [ 118.912481, 46.733188 ], [ 118.951285, 46.722111 ], [ 119.011647, 46.745902 ], [ 119.073857, 46.676552 ], [ 119.123132, 46.642872 ], [ 119.152081, 46.658072 ], [ 119.20074, 46.648213 ], [ 119.26295, 46.649034 ], [ 119.325776, 46.608759 ], [ 119.357805, 46.619447 ], [ 119.374435, 46.603414 ], [ 119.431718, 46.638763 ], [ 119.491464, 46.629311 ], [ 119.557985, 46.633832 ], [ 119.598637, 46.618214 ], [ 119.656535, 46.625612 ], [ 119.682405, 46.605058 ], [ 119.677477, 46.584908 ], [ 119.739687, 46.615336 ], [ 119.783419, 46.626023 ], [ 119.8136, 46.66834 ], [ 119.804361, 46.68189 ], [ 119.859179, 46.669572 ], [ 119.911534, 46.669572 ], [ 119.93494, 46.712674 ], [ 119.917078, 46.758203 ], [ 119.936172, 46.790173 ], [ 119.920157, 46.853238 ], [ 119.926933, 46.903963 ], [ 119.859795, 46.917046 ], [ 119.845013, 46.964852 ], [ 119.795122, 47.013024 ], [ 119.79081, 47.04525 ], [ 119.806825, 47.055037 ], [ 119.763093, 47.13082 ], [ 119.716282, 47.195518 ], [ 119.627586, 47.247544 ], [ 119.56784, 47.248357 ], [ 119.559217, 47.303172 ], [ 119.450812, 47.353065 ], [ 119.437877, 47.378602 ], [ 119.386138, 47.397645 ], [ 119.365812, 47.423161 ], [ 119.32208, 47.42721 ], [ 119.365812, 47.47739 ], [ 119.205052, 47.520249 ], [ 119.152081, 47.540453 ], [ 119.134219, 47.664335 ], [ 118.773278, 47.771034 ], [ 118.568171, 47.992187 ], [ 118.441903, 47.995791 ], [ 118.422193, 48.01461 ], [ 118.37415, 48.016612 ], [ 118.351976, 48.006203 ], [ 118.284839, 48.011007 ], [ 118.238027, 48.031422 ], [ 118.238643, 48.041826 ], [ 118.150564, 48.036224 ], [ 118.124694, 48.047427 ], [ 118.107448, 48.031021 ], [ 118.052014, 48.01421 ], [ 117.96147, 48.011007 ], [ 117.886942, 48.025418 ], [ 117.813645, 48.016212 ], [ 117.529081, 47.782697 ], [ 117.519226, 47.761782 ], [ 117.493357, 47.758563 ], [ 117.384335, 47.641356 ], [ 117.094844, 47.8241 ], [ 116.879265, 47.893968 ], [ 116.791186, 47.89758 ], [ 116.669846, 47.890758 ], [ 116.453035, 47.837358 ], [ 116.26579, 47.876711 ], [ 116.130283, 47.823296 ], [ 116.111189, 47.811642 ], [ 115.968291, 47.689721 ], [ 115.939342, 47.683275 ], [ 115.580249, 47.921649 ], [ 115.539597, 48.104607 ], [ 115.545141, 48.134971 ], [ 115.529126, 48.155336 ], [ 115.81061, 48.257042 ], [ 115.822929, 48.259432 ], [ 115.799523, 48.514982 ], [ 115.83032, 48.560156 ], [ 116.069305, 48.811437 ], [ 116.077928, 48.822471 ], [ 116.048363, 48.873274 ], [ 116.428397, 49.430659 ], [ 116.717889, 49.847288 ], [ 116.736367, 49.847674 ], [ 117.068974, 49.695389 ], [ 117.278394, 49.636512 ], [ 117.485349, 49.633024 ], [ 117.638102, 49.574847 ], [ 117.809333, 49.521263 ], [ 117.849369, 49.551557 ], [ 117.866, 49.591532 ], [ 117.950999, 49.596187 ], [ 117.995963, 49.623332 ], [ 118.011362, 49.614803 ], [ 118.082811, 49.616741 ], [ 118.129622, 49.669446 ], [ 118.156723, 49.660149 ], [ 118.211542, 49.690744 ], [ 118.220781, 49.729831 ], [ 118.284223, 49.743755 ], [ 118.315636, 49.766953 ], [ 118.384005, 49.783958 ], [ 118.398787, 49.802502 ], [ 118.385853, 49.827217 ], [ 118.443751, 49.835709 ], [ 118.483787, 49.830691 ], [ 118.485019, 49.866194 ], [ 118.531214, 49.887791 ], [ 118.574946, 49.931342 ], [ 118.605127, 49.926719 ], [ 118.672264, 49.955991 ], [ 118.739402, 49.946364 ], [ 118.761576, 49.959456 ], [ 118.791757, 49.955606 ], [ 118.964836, 49.988708 ], [ 118.982082, 49.979087 ], [ 119.090487, 49.985629 ], [ 119.12498, 50.019095 ], [ 119.163168, 50.027554 ], [ 119.193965, 50.069826 ], [ 119.190269, 50.087877 ], [ 119.236465, 50.075204 ], [ 119.290052, 50.121655 ], [ 119.309762, 50.161161 ], [ 119.350414, 50.166145 ], [ 119.339327, 50.192206 ], [ 119.358421, 50.197953 ], [ 119.319001, 50.220933 ], [ 119.339943, 50.244668 ], [ 119.35103, 50.303953 ], [ 119.381827, 50.324208 ], [ 119.358421, 50.358965 ], [ 119.322696, 50.352474 ], [ 119.277117, 50.366218 ], [ 119.259871, 50.345218 ], [ 119.232153, 50.365455 ], [ 119.188422, 50.347509 ], [ 119.155777, 50.364691 ], [ 119.176719, 50.378814 ], [ 119.125596, 50.389118 ], [ 119.165016, 50.422683 ], [ 119.217371, 50.414675 ], [ 119.22353, 50.441363 ], [ 119.250631, 50.448604 ], [ 119.262334, 50.490124 ], [ 119.264182, 50.536933 ], [ 119.295595, 50.573814 ], [ 119.281428, 50.601551 ], [ 119.298059, 50.616743 ], [ 119.361501, 50.632689 ], [ 119.394145, 50.667219 ], [ 119.385522, 50.682769 ], [ 119.430486, 50.684286 ], [ 119.450196, 50.695281 ], [ 119.506862, 50.763846 ], [ 119.496391, 50.771795 ], [ 119.515485, 50.814165 ], [ 119.498855, 50.827776 ], [ 119.491464, 50.87878 ], [ 119.569688, 50.933879 ], [ 119.598637, 50.984767 ], [ 119.630666, 51.00925 ], [ 119.678093, 51.016404 ], [ 119.726753, 51.051028 ], [ 119.719361, 51.075099 ], [ 119.764325, 51.092017 ], [ 119.752622, 51.117193 ], [ 119.771716, 51.124331 ], [ 119.788346, 51.174636 ], [ 119.760629, 51.212516 ], [ 119.784035, 51.22601 ], [ 119.821607, 51.21439 ], [ 119.797586, 51.243622 ], [ 119.828383, 51.263099 ], [ 119.811136, 51.281071 ], [ 119.885049, 51.302777 ], [ 119.883817, 51.336813 ], [ 119.946643, 51.360736 ], [ 119.914614, 51.374187 ], [ 119.910918, 51.390994 ], [ 119.97128, 51.40033 ], [ 119.982983, 51.445112 ], [ 120.002693, 51.459283 ], [ 119.982367, 51.482396 ], [ 119.985447, 51.505125 ], [ 120.017476, 51.52114 ], [ 120.052584, 51.560967 ], [ 120.035954, 51.583657 ], [ 120.05936, 51.634203 ], [ 120.100628, 51.649058 ], [ 120.087077, 51.678013 ], [ 120.172693, 51.679868 ], [ 120.226279, 51.717703 ], [ 120.294649, 51.752171 ], [ 120.317438, 51.785873 ], [ 120.363634, 51.789945 ], [ 120.40675, 51.81659 ], [ 120.40059, 51.833605 ], [ 120.480046, 51.855049 ], [ 120.481278, 51.885719 ], [ 120.549032, 51.882394 ], [ 120.548416, 51.907877 ], [ 120.656821, 51.926333 ], [ 120.66298, 51.958061 ], [ 120.704864, 51.983501 ], [ 120.717799, 52.015556 ], [ 120.691929, 52.026973 ], [ 120.690698, 52.047221 ], [ 120.717183, 52.072978 ], [ 120.753523, 52.085483 ], [ 120.76769, 52.10938 ], [ 120.760299, 52.136937 ], [ 120.786784, 52.15787 ], [ 120.745516, 52.20594 ], [ 120.755371, 52.258355 ], [ 120.715951, 52.261286 ], [ 120.695625, 52.290214 ], [ 120.653741, 52.302658 ], [ 120.627256, 52.323878 ], [ 120.62356, 52.361172 ], [ 120.653741, 52.371038 ], [ 120.64943, 52.3904 ], [ 120.688234, 52.427637 ], [ 120.68269, 52.464479 ], [ 120.706712, 52.492909 ], [ 120.687002, 52.511489 ], [ 120.734429, 52.536977 ], [ 120.690698, 52.547532 ], [ 120.658669, 52.56718 ], [ 120.62664, 52.570818 ], [ 120.605082, 52.589364 ], [ 120.56135, 52.595544 ], [ 120.483742, 52.630066 ], [ 120.462184, 52.64532 ], [ 120.396895, 52.616261 ], [ 120.289721, 52.623527 ], [ 120.194866, 52.578819 ], [ 120.125265, 52.586819 ], [ 120.07599, 52.586092 ], [ 120.049505, 52.598453 ], [ 120.035338, 52.646409 ], [ 120.071063, 52.70628 ], [ 120.031642, 52.773674 ], [ 120.101244, 52.788877 ], [ 120.14128, 52.813119 ], [ 120.181316, 52.806969 ], [ 120.222584, 52.84277 ], [ 120.297112, 52.869872 ], [ 120.295265, 52.891542 ], [ 120.350699, 52.906343 ], [ 120.363018, 52.94134 ], [ 120.411061, 52.957927 ], [ 120.452945, 53.01017 ], [ 120.529321, 53.045803 ], [ 120.562582, 53.082845 ], [ 120.643886, 53.106923 ], [ 120.659901, 53.137091 ], [ 120.687002, 53.142476 ], [ 120.690698, 53.174771 ], [ 120.736277, 53.204892 ], [ 120.821893, 53.241797 ], [ 120.838523, 53.239648 ], [ 120.820661, 53.269007 ], [ 120.867472, 53.278669 ], [ 120.882871, 53.294411 ], [ 120.936457, 53.28833 ], [ 120.950624, 53.29763 ], [ 121.055334, 53.29155 ], [ 121.098449, 53.306929 ], [ 121.129246, 53.277238 ], [ 121.155732, 53.285468 ], [ 121.227797, 53.280459 ], [ 121.308485, 53.301565 ], [ 121.336818, 53.325877 ], [ 121.416274, 53.319443 ], [ 121.499426, 53.337314 ], [ 121.504969, 53.323018 ], [ 121.575802, 53.29155 ], [ 121.615222, 53.258984 ], [ 121.642324, 53.262564 ], [ 121.679896, 53.240722 ], [ 121.67928, 53.199515 ], [ 121.660186, 53.195213 ], [ 121.665114, 53.170467 ], [ 121.722396, 53.145706 ], [ 121.753193, 53.147501 ], [ 121.784606, 53.104408 ], [ 121.775367, 53.089674 ], [ 121.817867, 53.061631 ], [ 121.785838, 53.018451 ], [ 121.715621, 52.997926 ], [ 121.677432, 52.948192 ], [ 121.66265, 52.912478 ], [ 121.610295, 52.892264 ], [ 121.604136, 52.872401 ], [ 121.620766, 52.853251 ], [ 121.591201, 52.824693 ], [ 121.537614, 52.801542 ], [ 121.511129, 52.779104 ], [ 121.476636, 52.772225 ], [ 121.455078, 52.73528 ], [ 121.373158, 52.683067 ], [ 121.309717, 52.676173 ], [ 121.29247, 52.651855 ], [ 121.237036, 52.619167 ], [ 121.182217, 52.59918 ], [ 121.225333, 52.577364 ], [ 121.280151, 52.586819 ], [ 121.323883, 52.573727 ], [ 121.353448, 52.534793 ], [ 121.411963, 52.52205 ], [ 121.416274, 52.499468 ], [ 121.474172, 52.482706 ], [ 121.495114, 52.484892 ], [ 121.519136, 52.456821 ], [ 121.565331, 52.460468 ], [ 121.590585, 52.443326 ], [ 121.63986, 52.44442 ], [ 121.678664, 52.419973 ], [ 121.658338, 52.3904 ], [ 121.715621, 52.342894 ], [ 121.714389, 52.318025 ], [ 121.769207, 52.308147 ], [ 121.841272, 52.282526 ], [ 121.901018, 52.280695 ], [ 121.94783, 52.298266 ], [ 121.976779, 52.343626 ], [ 122.035909, 52.377615 ], [ 122.040837, 52.413038 ], [ 122.091344, 52.427272 ], [ 122.080873, 52.440407 ], [ 122.107358, 52.452445 ], [ 122.142467, 52.495096 ], [ 122.140003, 52.510032 ], [ 122.168952, 52.513674 ], [ 122.178191, 52.48963 ], [ 122.207756, 52.469218 ], [ 122.310618, 52.475416 ], [ 122.326016, 52.459374 ], [ 122.342031, 52.414133 ], [ 122.367284, 52.413768 ], [ 122.378987, 52.395512 ], [ 122.419023, 52.375057 ], [ 122.447356, 52.394052 ], [ 122.484313, 52.341432 ], [ 122.478153, 52.29607 ], [ 122.560689, 52.282526 ], [ 122.585943, 52.266413 ], [ 122.67895, 52.276667 ], [ 122.710979, 52.256157 ], [ 122.76087, 52.26678 ], [ 122.787355, 52.252494 ], [ 122.766413, 52.232705 ], [ 122.769493, 52.179893 ], [ 122.73808, 52.153464 ], [ 122.690653, 52.140243 ], [ 122.629059, 52.13657 ], [ 122.643841, 52.111585 ], [ 122.625363, 52.067459 ], [ 122.650616, 52.058997 ], [ 122.664783, 51.99861 ], [ 122.683877, 51.974654 ], [ 122.726377, 51.978709 ], [ 122.729457, 51.919321 ], [ 122.706051, 51.890151 ], [ 122.725761, 51.87833 ], [ 122.732536, 51.832495 ], [ 122.771957, 51.779579 ], [ 122.749167, 51.746613 ], [ 122.778732, 51.698048 ], [ 122.816304, 51.655371 ], [ 122.820616, 51.633088 ], [ 122.85634, 51.606707 ], [ 122.832935, 51.581797 ], [ 122.874202, 51.561339 ], [ 122.880362, 51.537894 ], [ 122.858804, 51.524864 ], [ 122.880362, 51.511085 ], [ 122.854492, 51.477551 ], [ 122.871123, 51.455181 ], [ 122.900072, 51.445112 ], [ 122.903768, 51.415262 ], [ 122.946267, 51.405183 ], [ 122.965977, 51.386886 ], [ 122.965977, 51.345786 ], [ 123.002934, 51.31213 ], [ 123.069455, 51.321108 ], [ 123.127969, 51.297913 ], [ 123.231447, 51.279199 ], [ 123.231447, 51.268716 ], [ 123.294273, 51.254111 ], [ 123.339853, 51.27246 ], [ 123.376809, 51.266844 ], [ 123.414381, 51.278825 ], [ 123.440251, 51.270963 ], [ 123.46304, 51.286686 ], [ 123.582533, 51.294545 ], [ 123.582533, 51.306893 ], [ 123.661989, 51.319237 ], [ 123.660141, 51.342795 ], [ 123.711264, 51.398089 ], [ 123.794416, 51.361109 ], [ 123.842459, 51.367462 ], [ 123.887423, 51.320734 ], [ 123.926227, 51.300532 ], [ 123.939777, 51.313253 ], [ 123.994596, 51.322604 ], [ 124.071588, 51.320734 ], [ 124.090067, 51.3413 ], [ 124.128255, 51.347281 ], [ 124.192313, 51.33943 ], [ 124.239124, 51.344664 ], [ 124.271769, 51.308389 ], [ 124.297638, 51.298661 ], [ 124.339522, 51.293422 ], [ 124.406659, 51.272086 ], [ 124.430065, 51.301281 ], [ 124.426985, 51.331953 ], [ 124.443616, 51.35812 ], [ 124.478108, 51.36223 ], [ 124.490427, 51.380537 ], [ 124.555717, 51.375307 ], [ 124.58713, 51.363725 ], [ 124.62655, 51.327465 ], [ 124.693687, 51.3327 ], [ 124.752817, 51.35812 ], [ 124.76452, 51.38726 ], [ 124.783614, 51.392115 ], [ 124.864302, 51.37979 ], [ 124.885244, 51.40817 ], [ 124.942527, 51.447349 ], [ 124.917889, 51.474196 ], [ 124.928976, 51.498419 ], [ 124.983795, 51.508478 ], [ 125.004737, 51.529332 ], [ 125.047236, 51.529704 ], [ 125.073106, 51.553526 ], [ 125.060171, 51.59667 ], [ 125.098975, 51.658341 ], [ 125.12854, 51.659083 ], [ 125.130388, 51.635317 ], [ 125.175968, 51.639403 ], [ 125.214772, 51.627888 ], [ 125.228938, 51.640517 ], [ 125.289301, 51.633831 ], [ 125.316402, 51.610052 ], [ 125.35151, 51.623801 ], [ 125.38046, 51.585516 ], [ 125.424807, 51.562827 ], [ 125.528285, 51.488359 ], [ 125.559082, 51.461521 ], [ 125.595422, 51.416755 ], [ 125.60035, 51.413396 ], [ 125.600966, 51.410409 ], [ 125.62314, 51.398089 ], [ 125.623756, 51.387633 ], [ 125.626219, 51.380163 ], [ 125.700132, 51.327465 ], [ 125.740784, 51.27583 ], [ 125.76111, 51.261976 ], [ 125.761726, 51.226385 ], [ 125.819008, 51.227134 ], [ 125.850421, 51.21364 ], [ 125.864588, 51.146487 ], [ 125.909551, 51.138977 ], [ 125.946508, 51.108176 ], [ 125.970529, 51.123955 ], [ 125.993935, 51.119072 ], [ 125.976073, 51.084498 ], [ 126.059225, 51.043503 ], [ 126.033971, 51.011132 ], [ 126.041978, 50.981753 ], [ 126.068464, 50.967434 ], [ 126.042594, 50.92558 ], [ 126.02042, 50.927466 ], [ 125.996399, 50.906715 ], [ 125.997631, 50.872738 ], [ 125.961906, 50.901054 ], [ 125.939732, 50.85423 ], [ 125.913247, 50.825885 ], [ 125.878138, 50.816812 ], [ 125.890457, 50.805845 ], [ 125.836255, 50.793363 ], [ 125.846726, 50.769524 ], [ 125.828863, 50.756654 ], [ 125.804226, 50.773309 ], [ 125.758646, 50.746809 ], [ 125.795603, 50.738856 ], [ 125.78082, 50.725598 ], [ 125.825784, 50.70362 ], [ 125.789443, 50.679735 ], [ 125.804226, 50.658874 ], [ 125.793139, 50.643316 ], [ 125.814697, 50.62092 ], [ 125.807921, 50.60383 ], [ 125.829479, 50.56165 ], [ 125.794987, 50.532748 ], [ 125.770349, 50.531227 ], [ 125.754335, 50.506874 ], [ 125.740784, 50.523237 ], [ 125.699516, 50.487078 ], [ 125.654553, 50.471082 ], [ 125.627451, 50.443268 ], [ 125.580024, 50.449366 ], [ 125.562162, 50.438314 ], [ 125.583104, 50.409717 ], [ 125.567089, 50.402852 ], [ 125.536292, 50.420014 ], [ 125.522126, 50.404759 ], [ 125.546763, 50.358965 ], [ 125.520278, 50.3498 ], [ 125.530749, 50.331085 ], [ 125.463611, 50.295925 ], [ 125.466075, 50.266861 ], [ 125.442053, 50.260357 ], [ 125.448829, 50.216338 ], [ 125.417416, 50.195654 ], [ 125.39093, 50.199868 ], [ 125.382923, 50.172278 ], [ 125.335496, 50.161161 ], [ 125.376148, 50.137385 ], [ 125.311474, 50.140453 ], [ 125.27883, 50.127411 ], [ 125.258504, 50.103618 ], [ 125.287453, 50.093636 ], [ 125.283757, 50.070211 ], [ 125.328105, 50.065985 ], [ 125.315786, 50.04562 ], [ 125.289916, 50.057917 ], [ 125.25296, 50.041393 ], [ 125.283757, 50.036012 ], [ 125.297924, 50.014481 ], [ 125.278214, 49.996402 ], [ 125.241873, 49.987938 ], [ 125.231402, 49.957531 ], [ 125.190134, 49.959841 ], [ 125.199373, 49.935194 ], [ 125.225859, 49.922481 ], [ 125.212924, 49.907452 ], [ 125.245569, 49.87198 ], [ 125.225243, 49.867351 ], [ 125.239409, 49.844587 ], [ 125.177815, 49.829533 ], [ 125.222779, 49.799026 ], [ 125.221547, 49.754969 ], [ 125.204301, 49.734086 ], [ 125.225243, 49.726349 ], [ 125.219699, 49.669058 ], [ 125.185207, 49.634574 ], [ 125.189518, 49.652401 ], [ 125.164881, 49.669446 ], [ 125.132236, 49.672157 ], [ 125.127308, 49.655113 ], [ 125.15441, 49.616741 ], [ 125.16796, 49.629923 ], [ 125.205533, 49.593859 ], [ 125.23017, 49.595411 ], [ 125.233866, 49.536801 ], [ 125.211076, 49.539908 ], [ 125.228323, 49.487063 ], [ 125.270822, 49.454395 ], [ 125.256656, 49.437275 ], [ 125.25604, 49.395227 ], [ 125.277598, 49.379644 ], [ 125.256656, 49.359769 ], [ 125.261583, 49.322336 ], [ 125.214772, 49.277066 ], [ 125.233866, 49.255587 ], [ 125.219699, 49.189139 ], [ 125.187671, 49.186792 ], [ 125.158721, 49.144921 ], [ 125.117453, 49.126127 ], [ 125.034302, 49.157056 ], [ 125.039845, 49.17623 ], [ 124.983179, 49.162535 ], [ 124.906802, 49.184054 ], [ 124.860607, 49.166448 ], [ 124.847672, 49.129651 ], [ 124.809484, 49.115943 ], [ 124.828578, 49.077933 ], [ 124.808252, 49.020666 ], [ 124.756513, 48.967262 ], [ 124.744194, 48.920487 ], [ 124.709086, 48.920487 ], [ 124.715861, 48.885475 ], [ 124.697383, 48.841775 ], [ 124.654267, 48.83429 ], [ 124.644412, 48.80789 ], [ 124.656115, 48.783842 ], [ 124.612383, 48.747945 ], [ 124.624702, 48.701755 ], [ 124.601912, 48.632587 ], [ 124.579122, 48.596582 ], [ 124.520608, 48.556195 ], [ 124.548941, 48.535593 ], [ 124.533543, 48.515379 ], [ 124.555717, 48.467784 ], [ 124.507674, 48.445558 ], [ 124.52492, 48.426897 ], [ 124.51876, 48.378027 ], [ 124.547094, 48.35775 ], [ 124.540934, 48.335476 ], [ 124.579738, 48.297269 ], [ 124.558796, 48.268197 ], [ 124.579122, 48.262221 ], [ 124.547094, 48.200829 ], [ 124.512601, 48.164518 ], [ 124.529847, 48.146951 ], [ 124.505826, 48.124985 ], [ 124.478108, 48.123387 ], [ 124.46579, 48.098213 ], [ 124.415899, 48.08782 ], [ 124.430065, 48.12099 ], [ 124.471333, 48.133373 ], [ 124.467637, 48.178886 ], [ 124.418978, 48.181679 ], [ 124.412819, 48.219175 ], [ 124.422058, 48.245884 ], [ 124.365392, 48.283731 ], [ 124.353689, 48.315978 ], [ 124.317964, 48.35099 ], [ 124.331515, 48.380015 ], [ 124.309957, 48.413393 ], [ 124.330283, 48.435633 ], [ 124.302566, 48.456673 ], [ 124.314269, 48.503881 ], [ 124.25945, 48.536385 ], [ 124.136878, 48.463023 ], [ 124.07898, 48.43603 ], [ 124.019234, 48.39313 ], [ 123.862785, 48.271782 ], [ 123.746373, 48.197638 ], [ 123.705105, 48.152142 ], [ 123.579453, 48.045427 ], [ 123.537569, 48.021816 ], [ 123.300432, 47.953723 ], [ 123.256085, 47.876711 ], [ 123.214201, 47.824502 ], [ 123.161846, 47.781892 ], [ 123.041122, 47.746492 ], [ 122.926557, 47.697777 ], [ 122.848949, 47.67441 ], [ 122.765181, 47.614333 ], [ 122.59395, 47.54732 ], [ 122.543443, 47.495589 ], [ 122.507103, 47.401291 ], [ 122.418407, 47.350632 ], [ 122.441197, 47.310476 ], [ 122.462755, 47.27841 ], [ 122.498479, 47.255262 ], [ 122.531124, 47.198771 ], [ 122.582863, 47.158092 ], [ 122.615508, 47.124306 ], [ 122.679566, 47.094164 ], [ 122.710363, 47.093349 ], [ 122.821232, 47.065636 ], [ 122.852645, 47.072158 ], [ 122.845869, 47.046881 ], [ 122.778116, 47.002822 ], [ 122.77442, 46.973837 ], [ 122.798442, 46.9575 ], [ 122.791051, 46.941567 ], [ 122.83971, 46.937072 ], [ 122.895144, 46.960359 ], [ 122.893913, 46.895376 ], [ 122.906847, 46.80738 ], [ 122.996774, 46.761483 ], [ 123.00355, 46.730726 ], [ 123.026339, 46.718829 ], [ 123.076846, 46.745082 ], [ 123.103332, 46.734828 ], [ 123.163694, 46.74016 ], [ 123.198802, 46.803283 ], [ 123.22344, 46.821305 ], [ 123.221592, 46.850373 ], [ 123.295505, 46.865105 ], [ 123.341084, 46.826628 ], [ 123.374345, 46.837683 ], [ 123.40699, 46.906416 ], [ 123.404526, 46.935438 ], [ 123.360179, 46.970978 ], [ 123.304128, 46.964852 ], [ 123.301664, 46.999965 ], [ 123.337389, 46.988943 ], [ 123.42362, 46.934212 ], [ 123.487678, 46.959951 ], [ 123.52833, 46.944836 ], [ 123.483366, 46.84587 ], [ 123.506772, 46.827038 ], [ 123.562823, 46.82581 ], [ 123.575757, 46.845461 ], [ 123.576989, 46.891286 ], [ 123.605322, 46.891286 ], [ 123.599163, 46.868378 ], [ 123.625648, 46.847508 ], [ 123.580069, 46.827447 ], [ 123.629344, 46.813524 ], [ 123.631808, 46.728675 ], [ 123.603475, 46.68928 ], [ 123.474743, 46.686817 ], [ 123.366338, 46.677784 ], [ 123.318295, 46.662179 ], [ 123.276411, 46.660947 ], [ 123.279491, 46.616981 ], [ 123.228368, 46.588198 ], [ 123.18094, 46.614103 ], [ 123.098404, 46.603002 ], [ 123.077462, 46.622324 ], [ 123.04605, 46.617803 ], [ 123.052825, 46.579972 ], [ 123.002318, 46.574624 ], [ 123.010325, 46.524823 ], [ 123.011557, 46.434984 ], [ 123.089781, 46.347888 ], [ 123.142136, 46.298293 ], [ 123.178476, 46.248239 ], [ 123.128585, 46.210565 ], [ 123.127354, 46.174523 ], [ 123.102716, 46.172037 ], [ 123.112571, 46.130163 ], [ 123.070071, 46.123527 ], [ 123.04605, 46.099878 ], [ 122.792898, 46.073313 ], [ 122.828623, 45.912406 ], [ 122.80029, 45.856583 ], [ 122.772572, 45.856583 ], [ 122.752246, 45.834905 ], [ 122.792283, 45.766063 ], [ 122.751015, 45.735996 ], [ 122.741775, 45.705077 ], [ 122.671558, 45.70048 ], [ 122.650001, 45.731401 ], [ 122.640761, 45.771072 ], [ 122.603189, 45.778169 ], [ 122.556378, 45.82156 ], [ 122.522501, 45.786933 ], [ 122.504639, 45.786933 ], [ 122.496016, 45.85825 ], [ 122.446125, 45.916986 ], [ 122.362357, 45.917403 ], [ 122.372828, 45.856166 ], [ 122.337719, 45.859917 ], [ 122.301379, 45.813218 ], [ 122.253952, 45.7982 ], [ 122.236705, 45.831569 ], [ 122.200981, 45.857 ], [ 122.091344, 45.882002 ], [ 122.085184, 45.912406 ], [ 122.040221, 45.959022 ], [ 121.92812, 45.988552 ], [ 121.923808, 46.004767 ], [ 121.864062, 46.002272 ], [ 121.843736, 46.024301 ], [ 121.819098, 46.023054 ], [ 121.761816, 45.998947 ], [ 121.809243, 45.961102 ], [ 121.821562, 45.918235 ], [ 121.805548, 45.900746 ], [ 121.817251, 45.875336 ], [ 121.769823, 45.84366 ], [ 121.766744, 45.830318 ], [ 121.754425, 45.794862 ], [ 121.697142, 45.76314 ], [ 121.657106, 45.770238 ], [ 121.644172, 45.752284 ], [ 121.666345, 45.727641 ], [ 121.713773, 45.701734 ], [ 121.811091, 45.687103 ], [ 121.812323, 45.704659 ], [ 121.867142, 45.719703 ], [ 121.934279, 45.71051 ], [ 121.970004, 45.692956 ], [ 122.003264, 45.623102 ], [ 121.995873, 45.59882 ], [ 121.966308, 45.596308 ], [ 121.993409, 45.552741 ], [ 122.002648, 45.507882 ], [ 122.064242, 45.472641 ], [ 122.168336, 45.439897 ], [ 122.180039, 45.409655 ], [ 122.146778, 45.374352 ], [ 122.147394, 45.295682 ], [ 122.239169, 45.276313 ], [ 122.22993, 45.206784 ], [ 122.192358, 45.180636 ], [ 122.143082, 45.183167 ], [ 122.109822, 45.142236 ], [ 122.119677, 45.068739 ], [ 122.098735, 45.02138 ], [ 122.074713, 45.006573 ], [ 122.087032, 44.95281 ], [ 122.079025, 44.914256 ], [ 122.04946, 44.912985 ], [ 122.098119, 44.81882 ], [ 122.099967, 44.7823 ], [ 122.168952, 44.770405 ], [ 122.142467, 44.753833 ], [ 122.110438, 44.767856 ], [ 122.10243, 44.736406 ], [ 122.152322, 44.744057 ], [ 122.161561, 44.728328 ], [ 122.117213, 44.701961 ], [ 122.103046, 44.67388 ], [ 122.113517, 44.615546 ], [ 122.13138, 44.577619 ], [ 122.196053, 44.559712 ], [ 122.224386, 44.526016 ], [ 122.228082, 44.480345 ], [ 122.28598, 44.477783 ], [ 122.294604, 44.41113 ], [ 122.291524, 44.310152 ], [ 122.271198, 44.255741 ], [ 122.319241, 44.233018 ], [ 122.483081, 44.236877 ], [ 122.515726, 44.251025 ], [ 122.641993, 44.283595 ], [ 122.675254, 44.285738 ], [ 122.702971, 44.319145 ], [ 122.76087, 44.369648 ], [ 122.85634, 44.398304 ], [ 123.025108, 44.493153 ], [ 123.06576, 44.505959 ], [ 123.12489, 44.5098 ], [ 123.137209, 44.486322 ], [ 123.125506, 44.455147 ], [ 123.142136, 44.428228 ], [ 123.114419, 44.40258 ], [ 123.128585, 44.367081 ], [ 123.196955, 44.34483 ], [ 123.277027, 44.25274 ], [ 123.286882, 44.211574 ], [ 123.323838, 44.179823 ], [ 123.386664, 44.161794 ], [ 123.362642, 44.133452 ], [ 123.350939, 44.092633 ], [ 123.32815, 44.084035 ], [ 123.331229, 44.028984 ], [ 123.365722, 44.013922 ], [ 123.400831, 43.979481 ], [ 123.37065, 43.970006 ], [ 123.397135, 43.954929 ], [ 123.467968, 43.853599 ], [ 123.461809, 43.822518 ], [ 123.498149, 43.771114 ], [ 123.48275, 43.737396 ], [ 123.520323, 43.708419 ], [ 123.518475, 43.682024 ], [ 123.536953, 43.633964 ], [ 123.510468, 43.624867 ], [ 123.5117, 43.592801 ], [ 123.421157, 43.598435 ], [ 123.434091, 43.575461 ], [ 123.461193, 43.568523 ], [ 123.452569, 43.545971 ], [ 123.360179, 43.567223 ], [ 123.304744, 43.550742 ], [ 123.329998, 43.519071 ], [ 123.315831, 43.492159 ], [ 123.36449, 43.483475 ], [ 123.382968, 43.469143 ], [ 123.419925, 43.410046 ], [ 123.442098, 43.437863 ], [ 123.486446, 43.44525 ], [ 123.519707, 43.402219 ], [ 123.54496, 43.415262 ], [ 123.608402, 43.366119 ], [ 123.703873, 43.37047 ], [ 123.698329, 43.272071 ], [ 123.664453, 43.264663 ], [ 123.676771, 43.223684 ], [ 123.645974, 43.208855 ], [ 123.666916, 43.179623 ], [ 123.636119, 43.141644 ], [ 123.631192, 43.088346 ], [ 123.580685, 43.036314 ], [ 123.572678, 43.003498 ], [ 123.536337, 43.007 ], [ 123.474743, 43.042438 ], [ 123.434707, 43.027565 ], [ 123.323222, 43.000872 ], [ 123.259165, 42.993431 ], [ 123.18402, 42.925983 ], [ 123.188947, 42.895739 ], [ 123.169853, 42.859777 ], [ 123.227752, 42.831695 ], [ 123.118114, 42.801405 ], [ 123.058368, 42.768903 ], [ 122.980144, 42.777689 ], [ 122.945651, 42.753524 ], [ 122.925941, 42.772417 ], [ 122.887137, 42.770221 ], [ 122.883442, 42.751766 ], [ 122.848949, 42.712203 ], [ 122.786123, 42.757479 ], [ 122.73808, 42.77066 ], [ 122.733152, 42.786034 ], [ 122.653696, 42.78252 ], [ 122.624747, 42.773296 ], [ 122.580399, 42.789987 ], [ 122.576088, 42.819405 ], [ 122.556378, 42.827745 ], [ 122.436886, 42.843105 ], [ 122.35127, 42.830378 ], [ 122.371596, 42.776371 ], [ 122.439349, 42.770221 ], [ 122.460907, 42.755282 ], [ 122.396234, 42.707366 ], [ 122.396234, 42.684054 ], [ 122.338951, 42.669975 ], [ 122.324785, 42.684934 ], [ 122.261343, 42.695931 ], [ 122.204676, 42.732867 ], [ 122.204676, 42.685374 ], [ 122.160945, 42.684934 ], [ 122.072865, 42.710444 ], [ 122.062394, 42.723635 ], [ 122.018663, 42.69901 ], [ 121.939207, 42.688453 ], [ 121.94167, 42.666014 ], [ 121.915801, 42.656332 ], [ 121.921344, 42.605697 ], [ 121.889931, 42.556784 ], [ 121.844352, 42.522389 ], [ 121.831417, 42.533856 ], [ 121.817867, 42.504303 ], [ 121.803084, 42.514891 ], [ 121.747649, 42.484887 ], [ 121.69899, 42.438529 ], [ 121.66573, 42.437204 ], [ 121.604136, 42.495037 ], [ 121.607831, 42.516214 ], [ 121.570875, 42.487093 ], [ 121.506201, 42.482239 ], [ 121.4791, 42.49636 ], [ 121.434752, 42.475176 ], [ 121.386093, 42.474294 ], [ 121.304789, 42.435879 ], [ 121.314644, 42.42837 ], [ 121.285079, 42.387717 ], [ 121.218558, 42.371802 ], [ 121.184681, 42.333324 ], [ 121.133558, 42.300135 ], [ 121.120623, 42.280656 ], [ 121.087978, 42.278885 ], [ 121.070732, 42.254083 ], [ 121.028848, 42.242565 ], [ 120.992508, 42.264714 ], [ 120.933994, 42.27977 ], [ 120.883487, 42.269585 ], [ 120.883487, 42.242565 ], [ 120.8299, 42.252755 ], [ 120.820661, 42.227943 ], [ 120.79048, 42.218636 ], [ 120.745516, 42.223512 ], [ 120.72211, 42.203565 ], [ 120.624792, 42.154338 ], [ 120.58414, 42.167203 ], [ 120.56751, 42.152119 ], [ 120.466496, 42.105516 ], [ 120.493597, 42.073539 ], [ 120.450481, 42.057101 ], [ 120.456641, 42.016208 ], [ 120.399358, 41.984631 ], [ 120.373489, 41.994862 ], [ 120.309431, 41.951704 ], [ 120.318054, 41.93746 ], [ 120.271859, 41.925439 ], [ 120.260156, 41.904062 ], [ 120.290337, 41.897381 ], [ 120.286641, 41.880005 ], [ 120.251533, 41.884016 ], [ 120.215808, 41.853265 ], [ 120.188707, 41.848361 ], [ 120.183164, 41.826513 ], [ 120.127113, 41.77253 ], [ 120.1382, 41.729221 ], [ 120.096316, 41.697056 ], [ 120.035954, 41.708226 ], [ 120.024867, 41.737707 ], [ 120.050737, 41.776101 ], [ 120.041498, 41.818932 ], [ 120.023019, 41.816701 ], [ 119.989759, 41.899163 ], [ 119.954034, 41.923212 ], [ 119.950954, 41.974399 ], [ 119.924469, 41.98908 ], [ 119.921389, 42.014429 ], [ 119.897368, 42.030879 ], [ 119.87581, 42.077982 ], [ 119.845629, 42.097079 ], [ 119.837622, 42.135257 ], [ 119.854868, 42.170308 ], [ 119.841933, 42.215534 ], [ 119.744615, 42.211545 ], [ 119.679941, 42.240793 ], [ 119.617115, 42.252755 ], [ 119.609108, 42.276671 ], [ 119.557985, 42.289068 ], [ 119.539507, 42.297922 ], [ 119.571536, 42.335536 ], [ 119.572152, 42.359421 ], [ 119.540123, 42.363401 ], [ 119.502551, 42.388159 ], [ 119.482841, 42.347037 ], [ 119.432949, 42.317396 ], [ 119.34795, 42.300578 ], [ 119.280197, 42.260728 ], [ 119.274037, 42.239021 ], [ 119.237697, 42.200905 ], [ 119.277733, 42.185387 ], [ 119.286972, 42.154781 ], [ 119.30853, 42.147239 ], [ 119.314689, 42.119723 ], [ 119.352261, 42.118391 ], [ 119.384906, 42.08953 ], [ 119.375667, 42.023322 ], [ 119.324544, 41.969505 ], [ 119.323928, 41.937014 ], [ 119.340559, 41.926774 ], [ 119.323312, 41.889807 ], [ 119.334399, 41.871539 ], [ 119.312841, 41.80555 ], [ 119.292515, 41.790827 ], [ 119.317769, 41.764049 ], [ 119.319001, 41.727435 ], [ 119.299907, 41.705545 ], [ 119.307914, 41.657273 ], [ 119.342406, 41.617914 ], [ 119.415703, 41.590169 ], [ 119.420015, 41.567785 ], [ 119.362116, 41.566442 ], [ 119.361501, 41.545841 ], [ 119.406464, 41.503276 ], [ 119.401537, 41.472343 ], [ 119.378131, 41.459787 ], [ 119.376283, 41.422102 ], [ 119.309762, 41.405944 ], [ 119.330704, 41.385293 ], [ 119.296211, 41.325097 ], [ 119.239545, 41.31431 ], [ 119.211827, 41.308016 ], [ 119.197661, 41.282837 ], [ 119.168712, 41.294978 ], [ 119.092951, 41.293629 ], [ 118.980234, 41.305769 ], [ 118.949437, 41.317906 ], [ 118.890923, 41.300823 ], [ 118.844727, 41.342622 ], [ 118.843496, 41.374516 ], [ 118.770199, 41.352956 ], [ 118.741866, 41.324198 ], [ 118.677192, 41.35026 ], [ 118.629765, 41.346666 ], [ 118.528135, 41.355202 ], [ 118.412338, 41.331838 ], [ 118.380309, 41.312062 ], [ 118.348896, 41.342622 ], [ 118.361215, 41.384844 ], [ 118.348896, 41.428384 ], [ 118.327338, 41.450816 ], [ 118.271904, 41.471446 ], [ 118.315636, 41.512688 ], [ 118.302701, 41.55256 ], [ 118.215237, 41.59554 ], [ 118.206614, 41.650566 ], [ 118.159187, 41.67605 ], [ 118.155491, 41.712694 ], [ 118.132702, 41.733241 ], [ 118.140093, 41.784134 ], [ 118.178281, 41.814917 ], [ 118.236179, 41.80778 ], [ 118.247266, 41.773869 ], [ 118.29223, 41.772976 ], [ 118.335346, 41.845241 ], [ 118.340273, 41.87243 ], [ 118.268824, 41.930336 ], [ 118.306396, 41.940131 ], [ 118.313788, 41.98819 ], [ 118.291614, 42.007759 ], [ 118.239875, 42.024655 ], [ 118.286686, 42.033991 ], [ 118.296541, 42.057545 ], [ 118.27252, 42.083312 ], [ 118.239259, 42.092639 ], [ 118.212774, 42.081091 ], [ 118.220165, 42.058434 ], [ 118.194296, 42.031324 ], [ 118.116687, 42.037102 ], [ 118.155491, 42.081091 ], [ 118.097593, 42.105072 ], [ 118.089586, 42.12283 ], [ 118.106216, 42.172082 ], [ 118.033535, 42.199132 ], [ 117.977485, 42.229716 ], [ 117.974405, 42.25054 ], [ 118.047702, 42.280656 ], [ 118.060021, 42.298364 ], [ 118.008898, 42.346595 ], [ 118.024296, 42.385064 ], [ 117.997811, 42.416884 ], [ 117.874007, 42.510038 ], [ 117.856761, 42.539148 ], [ 117.797631, 42.585431 ], [ 117.801326, 42.612744 ], [ 117.779768, 42.61847 ], [ 117.708935, 42.588515 ], [ 117.667051, 42.582347 ], [ 117.60053, 42.603054 ], [ 117.537088, 42.603054 ], [ 117.530313, 42.590278 ], [ 117.475494, 42.602613 ], [ 117.435458, 42.585431 ], [ 117.434226, 42.557224 ], [ 117.387415, 42.517537 ], [ 117.410205, 42.519743 ], [ 117.413284, 42.471645 ], [ 117.390495, 42.461933 ], [ 117.332596, 42.46105 ], [ 117.275314, 42.481797 ], [ 117.188467, 42.468114 ], [ 117.135496, 42.468996 ], [ 117.09546, 42.484004 ], [ 117.080061, 42.463699 ], [ 117.01662, 42.456193 ], [ 117.009228, 42.44957 ], [ 117.005533, 42.43367 ], [ 116.99075, 42.425719 ], [ 116.974736, 42.426603 ], [ 116.97104, 42.427486 ], [ 116.944555, 42.415116 ], [ 116.936547, 42.410256 ], [ 116.921765, 42.403628 ], [ 116.910062, 42.395231 ], [ 116.910678, 42.394789 ], [ 116.886656, 42.366496 ], [ 116.897743, 42.297479 ], [ 116.918685, 42.229716 ], [ 116.903287, 42.190708 ], [ 116.789338, 42.200462 ], [ 116.825062, 42.155669 ], [ 116.850316, 42.156556 ], [ 116.890352, 42.092639 ], [ 116.879881, 42.018431 ], [ 116.796113, 41.977958 ], [ 116.748686, 41.984186 ], [ 116.727744, 41.951259 ], [ 116.66923, 41.947698 ], [ 116.639049, 41.929891 ], [ 116.597165, 41.935679 ], [ 116.553433, 41.928555 ], [ 116.510933, 41.974399 ], [ 116.4826, 41.975734 ], [ 116.453651, 41.945917 ], [ 116.393289, 41.942802 ], [ 116.414231, 41.982407 ], [ 116.373579, 42.009983 ], [ 116.310137, 41.997086 ], [ 116.298434, 41.96817 ], [ 116.223906, 41.932562 ], [ 116.212819, 41.885352 ], [ 116.194341, 41.861734 ], [ 116.122892, 41.861734 ], [ 116.106877, 41.831419 ], [ 116.129051, 41.805996 ], [ 116.09887, 41.776547 ], [ 116.034196, 41.782795 ], [ 116.007095, 41.79752 ], [ 116.007095, 41.797966 ], [ 116.007095, 41.79752 ], [ 116.007095, 41.797966 ], [ 115.994776, 41.828743 ], [ 115.954124, 41.874213 ], [ 115.916552, 41.945027 ], [ 115.85311, 41.927665 ], [ 115.834632, 41.93835 ], [ 115.811226, 41.912525 ], [ 115.726227, 41.870202 ], [ 115.688038, 41.867528 ], [ 115.654162, 41.829189 ], [ 115.57409, 41.80555 ], [ 115.519887, 41.76762 ], [ 115.488474, 41.760924 ], [ 115.42996, 41.728775 ], [ 115.346808, 41.712247 ], [ 115.319091, 41.691693 ], [ 115.360975, 41.661297 ], [ 115.345576, 41.635807 ], [ 115.377605, 41.603148 ], [ 115.310468, 41.592854 ], [ 115.290142, 41.622835 ], [ 115.26612, 41.616124 ], [ 115.256881, 41.580768 ], [ 115.20391, 41.571367 ], [ 115.195287, 41.602253 ], [ 115.0992, 41.62373 ], [ 115.056085, 41.602253 ], [ 115.016049, 41.615229 ], [ 114.860832, 41.60091 ], [ 114.895325, 41.636255 ], [ 114.902716, 41.695715 ], [ 114.89594, 41.76762 ], [ 114.868839, 41.813579 ], [ 114.922426, 41.825175 ], [ 114.939056, 41.846132 ], [ 114.923658, 41.871093 ], [ 114.915035, 41.960605 ], [ 114.9021, 42.015763 ], [ 114.860832, 42.054879 ], [ 114.86268, 42.097967 ], [ 114.825723, 42.139695 ], [ 114.79431, 42.149457 ], [ 114.789383, 42.130819 ], [ 114.75489, 42.115727 ], [ 114.675434, 42.12061 ], [ 114.647717, 42.109512 ], [ 114.560254, 42.132595 ], [ 114.510978, 42.110844 ], [ 114.502355, 42.06732 ], [ 114.480181, 42.064654 ], [ 114.467863, 42.025989 ], [ 114.511594, 41.981962 ], [ 114.478334, 41.951704 ], [ 114.419203, 41.942356 ], [ 114.352066, 41.953484 ], [ 114.343443, 41.926774 ], [ 114.282465, 41.863517 ], [ 114.200545, 41.789934 ], [ 114.215328, 41.75646 ], [ 114.206704, 41.7386 ], [ 114.237501, 41.698843 ], [ 114.215328, 41.68499 ], [ 114.259059, 41.623282 ], [ 114.226414, 41.616572 ], [ 114.221487, 41.582111 ], [ 114.230726, 41.513584 ], [ 114.101379, 41.537779 ], [ 114.032394, 41.529715 ], [ 113.976959, 41.505966 ], [ 113.953553, 41.483553 ], [ 113.933227, 41.487139 ], [ 113.919677, 41.454404 ], [ 113.877793, 41.431076 ], [ 113.871017, 41.413126 ], [ 113.94493, 41.392477 ], [ 113.92522, 41.325546 ], [ 113.899351, 41.316108 ], [ 113.914749, 41.294529 ], [ 113.95109, 41.282837 ], [ 113.971416, 41.239649 ], [ 113.992357, 41.269794 ], [ 114.016379, 41.231999 ], [ 113.996669, 41.19238 ], [ 113.960945, 41.171211 ], [ 113.920293, 41.172112 ], [ 113.877793, 41.115777 ], [ 113.819279, 41.09774 ], [ 113.868554, 41.06887 ], [ 113.973263, 40.983087 ], [ 113.994821, 40.938798 ], [ 114.057647, 40.925234 ], [ 114.041633, 40.917546 ], [ 114.055183, 40.867782 ], [ 114.073661, 40.857372 ], [ 114.044712, 40.830661 ], [ 114.080437, 40.790348 ], [ 114.104458, 40.797597 ], [ 114.103227, 40.770861 ], [ 114.134639, 40.737314 ], [ 114.084748, 40.729605 ], [ 114.063806, 40.706925 ], [ 114.07243, 40.679246 ], [ 114.041633, 40.608861 ], [ 114.076741, 40.575686 ], [ 114.080437, 40.547952 ], [ 114.061959, 40.52885 ], [ 114.011452, 40.515657 ], [ 113.948626, 40.514747 ], [ 113.890112, 40.466503 ], [ 113.850691, 40.460583 ], [ 113.794641, 40.517932 ], [ 113.763228, 40.473787 ], [ 113.688699, 40.448288 ], [ 113.559968, 40.348476 ], [ 113.500222, 40.334335 ], [ 113.387505, 40.319279 ], [ 113.316672, 40.319736 ], [ 113.27602, 40.388601 ], [ 113.251382, 40.413211 ], [ 113.083231, 40.374925 ], [ 113.03334, 40.368997 ], [ 112.898449, 40.329317 ], [ 112.848558, 40.206937 ], [ 112.744464, 40.167161 ], [ 112.712436, 40.178593 ], [ 112.6299, 40.235725 ], [ 112.511639, 40.269068 ], [ 112.456205, 40.300112 ], [ 112.418017, 40.295091 ], [ 112.349031, 40.257194 ], [ 112.310227, 40.256281 ], [ 112.299756, 40.21105 ], [ 112.232619, 40.169905 ], [ 112.232003, 40.133311 ], [ 112.183344, 40.083877 ], [ 112.182112, 40.061437 ], [ 112.142076, 40.027076 ], [ 112.133453, 40.001866 ], [ 112.07617, 39.919298 ], [ 112.042294, 39.886243 ], [ 112.012729, 39.827438 ], [ 111.970229, 39.796638 ], [ 111.959758, 39.692642 ], [ 111.925265, 39.66731 ], [ 111.9382, 39.623071 ], [ 111.87907, 39.606013 ], [ 111.842729, 39.620305 ], [ 111.783599, 39.58895 ], [ 111.722621, 39.606013 ], [ 111.707839, 39.621227 ], [ 111.646245, 39.644272 ], [ 111.61668, 39.633211 ], [ 111.525521, 39.662242 ], [ 111.497187, 39.661781 ], [ 111.445448, 39.640124 ], [ 111.460847, 39.606935 ], [ 111.441137, 39.59679 ], [ 111.422043, 39.539123 ], [ 111.431282, 39.508656 ], [ 111.385086, 39.489722 ], [ 111.358601, 39.432428 ], [ 111.287152, 39.417173 ], [ 111.171971, 39.423183 ], [ 111.143022, 39.407926 ], [ 111.125776, 39.366297 ] ] ] } },\n{ \"type\": \"Feature\", \"properties\": { \"adcode\": \"210000\", \"name\": \"辽宁省\", \"center\": [ 123.429096, 41.796767 ], \"centroid\": [ 122.605251, 41.299975 ], \"childrenNum\": 14, \"level\": \"province\", \"parent\": { \"adcode\": 100000 }, \"subFeatureIndex\": 5, \"acroutes\": [ 100000 ] }, \"geometry\": { \"type\": \"MultiPolygon\", \"coordinates\": [ [ [ [ 119.557985, 42.289068 ], [ 119.557985, 42.289068 ], [ 119.609108, 42.276671 ], [ 119.617115, 42.252755 ], [ 119.679941, 42.240793 ], [ 119.744615, 42.211545 ], [ 119.841933, 42.215534 ], [ 119.854868, 42.170308 ], [ 119.837622, 42.135257 ], [ 119.845629, 42.097079 ], [ 119.87581, 42.077982 ], [ 119.897368, 42.030879 ], [ 119.921389, 42.014429 ], [ 119.924469, 41.98908 ], [ 119.950954, 41.974399 ], [ 119.954034, 41.923212 ], [ 119.989759, 41.899163 ], [ 120.023019, 41.816701 ], [ 120.041498, 41.818932 ], [ 120.050737, 41.776101 ], [ 120.024867, 41.737707 ], [ 120.035954, 41.708226 ], [ 120.096316, 41.697056 ], [ 120.1382, 41.729221 ], [ 120.127113, 41.77253 ], [ 120.183164, 41.826513 ], [ 120.188707, 41.848361 ], [ 120.215808, 41.853265 ], [ 120.251533, 41.884016 ], [ 120.286641, 41.880005 ], [ 120.290337, 41.897381 ], [ 120.260156, 41.904062 ], [ 120.271859, 41.925439 ], [ 120.318054, 41.93746 ], [ 120.309431, 41.951704 ], [ 120.373489, 41.994862 ], [ 120.399358, 41.984631 ], [ 120.456641, 42.016208 ], [ 120.450481, 42.057101 ], [ 120.493597, 42.073539 ], [ 120.466496, 42.105516 ], [ 120.56751, 42.152119 ], [ 120.58414, 42.167203 ], [ 120.624792, 42.154338 ], [ 120.72211, 42.203565 ], [ 120.745516, 42.223512 ], [ 120.79048, 42.218636 ], [ 120.820661, 42.227943 ], [ 120.8299, 42.252755 ], [ 120.883487, 42.242565 ], [ 120.883487, 42.269585 ], [ 120.883487, 42.269585 ], [ 120.933994, 42.27977 ], [ 120.992508, 42.264714 ], [ 121.028848, 42.242565 ], [ 121.070732, 42.254083 ], [ 121.087978, 42.278885 ], [ 121.120623, 42.280656 ], [ 121.133558, 42.300135 ], [ 121.184681, 42.333324 ], [ 121.218558, 42.371802 ], [ 121.285079, 42.387717 ], [ 121.314644, 42.42837 ], [ 121.304789, 42.435879 ], [ 121.386093, 42.474294 ], [ 121.434752, 42.475176 ], [ 121.4791, 42.49636 ], [ 121.506201, 42.482239 ], [ 121.570875, 42.487093 ], [ 121.607831, 42.516214 ], [ 121.604136, 42.495037 ], [ 121.66573, 42.437204 ], [ 121.69899, 42.438529 ], [ 121.747649, 42.484887 ], [ 121.803084, 42.514891 ], [ 121.817867, 42.504303 ], [ 121.831417, 42.533856 ], [ 121.844352, 42.522389 ], [ 121.889931, 42.556784 ], [ 121.921344, 42.605697 ], [ 121.915801, 42.656332 ], [ 121.94167, 42.666014 ], [ 121.939207, 42.688453 ], [ 122.018663, 42.69901 ], [ 122.062394, 42.723635 ], [ 122.072865, 42.710444 ], [ 122.160945, 42.684934 ], [ 122.204676, 42.685374 ], [ 122.204676, 42.732867 ], [ 122.261343, 42.695931 ], [ 122.324785, 42.684934 ], [ 122.338951, 42.669975 ], [ 122.396234, 42.684054 ], [ 122.396234, 42.707366 ], [ 122.460907, 42.755282 ], [ 122.439349, 42.770221 ], [ 122.371596, 42.776371 ], [ 122.35127, 42.830378 ], [ 122.436886, 42.843105 ], [ 122.556378, 42.827745 ], [ 122.576088, 42.819405 ], [ 122.580399, 42.789987 ], [ 122.624747, 42.773296 ], [ 122.653696, 42.78252 ], [ 122.733152, 42.786034 ], [ 122.73808, 42.77066 ], [ 122.786123, 42.757479 ], [ 122.848949, 42.712203 ], [ 122.848949, 42.712203 ], [ 122.883442, 42.751766 ], [ 122.883442, 42.751766 ], [ 122.887137, 42.770221 ], [ 122.925941, 42.772417 ], [ 122.945651, 42.753524 ], [ 122.980144, 42.777689 ], [ 123.058368, 42.768903 ], [ 123.118114, 42.801405 ], [ 123.227752, 42.831695 ], [ 123.169853, 42.859777 ], [ 123.188947, 42.895739 ], [ 123.18402, 42.925983 ], [ 123.259165, 42.993431 ], [ 123.323222, 43.000872 ], [ 123.434707, 43.027565 ], [ 123.474743, 43.042438 ], [ 123.536337, 43.007 ], [ 123.572678, 43.003498 ], [ 123.580685, 43.036314 ], [ 123.631192, 43.088346 ], [ 123.636119, 43.141644 ], [ 123.666916, 43.179623 ], [ 123.645974, 43.208855 ], [ 123.676771, 43.223684 ], [ 123.664453, 43.264663 ], [ 123.698329, 43.272071 ], [ 123.703873, 43.37047 ], [ 123.710032, 43.417001 ], [ 123.749452, 43.439167 ], [ 123.747604, 43.472184 ], [ 123.79688, 43.489988 ], [ 123.857858, 43.459153 ], [ 123.857858, 43.459153 ], [ 123.852314, 43.406133 ], [ 123.881263, 43.392218 ], [ 123.881263, 43.392218 ], [ 123.896046, 43.361333 ], [ 123.964415, 43.34088 ], [ 124.032784, 43.280786 ], [ 124.099306, 43.292983 ], [ 124.117168, 43.2773 ], [ 124.114088, 43.247229 ], [ 124.168291, 43.244177 ], [ 124.215102, 43.255947 ], [ 124.228653, 43.235022 ], [ 124.27608, 43.233278 ], [ 124.287167, 43.207983 ], [ 124.273617, 43.17875 ], [ 124.366007, 43.121554 ], [ 124.425754, 43.076107 ], [ 124.333363, 42.997371 ], [ 124.369703, 42.972854 ], [ 124.42329, 42.975482 ], [ 124.442384, 42.958841 ], [ 124.431913, 42.930803 ], [ 124.38079, 42.912835 ], [ 124.371551, 42.880831 ], [ 124.435609, 42.880831 ], [ 124.466406, 42.847054 ], [ 124.586514, 42.905384 ], [ 124.607456, 42.937376 ], [ 124.632093, 42.949642 ], [ 124.635173, 42.972854 ], [ 124.658579, 42.972854 ], [ 124.677673, 43.002185 ], [ 124.686912, 43.051185 ], [ 124.719557, 43.069987 ], [ 124.755281, 43.074359 ], [ 124.785462, 43.117185 ], [ 124.882781, 43.13422 ], [ 124.88894, 43.074796 ], [ 124.840897, 43.032377 ], [ 124.869846, 42.988178 ], [ 124.87231, 42.962344 ], [ 124.84952, 42.882585 ], [ 124.856911, 42.824234 ], [ 124.874157, 42.789987 ], [ 124.897563, 42.787791 ], [ 124.92836, 42.819844 ], [ 124.975171, 42.802722 ], [ 124.996729, 42.745174 ], [ 124.968396, 42.722756 ], [ 124.99057, 42.677455 ], [ 125.014592, 42.666014 ], [ 125.010896, 42.63212 ], [ 125.038613, 42.615387 ], [ 125.097127, 42.622433 ], [ 125.082961, 42.591159 ], [ 125.089736, 42.567803 ], [ 125.066946, 42.534738 ], [ 125.090968, 42.515773 ], [ 125.068794, 42.499449 ], [ 125.105135, 42.490624 ], [ 125.150098, 42.458842 ], [ 125.140243, 42.44692 ], [ 125.186439, 42.427928 ], [ 125.185823, 42.38197 ], [ 125.203685, 42.366938 ], [ 125.167345, 42.351903 ], [ 125.175352, 42.308102 ], [ 125.224011, 42.30102 ], [ 125.264047, 42.312528 ], [ 125.299156, 42.289953 ], [ 125.27575, 42.266928 ], [ 125.27575, 42.231045 ], [ 125.312706, 42.219966 ], [ 125.280677, 42.175187 ], [ 125.312706, 42.197359 ], [ 125.305931, 42.146351 ], [ 125.357054, 42.145464 ], [ 125.368141, 42.182726 ], [ 125.41372, 42.156112 ], [ 125.458068, 42.160105 ], [ 125.458068, 42.160105 ], [ 125.490097, 42.136145 ], [ 125.446365, 42.098411 ], [ 125.414336, 42.101964 ], [ 125.416184, 42.063766 ], [ 125.363213, 42.017097 ], [ 125.369989, 42.002868 ], [ 125.29854, 41.974399 ], [ 125.291764, 41.958825 ], [ 125.35151, 41.92811 ], [ 125.307779, 41.924548 ], [ 125.294844, 41.822945 ], [ 125.319482, 41.776993 ], [ 125.319482, 41.776993 ], [ 125.323177, 41.771191 ], [ 125.323177, 41.771191 ], [ 125.336112, 41.768067 ], [ 125.336112, 41.768067 ], [ 125.332416, 41.711354 ], [ 125.317018, 41.676944 ], [ 125.344119, 41.672474 ], [ 125.412488, 41.691246 ], [ 125.446981, 41.67605 ], [ 125.461148, 41.642516 ], [ 125.450061, 41.597777 ], [ 125.479626, 41.544946 ], [ 125.507343, 41.534195 ], [ 125.493176, 41.509103 ], [ 125.533212, 41.479069 ], [ 125.534444, 41.428833 ], [ 125.547995, 41.401006 ], [ 125.581256, 41.396517 ], [ 125.589879, 41.359245 ], [ 125.610205, 41.365084 ], [ 125.637306, 41.34442 ], [ 125.62006, 41.318355 ], [ 125.642234, 41.296327 ], [ 125.646545, 41.264396 ], [ 125.685349, 41.273842 ], [ 125.695205, 41.244599 ], [ 125.749407, 41.245499 ], [ 125.758646, 41.232449 ], [ 125.73832, 41.178418 ], [ 125.791291, 41.167607 ], [ 125.759878, 41.132908 ], [ 125.734009, 41.125695 ], [ 125.712451, 41.095485 ], [ 125.739552, 41.08917 ], [ 125.726617, 41.055332 ], [ 125.684118, 41.021929 ], [ 125.674879, 40.974503 ], [ 125.650241, 40.970888 ], [ 125.635458, 40.94151 ], [ 125.589263, 40.931112 ], [ 125.584335, 40.891764 ], [ 125.652089, 40.91619 ], [ 125.687813, 40.897645 ], [ 125.707523, 40.866877 ], [ 125.648393, 40.826133 ], [ 125.641002, 40.798503 ], [ 125.67611, 40.788082 ], [ 125.685349, 40.769048 ], [ 125.61698, 40.763609 ], [ 125.585567, 40.788535 ], [ 125.551075, 40.761796 ], [ 125.544915, 40.729605 ], [ 125.49564, 40.728697 ], [ 125.459916, 40.707379 ], [ 125.453756, 40.676522 ], [ 125.418648, 40.673345 ], [ 125.422343, 40.635661 ], [ 125.375532, 40.658365 ], [ 125.329337, 40.643835 ], [ 125.305315, 40.661089 ], [ 125.279445, 40.655187 ], [ 125.262815, 40.620218 ], [ 125.181511, 40.611132 ], [ 125.113758, 40.569322 ], [ 125.076801, 40.562048 ], [ 125.015823, 40.533853 ], [ 125.004737, 40.496091 ], [ 125.042925, 40.483802 ], [ 125.044157, 40.466503 ], [ 124.985642, 40.475153 ], [ 124.945606, 40.45603 ], [ 124.913578, 40.481981 ], [ 124.834121, 40.423235 ], [ 124.739267, 40.371733 ], [ 124.722636, 40.321561 ], [ 124.62655, 40.291896 ], [ 124.513833, 40.22019 ], [ 124.490427, 40.18408 ], [ 124.457782, 40.177679 ], [ 124.428217, 40.144291 ], [ 124.346913, 40.079756 ], [ 124.336442, 40.049985 ], [ 124.372167, 40.021576 ], [ 124.349377, 39.989029 ], [ 124.288399, 39.962888 ], [ 124.286551, 39.931689 ], [ 124.241588, 39.928477 ], [ 124.216334, 39.89313 ], [ 124.214486, 39.865116 ], [ 124.173218, 39.841225 ], [ 124.151045, 39.74558 ], [ 124.099306, 39.777323 ], [ 124.103001, 39.823302 ], [ 124.002603, 39.800316 ], [ 123.95148, 39.817786 ], [ 123.812278, 39.831115 ], [ 123.795032, 39.822842 ], [ 123.687858, 39.808132 ], [ 123.674924, 39.826979 ], [ 123.645358, 39.823761 ], [ 123.642279, 39.796178 ], [ 123.612714, 39.775023 ], [ 123.579453, 39.781002 ], [ 123.546808, 39.756163 ], [ 123.536337, 39.788361 ], [ 123.484598, 39.763063 ], [ 123.477823, 39.74696 ], [ 123.392823, 39.723949 ], [ 123.388512, 39.74742 ], [ 123.350939, 39.750641 ], [ 123.274563, 39.753862 ], [ 123.270251, 39.714743 ], [ 123.286882, 39.704154 ], [ 123.253005, 39.689879 ], [ 123.215433, 39.696786 ], [ 123.212969, 39.665928 ], [ 123.166774, 39.674219 ], [ 123.146448, 39.647037 ], [ 123.103332, 39.676983 ], [ 123.010941, 39.655331 ], [ 123.021412, 39.64335 ], [ 122.978912, 39.616156 ], [ 122.972753, 39.594946 ], [ 122.941956, 39.604629 ], [ 122.860652, 39.604629 ], [ 122.847101, 39.581571 ], [ 122.808913, 39.559889 ], [ 122.682645, 39.514658 ], [ 122.649385, 39.516505 ], [ 122.637066, 39.488799 ], [ 122.581631, 39.464316 ], [ 122.532972, 39.419947 ], [ 122.489856, 39.403764 ], [ 122.412864, 39.411625 ], [ 122.366053, 39.370461 ], [ 122.30877, 39.346399 ], [ 122.274893, 39.322329 ], [ 122.242865, 39.267678 ], [ 122.160329, 39.238019 ], [ 122.117213, 39.213911 ], [ 122.123988, 39.172631 ], [ 122.167104, 39.158711 ], [ 122.127684, 39.144788 ], [ 122.088264, 39.112291 ], [ 122.048228, 39.101146 ], [ 122.071634, 39.074204 ], [ 122.061778, 39.060264 ], [ 122.013735, 39.073275 ], [ 121.963228, 39.030053 ], [ 121.913953, 39.0598 ], [ 121.929352, 39.024939 ], [ 121.864062, 39.037026 ], [ 121.855439, 39.025869 ], [ 121.905946, 38.997503 ], [ 121.920728, 38.969591 ], [ 121.863446, 38.942598 ], [ 121.804932, 38.970986 ], [ 121.790149, 39.022614 ], [ 121.756889, 39.025869 ], [ 121.73841, 38.998898 ], [ 121.671273, 39.010059 ], [ 121.66265, 38.966333 ], [ 121.618918, 38.950046 ], [ 121.655874, 38.946788 ], [ 121.719316, 38.920252 ], [ 121.708845, 38.872744 ], [ 121.675585, 38.86156 ], [ 121.618302, 38.862492 ], [ 121.564715, 38.874607 ], [ 121.509897, 38.817743 ], [ 121.399028, 38.812613 ], [ 121.359608, 38.822406 ], [ 121.302325, 38.78976 ], [ 121.259825, 38.786495 ], [ 121.198848, 38.721623 ], [ 121.13787, 38.723023 ], [ 121.112, 38.776231 ], [ 121.12863, 38.799089 ], [ 121.110768, 38.862026 ], [ 121.129862, 38.879266 ], [ 121.094138, 38.894173 ], [ 121.08921, 38.922115 ], [ 121.128014, 38.958888 ], [ 121.180369, 38.959819 ], [ 121.204391, 38.941202 ], [ 121.275224, 38.971917 ], [ 121.341129, 38.980757 ], [ 121.317108, 39.012384 ], [ 121.370695, 39.060264 ], [ 121.431057, 39.027263 ], [ 121.508049, 39.034237 ], [ 121.581962, 39.075598 ], [ 121.599208, 39.098824 ], [ 121.562252, 39.127149 ], [ 121.590585, 39.154999 ], [ 121.642324, 39.11972 ], [ 121.605983, 39.080708 ], [ 121.631853, 39.077921 ], [ 121.68236, 39.117863 ], [ 121.639244, 39.166136 ], [ 121.604136, 39.166136 ], [ 121.586889, 39.193506 ], [ 121.591201, 39.228748 ], [ 121.631237, 39.22643 ], [ 121.589353, 39.263044 ], [ 121.623846, 39.285745 ], [ 121.672505, 39.275554 ], [ 121.667577, 39.310754 ], [ 121.70207, 39.326496 ], [ 121.72486, 39.364447 ], [ 121.621382, 39.326033 ], [ 121.562252, 39.322792 ], [ 121.51544, 39.286672 ], [ 121.464933, 39.30103 ], [ 121.466781, 39.320014 ], [ 121.435984, 39.329736 ], [ 121.432904, 39.357506 ], [ 121.35468, 39.377863 ], [ 121.324499, 39.371386 ], [ 121.307869, 39.391277 ], [ 121.270296, 39.374162 ], [ 121.245659, 39.389427 ], [ 121.246891, 39.421334 ], [ 121.304173, 39.48187 ], [ 121.286927, 39.507271 ], [ 121.268449, 39.482794 ], [ 121.224717, 39.519275 ], [ 121.226565, 39.554814 ], [ 121.263521, 39.589873 ], [ 121.299246, 39.606013 ], [ 121.325731, 39.601402 ], [ 121.450151, 39.624914 ], [ 121.451999, 39.658095 ], [ 121.482796, 39.659478 ], [ 121.502506, 39.703233 ], [ 121.45939, 39.747881 ], [ 121.487107, 39.760303 ], [ 121.472325, 39.802155 ], [ 121.530223, 39.851334 ], [ 121.541926, 39.874302 ], [ 121.572107, 39.865116 ], [ 121.626925, 39.882569 ], [ 121.699606, 39.937196 ], [ 121.76428, 39.933525 ], [ 121.779062, 39.942702 ], [ 121.796309, 39.999116 ], [ 121.824642, 40.025701 ], [ 121.910257, 40.072887 ], [ 121.956453, 40.133311 ], [ 121.995257, 40.128277 ], [ 122.003264, 40.172191 ], [ 121.98109, 40.173106 ], [ 121.950293, 40.204194 ], [ 121.940438, 40.242121 ], [ 122.02667, 40.244862 ], [ 122.039605, 40.260391 ], [ 122.040221, 40.322017 ], [ 122.079641, 40.332967 ], [ 122.110438, 40.315629 ], [ 122.138155, 40.338897 ], [ 122.111054, 40.348932 ], [ 122.135691, 40.374925 ], [ 122.152322, 40.357597 ], [ 122.198517, 40.382219 ], [ 122.186814, 40.422779 ], [ 122.229314, 40.424146 ], [ 122.250872, 40.445555 ], [ 122.241633, 40.465137 ], [ 122.278589, 40.482891 ], [ 122.244712, 40.485167 ], [ 122.245944, 40.519752 ], [ 122.150474, 40.588413 ], [ 122.133843, 40.614313 ], [ 122.148626, 40.671983 ], [ 122.122141, 40.657457 ], [ 122.06609, 40.64883 ], [ 122.025438, 40.674253 ], [ 121.951525, 40.680607 ], [ 121.936127, 40.711462 ], [ 121.934279, 40.79805 ], [ 121.883772, 40.802127 ], [ 121.84312, 40.831567 ], [ 121.816019, 40.894931 ], [ 121.778446, 40.886787 ], [ 121.735331, 40.862351 ], [ 121.732251, 40.846961 ], [ 121.682976, 40.829755 ], [ 121.626309, 40.844244 ], [ 121.576418, 40.837906 ], [ 121.553013, 40.817528 ], [ 121.55486, 40.849677 ], [ 121.526527, 40.85194 ], [ 121.499426, 40.880001 ], [ 121.440296, 40.88181 ], [ 121.440912, 40.84017 ], [ 121.342977, 40.841528 ], [ 121.290622, 40.851488 ], [ 121.274608, 40.886335 ], [ 121.251202, 40.880453 ], [ 121.23642, 40.851035 ], [ 121.177906, 40.873665 ], [ 121.126167, 40.86914 ], [ 121.076892, 40.815716 ], [ 121.086747, 40.79805 ], [ 121.010986, 40.784457 ], [ 121.00729, 40.807563 ], [ 120.971566, 40.805751 ], [ 120.994356, 40.790801 ], [ 120.980189, 40.766329 ], [ 120.991276, 40.744115 ], [ 121.028848, 40.746382 ], [ 121.032544, 40.709193 ], [ 120.983269, 40.712822 ], [ 120.945081, 40.687868 ], [ 120.861313, 40.684692 ], [ 120.8299, 40.671076 ], [ 120.837291, 40.644289 ], [ 120.822509, 40.59432 ], [ 120.72827, 40.539311 ], [ 120.72211, 40.515657 ], [ 120.693777, 40.505647 ], [ 120.666676, 40.467413 ], [ 120.615553, 40.453298 ], [ 120.617401, 40.41959 ], [ 120.596459, 40.399084 ], [ 120.602618, 40.36079 ], [ 120.537329, 40.325211 ], [ 120.52193, 40.304676 ], [ 120.523778, 40.256737 ], [ 120.491749, 40.20008 ], [ 120.451097, 40.177679 ], [ 120.371641, 40.174478 ], [ 120.273091, 40.127362 ], [ 120.161606, 40.096239 ], [ 120.134504, 40.074719 ], [ 120.092005, 40.077466 ], [ 119.947259, 40.040364 ], [ 119.941715, 40.009659 ], [ 119.91831, 39.989946 ], [ 119.854252, 39.98857 ], [ 119.845629, 40.000949 ], [ 119.845629, 40.000949 ], [ 119.854252, 40.033033 ], [ 119.81668, 40.050443 ], [ 119.81668, 40.050443 ], [ 119.787115, 40.041739 ], [ 119.787115, 40.041739 ], [ 119.783419, 40.046778 ], [ 119.783419, 40.046778 ], [ 119.772332, 40.08113 ], [ 119.736608, 40.104936 ], [ 119.760629, 40.136056 ], [ 119.745847, 40.207851 ], [ 119.716898, 40.195966 ], [ 119.671934, 40.23938 ], [ 119.639289, 40.231613 ], [ 119.639289, 40.231613 ], [ 119.651608, 40.271808 ], [ 119.598021, 40.334335 ], [ 119.586934, 40.375381 ], [ 119.604797, 40.455119 ], [ 119.553674, 40.502007 ], [ 119.572152, 40.523846 ], [ 119.559217, 40.547952 ], [ 119.503783, 40.553864 ], [ 119.477913, 40.533399 ], [ 119.429254, 40.540221 ], [ 119.30237, 40.530215 ], [ 119.256175, 40.543404 ], [ 119.22045, 40.569322 ], [ 119.230921, 40.603863 ], [ 119.177951, 40.609315 ], [ 119.162552, 40.600228 ], [ 119.14469, 40.632482 ], [ 119.184726, 40.680153 ], [ 119.165632, 40.69286 ], [ 119.115125, 40.666536 ], [ 119.054763, 40.664721 ], [ 119.028277, 40.692406 ], [ 119.011031, 40.687414 ], [ 118.96114, 40.72008 ], [ 118.950053, 40.747743 ], [ 118.895234, 40.75409 ], [ 118.907553, 40.775394 ], [ 118.878604, 40.783098 ], [ 118.845959, 40.822057 ], [ 118.873061, 40.847866 ], [ 118.90201, 40.960946 ], [ 118.916792, 40.969984 ], [ 118.977154, 40.959138 ], [ 118.977154, 40.959138 ], [ 119.00056, 40.967273 ], [ 119.013495, 41.007479 ], [ 118.951901, 41.018317 ], [ 118.937118, 41.052625 ], [ 118.964836, 41.079246 ], [ 119.037516, 41.067516 ], [ 119.080632, 41.095936 ], [ 119.081248, 41.131555 ], [ 119.126212, 41.138767 ], [ 119.189038, 41.198234 ], [ 119.169943, 41.222996 ], [ 119.204436, 41.222546 ], [ 119.209364, 41.244599 ], [ 119.2494, 41.279689 ], [ 119.239545, 41.31431 ], [ 119.296211, 41.325097 ], [ 119.330704, 41.385293 ], [ 119.309762, 41.405944 ], [ 119.376283, 41.422102 ], [ 119.378131, 41.459787 ], [ 119.401537, 41.472343 ], [ 119.406464, 41.503276 ], [ 119.361501, 41.545841 ], [ 119.362116, 41.566442 ], [ 119.420015, 41.567785 ], [ 119.415703, 41.590169 ], [ 119.342406, 41.617914 ], [ 119.307914, 41.657273 ], [ 119.299907, 41.705545 ], [ 119.319001, 41.727435 ], [ 119.317769, 41.764049 ], [ 119.292515, 41.790827 ], [ 119.312841, 41.80555 ], [ 119.334399, 41.871539 ], [ 119.323312, 41.889807 ], [ 119.340559, 41.926774 ], [ 119.323928, 41.937014 ], [ 119.324544, 41.969505 ], [ 119.375667, 42.023322 ], [ 119.384906, 42.08953 ], [ 119.352261, 42.118391 ], [ 119.314689, 42.119723 ], [ 119.30853, 42.147239 ], [ 119.286972, 42.154781 ], [ 119.277733, 42.185387 ], [ 119.237697, 42.200905 ], [ 119.274037, 42.239021 ], [ 119.280197, 42.260728 ], [ 119.34795, 42.300578 ], [ 119.432949, 42.317396 ], [ 119.482841, 42.347037 ], [ 119.502551, 42.388159 ], [ 119.540123, 42.363401 ], [ 119.572152, 42.359421 ], [ 119.571536, 42.335536 ], [ 119.539507, 42.297922 ], [ 119.557985, 42.289068 ] ] ], [ [ [ 122.673406, 39.269531 ], [ 122.67895, 39.268605 ], [ 122.57732, 39.269994 ], [ 122.497248, 39.300566 ], [ 122.540979, 39.308439 ], [ 122.593334, 39.278334 ], [ 122.641993, 39.288061 ], [ 122.673406, 39.269531 ] ] ], [ [ [ 122.335256, 39.149894 ], [ 122.316161, 39.185157 ], [ 122.343263, 39.203246 ], [ 122.393154, 39.213448 ], [ 122.383299, 39.190723 ], [ 122.398697, 39.16196 ], [ 122.366053, 39.174951 ], [ 122.335256, 39.149894 ] ] ], [ [ [ 122.691884, 39.23292 ], [ 122.691268, 39.23431 ], [ 122.690037, 39.234774 ], [ 122.628443, 39.231993 ], [ 122.635834, 39.241727 ], [ 122.740544, 39.248679 ], [ 122.751631, 39.229675 ], [ 122.696812, 39.206492 ], [ 122.691884, 39.23292 ] ] ], [ [ [ 122.759022, 39.025404 ], [ 122.732536, 39.013779 ], [ 122.704819, 39.044463 ], [ 122.725145, 39.048181 ], [ 122.759022, 39.025404 ] ] ], [ [ [ 123.022644, 39.546507 ], [ 123.036194, 39.533123 ], [ 122.995542, 39.495264 ], [ 122.945035, 39.520198 ], [ 122.96105, 39.551122 ], [ 123.022644, 39.546507 ] ] ], [ [ [ 122.503407, 39.241263 ], [ 122.547755, 39.229211 ], [ 122.502175, 39.224112 ], [ 122.503407, 39.241263 ] ] ], [ [ [ 120.786784, 40.473787 ], [ 120.774465, 40.48016 ], [ 120.805262, 40.525666 ], [ 120.8299, 40.516112 ], [ 120.83298, 40.491995 ], [ 120.786784, 40.473787 ] ] ], [ [ [ 123.086702, 39.426881 ], [ 123.054057, 39.457847 ], [ 123.090397, 39.450915 ], [ 123.086702, 39.426881 ] ] ], [ [ [ 123.160614, 39.025404 ], [ 123.143984, 39.038885 ], [ 123.145832, 39.091857 ], [ 123.20065, 39.077921 ], [ 123.205578, 39.057011 ], [ 123.160614, 39.025404 ] ] ], [ [ [ 123.716807, 39.74512 ], [ 123.719887, 39.763063 ], [ 123.756843, 39.754322 ], [ 123.716807, 39.74512 ] ] ] ] } },\n{ \"type\": \"Feature\", \"properties\": { \"adcode\": \"220000\", \"name\": \"吉林省\", \"center\": [ 125.3245, 43.886841 ], \"centroid\": [ 126.171249, 43.70394 ], \"childrenNum\": 9, \"level\": \"province\", \"parent\": { \"adcode\": 100000 }, \"subFeatureIndex\": 6, \"acroutes\": [ 100000 ] }, \"geometry\": { \"type\": \"MultiPolygon\", \"coordinates\": [ [ [ [ 126.188572, 41.114875 ], [ 126.187956, 41.113072 ], [ 126.16763, 41.094583 ], [ 126.124514, 41.092327 ], [ 126.133753, 41.063906 ], [ 126.099877, 41.036376 ], [ 126.1085, 41.011995 ], [ 126.066, 40.997542 ], [ 126.08263, 40.976762 ], [ 126.051833, 40.96185 ], [ 126.041362, 40.928851 ], [ 126.008102, 40.936537 ], [ 125.959442, 40.88181 ], [ 125.921254, 40.882715 ], [ 125.875059, 40.908501 ], [ 125.860892, 40.888597 ], [ 125.817161, 40.866877 ], [ 125.778356, 40.897645 ], [ 125.707523, 40.866877 ], [ 125.687813, 40.897645 ], [ 125.652089, 40.91619 ], [ 125.584335, 40.891764 ], [ 125.589263, 40.931112 ], [ 125.635458, 40.94151 ], [ 125.650241, 40.970888 ], [ 125.674879, 40.974503 ], [ 125.684118, 41.021929 ], [ 125.726617, 41.055332 ], [ 125.739552, 41.08917 ], [ 125.712451, 41.095485 ], [ 125.734009, 41.125695 ], [ 125.759878, 41.132908 ], [ 125.791291, 41.167607 ], [ 125.73832, 41.178418 ], [ 125.758646, 41.232449 ], [ 125.749407, 41.245499 ], [ 125.695205, 41.244599 ], [ 125.685349, 41.273842 ], [ 125.646545, 41.264396 ], [ 125.642234, 41.296327 ], [ 125.62006, 41.318355 ], [ 125.637306, 41.34442 ], [ 125.610205, 41.365084 ], [ 125.589879, 41.359245 ], [ 125.581256, 41.396517 ], [ 125.547995, 41.401006 ], [ 125.534444, 41.428833 ], [ 125.533212, 41.479069 ], [ 125.493176, 41.509103 ], [ 125.507343, 41.534195 ], [ 125.479626, 41.544946 ], [ 125.450061, 41.597777 ], [ 125.461148, 41.642516 ], [ 125.446981, 41.67605 ], [ 125.412488, 41.691246 ], [ 125.344119, 41.672474 ], [ 125.317018, 41.676944 ], [ 125.332416, 41.711354 ], [ 125.336112, 41.768067 ], [ 125.336112, 41.768067 ], [ 125.323177, 41.771191 ], [ 125.323177, 41.771191 ], [ 125.319482, 41.776993 ], [ 125.319482, 41.776993 ], [ 125.294844, 41.822945 ], [ 125.307779, 41.924548 ], [ 125.35151, 41.92811 ], [ 125.291764, 41.958825 ], [ 125.29854, 41.974399 ], [ 125.369989, 42.002868 ], [ 125.363213, 42.017097 ], [ 125.416184, 42.063766 ], [ 125.414336, 42.101964 ], [ 125.446365, 42.098411 ], [ 125.490097, 42.136145 ], [ 125.458068, 42.160105 ], [ 125.458068, 42.160105 ], [ 125.41372, 42.156112 ], [ 125.368141, 42.182726 ], [ 125.357054, 42.145464 ], [ 125.305931, 42.146351 ], [ 125.312706, 42.197359 ], [ 125.280677, 42.175187 ], [ 125.312706, 42.219966 ], [ 125.27575, 42.231045 ], [ 125.27575, 42.266928 ], [ 125.299156, 42.289953 ], [ 125.264047, 42.312528 ], [ 125.224011, 42.30102 ], [ 125.175352, 42.308102 ], [ 125.167345, 42.351903 ], [ 125.203685, 42.366938 ], [ 125.185823, 42.38197 ], [ 125.186439, 42.427928 ], [ 125.140243, 42.44692 ], [ 125.150098, 42.458842 ], [ 125.105135, 42.490624 ], [ 125.068794, 42.499449 ], [ 125.090968, 42.515773 ], [ 125.066946, 42.534738 ], [ 125.089736, 42.567803 ], [ 125.082961, 42.591159 ], [ 125.097127, 42.622433 ], [ 125.038613, 42.615387 ], [ 125.010896, 42.63212 ], [ 125.014592, 42.666014 ], [ 124.99057, 42.677455 ], [ 124.968396, 42.722756 ], [ 124.996729, 42.745174 ], [ 124.975171, 42.802722 ], [ 124.92836, 42.819844 ], [ 124.897563, 42.787791 ], [ 124.874157, 42.789987 ], [ 124.856911, 42.824234 ], [ 124.84952, 42.882585 ], [ 124.87231, 42.962344 ], [ 124.869846, 42.988178 ], [ 124.840897, 43.032377 ], [ 124.88894, 43.074796 ], [ 124.882781, 43.13422 ], [ 124.785462, 43.117185 ], [ 124.755281, 43.074359 ], [ 124.719557, 43.069987 ], [ 124.686912, 43.051185 ], [ 124.677673, 43.002185 ], [ 124.658579, 42.972854 ], [ 124.635173, 42.972854 ], [ 124.632093, 42.949642 ], [ 124.607456, 42.937376 ], [ 124.586514, 42.905384 ], [ 124.466406, 42.847054 ], [ 124.435609, 42.880831 ], [ 124.371551, 42.880831 ], [ 124.38079, 42.912835 ], [ 124.431913, 42.930803 ], [ 124.442384, 42.958841 ], [ 124.42329, 42.975482 ], [ 124.369703, 42.972854 ], [ 124.333363, 42.997371 ], [ 124.425754, 43.076107 ], [ 124.366007, 43.121554 ], [ 124.273617, 43.17875 ], [ 124.287167, 43.207983 ], [ 124.27608, 43.233278 ], [ 124.228653, 43.235022 ], [ 124.215102, 43.255947 ], [ 124.168291, 43.244177 ], [ 124.114088, 43.247229 ], [ 124.117168, 43.2773 ], [ 124.099306, 43.292983 ], [ 124.032784, 43.280786 ], [ 123.964415, 43.34088 ], [ 123.896046, 43.361333 ], [ 123.881263, 43.392218 ], [ 123.881263, 43.392218 ], [ 123.852314, 43.406133 ], [ 123.857858, 43.459153 ], [ 123.857858, 43.459153 ], [ 123.79688, 43.489988 ], [ 123.747604, 43.472184 ], [ 123.749452, 43.439167 ], [ 123.710032, 43.417001 ], [ 123.703873, 43.37047 ], [ 123.608402, 43.366119 ], [ 123.54496, 43.415262 ], [ 123.519707, 43.402219 ], [ 123.486446, 43.44525 ], [ 123.442098, 43.437863 ], [ 123.419925, 43.410046 ], [ 123.382968, 43.469143 ], [ 123.36449, 43.483475 ], [ 123.315831, 43.492159 ], [ 123.329998, 43.519071 ], [ 123.304744, 43.550742 ], [ 123.360179, 43.567223 ], [ 123.452569, 43.545971 ], [ 123.452569, 43.545971 ], [ 123.461193, 43.568523 ], [ 123.434091, 43.575461 ], [ 123.421157, 43.598435 ], [ 123.5117, 43.592801 ], [ 123.510468, 43.624867 ], [ 123.536953, 43.633964 ], [ 123.518475, 43.682024 ], [ 123.520323, 43.708419 ], [ 123.48275, 43.737396 ], [ 123.498149, 43.771114 ], [ 123.461809, 43.822518 ], [ 123.467968, 43.853599 ], [ 123.397135, 43.954929 ], [ 123.37065, 43.970006 ], [ 123.400831, 43.979481 ], [ 123.365722, 44.013922 ], [ 123.331229, 44.028984 ], [ 123.32815, 44.084035 ], [ 123.350939, 44.092633 ], [ 123.362642, 44.133452 ], [ 123.386664, 44.161794 ], [ 123.323838, 44.179823 ], [ 123.286882, 44.211574 ], [ 123.277027, 44.25274 ], [ 123.196955, 44.34483 ], [ 123.128585, 44.367081 ], [ 123.114419, 44.40258 ], [ 123.142136, 44.428228 ], [ 123.125506, 44.455147 ], [ 123.137209, 44.486322 ], [ 123.12489, 44.5098 ], [ 123.06576, 44.505959 ], [ 123.025108, 44.493153 ], [ 122.85634, 44.398304 ], [ 122.76087, 44.369648 ], [ 122.702971, 44.319145 ], [ 122.675254, 44.285738 ], [ 122.641993, 44.283595 ], [ 122.515726, 44.251025 ], [ 122.483081, 44.236877 ], [ 122.319241, 44.233018 ], [ 122.271198, 44.255741 ], [ 122.291524, 44.310152 ], [ 122.294604, 44.41113 ], [ 122.28598, 44.477783 ], [ 122.228082, 44.480345 ], [ 122.224386, 44.526016 ], [ 122.196053, 44.559712 ], [ 122.13138, 44.577619 ], [ 122.113517, 44.615546 ], [ 122.103046, 44.67388 ], [ 122.117213, 44.701961 ], [ 122.161561, 44.728328 ], [ 122.152322, 44.744057 ], [ 122.10243, 44.736406 ], [ 122.110438, 44.767856 ], [ 122.142467, 44.753833 ], [ 122.168952, 44.770405 ], [ 122.099967, 44.7823 ], [ 122.098119, 44.81882 ], [ 122.04946, 44.912985 ], [ 122.079025, 44.914256 ], [ 122.087032, 44.95281 ], [ 122.074713, 45.006573 ], [ 122.098735, 45.02138 ], [ 122.119677, 45.068739 ], [ 122.109822, 45.142236 ], [ 122.143082, 45.183167 ], [ 122.192358, 45.180636 ], [ 122.22993, 45.206784 ], [ 122.239169, 45.276313 ], [ 122.147394, 45.295682 ], [ 122.146778, 45.374352 ], [ 122.180039, 45.409655 ], [ 122.168336, 45.439897 ], [ 122.064242, 45.472641 ], [ 122.002648, 45.507882 ], [ 121.993409, 45.552741 ], [ 121.966308, 45.596308 ], [ 121.995873, 45.59882 ], [ 122.003264, 45.623102 ], [ 121.970004, 45.692956 ], [ 121.934279, 45.71051 ], [ 121.867142, 45.719703 ], [ 121.812323, 45.704659 ], [ 121.811091, 45.687103 ], [ 121.713773, 45.701734 ], [ 121.666345, 45.727641 ], [ 121.644172, 45.752284 ], [ 121.657106, 45.770238 ], [ 121.697142, 45.76314 ], [ 121.754425, 45.794862 ], [ 121.766744, 45.830318 ], [ 121.766744, 45.830318 ], [ 121.769823, 45.84366 ], [ 121.817251, 45.875336 ], [ 121.805548, 45.900746 ], [ 121.821562, 45.918235 ], [ 121.809243, 45.961102 ], [ 121.761816, 45.998947 ], [ 121.819098, 46.023054 ], [ 121.843736, 46.024301 ], [ 121.864062, 46.002272 ], [ 121.923808, 46.004767 ], [ 121.92812, 45.988552 ], [ 122.040221, 45.959022 ], [ 122.085184, 45.912406 ], [ 122.091344, 45.882002 ], [ 122.200981, 45.857 ], [ 122.236705, 45.831569 ], [ 122.253952, 45.7982 ], [ 122.301379, 45.813218 ], [ 122.337719, 45.859917 ], [ 122.372828, 45.856166 ], [ 122.362357, 45.917403 ], [ 122.446125, 45.916986 ], [ 122.496016, 45.85825 ], [ 122.504639, 45.786933 ], [ 122.522501, 45.786933 ], [ 122.556378, 45.82156 ], [ 122.603189, 45.778169 ], [ 122.640761, 45.771072 ], [ 122.650001, 45.731401 ], [ 122.671558, 45.70048 ], [ 122.741775, 45.705077 ], [ 122.751015, 45.735996 ], [ 122.792283, 45.766063 ], [ 122.752246, 45.834905 ], [ 122.772572, 45.856583 ], [ 122.80029, 45.856583 ], [ 122.828623, 45.912406 ], [ 122.792898, 46.073313 ], [ 123.04605, 46.099878 ], [ 123.070071, 46.123527 ], [ 123.112571, 46.130163 ], [ 123.102716, 46.172037 ], [ 123.127354, 46.174523 ], [ 123.128585, 46.210565 ], [ 123.178476, 46.248239 ], [ 123.248078, 46.273065 ], [ 123.286266, 46.250308 ], [ 123.320758, 46.254447 ], [ 123.357099, 46.232096 ], [ 123.357099, 46.232096 ], [ 123.430396, 46.243687 ], [ 123.452569, 46.233338 ], [ 123.499381, 46.259826 ], [ 123.569598, 46.223816 ], [ 123.569598, 46.223816 ], [ 123.604706, 46.251964 ], [ 123.673692, 46.258585 ], [ 123.726047, 46.255688 ], [ 123.775938, 46.263136 ], [ 123.84985, 46.302428 ], [ 123.896046, 46.303668 ], [ 123.917604, 46.25693 ], [ 123.936082, 46.286715 ], [ 123.960103, 46.288369 ], [ 123.952096, 46.256516 ], [ 123.979814, 46.228784 ], [ 123.956408, 46.206009 ], [ 123.971806, 46.170379 ], [ 124.001987, 46.166649 ], [ 123.991516, 46.143019 ], [ 124.01677, 46.118549 ], [ 123.99398, 46.101123 ], [ 124.015538, 46.088257 ], [ 124.009995, 46.057534 ], [ 124.034016, 46.045074 ], [ 124.040176, 46.01973 ], [ 123.989053, 46.011833 ], [ 124.011842, 45.981899 ], [ 123.973654, 45.973997 ], [ 123.968727, 45.936551 ], [ 123.996444, 45.906993 ], [ 124.061118, 45.886168 ], [ 124.067277, 45.840325 ], [ 124.03648, 45.83824 ], [ 124.064197, 45.802372 ], [ 124.001987, 45.770655 ], [ 124.014922, 45.749779 ], [ 124.054342, 45.751449 ], [ 124.098074, 45.722628 ], [ 124.10177, 45.700898 ], [ 124.13503, 45.690448 ], [ 124.122096, 45.669123 ], [ 124.147349, 45.665359 ], [ 124.128255, 45.641933 ], [ 124.162132, 45.616404 ], [ 124.226805, 45.633564 ], [ 124.238508, 45.591702 ], [ 124.273001, 45.584163 ], [ 124.264377, 45.555256 ], [ 124.287783, 45.539329 ], [ 124.348761, 45.546874 ], [ 124.369087, 45.512915 ], [ 124.352457, 45.496557 ], [ 124.374015, 45.45795 ], [ 124.398652, 45.440737 ], [ 124.480572, 45.456271 ], [ 124.507058, 45.424778 ], [ 124.544014, 45.411756 ], [ 124.579738, 45.424358 ], [ 124.575427, 45.451234 ], [ 124.625318, 45.437377 ], [ 124.690607, 45.452493 ], [ 124.729412, 45.444096 ], [ 124.776223, 45.468024 ], [ 124.792853, 45.436958 ], [ 124.839665, 45.455852 ], [ 124.886476, 45.442836 ], [ 124.884628, 45.495299 ], [ 124.911114, 45.535976 ], [ 124.936983, 45.53388 ], [ 124.961005, 45.495299 ], [ 125.025678, 45.493201 ], [ 125.0497, 45.428558 ], [ 125.08912, 45.420998 ], [ 125.06633, 45.39915 ], [ 125.097127, 45.38276 ], [ 125.137779, 45.409655 ], [ 125.189518, 45.39915 ], [ 125.248649, 45.417637 ], [ 125.301619, 45.402092 ], [ 125.319482, 45.422678 ], [ 125.361981, 45.392847 ], [ 125.398322, 45.416797 ], [ 125.434662, 45.462988 ], [ 125.424807, 45.485649 ], [ 125.480242, 45.486488 ], [ 125.497488, 45.469283 ], [ 125.583104, 45.491942 ], [ 125.61698, 45.517947 ], [ 125.660096, 45.507043 ], [ 125.687813, 45.514173 ], [ 125.711835, 45.477677 ], [ 125.712451, 45.389485 ], [ 125.695205, 45.352066 ], [ 125.726001, 45.336503 ], [ 125.761726, 45.291472 ], [ 125.815929, 45.264942 ], [ 125.823936, 45.237978 ], [ 125.849805, 45.23882 ], [ 125.915095, 45.196664 ], [ 125.957595, 45.201303 ], [ 125.992703, 45.192447 ], [ 125.998247, 45.162072 ], [ 126.047522, 45.170933 ], [ 126.091869, 45.149411 ], [ 126.142992, 45.147723 ], [ 126.166398, 45.13337 ], [ 126.225528, 45.154054 ], [ 126.235383, 45.140125 ], [ 126.285274, 45.162494 ], [ 126.293282, 45.180214 ], [ 126.356107, 45.185698 ], [ 126.402919, 45.222805 ], [ 126.519331, 45.248091 ], [ 126.540273, 45.23882 ], [ 126.569222, 45.252725 ], [ 126.644983, 45.225334 ], [ 126.640055, 45.214373 ], [ 126.685635, 45.187807 ], [ 126.732446, 45.187385 ], [ 126.787265, 45.159118 ], [ 126.792808, 45.135481 ], [ 126.85625, 45.145613 ], [ 126.96404, 45.132104 ], [ 126.970815, 45.070852 ], [ 126.984981, 45.067893 ], [ 127.018242, 45.024341 ], [ 127.050271, 45.004034 ], [ 127.092771, 44.94688 ], [ 127.073061, 44.907051 ], [ 127.021938, 44.898997 ], [ 126.999764, 44.87398 ], [ 126.984366, 44.823914 ], [ 126.9973, 44.764882 ], [ 127.041032, 44.712169 ], [ 127.030561, 44.673454 ], [ 127.044112, 44.653874 ], [ 127.041648, 44.591258 ], [ 127.049655, 44.566961 ], [ 127.089691, 44.593816 ], [ 127.094619, 44.615972 ], [ 127.138966, 44.607451 ], [ 127.182082, 44.644507 ], [ 127.228893, 44.642804 ], [ 127.214111, 44.624917 ], [ 127.261538, 44.61299 ], [ 127.275705, 44.640249 ], [ 127.392733, 44.632158 ], [ 127.557189, 44.575488 ], [ 127.570124, 44.55033 ], [ 127.536247, 44.522176 ], [ 127.485124, 44.528576 ], [ 127.465414, 44.516628 ], [ 127.463566, 44.484615 ], [ 127.50853, 44.437202 ], [ 127.486356, 44.410275 ], [ 127.579363, 44.310581 ], [ 127.623711, 44.278025 ], [ 127.59045, 44.227872 ], [ 127.626174, 44.187977 ], [ 127.641573, 44.193555 ], [ 127.681609, 44.166946 ], [ 127.712406, 44.199133 ], [ 127.735811, 44.11412 ], [ 127.729036, 44.09908 ], [ 127.783239, 44.071997 ], [ 127.808492, 44.086615 ], [ 127.846065, 44.081886 ], [ 127.862695, 44.062967 ], [ 127.912586, 44.064687 ], [ 127.950158, 44.088334 ], [ 128.042549, 44.103807 ], [ 128.091208, 44.133022 ], [ 128.088129, 44.158359 ], [ 128.060411, 44.168663 ], [ 128.09244, 44.181539 ], [ 128.104143, 44.230017 ], [ 128.064107, 44.251454 ], [ 128.101679, 44.293449 ], [ 128.065339, 44.307155 ], [ 128.049941, 44.349965 ], [ 128.074578, 44.370075 ], [ 128.094904, 44.354673 ], [ 128.137404, 44.357668 ], [ 128.172512, 44.34697 ], [ 128.211317, 44.431647 ], [ 128.228563, 44.445748 ], [ 128.293237, 44.467961 ], [ 128.295084, 44.480772 ], [ 128.372693, 44.514495 ], [ 128.397946, 44.483761 ], [ 128.427511, 44.473512 ], [ 128.463236, 44.431647 ], [ 128.457076, 44.409848 ], [ 128.481714, 44.375637 ], [ 128.475555, 44.346114 ], [ 128.446605, 44.339694 ], [ 128.472475, 44.320001 ], [ 128.453997, 44.257884 ], [ 128.471859, 44.247596 ], [ 128.450301, 44.203423 ], [ 128.471859, 44.157501 ], [ 128.529141, 44.112401 ], [ 128.574721, 44.047914 ], [ 128.584576, 43.990246 ], [ 128.610445, 43.960529 ], [ 128.64001, 43.948035 ], [ 128.636315, 43.891132 ], [ 128.696061, 43.903207 ], [ 128.729938, 43.889838 ], [ 128.760734, 43.857482 ], [ 128.719467, 43.816905 ], [ 128.739177, 43.806972 ], [ 128.760119, 43.755554 ], [ 128.729322, 43.736964 ], [ 128.768126, 43.732207 ], [ 128.78722, 43.686784 ], [ 128.821097, 43.637429 ], [ 128.834647, 43.587599 ], [ 128.878379, 43.539898 ], [ 128.949828, 43.553779 ], [ 128.962763, 43.53903 ], [ 129.013886, 43.522976 ], [ 129.037907, 43.540332 ], [ 129.093958, 43.547706 ], [ 129.145081, 43.570258 ], [ 129.169102, 43.561585 ], [ 129.23008, 43.593234 ], [ 129.232544, 43.635263 ], [ 129.217146, 43.648689 ], [ 129.214066, 43.695006 ], [ 129.232544, 43.709284 ], [ 129.211602, 43.784509 ], [ 129.254718, 43.819496 ], [ 129.289826, 43.797038 ], [ 129.30892, 43.812155 ], [ 129.348341, 43.798333 ], [ 129.406855, 43.819496 ], [ 129.417942, 43.843672 ], [ 129.449971, 43.850578 ], [ 129.467833, 43.874741 ], [ 129.529427, 43.870427 ], [ 129.650767, 43.873016 ], [ 129.699426, 43.8838 ], [ 129.743158, 43.876035 ], [ 129.739462, 43.895876 ], [ 129.780114, 43.892857 ], [ 129.802904, 43.964837 ], [ 129.868193, 44.012631 ], [ 129.881128, 44.000148 ], [ 129.907614, 44.023821 ], [ 129.951345, 44.027263 ], [ 129.979062, 44.015644 ], [ 130.017867, 43.961821 ], [ 130.022794, 43.917866 ], [ 130.009243, 43.889407 ], [ 130.027722, 43.851872 ], [ 130.079461, 43.835039 ], [ 130.110873, 43.852735 ], [ 130.116417, 43.878192 ], [ 130.143518, 43.878624 ], [ 130.153373, 43.915711 ], [ 130.208192, 43.948466 ], [ 130.262395, 43.949328 ], [ 130.27225, 43.981634 ], [ 130.307358, 44.002731 ], [ 130.319061, 44.03974 ], [ 130.365256, 44.044042 ], [ 130.364025, 43.992399 ], [ 130.338155, 43.963975 ], [ 130.381887, 43.910106 ], [ 130.368336, 43.894151 ], [ 130.386198, 43.85403 ], [ 130.362793, 43.844967 ], [ 130.381887, 43.817768 ], [ 130.382503, 43.777164 ], [ 130.423155, 43.745179 ], [ 130.394206, 43.703227 ], [ 130.412684, 43.652586 ], [ 130.437937, 43.646091 ], [ 130.488444, 43.65605 ], [ 130.501995, 43.636563 ], [ 130.57098, 43.626167 ], [ 130.57098, 43.626167 ], [ 130.630726, 43.622268 ], [ 130.623335, 43.589767 ], [ 130.665835, 43.583698 ], [ 130.671378, 43.565054 ], [ 130.727429, 43.560284 ], [ 130.776704, 43.52341 ], [ 130.822899, 43.503446 ], [ 130.841378, 43.454374 ], [ 130.864167, 43.437863 ], [ 130.907283, 43.434387 ], [ 130.959638, 43.48608 ], [ 131.026775, 43.508655 ], [ 131.142572, 43.425695 ], [ 131.175217, 43.444816 ], [ 131.201086, 43.442209 ], [ 131.234963, 43.475224 ], [ 131.294093, 43.470012 ], [ 131.304564, 43.502144 ], [ 131.31873, 43.499539 ], [ 131.314419, 43.461325 ], [ 131.295941, 43.441774 ], [ 131.314419, 43.392653 ], [ 131.275615, 43.369165 ], [ 131.269455, 43.297775 ], [ 131.255289, 43.265099 ], [ 131.206014, 43.237202 ], [ 131.201086, 43.203185 ], [ 131.218948, 43.191405 ], [ 131.207861, 43.1316 ], [ 131.173985, 43.111506 ], [ 131.171521, 43.06955 ], [ 131.120398, 43.068238 ], [ 131.102536, 43.021002 ], [ 131.11855, 43.007875 ], [ 131.115471, 42.975482 ], [ 131.151195, 42.968475 ], [ 131.14442, 42.939566 ], [ 131.114855, 42.915027 ], [ 131.034167, 42.929051 ], [ 131.017536, 42.915027 ], [ 131.045869, 42.866796 ], [ 130.981812, 42.857145 ], [ 130.949783, 42.876884 ], [ 130.890653, 42.852758 ], [ 130.845073, 42.881269 ], [ 130.801957, 42.879515 ], [ 130.784095, 42.842227 ], [ 130.75453, 42.845738 ], [ 130.719422, 42.831695 ], [ 130.708335, 42.846615 ], [ 130.665835, 42.847932 ], [ 130.603625, 42.819405 ], [ 130.562357, 42.815015 ], [ 130.532792, 42.787352 ], [ 130.46627, 42.772417 ], [ 130.40714, 42.731548 ], [ 130.425003, 42.706926 ], [ 130.464423, 42.688453 ], [ 130.529096, 42.703408 ], [ 130.592538, 42.671295 ], [ 130.633806, 42.603494 ], [ 130.622719, 42.573092 ], [ 130.570364, 42.557224 ], [ 130.565437, 42.506509 ], [ 130.599929, 42.486211 ], [ 130.600545, 42.450453 ], [ 130.645509, 42.426603 ], [ 130.581451, 42.435437 ], [ 130.585763, 42.485328 ], [ 130.558661, 42.495919 ], [ 130.556198, 42.523712 ], [ 130.520473, 42.583228 ], [ 130.522937, 42.622433 ], [ 130.482285, 42.626837 ], [ 130.459495, 42.588075 ], [ 130.476125, 42.570007 ], [ 130.435474, 42.553257 ], [ 130.423771, 42.574855 ], [ 130.44656, 42.607459 ], [ 130.420691, 42.617148 ], [ 130.388046, 42.603054 ], [ 130.373264, 42.630799 ], [ 130.333228, 42.64973 ], [ 130.290112, 42.702968 ], [ 130.257467, 42.710884 ], [ 130.242069, 42.738582 ], [ 130.245148, 42.799209 ], [ 130.258083, 42.860655 ], [ 130.277793, 42.892232 ], [ 130.258083, 42.90626 ], [ 130.21004, 42.902315 ], [ 130.17062, 42.912397 ], [ 130.136127, 42.90363 ], [ 130.10225, 42.922916 ], [ 130.127504, 42.932556 ], [ 130.120729, 42.954461 ], [ 130.144134, 42.976357 ], [ 130.10841, 42.989929 ], [ 130.072685, 42.971541 ], [ 130.027106, 42.9676 ], [ 130.002468, 42.981174 ], [ 129.963664, 42.978547 ], [ 129.954425, 43.010938 ], [ 129.897143, 43.001748 ], [ 129.903918, 42.968475 ], [ 129.868193, 42.97373 ], [ 129.856491, 42.951833 ], [ 129.874969, 42.923792 ], [ 129.846636, 42.918533 ], [ 129.835549, 42.866796 ], [ 129.816454, 42.851003 ], [ 129.810911, 42.795257 ], [ 129.78381, 42.762752 ], [ 129.767179, 42.707806 ], [ 129.796744, 42.681854 ], [ 129.754245, 42.645768 ], [ 129.786889, 42.615387 ], [ 129.746237, 42.58455 ], [ 129.749933, 42.546644 ], [ 129.738846, 42.500332 ], [ 129.748701, 42.471204 ], [ 129.704354, 42.427045 ], [ 129.643991, 42.43102 ], [ 129.624281, 42.459284 ], [ 129.60026, 42.41114 ], [ 129.546057, 42.361632 ], [ 129.49863, 42.412023 ], [ 129.452434, 42.441179 ], [ 129.400695, 42.449128 ], [ 129.368051, 42.425719 ], [ 129.376058, 42.447803 ], [ 129.344029, 42.451777 ], [ 129.356348, 42.427045 ], [ 129.331094, 42.429695 ], [ 129.30892, 42.403628 ], [ 129.326167, 42.389927 ], [ 129.240551, 42.376223 ], [ 129.231312, 42.356325 ], [ 129.260261, 42.335536 ], [ 129.208522, 42.293052 ], [ 129.231312, 42.283755 ], [ 129.215914, 42.265157 ], [ 129.183269, 42.262056 ], [ 129.181421, 42.242122 ], [ 129.209138, 42.237692 ], [ 129.215914, 42.208442 ], [ 129.166639, 42.188047 ], [ 129.113668, 42.140583 ], [ 129.048378, 42.137476 ], [ 129.039139, 42.107736 ], [ 129.008958, 42.09175 ], [ 128.971386, 42.097079 ], [ 128.954755, 42.083756 ], [ 128.952908, 42.025545 ], [ 128.898089, 42.016653 ], [ 128.795227, 42.042436 ], [ 128.779213, 42.033546 ], [ 128.737945, 42.050435 ], [ 128.70222, 42.02021 ], [ 128.658489, 42.018876 ], [ 128.637547, 42.035324 ], [ 128.60675, 42.02999 ], [ 128.598127, 42.007315 ], [ 128.49896, 42.000644 ], [ 128.466316, 42.020654 ], [ 128.405338, 42.018876 ], [ 128.294468, 42.026434 ], [ 128.090593, 42.022877 ], [ 128.033926, 42.000199 ], [ 128.106607, 41.949923 ], [ 128.115846, 41.896935 ], [ 128.104143, 41.843457 ], [ 128.112766, 41.793504 ], [ 128.147875, 41.78101 ], [ 128.163889, 41.721628 ], [ 128.208853, 41.688565 ], [ 128.248889, 41.681414 ], [ 128.30186, 41.627756 ], [ 128.317874, 41.575844 ], [ 128.301244, 41.544498 ], [ 128.238418, 41.497898 ], [ 128.243345, 41.477276 ], [ 128.203925, 41.410882 ], [ 128.169433, 41.404149 ], [ 128.114614, 41.364186 ], [ 128.090593, 41.374516 ], [ 128.110919, 41.393375 ], [ 128.040085, 41.393375 ], [ 128.000049, 41.442741 ], [ 127.991426, 41.421204 ], [ 127.970484, 41.438704 ], [ 127.93168, 41.444984 ], [ 127.909506, 41.42973 ], [ 127.882405, 41.448124 ], [ 127.86947, 41.4037 ], [ 127.854688, 41.420755 ], [ 127.780159, 41.427038 ], [ 127.684073, 41.422999 ], [ 127.636645, 41.413575 ], [ 127.618783, 41.432871 ], [ 127.563964, 41.432871 ], [ 127.547334, 41.477276 ], [ 127.526392, 41.467859 ], [ 127.465414, 41.479069 ], [ 127.459255, 41.461581 ], [ 127.419835, 41.460235 ], [ 127.405668, 41.478621 ], [ 127.360088, 41.479518 ], [ 127.360704, 41.466065 ], [ 127.296031, 41.486243 ], [ 127.253531, 41.486691 ], [ 127.28864, 41.501932 ], [ 127.241212, 41.520754 ], [ 127.188241, 41.527475 ], [ 127.164836, 41.542706 ], [ 127.14143, 41.530163 ], [ 127.125416, 41.566442 ], [ 127.178386, 41.600015 ], [ 127.135887, 41.600463 ], [ 127.127263, 41.622388 ], [ 127.093387, 41.629993 ], [ 127.103242, 41.647883 ], [ 127.037952, 41.676944 ], [ 127.057662, 41.703758 ], [ 127.050887, 41.744852 ], [ 127.005923, 41.749317 ], [ 126.979438, 41.776993 ], [ 126.940018, 41.773423 ], [ 126.952953, 41.804212 ], [ 126.931395, 41.812687 ], [ 126.861178, 41.768067 ], [ 126.83962, 41.727435 ], [ 126.809439, 41.749317 ], [ 126.8002, 41.702865 ], [ 126.723207, 41.753335 ], [ 126.694874, 41.751103 ], [ 126.690562, 41.728328 ], [ 126.724439, 41.710907 ], [ 126.688099, 41.674262 ], [ 126.644983, 41.661297 ], [ 126.608027, 41.669345 ], [ 126.592628, 41.624624 ], [ 126.564295, 41.608965 ], [ 126.582773, 41.563307 ], [ 126.559983, 41.548081 ], [ 126.497158, 41.406842 ], [ 126.539041, 41.366881 ], [ 126.524259, 41.349362 ], [ 126.497158, 41.374965 ], [ 126.437411, 41.353405 ], [ 126.373354, 41.289133 ], [ 126.35426, 41.244599 ], [ 126.332086, 41.236949 ], [ 126.295129, 41.171661 ], [ 126.188572, 41.114875 ] ] ] ] } },\n{ \"type\": \"Feature\", \"properties\": { \"adcode\": \"230000\", \"name\": \"黑龙江省\", \"center\": [ 126.642464, 45.756967 ], \"centroid\": [ 127.693016, 48.04047 ], \"childrenNum\": 13, \"level\": \"province\", \"parent\": { \"adcode\": 100000 }, \"subFeatureIndex\": 7, \"acroutes\": [ 100000 ] }, \"geometry\": { \"type\": \"MultiPolygon\", \"coordinates\": [ [ [ [ 123.569598, 46.223816 ], [ 123.569598, 46.223816 ], [ 123.499381, 46.259826 ], [ 123.452569, 46.233338 ], [ 123.430396, 46.243687 ], [ 123.357099, 46.232096 ], [ 123.357099, 46.232096 ], [ 123.320758, 46.254447 ], [ 123.286266, 46.250308 ], [ 123.248078, 46.273065 ], [ 123.178476, 46.248239 ], [ 123.142136, 46.298293 ], [ 123.089781, 46.347888 ], [ 123.011557, 46.434984 ], [ 123.010325, 46.524823 ], [ 123.002318, 46.574624 ], [ 123.052825, 46.579972 ], [ 123.04605, 46.617803 ], [ 123.077462, 46.622324 ], [ 123.098404, 46.603002 ], [ 123.18094, 46.614103 ], [ 123.228368, 46.588198 ], [ 123.279491, 46.616981 ], [ 123.276411, 46.660947 ], [ 123.318295, 46.662179 ], [ 123.366338, 46.677784 ], [ 123.474743, 46.686817 ], [ 123.603475, 46.68928 ], [ 123.631808, 46.728675 ], [ 123.629344, 46.813524 ], [ 123.580069, 46.827447 ], [ 123.625648, 46.847508 ], [ 123.599163, 46.868378 ], [ 123.605322, 46.891286 ], [ 123.576989, 46.891286 ], [ 123.575757, 46.845461 ], [ 123.562823, 46.82581 ], [ 123.506772, 46.827038 ], [ 123.483366, 46.84587 ], [ 123.52833, 46.944836 ], [ 123.487678, 46.959951 ], [ 123.42362, 46.934212 ], [ 123.337389, 46.988943 ], [ 123.301664, 46.999965 ], [ 123.304128, 46.964852 ], [ 123.360179, 46.970978 ], [ 123.404526, 46.935438 ], [ 123.40699, 46.906416 ], [ 123.374345, 46.837683 ], [ 123.341084, 46.826628 ], [ 123.295505, 46.865105 ], [ 123.221592, 46.850373 ], [ 123.22344, 46.821305 ], [ 123.198802, 46.803283 ], [ 123.163694, 46.74016 ], [ 123.103332, 46.734828 ], [ 123.076846, 46.745082 ], [ 123.026339, 46.718829 ], [ 123.00355, 46.730726 ], [ 122.996774, 46.761483 ], [ 122.906847, 46.80738 ], [ 122.893913, 46.895376 ], [ 122.895144, 46.960359 ], [ 122.83971, 46.937072 ], [ 122.791051, 46.941567 ], [ 122.798442, 46.9575 ], [ 122.77442, 46.973837 ], [ 122.778116, 47.002822 ], [ 122.845869, 47.046881 ], [ 122.852645, 47.072158 ], [ 122.821232, 47.065636 ], [ 122.710363, 47.093349 ], [ 122.710363, 47.093349 ], [ 122.679566, 47.094164 ], [ 122.615508, 47.124306 ], [ 122.582863, 47.158092 ], [ 122.582863, 47.158092 ], [ 122.531124, 47.198771 ], [ 122.498479, 47.255262 ], [ 122.462755, 47.27841 ], [ 122.441197, 47.310476 ], [ 122.441197, 47.310476 ], [ 122.418407, 47.350632 ], [ 122.507103, 47.401291 ], [ 122.543443, 47.495589 ], [ 122.59395, 47.54732 ], [ 122.765181, 47.614333 ], [ 122.848949, 47.67441 ], [ 122.926557, 47.697777 ], [ 123.041122, 47.746492 ], [ 123.161846, 47.781892 ], [ 123.214201, 47.824502 ], [ 123.256085, 47.876711 ], [ 123.300432, 47.953723 ], [ 123.537569, 48.021816 ], [ 123.579453, 48.045427 ], [ 123.705105, 48.152142 ], [ 123.746373, 48.197638 ], [ 123.862785, 48.271782 ], [ 124.019234, 48.39313 ], [ 124.07898, 48.43603 ], [ 124.136878, 48.463023 ], [ 124.25945, 48.536385 ], [ 124.25945, 48.536385 ], [ 124.314269, 48.503881 ], [ 124.302566, 48.456673 ], [ 124.330283, 48.435633 ], [ 124.309957, 48.413393 ], [ 124.331515, 48.380015 ], [ 124.317964, 48.35099 ], [ 124.353689, 48.315978 ], [ 124.365392, 48.283731 ], [ 124.422058, 48.245884 ], [ 124.412819, 48.219175 ], [ 124.418978, 48.181679 ], [ 124.467637, 48.178886 ], [ 124.471333, 48.133373 ], [ 124.430065, 48.12099 ], [ 124.415899, 48.08782 ], [ 124.46579, 48.098213 ], [ 124.478108, 48.123387 ], [ 124.505826, 48.124985 ], [ 124.529847, 48.146951 ], [ 124.512601, 48.164518 ], [ 124.547094, 48.200829 ], [ 124.579122, 48.262221 ], [ 124.558796, 48.268197 ], [ 124.579738, 48.297269 ], [ 124.540934, 48.335476 ], [ 124.547094, 48.35775 ], [ 124.51876, 48.378027 ], [ 124.52492, 48.426897 ], [ 124.507674, 48.445558 ], [ 124.555717, 48.467784 ], [ 124.533543, 48.515379 ], [ 124.548941, 48.535593 ], [ 124.520608, 48.556195 ], [ 124.579122, 48.596582 ], [ 124.601912, 48.632587 ], [ 124.624702, 48.701755 ], [ 124.612383, 48.747945 ], [ 124.656115, 48.783842 ], [ 124.644412, 48.80789 ], [ 124.654267, 48.83429 ], [ 124.697383, 48.841775 ], [ 124.715861, 48.885475 ], [ 124.709086, 48.920487 ], [ 124.744194, 48.920487 ], [ 124.756513, 48.967262 ], [ 124.808252, 49.020666 ], [ 124.828578, 49.077933 ], [ 124.809484, 49.115943 ], [ 124.847672, 49.129651 ], [ 124.860607, 49.166448 ], [ 124.906802, 49.184054 ], [ 124.983179, 49.162535 ], [ 125.039845, 49.17623 ], [ 125.034302, 49.157056 ], [ 125.117453, 49.126127 ], [ 125.158721, 49.144921 ], [ 125.187671, 49.186792 ], [ 125.219699, 49.189139 ], [ 125.233866, 49.255587 ], [ 125.214772, 49.277066 ], [ 125.261583, 49.322336 ], [ 125.256656, 49.359769 ], [ 125.277598, 49.379644 ], [ 125.25604, 49.395227 ], [ 125.256656, 49.437275 ], [ 125.270822, 49.454395 ], [ 125.228323, 49.487063 ], [ 125.211076, 49.539908 ], [ 125.233866, 49.536801 ], [ 125.23017, 49.595411 ], [ 125.205533, 49.593859 ], [ 125.16796, 49.629923 ], [ 125.15441, 49.616741 ], [ 125.127308, 49.655113 ], [ 125.132236, 49.672157 ], [ 125.164881, 49.669446 ], [ 125.189518, 49.652401 ], [ 125.185207, 49.634574 ], [ 125.219699, 49.669058 ], [ 125.225243, 49.726349 ], [ 125.204301, 49.734086 ], [ 125.221547, 49.754969 ], [ 125.222779, 49.799026 ], [ 125.177815, 49.829533 ], [ 125.239409, 49.844587 ], [ 125.225243, 49.867351 ], [ 125.245569, 49.87198 ], [ 125.212924, 49.907452 ], [ 125.225859, 49.922481 ], [ 125.199373, 49.935194 ], [ 125.190134, 49.959841 ], [ 125.231402, 49.957531 ], [ 125.241873, 49.987938 ], [ 125.278214, 49.996402 ], [ 125.297924, 50.014481 ], [ 125.283757, 50.036012 ], [ 125.25296, 50.041393 ], [ 125.289916, 50.057917 ], [ 125.315786, 50.04562 ], [ 125.328105, 50.065985 ], [ 125.283757, 50.070211 ], [ 125.287453, 50.093636 ], [ 125.258504, 50.103618 ], [ 125.27883, 50.127411 ], [ 125.311474, 50.140453 ], [ 125.376148, 50.137385 ], [ 125.335496, 50.161161 ], [ 125.382923, 50.172278 ], [ 125.39093, 50.199868 ], [ 125.417416, 50.195654 ], [ 125.448829, 50.216338 ], [ 125.442053, 50.260357 ], [ 125.466075, 50.266861 ], [ 125.463611, 50.295925 ], [ 125.530749, 50.331085 ], [ 125.520278, 50.3498 ], [ 125.546763, 50.358965 ], [ 125.522126, 50.404759 ], [ 125.536292, 50.420014 ], [ 125.567089, 50.402852 ], [ 125.583104, 50.409717 ], [ 125.562162, 50.438314 ], [ 125.580024, 50.449366 ], [ 125.627451, 50.443268 ], [ 125.654553, 50.471082 ], [ 125.699516, 50.487078 ], [ 125.740784, 50.523237 ], [ 125.754335, 50.506874 ], [ 125.770349, 50.531227 ], [ 125.794987, 50.532748 ], [ 125.829479, 50.56165 ], [ 125.807921, 50.60383 ], [ 125.814697, 50.62092 ], [ 125.793139, 50.643316 ], [ 125.804226, 50.658874 ], [ 125.789443, 50.679735 ], [ 125.825784, 50.70362 ], [ 125.78082, 50.725598 ], [ 125.795603, 50.738856 ], [ 125.758646, 50.746809 ], [ 125.804226, 50.773309 ], [ 125.828863, 50.756654 ], [ 125.846726, 50.769524 ], [ 125.836255, 50.793363 ], [ 125.890457, 50.805845 ], [ 125.878138, 50.816812 ], [ 125.913247, 50.825885 ], [ 125.939732, 50.85423 ], [ 125.961906, 50.901054 ], [ 125.997631, 50.872738 ], [ 125.996399, 50.906715 ], [ 126.02042, 50.927466 ], [ 126.042594, 50.92558 ], [ 126.068464, 50.967434 ], [ 126.041978, 50.981753 ], [ 126.033971, 51.011132 ], [ 126.059225, 51.043503 ], [ 125.976073, 51.084498 ], [ 125.993935, 51.119072 ], [ 125.970529, 51.123955 ], [ 125.946508, 51.108176 ], [ 125.909551, 51.138977 ], [ 125.864588, 51.146487 ], [ 125.850421, 51.21364 ], [ 125.819008, 51.227134 ], [ 125.761726, 51.226385 ], [ 125.76111, 51.261976 ], [ 125.76111, 51.261976 ], [ 125.740784, 51.27583 ], [ 125.740784, 51.27583 ], [ 125.700132, 51.327465 ], [ 125.700132, 51.327465 ], [ 125.626219, 51.380163 ], [ 125.626219, 51.380163 ], [ 125.623756, 51.387633 ], [ 125.623756, 51.387633 ], [ 125.62314, 51.398089 ], [ 125.62314, 51.398089 ], [ 125.600966, 51.410409 ], [ 125.600966, 51.410409 ], [ 125.60035, 51.413396 ], [ 125.60035, 51.413396 ], [ 125.595422, 51.416755 ], [ 125.595422, 51.416755 ], [ 125.559082, 51.461521 ], [ 125.559082, 51.461521 ], [ 125.528285, 51.488359 ], [ 125.424807, 51.562827 ], [ 125.38046, 51.585516 ], [ 125.35151, 51.623801 ], [ 125.316402, 51.610052 ], [ 125.289301, 51.633831 ], [ 125.228938, 51.640517 ], [ 125.214772, 51.627888 ], [ 125.175968, 51.639403 ], [ 125.130388, 51.635317 ], [ 125.12854, 51.659083 ], [ 125.098975, 51.658341 ], [ 125.060171, 51.59667 ], [ 125.073106, 51.553526 ], [ 125.047236, 51.529704 ], [ 125.004737, 51.529332 ], [ 124.983795, 51.508478 ], [ 124.928976, 51.498419 ], [ 124.917889, 51.474196 ], [ 124.942527, 51.447349 ], [ 124.885244, 51.40817 ], [ 124.864302, 51.37979 ], [ 124.783614, 51.392115 ], [ 124.76452, 51.38726 ], [ 124.752817, 51.35812 ], [ 124.693687, 51.3327 ], [ 124.62655, 51.327465 ], [ 124.58713, 51.363725 ], [ 124.555717, 51.375307 ], [ 124.490427, 51.380537 ], [ 124.478108, 51.36223 ], [ 124.443616, 51.35812 ], [ 124.426985, 51.331953 ], [ 124.430065, 51.301281 ], [ 124.406659, 51.272086 ], [ 124.339522, 51.293422 ], [ 124.297638, 51.298661 ], [ 124.271769, 51.308389 ], [ 124.239124, 51.344664 ], [ 124.192313, 51.33943 ], [ 124.128255, 51.347281 ], [ 124.090067, 51.3413 ], [ 124.071588, 51.320734 ], [ 123.994596, 51.322604 ], [ 123.939777, 51.313253 ], [ 123.926227, 51.300532 ], [ 123.887423, 51.320734 ], [ 123.842459, 51.367462 ], [ 123.794416, 51.361109 ], [ 123.711264, 51.398089 ], [ 123.660141, 51.342795 ], [ 123.661989, 51.319237 ], [ 123.582533, 51.306893 ], [ 123.582533, 51.294545 ], [ 123.46304, 51.286686 ], [ 123.440251, 51.270963 ], [ 123.414381, 51.278825 ], [ 123.376809, 51.266844 ], [ 123.339853, 51.27246 ], [ 123.294273, 51.254111 ], [ 123.231447, 51.268716 ], [ 123.231447, 51.279199 ], [ 123.127969, 51.297913 ], [ 123.069455, 51.321108 ], [ 123.002934, 51.31213 ], [ 122.965977, 51.345786 ], [ 122.965977, 51.386886 ], [ 122.946267, 51.405183 ], [ 122.903768, 51.415262 ], [ 122.900072, 51.445112 ], [ 122.871123, 51.455181 ], [ 122.854492, 51.477551 ], [ 122.880362, 51.511085 ], [ 122.858804, 51.524864 ], [ 122.880362, 51.537894 ], [ 122.874202, 51.561339 ], [ 122.832935, 51.581797 ], [ 122.85634, 51.606707 ], [ 122.820616, 51.633088 ], [ 122.816304, 51.655371 ], [ 122.778732, 51.698048 ], [ 122.749167, 51.746613 ], [ 122.771957, 51.779579 ], [ 122.732536, 51.832495 ], [ 122.725761, 51.87833 ], [ 122.706051, 51.890151 ], [ 122.729457, 51.919321 ], [ 122.726377, 51.978709 ], [ 122.683877, 51.974654 ], [ 122.664783, 51.99861 ], [ 122.650616, 52.058997 ], [ 122.625363, 52.067459 ], [ 122.643841, 52.111585 ], [ 122.629059, 52.13657 ], [ 122.690653, 52.140243 ], [ 122.73808, 52.153464 ], [ 122.769493, 52.179893 ], [ 122.766413, 52.232705 ], [ 122.787355, 52.252494 ], [ 122.76087, 52.26678 ], [ 122.710979, 52.256157 ], [ 122.67895, 52.276667 ], [ 122.585943, 52.266413 ], [ 122.560689, 52.282526 ], [ 122.478153, 52.29607 ], [ 122.484313, 52.341432 ], [ 122.447356, 52.394052 ], [ 122.419023, 52.375057 ], [ 122.378987, 52.395512 ], [ 122.367284, 52.413768 ], [ 122.342031, 52.414133 ], [ 122.326016, 52.459374 ], [ 122.310618, 52.475416 ], [ 122.207756, 52.469218 ], [ 122.178191, 52.48963 ], [ 122.168952, 52.513674 ], [ 122.140003, 52.510032 ], [ 122.142467, 52.495096 ], [ 122.107358, 52.452445 ], [ 122.080873, 52.440407 ], [ 122.091344, 52.427272 ], [ 122.040837, 52.413038 ], [ 122.035909, 52.377615 ], [ 121.976779, 52.343626 ], [ 121.94783, 52.298266 ], [ 121.901018, 52.280695 ], [ 121.841272, 52.282526 ], [ 121.769207, 52.308147 ], [ 121.714389, 52.318025 ], [ 121.715621, 52.342894 ], [ 121.658338, 52.3904 ], [ 121.678664, 52.419973 ], [ 121.63986, 52.44442 ], [ 121.590585, 52.443326 ], [ 121.565331, 52.460468 ], [ 121.519136, 52.456821 ], [ 121.495114, 52.484892 ], [ 121.474172, 52.482706 ], [ 121.416274, 52.499468 ], [ 121.411963, 52.52205 ], [ 121.353448, 52.534793 ], [ 121.323883, 52.573727 ], [ 121.280151, 52.586819 ], [ 121.225333, 52.577364 ], [ 121.182217, 52.59918 ], [ 121.237036, 52.619167 ], [ 121.29247, 52.651855 ], [ 121.309717, 52.676173 ], [ 121.373158, 52.683067 ], [ 121.455078, 52.73528 ], [ 121.476636, 52.772225 ], [ 121.511129, 52.779104 ], [ 121.537614, 52.801542 ], [ 121.591201, 52.824693 ], [ 121.620766, 52.853251 ], [ 121.604136, 52.872401 ], [ 121.610295, 52.892264 ], [ 121.66265, 52.912478 ], [ 121.677432, 52.948192 ], [ 121.715621, 52.997926 ], [ 121.785838, 53.018451 ], [ 121.817867, 53.061631 ], [ 121.775367, 53.089674 ], [ 121.784606, 53.104408 ], [ 121.753193, 53.147501 ], [ 121.722396, 53.145706 ], [ 121.665114, 53.170467 ], [ 121.660186, 53.195213 ], [ 121.67928, 53.199515 ], [ 121.679896, 53.240722 ], [ 121.642324, 53.262564 ], [ 121.615222, 53.258984 ], [ 121.575802, 53.29155 ], [ 121.504969, 53.323018 ], [ 121.499426, 53.337314 ], [ 121.589969, 53.350891 ], [ 121.697758, 53.392666 ], [ 121.754425, 53.389454 ], [ 121.816019, 53.41336 ], [ 121.875765, 53.426556 ], [ 122.026054, 53.428339 ], [ 122.077177, 53.422277 ], [ 122.111054, 53.426913 ], [ 122.161561, 53.468614 ], [ 122.227466, 53.461845 ], [ 122.266886, 53.470039 ], [ 122.350038, 53.505647 ], [ 122.37406, 53.47467 ], [ 122.435038, 53.444739 ], [ 122.496016, 53.458638 ], [ 122.5379, 53.453293 ], [ 122.608117, 53.465408 ], [ 122.673406, 53.459351 ], [ 122.763949, 53.463626 ], [ 122.826775, 53.457213 ], [ 122.894528, 53.462914 ], [ 122.943804, 53.483929 ], [ 123.052209, 53.506715 ], [ 123.093477, 53.508138 ], [ 123.137209, 53.498172 ], [ 123.179092, 53.509918 ], [ 123.231447, 53.549404 ], [ 123.274563, 53.563269 ], [ 123.309672, 53.56078 ], [ 123.394055, 53.538024 ], [ 123.454417, 53.536602 ], [ 123.47228, 53.509206 ], [ 123.499381, 53.497816 ], [ 123.510468, 53.509206 ], [ 123.490758, 53.542648 ], [ 123.517243, 53.558292 ], [ 123.546808, 53.551537 ], [ 123.557895, 53.531978 ], [ 123.53141, 53.507071 ], [ 123.569598, 53.505291 ], [ 123.58746, 53.546915 ], [ 123.620721, 53.550115 ], [ 123.668764, 53.533756 ], [ 123.698329, 53.498528 ], [ 123.746373, 53.500308 ], [ 123.797495, 53.489983 ], [ 123.865249, 53.489627 ], [ 123.985973, 53.434401 ], [ 124.01369, 53.403371 ], [ 124.058038, 53.404085 ], [ 124.125791, 53.348033 ], [ 124.19416, 53.37339 ], [ 124.239124, 53.379817 ], [ 124.327819, 53.331954 ], [ 124.375863, 53.258984 ], [ 124.412203, 53.248601 ], [ 124.435609, 53.223886 ], [ 124.487348, 53.217436 ], [ 124.496587, 53.207759 ], [ 124.563108, 53.201666 ], [ 124.590209, 53.208476 ], [ 124.678905, 53.207043 ], [ 124.720789, 53.192344 ], [ 124.712165, 53.162574 ], [ 124.734339, 53.146783 ], [ 124.787926, 53.140681 ], [ 124.832889, 53.145347 ], [ 124.87231, 53.099018 ], [ 124.909266, 53.118059 ], [ 124.887708, 53.164368 ], [ 124.970244, 53.194137 ], [ 125.038613, 53.202741 ], [ 125.142091, 53.204175 ], [ 125.195062, 53.198439 ], [ 125.252344, 53.18051 ], [ 125.315786, 53.144989 ], [ 125.343503, 53.14463 ], [ 125.452524, 53.107641 ], [ 125.503647, 53.095424 ], [ 125.504263, 53.061271 ], [ 125.530749, 53.0512 ], [ 125.588647, 53.081047 ], [ 125.613901, 53.083564 ], [ 125.640386, 53.06199 ], [ 125.643466, 53.039686 ], [ 125.684118, 53.00801 ], [ 125.742632, 52.993964 ], [ 125.737088, 52.943504 ], [ 125.665023, 52.913561 ], [ 125.666871, 52.869872 ], [ 125.678574, 52.86084 ], [ 125.722306, 52.880347 ], [ 125.751255, 52.88143 ], [ 125.772197, 52.89804 ], [ 125.827631, 52.899123 ], [ 125.854117, 52.891542 ], [ 125.855349, 52.866259 ], [ 125.923718, 52.815651 ], [ 125.937269, 52.786705 ], [ 125.966834, 52.759914 ], [ 125.985312, 52.758465 ], [ 126.02042, 52.795753 ], [ 126.052449, 52.800095 ], [ 126.116507, 52.768243 ], [ 126.112195, 52.757016 ], [ 126.044442, 52.739628 ], [ 126.072775, 52.691048 ], [ 126.061688, 52.673271 ], [ 125.995783, 52.675085 ], [ 125.971145, 52.654033 ], [ 125.968682, 52.630429 ], [ 125.989008, 52.603178 ], [ 126.030891, 52.576273 ], [ 126.055529, 52.582455 ], [ 126.066616, 52.603905 ], [ 126.147304, 52.573 ], [ 126.213209, 52.525327 ], [ 126.192883, 52.492181 ], [ 126.205202, 52.466302 ], [ 126.268644, 52.475051 ], [ 126.326542, 52.424353 ], [ 126.353644, 52.389304 ], [ 126.348716, 52.357882 ], [ 126.320999, 52.342163 ], [ 126.327774, 52.310342 ], [ 126.4331, 52.298632 ], [ 126.436795, 52.277034 ], [ 126.401071, 52.279597 ], [ 126.357955, 52.264216 ], [ 126.312992, 52.235271 ], [ 126.306832, 52.205574 ], [ 126.34502, 52.192002 ], [ 126.403535, 52.185031 ], [ 126.457121, 52.165212 ], [ 126.499005, 52.16044 ], [ 126.556288, 52.136203 ], [ 126.563679, 52.119302 ], [ 126.514404, 52.037282 ], [ 126.487918, 52.041699 ], [ 126.450962, 52.027709 ], [ 126.447882, 52.009294 ], [ 126.468208, 51.982395 ], [ 126.462665, 51.948471 ], [ 126.510092, 51.922274 ], [ 126.555056, 51.874266 ], [ 126.580925, 51.824728 ], [ 126.622809, 51.777357 ], [ 126.658534, 51.762544 ], [ 126.6727, 51.73179 ], [ 126.724439, 51.7266 ], [ 126.734294, 51.711399 ], [ 126.723823, 51.679126 ], [ 126.741069, 51.642374 ], [ 126.67886, 51.602246 ], [ 126.69549, 51.57845 ], [ 126.837156, 51.536033 ], [ 126.843931, 51.521885 ], [ 126.812518, 51.493948 ], [ 126.784185, 51.448095 ], [ 126.791577, 51.432428 ], [ 126.835308, 51.413769 ], [ 126.908605, 51.407423 ], [ 126.930163, 51.359241 ], [ 126.904293, 51.340552 ], [ 126.837156, 51.345038 ], [ 126.813134, 51.311756 ], [ 126.820526, 51.281071 ], [ 126.863025, 51.248492 ], [ 126.908605, 51.246619 ], [ 126.92154, 51.259729 ], [ 126.908605, 51.283691 ], [ 126.877808, 51.300906 ], [ 126.887047, 51.321856 ], [ 126.970815, 51.332327 ], [ 126.98375, 51.318863 ], [ 126.976358, 51.291551 ], [ 126.926467, 51.246244 ], [ 126.899982, 51.200518 ], [ 126.917844, 51.138977 ], [ 126.922772, 51.061937 ], [ 126.985597, 51.029202 ], [ 127.052119, 50.962911 ], [ 127.113713, 50.93765 ], [ 127.143894, 50.910111 ], [ 127.236285, 50.781256 ], [ 127.295415, 50.755139 ], [ 127.305886, 50.733932 ], [ 127.28864, 50.699451 ], [ 127.294799, 50.663426 ], [ 127.370559, 50.581415 ], [ 127.36132, 50.547582 ], [ 127.323132, 50.52552 ], [ 127.293567, 50.46575 ], [ 127.30527, 50.45432 ], [ 127.3644, 50.438314 ], [ 127.369944, 50.403996 ], [ 127.332371, 50.340634 ], [ 127.371791, 50.29669 ], [ 127.44632, 50.270686 ], [ 127.603385, 50.239309 ], [ 127.60708, 50.178794 ], [ 127.58737, 50.137768 ], [ 127.501755, 50.056764 ], [ 127.495595, 49.994479 ], [ 127.543638, 49.944438 ], [ 127.547334, 49.928645 ], [ 127.529472, 49.864265 ], [ 127.531936, 49.826059 ], [ 127.583059, 49.786277 ], [ 127.653892, 49.780094 ], [ 127.674833, 49.764247 ], [ 127.677913, 49.697712 ], [ 127.705015, 49.665185 ], [ 127.782007, 49.630698 ], [ 127.815268, 49.593859 ], [ 127.897804, 49.579116 ], [ 127.949542, 49.596187 ], [ 128.001281, 49.592307 ], [ 128.070882, 49.556604 ], [ 128.122005, 49.55311 ], [ 128.185447, 49.53952 ], [ 128.243345, 49.563203 ], [ 128.287077, 49.566309 ], [ 128.343128, 49.544956 ], [ 128.389939, 49.58998 ], [ 128.500192, 49.593859 ], [ 128.537764, 49.604332 ], [ 128.619684, 49.593471 ], [ 128.656025, 49.577564 ], [ 128.715155, 49.564756 ], [ 128.744104, 49.595023 ], [ 128.802618, 49.58222 ], [ 128.813089, 49.558157 ], [ 128.763198, 49.515824 ], [ 128.76135, 49.482009 ], [ 128.792147, 49.473065 ], [ 128.871604, 49.492506 ], [ 128.932582, 49.46801 ], [ 129.013886, 49.457119 ], [ 129.061929, 49.374189 ], [ 129.084719, 49.359769 ], [ 129.143849, 49.357431 ], [ 129.180805, 49.386657 ], [ 129.215298, 49.399122 ], [ 129.266421, 49.396006 ], [ 129.320623, 49.3586 ], [ 129.358196, 49.355871 ], [ 129.379138, 49.367175 ], [ 129.374826, 49.414309 ], [ 129.390224, 49.432605 ], [ 129.448739, 49.441167 ], [ 129.51834, 49.423652 ], [ 129.546057, 49.395227 ], [ 129.562687, 49.299706 ], [ 129.604571, 49.279018 ], [ 129.696962, 49.298535 ], [ 129.730223, 49.288387 ], [ 129.761636, 49.25754 ], [ 129.753629, 49.208692 ], [ 129.784426, 49.184054 ], [ 129.847867, 49.181316 ], [ 129.864498, 49.158621 ], [ 129.855259, 49.133567 ], [ 129.866962, 49.113985 ], [ 129.913157, 49.1085 ], [ 129.934715, 49.078717 ], [ 129.9187, 49.060681 ], [ 129.937179, 49.040285 ], [ 130.020946, 49.021058 ], [ 130.059135, 48.979047 ], [ 130.113337, 48.956653 ], [ 130.219895, 48.893739 ], [ 130.237757, 48.868551 ], [ 130.279641, 48.866976 ], [ 130.412068, 48.905148 ], [ 130.471198, 48.905541 ], [ 130.501995, 48.865795 ], [ 130.559277, 48.861071 ], [ 130.609168, 48.881146 ], [ 130.680617, 48.881146 ], [ 130.689856, 48.849651 ], [ 130.622103, 48.783842 ], [ 130.576524, 48.688719 ], [ 130.538951, 48.635751 ], [ 130.538335, 48.612016 ], [ 130.605473, 48.594207 ], [ 130.615944, 48.575601 ], [ 130.620871, 48.49595 ], [ 130.647357, 48.484844 ], [ 130.711414, 48.511414 ], [ 130.767465, 48.507846 ], [ 130.776704, 48.480084 ], [ 130.745907, 48.449131 ], [ 130.747755, 48.404256 ], [ 130.785327, 48.357353 ], [ 130.81982, 48.341444 ], [ 130.845073, 48.296473 ], [ 130.817972, 48.265409 ], [ 130.787791, 48.256643 ], [ 130.769313, 48.231136 ], [ 130.765617, 48.18926 ], [ 130.673842, 48.12818 ], [ 130.666451, 48.105007 ], [ 130.699711, 48.044227 ], [ 130.737284, 48.034223 ], [ 130.770544, 47.998194 ], [ 130.870943, 47.943301 ], [ 130.891269, 47.927263 ], [ 130.961486, 47.828118 ], [ 130.966413, 47.733211 ], [ 130.983659, 47.713081 ], [ 131.029855, 47.694555 ], [ 131.115471, 47.689721 ], [ 131.183224, 47.702611 ], [ 131.236811, 47.733211 ], [ 131.273767, 47.738846 ], [ 131.359998, 47.730796 ], [ 131.456085, 47.747297 ], [ 131.543548, 47.736028 ], [ 131.559563, 47.724757 ], [ 131.568186, 47.682469 ], [ 131.59036, 47.660707 ], [ 131.641483, 47.663932 ], [ 131.690142, 47.707041 ], [ 131.741881, 47.706638 ], [ 131.825649, 47.677231 ], [ 131.900793, 47.685692 ], [ 131.976554, 47.673201 ], [ 132.000575, 47.712276 ], [ 132.086191, 47.703013 ], [ 132.157024, 47.70543 ], [ 132.19706, 47.714289 ], [ 132.242639, 47.70986 ], [ 132.272205, 47.718718 ], [ 132.288835, 47.742065 ], [ 132.325175, 47.762184 ], [ 132.371987, 47.765402 ], [ 132.469305, 47.726368 ], [ 132.558, 47.718316 ], [ 132.6005, 47.740858 ], [ 132.599268, 47.792347 ], [ 132.621442, 47.82852 ], [ 132.662094, 47.854227 ], [ 132.687348, 47.88514 ], [ 132.662094, 47.922451 ], [ 132.661478, 47.944905 ], [ 132.691043, 47.962941 ], [ 132.723072, 47.962941 ], [ 132.769268, 47.93849 ], [ 132.819159, 47.936887 ], [ 132.883216, 48.002599 ], [ 132.992238, 48.035424 ], [ 133.016259, 48.054228 ], [ 133.02673, 48.085421 ], [ 133.053216, 48.110202 ], [ 133.130208, 48.134971 ], [ 133.182563, 48.135769 ], [ 133.239845, 48.126583 ], [ 133.302055, 48.103009 ], [ 133.407997, 48.124585 ], [ 133.451728, 48.112999 ], [ 133.545967, 48.121389 ], [ 133.573068, 48.182078 ], [ 133.59709, 48.194846 ], [ 133.667307, 48.183275 ], [ 133.693177, 48.186866 ], [ 133.740604, 48.254651 ], [ 133.791111, 48.261026 ], [ 133.824372, 48.277359 ], [ 133.876111, 48.282536 ], [ 133.940784, 48.302047 ], [ 133.995603, 48.303639 ], [ 134.029479, 48.327519 ], [ 134.0689, 48.338659 ], [ 134.116327, 48.333089 ], [ 134.150819, 48.346217 ], [ 134.20379, 48.3824 ], [ 134.369478, 48.382797 ], [ 134.438463, 48.405448 ], [ 134.501905, 48.418954 ], [ 134.578281, 48.405448 ], [ 134.696542, 48.407037 ], [ 134.764295, 48.370076 ], [ 134.820961, 48.37604 ], [ 134.848679, 48.393925 ], [ 134.886867, 48.437618 ], [ 134.927519, 48.451513 ], [ 134.996504, 48.439603 ], [ 135.035924, 48.440795 ], [ 135.068569, 48.459451 ], [ 135.09567, 48.437618 ], [ 135.090743, 48.403461 ], [ 135.009439, 48.365703 ], [ 134.864077, 48.332293 ], [ 134.77107, 48.288908 ], [ 134.679295, 48.256245 ], [ 134.67252, 48.170505 ], [ 134.632484, 48.099412 ], [ 134.551796, 48.032622 ], [ 134.55426, 47.982173 ], [ 134.599839, 47.947711 ], [ 134.607846, 47.909214 ], [ 134.658969, 47.901191 ], [ 134.677448, 47.884738 ], [ 134.670056, 47.864667 ], [ 134.678679, 47.819278 ], [ 134.772918, 47.763391 ], [ 134.779694, 47.7159 ], [ 134.689766, 47.63813 ], [ 134.678064, 47.588507 ], [ 134.627556, 47.546512 ], [ 134.576434, 47.519036 ], [ 134.568426, 47.478199 ], [ 134.522847, 47.468086 ], [ 134.490202, 47.446235 ], [ 134.339297, 47.439759 ], [ 134.307268, 47.428829 ], [ 134.266616, 47.391974 ], [ 134.263536, 47.371307 ], [ 134.203174, 47.347389 ], [ 134.177305, 47.326299 ], [ 134.156979, 47.248357 ], [ 134.210566, 47.210155 ], [ 134.230276, 47.182097 ], [ 134.232739, 47.134892 ], [ 134.222268, 47.105164 ], [ 134.142812, 47.093349 ], [ 134.118175, 47.061968 ], [ 134.10216, 47.005678 ], [ 134.063972, 46.979962 ], [ 134.076291, 46.938298 ], [ 134.042414, 46.886787 ], [ 134.041182, 46.848326 ], [ 134.025168, 46.810657 ], [ 134.052885, 46.779928 ], [ 134.033175, 46.759023 ], [ 134.030711, 46.708981 ], [ 134.011001, 46.637941 ], [ 133.919842, 46.596012 ], [ 133.890893, 46.525235 ], [ 133.849625, 46.475389 ], [ 133.852089, 46.450242 ], [ 133.902596, 46.446119 ], [ 133.948791, 46.401153 ], [ 133.940784, 46.38134 ], [ 133.876726, 46.362345 ], [ 133.869335, 46.338386 ], [ 133.922922, 46.330948 ], [ 133.908139, 46.308216 ], [ 133.91861, 46.280924 ], [ 133.909987, 46.254447 ], [ 133.867487, 46.250722 ], [ 133.87919, 46.233752 ], [ 133.849625, 46.203939 ], [ 133.814517, 46.230854 ], [ 133.794807, 46.193583 ], [ 133.764626, 46.17328 ], [ 133.706111, 46.163333 ], [ 133.690713, 46.133896 ], [ 133.745531, 46.075389 ], [ 133.740604, 46.048812 ], [ 133.681474, 45.986473 ], [ 133.676546, 45.94321 ], [ 133.614952, 45.942794 ], [ 133.618032, 45.903662 ], [ 133.583539, 45.868669 ], [ 133.55459, 45.893249 ], [ 133.51209, 45.887001 ], [ 133.491764, 45.867002 ], [ 133.494228, 45.840325 ], [ 133.467743, 45.834905 ], [ 133.469591, 45.799451 ], [ 133.505315, 45.785681 ], [ 133.469591, 45.777751 ], [ 133.486837, 45.740173 ], [ 133.454192, 45.731819 ], [ 133.445569, 45.705077 ], [ 133.484989, 45.691702 ], [ 133.485605, 45.658667 ], [ 133.448649, 45.647372 ], [ 133.471438, 45.631053 ], [ 133.412924, 45.618079 ], [ 133.423395, 45.584163 ], [ 133.393214, 45.580393 ], [ 133.342707, 45.554836 ], [ 133.333468, 45.562379 ], [ 133.246005, 45.517528 ], [ 133.201657, 45.515431 ], [ 133.170244, 45.465506 ], [ 133.164701, 45.437377 ], [ 133.143759, 45.430658 ], [ 133.144991, 45.367205 ], [ 133.119121, 45.352908 ], [ 133.128976, 45.336924 ], [ 133.097563, 45.281788 ], [ 133.109266, 45.232077 ], [ 133.124665, 45.222805 ], [ 133.137599, 45.178105 ], [ 133.139447, 45.127459 ], [ 133.107418, 45.124504 ], [ 133.089556, 45.097473 ], [ 133.070462, 45.097051 ], [ 133.045824, 45.066203 ], [ 132.986078, 45.031109 ], [ 132.954049, 45.023072 ], [ 132.916477, 45.031109 ], [ 132.867202, 45.061976 ], [ 132.76434, 45.081417 ], [ 132.394161, 45.16376 ], [ 132.17427, 45.216903 ], [ 132.003655, 45.25441 ], [ 131.976554, 45.277156 ], [ 131.93159, 45.287683 ], [ 131.917423, 45.339448 ], [ 131.887858, 45.342393 ], [ 131.82996, 45.311677 ], [ 131.825649, 45.291472 ], [ 131.788692, 45.245984 ], [ 131.79362, 45.211844 ], [ 131.759127, 45.213952 ], [ 131.721555, 45.234606 ], [ 131.681519, 45.215217 ], [ 131.650722, 45.159962 ], [ 131.687678, 45.1511 ], [ 131.695685, 45.132104 ], [ 131.63286, 45.075078 ], [ 131.566338, 45.045487 ], [ 131.529382, 45.012073 ], [ 131.484418, 44.99557 ], [ 131.501664, 44.977793 ], [ 131.464708, 44.963397 ], [ 131.409889, 44.985836 ], [ 131.380324, 44.978216 ], [ 131.355071, 44.990068 ], [ 131.313803, 44.965938 ], [ 131.311955, 44.94688 ], [ 131.274999, 44.919766 ], [ 131.263296, 44.929935 ], [ 131.207861, 44.913833 ], [ 131.20355, 44.932901 ], [ 131.16105, 44.948151 ], [ 131.090217, 44.924427 ], [ 131.10192, 44.898997 ], [ 131.07913, 44.881614 ], [ 130.965181, 44.85065 ], [ 130.972573, 44.820094 ], [ 131.016304, 44.814575 ], [ 131.016304, 44.789521 ], [ 131.064348, 44.786973 ], [ 131.069275, 44.759783 ], [ 131.093297, 44.746183 ], [ 131.090833, 44.717272 ], [ 131.111775, 44.710042 ], [ 131.310723, 44.046623 ], [ 131.26576, 44.034578 ], [ 131.245434, 43.95579 ], [ 131.26268, 43.948897 ], [ 131.254057, 43.893289 ], [ 131.2171, 43.836334 ], [ 131.213405, 43.801357 ], [ 131.232499, 43.742585 ], [ 131.215869, 43.72745 ], [ 131.221412, 43.682024 ], [ 131.239274, 43.670337 ], [ 131.216485, 43.613169 ], [ 131.222028, 43.593234 ], [ 131.20047, 43.532089 ], [ 131.276847, 43.495632 ], [ 131.304564, 43.502144 ], [ 131.294093, 43.470012 ], [ 131.234963, 43.475224 ], [ 131.201086, 43.442209 ], [ 131.175217, 43.444816 ], [ 131.142572, 43.425695 ], [ 131.026775, 43.508655 ], [ 130.959638, 43.48608 ], [ 130.907283, 43.434387 ], [ 130.864167, 43.437863 ], [ 130.841378, 43.454374 ], [ 130.822899, 43.503446 ], [ 130.776704, 43.52341 ], [ 130.727429, 43.560284 ], [ 130.671378, 43.565054 ], [ 130.665835, 43.583698 ], [ 130.623335, 43.589767 ], [ 130.630726, 43.622268 ], [ 130.57098, 43.626167 ], [ 130.57098, 43.626167 ], [ 130.501995, 43.636563 ], [ 130.488444, 43.65605 ], [ 130.437937, 43.646091 ], [ 130.412684, 43.652586 ], [ 130.394206, 43.703227 ], [ 130.423155, 43.745179 ], [ 130.382503, 43.777164 ], [ 130.381887, 43.817768 ], [ 130.362793, 43.844967 ], [ 130.386198, 43.85403 ], [ 130.368336, 43.894151 ], [ 130.381887, 43.910106 ], [ 130.338155, 43.963975 ], [ 130.364025, 43.992399 ], [ 130.365256, 44.044042 ], [ 130.319061, 44.03974 ], [ 130.307358, 44.002731 ], [ 130.27225, 43.981634 ], [ 130.262395, 43.949328 ], [ 130.208192, 43.948466 ], [ 130.153373, 43.915711 ], [ 130.143518, 43.878624 ], [ 130.116417, 43.878192 ], [ 130.110873, 43.852735 ], [ 130.079461, 43.835039 ], [ 130.027722, 43.851872 ], [ 130.009243, 43.889407 ], [ 130.022794, 43.917866 ], [ 130.017867, 43.961821 ], [ 129.979062, 44.015644 ], [ 129.951345, 44.027263 ], [ 129.907614, 44.023821 ], [ 129.881128, 44.000148 ], [ 129.868193, 44.012631 ], [ 129.802904, 43.964837 ], [ 129.780114, 43.892857 ], [ 129.739462, 43.895876 ], [ 129.743158, 43.876035 ], [ 129.699426, 43.8838 ], [ 129.650767, 43.873016 ], [ 129.529427, 43.870427 ], [ 129.467833, 43.874741 ], [ 129.449971, 43.850578 ], [ 129.417942, 43.843672 ], [ 129.406855, 43.819496 ], [ 129.348341, 43.798333 ], [ 129.30892, 43.812155 ], [ 129.289826, 43.797038 ], [ 129.254718, 43.819496 ], [ 129.211602, 43.784509 ], [ 129.232544, 43.709284 ], [ 129.214066, 43.695006 ], [ 129.217146, 43.648689 ], [ 129.232544, 43.635263 ], [ 129.23008, 43.593234 ], [ 129.169102, 43.561585 ], [ 129.145081, 43.570258 ], [ 129.093958, 43.547706 ], [ 129.037907, 43.540332 ], [ 129.013886, 43.522976 ], [ 128.962763, 43.53903 ], [ 128.949828, 43.553779 ], [ 128.878379, 43.539898 ], [ 128.834647, 43.587599 ], [ 128.821097, 43.637429 ], [ 128.78722, 43.686784 ], [ 128.768126, 43.732207 ], [ 128.729322, 43.736964 ], [ 128.760119, 43.755554 ], [ 128.739177, 43.806972 ], [ 128.719467, 43.816905 ], [ 128.760734, 43.857482 ], [ 128.729938, 43.889838 ], [ 128.696061, 43.903207 ], [ 128.636315, 43.891132 ], [ 128.64001, 43.948035 ], [ 128.610445, 43.960529 ], [ 128.584576, 43.990246 ], [ 128.574721, 44.047914 ], [ 128.529141, 44.112401 ], [ 128.471859, 44.157501 ], [ 128.450301, 44.203423 ], [ 128.471859, 44.247596 ], [ 128.453997, 44.257884 ], [ 128.472475, 44.320001 ], [ 128.446605, 44.339694 ], [ 128.475555, 44.346114 ], [ 128.481714, 44.375637 ], [ 128.457076, 44.409848 ], [ 128.463236, 44.431647 ], [ 128.427511, 44.473512 ], [ 128.397946, 44.483761 ], [ 128.372693, 44.514495 ], [ 128.295084, 44.480772 ], [ 128.293237, 44.467961 ], [ 128.228563, 44.445748 ], [ 128.211317, 44.431647 ], [ 128.172512, 44.34697 ], [ 128.137404, 44.357668 ], [ 128.094904, 44.354673 ], [ 128.074578, 44.370075 ], [ 128.049941, 44.349965 ], [ 128.065339, 44.307155 ], [ 128.101679, 44.293449 ], [ 128.064107, 44.251454 ], [ 128.104143, 44.230017 ], [ 128.09244, 44.181539 ], [ 128.060411, 44.168663 ], [ 128.088129, 44.158359 ], [ 128.091208, 44.133022 ], [ 128.042549, 44.103807 ], [ 127.950158, 44.088334 ], [ 127.912586, 44.064687 ], [ 127.862695, 44.062967 ], [ 127.846065, 44.081886 ], [ 127.808492, 44.086615 ], [ 127.783239, 44.071997 ], [ 127.729036, 44.09908 ], [ 127.735811, 44.11412 ], [ 127.712406, 44.199133 ], [ 127.681609, 44.166946 ], [ 127.641573, 44.193555 ], [ 127.626174, 44.187977 ], [ 127.59045, 44.227872 ], [ 127.623711, 44.278025 ], [ 127.579363, 44.310581 ], [ 127.486356, 44.410275 ], [ 127.50853, 44.437202 ], [ 127.463566, 44.484615 ], [ 127.465414, 44.516628 ], [ 127.485124, 44.528576 ], [ 127.536247, 44.522176 ], [ 127.570124, 44.55033 ], [ 127.557189, 44.575488 ], [ 127.392733, 44.632158 ], [ 127.275705, 44.640249 ], [ 127.261538, 44.61299 ], [ 127.214111, 44.624917 ], [ 127.228893, 44.642804 ], [ 127.182082, 44.644507 ], [ 127.138966, 44.607451 ], [ 127.094619, 44.615972 ], [ 127.089691, 44.593816 ], [ 127.049655, 44.566961 ], [ 127.041648, 44.591258 ], [ 127.044112, 44.653874 ], [ 127.030561, 44.673454 ], [ 127.041032, 44.712169 ], [ 126.9973, 44.764882 ], [ 126.984366, 44.823914 ], [ 126.999764, 44.87398 ], [ 127.021938, 44.898997 ], [ 127.073061, 44.907051 ], [ 127.092771, 44.94688 ], [ 127.050271, 45.004034 ], [ 127.018242, 45.024341 ], [ 126.984981, 45.067893 ], [ 126.970815, 45.070852 ], [ 126.96404, 45.132104 ], [ 126.85625, 45.145613 ], [ 126.792808, 45.135481 ], [ 126.787265, 45.159118 ], [ 126.732446, 45.187385 ], [ 126.685635, 45.187807 ], [ 126.640055, 45.214373 ], [ 126.644983, 45.225334 ], [ 126.569222, 45.252725 ], [ 126.540273, 45.23882 ], [ 126.519331, 45.248091 ], [ 126.402919, 45.222805 ], [ 126.356107, 45.185698 ], [ 126.293282, 45.180214 ], [ 126.285274, 45.162494 ], [ 126.235383, 45.140125 ], [ 126.225528, 45.154054 ], [ 126.166398, 45.13337 ], [ 126.142992, 45.147723 ], [ 126.091869, 45.149411 ], [ 126.047522, 45.170933 ], [ 125.998247, 45.162072 ], [ 125.992703, 45.192447 ], [ 125.957595, 45.201303 ], [ 125.915095, 45.196664 ], [ 125.849805, 45.23882 ], [ 125.823936, 45.237978 ], [ 125.815929, 45.264942 ], [ 125.761726, 45.291472 ], [ 125.726001, 45.336503 ], [ 125.695205, 45.352066 ], [ 125.712451, 45.389485 ], [ 125.711835, 45.477677 ], [ 125.687813, 45.514173 ], [ 125.660096, 45.507043 ], [ 125.61698, 45.517947 ], [ 125.583104, 45.491942 ], [ 125.497488, 45.469283 ], [ 125.480242, 45.486488 ], [ 125.424807, 45.485649 ], [ 125.434662, 45.462988 ], [ 125.398322, 45.416797 ], [ 125.361981, 45.392847 ], [ 125.319482, 45.422678 ], [ 125.301619, 45.402092 ], [ 125.248649, 45.417637 ], [ 125.189518, 45.39915 ], [ 125.137779, 45.409655 ], [ 125.097127, 45.38276 ], [ 125.06633, 45.39915 ], [ 125.08912, 45.420998 ], [ 125.0497, 45.428558 ], [ 125.025678, 45.493201 ], [ 124.961005, 45.495299 ], [ 124.936983, 45.53388 ], [ 124.911114, 45.535976 ], [ 124.884628, 45.495299 ], [ 124.886476, 45.442836 ], [ 124.839665, 45.455852 ], [ 124.792853, 45.436958 ], [ 124.776223, 45.468024 ], [ 124.729412, 45.444096 ], [ 124.690607, 45.452493 ], [ 124.625318, 45.437377 ], [ 124.575427, 45.451234 ], [ 124.579738, 45.424358 ], [ 124.544014, 45.411756 ], [ 124.507058, 45.424778 ], [ 124.480572, 45.456271 ], [ 124.398652, 45.440737 ], [ 124.374015, 45.45795 ], [ 124.352457, 45.496557 ], [ 124.369087, 45.512915 ], [ 124.348761, 45.546874 ], [ 124.287783, 45.539329 ], [ 124.264377, 45.555256 ], [ 124.273001, 45.584163 ], [ 124.238508, 45.591702 ], [ 124.226805, 45.633564 ], [ 124.162132, 45.616404 ], [ 124.128255, 45.641933 ], [ 124.147349, 45.665359 ], [ 124.122096, 45.669123 ], [ 124.13503, 45.690448 ], [ 124.10177, 45.700898 ], [ 124.098074, 45.722628 ], [ 124.054342, 45.751449 ], [ 124.014922, 45.749779 ], [ 124.001987, 45.770655 ], [ 124.064197, 45.802372 ], [ 124.03648, 45.83824 ], [ 124.067277, 45.840325 ], [ 124.061118, 45.886168 ], [ 123.996444, 45.906993 ], [ 123.968727, 45.936551 ], [ 123.973654, 45.973997 ], [ 124.011842, 45.981899 ], [ 123.989053, 46.011833 ], [ 124.040176, 46.01973 ], [ 124.034016, 46.045074 ], [ 124.009995, 46.057534 ], [ 124.015538, 46.088257 ], [ 123.99398, 46.101123 ], [ 124.01677, 46.118549 ], [ 123.991516, 46.143019 ], [ 124.001987, 46.166649 ], [ 123.971806, 46.170379 ], [ 123.956408, 46.206009 ], [ 123.979814, 46.228784 ], [ 123.952096, 46.256516 ], [ 123.960103, 46.288369 ], [ 123.936082, 46.286715 ], [ 123.917604, 46.25693 ], [ 123.896046, 46.303668 ], [ 123.84985, 46.302428 ], [ 123.775938, 46.263136 ], [ 123.726047, 46.255688 ], [ 123.673692, 46.258585 ], [ 123.604706, 46.251964 ], [ 123.569598, 46.223816 ] ] ] ] } },\n{ \"type\": \"Feature\", \"properties\": { \"adcode\": \"310000\", \"name\": \"上海市\", \"center\": [ 121.472644, 31.231706 ], \"centroid\": [ 121.438734, 31.07256 ], \"childrenNum\": 16, \"level\": \"province\", \"parent\": { \"adcode\": 100000 }, \"subFeatureIndex\": 8, \"acroutes\": [ 100000 ] }, \"geometry\": { \"type\": \"MultiPolygon\", \"coordinates\": [ [ [ [ 120.901349, 31.017327 ], [ 120.890878, 31.094229 ], [ 120.859465, 31.100379 ], [ 120.881023, 31.134706 ], [ 120.930298, 31.141365 ], [ 121.018377, 31.134194 ], [ 121.076892, 31.158267 ], [ 121.060261, 31.245289 ], [ 121.090442, 31.291838 ], [ 121.138485, 31.276495 ], [ 121.160659, 31.283144 ], [ 121.129862, 31.302577 ], [ 121.130478, 31.343987 ], [ 121.113848, 31.37465 ], [ 121.143413, 31.392021 ], [ 121.174826, 31.44922 ], [ 121.240731, 31.493627 ], [ 121.247507, 31.476785 ], [ 121.301093, 31.49873 ], [ 121.301093, 31.49873 ], [ 121.343593, 31.511996 ], [ 121.404571, 31.479337 ], [ 121.520984, 31.394575 ], [ 121.599208, 31.37465 ], [ 121.722396, 31.3036 ], [ 121.809859, 31.196669 ], [ 121.946598, 31.066039 ], [ 121.977395, 31.016301 ], [ 121.990945, 30.96859 ], [ 121.994025, 30.862823 ], [ 121.954605, 30.825828 ], [ 121.970004, 30.789333 ], [ 121.943518, 30.776993 ], [ 121.904714, 30.814007 ], [ 121.681128, 30.818633 ], [ 121.601056, 30.805269 ], [ 121.517288, 30.775451 ], [ 121.426129, 30.730192 ], [ 121.362071, 30.679764 ], [ 121.274608, 30.677191 ], [ 121.272144, 30.723504 ], [ 121.232108, 30.755909 ], [ 121.21671, 30.785734 ], [ 121.174826, 30.771851 ], [ 121.123087, 30.77905 ], [ 121.13787, 30.826342 ], [ 121.097833, 30.857171 ], [ 121.060261, 30.845354 ], [ 121.038087, 30.814007 ], [ 120.991892, 30.837133 ], [ 121.020225, 30.872069 ], [ 120.993124, 30.889532 ], [ 121.000515, 30.938309 ], [ 120.989428, 31.01425 ], [ 120.949392, 31.030148 ], [ 120.940153, 31.010146 ], [ 120.901349, 31.017327 ] ] ], [ [ [ 121.974931, 31.61704 ], [ 121.995873, 31.493117 ], [ 121.981706, 31.464024 ], [ 121.890547, 31.428795 ], [ 121.819098, 31.437987 ], [ 121.682976, 31.491075 ], [ 121.625693, 31.501792 ], [ 121.547469, 31.531382 ], [ 121.434136, 31.590535 ], [ 121.395332, 31.585437 ], [ 121.371926, 31.553314 ], [ 121.289391, 31.61653 ], [ 121.145261, 31.75403 ], [ 121.118775, 31.759119 ], [ 121.200079, 31.834907 ], [ 121.265369, 31.863883 ], [ 121.323267, 31.868458 ], [ 121.384861, 31.833382 ], [ 121.431673, 31.769295 ], [ 121.49881, 31.753012 ], [ 121.599824, 31.703128 ], [ 121.64294, 31.697527 ], [ 121.715005, 31.673592 ], [ 121.974931, 31.61704 ] ] ], [ [ [ 121.779062, 31.310247 ], [ 121.727939, 31.35472 ], [ 121.572107, 31.435944 ], [ 121.509897, 31.4824 ], [ 121.520984, 31.494137 ], [ 121.567179, 31.48342 ], [ 121.585657, 31.454836 ], [ 121.742106, 31.407345 ], [ 121.792613, 31.363408 ], [ 121.793845, 31.31945 ], [ 121.779062, 31.310247 ] ] ], [ [ [ 121.801852, 31.356765 ], [ 121.792613, 31.377715 ], [ 121.845584, 31.37465 ], [ 121.951525, 31.337343 ], [ 122.040837, 31.324051 ], [ 122.116597, 31.320984 ], [ 122.122756, 31.307179 ], [ 122.097503, 31.255522 ], [ 122.016199, 31.282121 ], [ 121.932431, 31.283144 ], [ 121.840656, 31.295418 ], [ 121.8037, 31.328652 ], [ 121.801852, 31.356765 ] ] ], [ [ [ 121.626925, 31.445135 ], [ 121.579498, 31.479848 ], [ 121.631853, 31.456878 ], [ 121.626925, 31.445135 ] ] ], [ [ [ 121.943518, 31.215608 ], [ 121.950909, 31.228915 ], [ 122.008808, 31.221238 ], [ 121.995873, 31.160828 ], [ 121.959533, 31.159291 ], [ 121.943518, 31.215608 ] ] ], [ [ [ 121.88254, 31.240684 ], [ 121.923808, 31.234032 ], [ 121.909026, 31.195133 ], [ 121.88254, 31.240684 ] ] ] ] } },\n{ \"type\": \"Feature\", \"properties\": { \"adcode\": \"320000\", \"name\": \"江苏省\", \"center\": [ 118.767413, 32.041544 ], \"centroid\": [ 119.486395, 32.983908 ], \"childrenNum\": 13, \"level\": \"province\", \"parent\": { \"adcode\": 100000 }, \"subFeatureIndex\": 9, \"acroutes\": [ 100000 ] }, \"geometry\": { \"type\": \"MultiPolygon\", \"coordinates\": [ [ [ [ 117.311654, 34.561686 ], [ 117.311654, 34.561686 ], [ 117.32151, 34.566614 ], [ 117.32151, 34.566614 ], [ 117.325205, 34.573021 ], [ 117.325205, 34.573021 ], [ 117.362777, 34.589281 ], [ 117.402813, 34.569571 ], [ 117.402813, 34.550843 ], [ 117.465023, 34.484767 ], [ 117.53832, 34.467006 ], [ 117.592523, 34.462566 ], [ 117.609769, 34.490686 ], [ 117.659044, 34.501044 ], [ 117.684298, 34.547392 ], [ 117.801942, 34.518798 ], [ 117.791471, 34.583368 ], [ 117.793935, 34.651827 ], [ 117.902956, 34.644443 ], [ 117.909732, 34.670533 ], [ 117.951615, 34.678408 ], [ 118.053861, 34.650843 ], [ 118.084042, 34.655766 ], [ 118.114839, 34.614404 ], [ 118.079115, 34.569571 ], [ 118.185056, 34.543942 ], [ 118.16473, 34.50499 ], [ 118.132702, 34.483287 ], [ 118.177665, 34.45319 ], [ 118.179513, 34.379628 ], [ 118.217701, 34.379134 ], [ 118.220165, 34.405802 ], [ 118.277447, 34.404814 ], [ 118.290382, 34.424563 ], [ 118.379693, 34.415183 ], [ 118.404947, 34.427525 ], [ 118.416034, 34.473914 ], [ 118.439439, 34.507949 ], [ 118.424657, 34.595193 ], [ 118.439439, 34.626223 ], [ 118.473932, 34.623269 ], [ 118.460997, 34.656258 ], [ 118.545997, 34.705964 ], [ 118.601431, 34.714327 ], [ 118.607591, 34.694155 ], [ 118.664257, 34.693663 ], [ 118.690127, 34.678408 ], [ 118.739402, 34.693663 ], [ 118.783749, 34.723181 ], [ 118.764039, 34.740396 ], [ 118.719076, 34.745313 ], [ 118.739402, 34.792508 ], [ 118.772047, 34.794474 ], [ 118.80038, 34.843114 ], [ 118.805307, 34.87307 ], [ 118.860742, 34.944233 ], [ 118.86259, 35.025626 ], [ 118.928495, 35.051106 ], [ 118.942662, 35.040817 ], [ 119.027045, 35.055516 ], [ 119.114509, 35.055026 ], [ 119.137915, 35.096167 ], [ 119.217371, 35.106939 ], [ 119.250016, 35.124562 ], [ 119.286972, 35.115261 ], [ 119.306066, 35.076578 ], [ 119.292515, 35.068742 ], [ 119.307298, 35.032977 ], [ 119.291899, 35.028567 ], [ 119.285124, 35.068252 ], [ 119.238313, 35.048657 ], [ 119.211211, 34.981507 ], [ 119.214907, 34.925589 ], [ 119.202588, 34.890253 ], [ 119.217371, 34.827886 ], [ 119.238313, 34.799388 ], [ 119.272189, 34.797914 ], [ 119.312841, 34.774813 ], [ 119.378747, 34.764489 ], [ 119.440957, 34.769406 ], [ 119.439725, 34.785136 ], [ 119.497007, 34.754164 ], [ 119.494543, 34.754656 ], [ 119.381827, 34.752198 ], [ 119.456971, 34.748264 ], [ 119.525956, 34.73351 ], [ 119.465594, 34.672994 ], [ 119.569072, 34.615389 ], [ 119.610956, 34.592729 ], [ 119.641137, 34.569078 ], [ 119.781571, 34.515839 ], [ 119.811752, 34.485754 ], [ 119.962657, 34.459112 ], [ 120.103707, 34.391481 ], [ 120.311895, 34.306991 ], [ 120.314359, 34.255563 ], [ 120.347619, 34.179352 ], [ 120.367329, 34.091674 ], [ 120.48559, 33.859411 ], [ 120.500372, 33.818152 ], [ 120.534249, 33.782346 ], [ 120.583524, 33.668362 ], [ 120.651277, 33.57567 ], [ 120.717183, 33.436945 ], [ 120.741205, 33.337505 ], [ 120.769538, 33.307 ], [ 120.813885, 33.303499 ], [ 120.833595, 33.274984 ], [ 120.819429, 33.237951 ], [ 120.843451, 33.209915 ], [ 120.874247, 33.093672 ], [ 120.871784, 33.047032 ], [ 120.917979, 33.02596 ], [ 120.932762, 33.005887 ], [ 120.957399, 32.893395 ], [ 120.981421, 32.85972 ], [ 120.972182, 32.761134 ], [ 120.953088, 32.714318 ], [ 120.916131, 32.701225 ], [ 120.963559, 32.68259 ], [ 120.979573, 32.636236 ], [ 120.961711, 32.612042 ], [ 121.020225, 32.605489 ], [ 121.153268, 32.52933 ], [ 121.269681, 32.483402 ], [ 121.352216, 32.474315 ], [ 121.390405, 32.460682 ], [ 121.425513, 32.430885 ], [ 121.450151, 32.282256 ], [ 121.493882, 32.263533 ], [ 121.499426, 32.211394 ], [ 121.458774, 32.177462 ], [ 121.542542, 32.152132 ], [ 121.525295, 32.136423 ], [ 121.759352, 32.059362 ], [ 121.772287, 32.032984 ], [ 121.856055, 31.955328 ], [ 121.889315, 31.866425 ], [ 121.970004, 31.718911 ], [ 121.974931, 31.61704 ], [ 121.715005, 31.673592 ], [ 121.64294, 31.697527 ], [ 121.599824, 31.703128 ], [ 121.49881, 31.753012 ], [ 121.431673, 31.769295 ], [ 121.384861, 31.833382 ], [ 121.323267, 31.868458 ], [ 121.265369, 31.863883 ], [ 121.200079, 31.834907 ], [ 121.118775, 31.759119 ], [ 121.145261, 31.75403 ], [ 121.289391, 31.61653 ], [ 121.371926, 31.553314 ], [ 121.343593, 31.511996 ], [ 121.301093, 31.49873 ], [ 121.301093, 31.49873 ], [ 121.247507, 31.476785 ], [ 121.240731, 31.493627 ], [ 121.174826, 31.44922 ], [ 121.143413, 31.392021 ], [ 121.113848, 31.37465 ], [ 121.130478, 31.343987 ], [ 121.129862, 31.302577 ], [ 121.160659, 31.283144 ], [ 121.138485, 31.276495 ], [ 121.090442, 31.291838 ], [ 121.060261, 31.245289 ], [ 121.076892, 31.158267 ], [ 121.018377, 31.134194 ], [ 120.930298, 31.141365 ], [ 120.881023, 31.134706 ], [ 120.859465, 31.100379 ], [ 120.890878, 31.094229 ], [ 120.901349, 31.017327 ], [ 120.865624, 30.989627 ], [ 120.820661, 31.006556 ], [ 120.770154, 30.996809 ], [ 120.746132, 30.962432 ], [ 120.698089, 30.970643 ], [ 120.684538, 30.955247 ], [ 120.709176, 30.933176 ], [ 120.713487, 30.88491 ], [ 120.68269, 30.882342 ], [ 120.653741, 30.846896 ], [ 120.589068, 30.854603 ], [ 120.563814, 30.835592 ], [ 120.503452, 30.757967 ], [ 120.489285, 30.763624 ], [ 120.460336, 30.839702 ], [ 120.441858, 30.860768 ], [ 120.435083, 30.920855 ], [ 120.42338, 30.902884 ], [ 120.35809, 30.886964 ], [ 120.371025, 30.948575 ], [ 120.316206, 30.933689 ], [ 120.223816, 30.926502 ], [ 120.149903, 30.937283 ], [ 120.111099, 30.955761 ], [ 120.052584, 31.00553 ], [ 120.001461, 31.027071 ], [ 119.988527, 31.059375 ], [ 119.946027, 31.106016 ], [ 119.921389, 31.170045 ], [ 119.878274, 31.160828 ], [ 119.827151, 31.174142 ], [ 119.809904, 31.148536 ], [ 119.779723, 31.17875 ], [ 119.715666, 31.169533 ], [ 119.705811, 31.152634 ], [ 119.678093, 31.167997 ], [ 119.623891, 31.130096 ], [ 119.599869, 31.10909 ], [ 119.532732, 31.159291 ], [ 119.461283, 31.156219 ], [ 119.439109, 31.177214 ], [ 119.391682, 31.174142 ], [ 119.360269, 31.213049 ], [ 119.374435, 31.258591 ], [ 119.350414, 31.301043 ], [ 119.338095, 31.259103 ], [ 119.294363, 31.263195 ], [ 119.266646, 31.250405 ], [ 119.198277, 31.270357 ], [ 119.197661, 31.295418 ], [ 119.158241, 31.294907 ], [ 119.107118, 31.250917 ], [ 119.10527, 31.235055 ], [ 119.014727, 31.241707 ], [ 118.984546, 31.237102 ], [ 118.870597, 31.242219 ], [ 118.794836, 31.229426 ], [ 118.756648, 31.279564 ], [ 118.726467, 31.282121 ], [ 118.720924, 31.322518 ], [ 118.745561, 31.372606 ], [ 118.767735, 31.363919 ], [ 118.824401, 31.375672 ], [ 118.852119, 31.393553 ], [ 118.883532, 31.500261 ], [ 118.885995, 31.519139 ], [ 118.881684, 31.564023 ], [ 118.858894, 31.623665 ], [ 118.802844, 31.619078 ], [ 118.773894, 31.682759 ], [ 118.748025, 31.675629 ], [ 118.736322, 31.633347 ], [ 118.643315, 31.649651 ], [ 118.643315, 31.671555 ], [ 118.697518, 31.709747 ], [ 118.653786, 31.73011 ], [ 118.641467, 31.75861 ], [ 118.571866, 31.746397 ], [ 118.5577, 31.73011 ], [ 118.521975, 31.743343 ], [ 118.533678, 31.76726 ], [ 118.481939, 31.778453 ], [ 118.504729, 31.841516 ], [ 118.466541, 31.857784 ], [ 118.472084, 31.879639 ], [ 118.363679, 31.930443 ], [ 118.389548, 31.985281 ], [ 118.394476, 32.076098 ], [ 118.433896, 32.086746 ], [ 118.501033, 32.121726 ], [ 118.49549, 32.165304 ], [ 118.510888, 32.194176 ], [ 118.643931, 32.209875 ], [ 118.674728, 32.250375 ], [ 118.657482, 32.30148 ], [ 118.703061, 32.328792 ], [ 118.685199, 32.403604 ], [ 118.691359, 32.472295 ], [ 118.628533, 32.467751 ], [ 118.592192, 32.481383 ], [ 118.608823, 32.536899 ], [ 118.564475, 32.562122 ], [ 118.568787, 32.585825 ], [ 118.59712, 32.600951 ], [ 118.632844, 32.578261 ], [ 118.658714, 32.594397 ], [ 118.688895, 32.588346 ], [ 118.719076, 32.614059 ], [ 118.719076, 32.614059 ], [ 118.73509, 32.58885 ], [ 118.757264, 32.603976 ], [ 118.784981, 32.582295 ], [ 118.820706, 32.60448 ], [ 118.84288, 32.56767 ], [ 118.908169, 32.59238 ], [ 118.890923, 32.553042 ], [ 118.92172, 32.557078 ], [ 118.922336, 32.557078 ], [ 118.92172, 32.557078 ], [ 118.922336, 32.557078 ], [ 118.975923, 32.505108 ], [ 119.041212, 32.515201 ], [ 119.084944, 32.452602 ], [ 119.142226, 32.499556 ], [ 119.168096, 32.536394 ], [ 119.152697, 32.557582 ], [ 119.22045, 32.576748 ], [ 119.230921, 32.607001 ], [ 119.208748, 32.641276 ], [ 119.211827, 32.708275 ], [ 119.184726, 32.825529 ], [ 119.113277, 32.823014 ], [ 119.054763, 32.8748 ], [ 119.020886, 32.955685 ], [ 118.993169, 32.958196 ], [ 118.934039, 32.93861 ], [ 118.892771, 32.941121 ], [ 118.89585, 32.957694 ], [ 118.89585, 32.957694 ], [ 118.849039, 32.956689 ], [ 118.846575, 32.922034 ], [ 118.821322, 32.920527 ], [ 118.810235, 32.853687 ], [ 118.743097, 32.853184 ], [ 118.743097, 32.853184 ], [ 118.73817, 32.772708 ], [ 118.756648, 32.737477 ], [ 118.707373, 32.72036 ], [ 118.642699, 32.744525 ], [ 118.572482, 32.719856 ], [ 118.560163, 32.729926 ], [ 118.483787, 32.721367 ], [ 118.450526, 32.743518 ], [ 118.411106, 32.715828 ], [ 118.375382, 32.718849 ], [ 118.363063, 32.770695 ], [ 118.334114, 32.761637 ], [ 118.300237, 32.783275 ], [ 118.301469, 32.846145 ], [ 118.250346, 32.848157 ], [ 118.2331, 32.914498 ], [ 118.252194, 32.936601 ], [ 118.291614, 32.946143 ], [ 118.303933, 32.96874 ], [ 118.26944, 32.969242 ], [ 118.244803, 32.998359 ], [ 118.243571, 33.027967 ], [ 118.219549, 33.114227 ], [ 118.217085, 33.191888 ], [ 118.178281, 33.217926 ], [ 118.149332, 33.169348 ], [ 118.038463, 33.134776 ], [ 118.037231, 33.152314 ], [ 117.988572, 33.180869 ], [ 117.977485, 33.226437 ], [ 117.942376, 33.224936 ], [ 117.939297, 33.262475 ], [ 117.974405, 33.279487 ], [ 117.992883, 33.333005 ], [ 118.029224, 33.374995 ], [ 118.016905, 33.402978 ], [ 118.027376, 33.455421 ], [ 118.050782, 33.491863 ], [ 118.107448, 33.475391 ], [ 118.117919, 33.594615 ], [ 118.112376, 33.617045 ], [ 118.16781, 33.663381 ], [ 118.161035, 33.735576 ], [ 118.117919, 33.766427 ], [ 118.065564, 33.76593 ], [ 118.019985, 33.738562 ], [ 117.972557, 33.74951 ], [ 117.901724, 33.720146 ], [ 117.843826, 33.736074 ], [ 117.791471, 33.733585 ], [ 117.750203, 33.710688 ], [ 117.72495, 33.74951 ], [ 117.739732, 33.758467 ], [ 117.759442, 33.874318 ], [ 117.753899, 33.891211 ], [ 117.715095, 33.879287 ], [ 117.672595, 33.934916 ], [ 117.671363, 33.992494 ], [ 117.629479, 34.028708 ], [ 117.612849, 34.000433 ], [ 117.569117, 33.985051 ], [ 117.543248, 34.038627 ], [ 117.514914, 34.060941 ], [ 117.435458, 34.028212 ], [ 117.404045, 34.03218 ], [ 117.357234, 34.088205 ], [ 117.311654, 34.067882 ], [ 117.277162, 34.078787 ], [ 117.257452, 34.065899 ], [ 117.192162, 34.068873 ], [ 117.130568, 34.101586 ], [ 117.123793, 34.128342 ], [ 117.046801, 34.151622 ], [ 117.025243, 34.167469 ], [ 117.051112, 34.221425 ], [ 116.969192, 34.283753 ], [ 116.983359, 34.348011 ], [ 116.960569, 34.363821 ], [ 116.969192, 34.389012 ], [ 116.909446, 34.408271 ], [ 116.828142, 34.389012 ], [ 116.782563, 34.429993 ], [ 116.773939, 34.453683 ], [ 116.722816, 34.472434 ], [ 116.662454, 34.472927 ], [ 116.592237, 34.493646 ], [ 116.594085, 34.511894 ], [ 116.490607, 34.573513 ], [ 116.477057, 34.614896 ], [ 116.432709, 34.630163 ], [ 116.430245, 34.650843 ], [ 116.374195, 34.640011 ], [ 116.392057, 34.710391 ], [ 116.363724, 34.715311 ], [ 116.369267, 34.749247 ], [ 116.403144, 34.756131 ], [ 116.408071, 34.850972 ], [ 116.445028, 34.895652 ], [ 116.557745, 34.908905 ], [ 116.613795, 34.922645 ], [ 116.622418, 34.939818 ], [ 116.677853, 34.939327 ], [ 116.781331, 34.916757 ], [ 116.781947, 34.961891 ], [ 116.809048, 34.968757 ], [ 116.821983, 34.929515 ], [ 116.858323, 34.928533 ], [ 116.922381, 34.894671 ], [ 116.929156, 34.843114 ], [ 116.966113, 34.844588 ], [ 116.979047, 34.815113 ], [ 116.95133, 34.81069 ], [ 116.969192, 34.771864 ], [ 117.022163, 34.759081 ], [ 117.070206, 34.713835 ], [ 117.061583, 34.675947 ], [ 117.073286, 34.639026 ], [ 117.104083, 34.648874 ], [ 117.15151, 34.559222 ], [ 117.139191, 34.526687 ], [ 117.166293, 34.434435 ], [ 117.248213, 34.451216 ], [ 117.252524, 34.48674 ], [ 117.27285, 34.499565 ], [ 117.267307, 34.528659 ], [ 117.311654, 34.561686 ] ] ] ] } },\n{ \"type\": \"Feature\", \"properties\": { \"adcode\": \"330000\", \"name\": \"浙江省\", \"center\": [ 120.153576, 30.287459 ], \"centroid\": [ 120.109921, 29.181449 ], \"childrenNum\": 11, \"level\": \"province\", \"parent\": { \"adcode\": 100000 }, \"subFeatureIndex\": 10, \"acroutes\": [ 100000 ] }, \"geometry\": { \"type\": \"MultiPolygon\", \"coordinates\": [ [ [ [ 118.433896, 28.288335 ], [ 118.480091, 28.327325 ], [ 118.455454, 28.384204 ], [ 118.432048, 28.402104 ], [ 118.456686, 28.424738 ], [ 118.474548, 28.478934 ], [ 118.414802, 28.497344 ], [ 118.4302, 28.515225 ], [ 118.412338, 28.55676 ], [ 118.428352, 28.617193 ], [ 118.428352, 28.617193 ], [ 118.428352, 28.681267 ], [ 118.403099, 28.702791 ], [ 118.364295, 28.813491 ], [ 118.300237, 28.826075 ], [ 118.270056, 28.918836 ], [ 118.195527, 28.904167 ], [ 118.227556, 28.942406 ], [ 118.165346, 28.986912 ], [ 118.133933, 28.983771 ], [ 118.115455, 29.009944 ], [ 118.115455, 29.009944 ], [ 118.097593, 28.998952 ], [ 118.066796, 29.053898 ], [ 118.076035, 29.074822 ], [ 118.037847, 29.102017 ], [ 118.045238, 29.149068 ], [ 118.027992, 29.167882 ], [ 118.042159, 29.210202 ], [ 118.073571, 29.216993 ], [ 118.077883, 29.290614 ], [ 118.138861, 29.283828 ], [ 118.178281, 29.297921 ], [ 118.166578, 29.314099 ], [ 118.205382, 29.343839 ], [ 118.193064, 29.395472 ], [ 118.248498, 29.431443 ], [ 118.316252, 29.422581 ], [ 118.306396, 29.479384 ], [ 118.329802, 29.495012 ], [ 118.347664, 29.474174 ], [ 118.381541, 29.504909 ], [ 118.496106, 29.519492 ], [ 118.500417, 29.57572 ], [ 118.532446, 29.588731 ], [ 118.573714, 29.638159 ], [ 118.61991, 29.654282 ], [ 118.647011, 29.64336 ], [ 118.700598, 29.706277 ], [ 118.744945, 29.73902 ], [ 118.740634, 29.814859 ], [ 118.841032, 29.891159 ], [ 118.838568, 29.934733 ], [ 118.894619, 29.937845 ], [ 118.902626, 30.029078 ], [ 118.878604, 30.064822 ], [ 118.873677, 30.11505 ], [ 118.895234, 30.148694 ], [ 118.852119, 30.149729 ], [ 118.852735, 30.166805 ], [ 118.929727, 30.2025 ], [ 118.905089, 30.216464 ], [ 118.877988, 30.282637 ], [ 118.880452, 30.31519 ], [ 118.954365, 30.360126 ], [ 118.988857, 30.332237 ], [ 119.06277, 30.304856 ], [ 119.091719, 30.323972 ], [ 119.126828, 30.304856 ], [ 119.201356, 30.290905 ], [ 119.236465, 30.297106 ], [ 119.246936, 30.341018 ], [ 119.277117, 30.341018 ], [ 119.326392, 30.372002 ], [ 119.349182, 30.349281 ], [ 119.402768, 30.374584 ], [ 119.36766, 30.38491 ], [ 119.335015, 30.448389 ], [ 119.336247, 30.508734 ], [ 119.326392, 30.532964 ], [ 119.272189, 30.510281 ], [ 119.237081, 30.546881 ], [ 119.265414, 30.574709 ], [ 119.238929, 30.609225 ], [ 119.323312, 30.630341 ], [ 119.343022, 30.664322 ], [ 119.39045, 30.685941 ], [ 119.408312, 30.645274 ], [ 119.444652, 30.650422 ], [ 119.482841, 30.704467 ], [ 119.479761, 30.772365 ], [ 119.527188, 30.77905 ], [ 119.55429, 30.825828 ], [ 119.575847, 30.829939 ], [ 119.557369, 30.874124 ], [ 119.563529, 30.919315 ], [ 119.582007, 30.932149 ], [ 119.580159, 30.967051 ], [ 119.633746, 31.019379 ], [ 119.629434, 31.085517 ], [ 119.649144, 31.104991 ], [ 119.623891, 31.130096 ], [ 119.678093, 31.167997 ], [ 119.705811, 31.152634 ], [ 119.715666, 31.169533 ], [ 119.779723, 31.17875 ], [ 119.809904, 31.148536 ], [ 119.827151, 31.174142 ], [ 119.878274, 31.160828 ], [ 119.921389, 31.170045 ], [ 119.946027, 31.106016 ], [ 119.988527, 31.059375 ], [ 120.001461, 31.027071 ], [ 120.052584, 31.00553 ], [ 120.111099, 30.955761 ], [ 120.149903, 30.937283 ], [ 120.223816, 30.926502 ], [ 120.316206, 30.933689 ], [ 120.371025, 30.948575 ], [ 120.35809, 30.886964 ], [ 120.42338, 30.902884 ], [ 120.435083, 30.920855 ], [ 120.441858, 30.860768 ], [ 120.460336, 30.839702 ], [ 120.489285, 30.763624 ], [ 120.503452, 30.757967 ], [ 120.563814, 30.835592 ], [ 120.589068, 30.854603 ], [ 120.653741, 30.846896 ], [ 120.68269, 30.882342 ], [ 120.713487, 30.88491 ], [ 120.709176, 30.933176 ], [ 120.684538, 30.955247 ], [ 120.698089, 30.970643 ], [ 120.746132, 30.962432 ], [ 120.770154, 30.996809 ], [ 120.820661, 31.006556 ], [ 120.865624, 30.989627 ], [ 120.901349, 31.017327 ], [ 120.940153, 31.010146 ], [ 120.949392, 31.030148 ], [ 120.989428, 31.01425 ], [ 121.000515, 30.938309 ], [ 120.993124, 30.889532 ], [ 121.020225, 30.872069 ], [ 120.991892, 30.837133 ], [ 121.038087, 30.814007 ], [ 121.060261, 30.845354 ], [ 121.097833, 30.857171 ], [ 121.13787, 30.826342 ], [ 121.123087, 30.77905 ], [ 121.174826, 30.771851 ], [ 121.21671, 30.785734 ], [ 121.232108, 30.755909 ], [ 121.272144, 30.723504 ], [ 121.274608, 30.677191 ], [ 121.239499, 30.648878 ], [ 121.188992, 30.632916 ], [ 121.148956, 30.599953 ], [ 121.058413, 30.563888 ], [ 121.092906, 30.515952 ], [ 121.183449, 30.434458 ], [ 121.225333, 30.404526 ], [ 121.328195, 30.397299 ], [ 121.371926, 30.37097 ], [ 121.395332, 30.338435 ], [ 121.497578, 30.258861 ], [ 121.561636, 30.184395 ], [ 121.635548, 30.070002 ], [ 121.652795, 30.071037 ], [ 121.699606, 30.007832 ], [ 121.721164, 29.992802 ], [ 121.78399, 29.99332 ], [ 121.835113, 29.958068 ], [ 121.919497, 29.920729 ], [ 121.971235, 29.955476 ], [ 122.00388, 29.92021 ], [ 122.00696, 29.891678 ], [ 122.140003, 29.901535 ], [ 122.143082, 29.877668 ], [ 122.10243, 29.859504 ], [ 122.043916, 29.822647 ], [ 122.003264, 29.762401 ], [ 121.937359, 29.748373 ], [ 121.833265, 29.653242 ], [ 121.872685, 29.632437 ], [ 121.909641, 29.650122 ], [ 121.966308, 29.636078 ], [ 122.000185, 29.582486 ], [ 121.995257, 29.545007 ], [ 121.968772, 29.515846 ], [ 121.973083, 29.477821 ], [ 121.993409, 29.45229 ], [ 121.975547, 29.411113 ], [ 121.937975, 29.384 ], [ 121.936127, 29.348012 ], [ 121.958301, 29.334448 ], [ 121.94475, 29.28435 ], [ 122.000185, 29.278608 ], [ 122.002032, 29.260336 ], [ 121.966924, 29.249894 ], [ 121.971851, 29.193485 ], [ 121.948446, 29.193485 ], [ 121.986634, 29.154817 ], [ 121.988482, 29.110906 ], [ 121.970004, 29.092604 ], [ 121.966308, 29.052852 ], [ 121.884388, 29.105677 ], [ 121.85975, 29.086328 ], [ 121.811091, 29.10986 ], [ 121.780294, 29.10986 ], [ 121.767975, 29.166837 ], [ 121.750113, 29.136523 ], [ 121.715621, 29.125022 ], [ 121.608447, 29.168927 ], [ 121.616454, 29.143318 ], [ 121.660186, 29.118226 ], [ 121.658954, 29.058606 ], [ 121.712541, 29.028783 ], [ 121.711309, 28.985865 ], [ 121.743338, 28.954451 ], [ 121.772287, 28.898404 ], [ 121.774751, 28.863818 ], [ 121.687287, 28.863294 ], [ 121.704534, 28.804577 ], [ 121.689135, 28.719062 ], [ 121.646019, 28.682842 ], [ 121.540694, 28.655537 ], [ 121.557324, 28.645033 ], [ 121.596128, 28.575156 ], [ 121.634317, 28.562542 ], [ 121.646019, 28.511544 ], [ 121.671273, 28.472621 ], [ 121.692831, 28.407368 ], [ 121.658954, 28.392628 ], [ 121.634317, 28.347868 ], [ 121.660186, 28.355768 ], [ 121.669425, 28.33312 ], [ 121.627541, 28.251966 ], [ 121.580114, 28.240368 ], [ 121.571491, 28.279376 ], [ 121.538846, 28.299401 ], [ 121.488955, 28.301509 ], [ 121.45631, 28.250385 ], [ 121.402107, 28.197127 ], [ 121.373774, 28.133287 ], [ 121.328195, 28.134343 ], [ 121.299862, 28.067297 ], [ 121.261057, 28.034551 ], [ 121.176058, 28.022401 ], [ 121.140949, 28.031382 ], [ 121.121239, 28.12537 ], [ 121.108304, 28.139092 ], [ 121.059029, 28.096338 ], [ 121.015298, 27.981714 ], [ 120.991892, 27.95 ], [ 121.05595, 27.900294 ], [ 121.099681, 27.895005 ], [ 121.162507, 27.90717 ], [ 121.162507, 27.879136 ], [ 121.193304, 27.872259 ], [ 121.192072, 27.822518 ], [ 121.152652, 27.810344 ], [ 121.153268, 27.809815 ], [ 121.149572, 27.801875 ], [ 121.149572, 27.801345 ], [ 121.13479, 27.787051 ], [ 121.134174, 27.787051 ], [ 121.152036, 27.815638 ], [ 121.107688, 27.81352 ], [ 121.070116, 27.834162 ], [ 121.027616, 27.832574 ], [ 120.97403, 27.887071 ], [ 120.942001, 27.896592 ], [ 120.910588, 27.864852 ], [ 120.840371, 27.758986 ], [ 120.797871, 27.779638 ], [ 120.760915, 27.717671 ], [ 120.709176, 27.682699 ], [ 120.685154, 27.622797 ], [ 120.634647, 27.577186 ], [ 120.637111, 27.561271 ], [ 120.703016, 27.478475 ], [ 120.673451, 27.420055 ], [ 120.665444, 27.357884 ], [ 120.580444, 27.321203 ], [ 120.554575, 27.25206 ], [ 120.574901, 27.234501 ], [ 120.545952, 27.156785 ], [ 120.492365, 27.136016 ], [ 120.461568, 27.142407 ], [ 120.404286, 27.204166 ], [ 120.401822, 27.250996 ], [ 120.430155, 27.258976 ], [ 120.343924, 27.363199 ], [ 120.340844, 27.399867 ], [ 120.273091, 27.38924 ], [ 120.26262, 27.432804 ], [ 120.221352, 27.420055 ], [ 120.134504, 27.420055 ], [ 120.136968, 27.402523 ], [ 120.096316, 27.390302 ], [ 120.052584, 27.338747 ], [ 120.026099, 27.344063 ], [ 120.008237, 27.375423 ], [ 119.960194, 27.365857 ], [ 119.938636, 27.329709 ], [ 119.843165, 27.300464 ], [ 119.768636, 27.307909 ], [ 119.782187, 27.330241 ], [ 119.739687, 27.362668 ], [ 119.750774, 27.373829 ], [ 119.711354, 27.403054 ], [ 119.685485, 27.438646 ], [ 119.703347, 27.446613 ], [ 119.70889, 27.514042 ], [ 119.690412, 27.537394 ], [ 119.659615, 27.540578 ], [ 119.675014, 27.574534 ], [ 119.630666, 27.582491 ], [ 119.626354, 27.620676 ], [ 119.644217, 27.663619 ], [ 119.606028, 27.674749 ], [ 119.541971, 27.666799 ], [ 119.501319, 27.649837 ], [ 119.501935, 27.610601 ], [ 119.466826, 27.526249 ], [ 119.438493, 27.508734 ], [ 119.416935, 27.539517 ], [ 119.360269, 27.524657 ], [ 119.334399, 27.480067 ], [ 119.285124, 27.457766 ], [ 119.26911, 27.42218 ], [ 119.224146, 27.416868 ], [ 119.14777, 27.424836 ], [ 119.121284, 27.438115 ], [ 119.129907, 27.475289 ], [ 119.092335, 27.466262 ], [ 119.03998, 27.478475 ], [ 119.020886, 27.498118 ], [ 118.983314, 27.498649 ], [ 118.986393, 27.47582 ], [ 118.955597, 27.4498 ], [ 118.907553, 27.460952 ], [ 118.869365, 27.540047 ], [ 118.909401, 27.568168 ], [ 118.913713, 27.619616 ], [ 118.879836, 27.667859 ], [ 118.873677, 27.733563 ], [ 118.829329, 27.847921 ], [ 118.818242, 27.916689 ], [ 118.753568, 27.947885 ], [ 118.730163, 27.970615 ], [ 118.733858, 28.027684 ], [ 118.719076, 28.063601 ], [ 118.767735, 28.10584 ], [ 118.802228, 28.117453 ], [ 118.805923, 28.154923 ], [ 118.771431, 28.188687 ], [ 118.804075, 28.207675 ], [ 118.802228, 28.240368 ], [ 118.756032, 28.252493 ], [ 118.719692, 28.312047 ], [ 118.699366, 28.309939 ], [ 118.674728, 28.27147 ], [ 118.651322, 28.277267 ], [ 118.595272, 28.258292 ], [ 118.588497, 28.282538 ], [ 118.493026, 28.262509 ], [ 118.490562, 28.238259 ], [ 118.444367, 28.253548 ], [ 118.433896, 28.288335 ] ] ], [ [ [ 122.163408, 29.988137 ], [ 122.118445, 29.986582 ], [ 122.106742, 30.005759 ], [ 122.027902, 29.991247 ], [ 121.978011, 30.059125 ], [ 121.989714, 30.077252 ], [ 121.983554, 30.100554 ], [ 121.934895, 30.161631 ], [ 121.955221, 30.183878 ], [ 122.048844, 30.147141 ], [ 122.095655, 30.158008 ], [ 122.152938, 30.113497 ], [ 122.293988, 30.100554 ], [ 122.288444, 30.073109 ], [ 122.310002, 30.039958 ], [ 122.343879, 30.020269 ], [ 122.341415, 29.976733 ], [ 122.322321, 29.940438 ], [ 122.279205, 29.937326 ], [ 122.239785, 29.962735 ], [ 122.163408, 29.988137 ] ] ], [ [ [ 122.213915, 30.186464 ], [ 122.168336, 30.138343 ], [ 122.143698, 30.163183 ], [ 122.152938, 30.19112 ], [ 122.178807, 30.199396 ], [ 122.213915, 30.186464 ] ] ], [ [ [ 122.229314, 29.711995 ], [ 122.231162, 29.710435 ], [ 122.269966, 29.685482 ], [ 122.210836, 29.700559 ], [ 122.229314, 29.711995 ] ] ], [ [ [ 122.427646, 30.738422 ], [ 122.445509, 30.745109 ], [ 122.475074, 30.714243 ], [ 122.528045, 30.725047 ], [ 122.532972, 30.696748 ], [ 122.427031, 30.697777 ], [ 122.427646, 30.738422 ] ] ], [ [ [ 122.162793, 30.329654 ], [ 122.176343, 30.351863 ], [ 122.191126, 30.329654 ], [ 122.228082, 30.329654 ], [ 122.247176, 30.30124 ], [ 122.231778, 30.234562 ], [ 122.154169, 30.244903 ], [ 122.058083, 30.291938 ], [ 122.162793, 30.329654 ] ] ], [ [ [ 122.317393, 30.249556 ], [ 122.333408, 30.272817 ], [ 122.40732, 30.272817 ], [ 122.417175, 30.238699 ], [ 122.365437, 30.255242 ], [ 122.358661, 30.236113 ], [ 122.277973, 30.242835 ], [ 122.317393, 30.249556 ] ] ], [ [ [ 122.026054, 29.178333 ], [ 122.036525, 29.20759 ], [ 122.075945, 29.176243 ], [ 122.056851, 29.158476 ], [ 122.013119, 29.151681 ], [ 122.026054, 29.178333 ] ] ], [ [ [ 122.372212, 29.893234 ], [ 122.362973, 29.894272 ], [ 122.353734, 29.89946 ], [ 122.338951, 29.911911 ], [ 122.330944, 29.937845 ], [ 122.351886, 29.959105 ], [ 122.398081, 29.9394 ], [ 122.411632, 29.951846 ], [ 122.43319, 29.919173 ], [ 122.433806, 29.883376 ], [ 122.401777, 29.869884 ], [ 122.415944, 29.828877 ], [ 122.386379, 29.834069 ], [ 122.372212, 29.893234 ] ] ], [ [ [ 122.43011, 30.408655 ], [ 122.352502, 30.422074 ], [ 122.318625, 30.407106 ], [ 122.281669, 30.418461 ], [ 122.277973, 30.471603 ], [ 122.37406, 30.461802 ], [ 122.432574, 30.445294 ], [ 122.43011, 30.408655 ] ] ], [ [ [ 121.837577, 28.770484 ], [ 121.861598, 28.814016 ], [ 121.86283, 28.782024 ], [ 121.837577, 28.770484 ] ] ], [ [ [ 122.265038, 29.84549 ], [ 122.319241, 29.829397 ], [ 122.299531, 29.819532 ], [ 122.325401, 29.781621 ], [ 122.310002, 29.766557 ], [ 122.248408, 29.804473 ], [ 122.221307, 29.832512 ], [ 122.265038, 29.84549 ] ] ], [ [ [ 121.790765, 29.082144 ], [ 121.82033, 29.099402 ], [ 121.84312, 29.082144 ], [ 121.832649, 29.050236 ], [ 121.790765, 29.082144 ] ] ], [ [ [ 121.943518, 30.776993 ], [ 121.970004, 30.789333 ], [ 121.987866, 30.753338 ], [ 121.992793, 30.695204 ], [ 122.011271, 30.66947 ], [ 122.075329, 30.647848 ], [ 122.133227, 30.595317 ], [ 122.087032, 30.602014 ], [ 121.997105, 30.658659 ], [ 121.968156, 30.688514 ], [ 121.943518, 30.776993 ] ] ], [ [ [ 121.889315, 28.471569 ], [ 121.881924, 28.502603 ], [ 121.918881, 28.497344 ], [ 121.889315, 28.471569 ] ] ], [ [ [ 122.182503, 29.650642 ], [ 122.138155, 29.662083 ], [ 122.095655, 29.716673 ], [ 122.074097, 29.701599 ], [ 122.047612, 29.719791 ], [ 122.083952, 29.78318 ], [ 122.13138, 29.788893 ], [ 122.146778, 29.749412 ], [ 122.200365, 29.712515 ], [ 122.211452, 29.692241 ], [ 122.182503, 29.650642 ] ] ], [ [ [ 122.461523, 29.944068 ], [ 122.459059, 29.938882 ], [ 122.467067, 29.928509 ], [ 122.462755, 29.927991 ], [ 122.457827, 29.927472 ], [ 122.45598, 29.926435 ], [ 122.452284, 29.935252 ], [ 122.4529, 29.936807 ], [ 122.449204, 29.9394 ], [ 122.450436, 29.940956 ], [ 122.451052, 29.940956 ], [ 122.451668, 29.943031 ], [ 122.460291, 29.947179 ], [ 122.459675, 29.944586 ], [ 122.461523, 29.944068 ] ] ], [ [ [ 122.570544, 30.644244 ], [ 122.546523, 30.651967 ], [ 122.559457, 30.679764 ], [ 122.570544, 30.644244 ] ] ], [ [ [ 121.869605, 28.423685 ], [ 121.889931, 28.45105 ], [ 121.910873, 28.44 ], [ 121.869605, 28.423685 ] ] ], [ [ [ 122.391306, 29.970512 ], [ 122.3679, 29.980361 ], [ 122.378371, 30.023896 ], [ 122.411632, 30.025969 ], [ 122.391306, 29.970512 ] ] ], [ [ [ 122.065474, 30.179739 ], [ 122.025438, 30.161631 ], [ 122.017431, 30.186464 ], [ 122.055619, 30.200431 ], [ 122.065474, 30.179739 ] ] ], [ [ [ 121.850511, 29.977251 ], [ 121.844968, 29.982953 ], [ 121.84004, 30.047211 ], [ 121.848663, 30.101072 ], [ 121.88562, 30.094859 ], [ 121.924424, 30.052391 ], [ 121.933047, 29.994875 ], [ 121.874533, 29.964809 ], [ 121.850511, 29.977251 ] ] ], [ [ [ 121.066421, 27.478475 ], [ 121.067036, 27.478475 ], [ 121.107073, 27.443958 ], [ 121.066421, 27.461483 ], [ 121.066421, 27.478475 ] ] ], [ [ [ 121.952141, 29.187738 ], [ 121.976779, 29.191918 ], [ 121.979243, 29.160043 ], [ 121.952141, 29.187738 ] ] ], [ [ [ 122.038373, 29.759284 ], [ 122.02975, 29.716673 ], [ 122.011271, 29.746294 ], [ 122.038373, 29.759284 ] ] ], [ [ [ 121.957685, 30.287804 ], [ 121.921344, 30.30744 ], [ 121.94167, 30.33327 ], [ 121.989098, 30.339985 ], [ 122.0008, 30.308473 ], [ 121.957685, 30.287804 ] ] ], [ [ [ 121.940438, 30.114533 ], [ 121.962612, 30.106249 ], [ 121.945982, 30.064304 ], [ 121.910257, 30.089163 ], [ 121.940438, 30.114533 ] ] ], [ [ [ 122.155401, 29.970512 ], [ 122.154169, 29.97103 ], [ 122.152322, 29.97103 ], [ 122.163408, 29.988137 ], [ 122.196053, 29.960661 ], [ 122.155401, 29.970512 ] ] ], [ [ [ 122.287828, 29.723949 ], [ 122.251488, 29.731225 ], [ 122.2133, 29.771752 ], [ 122.241633, 29.784738 ], [ 122.258263, 29.753569 ], [ 122.301379, 29.748373 ], [ 122.287828, 29.723949 ] ] ], [ [ [ 121.134174, 27.787051 ], [ 121.13479, 27.787051 ], [ 121.134174, 27.785992 ], [ 121.134174, 27.787051 ] ] ], [ [ [ 122.264423, 30.269716 ], [ 122.300147, 30.271266 ], [ 122.315545, 30.250073 ], [ 122.253952, 30.237147 ], [ 122.264423, 30.269716 ] ] ], [ [ [ 122.282901, 29.860542 ], [ 122.301379, 29.883895 ], [ 122.343263, 29.882857 ], [ 122.343263, 29.860542 ], [ 122.30877, 29.849642 ], [ 122.282901, 29.860542 ] ] ], [ [ [ 122.781196, 30.694175 ], [ 122.757174, 30.713728 ], [ 122.778732, 30.729677 ], [ 122.799674, 30.716301 ], [ 122.781196, 30.694175 ] ] ], [ [ [ 121.098449, 27.937311 ], [ 121.038087, 27.948942 ], [ 121.0695, 27.984357 ], [ 121.120623, 27.986471 ], [ 121.152652, 27.961629 ], [ 121.098449, 27.937311 ] ] ], [ [ [ 121.185913, 27.963215 ], [ 121.17113, 27.978543 ], [ 121.197616, 28.000739 ], [ 121.237652, 27.988056 ], [ 121.185913, 27.963215 ] ] ], [ [ [ 122.454132, 29.956513 ], [ 122.455364, 29.955994 ], [ 122.458443, 29.951846 ], [ 122.459059, 29.950809 ], [ 122.447972, 29.947698 ], [ 122.446741, 29.951327 ], [ 122.445509, 29.952365 ], [ 122.447972, 29.955994 ], [ 122.454132, 29.956513 ] ] ], [ [ [ 122.836014, 30.698806 ], [ 122.807681, 30.714243 ], [ 122.831087, 30.728648 ], [ 122.836014, 30.698806 ] ] ], [ [ [ 122.200365, 29.969475 ], [ 122.239785, 29.960142 ], [ 122.273662, 29.93214 ], [ 122.233626, 29.946661 ], [ 122.200365, 29.969475 ] ] ], [ [ [ 122.029134, 29.954957 ], [ 122.058699, 29.955994 ], [ 122.043916, 29.930584 ], [ 122.029134, 29.954957 ] ] ], [ [ [ 121.044247, 27.979072 ], [ 121.073812, 28.007608 ], [ 121.089826, 27.998625 ], [ 121.044247, 27.979072 ] ] ], [ [ [ 122.471378, 29.927472 ], [ 122.47261, 29.927472 ], [ 122.473226, 29.925397 ], [ 122.470762, 29.925916 ], [ 122.471378, 29.927472 ] ] ], [ [ [ 122.152322, 29.97103 ], [ 122.154169, 29.97103 ], [ 122.155401, 29.970512 ], [ 122.152322, 29.97103 ] ] ] ] } },\n{ \"type\": \"Feature\", \"properties\": { \"adcode\": \"340000\", \"name\": \"安徽省\", \"center\": [ 117.283042, 31.86119 ], \"centroid\": [ 117.226862, 31.849273 ], \"childrenNum\": 16, \"level\": \"province\", \"parent\": { \"adcode\": 100000 }, \"subFeatureIndex\": 11, \"acroutes\": [ 100000 ] }, \"geometry\": { \"type\": \"MultiPolygon\", \"coordinates\": [ [ [ [ 116.599629, 34.014324 ], [ 116.599629, 34.014324 ], [ 116.576223, 34.068873 ], [ 116.576223, 34.068873 ], [ 116.52818, 34.122892 ], [ 116.536187, 34.151127 ], [ 116.565752, 34.16945 ], [ 116.542962, 34.203608 ], [ 116.545426, 34.241711 ], [ 116.582382, 34.266444 ], [ 116.562056, 34.285731 ], [ 116.516477, 34.296114 ], [ 116.456731, 34.268917 ], [ 116.409303, 34.273863 ], [ 116.409303, 34.273863 ], [ 116.372347, 34.26595 ], [ 116.363724, 34.316877 ], [ 116.301514, 34.342082 ], [ 116.255934, 34.376665 ], [ 116.213435, 34.382098 ], [ 116.215898, 34.403333 ], [ 116.178942, 34.430487 ], [ 116.162312, 34.459605 ], [ 116.178326, 34.496112 ], [ 116.204196, 34.508442 ], [ 116.191261, 34.535561 ], [ 116.196804, 34.575977 ], [ 116.247927, 34.551829 ], [ 116.286116, 34.608986 ], [ 116.32492, 34.601104 ], [ 116.334159, 34.620806 ], [ 116.374195, 34.640011 ], [ 116.430245, 34.650843 ], [ 116.432709, 34.630163 ], [ 116.477057, 34.614896 ], [ 116.490607, 34.573513 ], [ 116.594085, 34.511894 ], [ 116.592237, 34.493646 ], [ 116.662454, 34.472927 ], [ 116.722816, 34.472434 ], [ 116.773939, 34.453683 ], [ 116.782563, 34.429993 ], [ 116.828142, 34.389012 ], [ 116.909446, 34.408271 ], [ 116.969192, 34.389012 ], [ 116.960569, 34.363821 ], [ 116.983359, 34.348011 ], [ 116.969192, 34.283753 ], [ 117.051112, 34.221425 ], [ 117.025243, 34.167469 ], [ 117.046801, 34.151622 ], [ 117.123793, 34.128342 ], [ 117.130568, 34.101586 ], [ 117.192162, 34.068873 ], [ 117.257452, 34.065899 ], [ 117.277162, 34.078787 ], [ 117.311654, 34.067882 ], [ 117.357234, 34.088205 ], [ 117.404045, 34.03218 ], [ 117.435458, 34.028212 ], [ 117.514914, 34.060941 ], [ 117.543248, 34.038627 ], [ 117.569117, 33.985051 ], [ 117.612849, 34.000433 ], [ 117.629479, 34.028708 ], [ 117.671363, 33.992494 ], [ 117.672595, 33.934916 ], [ 117.715095, 33.879287 ], [ 117.753899, 33.891211 ], [ 117.759442, 33.874318 ], [ 117.739732, 33.758467 ], [ 117.72495, 33.74951 ], [ 117.750203, 33.710688 ], [ 117.791471, 33.733585 ], [ 117.843826, 33.736074 ], [ 117.901724, 33.720146 ], [ 117.972557, 33.74951 ], [ 118.019985, 33.738562 ], [ 118.065564, 33.76593 ], [ 118.117919, 33.766427 ], [ 118.161035, 33.735576 ], [ 118.16781, 33.663381 ], [ 118.112376, 33.617045 ], [ 118.117919, 33.594615 ], [ 118.107448, 33.475391 ], [ 118.050782, 33.491863 ], [ 118.027376, 33.455421 ], [ 118.016905, 33.402978 ], [ 118.029224, 33.374995 ], [ 117.992883, 33.333005 ], [ 117.974405, 33.279487 ], [ 117.939297, 33.262475 ], [ 117.942376, 33.224936 ], [ 117.977485, 33.226437 ], [ 117.988572, 33.180869 ], [ 118.037231, 33.152314 ], [ 118.038463, 33.134776 ], [ 118.149332, 33.169348 ], [ 118.178281, 33.217926 ], [ 118.217085, 33.191888 ], [ 118.219549, 33.114227 ], [ 118.243571, 33.027967 ], [ 118.244803, 32.998359 ], [ 118.26944, 32.969242 ], [ 118.303933, 32.96874 ], [ 118.291614, 32.946143 ], [ 118.252194, 32.936601 ], [ 118.2331, 32.914498 ], [ 118.250346, 32.848157 ], [ 118.301469, 32.846145 ], [ 118.300237, 32.783275 ], [ 118.334114, 32.761637 ], [ 118.363063, 32.770695 ], [ 118.375382, 32.718849 ], [ 118.411106, 32.715828 ], [ 118.450526, 32.743518 ], [ 118.483787, 32.721367 ], [ 118.560163, 32.729926 ], [ 118.572482, 32.719856 ], [ 118.642699, 32.744525 ], [ 118.707373, 32.72036 ], [ 118.756648, 32.737477 ], [ 118.73817, 32.772708 ], [ 118.743097, 32.853184 ], [ 118.743097, 32.853184 ], [ 118.810235, 32.853687 ], [ 118.821322, 32.920527 ], [ 118.846575, 32.922034 ], [ 118.849039, 32.956689 ], [ 118.89585, 32.957694 ], [ 118.89585, 32.957694 ], [ 118.892771, 32.941121 ], [ 118.934039, 32.93861 ], [ 118.993169, 32.958196 ], [ 119.020886, 32.955685 ], [ 119.054763, 32.8748 ], [ 119.113277, 32.823014 ], [ 119.184726, 32.825529 ], [ 119.211827, 32.708275 ], [ 119.208748, 32.641276 ], [ 119.230921, 32.607001 ], [ 119.22045, 32.576748 ], [ 119.152697, 32.557582 ], [ 119.168096, 32.536394 ], [ 119.142226, 32.499556 ], [ 119.084944, 32.452602 ], [ 119.041212, 32.515201 ], [ 118.975923, 32.505108 ], [ 118.922336, 32.557078 ], [ 118.92172, 32.557078 ], [ 118.922336, 32.557078 ], [ 118.92172, 32.557078 ], [ 118.890923, 32.553042 ], [ 118.908169, 32.59238 ], [ 118.84288, 32.56767 ], [ 118.820706, 32.60448 ], [ 118.784981, 32.582295 ], [ 118.757264, 32.603976 ], [ 118.73509, 32.58885 ], [ 118.719076, 32.614059 ], [ 118.719076, 32.614059 ], [ 118.688895, 32.588346 ], [ 118.658714, 32.594397 ], [ 118.632844, 32.578261 ], [ 118.59712, 32.600951 ], [ 118.568787, 32.585825 ], [ 118.564475, 32.562122 ], [ 118.608823, 32.536899 ], [ 118.592192, 32.481383 ], [ 118.628533, 32.467751 ], [ 118.691359, 32.472295 ], [ 118.685199, 32.403604 ], [ 118.703061, 32.328792 ], [ 118.657482, 32.30148 ], [ 118.674728, 32.250375 ], [ 118.643931, 32.209875 ], [ 118.510888, 32.194176 ], [ 118.49549, 32.165304 ], [ 118.501033, 32.121726 ], [ 118.433896, 32.086746 ], [ 118.394476, 32.076098 ], [ 118.389548, 31.985281 ], [ 118.363679, 31.930443 ], [ 118.472084, 31.879639 ], [ 118.466541, 31.857784 ], [ 118.504729, 31.841516 ], [ 118.481939, 31.778453 ], [ 118.533678, 31.76726 ], [ 118.521975, 31.743343 ], [ 118.5577, 31.73011 ], [ 118.571866, 31.746397 ], [ 118.641467, 31.75861 ], [ 118.653786, 31.73011 ], [ 118.697518, 31.709747 ], [ 118.643315, 31.671555 ], [ 118.643315, 31.649651 ], [ 118.736322, 31.633347 ], [ 118.748025, 31.675629 ], [ 118.773894, 31.682759 ], [ 118.802844, 31.619078 ], [ 118.858894, 31.623665 ], [ 118.881684, 31.564023 ], [ 118.885995, 31.519139 ], [ 118.868133, 31.520669 ], [ 118.857046, 31.506384 ], [ 118.883532, 31.500261 ], [ 118.852119, 31.393553 ], [ 118.824401, 31.375672 ], [ 118.767735, 31.363919 ], [ 118.745561, 31.372606 ], [ 118.720924, 31.322518 ], [ 118.726467, 31.282121 ], [ 118.756648, 31.279564 ], [ 118.794836, 31.229426 ], [ 118.870597, 31.242219 ], [ 118.984546, 31.237102 ], [ 119.014727, 31.241707 ], [ 119.10527, 31.235055 ], [ 119.107118, 31.250917 ], [ 119.158241, 31.294907 ], [ 119.197661, 31.295418 ], [ 119.198277, 31.270357 ], [ 119.266646, 31.250405 ], [ 119.294363, 31.263195 ], [ 119.338095, 31.259103 ], [ 119.350414, 31.301043 ], [ 119.374435, 31.258591 ], [ 119.360269, 31.213049 ], [ 119.391682, 31.174142 ], [ 119.439109, 31.177214 ], [ 119.461283, 31.156219 ], [ 119.532732, 31.159291 ], [ 119.599869, 31.10909 ], [ 119.623891, 31.130096 ], [ 119.649144, 31.104991 ], [ 119.629434, 31.085517 ], [ 119.633746, 31.019379 ], [ 119.580159, 30.967051 ], [ 119.582007, 30.932149 ], [ 119.563529, 30.919315 ], [ 119.557369, 30.874124 ], [ 119.575847, 30.829939 ], [ 119.55429, 30.825828 ], [ 119.527188, 30.77905 ], [ 119.479761, 30.772365 ], [ 119.482841, 30.704467 ], [ 119.444652, 30.650422 ], [ 119.408312, 30.645274 ], [ 119.39045, 30.685941 ], [ 119.343022, 30.664322 ], [ 119.323312, 30.630341 ], [ 119.238929, 30.609225 ], [ 119.265414, 30.574709 ], [ 119.237081, 30.546881 ], [ 119.272189, 30.510281 ], [ 119.326392, 30.532964 ], [ 119.336247, 30.508734 ], [ 119.335015, 30.448389 ], [ 119.36766, 30.38491 ], [ 119.402768, 30.374584 ], [ 119.349182, 30.349281 ], [ 119.326392, 30.372002 ], [ 119.277117, 30.341018 ], [ 119.246936, 30.341018 ], [ 119.236465, 30.297106 ], [ 119.201356, 30.290905 ], [ 119.126828, 30.304856 ], [ 119.091719, 30.323972 ], [ 119.06277, 30.304856 ], [ 118.988857, 30.332237 ], [ 118.954365, 30.360126 ], [ 118.880452, 30.31519 ], [ 118.877988, 30.282637 ], [ 118.905089, 30.216464 ], [ 118.929727, 30.2025 ], [ 118.852735, 30.166805 ], [ 118.852119, 30.149729 ], [ 118.895234, 30.148694 ], [ 118.873677, 30.11505 ], [ 118.878604, 30.064822 ], [ 118.902626, 30.029078 ], [ 118.894619, 29.937845 ], [ 118.838568, 29.934733 ], [ 118.841032, 29.891159 ], [ 118.740634, 29.814859 ], [ 118.744945, 29.73902 ], [ 118.700598, 29.706277 ], [ 118.647011, 29.64336 ], [ 118.61991, 29.654282 ], [ 118.573714, 29.638159 ], [ 118.532446, 29.588731 ], [ 118.500417, 29.57572 ], [ 118.496106, 29.519492 ], [ 118.381541, 29.504909 ], [ 118.347664, 29.474174 ], [ 118.329802, 29.495012 ], [ 118.306396, 29.479384 ], [ 118.316252, 29.422581 ], [ 118.248498, 29.431443 ], [ 118.193064, 29.395472 ], [ 118.136397, 29.418932 ], [ 118.127774, 29.47209 ], [ 118.143788, 29.489803 ], [ 118.095129, 29.534072 ], [ 118.050782, 29.542924 ], [ 118.042774, 29.566351 ], [ 118.00397, 29.578322 ], [ 117.933753, 29.549172 ], [ 117.872775, 29.54761 ], [ 117.795167, 29.570515 ], [ 117.729877, 29.550213 ], [ 117.690457, 29.555939 ], [ 117.678754, 29.595496 ], [ 117.647957, 29.614749 ], [ 117.608537, 29.591333 ], [ 117.543248, 29.588731 ], [ 117.523538, 29.630356 ], [ 117.530313, 29.654282 ], [ 117.490277, 29.660003 ], [ 117.453936, 29.688082 ], [ 117.455168, 29.749412 ], [ 117.408973, 29.802396 ], [ 117.415132, 29.85068 ], [ 117.382487, 29.840818 ], [ 117.359082, 29.812782 ], [ 117.338756, 29.848085 ], [ 117.29256, 29.822647 ], [ 117.25314, 29.834588 ], [ 117.261763, 29.880781 ], [ 117.246365, 29.915023 ], [ 117.2168, 29.926953 ], [ 117.171836, 29.920729 ], [ 117.129952, 29.89946 ], [ 117.127489, 29.86158 ], [ 117.073286, 29.831992 ], [ 117.123177, 29.798761 ], [ 117.136728, 29.775388 ], [ 117.108395, 29.75201 ], [ 117.112706, 29.711995 ], [ 117.041873, 29.680803 ], [ 116.996294, 29.683403 ], [ 116.974736, 29.657403 ], [ 116.939627, 29.648561 ], [ 116.873722, 29.609546 ], [ 116.849084, 29.57624 ], [ 116.780715, 29.569994 ], [ 116.760389, 29.599139 ], [ 116.721585, 29.564789 ], [ 116.716657, 29.590813 ], [ 116.651983, 29.637118 ], [ 116.680317, 29.681323 ], [ 116.704954, 29.688602 ], [ 116.706802, 29.6964 ], [ 116.70557, 29.69692 ], [ 116.698795, 29.707836 ], [ 116.673541, 29.709916 ], [ 116.762237, 29.802396 ], [ 116.780715, 29.792529 ], [ 116.882961, 29.893753 ], [ 116.900207, 29.949253 ], [ 116.868794, 29.980361 ], [ 116.83307, 29.95755 ], [ 116.830606, 30.004723 ], [ 116.802889, 29.99643 ], [ 116.783794, 30.030632 ], [ 116.747454, 30.057053 ], [ 116.720353, 30.053945 ], [ 116.666766, 30.076734 ], [ 116.620571, 30.073109 ], [ 116.585462, 30.045657 ], [ 116.552201, 29.909836 ], [ 116.525716, 29.897385 ], [ 116.467818, 29.896347 ], [ 116.342782, 29.835626 ], [ 116.280572, 29.788893 ], [ 116.250391, 29.785777 ], [ 116.227601, 29.816936 ], [ 116.172783, 29.828358 ], [ 116.13521, 29.819532 ], [ 116.128435, 29.897904 ], [ 116.073616, 29.969993 ], [ 116.091479, 30.036331 ], [ 116.078544, 30.062233 ], [ 116.088399, 30.110391 ], [ 116.055754, 30.180774 ], [ 116.065609, 30.204569 ], [ 115.997856, 30.252657 ], [ 115.985537, 30.290905 ], [ 115.903001, 30.31364 ], [ 115.91532, 30.337919 ], [ 115.885139, 30.379747 ], [ 115.921479, 30.416397 ], [ 115.894994, 30.452517 ], [ 115.910393, 30.519046 ], [ 115.887603, 30.542758 ], [ 115.876516, 30.582438 ], [ 115.848799, 30.602014 ], [ 115.819234, 30.597893 ], [ 115.81369, 30.637035 ], [ 115.762567, 30.685426 ], [ 115.782893, 30.751795 ], [ 115.851262, 30.756938 ], [ 115.863581, 30.815549 ], [ 115.848799, 30.828397 ], [ 115.865429, 30.864364 ], [ 115.932566, 30.889532 ], [ 115.976298, 30.931636 ], [ 116.03974, 30.957813 ], [ 116.071769, 30.956787 ], [ 116.058834, 31.012711 ], [ 116.015102, 31.011685 ], [ 116.006479, 31.034764 ], [ 115.938726, 31.04707 ], [ 115.939958, 31.071678 ], [ 115.887603, 31.10909 ], [ 115.867277, 31.147512 ], [ 115.837712, 31.127022 ], [ 115.797676, 31.128047 ], [ 115.778582, 31.112164 ], [ 115.700973, 31.201276 ], [ 115.655394, 31.211002 ], [ 115.603655, 31.17363 ], [ 115.585793, 31.143926 ], [ 115.540213, 31.194621 ], [ 115.539597, 31.231985 ], [ 115.507568, 31.267799 ], [ 115.473076, 31.265242 ], [ 115.443511, 31.344498 ], [ 115.40717, 31.337854 ], [ 115.372062, 31.349098 ], [ 115.393004, 31.389977 ], [ 115.373909, 31.405813 ], [ 115.389924, 31.450241 ], [ 115.371446, 31.495668 ], [ 115.415793, 31.525771 ], [ 115.439815, 31.588496 ], [ 115.485394, 31.608885 ], [ 115.476771, 31.643028 ], [ 115.495249, 31.673083 ], [ 115.534054, 31.698545 ], [ 115.553764, 31.69549 ], [ 115.676336, 31.778453 ], [ 115.731154, 31.76726 ], [ 115.767495, 31.78761 ], [ 115.808147, 31.770313 ], [ 115.808147, 31.770313 ], [ 115.851878, 31.786593 ], [ 115.886371, 31.776418 ], [ 115.914704, 31.814567 ], [ 115.893762, 31.832365 ], [ 115.894994, 31.8649 ], [ 115.920248, 31.920285 ], [ 115.909161, 31.94314 ], [ 115.928871, 32.003046 ], [ 115.922095, 32.049725 ], [ 115.941805, 32.166318 ], [ 115.912856, 32.227596 ], [ 115.899306, 32.390971 ], [ 115.865429, 32.458662 ], [ 115.883291, 32.487946 ], [ 115.845719, 32.501575 ], [ 115.8759, 32.542448 ], [ 115.910393, 32.567165 ], [ 115.891298, 32.576243 ], [ 115.861117, 32.537403 ], [ 115.789052, 32.468761 ], [ 115.771806, 32.505108 ], [ 115.742241, 32.476335 ], [ 115.704669, 32.495013 ], [ 115.667712, 32.409667 ], [ 115.657857, 32.428864 ], [ 115.626445, 32.40512 ], [ 115.604271, 32.425833 ], [ 115.57101, 32.419266 ], [ 115.522967, 32.441997 ], [ 115.509416, 32.466741 ], [ 115.510648, 32.467751 ], [ 115.510648, 32.468256 ], [ 115.510648, 32.468761 ], [ 115.5088, 32.468761 ], [ 115.497713, 32.492489 ], [ 115.409018, 32.549007 ], [ 115.411482, 32.575235 ], [ 115.304924, 32.553042 ], [ 115.30554, 32.583303 ], [ 115.267352, 32.578261 ], [ 115.24333, 32.593388 ], [ 115.20083, 32.591876 ], [ 115.182968, 32.666973 ], [ 115.179273, 32.726402 ], [ 115.189744, 32.770695 ], [ 115.211301, 32.785791 ], [ 115.189744, 32.812452 ], [ 115.197135, 32.856201 ], [ 115.155867, 32.864747 ], [ 115.139237, 32.897917 ], [ 115.029599, 32.906962 ], [ 115.035143, 32.932582 ], [ 115.009273, 32.940117 ], [ 114.943368, 32.935094 ], [ 114.916266, 32.971251 ], [ 114.883006, 32.990328 ], [ 114.891629, 33.020441 ], [ 114.925506, 33.016928 ], [ 114.913187, 33.083143 ], [ 114.897172, 33.086653 ], [ 114.902716, 33.129764 ], [ 114.932897, 33.153817 ], [ 114.966158, 33.147304 ], [ 114.990795, 33.102195 ], [ 115.041302, 33.086653 ], [ 115.168186, 33.088658 ], [ 115.194671, 33.120743 ], [ 115.245178, 33.135778 ], [ 115.289526, 33.131769 ], [ 115.303692, 33.149809 ], [ 115.300613, 33.204407 ], [ 115.340033, 33.260973 ], [ 115.335105, 33.297997 ], [ 115.361591, 33.298497 ], [ 115.365286, 33.336005 ], [ 115.341881, 33.370997 ], [ 115.313547, 33.376994 ], [ 115.328946, 33.403477 ], [ 115.316627, 33.44893 ], [ 115.345576, 33.449928 ], [ 115.345576, 33.502842 ], [ 115.366518, 33.5233 ], [ 115.394851, 33.506335 ], [ 115.422569, 33.557219 ], [ 115.463837, 33.567193 ], [ 115.561771, 33.563703 ], [ 115.564851, 33.576169 ], [ 115.639995, 33.585143 ], [ 115.601191, 33.658898 ], [ 115.601807, 33.718653 ], [ 115.563003, 33.772895 ], [ 115.576553, 33.787817 ], [ 115.614126, 33.775879 ], [ 115.631988, 33.869846 ], [ 115.547604, 33.874815 ], [ 115.577785, 33.950307 ], [ 115.579017, 33.974133 ], [ 115.60735, 34.030196 ], [ 115.642459, 34.03218 ], [ 115.658473, 34.061437 ], [ 115.705901, 34.059949 ], [ 115.736082, 34.076805 ], [ 115.809378, 34.062428 ], [ 115.846335, 34.028708 ], [ 115.852494, 34.003906 ], [ 115.877132, 34.002913 ], [ 115.876516, 34.028708 ], [ 115.904233, 34.009859 ], [ 115.95782, 34.007875 ], [ 116.00032, 33.965199 ], [ 115.982457, 33.917039 ], [ 116.05945, 33.860902 ], [ 116.055754, 33.804727 ], [ 116.074232, 33.781351 ], [ 116.100102, 33.782843 ], [ 116.132747, 33.751501 ], [ 116.155536, 33.709693 ], [ 116.2005, 33.72612 ], [ 116.263326, 33.730101 ], [ 116.316912, 33.771402 ], [ 116.393905, 33.782843 ], [ 116.408071, 33.805721 ], [ 116.437021, 33.801246 ], [ 116.437637, 33.846489 ], [ 116.486296, 33.869846 ], [ 116.558361, 33.881274 ], [ 116.566984, 33.9081 ], [ 116.631042, 33.887733 ], [ 116.64336, 33.896675 ], [ 116.641512, 33.978103 ], [ 116.599629, 34.014324 ] ] ], [ [ [ 118.868133, 31.520669 ], [ 118.885995, 31.519139 ], [ 118.883532, 31.500261 ], [ 118.857046, 31.506384 ], [ 118.868133, 31.520669 ] ] ], [ [ [ 116.698795, 29.707836 ], [ 116.70557, 29.69692 ], [ 116.706802, 29.6964 ], [ 116.704954, 29.688602 ], [ 116.680317, 29.681323 ], [ 116.653831, 29.694841 ], [ 116.673541, 29.709916 ], [ 116.698795, 29.707836 ] ] ], [ [ [ 115.5088, 32.468761 ], [ 115.510648, 32.468761 ], [ 115.510648, 32.468256 ], [ 115.510648, 32.467751 ], [ 115.509416, 32.466741 ], [ 115.5088, 32.468761 ] ] ] ] } },\n{ \"type\": \"Feature\", \"properties\": { \"adcode\": \"350000\", \"name\": \"福建省\", \"center\": [ 119.306239, 26.075302 ], \"centroid\": [ 118.006365, 26.069889 ], \"childrenNum\": 9, \"level\": \"province\", \"parent\": { \"adcode\": 100000 }, \"subFeatureIndex\": 12, \"acroutes\": [ 100000 ] }, \"geometry\": { \"type\": \"MultiPolygon\", \"coordinates\": [ [ [ [ 119.004872, 24.970009 ], [ 119.007335, 24.963499 ], [ 119.032589, 24.961871 ], [ 119.032589, 24.961328 ], [ 119.014111, 24.941252 ], [ 118.945741, 24.954275 ], [ 118.91864, 24.932569 ], [ 118.932807, 24.906518 ], [ 118.987009, 24.898375 ], [ 118.988857, 24.878831 ], [ 118.933423, 24.870687 ], [ 118.864437, 24.887518 ], [ 118.834256, 24.854397 ], [ 118.807771, 24.870687 ], [ 118.748641, 24.84245 ], [ 118.69875, 24.848967 ], [ 118.702445, 24.865258 ], [ 118.647627, 24.843536 ], [ 118.650707, 24.808774 ], [ 118.786213, 24.77672 ], [ 118.778822, 24.743569 ], [ 118.703677, 24.665278 ], [ 118.670417, 24.679962 ], [ 118.652554, 24.653857 ], [ 118.661178, 24.622306 ], [ 118.687047, 24.63373 ], [ 118.680272, 24.58204 ], [ 118.614366, 24.521617 ], [ 118.558316, 24.51236 ], [ 118.557084, 24.572788 ], [ 118.512736, 24.60816 ], [ 118.444367, 24.614689 ], [ 118.363679, 24.567889 ], [ 118.375382, 24.536317 ], [ 118.242955, 24.51236 ], [ 118.169042, 24.559725 ], [ 118.150564, 24.583673 ], [ 118.121615, 24.570067 ], [ 118.084042, 24.528695 ], [ 118.048934, 24.418122 ], [ 118.088354, 24.408858 ], [ 118.081579, 24.35653 ], [ 118.112376, 24.357075 ], [ 118.158571, 24.269814 ], [ 118.115455, 24.229435 ], [ 118.074803, 24.225615 ], [ 118.019369, 24.197232 ], [ 118.000275, 24.152462 ], [ 117.936217, 24.100029 ], [ 117.927594, 24.039922 ], [ 117.910347, 24.012045 ], [ 117.864768, 24.004938 ], [ 117.807486, 23.947521 ], [ 117.792703, 23.906494 ], [ 117.762522, 23.886796 ], [ 117.691073, 23.888985 ], [ 117.671979, 23.878041 ], [ 117.651653, 23.815093 ], [ 117.660276, 23.789357 ], [ 117.601762, 23.70171 ], [ 117.54448, 23.715956 ], [ 117.501364, 23.70445 ], [ 117.493357, 23.642514 ], [ 117.454552, 23.628259 ], [ 117.463791, 23.584937 ], [ 117.387415, 23.555317 ], [ 117.302415, 23.550379 ], [ 117.291328, 23.571225 ], [ 117.192778, 23.5619 ], [ 117.192778, 23.629356 ], [ 117.147199, 23.654027 ], [ 117.123793, 23.647448 ], [ 117.055424, 23.694038 ], [ 117.048032, 23.758687 ], [ 117.019083, 23.801952 ], [ 117.012308, 23.855054 ], [ 116.981511, 23.855602 ], [ 116.955642, 23.922359 ], [ 116.976583, 23.931659 ], [ 116.981511, 23.999471 ], [ 116.953178, 24.008218 ], [ 116.930388, 24.064514 ], [ 116.9347, 24.126794 ], [ 116.998757, 24.179217 ], [ 116.956257, 24.216883 ], [ 116.933468, 24.220157 ], [ 116.938395, 24.28127 ], [ 116.914374, 24.287817 ], [ 116.919301, 24.321087 ], [ 116.895895, 24.350533 ], [ 116.903903, 24.369614 ], [ 116.839229, 24.442097 ], [ 116.860787, 24.460075 ], [ 116.83307, 24.496568 ], [ 116.796729, 24.502014 ], [ 116.759157, 24.545572 ], [ 116.761005, 24.583128 ], [ 116.815207, 24.654944 ], [ 116.777635, 24.679418 ], [ 116.667382, 24.658752 ], [ 116.623034, 24.64189 ], [ 116.600861, 24.654401 ], [ 116.570679, 24.621762 ], [ 116.530027, 24.604895 ], [ 116.506622, 24.621218 ], [ 116.517709, 24.652225 ], [ 116.485064, 24.720196 ], [ 116.44626, 24.714216 ], [ 116.416079, 24.744113 ], [ 116.419158, 24.767482 ], [ 116.375427, 24.803885 ], [ 116.381586, 24.82507 ], [ 116.417927, 24.840821 ], [ 116.395137, 24.877746 ], [ 116.363724, 24.87123 ], [ 116.345862, 24.828872 ], [ 116.297202, 24.801712 ], [ 116.244232, 24.793563 ], [ 116.251007, 24.82507 ], [ 116.221442, 24.829959 ], [ 116.191877, 24.877203 ], [ 116.153073, 24.846795 ], [ 116.068073, 24.850053 ], [ 116.015102, 24.905975 ], [ 115.985537, 24.899461 ], [ 115.907929, 24.923343 ], [ 115.89253, 24.936911 ], [ 115.870356, 24.959701 ], [ 115.925175, 24.960786 ], [ 115.873436, 25.019911 ], [ 115.928255, 25.050276 ], [ 115.908545, 25.084428 ], [ 115.880212, 25.092016 ], [ 115.888219, 25.128866 ], [ 115.860501, 25.165704 ], [ 115.855574, 25.20957 ], [ 115.930719, 25.236099 ], [ 115.949813, 25.292386 ], [ 115.987385, 25.290221 ], [ 116.008327, 25.319437 ], [ 115.992928, 25.374063 ], [ 116.023109, 25.435691 ], [ 116.005247, 25.490264 ], [ 116.03666, 25.514571 ], [ 116.040356, 25.548052 ], [ 116.063145, 25.56317 ], [ 116.041588, 25.62416 ], [ 116.068689, 25.646282 ], [ 116.067457, 25.703995 ], [ 116.106877, 25.701299 ], [ 116.129667, 25.758985 ], [ 116.18079, 25.778926 ], [ 116.131515, 25.824185 ], [ 116.132131, 25.860273 ], [ 116.17771, 25.894195 ], [ 116.225138, 25.908731 ], [ 116.258398, 25.902809 ], [ 116.303362, 25.924341 ], [ 116.326152, 25.956631 ], [ 116.369883, 25.963088 ], [ 116.360028, 25.991601 ], [ 116.384666, 26.030864 ], [ 116.489375, 26.113649 ], [ 116.476441, 26.172745 ], [ 116.435789, 26.159854 ], [ 116.392057, 26.171133 ], [ 116.400064, 26.202819 ], [ 116.385282, 26.238253 ], [ 116.412999, 26.297822 ], [ 116.437021, 26.308016 ], [ 116.459194, 26.345026 ], [ 116.499846, 26.361651 ], [ 116.519557, 26.410437 ], [ 116.553433, 26.400253 ], [ 116.553433, 26.365404 ], [ 116.601476, 26.372911 ], [ 116.608252, 26.429732 ], [ 116.638433, 26.477418 ], [ 116.610716, 26.476882 ], [ 116.597165, 26.512768 ], [ 116.539267, 26.559349 ], [ 116.553433, 26.575942 ], [ 116.566368, 26.650315 ], [ 116.520172, 26.684543 ], [ 116.515245, 26.720898 ], [ 116.557745, 26.773806 ], [ 116.543578, 26.803723 ], [ 116.548506, 26.84004 ], [ 116.602092, 26.888623 ], [ 116.632889, 26.933984 ], [ 116.679085, 26.978259 ], [ 116.817671, 27.018252 ], [ 116.851548, 27.009188 ], [ 116.910062, 27.034779 ], [ 116.936547, 27.019319 ], [ 116.967344, 27.061962 ], [ 117.05296, 27.100327 ], [ 117.044953, 27.146667 ], [ 117.149662, 27.241419 ], [ 117.171836, 27.29036 ], [ 117.136728, 27.303123 ], [ 117.140423, 27.322798 ], [ 117.104699, 27.330773 ], [ 117.107163, 27.393491 ], [ 117.133032, 27.42218 ], [ 117.110242, 27.458828 ], [ 117.103467, 27.533149 ], [ 117.076982, 27.566046 ], [ 117.054808, 27.5427 ], [ 117.01662, 27.563393 ], [ 117.024627, 27.592569 ], [ 117.003685, 27.625449 ], [ 117.040641, 27.669979 ], [ 117.065279, 27.665739 ], [ 117.094228, 27.627569 ], [ 117.11209, 27.645596 ], [ 117.096076, 27.667329 ], [ 117.114554, 27.692238 ], [ 117.174916, 27.677399 ], [ 117.204481, 27.683759 ], [ 117.205097, 27.714492 ], [ 117.245133, 27.71926 ], [ 117.296256, 27.764282 ], [ 117.303031, 27.833103 ], [ 117.276546, 27.847921 ], [ 117.280242, 27.871201 ], [ 117.334444, 27.8876 ], [ 117.341836, 27.855858 ], [ 117.366473, 27.88231 ], [ 117.407741, 27.893948 ], [ 117.453936, 27.939955 ], [ 117.477958, 27.930966 ], [ 117.52169, 27.982243 ], [ 117.556182, 27.966387 ], [ 117.609769, 27.863265 ], [ 117.649805, 27.851625 ], [ 117.68245, 27.823577 ], [ 117.704624, 27.834162 ], [ 117.740348, 27.800286 ], [ 117.788392, 27.855858 ], [ 117.78716, 27.896063 ], [ 117.856145, 27.94577 ], [ 117.910963, 27.949471 ], [ 117.942992, 27.974315 ], [ 117.965166, 27.962687 ], [ 117.999043, 27.991227 ], [ 118.096977, 27.970615 ], [ 118.094513, 28.003909 ], [ 118.129006, 28.017118 ], [ 118.120999, 28.041946 ], [ 118.153644, 28.062016 ], [ 118.199839, 28.049869 ], [ 118.242339, 28.075746 ], [ 118.356288, 28.091586 ], [ 118.361215, 28.155978 ], [ 118.375382, 28.186577 ], [ 118.339041, 28.193962 ], [ 118.314404, 28.221913 ], [ 118.424041, 28.291497 ], [ 118.433896, 28.288335 ], [ 118.444367, 28.253548 ], [ 118.490562, 28.238259 ], [ 118.493026, 28.262509 ], [ 118.588497, 28.282538 ], [ 118.595272, 28.258292 ], [ 118.651322, 28.277267 ], [ 118.674728, 28.27147 ], [ 118.699366, 28.309939 ], [ 118.719692, 28.312047 ], [ 118.756032, 28.252493 ], [ 118.802228, 28.240368 ], [ 118.804075, 28.207675 ], [ 118.771431, 28.188687 ], [ 118.805923, 28.154923 ], [ 118.802228, 28.117453 ], [ 118.767735, 28.10584 ], [ 118.719076, 28.063601 ], [ 118.733858, 28.027684 ], [ 118.730163, 27.970615 ], [ 118.753568, 27.947885 ], [ 118.818242, 27.916689 ], [ 118.829329, 27.847921 ], [ 118.873677, 27.733563 ], [ 118.879836, 27.667859 ], [ 118.913713, 27.619616 ], [ 118.909401, 27.568168 ], [ 118.869365, 27.540047 ], [ 118.907553, 27.460952 ], [ 118.955597, 27.4498 ], [ 118.986393, 27.47582 ], [ 118.983314, 27.498649 ], [ 119.020886, 27.498118 ], [ 119.03998, 27.478475 ], [ 119.092335, 27.466262 ], [ 119.129907, 27.475289 ], [ 119.121284, 27.438115 ], [ 119.14777, 27.424836 ], [ 119.224146, 27.416868 ], [ 119.26911, 27.42218 ], [ 119.285124, 27.457766 ], [ 119.334399, 27.480067 ], [ 119.360269, 27.524657 ], [ 119.416935, 27.539517 ], [ 119.438493, 27.508734 ], [ 119.466826, 27.526249 ], [ 119.501935, 27.610601 ], [ 119.501319, 27.649837 ], [ 119.541971, 27.666799 ], [ 119.606028, 27.674749 ], [ 119.644217, 27.663619 ], [ 119.626354, 27.620676 ], [ 119.630666, 27.582491 ], [ 119.675014, 27.574534 ], [ 119.659615, 27.540578 ], [ 119.690412, 27.537394 ], [ 119.70889, 27.514042 ], [ 119.703347, 27.446613 ], [ 119.685485, 27.438646 ], [ 119.711354, 27.403054 ], [ 119.750774, 27.373829 ], [ 119.739687, 27.362668 ], [ 119.782187, 27.330241 ], [ 119.768636, 27.307909 ], [ 119.843165, 27.300464 ], [ 119.938636, 27.329709 ], [ 119.960194, 27.365857 ], [ 120.008237, 27.375423 ], [ 120.026099, 27.344063 ], [ 120.052584, 27.338747 ], [ 120.096316, 27.390302 ], [ 120.136968, 27.402523 ], [ 120.134504, 27.420055 ], [ 120.221352, 27.420055 ], [ 120.26262, 27.432804 ], [ 120.273091, 27.38924 ], [ 120.340844, 27.399867 ], [ 120.343924, 27.363199 ], [ 120.430155, 27.258976 ], [ 120.401822, 27.250996 ], [ 120.404286, 27.204166 ], [ 120.461568, 27.142407 ], [ 120.403054, 27.10086 ], [ 120.391967, 27.081146 ], [ 120.282946, 27.089671 ], [ 120.29588, 27.035845 ], [ 120.275554, 27.027315 ], [ 120.279866, 26.987326 ], [ 120.25954, 26.982526 ], [ 120.232439, 26.907303 ], [ 120.1807, 26.920644 ], [ 120.117258, 26.916909 ], [ 120.103707, 26.873143 ], [ 120.037802, 26.86033 ], [ 120.042729, 26.828292 ], [ 120.082765, 26.822417 ], [ 120.103707, 26.794642 ], [ 120.136352, 26.797847 ], [ 120.106787, 26.752966 ], [ 120.151135, 26.750829 ], [ 120.162222, 26.717691 ], [ 120.110483, 26.692563 ], [ 120.1382, 26.638012 ], [ 120.093852, 26.613938 ], [ 120.063671, 26.627848 ], [ 120.007621, 26.595744 ], [ 119.967585, 26.597885 ], [ 119.93802, 26.576478 ], [ 119.947875, 26.56042 ], [ 119.867187, 26.509019 ], [ 119.828383, 26.524013 ], [ 119.851788, 26.595209 ], [ 119.901679, 26.624638 ], [ 119.949107, 26.624638 ], [ 119.972512, 26.654594 ], [ 119.969433, 26.686681 ], [ 119.99407, 26.720363 ], [ 120.061824, 26.768997 ], [ 120.052584, 26.786629 ], [ 119.942947, 26.784492 ], [ 119.938636, 26.747088 ], [ 119.899216, 26.693098 ], [ 119.908455, 26.661547 ], [ 119.873962, 26.642827 ], [ 119.864107, 26.671174 ], [ 119.833926, 26.690959 ], [ 119.711354, 26.686681 ], [ 119.664543, 26.726243 ], [ 119.637441, 26.703256 ], [ 119.619579, 26.649246 ], [ 119.577695, 26.622498 ], [ 119.605412, 26.595744 ], [ 119.670086, 26.618218 ], [ 119.740303, 26.610727 ], [ 119.788346, 26.583435 ], [ 119.83639, 26.454381 ], [ 119.835774, 26.434019 ], [ 119.893672, 26.355752 ], [ 119.946027, 26.374519 ], [ 119.95465, 26.352534 ], [ 119.909687, 26.310161 ], [ 119.862875, 26.307479 ], [ 119.845013, 26.323036 ], [ 119.806825, 26.307479 ], [ 119.802513, 26.268846 ], [ 119.7711, 26.285481 ], [ 119.676246, 26.262943 ], [ 119.664543, 26.202282 ], [ 119.604181, 26.168985 ], [ 119.618963, 26.11956 ], [ 119.654688, 26.090002 ], [ 119.668854, 26.026024 ], [ 119.700267, 26.032477 ], [ 119.723673, 26.011503 ], [ 119.69534, 25.904424 ], [ 119.638057, 25.889888 ], [ 119.628202, 25.87212 ], [ 119.626354, 25.723406 ], [ 119.602949, 25.714779 ], [ 119.602949, 25.68512 ], [ 119.543819, 25.684581 ], [ 119.472986, 25.662466 ], [ 119.478529, 25.631715 ], [ 119.541355, 25.6247 ], [ 119.534579, 25.585303 ], [ 119.586934, 25.59232 ], [ 119.616499, 25.556691 ], [ 119.611572, 25.519972 ], [ 119.634362, 25.475137 ], [ 119.675014, 25.475137 ], [ 119.680557, 25.497827 ], [ 119.715666, 25.51187 ], [ 119.716898, 25.551292 ], [ 119.683637, 25.592859 ], [ 119.700267, 25.616606 ], [ 119.784651, 25.667321 ], [ 119.790194, 25.614447 ], [ 119.843165, 25.597717 ], [ 119.831462, 25.579905 ], [ 119.883817, 25.546432 ], [ 119.861027, 25.531313 ], [ 119.81668, 25.532393 ], [ 119.811136, 25.507009 ], [ 119.83331, 25.48162 ], [ 119.864107, 25.48 ], [ 119.866571, 25.455145 ], [ 119.804977, 25.457847 ], [ 119.764325, 25.433529 ], [ 119.773564, 25.395691 ], [ 119.688564, 25.441095 ], [ 119.682405, 25.445959 ], [ 119.675014, 25.468113 ], [ 119.622659, 25.434069 ], [ 119.670086, 25.435691 ], [ 119.656535, 25.396772 ], [ 119.665159, 25.3719 ], [ 119.649144, 25.342697 ], [ 119.597405, 25.334584 ], [ 119.582623, 25.374063 ], [ 119.59063, 25.398394 ], [ 119.577695, 25.445959 ], [ 119.555521, 25.429205 ], [ 119.578927, 25.400556 ], [ 119.548746, 25.365952 ], [ 119.486536, 25.369737 ], [ 119.507478, 25.396231 ], [ 119.48592, 25.418935 ], [ 119.491464, 25.443257 ], [ 119.463131, 25.448661 ], [ 119.438493, 25.412449 ], [ 119.45266, 25.493505 ], [ 119.400921, 25.493505 ], [ 119.359037, 25.521592 ], [ 119.343638, 25.472436 ], [ 119.353493, 25.411908 ], [ 119.288204, 25.410827 ], [ 119.26295, 25.428124 ], [ 119.275269, 25.476758 ], [ 119.256175, 25.488643 ], [ 119.219834, 25.468654 ], [ 119.232153, 25.442176 ], [ 119.191501, 25.424341 ], [ 119.151465, 25.426503 ], [ 119.14469, 25.388121 ], [ 119.218603, 25.368115 ], [ 119.240776, 25.316733 ], [ 119.247552, 25.333502 ], [ 119.299291, 25.328634 ], [ 119.333167, 25.287516 ], [ 119.380595, 25.250173 ], [ 119.331935, 25.230685 ], [ 119.294979, 25.237182 ], [ 119.314689, 25.190076 ], [ 119.26911, 25.159746 ], [ 119.231537, 25.188993 ], [ 119.190269, 25.175995 ], [ 119.131755, 25.223106 ], [ 119.108349, 25.193867 ], [ 119.137299, 25.15487 ], [ 119.165632, 25.145661 ], [ 119.146538, 25.056782 ], [ 119.119436, 25.012861 ], [ 119.107118, 25.075214 ], [ 119.134219, 25.106107 ], [ 119.075705, 25.099604 ], [ 119.06585, 25.102855 ], [ 119.028893, 25.139702 ], [ 119.032589, 25.17437 ], [ 119.054147, 25.168412 ], [ 119.074473, 25.211195 ], [ 119.055379, 25.219316 ], [ 118.990089, 25.20199 ], [ 118.975307, 25.237723 ], [ 118.996864, 25.266411 ], [ 118.956212, 25.272905 ], [ 118.91556, 25.256668 ], [ 118.940198, 25.21715 ], [ 118.942046, 25.211195 ], [ 118.985162, 25.19495 ], [ 118.985162, 25.168954 ], [ 118.951901, 25.15162 ], [ 118.974691, 25.115319 ], [ 118.892155, 25.092558 ], [ 118.945126, 25.028588 ], [ 118.974691, 25.024792 ], [ 119.016575, 25.058409 ], [ 119.023966, 25.04377 ], [ 118.989473, 24.973807 ], [ 119.004872, 24.970009 ] ] ], [ [ [ 118.412338, 24.514538 ], [ 118.451758, 24.506915 ], [ 118.477012, 24.437738 ], [ 118.457918, 24.412128 ], [ 118.405563, 24.427931 ], [ 118.353208, 24.415398 ], [ 118.329802, 24.382152 ], [ 118.282375, 24.413218 ], [ 118.31194, 24.424661 ], [ 118.298389, 24.477506 ], [ 118.318715, 24.486765 ], [ 118.374766, 24.458986 ], [ 118.412338, 24.514538 ] ] ], [ [ [ 119.471138, 25.197116 ], [ 119.444036, 25.20199 ], [ 119.44342, 25.238806 ], [ 119.473601, 25.259916 ], [ 119.501319, 25.21715 ], [ 119.540739, 25.20199 ], [ 119.566608, 25.210112 ], [ 119.549362, 25.161912 ], [ 119.52534, 25.157579 ], [ 119.507478, 25.183036 ], [ 119.471138, 25.197116 ] ] ], [ [ [ 119.580159, 25.627398 ], [ 119.580775, 25.650059 ], [ 119.611572, 25.669479 ], [ 119.580159, 25.627398 ] ] ], [ [ [ 119.976824, 26.191005 ], [ 119.970665, 26.217852 ], [ 119.998998, 26.235569 ], [ 120.016244, 26.217316 ], [ 119.976824, 26.191005 ] ] ], [ [ [ 118.230636, 24.401228 ], [ 118.233716, 24.445911 ], [ 118.273752, 24.441007 ], [ 118.230636, 24.401228 ] ] ], [ [ [ 119.906607, 26.68989 ], [ 119.950954, 26.692563 ], [ 119.926933, 26.664756 ], [ 119.906607, 26.68989 ] ] ], [ [ [ 118.204151, 24.504737 ], [ 118.19368, 24.463344 ], [ 118.143173, 24.420847 ], [ 118.084042, 24.435559 ], [ 118.068644, 24.463344 ], [ 118.093281, 24.540672 ], [ 118.14502, 24.560814 ], [ 118.191832, 24.536861 ], [ 118.204151, 24.504737 ] ] ], [ [ [ 119.929397, 26.134067 ], [ 119.919542, 26.172208 ], [ 119.960194, 26.146961 ], [ 119.929397, 26.134067 ] ] ], [ [ [ 119.642985, 26.129231 ], [ 119.606028, 26.15287 ], [ 119.62697, 26.173282 ], [ 119.665159, 26.155556 ], [ 119.642985, 26.129231 ] ] ], [ [ [ 120.034106, 26.488667 ], [ 120.035954, 26.515981 ], [ 120.071679, 26.521336 ], [ 120.066751, 26.498308 ], [ 120.034106, 26.488667 ] ] ], [ [ [ 119.662079, 25.646822 ], [ 119.716898, 25.664624 ], [ 119.718745, 25.634952 ], [ 119.673782, 25.632794 ], [ 119.662079, 25.646822 ] ] ], [ [ [ 119.760629, 26.613402 ], [ 119.796354, 26.630523 ], [ 119.818527, 26.616613 ], [ 119.776644, 26.600025 ], [ 119.760629, 26.613402 ] ] ], [ [ [ 120.135736, 26.550784 ], [ 120.117874, 26.568984 ], [ 120.153598, 26.604841 ], [ 120.167149, 26.571661 ], [ 120.135736, 26.550784 ] ] ], [ [ [ 120.360554, 26.916909 ], [ 120.319286, 26.944654 ], [ 120.327909, 26.963858 ], [ 120.363018, 26.967592 ], [ 120.394431, 26.933984 ], [ 120.360554, 26.916909 ] ] ], [ [ [ 119.668238, 26.628383 ], [ 119.651608, 26.657269 ], [ 119.673782, 26.680799 ], [ 119.712586, 26.6685 ], [ 119.748926, 26.681334 ], [ 119.758781, 26.659408 ], [ 119.720593, 26.635873 ], [ 119.668238, 26.628383 ] ] ] ] } },\n{ \"type\": \"Feature\", \"properties\": { \"adcode\": \"360000\", \"name\": \"江西省\", \"center\": [ 115.892151, 28.676493 ], \"centroid\": [ 115.732975, 27.636112 ], \"childrenNum\": 11, \"level\": \"province\", \"parent\": { \"adcode\": 100000 }, \"subFeatureIndex\": 13, \"acroutes\": [ 100000 ] }, \"geometry\": { \"type\": \"MultiPolygon\", \"coordinates\": [ [ [ [ 118.193064, 29.395472 ], [ 118.205382, 29.343839 ], [ 118.166578, 29.314099 ], [ 118.178281, 29.297921 ], [ 118.138861, 29.283828 ], [ 118.077883, 29.290614 ], [ 118.073571, 29.216993 ], [ 118.042159, 29.210202 ], [ 118.027992, 29.167882 ], [ 118.045238, 29.149068 ], [ 118.037847, 29.102017 ], [ 118.076035, 29.074822 ], [ 118.066796, 29.053898 ], [ 118.097593, 28.998952 ], [ 118.115455, 29.009944 ], [ 118.115455, 29.009944 ], [ 118.133933, 28.983771 ], [ 118.165346, 28.986912 ], [ 118.227556, 28.942406 ], [ 118.195527, 28.904167 ], [ 118.270056, 28.918836 ], [ 118.300237, 28.826075 ], [ 118.364295, 28.813491 ], [ 118.403099, 28.702791 ], [ 118.428352, 28.681267 ], [ 118.428352, 28.617193 ], [ 118.428352, 28.617193 ], [ 118.412338, 28.55676 ], [ 118.4302, 28.515225 ], [ 118.414802, 28.497344 ], [ 118.474548, 28.478934 ], [ 118.456686, 28.424738 ], [ 118.432048, 28.402104 ], [ 118.455454, 28.384204 ], [ 118.480091, 28.327325 ], [ 118.433896, 28.288335 ], [ 118.424041, 28.291497 ], [ 118.314404, 28.221913 ], [ 118.339041, 28.193962 ], [ 118.375382, 28.186577 ], [ 118.361215, 28.155978 ], [ 118.356288, 28.091586 ], [ 118.242339, 28.075746 ], [ 118.199839, 28.049869 ], [ 118.153644, 28.062016 ], [ 118.120999, 28.041946 ], [ 118.129006, 28.017118 ], [ 118.094513, 28.003909 ], [ 118.096977, 27.970615 ], [ 117.999043, 27.991227 ], [ 117.965166, 27.962687 ], [ 117.942992, 27.974315 ], [ 117.910963, 27.949471 ], [ 117.856145, 27.94577 ], [ 117.78716, 27.896063 ], [ 117.788392, 27.855858 ], [ 117.740348, 27.800286 ], [ 117.704624, 27.834162 ], [ 117.68245, 27.823577 ], [ 117.649805, 27.851625 ], [ 117.609769, 27.863265 ], [ 117.556182, 27.966387 ], [ 117.52169, 27.982243 ], [ 117.477958, 27.930966 ], [ 117.453936, 27.939955 ], [ 117.407741, 27.893948 ], [ 117.366473, 27.88231 ], [ 117.341836, 27.855858 ], [ 117.334444, 27.8876 ], [ 117.280242, 27.871201 ], [ 117.276546, 27.847921 ], [ 117.303031, 27.833103 ], [ 117.296256, 27.764282 ], [ 117.245133, 27.71926 ], [ 117.205097, 27.714492 ], [ 117.204481, 27.683759 ], [ 117.174916, 27.677399 ], [ 117.114554, 27.692238 ], [ 117.096076, 27.667329 ], [ 117.11209, 27.645596 ], [ 117.094228, 27.627569 ], [ 117.065279, 27.665739 ], [ 117.040641, 27.669979 ], [ 117.003685, 27.625449 ], [ 117.024627, 27.592569 ], [ 117.01662, 27.563393 ], [ 117.054808, 27.5427 ], [ 117.076982, 27.566046 ], [ 117.103467, 27.533149 ], [ 117.110242, 27.458828 ], [ 117.133032, 27.42218 ], [ 117.107163, 27.393491 ], [ 117.104699, 27.330773 ], [ 117.140423, 27.322798 ], [ 117.136728, 27.303123 ], [ 117.171836, 27.29036 ], [ 117.149662, 27.241419 ], [ 117.044953, 27.146667 ], [ 117.05296, 27.100327 ], [ 116.967344, 27.061962 ], [ 116.936547, 27.019319 ], [ 116.910062, 27.034779 ], [ 116.851548, 27.009188 ], [ 116.817671, 27.018252 ], [ 116.679085, 26.978259 ], [ 116.632889, 26.933984 ], [ 116.602092, 26.888623 ], [ 116.548506, 26.84004 ], [ 116.543578, 26.803723 ], [ 116.557745, 26.773806 ], [ 116.515245, 26.720898 ], [ 116.520172, 26.684543 ], [ 116.566368, 26.650315 ], [ 116.553433, 26.575942 ], [ 116.539267, 26.559349 ], [ 116.597165, 26.512768 ], [ 116.610716, 26.476882 ], [ 116.638433, 26.477418 ], [ 116.608252, 26.429732 ], [ 116.601476, 26.372911 ], [ 116.553433, 26.365404 ], [ 116.553433, 26.400253 ], [ 116.519557, 26.410437 ], [ 116.499846, 26.361651 ], [ 116.459194, 26.345026 ], [ 116.437021, 26.308016 ], [ 116.412999, 26.297822 ], [ 116.385282, 26.238253 ], [ 116.400064, 26.202819 ], [ 116.392057, 26.171133 ], [ 116.435789, 26.159854 ], [ 116.476441, 26.172745 ], [ 116.489375, 26.113649 ], [ 116.384666, 26.030864 ], [ 116.360028, 25.991601 ], [ 116.369883, 25.963088 ], [ 116.326152, 25.956631 ], [ 116.303362, 25.924341 ], [ 116.258398, 25.902809 ], [ 116.225138, 25.908731 ], [ 116.17771, 25.894195 ], [ 116.132131, 25.860273 ], [ 116.131515, 25.824185 ], [ 116.18079, 25.778926 ], [ 116.129667, 25.758985 ], [ 116.106877, 25.701299 ], [ 116.067457, 25.703995 ], [ 116.068689, 25.646282 ], [ 116.041588, 25.62416 ], [ 116.063145, 25.56317 ], [ 116.040356, 25.548052 ], [ 116.03666, 25.514571 ], [ 116.005247, 25.490264 ], [ 116.023109, 25.435691 ], [ 115.992928, 25.374063 ], [ 116.008327, 25.319437 ], [ 115.987385, 25.290221 ], [ 115.949813, 25.292386 ], [ 115.930719, 25.236099 ], [ 115.855574, 25.20957 ], [ 115.860501, 25.165704 ], [ 115.888219, 25.128866 ], [ 115.880212, 25.092016 ], [ 115.908545, 25.084428 ], [ 115.928255, 25.050276 ], [ 115.873436, 25.019911 ], [ 115.925175, 24.960786 ], [ 115.870356, 24.959701 ], [ 115.89253, 24.936911 ], [ 115.885139, 24.898918 ], [ 115.907313, 24.879917 ], [ 115.861733, 24.863629 ], [ 115.863581, 24.891318 ], [ 115.824161, 24.909232 ], [ 115.807531, 24.862543 ], [ 115.790284, 24.856027 ], [ 115.764415, 24.791933 ], [ 115.776734, 24.774546 ], [ 115.756408, 24.749004 ], [ 115.769342, 24.708236 ], [ 115.801371, 24.705517 ], [ 115.780429, 24.663103 ], [ 115.797676, 24.628834 ], [ 115.840791, 24.584217 ], [ 115.843871, 24.562446 ], [ 115.785357, 24.567345 ], [ 115.752712, 24.546116 ], [ 115.68927, 24.545027 ], [ 115.671408, 24.604895 ], [ 115.605503, 24.62557 ], [ 115.569778, 24.622306 ], [ 115.555611, 24.683768 ], [ 115.522967, 24.702799 ], [ 115.476771, 24.762591 ], [ 115.412714, 24.79302 ], [ 115.372678, 24.774546 ], [ 115.358511, 24.735416 ], [ 115.306772, 24.758787 ], [ 115.269816, 24.749548 ], [ 115.258729, 24.728894 ], [ 115.1842, 24.711498 ], [ 115.104744, 24.667997 ], [ 115.083802, 24.699537 ], [ 115.057317, 24.703343 ], [ 115.024672, 24.669085 ], [ 115.00373, 24.679418 ], [ 114.940288, 24.650049 ], [ 114.909491, 24.661471 ], [ 114.893477, 24.582584 ], [ 114.868839, 24.562446 ], [ 114.846665, 24.602719 ], [ 114.827571, 24.588026 ], [ 114.781376, 24.613057 ], [ 114.729637, 24.608704 ], [ 114.73826, 24.565168 ], [ 114.704999, 24.525973 ], [ 114.664963, 24.583673 ], [ 114.627391, 24.576598 ], [ 114.589819, 24.537406 ], [ 114.534384, 24.559181 ], [ 114.429058, 24.48622 ], [ 114.403189, 24.497657 ], [ 114.391486, 24.563535 ], [ 114.363769, 24.582584 ], [ 114.300943, 24.578775 ], [ 114.289856, 24.619042 ], [ 114.258443, 24.641346 ], [ 114.19069, 24.656576 ], [ 114.169132, 24.689749 ], [ 114.27261, 24.700624 ], [ 114.281849, 24.724001 ], [ 114.336052, 24.749004 ], [ 114.342211, 24.807145 ], [ 114.378551, 24.861457 ], [ 114.403189, 24.877746 ], [ 114.395798, 24.951019 ], [ 114.454928, 24.977062 ], [ 114.45616, 24.99659 ], [ 114.506051, 24.999844 ], [ 114.532536, 25.022623 ], [ 114.561485, 25.077382 ], [ 114.604601, 25.083886 ], [ 114.640326, 25.074129 ], [ 114.664963, 25.10123 ], [ 114.735796, 25.121822 ], [ 114.73518, 25.155954 ], [ 114.685905, 25.173287 ], [ 114.693912, 25.213902 ], [ 114.73518, 25.225813 ], [ 114.743188, 25.274528 ], [ 114.714238, 25.315651 ], [ 114.63663, 25.324306 ], [ 114.599674, 25.385959 ], [ 114.541159, 25.416773 ], [ 114.477718, 25.37136 ], [ 114.438914, 25.376226 ], [ 114.43029, 25.343779 ], [ 114.382863, 25.317274 ], [ 114.31511, 25.33837 ], [ 114.2954, 25.299961 ], [ 114.260291, 25.291845 ], [ 114.204857, 25.29942 ], [ 114.190074, 25.316733 ], [ 114.115545, 25.302125 ], [ 114.083517, 25.275611 ], [ 114.055799, 25.277775 ], [ 114.039785, 25.250714 ], [ 114.017611, 25.273987 ], [ 114.029314, 25.328093 ], [ 114.050256, 25.36433 ], [ 113.983118, 25.415152 ], [ 114.003444, 25.442716 ], [ 113.94493, 25.441635 ], [ 113.962792, 25.528072 ], [ 113.986198, 25.529153 ], [ 113.983118, 25.599336 ], [ 113.957249, 25.611749 ], [ 113.913517, 25.701299 ], [ 113.920293, 25.741197 ], [ 113.961561, 25.77731 ], [ 113.971416, 25.836036 ], [ 114.028082, 25.893119 ], [ 114.028082, 25.98138 ], [ 114.008372, 26.015806 ], [ 114.044096, 26.076564 ], [ 114.087828, 26.06635 ], [ 114.121089, 26.085702 ], [ 114.10569, 26.097526 ], [ 114.188842, 26.121172 ], [ 114.237501, 26.152333 ], [ 114.216559, 26.203355 ], [ 114.181451, 26.214631 ], [ 114.102611, 26.187783 ], [ 114.088444, 26.168448 ], [ 114.013299, 26.184023 ], [ 113.962792, 26.150722 ], [ 113.949242, 26.192616 ], [ 113.972647, 26.20604 ], [ 113.978807, 26.237716 ], [ 114.029314, 26.266163 ], [ 114.021307, 26.288701 ], [ 114.047792, 26.337518 ], [ 114.030546, 26.376664 ], [ 114.062575, 26.406149 ], [ 114.085364, 26.406149 ], [ 114.090292, 26.455988 ], [ 114.110002, 26.482775 ], [ 114.07243, 26.480096 ], [ 114.10877, 26.56952 ], [ 114.019459, 26.587182 ], [ 113.996669, 26.615543 ], [ 113.912901, 26.613938 ], [ 113.860546, 26.664221 ], [ 113.853771, 26.769532 ], [ 113.835909, 26.806394 ], [ 113.877177, 26.859262 ], [ 113.890112, 26.895562 ], [ 113.927068, 26.948922 ], [ 113.892575, 26.964925 ], [ 113.86301, 27.018252 ], [ 113.824206, 27.036378 ], [ 113.803264, 27.099261 ], [ 113.771851, 27.096598 ], [ 113.779242, 27.137081 ], [ 113.846996, 27.222262 ], [ 113.872865, 27.289828 ], [ 113.854387, 27.30525 ], [ 113.872865, 27.346721 ], [ 113.872865, 27.384988 ], [ 113.72812, 27.350442 ], [ 113.699786, 27.331836 ], [ 113.657902, 27.347253 ], [ 113.616635, 27.345658 ], [ 113.605548, 27.38924 ], [ 113.632033, 27.40518 ], [ 113.59754, 27.428554 ], [ 113.591381, 27.467855 ], [ 113.627105, 27.49971 ], [ 113.583374, 27.524657 ], [ 113.579062, 27.545354 ], [ 113.608627, 27.585143 ], [ 113.607395, 27.625449 ], [ 113.652359, 27.663619 ], [ 113.696707, 27.71979 ], [ 113.69917, 27.740979 ], [ 113.763228, 27.799228 ], [ 113.756453, 27.860091 ], [ 113.72812, 27.874904 ], [ 113.752141, 27.93361 ], [ 113.822974, 27.982243 ], [ 113.845148, 27.971672 ], [ 113.864242, 28.004966 ], [ 113.914133, 27.991227 ], [ 113.936307, 28.018703 ], [ 113.966488, 28.017646 ], [ 113.970184, 28.041418 ], [ 114.025618, 28.031382 ], [ 114.047176, 28.057263 ], [ 114.025002, 28.080499 ], [ 113.992357, 28.161255 ], [ 114.012068, 28.174972 ], [ 114.068734, 28.171806 ], [ 114.107538, 28.182885 ], [ 114.109386, 28.205038 ], [ 114.143879, 28.246694 ], [ 114.182067, 28.249858 ], [ 114.198081, 28.29097 ], [ 114.2529, 28.319423 ], [ 114.252284, 28.395787 ], [ 114.214712, 28.403157 ], [ 114.172212, 28.432632 ], [ 114.217175, 28.466308 ], [ 114.218407, 28.48472 ], [ 114.15435, 28.507337 ], [ 114.138335, 28.533629 ], [ 114.08598, 28.558337 ], [ 114.132176, 28.607211 ], [ 114.122321, 28.623497 ], [ 114.157429, 28.761566 ], [ 114.137719, 28.779926 ], [ 114.153734, 28.829221 ], [ 114.124784, 28.843376 ], [ 114.076741, 28.834464 ], [ 114.056415, 28.872204 ], [ 114.060111, 28.902596 ], [ 114.028082, 28.891069 ], [ 114.005292, 28.917788 ], [ 114.008988, 28.955498 ], [ 113.973879, 28.937692 ], [ 113.955401, 28.978536 ], [ 113.961561, 28.999476 ], [ 113.94185, 29.047097 ], [ 113.952321, 29.092604 ], [ 113.98743, 29.126068 ], [ 114.034857, 29.152204 ], [ 114.063191, 29.204978 ], [ 114.169748, 29.216993 ], [ 114.252284, 29.23475 ], [ 114.259059, 29.343839 ], [ 114.307102, 29.365225 ], [ 114.341595, 29.327665 ], [ 114.376088, 29.322969 ], [ 114.440145, 29.341752 ], [ 114.466015, 29.324013 ], [ 114.519602, 29.325578 ], [ 114.589819, 29.352707 ], [ 114.621847, 29.379828 ], [ 114.67297, 29.395993 ], [ 114.740724, 29.386607 ], [ 114.759818, 29.363139 ], [ 114.784455, 29.386086 ], [ 114.812173, 29.383478 ], [ 114.866375, 29.404335 ], [ 114.895325, 29.397557 ], [ 114.931049, 29.422581 ], [ 114.947063, 29.465317 ], [ 114.935977, 29.486678 ], [ 114.90518, 29.473132 ], [ 114.918114, 29.454374 ], [ 114.888549, 29.436134 ], [ 114.860216, 29.476258 ], [ 114.900868, 29.505951 ], [ 114.940288, 29.493971 ], [ 114.966773, 29.522096 ], [ 114.947679, 29.542924 ], [ 115.00065, 29.572076 ], [ 115.033295, 29.546568 ], [ 115.087498, 29.560104 ], [ 115.086266, 29.525741 ], [ 115.154019, 29.510117 ], [ 115.157099, 29.584568 ], [ 115.120142, 29.597578 ], [ 115.143548, 29.645961 ], [ 115.117679, 29.655843 ], [ 115.113367, 29.684963 ], [ 115.176809, 29.654803 ], [ 115.250722, 29.660003 ], [ 115.28583, 29.618391 ], [ 115.304924, 29.637118 ], [ 115.355431, 29.649602 ], [ 115.412714, 29.688602 ], [ 115.470612, 29.739539 ], [ 115.479235, 29.811224 ], [ 115.51188, 29.840299 ], [ 115.611662, 29.841337 ], [ 115.667712, 29.850161 ], [ 115.706517, 29.837703 ], [ 115.762567, 29.793048 ], [ 115.837096, 29.748373 ], [ 115.909777, 29.723949 ], [ 115.965827, 29.724469 ], [ 116.049595, 29.761881 ], [ 116.087167, 29.795125 ], [ 116.13521, 29.819532 ], [ 116.172783, 29.828358 ], [ 116.227601, 29.816936 ], [ 116.250391, 29.785777 ], [ 116.280572, 29.788893 ], [ 116.342782, 29.835626 ], [ 116.467818, 29.896347 ], [ 116.525716, 29.897385 ], [ 116.552201, 29.909836 ], [ 116.585462, 30.045657 ], [ 116.620571, 30.073109 ], [ 116.666766, 30.076734 ], [ 116.720353, 30.053945 ], [ 116.747454, 30.057053 ], [ 116.783794, 30.030632 ], [ 116.802889, 29.99643 ], [ 116.830606, 30.004723 ], [ 116.83307, 29.95755 ], [ 116.868794, 29.980361 ], [ 116.900207, 29.949253 ], [ 116.882961, 29.893753 ], [ 116.780715, 29.792529 ], [ 116.762237, 29.802396 ], [ 116.673541, 29.709916 ], [ 116.653831, 29.694841 ], [ 116.680317, 29.681323 ], [ 116.651983, 29.637118 ], [ 116.716657, 29.590813 ], [ 116.721585, 29.564789 ], [ 116.760389, 29.599139 ], [ 116.780715, 29.569994 ], [ 116.849084, 29.57624 ], [ 116.873722, 29.609546 ], [ 116.939627, 29.648561 ], [ 116.974736, 29.657403 ], [ 116.996294, 29.683403 ], [ 117.041873, 29.680803 ], [ 117.112706, 29.711995 ], [ 117.108395, 29.75201 ], [ 117.136728, 29.775388 ], [ 117.123177, 29.798761 ], [ 117.073286, 29.831992 ], [ 117.127489, 29.86158 ], [ 117.129952, 29.89946 ], [ 117.171836, 29.920729 ], [ 117.2168, 29.926953 ], [ 117.246365, 29.915023 ], [ 117.261763, 29.880781 ], [ 117.25314, 29.834588 ], [ 117.29256, 29.822647 ], [ 117.338756, 29.848085 ], [ 117.359082, 29.812782 ], [ 117.382487, 29.840818 ], [ 117.415132, 29.85068 ], [ 117.408973, 29.802396 ], [ 117.455168, 29.749412 ], [ 117.453936, 29.688082 ], [ 117.490277, 29.660003 ], [ 117.530313, 29.654282 ], [ 117.523538, 29.630356 ], [ 117.543248, 29.588731 ], [ 117.608537, 29.591333 ], [ 117.647957, 29.614749 ], [ 117.678754, 29.595496 ], [ 117.690457, 29.555939 ], [ 117.729877, 29.550213 ], [ 117.795167, 29.570515 ], [ 117.872775, 29.54761 ], [ 117.933753, 29.549172 ], [ 118.00397, 29.578322 ], [ 118.042774, 29.566351 ], [ 118.050782, 29.542924 ], [ 118.095129, 29.534072 ], [ 118.143788, 29.489803 ], [ 118.127774, 29.47209 ], [ 118.136397, 29.418932 ], [ 118.193064, 29.395472 ] ] ] ] } },\n{ \"type\": \"Feature\", \"properties\": { \"adcode\": \"370000\", \"name\": \"山东省\", \"center\": [ 117.000923, 36.675807 ], \"centroid\": [ 118.187667, 36.376018 ], \"childrenNum\": 16, \"level\": \"province\", \"parent\": { \"adcode\": 100000 }, \"subFeatureIndex\": 14, \"acroutes\": [ 100000 ] }, \"geometry\": { \"type\": \"MultiPolygon\", \"coordinates\": [ [ [ [ 116.374195, 34.640011 ], [ 116.334159, 34.620806 ], [ 116.32492, 34.601104 ], [ 116.286116, 34.608986 ], [ 116.247927, 34.551829 ], [ 116.196804, 34.575977 ], [ 116.156768, 34.5538 ], [ 116.134594, 34.559715 ], [ 116.101334, 34.60603 ], [ 116.037276, 34.593222 ], [ 115.991081, 34.615389 ], [ 115.984305, 34.589281 ], [ 115.838328, 34.5676 ], [ 115.827241, 34.558236 ], [ 115.787821, 34.580905 ], [ 115.697278, 34.594207 ], [ 115.685575, 34.556265 ], [ 115.622749, 34.574499 ], [ 115.553148, 34.568586 ], [ 115.515575, 34.582383 ], [ 115.461373, 34.637057 ], [ 115.433655, 34.725149 ], [ 115.449054, 34.74433 ], [ 115.42688, 34.805285 ], [ 115.317243, 34.859321 ], [ 115.256265, 34.845079 ], [ 115.239019, 34.87798 ], [ 115.251953, 34.906451 ], [ 115.205142, 34.914303 ], [ 115.219309, 34.96042 ], [ 115.157099, 34.957968 ], [ 115.12815, 35.00455 ], [ 115.075179, 35.000628 ], [ 115.028983, 34.9717 ], [ 115.008041, 34.988372 ], [ 114.950759, 34.989843 ], [ 114.923658, 34.968757 ], [ 114.880542, 35.00357 ], [ 114.824492, 35.012393 ], [ 114.852209, 35.041797 ], [ 114.818948, 35.051596 ], [ 114.835578, 35.076578 ], [ 114.883006, 35.098615 ], [ 114.841738, 35.15099 ], [ 114.861448, 35.182301 ], [ 114.932281, 35.198441 ], [ 114.929201, 35.244886 ], [ 114.957534, 35.261014 ], [ 115.04315, 35.376744 ], [ 115.073947, 35.374304 ], [ 115.091809, 35.416259 ], [ 115.117679, 35.400163 ], [ 115.126302, 35.41821 ], [ 115.172497, 35.426501 ], [ 115.237171, 35.423087 ], [ 115.307388, 35.480126 ], [ 115.356047, 35.490359 ], [ 115.34496, 35.55368 ], [ 115.383148, 35.568772 ], [ 115.48601, 35.710306 ], [ 115.52851, 35.733628 ], [ 115.622749, 35.739457 ], [ 115.693582, 35.754028 ], [ 115.696046, 35.788989 ], [ 115.73485, 35.833154 ], [ 115.773654, 35.854014 ], [ 115.81677, 35.844312 ], [ 115.859886, 35.857894 ], [ 115.882675, 35.879718 ], [ 115.873436, 35.918985 ], [ 115.907929, 35.92674 ], [ 115.911624, 35.960171 ], [ 115.984921, 35.974218 ], [ 116.048979, 35.970343 ], [ 116.063145, 36.028927 ], [ 116.099486, 36.112129 ], [ 116.057602, 36.104877 ], [ 115.989849, 36.045381 ], [ 115.89869, 36.026507 ], [ 115.859886, 36.003756 ], [ 115.817386, 36.012954 ], [ 115.779813, 35.993588 ], [ 115.774886, 35.974702 ], [ 115.699125, 35.966468 ], [ 115.648618, 35.922863 ], [ 115.583945, 35.921893 ], [ 115.513112, 35.890385 ], [ 115.505104, 35.899112 ], [ 115.495249, 35.896203 ], [ 115.487858, 35.880688 ], [ 115.460141, 35.867594 ], [ 115.407786, 35.80889 ], [ 115.363438, 35.779765 ], [ 115.335105, 35.796756 ], [ 115.364054, 35.894264 ], [ 115.353583, 35.938854 ], [ 115.362822, 35.971796 ], [ 115.447822, 36.01247 ], [ 115.449054, 36.047317 ], [ 115.484163, 36.125666 ], [ 115.483547, 36.148865 ], [ 115.474923, 36.248352 ], [ 115.466916, 36.258969 ], [ 115.466916, 36.258969 ], [ 115.462605, 36.276339 ], [ 115.417025, 36.292742 ], [ 115.423185, 36.32216 ], [ 115.366518, 36.30914 ], [ 115.368982, 36.342409 ], [ 115.340033, 36.398307 ], [ 115.297533, 36.413239 ], [ 115.317243, 36.454166 ], [ 115.291374, 36.460423 ], [ 115.272895, 36.497476 ], [ 115.33141, 36.550378 ], [ 115.355431, 36.627262 ], [ 115.365902, 36.621979 ], [ 115.420105, 36.686795 ], [ 115.451518, 36.702151 ], [ 115.479851, 36.760187 ], [ 115.524815, 36.763543 ], [ 115.686807, 36.810034 ], [ 115.688654, 36.838777 ], [ 115.71206, 36.883308 ], [ 115.75764, 36.902453 ], [ 115.79706, 36.968945 ], [ 115.776734, 36.992848 ], [ 115.85619, 37.060694 ], [ 115.888219, 37.112254 ], [ 115.879596, 37.150901 ], [ 115.91224, 37.177132 ], [ 115.909777, 37.20669 ], [ 115.969523, 37.239572 ], [ 115.975682, 37.337179 ], [ 116.024341, 37.360015 ], [ 116.085935, 37.373809 ], [ 116.106261, 37.368577 ], [ 116.169087, 37.384271 ], [ 116.193109, 37.365723 ], [ 116.236224, 37.361442 ], [ 116.2855, 37.404241 ], [ 116.226369, 37.428007 ], [ 116.243, 37.447965 ], [ 116.224522, 37.479791 ], [ 116.240536, 37.489764 ], [ 116.240536, 37.489764 ], [ 116.27626, 37.466967 ], [ 116.290427, 37.484065 ], [ 116.278724, 37.524895 ], [ 116.295355, 37.554316 ], [ 116.336007, 37.581355 ], [ 116.36742, 37.566177 ], [ 116.379738, 37.522047 ], [ 116.38097, 37.522522 ], [ 116.379738, 37.522047 ], [ 116.38097, 37.522522 ], [ 116.433941, 37.473142 ], [ 116.448108, 37.503059 ], [ 116.4826, 37.521573 ], [ 116.575607, 37.610754 ], [ 116.604556, 37.624975 ], [ 116.66307, 37.686096 ], [ 116.679085, 37.728708 ], [ 116.724664, 37.744327 ], [ 116.753613, 37.77035 ], [ 116.753613, 37.793054 ], [ 116.804736, 37.848837 ], [ 116.837997, 37.835132 ], [ 116.919301, 37.846002 ], [ 117.027091, 37.832296 ], [ 117.074518, 37.848837 ], [ 117.150278, 37.839385 ], [ 117.185387, 37.849783 ], [ 117.271618, 37.839858 ], [ 117.320278, 37.861596 ], [ 117.400966, 37.844584 ], [ 117.438538, 37.854035 ], [ 117.481038, 37.914967 ], [ 117.513067, 37.94329 ], [ 117.524154, 37.989527 ], [ 117.557414, 38.046105 ], [ 117.557414, 38.046105 ], [ 117.586979, 38.071551 ], [ 117.704624, 38.076262 ], [ 117.746508, 38.12524 ], [ 117.771145, 38.134655 ], [ 117.766834, 38.158658 ], [ 117.789007, 38.180772 ], [ 117.808718, 38.22827 ], [ 117.848754, 38.255062 ], [ 117.895565, 38.301572 ], [ 117.896797, 38.279495 ], [ 118.018753, 38.202409 ], [ 118.045238, 38.214165 ], [ 118.112376, 38.210403 ], [ 118.177665, 38.186417 ], [ 118.217085, 38.146893 ], [ 118.331034, 38.12524 ], [ 118.404331, 38.121003 ], [ 118.431432, 38.106406 ], [ 118.44991, 38.124299 ], [ 118.504729, 38.11394 ], [ 118.534294, 38.063541 ], [ 118.552156, 38.05553 ], [ 118.597736, 38.079088 ], [ 118.607591, 38.129006 ], [ 118.626069, 38.138421 ], [ 118.703677, 38.151129 ], [ 118.811467, 38.157717 ], [ 118.908169, 38.139362 ], [ 118.974075, 38.094162 ], [ 119.001792, 37.99613 ], [ 119.110813, 37.921577 ], [ 119.12806, 37.847892 ], [ 119.16132, 37.81906 ], [ 119.212443, 37.838913 ], [ 119.24016, 37.878131 ], [ 119.291899, 37.869627 ], [ 119.309146, 37.805349 ], [ 119.280197, 37.692726 ], [ 119.262334, 37.660517 ], [ 119.236465, 37.651988 ], [ 119.153313, 37.655305 ], [ 119.023966, 37.642037 ], [ 118.988857, 37.620709 ], [ 118.939582, 37.527268 ], [ 118.942662, 37.497361 ], [ 119.001176, 37.31862 ], [ 119.03998, 37.30434 ], [ 119.054147, 37.254816 ], [ 119.084328, 37.239572 ], [ 119.091103, 37.257674 ], [ 119.12806, 37.254816 ], [ 119.136683, 37.230995 ], [ 119.204436, 37.280058 ], [ 119.190885, 37.25958 ], [ 119.2069, 37.223371 ], [ 119.298675, 37.197156 ], [ 119.301138, 37.139452 ], [ 119.327624, 37.115595 ], [ 119.361501, 37.125616 ], [ 119.428022, 37.125616 ], [ 119.489616, 37.134681 ], [ 119.576463, 37.127524 ], [ 119.678709, 37.158056 ], [ 119.698419, 37.127047 ], [ 119.744615, 37.135158 ], [ 119.83023, 37.225754 ], [ 119.865339, 37.233854 ], [ 119.89244, 37.263866 ], [ 119.883201, 37.311004 ], [ 119.837006, 37.346695 ], [ 119.843781, 37.376662 ], [ 119.926933, 37.386649 ], [ 119.949723, 37.419927 ], [ 120.010085, 37.442263 ], [ 120.064903, 37.448915 ], [ 120.086461, 37.465067 ], [ 120.144359, 37.481691 ], [ 120.222584, 37.532963 ], [ 120.246605, 37.556689 ], [ 120.208417, 37.588469 ], [ 120.215192, 37.621183 ], [ 120.272475, 37.636824 ], [ 120.269395, 37.658622 ], [ 120.22012, 37.671886 ], [ 120.227511, 37.693673 ], [ 120.367945, 37.697935 ], [ 120.454793, 37.757576 ], [ 120.517619, 37.750005 ], [ 120.590915, 37.7642 ], [ 120.634031, 37.796364 ], [ 120.656821, 37.793054 ], [ 120.733197, 37.833714 ], [ 120.839139, 37.82426 ], [ 120.845298, 37.826623 ], [ 120.874863, 37.833241 ], [ 120.940769, 37.819533 ], [ 120.943233, 37.785486 ], [ 120.994356, 37.759468 ], [ 121.037471, 37.718767 ], [ 121.136022, 37.723501 ], [ 121.160043, 37.698882 ], [ 121.142797, 37.661464 ], [ 121.161891, 37.646302 ], [ 121.148956, 37.626397 ], [ 121.17421, 37.597479 ], [ 121.217326, 37.582778 ], [ 121.304789, 37.582778 ], [ 121.358376, 37.597479 ], [ 121.349137, 37.635403 ], [ 121.391021, 37.625449 ], [ 121.435368, 37.592737 ], [ 121.395948, 37.589891 ], [ 121.400876, 37.557638 ], [ 121.460006, 37.522522 ], [ 121.477252, 37.475992 ], [ 121.571491, 37.441313 ], [ 121.575802, 37.460317 ], [ 121.635548, 37.494037 ], [ 121.66573, 37.473617 ], [ 121.772903, 37.466492 ], [ 121.923808, 37.473142 ], [ 121.997721, 37.494512 ], [ 122.017431, 37.531065 ], [ 122.075329, 37.540556 ], [ 122.08888, 37.554316 ], [ 122.150474, 37.557163 ], [ 122.163408, 37.519199 ], [ 122.131996, 37.49926 ], [ 122.166488, 37.438937 ], [ 122.194205, 37.456041 ], [ 122.25272, 37.467917 ], [ 122.287212, 37.445114 ], [ 122.281053, 37.430858 ], [ 122.337103, 37.414223 ], [ 122.41656, 37.414699 ], [ 122.487393, 37.43466 ], [ 122.4954, 37.413748 ], [ 122.553914, 37.407093 ], [ 122.641377, 37.428482 ], [ 122.67587, 37.413273 ], [ 122.701739, 37.418501 ], [ 122.714058, 37.392355 ], [ 122.6925, 37.373809 ], [ 122.650616, 37.388551 ], [ 122.607501, 37.364296 ], [ 122.611196, 37.339558 ], [ 122.573624, 37.296247 ], [ 122.567465, 37.25958 ], [ 122.592718, 37.261485 ], [ 122.624131, 37.190959 ], [ 122.573624, 37.176178 ], [ 122.581015, 37.147562 ], [ 122.533588, 37.153286 ], [ 122.484313, 37.128956 ], [ 122.478769, 37.058784 ], [ 122.467067, 37.037289 ], [ 122.494168, 37.033945 ], [ 122.575472, 37.054485 ], [ 122.583479, 37.037289 ], [ 122.544675, 37.004797 ], [ 122.55761, 36.968467 ], [ 122.532356, 36.901496 ], [ 122.48924, 36.886659 ], [ 122.483081, 36.913938 ], [ 122.434422, 36.914416 ], [ 122.457212, 36.868946 ], [ 122.383915, 36.865595 ], [ 122.378371, 36.844525 ], [ 122.344495, 36.828239 ], [ 122.280437, 36.835904 ], [ 122.275509, 36.83734 ], [ 122.220691, 36.848835 ], [ 122.174495, 36.842609 ], [ 122.188662, 36.866073 ], [ 122.175727, 36.894317 ], [ 122.119677, 36.891924 ], [ 122.141235, 36.938337 ], [ 122.124604, 36.944077 ], [ 122.115981, 36.94025 ], [ 122.093191, 36.913938 ], [ 122.051923, 36.904846 ], [ 122.042684, 36.871819 ], [ 122.008808, 36.96225 ], [ 121.965076, 36.938337 ], [ 121.927504, 36.932597 ], [ 121.767975, 36.874691 ], [ 121.762432, 36.84644 ], [ 121.726092, 36.826323 ], [ 121.6762, 36.819137 ], [ 121.631853, 36.80093 ], [ 121.651563, 36.723739 ], [ 121.556092, 36.764502 ], [ 121.575186, 36.740047 ], [ 121.532071, 36.73621 ], [ 121.485259, 36.786073 ], [ 121.548701, 36.807638 ], [ 121.565331, 36.830635 ], [ 121.506817, 36.803805 ], [ 121.496962, 36.795179 ], [ 121.454462, 36.752515 ], [ 121.3941, 36.738129 ], [ 121.400876, 36.701191 ], [ 121.35776, 36.713186 ], [ 121.31218, 36.702151 ], [ 121.29863, 36.702151 ], [ 121.251818, 36.671436 ], [ 121.161275, 36.651273 ], [ 121.078123, 36.607568 ], [ 121.028848, 36.572971 ], [ 120.955551, 36.575855 ], [ 120.926602, 36.611892 ], [ 120.882255, 36.627262 ], [ 120.847146, 36.618617 ], [ 120.884718, 36.601323 ], [ 120.909972, 36.568645 ], [ 120.962327, 36.562877 ], [ 120.983269, 36.546051 ], [ 120.95432, 36.507578 ], [ 120.965407, 36.466199 ], [ 120.938305, 36.447908 ], [ 120.90874, 36.450315 ], [ 120.919827, 36.419018 ], [ 120.871784, 36.36699 ], [ 120.848994, 36.403124 ], [ 120.858849, 36.424797 ], [ 120.828668, 36.46668 ], [ 120.759683, 36.46283 ], [ 120.694393, 36.390118 ], [ 120.744284, 36.327946 ], [ 120.66298, 36.331803 ], [ 120.653741, 36.282129 ], [ 120.686386, 36.279234 ], [ 120.696857, 36.15563 ], [ 120.712255, 36.126632 ], [ 120.672835, 36.130016 ], [ 120.64327, 36.114547 ], [ 120.615553, 36.120348 ], [ 120.593995, 36.100525 ], [ 120.546568, 36.107778 ], [ 120.546568, 36.091821 ], [ 120.468959, 36.087952 ], [ 120.429539, 36.056994 ], [ 120.370409, 36.053607 ], [ 120.289721, 36.059413 ], [ 120.35809, 36.174956 ], [ 120.362402, 36.196209 ], [ 120.319902, 36.232423 ], [ 120.297112, 36.225664 ], [ 120.310047, 36.185101 ], [ 120.263236, 36.182202 ], [ 120.260772, 36.198624 ], [ 120.224432, 36.19138 ], [ 120.22012, 36.209248 ], [ 120.181316, 36.203936 ], [ 120.140664, 36.173507 ], [ 120.142512, 36.143549 ], [ 120.108635, 36.127599 ], [ 120.116642, 36.102943 ], [ 120.152367, 36.095206 ], [ 120.181316, 36.066669 ], [ 120.239214, 36.062316 ], [ 120.234902, 36.030863 ], [ 120.198562, 35.995525 ], [ 120.257076, 36.025055 ], [ 120.249069, 35.992136 ], [ 120.285409, 36.01247 ], [ 120.289721, 36.017311 ], [ 120.316206, 36.002304 ], [ 120.30512, 35.971796 ], [ 120.265699, 35.966468 ], [ 120.209033, 35.917531 ], [ 120.202258, 35.89184 ], [ 120.169613, 35.888446 ], [ 120.207801, 35.947575 ], [ 120.152983, 35.907353 ], [ 120.125265, 35.906868 ], [ 120.112331, 35.885052 ], [ 120.064287, 35.873414 ], [ 120.032258, 35.812288 ], [ 120.049505, 35.786562 ], [ 120.01378, 35.714193 ], [ 119.958346, 35.760342 ], [ 119.926317, 35.759856 ], [ 119.920157, 35.739943 ], [ 119.950339, 35.729741 ], [ 119.91215, 35.660725 ], [ 119.925085, 35.637382 ], [ 119.868419, 35.60868 ], [ 119.83023, 35.620357 ], [ 119.824071, 35.646136 ], [ 119.792658, 35.615492 ], [ 119.800665, 35.581915 ], [ 119.752622, 35.588729 ], [ 119.75139, 35.617924 ], [ 119.718129, 35.615492 ], [ 119.662079, 35.589215 ], [ 119.663311, 35.562931 ], [ 119.618963, 35.459655 ], [ 119.579543, 35.406504 ], [ 119.590014, 35.37284 ], [ 119.543819, 35.347949 ], [ 119.538275, 35.296678 ], [ 119.493312, 35.318655 ], [ 119.450812, 35.285443 ], [ 119.411392, 35.231689 ], [ 119.397841, 35.137777 ], [ 119.428022, 35.121136 ], [ 119.373819, 35.078538 ], [ 119.354109, 35.080007 ], [ 119.306066, 35.076578 ], [ 119.286972, 35.115261 ], [ 119.250016, 35.124562 ], [ 119.217371, 35.106939 ], [ 119.137915, 35.096167 ], [ 119.114509, 35.055026 ], [ 119.027045, 35.055516 ], [ 118.942662, 35.040817 ], [ 118.928495, 35.051106 ], [ 118.86259, 35.025626 ], [ 118.860742, 34.944233 ], [ 118.805307, 34.87307 ], [ 118.80038, 34.843114 ], [ 118.772047, 34.794474 ], [ 118.739402, 34.792508 ], [ 118.719076, 34.745313 ], [ 118.764039, 34.740396 ], [ 118.783749, 34.723181 ], [ 118.739402, 34.693663 ], [ 118.690127, 34.678408 ], [ 118.664257, 34.693663 ], [ 118.607591, 34.694155 ], [ 118.601431, 34.714327 ], [ 118.545997, 34.705964 ], [ 118.460997, 34.656258 ], [ 118.473932, 34.623269 ], [ 118.439439, 34.626223 ], [ 118.424657, 34.595193 ], [ 118.439439, 34.507949 ], [ 118.416034, 34.473914 ], [ 118.404947, 34.427525 ], [ 118.379693, 34.415183 ], [ 118.290382, 34.424563 ], [ 118.277447, 34.404814 ], [ 118.220165, 34.405802 ], [ 118.217701, 34.379134 ], [ 118.179513, 34.379628 ], [ 118.177665, 34.45319 ], [ 118.132702, 34.483287 ], [ 118.16473, 34.50499 ], [ 118.185056, 34.543942 ], [ 118.079115, 34.569571 ], [ 118.114839, 34.614404 ], [ 118.084042, 34.655766 ], [ 118.053861, 34.650843 ], [ 117.951615, 34.678408 ], [ 117.909732, 34.670533 ], [ 117.902956, 34.644443 ], [ 117.793935, 34.651827 ], [ 117.791471, 34.583368 ], [ 117.801942, 34.518798 ], [ 117.684298, 34.547392 ], [ 117.659044, 34.501044 ], [ 117.609769, 34.490686 ], [ 117.592523, 34.462566 ], [ 117.53832, 34.467006 ], [ 117.465023, 34.484767 ], [ 117.402813, 34.550843 ], [ 117.402813, 34.569571 ], [ 117.362777, 34.589281 ], [ 117.325205, 34.573021 ], [ 117.325205, 34.573021 ], [ 117.32151, 34.566614 ], [ 117.32151, 34.566614 ], [ 117.311654, 34.561686 ], [ 117.311654, 34.561686 ], [ 117.267307, 34.528659 ], [ 117.27285, 34.499565 ], [ 117.252524, 34.48674 ], [ 117.248213, 34.451216 ], [ 117.166293, 34.434435 ], [ 117.139191, 34.526687 ], [ 117.15151, 34.559222 ], [ 117.104083, 34.648874 ], [ 117.073286, 34.639026 ], [ 117.061583, 34.675947 ], [ 117.070206, 34.713835 ], [ 117.022163, 34.759081 ], [ 116.969192, 34.771864 ], [ 116.95133, 34.81069 ], [ 116.979047, 34.815113 ], [ 116.966113, 34.844588 ], [ 116.929156, 34.843114 ], [ 116.922381, 34.894671 ], [ 116.858323, 34.928533 ], [ 116.821983, 34.929515 ], [ 116.809048, 34.968757 ], [ 116.781947, 34.961891 ], [ 116.781331, 34.916757 ], [ 116.677853, 34.939327 ], [ 116.622418, 34.939818 ], [ 116.613795, 34.922645 ], [ 116.557745, 34.908905 ], [ 116.445028, 34.895652 ], [ 116.408071, 34.850972 ], [ 116.403144, 34.756131 ], [ 116.369267, 34.749247 ], [ 116.363724, 34.715311 ], [ 116.392057, 34.710391 ], [ 116.374195, 34.640011 ] ] ], [ [ [ 120.729502, 37.947065 ], [ 120.76461, 37.923937 ], [ 120.76461, 37.895134 ], [ 120.721495, 37.917328 ], [ 120.729502, 37.947065 ] ] ], [ [ [ 120.692545, 37.983867 ], [ 120.724574, 37.987641 ], [ 120.732581, 37.961694 ], [ 120.692545, 37.983867 ] ] ], [ [ [ 120.990044, 36.413239 ], [ 120.950624, 36.414684 ], [ 120.978341, 36.428649 ], [ 120.990044, 36.413239 ] ] ], [ [ [ 120.750444, 38.150188 ], [ 120.742436, 38.199116 ], [ 120.7874, 38.158658 ], [ 120.750444, 38.150188 ] ] ], [ [ [ 120.918595, 38.345236 ], [ 120.895189, 38.36307 ], [ 120.914899, 38.373393 ], [ 120.918595, 38.345236 ] ] ], [ [ [ 120.159142, 35.765198 ], [ 120.172077, 35.785591 ], [ 120.193019, 35.756942 ], [ 120.169613, 35.740428 ], [ 120.159142, 35.765198 ] ] ], [ [ [ 120.62664, 37.94565 ], [ 120.602002, 37.978678 ], [ 120.631567, 37.981037 ], [ 120.62664, 37.94565 ] ] ], [ [ [ 120.802183, 38.284193 ], [ 120.816349, 38.318008 ], [ 120.848378, 38.305799 ], [ 120.802183, 38.284193 ] ] ], [ [ [ 121.489571, 37.577086 ], [ 121.488955, 37.578035 ], [ 121.489571, 37.578509 ], [ 121.489571, 37.577561 ], [ 121.489571, 37.577086 ] ] ], [ [ [ 121.485875, 37.578509 ], [ 121.487723, 37.578509 ], [ 121.487723, 37.578035 ], [ 121.485875, 37.578509 ] ] ], [ [ [ 121.487723, 37.578509 ], [ 121.488339, 37.578509 ], [ 121.488955, 37.578509 ], [ 121.488955, 37.578035 ], [ 121.487723, 37.577561 ], [ 121.487723, 37.578509 ] ] ], [ [ [ 115.495249, 35.896203 ], [ 115.505104, 35.899112 ], [ 115.513112, 35.890385 ], [ 115.487858, 35.880688 ], [ 115.495249, 35.896203 ] ] ] ] } },\n{ \"type\": \"Feature\", \"properties\": { \"adcode\": \"410000\", \"name\": \"河南省\", \"center\": [ 113.665412, 34.757975 ], \"centroid\": [ 113.619748, 33.902617 ], \"childrenNum\": 18, \"level\": \"province\", \"parent\": { \"adcode\": 100000 }, \"subFeatureIndex\": 15, \"acroutes\": [ 100000 ] }, \"geometry\": { \"type\": \"MultiPolygon\", \"coordinates\": [ [ [ [ 115.5088, 32.468761 ], [ 115.509416, 32.466741 ], [ 115.522967, 32.441997 ], [ 115.57101, 32.419266 ], [ 115.604271, 32.425833 ], [ 115.626445, 32.40512 ], [ 115.657857, 32.428864 ], [ 115.667712, 32.409667 ], [ 115.704669, 32.495013 ], [ 115.742241, 32.476335 ], [ 115.771806, 32.505108 ], [ 115.789052, 32.468761 ], [ 115.861117, 32.537403 ], [ 115.891298, 32.576243 ], [ 115.910393, 32.567165 ], [ 115.8759, 32.542448 ], [ 115.845719, 32.501575 ], [ 115.883291, 32.487946 ], [ 115.865429, 32.458662 ], [ 115.899306, 32.390971 ], [ 115.912856, 32.227596 ], [ 115.941805, 32.166318 ], [ 115.922095, 32.049725 ], [ 115.928871, 32.003046 ], [ 115.909161, 31.94314 ], [ 115.920248, 31.920285 ], [ 115.894994, 31.8649 ], [ 115.893762, 31.832365 ], [ 115.914704, 31.814567 ], [ 115.886371, 31.776418 ], [ 115.851878, 31.786593 ], [ 115.808147, 31.770313 ], [ 115.808147, 31.770313 ], [ 115.767495, 31.78761 ], [ 115.731154, 31.76726 ], [ 115.676336, 31.778453 ], [ 115.553764, 31.69549 ], [ 115.534054, 31.698545 ], [ 115.495249, 31.673083 ], [ 115.476771, 31.643028 ], [ 115.485394, 31.608885 ], [ 115.439815, 31.588496 ], [ 115.415793, 31.525771 ], [ 115.371446, 31.495668 ], [ 115.389924, 31.450241 ], [ 115.373909, 31.405813 ], [ 115.338801, 31.40428 ], [ 115.301229, 31.383846 ], [ 115.250722, 31.392021 ], [ 115.252569, 31.421646 ], [ 115.211301, 31.442072 ], [ 115.218077, 31.515057 ], [ 115.235939, 31.555354 ], [ 115.212533, 31.555354 ], [ 115.16449, 31.604808 ], [ 115.12507, 31.599201 ], [ 115.106592, 31.567592 ], [ 115.114599, 31.530362 ], [ 115.096121, 31.508425 ], [ 115.022824, 31.527811 ], [ 114.995107, 31.471171 ], [ 114.962462, 31.494648 ], [ 114.884238, 31.469129 ], [ 114.870071, 31.479337 ], [ 114.830035, 31.45892 ], [ 114.789383, 31.480358 ], [ 114.778912, 31.520669 ], [ 114.696376, 31.525771 ], [ 114.641558, 31.582378 ], [ 114.61692, 31.585437 ], [ 114.572572, 31.553824 ], [ 114.560869, 31.560963 ], [ 114.547935, 31.623665 ], [ 114.57134, 31.660858 ], [ 114.586123, 31.762172 ], [ 114.549783, 31.766751 ], [ 114.530688, 31.742834 ], [ 114.443841, 31.728074 ], [ 114.403189, 31.746906 ], [ 114.350218, 31.755557 ], [ 114.292936, 31.752503 ], [ 114.235654, 31.833382 ], [ 114.191922, 31.852192 ], [ 114.134024, 31.843042 ], [ 114.119241, 31.805922 ], [ 114.089676, 31.781506 ], [ 114.017611, 31.770822 ], [ 113.988662, 31.749959 ], [ 113.952321, 31.793714 ], [ 113.957865, 31.852701 ], [ 113.914749, 31.877098 ], [ 113.893807, 31.847109 ], [ 113.854387, 31.843042 ], [ 113.830981, 31.87913 ], [ 113.832213, 31.918761 ], [ 113.805728, 31.929428 ], [ 113.817431, 31.964467 ], [ 113.757685, 31.98985 ], [ 113.791561, 32.036028 ], [ 113.728735, 32.083197 ], [ 113.722576, 32.12426 ], [ 113.750293, 32.11615 ], [ 113.782322, 32.184553 ], [ 113.752757, 32.215951 ], [ 113.73859, 32.255942 ], [ 113.749061, 32.272642 ], [ 113.758301, 32.27669 ], [ 113.768156, 32.284279 ], [ 113.768772, 32.30148 ], [ 113.753989, 32.328286 ], [ 113.76754, 32.370249 ], [ 113.735511, 32.410677 ], [ 113.700402, 32.420782 ], [ 113.650511, 32.412698 ], [ 113.624642, 32.36115 ], [ 113.511925, 32.316654 ], [ 113.428773, 32.270618 ], [ 113.376418, 32.298445 ], [ 113.353628, 32.294904 ], [ 113.317904, 32.327275 ], [ 113.333918, 32.336377 ], [ 113.2366, 32.407141 ], [ 113.211962, 32.431895 ], [ 113.158992, 32.410677 ], [ 113.155912, 32.380863 ], [ 113.118956, 32.375809 ], [ 113.107869, 32.398551 ], [ 113.078919, 32.394508 ], [ 113.025949, 32.425328 ], [ 113.000695, 32.41674 ], [ 112.992072, 32.378336 ], [ 112.912, 32.390971 ], [ 112.888594, 32.37682 ], [ 112.860877, 32.396024 ], [ 112.776493, 32.358623 ], [ 112.735841, 32.356095 ], [ 112.716747, 32.357612 ], [ 112.645298, 32.368227 ], [ 112.612037, 32.386928 ], [ 112.589248, 32.381369 ], [ 112.545516, 32.404109 ], [ 112.530733, 32.37682 ], [ 112.477147, 32.380863 ], [ 112.448814, 32.34295 ], [ 112.390915, 32.37126 ], [ 112.360118, 32.3657 ], [ 112.328089, 32.321712 ], [ 112.206133, 32.392992 ], [ 112.172873, 32.385412 ], [ 112.150083, 32.411688 ], [ 112.155626, 32.377326 ], [ 112.081098, 32.425833 ], [ 112.063851, 32.474315 ], [ 112.014576, 32.450077 ], [ 111.975772, 32.471791 ], [ 111.948671, 32.51722 ], [ 111.890157, 32.503089 ], [ 111.858128, 32.528826 ], [ 111.808853, 32.536899 ], [ 111.713382, 32.606497 ], [ 111.646245, 32.605993 ], [ 111.640701, 32.634724 ], [ 111.577875, 32.593388 ], [ 111.530448, 32.628172 ], [ 111.513202, 32.674026 ], [ 111.458383, 32.726402 ], [ 111.475629, 32.760127 ], [ 111.41342, 32.757108 ], [ 111.380159, 32.829049 ], [ 111.293311, 32.859217 ], [ 111.276065, 32.903445 ], [ 111.255123, 32.883846 ], [ 111.242804, 32.930573 ], [ 111.273601, 32.971753 ], [ 111.258819, 33.006389 ], [ 111.221862, 33.042517 ], [ 111.152877, 33.039507 ], [ 111.192913, 33.071609 ], [ 111.179363, 33.115229 ], [ 111.146102, 33.12375 ], [ 111.12824, 33.15532 ], [ 111.08882, 33.181871 ], [ 111.045704, 33.169849 ], [ 111.046936, 33.202905 ], [ 110.984726, 33.255469 ], [ 111.025994, 33.330504 ], [ 111.025994, 33.375495 ], [ 110.996429, 33.435946 ], [ 111.02661, 33.467903 ], [ 111.02661, 33.478386 ], [ 111.002588, 33.535772 ], [ 111.00382, 33.578662 ], [ 110.966864, 33.609071 ], [ 110.878784, 33.634486 ], [ 110.823966, 33.685793 ], [ 110.831973, 33.713675 ], [ 110.81719, 33.751003 ], [ 110.782082, 33.796272 ], [ 110.74143, 33.798759 ], [ 110.712481, 33.833564 ], [ 110.66259, 33.85295 ], [ 110.612083, 33.852453 ], [ 110.587445, 33.887733 ], [ 110.628713, 33.910086 ], [ 110.627481, 33.925482 ], [ 110.665669, 33.937895 ], [ 110.671213, 33.966192 ], [ 110.620706, 34.035652 ], [ 110.587445, 34.023252 ], [ 110.591757, 34.101586 ], [ 110.61393, 34.113478 ], [ 110.642264, 34.161032 ], [ 110.621938, 34.177372 ], [ 110.55788, 34.193214 ], [ 110.55172, 34.213012 ], [ 110.507989, 34.217466 ], [ 110.43962, 34.243196 ], [ 110.428533, 34.288203 ], [ 110.451938, 34.292653 ], [ 110.503677, 34.33714 ], [ 110.473496, 34.393457 ], [ 110.403279, 34.433448 ], [ 110.403279, 34.433448 ], [ 110.360779, 34.516825 ], [ 110.372482, 34.544435 ], [ 110.404511, 34.557743 ], [ 110.366939, 34.566614 ], [ 110.379257, 34.600612 ], [ 110.424837, 34.588295 ], [ 110.488279, 34.610956 ], [ 110.533242, 34.583368 ], [ 110.610851, 34.607508 ], [ 110.710017, 34.605045 ], [ 110.749437, 34.65232 ], [ 110.780234, 34.648874 ], [ 110.812263, 34.624746 ], [ 110.870777, 34.636072 ], [ 110.89911, 34.661673 ], [ 110.929907, 34.731543 ], [ 110.976103, 34.706456 ], [ 111.035233, 34.740887 ], [ 111.118385, 34.756623 ], [ 111.148566, 34.807742 ], [ 111.232949, 34.789559 ], [ 111.255123, 34.819535 ], [ 111.29208, 34.806759 ], [ 111.345666, 34.831816 ], [ 111.389398, 34.815113 ], [ 111.439289, 34.838202 ], [ 111.502731, 34.829851 ], [ 111.543999, 34.853428 ], [ 111.570484, 34.843114 ], [ 111.592042, 34.881416 ], [ 111.617911, 34.894671 ], [ 111.646861, 34.938836 ], [ 111.681969, 34.9511 ], [ 111.664107, 34.984449 ], [ 111.739251, 35.00406 ], [ 111.807005, 35.032977 ], [ 111.810084, 35.062374 ], [ 111.933272, 35.083435 ], [ 111.97762, 35.067272 ], [ 112.018888, 35.068742 ], [ 112.039214, 35.045717 ], [ 112.062004, 35.056005 ], [ 112.05646, 35.098615 ], [ 112.066315, 35.153437 ], [ 112.03983, 35.194039 ], [ 112.078634, 35.219467 ], [ 112.058924, 35.280069 ], [ 112.094033, 35.279092 ], [ 112.21722, 35.253195 ], [ 112.242474, 35.234622 ], [ 112.304684, 35.251728 ], [ 112.288053, 35.219956 ], [ 112.36751, 35.219956 ], [ 112.390915, 35.239021 ], [ 112.513487, 35.218489 ], [ 112.637291, 35.225822 ], [ 112.628052, 35.263457 ], [ 112.720443, 35.206265 ], [ 112.772798, 35.207732 ], [ 112.822073, 35.258082 ], [ 112.884283, 35.243909 ], [ 112.934174, 35.262968 ], [ 112.936022, 35.284466 ], [ 112.992072, 35.29619 ], [ 112.985913, 35.33965 ], [ 112.996384, 35.362104 ], [ 113.067217, 35.353806 ], [ 113.126347, 35.332327 ], [ 113.149137, 35.350878 ], [ 113.165151, 35.412845 ], [ 113.188557, 35.412357 ], [ 113.189789, 35.44893 ], [ 113.243375, 35.449418 ], [ 113.304353, 35.426989 ], [ 113.31236, 35.481101 ], [ 113.348085, 35.468429 ], [ 113.391817, 35.506925 ], [ 113.439244, 35.507412 ], [ 113.49899, 35.532254 ], [ 113.513773, 35.57364 ], [ 113.55812, 35.621816 ], [ 113.547649, 35.656835 ], [ 113.578446, 35.633491 ], [ 113.625258, 35.632518 ], [ 113.622794, 35.674825 ], [ 113.592613, 35.691838 ], [ 113.587685, 35.736542 ], [ 113.604932, 35.797727 ], [ 113.582758, 35.818111 ], [ 113.660982, 35.837035 ], [ 113.637576, 35.870019 ], [ 113.654207, 35.931586 ], [ 113.648663, 35.994073 ], [ 113.678844, 35.985841 ], [ 113.694859, 36.026991 ], [ 113.660366, 36.034735 ], [ 113.68562, 36.056026 ], [ 113.671453, 36.115514 ], [ 113.655439, 36.125182 ], [ 113.712721, 36.129533 ], [ 113.705946, 36.148865 ], [ 113.651127, 36.174473 ], [ 113.697939, 36.181719 ], [ 113.681924, 36.216491 ], [ 113.716417, 36.262347 ], [ 113.712105, 36.303353 ], [ 113.736127, 36.324571 ], [ 113.731199, 36.363135 ], [ 113.755221, 36.366026 ], [ 113.813119, 36.332285 ], [ 113.856851, 36.329392 ], [ 113.84946, 36.347711 ], [ 113.882104, 36.353977 ], [ 113.911054, 36.314927 ], [ 113.962792, 36.353977 ], [ 113.981887, 36.31782 ], [ 114.002828, 36.334214 ], [ 114.056415, 36.329392 ], [ 114.04348, 36.303353 ], [ 114.080437, 36.269585 ], [ 114.129096, 36.280199 ], [ 114.175907, 36.264759 ], [ 114.170364, 36.245938 ], [ 114.170364, 36.245938 ], [ 114.203009, 36.245456 ], [ 114.2104, 36.272962 ], [ 114.241197, 36.251247 ], [ 114.257827, 36.263794 ], [ 114.299095, 36.245938 ], [ 114.345291, 36.255591 ], [ 114.356378, 36.230492 ], [ 114.408117, 36.224699 ], [ 114.417356, 36.205868 ], [ 114.466015, 36.197658 ], [ 114.480181, 36.177855 ], [ 114.533152, 36.171575 ], [ 114.586739, 36.141133 ], [ 114.588587, 36.118414 ], [ 114.640326, 36.137266 ], [ 114.720398, 36.140166 ], [ 114.734564, 36.15563 ], [ 114.771521, 36.124699 ], [ 114.857752, 36.127599 ], [ 114.858368, 36.144516 ], [ 114.912571, 36.140649 ], [ 114.926737, 36.089403 ], [ 114.914419, 36.052155 ], [ 114.998186, 36.069572 ], [ 115.04623, 36.112613 ], [ 115.048693, 36.161912 ], [ 115.06286, 36.178338 ], [ 115.104744, 36.172058 ], [ 115.12507, 36.209731 ], [ 115.1842, 36.193312 ], [ 115.201446, 36.210214 ], [ 115.201446, 36.210214 ], [ 115.202678, 36.209248 ], [ 115.202678, 36.209248 ], [ 115.202678, 36.208765 ], [ 115.202678, 36.208765 ], [ 115.242098, 36.19138 ], [ 115.279055, 36.13775 ], [ 115.30246, 36.127599 ], [ 115.312931, 36.088436 ], [ 115.365902, 36.099074 ], [ 115.376989, 36.128083 ], [ 115.450902, 36.152248 ], [ 115.465068, 36.170125 ], [ 115.483547, 36.148865 ], [ 115.484163, 36.125666 ], [ 115.449054, 36.047317 ], [ 115.447822, 36.01247 ], [ 115.362822, 35.971796 ], [ 115.353583, 35.938854 ], [ 115.364054, 35.894264 ], [ 115.335105, 35.796756 ], [ 115.363438, 35.779765 ], [ 115.407786, 35.80889 ], [ 115.460141, 35.867594 ], [ 115.487858, 35.880688 ], [ 115.513112, 35.890385 ], [ 115.583945, 35.921893 ], [ 115.648618, 35.922863 ], [ 115.699125, 35.966468 ], [ 115.774886, 35.974702 ], [ 115.779813, 35.993588 ], [ 115.817386, 36.012954 ], [ 115.859886, 36.003756 ], [ 115.89869, 36.026507 ], [ 115.989849, 36.045381 ], [ 116.057602, 36.104877 ], [ 116.099486, 36.112129 ], [ 116.063145, 36.028927 ], [ 116.048979, 35.970343 ], [ 115.984921, 35.974218 ], [ 115.911624, 35.960171 ], [ 115.907929, 35.92674 ], [ 115.873436, 35.918985 ], [ 115.882675, 35.879718 ], [ 115.859886, 35.857894 ], [ 115.81677, 35.844312 ], [ 115.773654, 35.854014 ], [ 115.73485, 35.833154 ], [ 115.696046, 35.788989 ], [ 115.693582, 35.754028 ], [ 115.622749, 35.739457 ], [ 115.52851, 35.733628 ], [ 115.48601, 35.710306 ], [ 115.383148, 35.568772 ], [ 115.34496, 35.55368 ], [ 115.356047, 35.490359 ], [ 115.307388, 35.480126 ], [ 115.237171, 35.423087 ], [ 115.172497, 35.426501 ], [ 115.126302, 35.41821 ], [ 115.117679, 35.400163 ], [ 115.091809, 35.416259 ], [ 115.073947, 35.374304 ], [ 115.04315, 35.376744 ], [ 114.957534, 35.261014 ], [ 114.929201, 35.244886 ], [ 114.932281, 35.198441 ], [ 114.861448, 35.182301 ], [ 114.841738, 35.15099 ], [ 114.883006, 35.098615 ], [ 114.835578, 35.076578 ], [ 114.818948, 35.051596 ], [ 114.852209, 35.041797 ], [ 114.824492, 35.012393 ], [ 114.880542, 35.00357 ], [ 114.923658, 34.968757 ], [ 114.950759, 34.989843 ], [ 115.008041, 34.988372 ], [ 115.028983, 34.9717 ], [ 115.075179, 35.000628 ], [ 115.12815, 35.00455 ], [ 115.157099, 34.957968 ], [ 115.219309, 34.96042 ], [ 115.205142, 34.914303 ], [ 115.251953, 34.906451 ], [ 115.239019, 34.87798 ], [ 115.256265, 34.845079 ], [ 115.317243, 34.859321 ], [ 115.42688, 34.805285 ], [ 115.449054, 34.74433 ], [ 115.433655, 34.725149 ], [ 115.461373, 34.637057 ], [ 115.515575, 34.582383 ], [ 115.553148, 34.568586 ], [ 115.622749, 34.574499 ], [ 115.685575, 34.556265 ], [ 115.697278, 34.594207 ], [ 115.787821, 34.580905 ], [ 115.827241, 34.558236 ], [ 115.838328, 34.5676 ], [ 115.984305, 34.589281 ], [ 115.991081, 34.615389 ], [ 116.037276, 34.593222 ], [ 116.101334, 34.60603 ], [ 116.134594, 34.559715 ], [ 116.156768, 34.5538 ], [ 116.196804, 34.575977 ], [ 116.191261, 34.535561 ], [ 116.204196, 34.508442 ], [ 116.178326, 34.496112 ], [ 116.162312, 34.459605 ], [ 116.178942, 34.430487 ], [ 116.215898, 34.403333 ], [ 116.213435, 34.382098 ], [ 116.255934, 34.376665 ], [ 116.301514, 34.342082 ], [ 116.363724, 34.316877 ], [ 116.372347, 34.26595 ], [ 116.409303, 34.273863 ], [ 116.409303, 34.273863 ], [ 116.456731, 34.268917 ], [ 116.516477, 34.296114 ], [ 116.562056, 34.285731 ], [ 116.582382, 34.266444 ], [ 116.545426, 34.241711 ], [ 116.542962, 34.203608 ], [ 116.565752, 34.16945 ], [ 116.536187, 34.151127 ], [ 116.52818, 34.122892 ], [ 116.576223, 34.068873 ], [ 116.576223, 34.068873 ], [ 116.599629, 34.014324 ], [ 116.599629, 34.014324 ], [ 116.641512, 33.978103 ], [ 116.64336, 33.896675 ], [ 116.631042, 33.887733 ], [ 116.566984, 33.9081 ], [ 116.558361, 33.881274 ], [ 116.486296, 33.869846 ], [ 116.437637, 33.846489 ], [ 116.437021, 33.801246 ], [ 116.408071, 33.805721 ], [ 116.393905, 33.782843 ], [ 116.316912, 33.771402 ], [ 116.263326, 33.730101 ], [ 116.2005, 33.72612 ], [ 116.155536, 33.709693 ], [ 116.132747, 33.751501 ], [ 116.100102, 33.782843 ], [ 116.074232, 33.781351 ], [ 116.055754, 33.804727 ], [ 116.05945, 33.860902 ], [ 115.982457, 33.917039 ], [ 116.00032, 33.965199 ], [ 115.95782, 34.007875 ], [ 115.904233, 34.009859 ], [ 115.876516, 34.028708 ], [ 115.877132, 34.002913 ], [ 115.852494, 34.003906 ], [ 115.846335, 34.028708 ], [ 115.809378, 34.062428 ], [ 115.736082, 34.076805 ], [ 115.705901, 34.059949 ], [ 115.658473, 34.061437 ], [ 115.642459, 34.03218 ], [ 115.60735, 34.030196 ], [ 115.579017, 33.974133 ], [ 115.577785, 33.950307 ], [ 115.547604, 33.874815 ], [ 115.631988, 33.869846 ], [ 115.614126, 33.775879 ], [ 115.576553, 33.787817 ], [ 115.563003, 33.772895 ], [ 115.601807, 33.718653 ], [ 115.601191, 33.658898 ], [ 115.639995, 33.585143 ], [ 115.564851, 33.576169 ], [ 115.561771, 33.563703 ], [ 115.463837, 33.567193 ], [ 115.422569, 33.557219 ], [ 115.394851, 33.506335 ], [ 115.366518, 33.5233 ], [ 115.345576, 33.502842 ], [ 115.345576, 33.449928 ], [ 115.316627, 33.44893 ], [ 115.328946, 33.403477 ], [ 115.313547, 33.376994 ], [ 115.341881, 33.370997 ], [ 115.365286, 33.336005 ], [ 115.361591, 33.298497 ], [ 115.335105, 33.297997 ], [ 115.340033, 33.260973 ], [ 115.300613, 33.204407 ], [ 115.303692, 33.149809 ], [ 115.289526, 33.131769 ], [ 115.245178, 33.135778 ], [ 115.194671, 33.120743 ], [ 115.168186, 33.088658 ], [ 115.041302, 33.086653 ], [ 114.990795, 33.102195 ], [ 114.966158, 33.147304 ], [ 114.932897, 33.153817 ], [ 114.902716, 33.129764 ], [ 114.897172, 33.086653 ], [ 114.913187, 33.083143 ], [ 114.925506, 33.016928 ], [ 114.891629, 33.020441 ], [ 114.883006, 32.990328 ], [ 114.916266, 32.971251 ], [ 114.943368, 32.935094 ], [ 115.009273, 32.940117 ], [ 115.035143, 32.932582 ], [ 115.029599, 32.906962 ], [ 115.139237, 32.897917 ], [ 115.155867, 32.864747 ], [ 115.197135, 32.856201 ], [ 115.189744, 32.812452 ], [ 115.211301, 32.785791 ], [ 115.189744, 32.770695 ], [ 115.179273, 32.726402 ], [ 115.182968, 32.666973 ], [ 115.20083, 32.591876 ], [ 115.24333, 32.593388 ], [ 115.267352, 32.578261 ], [ 115.30554, 32.583303 ], [ 115.304924, 32.553042 ], [ 115.411482, 32.575235 ], [ 115.409018, 32.549007 ], [ 115.497713, 32.492489 ], [ 115.5088, 32.468761 ] ] ], [ [ [ 113.768156, 32.284279 ], [ 113.758301, 32.27669 ], [ 113.749061, 32.272642 ], [ 113.768772, 32.30148 ], [ 113.768156, 32.284279 ] ] ] ] } },\n{ \"type\": \"Feature\", \"properties\": { \"adcode\": \"420000\", \"name\": \"湖北省\", \"center\": [ 114.298572, 30.584355 ], \"centroid\": [ 112.271286, 30.987521 ], \"childrenNum\": 17, \"level\": \"province\", \"parent\": { \"adcode\": 100000 }, \"subFeatureIndex\": 16, \"acroutes\": [ 100000 ] }, \"geometry\": { \"type\": \"MultiPolygon\", \"coordinates\": [ [ [ [ 111.045704, 33.169849 ], [ 111.08882, 33.181871 ], [ 111.12824, 33.15532 ], [ 111.146102, 33.12375 ], [ 111.179363, 33.115229 ], [ 111.192913, 33.071609 ], [ 111.152877, 33.039507 ], [ 111.221862, 33.042517 ], [ 111.258819, 33.006389 ], [ 111.273601, 32.971753 ], [ 111.242804, 32.930573 ], [ 111.255123, 32.883846 ], [ 111.276065, 32.903445 ], [ 111.293311, 32.859217 ], [ 111.380159, 32.829049 ], [ 111.41342, 32.757108 ], [ 111.475629, 32.760127 ], [ 111.458383, 32.726402 ], [ 111.513202, 32.674026 ], [ 111.530448, 32.628172 ], [ 111.577875, 32.593388 ], [ 111.640701, 32.634724 ], [ 111.646245, 32.605993 ], [ 111.713382, 32.606497 ], [ 111.808853, 32.536899 ], [ 111.858128, 32.528826 ], [ 111.890157, 32.503089 ], [ 111.948671, 32.51722 ], [ 111.975772, 32.471791 ], [ 112.014576, 32.450077 ], [ 112.063851, 32.474315 ], [ 112.081098, 32.425833 ], [ 112.155626, 32.377326 ], [ 112.150083, 32.411688 ], [ 112.172873, 32.385412 ], [ 112.206133, 32.392992 ], [ 112.328089, 32.321712 ], [ 112.360118, 32.3657 ], [ 112.390915, 32.37126 ], [ 112.448814, 32.34295 ], [ 112.477147, 32.380863 ], [ 112.530733, 32.37682 ], [ 112.545516, 32.404109 ], [ 112.589248, 32.381369 ], [ 112.612037, 32.386928 ], [ 112.645298, 32.368227 ], [ 112.716747, 32.357612 ], [ 112.724138, 32.358623 ], [ 112.733993, 32.356601 ], [ 112.735841, 32.356095 ], [ 112.776493, 32.358623 ], [ 112.860877, 32.396024 ], [ 112.888594, 32.37682 ], [ 112.912, 32.390971 ], [ 112.992072, 32.378336 ], [ 113.000695, 32.41674 ], [ 113.025949, 32.425328 ], [ 113.078919, 32.394508 ], [ 113.107869, 32.398551 ], [ 113.118956, 32.375809 ], [ 113.155912, 32.380863 ], [ 113.158992, 32.410677 ], [ 113.211962, 32.431895 ], [ 113.2366, 32.407141 ], [ 113.333918, 32.336377 ], [ 113.317904, 32.327275 ], [ 113.353628, 32.294904 ], [ 113.376418, 32.298445 ], [ 113.428773, 32.270618 ], [ 113.511925, 32.316654 ], [ 113.624642, 32.36115 ], [ 113.650511, 32.412698 ], [ 113.700402, 32.420782 ], [ 113.735511, 32.410677 ], [ 113.76754, 32.370249 ], [ 113.753989, 32.328286 ], [ 113.768772, 32.30148 ], [ 113.749061, 32.272642 ], [ 113.73859, 32.255942 ], [ 113.752757, 32.215951 ], [ 113.782322, 32.184553 ], [ 113.750293, 32.11615 ], [ 113.722576, 32.12426 ], [ 113.728735, 32.083197 ], [ 113.791561, 32.036028 ], [ 113.757685, 31.98985 ], [ 113.817431, 31.964467 ], [ 113.805728, 31.929428 ], [ 113.832213, 31.918761 ], [ 113.830981, 31.87913 ], [ 113.854387, 31.843042 ], [ 113.893807, 31.847109 ], [ 113.914749, 31.877098 ], [ 113.957865, 31.852701 ], [ 113.952321, 31.793714 ], [ 113.988662, 31.749959 ], [ 114.017611, 31.770822 ], [ 114.089676, 31.781506 ], [ 114.119241, 31.805922 ], [ 114.134024, 31.843042 ], [ 114.191922, 31.852192 ], [ 114.235654, 31.833382 ], [ 114.292936, 31.752503 ], [ 114.350218, 31.755557 ], [ 114.403189, 31.746906 ], [ 114.443841, 31.728074 ], [ 114.530688, 31.742834 ], [ 114.549783, 31.766751 ], [ 114.586123, 31.762172 ], [ 114.57134, 31.660858 ], [ 114.547935, 31.623665 ], [ 114.560869, 31.560963 ], [ 114.572572, 31.553824 ], [ 114.61692, 31.585437 ], [ 114.641558, 31.582378 ], [ 114.696376, 31.525771 ], [ 114.778912, 31.520669 ], [ 114.789383, 31.480358 ], [ 114.830035, 31.45892 ], [ 114.870071, 31.479337 ], [ 114.884238, 31.469129 ], [ 114.962462, 31.494648 ], [ 114.995107, 31.471171 ], [ 115.022824, 31.527811 ], [ 115.096121, 31.508425 ], [ 115.114599, 31.530362 ], [ 115.106592, 31.567592 ], [ 115.12507, 31.599201 ], [ 115.16449, 31.604808 ], [ 115.212533, 31.555354 ], [ 115.235939, 31.555354 ], [ 115.218077, 31.515057 ], [ 115.211301, 31.442072 ], [ 115.252569, 31.421646 ], [ 115.250722, 31.392021 ], [ 115.301229, 31.383846 ], [ 115.338801, 31.40428 ], [ 115.373909, 31.405813 ], [ 115.393004, 31.389977 ], [ 115.372062, 31.349098 ], [ 115.40717, 31.337854 ], [ 115.443511, 31.344498 ], [ 115.473076, 31.265242 ], [ 115.507568, 31.267799 ], [ 115.539597, 31.231985 ], [ 115.540213, 31.194621 ], [ 115.585793, 31.143926 ], [ 115.603655, 31.17363 ], [ 115.655394, 31.211002 ], [ 115.700973, 31.201276 ], [ 115.778582, 31.112164 ], [ 115.797676, 31.128047 ], [ 115.837712, 31.127022 ], [ 115.867277, 31.147512 ], [ 115.887603, 31.10909 ], [ 115.939958, 31.071678 ], [ 115.938726, 31.04707 ], [ 116.006479, 31.034764 ], [ 116.015102, 31.011685 ], [ 116.058834, 31.012711 ], [ 116.071769, 30.956787 ], [ 116.03974, 30.957813 ], [ 115.976298, 30.931636 ], [ 115.932566, 30.889532 ], [ 115.865429, 30.864364 ], [ 115.848799, 30.828397 ], [ 115.863581, 30.815549 ], [ 115.851262, 30.756938 ], [ 115.782893, 30.751795 ], [ 115.762567, 30.685426 ], [ 115.81369, 30.637035 ], [ 115.819234, 30.597893 ], [ 115.848799, 30.602014 ], [ 115.876516, 30.582438 ], [ 115.887603, 30.542758 ], [ 115.910393, 30.519046 ], [ 115.894994, 30.452517 ], [ 115.921479, 30.416397 ], [ 115.885139, 30.379747 ], [ 115.91532, 30.337919 ], [ 115.903001, 30.31364 ], [ 115.985537, 30.290905 ], [ 115.997856, 30.252657 ], [ 116.065609, 30.204569 ], [ 116.055754, 30.180774 ], [ 116.088399, 30.110391 ], [ 116.078544, 30.062233 ], [ 116.091479, 30.036331 ], [ 116.073616, 29.969993 ], [ 116.128435, 29.897904 ], [ 116.13521, 29.819532 ], [ 116.087167, 29.795125 ], [ 116.049595, 29.761881 ], [ 115.965827, 29.724469 ], [ 115.909777, 29.723949 ], [ 115.837096, 29.748373 ], [ 115.762567, 29.793048 ], [ 115.706517, 29.837703 ], [ 115.667712, 29.850161 ], [ 115.611662, 29.841337 ], [ 115.51188, 29.840299 ], [ 115.479235, 29.811224 ], [ 115.470612, 29.739539 ], [ 115.412714, 29.688602 ], [ 115.355431, 29.649602 ], [ 115.304924, 29.637118 ], [ 115.28583, 29.618391 ], [ 115.250722, 29.660003 ], [ 115.176809, 29.654803 ], [ 115.113367, 29.684963 ], [ 115.117679, 29.655843 ], [ 115.143548, 29.645961 ], [ 115.120142, 29.597578 ], [ 115.157099, 29.584568 ], [ 115.154019, 29.510117 ], [ 115.086266, 29.525741 ], [ 115.087498, 29.560104 ], [ 115.033295, 29.546568 ], [ 115.00065, 29.572076 ], [ 114.947679, 29.542924 ], [ 114.966773, 29.522096 ], [ 114.940288, 29.493971 ], [ 114.900868, 29.505951 ], [ 114.860216, 29.476258 ], [ 114.888549, 29.436134 ], [ 114.918114, 29.454374 ], [ 114.90518, 29.473132 ], [ 114.935977, 29.486678 ], [ 114.947063, 29.465317 ], [ 114.931049, 29.422581 ], [ 114.895325, 29.397557 ], [ 114.866375, 29.404335 ], [ 114.812173, 29.383478 ], [ 114.784455, 29.386086 ], [ 114.759818, 29.363139 ], [ 114.740724, 29.386607 ], [ 114.67297, 29.395993 ], [ 114.621847, 29.379828 ], [ 114.589819, 29.352707 ], [ 114.519602, 29.325578 ], [ 114.466015, 29.324013 ], [ 114.440145, 29.341752 ], [ 114.376088, 29.322969 ], [ 114.341595, 29.327665 ], [ 114.307102, 29.365225 ], [ 114.259059, 29.343839 ], [ 114.252284, 29.23475 ], [ 114.169748, 29.216993 ], [ 114.063191, 29.204978 ], [ 114.034857, 29.152204 ], [ 113.98743, 29.126068 ], [ 113.952321, 29.092604 ], [ 113.94185, 29.047097 ], [ 113.898119, 29.029307 ], [ 113.876561, 29.038202 ], [ 113.882104, 29.065407 ], [ 113.852539, 29.058606 ], [ 113.816199, 29.105154 ], [ 113.775547, 29.095219 ], [ 113.749677, 29.060699 ], [ 113.722576, 29.104631 ], [ 113.696091, 29.077437 ], [ 113.690547, 29.114566 ], [ 113.66283, 29.16945 ], [ 113.691779, 29.19662 ], [ 113.693011, 29.226394 ], [ 113.651743, 29.225872 ], [ 113.609859, 29.25146 ], [ 113.632033, 29.316186 ], [ 113.660982, 29.333405 ], [ 113.674533, 29.388172 ], [ 113.731199, 29.393907 ], [ 113.755221, 29.446557 ], [ 113.677613, 29.513763 ], [ 113.630801, 29.523137 ], [ 113.710257, 29.555419 ], [ 113.73859, 29.579363 ], [ 113.704098, 29.634518 ], [ 113.680692, 29.64336 ], [ 113.663446, 29.684443 ], [ 113.606164, 29.666764 ], [ 113.547033, 29.675603 ], [ 113.540258, 29.699519 ], [ 113.558736, 29.727067 ], [ 113.550729, 29.768115 ], [ 113.575367, 29.809147 ], [ 113.571671, 29.849123 ], [ 113.37765, 29.703158 ], [ 113.277252, 29.594976 ], [ 113.222433, 29.543965 ], [ 113.181781, 29.485636 ], [ 113.145441, 29.449163 ], [ 113.099861, 29.459585 ], [ 113.078304, 29.438218 ], [ 113.057362, 29.522616 ], [ 113.034572, 29.523658 ], [ 112.950188, 29.473132 ], [ 112.912, 29.606944 ], [ 112.915696, 29.620992 ], [ 113.005007, 29.693801 ], [ 113.025949, 29.772791 ], [ 112.974826, 29.732784 ], [ 112.944645, 29.682883 ], [ 112.926782, 29.692241 ], [ 112.923703, 29.766557 ], [ 112.929246, 29.77383 ], [ 112.902145, 29.79149 ], [ 112.894138, 29.783699 ], [ 112.861493, 29.78318 ], [ 112.79374, 29.735902 ], [ 112.788812, 29.681323 ], [ 112.733378, 29.645441 ], [ 112.714283, 29.648561 ], [ 112.693957, 29.601741 ], [ 112.650842, 29.592374 ], [ 112.640371, 29.607985 ], [ 112.572001, 29.624113 ], [ 112.54182, 29.60122 ], [ 112.499321, 29.629316 ], [ 112.439574, 29.633997 ], [ 112.424792, 29.598619 ], [ 112.368741, 29.541362 ], [ 112.333017, 29.545007 ], [ 112.291133, 29.517409 ], [ 112.281278, 29.536676 ], [ 112.303452, 29.585609 ], [ 112.233851, 29.61631 ], [ 112.244322, 29.659483 ], [ 112.202438, 29.633997 ], [ 112.178416, 29.656883 ], [ 112.111279, 29.659483 ], [ 112.089721, 29.685482 ], [ 112.065699, 29.681323 ], [ 112.07617, 29.743696 ], [ 112.008417, 29.778505 ], [ 111.95483, 29.796683 ], [ 111.965917, 29.832512 ], [ 111.925881, 29.836665 ], [ 111.899396, 29.855871 ], [ 111.899396, 29.855871 ], [ 111.861207, 29.856909 ], [ 111.8107, 29.901017 ], [ 111.75773, 29.92021 ], [ 111.723853, 29.909317 ], [ 111.723853, 29.909317 ], [ 111.705375, 29.890121 ], [ 111.669034, 29.888565 ], [ 111.669034, 29.888565 ], [ 111.553854, 29.894272 ], [ 111.527368, 29.925916 ], [ 111.475629, 29.918654 ], [ 111.436825, 29.930065 ], [ 111.394325, 29.912948 ], [ 111.382623, 29.95029 ], [ 111.342587, 29.944586 ], [ 111.3315, 29.970512 ], [ 111.266826, 30.01146 ], [ 111.242188, 30.040476 ], [ 111.031537, 30.048765 ], [ 110.929907, 30.063268 ], [ 110.924364, 30.111426 ], [ 110.851067, 30.126439 ], [ 110.746973, 30.112979 ], [ 110.756212, 30.054463 ], [ 110.712481, 30.033223 ], [ 110.650887, 30.07777 ], [ 110.600996, 30.054463 ], [ 110.531394, 30.061197 ], [ 110.497518, 30.055499 ], [ 110.491358, 30.019751 ], [ 110.557264, 29.988137 ], [ 110.517228, 29.961179 ], [ 110.49875, 29.91243 ], [ 110.538786, 29.895828 ], [ 110.549873, 29.848085 ], [ 110.60038, 29.839779 ], [ 110.642879, 29.775907 ], [ 110.562807, 29.712515 ], [ 110.507373, 29.692241 ], [ 110.467337, 29.713034 ], [ 110.447011, 29.664684 ], [ 110.372482, 29.633477 ], [ 110.339221, 29.668324 ], [ 110.302265, 29.661563 ], [ 110.289946, 29.6964 ], [ 110.219729, 29.746814 ], [ 110.160599, 29.753569 ], [ 110.113788, 29.789932 ], [ 110.02386, 29.769674 ], [ 109.941325, 29.774349 ], [ 109.908064, 29.763959 ], [ 109.869876, 29.774869 ], [ 109.779333, 29.757725 ], [ 109.755311, 29.733304 ], [ 109.760238, 29.689122 ], [ 109.714659, 29.673524 ], [ 109.701108, 29.636078 ], [ 109.717739, 29.615269 ], [ 109.664768, 29.599659 ], [ 109.651833, 29.625674 ], [ 109.578536, 29.629836 ], [ 109.558826, 29.606944 ], [ 109.516326, 29.626194 ], [ 109.488609, 29.553336 ], [ 109.467051, 29.560104 ], [ 109.458428, 29.513242 ], [ 109.433791, 29.530948 ], [ 109.436254, 29.488761 ], [ 109.415928, 29.497617 ], [ 109.418392, 29.453332 ], [ 109.368501, 29.413719 ], [ 109.391291, 29.372005 ], [ 109.343863, 29.369398 ], [ 109.352487, 29.284872 ], [ 109.312451, 29.25146 ], [ 109.257632, 29.222738 ], [ 109.275494, 29.202366 ], [ 109.261328, 29.161089 ], [ 109.274262, 29.121885 ], [ 109.232378, 29.119271 ], [ 109.215748, 29.145409 ], [ 109.162777, 29.180946 ], [ 109.139372, 29.168927 ], [ 109.110422, 29.21647 ], [ 109.141835, 29.270256 ], [ 109.106727, 29.288526 ], [ 109.11227, 29.361053 ], [ 109.060531, 29.403292 ], [ 109.034662, 29.360531 ], [ 108.999553, 29.36366 ], [ 108.983539, 29.332883 ], [ 108.919481, 29.3261 ], [ 108.934264, 29.399643 ], [ 108.927488, 29.435612 ], [ 108.884373, 29.440824 ], [ 108.866511, 29.470527 ], [ 108.888684, 29.502305 ], [ 108.878213, 29.539279 ], [ 108.913322, 29.574679 ], [ 108.901003, 29.604863 ], [ 108.870206, 29.596537 ], [ 108.888068, 29.628795 ], [ 108.844337, 29.658443 ], [ 108.781511, 29.635558 ], [ 108.797525, 29.660003 ], [ 108.786438, 29.691721 ], [ 108.752562, 29.649082 ], [ 108.690968, 29.689642 ], [ 108.676801, 29.749412 ], [ 108.680497, 29.800319 ], [ 108.658939, 29.854833 ], [ 108.601041, 29.863656 ], [ 108.556077, 29.818493 ], [ 108.52528, 29.770713 ], [ 108.548686, 29.749412 ], [ 108.504954, 29.728626 ], [ 108.504338, 29.707836 ], [ 108.460606, 29.741098 ], [ 108.437201, 29.741098 ], [ 108.442744, 29.778505 ], [ 108.422418, 29.772791 ], [ 108.424266, 29.815897 ], [ 108.371295, 29.841337 ], [ 108.433505, 29.880262 ], [ 108.467998, 29.864175 ], [ 108.516041, 29.885451 ], [ 108.517889, 29.9394 ], [ 108.536367, 29.983472 ], [ 108.532055, 30.051873 ], [ 108.513577, 30.057571 ], [ 108.546222, 30.104178 ], [ 108.56778, 30.157491 ], [ 108.551766, 30.1637 ], [ 108.581947, 30.255759 ], [ 108.54499, 30.269716 ], [ 108.524048, 30.309506 ], [ 108.501258, 30.314673 ], [ 108.460606, 30.35961 ], [ 108.431041, 30.354446 ], [ 108.402092, 30.376649 ], [ 108.430425, 30.416397 ], [ 108.411331, 30.438586 ], [ 108.42673, 30.492233 ], [ 108.472925, 30.487076 ], [ 108.512961, 30.501515 ], [ 108.556077, 30.487592 ], [ 108.56778, 30.468508 ], [ 108.6497, 30.53915 ], [ 108.642925, 30.578831 ], [ 108.688504, 30.58759 ], [ 108.698975, 30.54482 ], [ 108.743939, 30.494812 ], [ 108.789518, 30.513374 ], [ 108.808612, 30.491202 ], [ 108.838793, 30.503062 ], [ 108.893612, 30.565434 ], [ 108.971836, 30.627766 ], [ 109.006329, 30.626736 ], [ 109.042669, 30.655571 ], [ 109.071002, 30.640125 ], [ 109.111654, 30.646303 ], [ 109.106111, 30.61077 ], [ 109.09256, 30.578831 ], [ 109.103647, 30.565949 ], [ 109.143683, 30.521108 ], [ 109.191726, 30.545851 ], [ 109.191726, 30.545851 ], [ 109.245313, 30.580892 ], [ 109.299516, 30.630341 ], [ 109.314298, 30.599953 ], [ 109.36111, 30.551004 ], [ 109.337088, 30.521623 ], [ 109.35495, 30.487076 ], [ 109.418392, 30.559766 ], [ 109.435638, 30.595832 ], [ 109.535421, 30.664837 ], [ 109.543428, 30.63961 ], [ 109.574225, 30.646818 ], [ 109.590855, 30.69366 ], [ 109.625348, 30.702923 ], [ 109.661072, 30.738936 ], [ 109.656761, 30.760538 ], [ 109.701724, 30.783677 ], [ 109.780564, 30.848437 ], [ 109.828608, 30.864364 ], [ 109.894513, 30.899803 ], [ 109.943788, 30.878746 ], [ 110.008462, 30.883369 ], [ 110.019549, 30.829425 ], [ 110.048498, 30.800642 ], [ 110.082375, 30.799614 ], [ 110.151976, 30.911613 ], [ 110.153824, 30.953708 ], [ 110.172918, 30.978853 ], [ 110.140889, 30.987062 ], [ 110.140273, 31.030661 ], [ 110.120563, 31.0322 ], [ 110.119947, 31.088592 ], [ 110.147048, 31.116776 ], [ 110.180309, 31.121899 ], [ 110.200019, 31.158779 ], [ 110.180309, 31.179774 ], [ 110.155671, 31.279564 ], [ 110.161831, 31.314338 ], [ 110.118715, 31.409899 ], [ 110.054042, 31.410921 ], [ 110.036795, 31.436966 ], [ 109.98752, 31.474744 ], [ 109.94502, 31.47066 ], [ 109.969658, 31.508935 ], [ 109.894513, 31.519139 ], [ 109.837847, 31.555354 ], [ 109.727594, 31.548214 ], [ 109.745456, 31.598182 ], [ 109.76455, 31.602769 ], [ 109.737449, 31.628761 ], [ 109.731289, 31.700582 ], [ 109.683246, 31.719929 ], [ 109.622268, 31.711783 ], [ 109.585928, 31.726546 ], [ 109.592087, 31.789136 ], [ 109.633971, 31.804396 ], [ 109.633971, 31.824738 ], [ 109.60379, 31.885737 ], [ 109.584696, 31.900472 ], [ 109.62042, 31.928412 ], [ 109.631507, 31.962436 ], [ 109.590855, 32.012688 ], [ 109.590855, 32.047696 ], [ 109.621652, 32.106519 ], [ 109.58716, 32.161251 ], [ 109.604406, 32.199241 ], [ 109.592703, 32.219495 ], [ 109.550203, 32.225065 ], [ 109.528645, 32.270112 ], [ 109.495385, 32.300468 ], [ 109.513247, 32.342444 ], [ 109.502776, 32.38895 ], [ 109.529877, 32.405625 ], [ 109.526797, 32.43341 ], [ 109.575457, 32.506622 ], [ 109.637051, 32.540935 ], [ 109.619804, 32.56767 ], [ 109.631507, 32.599943 ], [ 109.726978, 32.608513 ], [ 109.746072, 32.594901 ], [ 109.816905, 32.577252 ], [ 109.910528, 32.592884 ], [ 109.97089, 32.577756 ], [ 110.017701, 32.546989 ], [ 110.084223, 32.580782 ], [ 110.090382, 32.617083 ], [ 110.124259, 32.616579 ], [ 110.153824, 32.593388 ], [ 110.206179, 32.633212 ], [ 110.156903, 32.683093 ], [ 110.159367, 32.767173 ], [ 110.127338, 32.77774 ], [ 110.142121, 32.802895 ], [ 110.105164, 32.832569 ], [ 110.051578, 32.851676 ], [ 109.988752, 32.886359 ], [ 109.927158, 32.887364 ], [ 109.907448, 32.903947 ], [ 109.856941, 32.910479 ], [ 109.847702, 32.893395 ], [ 109.789804, 32.882339 ], [ 109.76455, 32.909474 ], [ 109.785492, 32.987316 ], [ 109.794731, 33.067095 ], [ 109.704188, 33.101694 ], [ 109.688174, 33.116733 ], [ 109.576073, 33.110216 ], [ 109.522486, 33.138785 ], [ 109.468283, 33.140288 ], [ 109.438718, 33.152314 ], [ 109.498464, 33.207412 ], [ 109.514479, 33.237951 ], [ 109.60687, 33.235949 ], [ 109.619804, 33.275484 ], [ 109.649985, 33.251465 ], [ 109.693101, 33.254468 ], [ 109.732521, 33.231443 ], [ 109.813209, 33.236449 ], [ 109.852013, 33.247961 ], [ 109.916687, 33.229942 ], [ 109.973353, 33.203907 ], [ 109.999223, 33.212419 ], [ 110.031252, 33.191888 ], [ 110.164911, 33.209415 ], [ 110.218497, 33.163336 ], [ 110.285635, 33.171352 ], [ 110.33799, 33.160331 ], [ 110.372482, 33.186379 ], [ 110.398352, 33.176862 ], [ 110.398352, 33.176862 ], [ 110.471032, 33.171352 ], [ 110.54125, 33.255469 ], [ 110.57759, 33.250464 ], [ 110.59422, 33.168346 ], [ 110.623785, 33.143796 ], [ 110.650887, 33.157324 ], [ 110.702626, 33.097182 ], [ 110.753133, 33.15031 ], [ 110.824582, 33.158327 ], [ 110.828893, 33.201403 ], [ 110.865234, 33.213921 ], [ 110.9219, 33.203907 ], [ 110.960704, 33.253967 ], [ 110.984726, 33.255469 ], [ 111.046936, 33.202905 ], [ 111.035849, 33.187881 ], [ 111.034001, 33.177864 ], [ 111.045704, 33.169849 ] ] ], [ [ [ 109.106111, 30.570587 ], [ 109.09872, 30.579346 ], [ 109.101183, 30.579346 ], [ 109.106111, 30.570587 ] ] ], [ [ [ 111.046936, 33.202905 ], [ 111.045704, 33.169849 ], [ 111.034001, 33.177864 ], [ 111.035849, 33.187881 ], [ 111.046936, 33.202905 ] ] ], [ [ [ 112.716747, 32.357612 ], [ 112.735841, 32.356095 ], [ 112.733993, 32.356601 ], [ 112.724138, 32.358623 ], [ 112.716747, 32.357612 ] ] ], [ [ [ 112.902145, 29.79149 ], [ 112.929246, 29.77383 ], [ 112.923703, 29.766557 ], [ 112.894138, 29.783699 ], [ 112.902145, 29.79149 ] ] ] ] } },\n{ \"type\": \"Feature\", \"properties\": { \"adcode\": \"430000\", \"name\": \"湖南省\", \"center\": [ 112.982279, 28.19409 ], \"centroid\": [ 111.711649, 27.629221 ], \"childrenNum\": 14, \"level\": \"province\", \"parent\": { \"adcode\": 100000 }, \"subFeatureIndex\": 17, \"acroutes\": [ 100000 ] }, \"geometry\": { \"type\": \"MultiPolygon\", \"coordinates\": [ [ [ [ 109.48245, 26.029788 ], [ 109.452885, 26.055598 ], [ 109.449805, 26.101826 ], [ 109.502776, 26.096451 ], [ 109.513863, 26.128157 ], [ 109.47629, 26.148035 ], [ 109.439334, 26.238789 ], [ 109.467051, 26.313917 ], [ 109.442414, 26.289774 ], [ 109.369733, 26.277432 ], [ 109.351255, 26.264016 ], [ 109.325385, 26.29031 ], [ 109.285965, 26.295676 ], [ 109.271183, 26.327863 ], [ 109.29582, 26.350389 ], [ 109.319842, 26.418477 ], [ 109.38082, 26.454381 ], [ 109.362342, 26.472061 ], [ 109.385747, 26.493487 ], [ 109.381436, 26.518659 ], [ 109.407305, 26.533116 ], [ 109.390675, 26.598955 ], [ 109.35495, 26.658873 ], [ 109.334008, 26.646036 ], [ 109.306291, 26.661012 ], [ 109.283501, 26.698445 ], [ 109.35495, 26.693098 ], [ 109.407305, 26.719829 ], [ 109.447957, 26.759913 ], [ 109.486761, 26.759913 ], [ 109.52187, 26.749226 ], [ 109.528645, 26.743881 ], [ 109.568065, 26.726243 ], [ 109.597015, 26.756173 ], [ 109.554515, 26.73533 ], [ 109.528645, 26.743881 ], [ 109.522486, 26.749226 ], [ 109.497232, 26.815474 ], [ 109.513247, 26.84004 ], [ 109.509551, 26.877947 ], [ 109.486761, 26.895562 ], [ 109.452885, 26.861932 ], [ 109.436254, 26.892359 ], [ 109.555131, 26.946788 ], [ 109.520022, 27.058764 ], [ 109.497848, 27.079548 ], [ 109.486761, 27.053968 ], [ 109.454733, 27.069423 ], [ 109.472595, 27.134951 ], [ 109.441182, 27.117907 ], [ 109.415312, 27.154123 ], [ 109.358646, 27.153058 ], [ 109.33524, 27.139212 ], [ 109.264407, 27.131755 ], [ 109.239154, 27.14933 ], [ 109.21698, 27.114711 ], [ 109.165857, 27.066758 ], [ 109.101183, 27.06889 ], [ 109.128901, 27.122701 ], [ 109.032814, 27.104056 ], [ 109.007561, 27.08008 ], [ 108.940423, 27.044907 ], [ 108.942887, 27.017186 ], [ 108.942887, 27.017186 ], [ 108.877597, 27.01612 ], [ 108.79075, 27.084343 ], [ 108.878829, 27.106187 ], [ 108.926873, 27.160512 ], [ 108.907778, 27.204699 ], [ 108.963213, 27.235565 ], [ 108.983539, 27.26802 ], [ 109.053756, 27.293551 ], [ 109.044517, 27.331304 ], [ 109.103647, 27.336621 ], [ 109.142451, 27.418461 ], [ 109.141835, 27.448207 ], [ 109.167089, 27.41793 ], [ 109.202197, 27.450331 ], [ 109.245313, 27.41793 ], [ 109.300132, 27.423774 ], [ 109.303211, 27.47582 ], [ 109.404841, 27.55066 ], [ 109.461508, 27.567637 ], [ 109.451037, 27.586204 ], [ 109.470131, 27.62863 ], [ 109.45658, 27.673689 ], [ 109.470747, 27.680049 ], [ 109.414081, 27.725087 ], [ 109.366653, 27.721909 ], [ 109.37774, 27.736741 ], [ 109.332777, 27.782815 ], [ 109.346943, 27.838396 ], [ 109.32169, 27.868027 ], [ 109.30198, 27.956343 ], [ 109.319842, 27.988585 ], [ 109.362342, 28.007608 ], [ 109.378972, 28.034551 ], [ 109.335856, 28.063073 ], [ 109.298284, 28.036136 ], [ 109.314298, 28.103729 ], [ 109.33832, 28.141731 ], [ 109.340168, 28.19027 ], [ 109.367885, 28.254602 ], [ 109.388211, 28.268307 ], [ 109.33524, 28.293605 ], [ 109.317994, 28.277795 ], [ 109.275494, 28.313101 ], [ 109.268719, 28.33786 ], [ 109.289045, 28.373673 ], [ 109.264407, 28.392628 ], [ 109.260712, 28.46473 ], [ 109.274262, 28.494714 ], [ 109.273646, 28.53836 ], [ 109.319842, 28.579886 ], [ 109.306907, 28.62087 ], [ 109.252089, 28.606685 ], [ 109.235458, 28.61982 ], [ 109.201581, 28.597753 ], [ 109.192958, 28.636104 ], [ 109.271183, 28.671816 ], [ 109.252704, 28.691767 ], [ 109.294588, 28.722211 ], [ 109.2989, 28.7474 ], [ 109.241002, 28.776779 ], [ 109.246545, 28.80143 ], [ 109.235458, 28.882161 ], [ 109.261328, 28.952356 ], [ 109.292741, 28.987436 ], [ 109.294588, 29.015177 ], [ 109.319842, 29.042388 ], [ 109.312451, 29.066453 ], [ 109.240386, 29.086328 ], [ 109.232378, 29.119271 ], [ 109.274262, 29.121885 ], [ 109.261328, 29.161089 ], [ 109.275494, 29.202366 ], [ 109.257632, 29.222738 ], [ 109.312451, 29.25146 ], [ 109.352487, 29.284872 ], [ 109.343863, 29.369398 ], [ 109.391291, 29.372005 ], [ 109.368501, 29.413719 ], [ 109.418392, 29.453332 ], [ 109.415928, 29.497617 ], [ 109.436254, 29.488761 ], [ 109.433791, 29.530948 ], [ 109.458428, 29.513242 ], [ 109.467051, 29.560104 ], [ 109.488609, 29.553336 ], [ 109.516326, 29.626194 ], [ 109.558826, 29.606944 ], [ 109.578536, 29.629836 ], [ 109.651833, 29.625674 ], [ 109.664768, 29.599659 ], [ 109.717739, 29.615269 ], [ 109.701108, 29.636078 ], [ 109.714659, 29.673524 ], [ 109.760238, 29.689122 ], [ 109.755311, 29.733304 ], [ 109.779333, 29.757725 ], [ 109.869876, 29.774869 ], [ 109.908064, 29.763959 ], [ 109.941325, 29.774349 ], [ 110.02386, 29.769674 ], [ 110.113788, 29.789932 ], [ 110.160599, 29.753569 ], [ 110.219729, 29.746814 ], [ 110.289946, 29.6964 ], [ 110.302265, 29.661563 ], [ 110.339221, 29.668324 ], [ 110.372482, 29.633477 ], [ 110.447011, 29.664684 ], [ 110.467337, 29.713034 ], [ 110.507373, 29.692241 ], [ 110.562807, 29.712515 ], [ 110.642879, 29.775907 ], [ 110.60038, 29.839779 ], [ 110.549873, 29.848085 ], [ 110.538786, 29.895828 ], [ 110.49875, 29.91243 ], [ 110.517228, 29.961179 ], [ 110.557264, 29.988137 ], [ 110.491358, 30.019751 ], [ 110.497518, 30.055499 ], [ 110.531394, 30.061197 ], [ 110.600996, 30.054463 ], [ 110.650887, 30.07777 ], [ 110.712481, 30.033223 ], [ 110.756212, 30.054463 ], [ 110.746973, 30.112979 ], [ 110.851067, 30.126439 ], [ 110.924364, 30.111426 ], [ 110.929907, 30.063268 ], [ 111.031537, 30.048765 ], [ 111.242188, 30.040476 ], [ 111.266826, 30.01146 ], [ 111.3315, 29.970512 ], [ 111.342587, 29.944586 ], [ 111.382623, 29.95029 ], [ 111.394325, 29.912948 ], [ 111.436825, 29.930065 ], [ 111.475629, 29.918654 ], [ 111.527368, 29.925916 ], [ 111.553854, 29.894272 ], [ 111.669034, 29.888565 ], [ 111.669034, 29.888565 ], [ 111.705375, 29.890121 ], [ 111.723853, 29.909317 ], [ 111.723853, 29.909317 ], [ 111.75773, 29.92021 ], [ 111.8107, 29.901017 ], [ 111.861207, 29.856909 ], [ 111.899396, 29.855871 ], [ 111.899396, 29.855871 ], [ 111.925881, 29.836665 ], [ 111.965917, 29.832512 ], [ 111.95483, 29.796683 ], [ 112.008417, 29.778505 ], [ 112.07617, 29.743696 ], [ 112.065699, 29.681323 ], [ 112.089721, 29.685482 ], [ 112.111279, 29.659483 ], [ 112.178416, 29.656883 ], [ 112.202438, 29.633997 ], [ 112.244322, 29.659483 ], [ 112.233851, 29.61631 ], [ 112.303452, 29.585609 ], [ 112.281278, 29.536676 ], [ 112.291133, 29.517409 ], [ 112.333017, 29.545007 ], [ 112.368741, 29.541362 ], [ 112.424792, 29.598619 ], [ 112.439574, 29.633997 ], [ 112.499321, 29.629316 ], [ 112.54182, 29.60122 ], [ 112.572001, 29.624113 ], [ 112.640371, 29.607985 ], [ 112.650842, 29.592374 ], [ 112.693957, 29.601741 ], [ 112.714283, 29.648561 ], [ 112.733378, 29.645441 ], [ 112.788812, 29.681323 ], [ 112.79374, 29.735902 ], [ 112.861493, 29.78318 ], [ 112.894138, 29.783699 ], [ 112.923703, 29.766557 ], [ 112.926782, 29.692241 ], [ 112.944645, 29.682883 ], [ 112.974826, 29.732784 ], [ 113.025949, 29.772791 ], [ 113.005007, 29.693801 ], [ 112.915696, 29.620992 ], [ 112.912, 29.606944 ], [ 112.950188, 29.473132 ], [ 113.034572, 29.523658 ], [ 113.057362, 29.522616 ], [ 113.078304, 29.438218 ], [ 113.099861, 29.459585 ], [ 113.145441, 29.449163 ], [ 113.181781, 29.485636 ], [ 113.222433, 29.543965 ], [ 113.277252, 29.594976 ], [ 113.37765, 29.703158 ], [ 113.571671, 29.849123 ], [ 113.575367, 29.809147 ], [ 113.550729, 29.768115 ], [ 113.558736, 29.727067 ], [ 113.540258, 29.699519 ], [ 113.547033, 29.675603 ], [ 113.606164, 29.666764 ], [ 113.663446, 29.684443 ], [ 113.680692, 29.64336 ], [ 113.704098, 29.634518 ], [ 113.73859, 29.579363 ], [ 113.710257, 29.555419 ], [ 113.630801, 29.523137 ], [ 113.677613, 29.513763 ], [ 113.755221, 29.446557 ], [ 113.731199, 29.393907 ], [ 113.674533, 29.388172 ], [ 113.660982, 29.333405 ], [ 113.632033, 29.316186 ], [ 113.609859, 29.25146 ], [ 113.651743, 29.225872 ], [ 113.693011, 29.226394 ], [ 113.691779, 29.19662 ], [ 113.66283, 29.16945 ], [ 113.690547, 29.114566 ], [ 113.696091, 29.077437 ], [ 113.722576, 29.104631 ], [ 113.749677, 29.060699 ], [ 113.775547, 29.095219 ], [ 113.816199, 29.105154 ], [ 113.852539, 29.058606 ], [ 113.882104, 29.065407 ], [ 113.876561, 29.038202 ], [ 113.898119, 29.029307 ], [ 113.94185, 29.047097 ], [ 113.961561, 28.999476 ], [ 113.955401, 28.978536 ], [ 113.973879, 28.937692 ], [ 114.008988, 28.955498 ], [ 114.005292, 28.917788 ], [ 114.028082, 28.891069 ], [ 114.060111, 28.902596 ], [ 114.056415, 28.872204 ], [ 114.076741, 28.834464 ], [ 114.124784, 28.843376 ], [ 114.153734, 28.829221 ], [ 114.137719, 28.779926 ], [ 114.157429, 28.761566 ], [ 114.122321, 28.623497 ], [ 114.132176, 28.607211 ], [ 114.08598, 28.558337 ], [ 114.138335, 28.533629 ], [ 114.15435, 28.507337 ], [ 114.218407, 28.48472 ], [ 114.217175, 28.466308 ], [ 114.172212, 28.432632 ], [ 114.214712, 28.403157 ], [ 114.252284, 28.395787 ], [ 114.2529, 28.319423 ], [ 114.198081, 28.29097 ], [ 114.182067, 28.249858 ], [ 114.143879, 28.246694 ], [ 114.109386, 28.205038 ], [ 114.107538, 28.182885 ], [ 114.068734, 28.171806 ], [ 114.012068, 28.174972 ], [ 113.992357, 28.161255 ], [ 114.025002, 28.080499 ], [ 114.047176, 28.057263 ], [ 114.025618, 28.031382 ], [ 113.970184, 28.041418 ], [ 113.966488, 28.017646 ], [ 113.936307, 28.018703 ], [ 113.914133, 27.991227 ], [ 113.864242, 28.004966 ], [ 113.845148, 27.971672 ], [ 113.822974, 27.982243 ], [ 113.752141, 27.93361 ], [ 113.72812, 27.874904 ], [ 113.756453, 27.860091 ], [ 113.763228, 27.799228 ], [ 113.69917, 27.740979 ], [ 113.696707, 27.71979 ], [ 113.652359, 27.663619 ], [ 113.607395, 27.625449 ], [ 113.608627, 27.585143 ], [ 113.579062, 27.545354 ], [ 113.583374, 27.524657 ], [ 113.627105, 27.49971 ], [ 113.591381, 27.467855 ], [ 113.59754, 27.428554 ], [ 113.632033, 27.40518 ], [ 113.605548, 27.38924 ], [ 113.616635, 27.345658 ], [ 113.657902, 27.347253 ], [ 113.699786, 27.331836 ], [ 113.72812, 27.350442 ], [ 113.872865, 27.384988 ], [ 113.872865, 27.346721 ], [ 113.854387, 27.30525 ], [ 113.872865, 27.289828 ], [ 113.846996, 27.222262 ], [ 113.779242, 27.137081 ], [ 113.771851, 27.096598 ], [ 113.803264, 27.099261 ], [ 113.824206, 27.036378 ], [ 113.86301, 27.018252 ], [ 113.892575, 26.964925 ], [ 113.927068, 26.948922 ], [ 113.890112, 26.895562 ], [ 113.877177, 26.859262 ], [ 113.835909, 26.806394 ], [ 113.853771, 26.769532 ], [ 113.860546, 26.664221 ], [ 113.912901, 26.613938 ], [ 113.996669, 26.615543 ], [ 114.019459, 26.587182 ], [ 114.10877, 26.56952 ], [ 114.07243, 26.480096 ], [ 114.110002, 26.482775 ], [ 114.090292, 26.455988 ], [ 114.085364, 26.406149 ], [ 114.062575, 26.406149 ], [ 114.030546, 26.376664 ], [ 114.047792, 26.337518 ], [ 114.021307, 26.288701 ], [ 114.029314, 26.266163 ], [ 113.978807, 26.237716 ], [ 113.972647, 26.20604 ], [ 113.949242, 26.192616 ], [ 113.962792, 26.150722 ], [ 114.013299, 26.184023 ], [ 114.088444, 26.168448 ], [ 114.102611, 26.187783 ], [ 114.181451, 26.214631 ], [ 114.216559, 26.203355 ], [ 114.237501, 26.152333 ], [ 114.188842, 26.121172 ], [ 114.10569, 26.097526 ], [ 114.121089, 26.085702 ], [ 114.087828, 26.06635 ], [ 114.044096, 26.076564 ], [ 114.008372, 26.015806 ], [ 114.028082, 25.98138 ], [ 114.028082, 25.893119 ], [ 113.971416, 25.836036 ], [ 113.961561, 25.77731 ], [ 113.920293, 25.741197 ], [ 113.913517, 25.701299 ], [ 113.957249, 25.611749 ], [ 113.983118, 25.599336 ], [ 113.986198, 25.529153 ], [ 113.962792, 25.528072 ], [ 113.94493, 25.441635 ], [ 113.887032, 25.436772 ], [ 113.877177, 25.380552 ], [ 113.839605, 25.363248 ], [ 113.814967, 25.328634 ], [ 113.76446, 25.333502 ], [ 113.753373, 25.362707 ], [ 113.686852, 25.351891 ], [ 113.680076, 25.334584 ], [ 113.611707, 25.327552 ], [ 113.584606, 25.306453 ], [ 113.579062, 25.34432 ], [ 113.535946, 25.368656 ], [ 113.479896, 25.375145 ], [ 113.449715, 25.359463 ], [ 113.407215, 25.401637 ], [ 113.373338, 25.402719 ], [ 113.341926, 25.448661 ], [ 113.314208, 25.442716 ], [ 113.311129, 25.490264 ], [ 113.248919, 25.514031 ], [ 113.226129, 25.50971 ], [ 113.176854, 25.471355 ], [ 113.11834, 25.44704 ], [ 113.130658, 25.427043 ], [ 113.096782, 25.412449 ], [ 113.078304, 25.382174 ], [ 113.013014, 25.352432 ], [ 112.969898, 25.350269 ], [ 112.93479, 25.325929 ], [ 112.924319, 25.296714 ], [ 112.891058, 25.339993 ], [ 112.854718, 25.337829 ], [ 112.867036, 25.249632 ], [ 112.897833, 25.238264 ], [ 112.958195, 25.254503 ], [ 112.992688, 25.247467 ], [ 113.034572, 25.198199 ], [ 112.97421, 25.168412 ], [ 112.96805, 25.141869 ], [ 113.018557, 25.083344 ], [ 112.979137, 25.03401 ], [ 113.009934, 24.977604 ], [ 113.011782, 24.946136 ], [ 112.984681, 24.921172 ], [ 112.904609, 24.921715 ], [ 112.873812, 24.896747 ], [ 112.780805, 24.896747 ], [ 112.778341, 24.947764 ], [ 112.743233, 24.959701 ], [ 112.742001, 24.99876 ], [ 112.714899, 25.025876 ], [ 112.712436, 25.083344 ], [ 112.660081, 25.132658 ], [ 112.628052, 25.140785 ], [ 112.562762, 25.124531 ], [ 112.458053, 25.152162 ], [ 112.44327, 25.185744 ], [ 112.414937, 25.14241 ], [ 112.365046, 25.191701 ], [ 112.315771, 25.175453 ], [ 112.302836, 25.157037 ], [ 112.256025, 25.159204 ], [ 112.246785, 25.185202 ], [ 112.19751, 25.187368 ], [ 112.174105, 25.128866 ], [ 112.177184, 25.106649 ], [ 112.151931, 25.055698 ], [ 112.155626, 25.026419 ], [ 112.12175, 24.989538 ], [ 112.119902, 24.963499 ], [ 112.175337, 24.927685 ], [ 112.167329, 24.859828 ], [ 112.149467, 24.837019 ], [ 112.124214, 24.841364 ], [ 112.03367, 24.771286 ], [ 112.024431, 24.740308 ], [ 111.951135, 24.769655 ], [ 111.929577, 24.75607 ], [ 111.875374, 24.756613 ], [ 111.868599, 24.771829 ], [ 111.814396, 24.770199 ], [ 111.783599, 24.785957 ], [ 111.708455, 24.788673 ], [ 111.666571, 24.760961 ], [ 111.637621, 24.715303 ], [ 111.641933, 24.684856 ], [ 111.588962, 24.690837 ], [ 111.570484, 24.64461 ], [ 111.526752, 24.637538 ], [ 111.499035, 24.667997 ], [ 111.451608, 24.665822 ], [ 111.431282, 24.687574 ], [ 111.461463, 24.728894 ], [ 111.479325, 24.797366 ], [ 111.449144, 24.857113 ], [ 111.447296, 24.892947 ], [ 111.470086, 24.92877 ], [ 111.434977, 24.951562 ], [ 111.43313, 24.979774 ], [ 111.460231, 24.992793 ], [ 111.467622, 25.02208 ], [ 111.416499, 25.047566 ], [ 111.435593, 25.093642 ], [ 111.375231, 25.128324 ], [ 111.36784, 25.108817 ], [ 111.321645, 25.105023 ], [ 111.274833, 25.151078 ], [ 111.221862, 25.106649 ], [ 111.200921, 25.074672 ], [ 111.139943, 25.042144 ], [ 111.101754, 25.035095 ], [ 111.100522, 24.945593 ], [ 111.009363, 24.921172 ], [ 110.968711, 24.975434 ], [ 110.951465, 25.04377 ], [ 110.98411, 25.101772 ], [ 110.998892, 25.161371 ], [ 111.112841, 25.21715 ], [ 111.103602, 25.285351 ], [ 111.138711, 25.303748 ], [ 111.184906, 25.367034 ], [ 111.210776, 25.363248 ], [ 111.257587, 25.395691 ], [ 111.26313, 25.42326 ], [ 111.300087, 25.44812 ], [ 111.32842, 25.521592 ], [ 111.324724, 25.564249 ], [ 111.343202, 25.602574 ], [ 111.309942, 25.645203 ], [ 111.30871, 25.720171 ], [ 111.399869, 25.744431 ], [ 111.442369, 25.77192 ], [ 111.43313, 25.84627 ], [ 111.4861, 25.859196 ], [ 111.460231, 25.885042 ], [ 111.383239, 25.881812 ], [ 111.376463, 25.906039 ], [ 111.346282, 25.906577 ], [ 111.297007, 25.874274 ], [ 111.29208, 25.854349 ], [ 111.251428, 25.864581 ], [ 111.230486, 25.916267 ], [ 111.189834, 25.953402 ], [ 111.235413, 26.048071 ], [ 111.267442, 26.058824 ], [ 111.244652, 26.078177 ], [ 111.26621, 26.095914 ], [ 111.258203, 26.151796 ], [ 111.274833, 26.183486 ], [ 111.271754, 26.217316 ], [ 111.293311, 26.222148 ], [ 111.277913, 26.272066 ], [ 111.228022, 26.261333 ], [ 111.204616, 26.276359 ], [ 111.208928, 26.30426 ], [ 111.090667, 26.308016 ], [ 111.008132, 26.336982 ], [ 111.008747, 26.35897 ], [ 110.974255, 26.385778 ], [ 110.94469, 26.373447 ], [ 110.944074, 26.326791 ], [ 110.926212, 26.320354 ], [ 110.939762, 26.286554 ], [ 110.836284, 26.255966 ], [ 110.759292, 26.248451 ], [ 110.73835, 26.271529 ], [ 110.742046, 26.313917 ], [ 110.711249, 26.29192 ], [ 110.673676, 26.317135 ], [ 110.643495, 26.308552 ], [ 110.612083, 26.333764 ], [ 110.584365, 26.296749 ], [ 110.552952, 26.283335 ], [ 110.546793, 26.233421 ], [ 110.495054, 26.166299 ], [ 110.477808, 26.179727 ], [ 110.437772, 26.153945 ], [ 110.373098, 26.088927 ], [ 110.325671, 25.975462 ], [ 110.257301, 25.961473 ], [ 110.24991, 26.010965 ], [ 110.181541, 26.060437 ], [ 110.168606, 26.028713 ], [ 110.100853, 26.020108 ], [ 110.065128, 26.050221 ], [ 110.100853, 26.132455 ], [ 110.099005, 26.168985 ], [ 110.03002, 26.166299 ], [ 109.970274, 26.195301 ], [ 109.904368, 26.135679 ], [ 109.898825, 26.095377 ], [ 109.864332, 26.027637 ], [ 109.814441, 26.041081 ], [ 109.782412, 25.996981 ], [ 109.806434, 25.973848 ], [ 109.826144, 25.911422 ], [ 109.811361, 25.877504 ], [ 109.779333, 25.866196 ], [ 109.768246, 25.890427 ], [ 109.685094, 25.880197 ], [ 109.67955, 25.921649 ], [ 109.693717, 25.959321 ], [ 109.710963, 25.954478 ], [ 109.730057, 25.989988 ], [ 109.649369, 26.016882 ], [ 109.635203, 26.047533 ], [ 109.588391, 26.019571 ], [ 109.560058, 26.021184 ], [ 109.513247, 25.998056 ], [ 109.48245, 26.029788 ] ] ], [ [ [ 109.528645, 26.743881 ], [ 109.52187, 26.749226 ], [ 109.522486, 26.749226 ], [ 109.528645, 26.743881 ] ] ] ] } },\n{ \"type\": \"Feature\", \"properties\": { \"adcode\": \"440000\", \"name\": \"广东省\", \"center\": [ 113.280637, 23.125178 ], \"centroid\": [ 113.429915, 23.334652 ], \"childrenNum\": 21, \"level\": \"province\", \"parent\": { \"adcode\": 100000 }, \"subFeatureIndex\": 18, \"acroutes\": [ 100000 ] }, \"geometry\": { \"type\": \"MultiPolygon\", \"coordinates\": [ [ [ [ 109.785492, 21.45673 ], [ 109.788572, 21.490702 ], [ 109.754695, 21.556396 ], [ 109.742992, 21.616497 ], [ 109.778101, 21.670455 ], [ 109.786108, 21.637638 ], [ 109.839695, 21.636525 ], [ 109.888354, 21.652101 ], [ 109.888354, 21.652101 ], [ 109.916071, 21.668787 ], [ 109.940093, 21.769419 ], [ 109.94502, 21.84443 ], [ 109.999839, 21.881643 ], [ 110.050962, 21.857205 ], [ 110.101469, 21.86998 ], [ 110.12857, 21.902744 ], [ 110.196323, 21.899968 ], [ 110.212338, 21.886085 ], [ 110.212338, 21.886085 ], [ 110.224041, 21.882198 ], [ 110.224041, 21.882198 ], [ 110.283787, 21.892194 ], [ 110.290562, 21.917736 ], [ 110.337374, 21.887751 ], [ 110.391576, 21.89386 ], [ 110.378642, 21.939942 ], [ 110.378642, 21.939942 ], [ 110.374946, 21.967695 ], [ 110.374946, 21.967695 ], [ 110.352772, 21.97602 ], [ 110.359547, 22.015973 ], [ 110.35154, 22.097508 ], [ 110.364475, 22.125785 ], [ 110.326287, 22.152393 ], [ 110.34846, 22.195621 ], [ 110.378026, 22.164587 ], [ 110.414366, 22.208365 ], [ 110.456866, 22.189526 ], [ 110.505525, 22.14297 ], [ 110.55788, 22.196175 ], [ 110.602843, 22.18343 ], [ 110.598532, 22.162924 ], [ 110.629329, 22.149068 ], [ 110.678604, 22.172901 ], [ 110.646575, 22.220554 ], [ 110.687843, 22.249914 ], [ 110.725415, 22.29588 ], [ 110.759292, 22.274837 ], [ 110.787009, 22.28259 ], [ 110.749437, 22.329653 ], [ 110.74143, 22.361757 ], [ 110.711249, 22.369506 ], [ 110.712481, 22.440879 ], [ 110.688459, 22.477935 ], [ 110.74143, 22.464109 ], [ 110.740198, 22.498947 ], [ 110.762988, 22.518298 ], [ 110.749437, 22.556991 ], [ 110.778386, 22.585174 ], [ 110.812263, 22.576333 ], [ 110.897878, 22.591805 ], [ 110.896031, 22.613352 ], [ 110.950233, 22.61059 ], [ 110.958856, 22.636553 ], [ 110.997045, 22.631582 ], [ 111.055559, 22.648705 ], [ 111.089435, 22.695643 ], [ 111.058023, 22.729871 ], [ 111.118385, 22.744773 ], [ 111.185522, 22.735942 ], [ 111.218167, 22.748085 ], [ 111.358601, 22.889301 ], [ 111.374615, 22.938361 ], [ 111.362913, 22.967568 ], [ 111.403565, 22.99126 ], [ 111.389398, 23.005583 ], [ 111.433746, 23.036428 ], [ 111.43313, 23.073322 ], [ 111.402333, 23.066165 ], [ 111.377695, 23.082132 ], [ 111.365992, 23.14488 ], [ 111.38447, 23.16744 ], [ 111.388782, 23.210349 ], [ 111.36476, 23.240047 ], [ 111.353058, 23.284582 ], [ 111.376463, 23.30437 ], [ 111.363528, 23.340641 ], [ 111.389398, 23.375804 ], [ 111.383239, 23.399423 ], [ 111.399869, 23.469159 ], [ 111.428818, 23.466414 ], [ 111.479941, 23.532822 ], [ 111.487332, 23.626615 ], [ 111.555702, 23.64087 ], [ 111.615448, 23.639225 ], [ 111.614832, 23.65896 ], [ 111.666571, 23.718696 ], [ 111.621607, 23.725819 ], [ 111.627766, 23.78881 ], [ 111.654868, 23.833159 ], [ 111.683201, 23.822758 ], [ 111.683201, 23.822758 ], [ 111.722621, 23.823305 ], [ 111.8107, 23.80688 ], [ 111.824867, 23.832612 ], [ 111.812548, 23.887343 ], [ 111.845809, 23.904305 ], [ 111.854432, 23.947521 ], [ 111.911714, 23.943693 ], [ 111.940664, 23.987989 ], [ 111.92157, 24.012045 ], [ 111.878454, 24.109862 ], [ 111.886461, 24.163929 ], [ 111.871062, 24.176487 ], [ 111.877222, 24.227252 ], [ 111.912946, 24.221795 ], [ 111.958526, 24.263813 ], [ 111.986243, 24.25672 ], [ 111.990555, 24.279634 ], [ 112.026279, 24.294908 ], [ 112.05954, 24.339628 ], [ 112.057692, 24.387057 ], [ 112.025047, 24.438828 ], [ 111.985011, 24.467701 ], [ 112.009649, 24.503103 ], [ 112.007185, 24.534684 ], [ 111.972077, 24.578775 ], [ 111.936968, 24.595645 ], [ 111.927729, 24.629378 ], [ 111.953598, 24.64733 ], [ 111.939432, 24.686487 ], [ 111.961606, 24.721283 ], [ 112.024431, 24.740308 ], [ 112.03367, 24.771286 ], [ 112.124214, 24.841364 ], [ 112.149467, 24.837019 ], [ 112.167329, 24.859828 ], [ 112.175337, 24.927685 ], [ 112.119902, 24.963499 ], [ 112.12175, 24.989538 ], [ 112.155626, 25.026419 ], [ 112.151931, 25.055698 ], [ 112.177184, 25.106649 ], [ 112.174105, 25.128866 ], [ 112.19751, 25.187368 ], [ 112.246785, 25.185202 ], [ 112.256025, 25.159204 ], [ 112.302836, 25.157037 ], [ 112.315771, 25.175453 ], [ 112.365046, 25.191701 ], [ 112.414937, 25.14241 ], [ 112.44327, 25.185744 ], [ 112.458053, 25.152162 ], [ 112.562762, 25.124531 ], [ 112.628052, 25.140785 ], [ 112.660081, 25.132658 ], [ 112.712436, 25.083344 ], [ 112.714899, 25.025876 ], [ 112.742001, 24.99876 ], [ 112.743233, 24.959701 ], [ 112.778341, 24.947764 ], [ 112.780805, 24.896747 ], [ 112.873812, 24.896747 ], [ 112.904609, 24.921715 ], [ 112.984681, 24.921172 ], [ 113.011782, 24.946136 ], [ 113.009934, 24.977604 ], [ 112.979137, 25.03401 ], [ 113.018557, 25.083344 ], [ 112.96805, 25.141869 ], [ 112.97421, 25.168412 ], [ 113.034572, 25.198199 ], [ 112.992688, 25.247467 ], [ 112.958195, 25.254503 ], [ 112.897833, 25.238264 ], [ 112.867036, 25.249632 ], [ 112.854718, 25.337829 ], [ 112.891058, 25.339993 ], [ 112.924319, 25.296714 ], [ 112.93479, 25.325929 ], [ 112.969898, 25.350269 ], [ 113.013014, 25.352432 ], [ 113.078304, 25.382174 ], [ 113.096782, 25.412449 ], [ 113.130658, 25.427043 ], [ 113.11834, 25.44704 ], [ 113.176854, 25.471355 ], [ 113.226129, 25.50971 ], [ 113.248919, 25.514031 ], [ 113.311129, 25.490264 ], [ 113.314208, 25.442716 ], [ 113.341926, 25.448661 ], [ 113.373338, 25.402719 ], [ 113.407215, 25.401637 ], [ 113.449715, 25.359463 ], [ 113.479896, 25.375145 ], [ 113.535946, 25.368656 ], [ 113.579062, 25.34432 ], [ 113.584606, 25.306453 ], [ 113.611707, 25.327552 ], [ 113.680076, 25.334584 ], [ 113.686852, 25.351891 ], [ 113.753373, 25.362707 ], [ 113.76446, 25.333502 ], [ 113.814967, 25.328634 ], [ 113.839605, 25.363248 ], [ 113.877177, 25.380552 ], [ 113.887032, 25.436772 ], [ 113.94493, 25.441635 ], [ 114.003444, 25.442716 ], [ 113.983118, 25.415152 ], [ 114.050256, 25.36433 ], [ 114.029314, 25.328093 ], [ 114.017611, 25.273987 ], [ 114.039785, 25.250714 ], [ 114.055799, 25.277775 ], [ 114.083517, 25.275611 ], [ 114.115545, 25.302125 ], [ 114.190074, 25.316733 ], [ 114.204857, 25.29942 ], [ 114.260291, 25.291845 ], [ 114.2954, 25.299961 ], [ 114.31511, 25.33837 ], [ 114.382863, 25.317274 ], [ 114.43029, 25.343779 ], [ 114.438914, 25.376226 ], [ 114.477718, 25.37136 ], [ 114.541159, 25.416773 ], [ 114.599674, 25.385959 ], [ 114.63663, 25.324306 ], [ 114.714238, 25.315651 ], [ 114.743188, 25.274528 ], [ 114.73518, 25.225813 ], [ 114.693912, 25.213902 ], [ 114.685905, 25.173287 ], [ 114.73518, 25.155954 ], [ 114.735796, 25.121822 ], [ 114.664963, 25.10123 ], [ 114.640326, 25.074129 ], [ 114.604601, 25.083886 ], [ 114.561485, 25.077382 ], [ 114.532536, 25.022623 ], [ 114.506051, 24.999844 ], [ 114.45616, 24.99659 ], [ 114.454928, 24.977062 ], [ 114.395798, 24.951019 ], [ 114.403189, 24.877746 ], [ 114.378551, 24.861457 ], [ 114.342211, 24.807145 ], [ 114.336052, 24.749004 ], [ 114.281849, 24.724001 ], [ 114.27261, 24.700624 ], [ 114.169132, 24.689749 ], [ 114.19069, 24.656576 ], [ 114.258443, 24.641346 ], [ 114.289856, 24.619042 ], [ 114.300943, 24.578775 ], [ 114.363769, 24.582584 ], [ 114.391486, 24.563535 ], [ 114.403189, 24.497657 ], [ 114.429058, 24.48622 ], [ 114.534384, 24.559181 ], [ 114.589819, 24.537406 ], [ 114.627391, 24.576598 ], [ 114.664963, 24.583673 ], [ 114.704999, 24.525973 ], [ 114.73826, 24.565168 ], [ 114.729637, 24.608704 ], [ 114.781376, 24.613057 ], [ 114.827571, 24.588026 ], [ 114.846665, 24.602719 ], [ 114.868839, 24.562446 ], [ 114.893477, 24.582584 ], [ 114.909491, 24.661471 ], [ 114.940288, 24.650049 ], [ 115.00373, 24.679418 ], [ 115.024672, 24.669085 ], [ 115.057317, 24.703343 ], [ 115.083802, 24.699537 ], [ 115.104744, 24.667997 ], [ 115.1842, 24.711498 ], [ 115.258729, 24.728894 ], [ 115.269816, 24.749548 ], [ 115.306772, 24.758787 ], [ 115.358511, 24.735416 ], [ 115.372678, 24.774546 ], [ 115.412714, 24.79302 ], [ 115.476771, 24.762591 ], [ 115.522967, 24.702799 ], [ 115.555611, 24.683768 ], [ 115.569778, 24.622306 ], [ 115.605503, 24.62557 ], [ 115.671408, 24.604895 ], [ 115.68927, 24.545027 ], [ 115.752712, 24.546116 ], [ 115.785357, 24.567345 ], [ 115.843871, 24.562446 ], [ 115.840791, 24.584217 ], [ 115.797676, 24.628834 ], [ 115.780429, 24.663103 ], [ 115.801371, 24.705517 ], [ 115.769342, 24.708236 ], [ 115.756408, 24.749004 ], [ 115.776734, 24.774546 ], [ 115.764415, 24.791933 ], [ 115.790284, 24.856027 ], [ 115.807531, 24.862543 ], [ 115.824161, 24.909232 ], [ 115.863581, 24.891318 ], [ 115.861733, 24.863629 ], [ 115.907313, 24.879917 ], [ 115.885139, 24.898918 ], [ 115.89253, 24.936911 ], [ 115.907929, 24.923343 ], [ 115.985537, 24.899461 ], [ 116.015102, 24.905975 ], [ 116.068073, 24.850053 ], [ 116.153073, 24.846795 ], [ 116.191877, 24.877203 ], [ 116.221442, 24.829959 ], [ 116.251007, 24.82507 ], [ 116.244232, 24.793563 ], [ 116.297202, 24.801712 ], [ 116.345862, 24.828872 ], [ 116.363724, 24.87123 ], [ 116.395137, 24.877746 ], [ 116.417927, 24.840821 ], [ 116.381586, 24.82507 ], [ 116.375427, 24.803885 ], [ 116.419158, 24.767482 ], [ 116.416079, 24.744113 ], [ 116.44626, 24.714216 ], [ 116.485064, 24.720196 ], [ 116.517709, 24.652225 ], [ 116.506622, 24.621218 ], [ 116.530027, 24.604895 ], [ 116.570679, 24.621762 ], [ 116.600861, 24.654401 ], [ 116.623034, 24.64189 ], [ 116.667382, 24.658752 ], [ 116.777635, 24.679418 ], [ 116.815207, 24.654944 ], [ 116.761005, 24.583128 ], [ 116.759157, 24.545572 ], [ 116.796729, 24.502014 ], [ 116.83307, 24.496568 ], [ 116.860787, 24.460075 ], [ 116.839229, 24.442097 ], [ 116.903903, 24.369614 ], [ 116.895895, 24.350533 ], [ 116.919301, 24.321087 ], [ 116.914374, 24.287817 ], [ 116.938395, 24.28127 ], [ 116.933468, 24.220157 ], [ 116.956257, 24.216883 ], [ 116.998757, 24.179217 ], [ 116.9347, 24.126794 ], [ 116.930388, 24.064514 ], [ 116.953178, 24.008218 ], [ 116.981511, 23.999471 ], [ 116.976583, 23.931659 ], [ 116.955642, 23.922359 ], [ 116.981511, 23.855602 ], [ 117.012308, 23.855054 ], [ 117.019083, 23.801952 ], [ 117.048032, 23.758687 ], [ 117.055424, 23.694038 ], [ 117.123793, 23.647448 ], [ 117.147199, 23.654027 ], [ 117.192778, 23.629356 ], [ 117.192778, 23.5619 ], [ 117.085605, 23.536663 ], [ 117.044953, 23.539955 ], [ 117.01046, 23.502641 ], [ 116.963649, 23.507031 ], [ 116.92854, 23.530079 ], [ 116.888504, 23.501543 ], [ 116.895895, 23.476295 ], [ 116.874953, 23.447748 ], [ 116.874338, 23.447199 ], [ 116.871258, 23.416449 ], [ 116.871874, 23.4159 ], [ 116.782563, 23.313714 ], [ 116.798577, 23.244996 ], [ 116.821367, 23.240597 ], [ 116.806584, 23.200998 ], [ 116.74499, 23.215299 ], [ 116.701259, 23.198248 ], [ 116.665534, 23.158086 ], [ 116.566368, 23.134424 ], [ 116.550969, 23.109656 ], [ 116.566368, 23.088738 ], [ 116.557129, 23.056253 ], [ 116.576839, 23.014397 ], [ 116.542346, 22.995667 ], [ 116.50539, 22.930645 ], [ 116.449955, 22.936707 ], [ 116.382818, 22.91907 ], [ 116.317528, 22.95269 ], [ 116.226985, 22.91466 ], [ 116.191261, 22.874965 ], [ 116.104413, 22.816505 ], [ 116.05637, 22.844635 ], [ 115.99724, 22.826985 ], [ 115.965211, 22.800506 ], [ 115.931334, 22.802713 ], [ 115.883291, 22.78561 ], [ 115.829089, 22.734838 ], [ 115.796444, 22.739254 ], [ 115.788437, 22.809885 ], [ 115.760103, 22.834707 ], [ 115.696046, 22.84298 ], [ 115.654162, 22.865591 ], [ 115.583945, 22.82864 ], [ 115.570394, 22.786713 ], [ 115.541445, 22.755259 ], [ 115.609198, 22.753052 ], [ 115.565467, 22.684048 ], [ 115.575322, 22.650914 ], [ 115.471844, 22.697852 ], [ 115.430576, 22.684048 ], [ 115.381301, 22.684048 ], [ 115.349272, 22.712206 ], [ 115.338185, 22.776781 ], [ 115.319091, 22.783402 ], [ 115.230396, 22.776781 ], [ 115.236555, 22.82533 ], [ 115.190359, 22.818711 ], [ 115.190975, 22.77347 ], [ 115.154635, 22.80161 ], [ 115.061628, 22.783402 ], [ 115.053621, 22.747533 ], [ 115.02344, 22.726007 ], [ 115.039454, 22.713862 ], [ 114.945216, 22.645391 ], [ 114.927969, 22.621639 ], [ 114.922426, 22.549253 ], [ 114.88547, 22.538751 ], [ 114.866375, 22.591805 ], [ 114.746267, 22.581859 ], [ 114.743803, 22.632687 ], [ 114.728405, 22.651466 ], [ 114.73518, 22.724351 ], [ 114.749963, 22.764089 ], [ 114.709927, 22.787817 ], [ 114.689601, 22.7674 ], [ 114.601521, 22.730975 ], [ 114.591666, 22.690122 ], [ 114.567029, 22.685705 ], [ 114.51529, 22.655332 ], [ 114.579964, 22.661407 ], [ 114.603369, 22.638763 ], [ 114.559022, 22.583517 ], [ 114.568261, 22.560859 ], [ 114.614456, 22.545384 ], [ 114.628623, 22.513875 ], [ 114.611377, 22.481806 ], [ 114.549167, 22.465769 ], [ 114.506667, 22.438667 ], [ 114.476486, 22.459132 ], [ 114.472174, 22.522168 ], [ 114.427211, 22.589042 ], [ 114.381631, 22.60175 ], [ 114.321885, 22.587385 ], [ 114.294784, 22.563623 ], [ 114.232574, 22.539857 ], [ 114.222719, 22.553122 ], [ 114.166052, 22.559201 ], [ 114.156813, 22.543726 ], [ 114.095219, 22.534329 ], [ 114.082285, 22.512216 ], [ 114.031778, 22.503923 ], [ 113.976343, 22.510558 ], [ 113.954785, 22.491206 ], [ 113.952937, 22.486783 ], [ 113.893807, 22.442539 ], [ 113.869786, 22.459685 ], [ 113.856851, 22.539857 ], [ 113.803264, 22.593463 ], [ 113.773083, 22.643182 ], [ 113.751525, 22.715518 ], [ 113.733663, 22.736494 ], [ 113.678228, 22.726007 ], [ 113.717033, 22.645391 ], [ 113.740438, 22.534329 ], [ 113.691779, 22.514981 ], [ 113.668373, 22.4807 ], [ 113.631417, 22.475723 ], [ 113.573519, 22.41156 ], [ 113.608627, 22.408793 ], [ 113.624642, 22.443092 ], [ 113.66591, 22.438667 ], [ 113.669605, 22.416539 ], [ 113.627721, 22.349027 ], [ 113.604932, 22.339617 ], [ 113.617866, 22.315259 ], [ 113.595693, 22.304186 ], [ 113.594461, 22.228864 ], [ 113.558736, 22.212244 ], [ 113.53841, 22.209473 ], [ 113.534715, 22.174009 ], [ 113.554425, 22.142416 ], [ 113.554425, 22.107489 ], [ 113.567359, 22.075327 ], [ 113.527939, 22.073663 ], [ 113.45957, 22.043711 ], [ 113.442324, 22.009315 ], [ 113.330223, 21.96159 ], [ 113.319752, 21.909407 ], [ 113.266781, 21.871646 ], [ 113.235368, 21.887751 ], [ 113.1516, 21.979905 ], [ 113.142977, 22.012089 ], [ 113.091854, 22.065344 ], [ 113.086927, 22.12634 ], [ 113.045659, 22.088636 ], [ 113.032108, 22.04593 ], [ 113.053666, 22.012089 ], [ 113.047507, 21.956595 ], [ 112.989608, 21.869424 ], [ 112.929862, 21.838875 ], [ 112.893522, 21.84443 ], [ 112.841167, 21.920512 ], [ 112.792508, 21.921067 ], [ 112.68595, 21.810541 ], [ 112.647146, 21.758302 ], [ 112.535661, 21.753856 ], [ 112.497473, 21.785535 ], [ 112.445734, 21.803317 ], [ 112.427256, 21.789981 ], [ 112.415553, 21.734956 ], [ 112.353343, 21.707157 ], [ 112.238778, 21.702153 ], [ 112.236315, 21.727173 ], [ 112.196894, 21.736624 ], [ 112.192583, 21.789425 ], [ 112.136532, 21.793871 ], [ 112.036134, 21.761637 ], [ 111.956062, 21.710494 ], [ 111.954214, 21.667674 ], [ 111.997946, 21.657107 ], [ 112.026895, 21.633744 ], [ 111.972692, 21.603144 ], [ 111.941896, 21.607039 ], [ 111.887693, 21.578659 ], [ 111.810084, 21.555283 ], [ 111.832258, 21.578659 ], [ 111.794686, 21.61149 ], [ 111.736788, 21.609821 ], [ 111.693672, 21.590345 ], [ 111.677658, 21.529677 ], [ 111.650556, 21.512418 ], [ 111.609904, 21.530234 ], [ 111.560629, 21.50518 ], [ 111.521825, 21.517429 ], [ 111.494724, 21.501282 ], [ 111.444217, 21.514088 ], [ 111.382623, 21.495714 ], [ 111.353058, 21.464528 ], [ 111.28592, 21.41885 ], [ 111.258819, 21.412165 ], [ 111.253275, 21.452831 ], [ 111.276065, 21.443362 ], [ 111.28284, 21.485691 ], [ 111.171355, 21.458401 ], [ 111.103602, 21.455616 ], [ 111.034617, 21.438906 ], [ 110.929291, 21.375945 ], [ 110.888639, 21.367585 ], [ 110.796248, 21.37483 ], [ 110.768531, 21.364799 ], [ 110.713097, 21.3124 ], [ 110.65951, 21.239902 ], [ 110.626249, 21.215915 ], [ 110.534474, 21.204198 ], [ 110.501213, 21.217588 ], [ 110.451322, 21.186343 ], [ 110.422373, 21.190807 ], [ 110.39096, 21.124949 ], [ 110.296722, 21.093684 ], [ 110.24991, 21.045098 ], [ 110.241903, 21.016051 ], [ 110.208642, 21.050684 ], [ 110.204947, 21.003202 ], [ 110.180925, 20.98197 ], [ 110.184005, 20.891979 ], [ 110.209874, 20.860106 ], [ 110.269004, 20.839972 ], [ 110.327519, 20.847802 ], [ 110.393424, 20.816479 ], [ 110.407591, 20.731987 ], [ 110.392192, 20.682724 ], [ 110.411286, 20.670966 ], [ 110.466105, 20.680485 ], [ 110.487047, 20.640167 ], [ 110.499982, 20.572386 ], [ 110.550489, 20.47262 ], [ 110.54125, 20.42047 ], [ 110.491358, 20.373912 ], [ 110.452554, 20.311064 ], [ 110.425453, 20.291419 ], [ 110.384185, 20.293103 ], [ 110.349076, 20.258859 ], [ 110.296722, 20.249314 ], [ 110.220345, 20.25156 ], [ 110.168606, 20.219553 ], [ 110.118099, 20.219553 ], [ 110.082375, 20.258859 ], [ 109.993679, 20.254368 ], [ 109.929006, 20.211691 ], [ 109.909296, 20.236961 ], [ 109.916071, 20.316677 ], [ 109.861252, 20.376717 ], [ 109.864948, 20.40196 ], [ 109.895745, 20.42776 ], [ 109.888354, 20.475423 ], [ 109.839695, 20.489439 ], [ 109.811977, 20.541566 ], [ 109.813825, 20.574627 ], [ 109.793499, 20.615522 ], [ 109.74484, 20.621124 ], [ 109.730057, 20.719673 ], [ 109.711579, 20.774519 ], [ 109.664768, 20.862343 ], [ 109.655529, 20.929435 ], [ 109.674007, 21.067997 ], [ 109.674623, 21.136671 ], [ 109.763934, 21.226514 ], [ 109.757775, 21.346963 ], [ 109.770709, 21.359783 ], [ 109.868644, 21.365913 ], [ 109.904368, 21.429992 ], [ 109.894513, 21.442248 ], [ 109.819369, 21.445033 ], [ 109.785492, 21.45673 ] ] ], [ [ [ 117.145351, 23.455983 ], [ 117.142887, 23.400522 ], [ 117.124409, 23.389537 ], [ 117.081909, 23.409309 ], [ 117.050496, 23.400522 ], [ 117.027091, 23.41535 ], [ 116.946402, 23.42194 ], [ 116.944555, 23.440061 ], [ 116.982743, 23.460924 ], [ 117.022779, 23.436767 ], [ 117.058503, 23.47355 ], [ 117.093612, 23.459277 ], [ 117.129336, 23.483431 ], [ 117.145351, 23.455983 ] ] ], [ [ [ 112.853486, 21.740515 ], [ 112.83316, 21.736624 ], [ 112.804826, 21.686583 ], [ 112.821457, 21.655994 ], [ 112.798667, 21.610933 ], [ 112.817145, 21.590345 ], [ 112.775261, 21.564189 ], [ 112.730914, 21.613715 ], [ 112.780189, 21.671568 ], [ 112.734609, 21.666562 ], [ 112.70566, 21.679354 ], [ 112.724138, 21.719945 ], [ 112.782653, 21.739959 ], [ 112.840551, 21.776644 ], [ 112.876275, 21.772753 ], [ 112.853486, 21.740515 ] ] ], [ [ [ 112.530733, 21.583667 ], [ 112.535045, 21.628737 ], [ 112.57077, 21.645982 ], [ 112.560299, 21.666562 ], [ 112.592327, 21.693256 ], [ 112.663776, 21.714386 ], [ 112.66624, 21.683803 ], [ 112.639139, 21.67268 ], [ 112.665624, 21.642644 ], [ 112.621277, 21.606482 ], [ 112.571385, 21.619835 ], [ 112.563378, 21.591458 ], [ 112.530733, 21.583667 ] ] ], [ [ [ 114.231342, 22.016528 ], [ 114.239965, 22.03539 ], [ 114.302791, 22.050368 ], [ 114.311414, 22.041493 ], [ 114.231342, 22.016528 ] ] ], [ [ [ 112.435263, 21.663781 ], [ 112.458669, 21.68992 ], [ 112.456205, 21.648763 ], [ 112.435263, 21.663781 ] ] ], [ [ [ 110.435308, 21.182995 ], [ 110.445163, 21.184669 ], [ 110.499366, 21.213125 ], [ 110.525235, 21.190249 ], [ 110.589293, 21.194713 ], [ 110.632409, 21.210893 ], [ 110.582517, 21.094801 ], [ 110.544945, 21.083633 ], [ 110.508605, 21.140579 ], [ 110.434076, 21.168485 ], [ 110.435308, 21.182995 ] ] ], [ [ [ 110.517844, 21.079166 ], [ 110.560344, 21.061295 ], [ 110.539402, 20.987557 ], [ 110.535706, 20.922727 ], [ 110.511684, 20.916578 ], [ 110.47288, 20.983087 ], [ 110.407591, 20.990351 ], [ 110.347845, 20.984763 ], [ 110.309656, 20.963529 ], [ 110.201251, 20.938378 ], [ 110.211106, 20.986999 ], [ 110.27578, 21.033369 ], [ 110.305961, 21.0881 ], [ 110.352772, 21.079724 ], [ 110.398352, 21.096476 ], [ 110.459946, 21.062971 ], [ 110.517844, 21.079166 ] ] ], [ [ [ 113.765076, 21.962145 ], [ 113.74167, 21.991559 ], [ 113.774315, 21.998218 ], [ 113.765076, 21.962145 ] ] ], [ [ [ 113.723192, 21.922177 ], [ 113.71888, 21.951599 ], [ 113.742902, 21.950489 ], [ 113.723192, 21.922177 ] ] ], [ [ [ 113.142977, 21.831653 ], [ 113.136818, 21.868869 ], [ 113.167615, 21.876644 ], [ 113.203955, 21.861093 ], [ 113.162071, 21.853873 ], [ 113.142977, 21.831653 ] ] ], [ [ [ 113.819894, 22.396068 ], [ 113.786634, 22.413773 ], [ 113.813735, 22.419858 ], [ 113.819894, 22.396068 ] ] ], [ [ [ 114.190074, 21.986564 ], [ 114.180835, 22.00987 ], [ 114.229494, 21.995443 ], [ 114.190074, 21.986564 ] ] ], [ [ [ 114.153734, 21.97491 ], [ 114.124169, 21.985455 ], [ 114.171596, 22.000437 ], [ 114.153734, 21.97491 ] ] ], [ [ [ 116.769628, 20.771721 ], [ 116.820135, 20.780674 ], [ 116.88604, 20.775638 ], [ 116.925461, 20.726949 ], [ 116.934084, 20.676565 ], [ 116.905135, 20.619443 ], [ 116.862635, 20.588633 ], [ 116.796113, 20.582471 ], [ 116.749302, 20.600958 ], [ 116.849084, 20.628405 ], [ 116.889736, 20.683284 ], [ 116.87249, 20.738143 ], [ 116.761005, 20.750456 ], [ 116.769628, 20.771721 ] ] ], [ [ [ 113.025333, 21.847762 ], [ 113.007471, 21.869424 ], [ 113.045659, 21.882753 ], [ 113.025333, 21.847762 ] ] ], [ [ [ 110.405127, 20.678245 ], [ 110.414366, 20.710157 ], [ 110.437772, 20.677685 ], [ 110.405127, 20.678245 ] ] ], [ [ [ 110.644727, 20.935584 ], [ 110.646575, 20.917137 ], [ 110.611467, 20.860106 ], [ 110.562807, 20.861224 ], [ 110.548641, 20.908752 ], [ 110.584365, 20.948998 ], [ 110.644727, 20.935584 ] ] ], [ [ [ 110.556648, 20.32734 ], [ 110.586213, 20.381205 ], [ 110.593604, 20.360447 ], [ 110.556648, 20.32734 ] ] ], [ [ [ 115.943037, 21.097592 ], [ 115.965211, 21.123832 ], [ 116.024341, 21.12439 ], [ 116.044051, 21.110434 ], [ 116.067457, 21.04063 ], [ 116.040356, 21.02052 ], [ 115.989233, 21.035603 ], [ 115.953508, 21.064088 ], [ 115.943037, 21.097592 ] ] ], [ [ [ 115.926407, 20.981411 ], [ 115.954124, 20.99985 ], [ 116.000936, 20.948439 ], [ 115.999088, 20.922727 ], [ 115.970139, 20.919373 ], [ 115.939342, 20.945644 ], [ 115.926407, 20.981411 ] ] ], [ [ [ 115.834632, 22.722695 ], [ 115.835248, 22.722695 ], [ 115.834632, 22.722143 ], [ 115.834632, 22.722695 ] ] ], [ [ [ 115.834632, 22.723247 ], [ 115.835248, 22.722695 ], [ 115.834632, 22.722695 ], [ 115.834632, 22.723247 ] ] ] ] } },\n{ \"type\": \"Feature\", \"properties\": { \"adcode\": \"450000\", \"name\": \"广西壮族自治区\", \"center\": [ 108.320004, 22.82402 ], \"centroid\": [ 108.7944, 23.833381 ], \"childrenNum\": 14, \"level\": \"province\", \"parent\": { \"adcode\": 100000 }, \"subFeatureIndex\": 19, \"acroutes\": [ 100000 ] }, \"geometry\": { \"type\": \"MultiPolygon\", \"coordinates\": [ [ [ [ 112.024431, 24.740308 ], [ 111.961606, 24.721283 ], [ 111.939432, 24.686487 ], [ 111.953598, 24.64733 ], [ 111.927729, 24.629378 ], [ 111.936968, 24.595645 ], [ 111.972077, 24.578775 ], [ 112.007185, 24.534684 ], [ 112.009649, 24.503103 ], [ 111.985011, 24.467701 ], [ 112.025047, 24.438828 ], [ 112.057692, 24.387057 ], [ 112.05954, 24.339628 ], [ 112.026279, 24.294908 ], [ 111.990555, 24.279634 ], [ 111.986243, 24.25672 ], [ 111.958526, 24.263813 ], [ 111.912946, 24.221795 ], [ 111.877222, 24.227252 ], [ 111.871062, 24.176487 ], [ 111.886461, 24.163929 ], [ 111.878454, 24.109862 ], [ 111.92157, 24.012045 ], [ 111.940664, 23.987989 ], [ 111.911714, 23.943693 ], [ 111.854432, 23.947521 ], [ 111.845809, 23.904305 ], [ 111.812548, 23.887343 ], [ 111.824867, 23.832612 ], [ 111.8107, 23.80688 ], [ 111.722621, 23.823305 ], [ 111.683201, 23.822758 ], [ 111.683201, 23.822758 ], [ 111.654868, 23.833159 ], [ 111.627766, 23.78881 ], [ 111.621607, 23.725819 ], [ 111.666571, 23.718696 ], [ 111.614832, 23.65896 ], [ 111.615448, 23.639225 ], [ 111.555702, 23.64087 ], [ 111.487332, 23.626615 ], [ 111.479941, 23.532822 ], [ 111.428818, 23.466414 ], [ 111.399869, 23.469159 ], [ 111.383239, 23.399423 ], [ 111.389398, 23.375804 ], [ 111.363528, 23.340641 ], [ 111.376463, 23.30437 ], [ 111.353058, 23.284582 ], [ 111.36476, 23.240047 ], [ 111.388782, 23.210349 ], [ 111.38447, 23.16744 ], [ 111.365992, 23.14488 ], [ 111.377695, 23.082132 ], [ 111.402333, 23.066165 ], [ 111.43313, 23.073322 ], [ 111.433746, 23.036428 ], [ 111.389398, 23.005583 ], [ 111.403565, 22.99126 ], [ 111.362913, 22.967568 ], [ 111.374615, 22.938361 ], [ 111.358601, 22.889301 ], [ 111.218167, 22.748085 ], [ 111.185522, 22.735942 ], [ 111.118385, 22.744773 ], [ 111.058023, 22.729871 ], [ 111.089435, 22.695643 ], [ 111.055559, 22.648705 ], [ 110.997045, 22.631582 ], [ 110.958856, 22.636553 ], [ 110.950233, 22.61059 ], [ 110.896031, 22.613352 ], [ 110.897878, 22.591805 ], [ 110.812263, 22.576333 ], [ 110.778386, 22.585174 ], [ 110.749437, 22.556991 ], [ 110.762988, 22.518298 ], [ 110.740198, 22.498947 ], [ 110.74143, 22.464109 ], [ 110.688459, 22.477935 ], [ 110.712481, 22.440879 ], [ 110.711249, 22.369506 ], [ 110.74143, 22.361757 ], [ 110.749437, 22.329653 ], [ 110.787009, 22.28259 ], [ 110.759292, 22.274837 ], [ 110.725415, 22.29588 ], [ 110.687843, 22.249914 ], [ 110.646575, 22.220554 ], [ 110.678604, 22.172901 ], [ 110.629329, 22.149068 ], [ 110.598532, 22.162924 ], [ 110.602843, 22.18343 ], [ 110.55788, 22.196175 ], [ 110.505525, 22.14297 ], [ 110.456866, 22.189526 ], [ 110.414366, 22.208365 ], [ 110.378026, 22.164587 ], [ 110.34846, 22.195621 ], [ 110.326287, 22.152393 ], [ 110.364475, 22.125785 ], [ 110.35154, 22.097508 ], [ 110.359547, 22.015973 ], [ 110.352772, 21.97602 ], [ 110.374946, 21.967695 ], [ 110.374946, 21.967695 ], [ 110.378642, 21.939942 ], [ 110.378642, 21.939942 ], [ 110.391576, 21.89386 ], [ 110.337374, 21.887751 ], [ 110.290562, 21.917736 ], [ 110.283787, 21.892194 ], [ 110.224041, 21.882198 ], [ 110.224041, 21.882198 ], [ 110.212338, 21.886085 ], [ 110.212338, 21.886085 ], [ 110.196323, 21.899968 ], [ 110.12857, 21.902744 ], [ 110.101469, 21.86998 ], [ 110.050962, 21.857205 ], [ 109.999839, 21.881643 ], [ 109.94502, 21.84443 ], [ 109.940093, 21.769419 ], [ 109.916071, 21.668787 ], [ 109.888354, 21.652101 ], [ 109.888354, 21.652101 ], [ 109.839695, 21.636525 ], [ 109.786108, 21.637638 ], [ 109.778101, 21.670455 ], [ 109.742992, 21.616497 ], [ 109.754695, 21.556396 ], [ 109.788572, 21.490702 ], [ 109.785492, 21.45673 ], [ 109.704188, 21.462857 ], [ 109.654913, 21.493487 ], [ 109.612413, 21.556953 ], [ 109.604406, 21.523553 ], [ 109.576689, 21.493487 ], [ 109.540964, 21.466199 ], [ 109.529877, 21.437234 ], [ 109.484914, 21.453388 ], [ 109.41716, 21.438906 ], [ 109.245929, 21.425536 ], [ 109.186183, 21.390991 ], [ 109.138756, 21.388762 ], [ 109.095024, 21.419407 ], [ 109.046365, 21.424421 ], [ 109.039589, 21.457844 ], [ 109.074698, 21.489589 ], [ 109.142451, 21.511861 ], [ 109.138756, 21.567528 ], [ 109.110422, 21.568085 ], [ 109.09872, 21.571424 ], [ 109.093792, 21.579215 ], [ 108.937959, 21.589789 ], [ 108.881293, 21.627068 ], [ 108.83325, 21.610933 ], [ 108.801837, 21.626512 ], [ 108.745786, 21.602587 ], [ 108.710062, 21.646538 ], [ 108.705134, 21.622061 ], [ 108.678033, 21.659331 ], [ 108.658939, 21.643757 ], [ 108.626294, 21.67991 ], [ 108.591802, 21.677129 ], [ 108.492635, 21.554727 ], [ 108.397781, 21.533017 ], [ 108.330027, 21.540254 ], [ 108.230245, 21.491259 ], [ 108.210535, 21.505737 ], [ 108.249955, 21.561406 ], [ 108.241332, 21.599805 ], [ 108.205608, 21.597579 ], [ 108.156332, 21.55083 ], [ 108.193905, 21.519656 ], [ 108.108289, 21.508521 ], [ 108.041768, 21.544151 ], [ 107.958, 21.534131 ], [ 107.929051, 21.585893 ], [ 107.893942, 21.596466 ], [ 107.892095, 21.622617 ], [ 107.863761, 21.650988 ], [ 107.837892, 21.640419 ], [ 107.807711, 21.655438 ], [ 107.712856, 21.616497 ], [ 107.603219, 21.597579 ], [ 107.584741, 21.614828 ], [ 107.547168, 21.58645 ], [ 107.486806, 21.59591 ], [ 107.500973, 21.613715 ], [ 107.477567, 21.659888 ], [ 107.431372, 21.642088 ], [ 107.388256, 21.594241 ], [ 107.363619, 21.602031 ], [ 107.356843, 21.667674 ], [ 107.310648, 21.733844 ], [ 107.271844, 21.727173 ], [ 107.242279, 21.703265 ], [ 107.199163, 21.718833 ], [ 107.194851, 21.736624 ], [ 107.148656, 21.758858 ], [ 107.093837, 21.803317 ], [ 107.018077, 21.81943 ], [ 107.018693, 21.859427 ], [ 107.058729, 21.887196 ], [ 107.05996, 21.914959 ], [ 106.999598, 21.947714 ], [ 106.974345, 21.923288 ], [ 106.935541, 21.933836 ], [ 106.926302, 21.967695 ], [ 106.859164, 21.986009 ], [ 106.802498, 21.98157 ], [ 106.790179, 22.004876 ], [ 106.73844, 22.008205 ], [ 106.698404, 21.959925 ], [ 106.683006, 21.999882 ], [ 106.706411, 22.021521 ], [ 106.71565, 22.089745 ], [ 106.691629, 22.13521 ], [ 106.706411, 22.160707 ], [ 106.673151, 22.182322 ], [ 106.7021, 22.207257 ], [ 106.688549, 22.260438 ], [ 106.670071, 22.283144 ], [ 106.663296, 22.33076 ], [ 106.562897, 22.345706 ], [ 106.588767, 22.374486 ], [ 106.560434, 22.455813 ], [ 106.588151, 22.472958 ], [ 106.585071, 22.517192 ], [ 106.61402, 22.602303 ], [ 106.652825, 22.57357 ], [ 106.711955, 22.575228 ], [ 106.756302, 22.68957 ], [ 106.780324, 22.708894 ], [ 106.768621, 22.739254 ], [ 106.820976, 22.768504 ], [ 106.838838, 22.803265 ], [ 106.813585, 22.817608 ], [ 106.808657, 22.817608 ], [ 106.804346, 22.816505 ], [ 106.801882, 22.815401 ], [ 106.776012, 22.813746 ], [ 106.709491, 22.866142 ], [ 106.716882, 22.881582 ], [ 106.674998, 22.891506 ], [ 106.657136, 22.863385 ], [ 106.631267, 22.88103 ], [ 106.606013, 22.925684 ], [ 106.562282, 22.923479 ], [ 106.525941, 22.946628 ], [ 106.504383, 22.91025 ], [ 106.41384, 22.877171 ], [ 106.37134, 22.878273 ], [ 106.366413, 22.857871 ], [ 106.286957, 22.867245 ], [ 106.258007, 22.889852 ], [ 106.270326, 22.907494 ], [ 106.206885, 22.978588 ], [ 106.153914, 22.988505 ], [ 106.106486, 22.980792 ], [ 106.08616, 22.996218 ], [ 106.019639, 22.990709 ], [ 105.994385, 22.93781 ], [ 105.959277, 22.948832 ], [ 105.893987, 22.936707 ], [ 105.879205, 22.916865 ], [ 105.839169, 22.987403 ], [ 105.805908, 22.994565 ], [ 105.780039, 23.022659 ], [ 105.74185, 23.030921 ], [ 105.724604, 23.06231 ], [ 105.648844, 23.078828 ], [ 105.625438, 23.064513 ], [ 105.574931, 23.066165 ], [ 105.558916, 23.177893 ], [ 105.542902, 23.184495 ], [ 105.526272, 23.234548 ], [ 105.560148, 23.257093 ], [ 105.593409, 23.312614 ], [ 105.649459, 23.346136 ], [ 105.699966, 23.327453 ], [ 105.694423, 23.363168 ], [ 105.637757, 23.404366 ], [ 105.699966, 23.40162 ], [ 105.758481, 23.459826 ], [ 105.805908, 23.467512 ], [ 105.815763, 23.507031 ], [ 105.852103, 23.526786 ], [ 105.89214, 23.52514 ], [ 105.913081, 23.499348 ], [ 105.935871, 23.508678 ], [ 105.986378, 23.489469 ], [ 105.999929, 23.447748 ], [ 106.039965, 23.484529 ], [ 106.071994, 23.495506 ], [ 106.08616, 23.524043 ], [ 106.141595, 23.569579 ], [ 106.120653, 23.605229 ], [ 106.149602, 23.665538 ], [ 106.157609, 23.724175 ], [ 106.136667, 23.795381 ], [ 106.192102, 23.824947 ], [ 106.173008, 23.861622 ], [ 106.192718, 23.879135 ], [ 106.157609, 23.891174 ], [ 106.128044, 23.956819 ], [ 106.091088, 23.998924 ], [ 106.096631, 24.018058 ], [ 106.053516, 24.051399 ], [ 106.04982, 24.089649 ], [ 106.011632, 24.099482 ], [ 105.998081, 24.120786 ], [ 105.963589, 24.110954 ], [ 105.919241, 24.122425 ], [ 105.901995, 24.099482 ], [ 105.908154, 24.069432 ], [ 105.89214, 24.040468 ], [ 105.859495, 24.056864 ], [ 105.841633, 24.03063 ], [ 105.796669, 24.023524 ], [ 105.802212, 24.051945 ], [ 105.765256, 24.073804 ], [ 105.739387, 24.059596 ], [ 105.704278, 24.0667 ], [ 105.649459, 24.032816 ], [ 105.628518, 24.126794 ], [ 105.594641, 24.137718 ], [ 105.533663, 24.130071 ], [ 105.493011, 24.016965 ], [ 105.406163, 24.043748 ], [ 105.395692, 24.065607 ], [ 105.334099, 24.094566 ], [ 105.320548, 24.116416 ], [ 105.273121, 24.092927 ], [ 105.292831, 24.074896 ], [ 105.260186, 24.061236 ], [ 105.20044, 24.105491 ], [ 105.182577, 24.167205 ], [ 105.229389, 24.165567 ], [ 105.24294, 24.208695 ], [ 105.215222, 24.214699 ], [ 105.164715, 24.288362 ], [ 105.196744, 24.326541 ], [ 105.188121, 24.347261 ], [ 105.138846, 24.376701 ], [ 105.111744, 24.37234 ], [ 105.106817, 24.414853 ], [ 105.042759, 24.442097 ], [ 104.979933, 24.412673 ], [ 104.930042, 24.411038 ], [ 104.914028, 24.426296 ], [ 104.83642, 24.446456 ], [ 104.784681, 24.443732 ], [ 104.765587, 24.45953 ], [ 104.74834, 24.435559 ], [ 104.715695, 24.441552 ], [ 104.703377, 24.419757 ], [ 104.721239, 24.340173 ], [ 104.70892, 24.321087 ], [ 104.641783, 24.367979 ], [ 104.610986, 24.377246 ], [ 104.63008, 24.397958 ], [ 104.616529, 24.421937 ], [ 104.575877, 24.424661 ], [ 104.550008, 24.518894 ], [ 104.520443, 24.535228 ], [ 104.489646, 24.653313 ], [ 104.529682, 24.731611 ], [ 104.595587, 24.709323 ], [ 104.628848, 24.660927 ], [ 104.703377, 24.645698 ], [ 104.729246, 24.617953 ], [ 104.771746, 24.659839 ], [ 104.841963, 24.676155 ], [ 104.865985, 24.730524 ], [ 104.899245, 24.752809 ], [ 105.03352, 24.787586 ], [ 105.026745, 24.815836 ], [ 105.039064, 24.872859 ], [ 105.077868, 24.918459 ], [ 105.082179, 24.915745 ], [ 105.096346, 24.928228 ], [ 105.09573, 24.92877 ], [ 105.131454, 24.959701 ], [ 105.157324, 24.958616 ], [ 105.178266, 24.985199 ], [ 105.212758, 24.995505 ], [ 105.251563, 24.967296 ], [ 105.267577, 24.929313 ], [ 105.334099, 24.9266 ], [ 105.365511, 24.943423 ], [ 105.428337, 24.930941 ], [ 105.457286, 24.87123 ], [ 105.493011, 24.833217 ], [ 105.497322, 24.809318 ], [ 105.573083, 24.797366 ], [ 105.607576, 24.803885 ], [ 105.617431, 24.78161 ], [ 105.70551, 24.768569 ], [ 105.767104, 24.719109 ], [ 105.827466, 24.702799 ], [ 105.863806, 24.729437 ], [ 105.942031, 24.725088 ], [ 105.961741, 24.677786 ], [ 106.024566, 24.633186 ], [ 106.047356, 24.684312 ], [ 106.113878, 24.714216 ], [ 106.150218, 24.762591 ], [ 106.173008, 24.760417 ], [ 106.206269, 24.851139 ], [ 106.197645, 24.885889 ], [ 106.145291, 24.954275 ], [ 106.191486, 24.95319 ], [ 106.215508, 24.981944 ], [ 106.253696, 24.971094 ], [ 106.304819, 24.973807 ], [ 106.332536, 24.988454 ], [ 106.442173, 25.019369 ], [ 106.450181, 25.033468 ], [ 106.519782, 25.054072 ], [ 106.551195, 25.082802 ], [ 106.590615, 25.08768 ], [ 106.63989, 25.132658 ], [ 106.644817, 25.164621 ], [ 106.691013, 25.179245 ], [ 106.732281, 25.162454 ], [ 106.764926, 25.183036 ], [ 106.787715, 25.17112 ], [ 106.853005, 25.186827 ], [ 106.888113, 25.181953 ], [ 106.904128, 25.231768 ], [ 106.933077, 25.250714 ], [ 106.975577, 25.232851 ], [ 107.013765, 25.275611 ], [ 107.012533, 25.352973 ], [ 106.987896, 25.358922 ], [ 106.963874, 25.437852 ], [ 106.996519, 25.442716 ], [ 107.015613, 25.495666 ], [ 107.066736, 25.50917 ], [ 107.064272, 25.559391 ], [ 107.185612, 25.578825 ], [ 107.205322, 25.607971 ], [ 107.228728, 25.604733 ], [ 107.232423, 25.556691 ], [ 107.263836, 25.543193 ], [ 107.336517, 25.461089 ], [ 107.308184, 25.432988 ], [ 107.318039, 25.401637 ], [ 107.358691, 25.393528 ], [ 107.375937, 25.411908 ], [ 107.420901, 25.392987 ], [ 107.409198, 25.347024 ], [ 107.432604, 25.289139 ], [ 107.481263, 25.299961 ], [ 107.489886, 25.276693 ], [ 107.472024, 25.213902 ], [ 107.512676, 25.209029 ], [ 107.576734, 25.256668 ], [ 107.599523, 25.250714 ], [ 107.632168, 25.310241 ], [ 107.659885, 25.316192 ], [ 107.661733, 25.258833 ], [ 107.696226, 25.219858 ], [ 107.700537, 25.194408 ], [ 107.741805, 25.24043 ], [ 107.762131, 25.229061 ], [ 107.760283, 25.188451 ], [ 107.789233, 25.15487 ], [ 107.762747, 25.125073 ], [ 107.839124, 25.115861 ], [ 107.872384, 25.141327 ], [ 107.928435, 25.155954 ], [ 108.001732, 25.196574 ], [ 108.080572, 25.193867 ], [ 108.115065, 25.210112 ], [ 108.143398, 25.269658 ], [ 108.152021, 25.324306 ], [ 108.142782, 25.390825 ], [ 108.193289, 25.405421 ], [ 108.162492, 25.444878 ], [ 108.192673, 25.458928 ], [ 108.251803, 25.430286 ], [ 108.241332, 25.46217 ], [ 108.280752, 25.48 ], [ 108.308469, 25.525912 ], [ 108.348506, 25.536173 ], [ 108.359592, 25.513491 ], [ 108.400244, 25.491344 ], [ 108.418723, 25.443257 ], [ 108.471693, 25.458928 ], [ 108.585642, 25.365952 ], [ 108.589338, 25.335125 ], [ 108.625062, 25.308076 ], [ 108.62999, 25.335666 ], [ 108.600425, 25.432448 ], [ 108.6072, 25.491885 ], [ 108.634917, 25.520512 ], [ 108.68912, 25.533473 ], [ 108.658323, 25.550212 ], [ 108.660787, 25.584763 ], [ 108.68604, 25.587462 ], [ 108.68912, 25.623081 ], [ 108.724844, 25.634952 ], [ 108.783975, 25.628477 ], [ 108.799989, 25.576666 ], [ 108.781511, 25.554531 ], [ 108.814772, 25.526992 ], [ 108.826474, 25.550212 ], [ 108.890532, 25.556151 ], [ 108.8893, 25.543193 ], [ 108.949046, 25.557231 ], [ 109.024807, 25.51241 ], [ 109.088249, 25.550752 ], [ 109.051908, 25.566949 ], [ 109.030966, 25.629556 ], [ 109.075314, 25.693749 ], [ 109.07901, 25.72071 ], [ 109.043285, 25.738502 ], [ 109.007561, 25.734728 ], [ 108.953974, 25.686738 ], [ 108.953974, 25.686738 ], [ 108.900387, 25.682423 ], [ 108.896076, 25.71424 ], [ 108.940423, 25.740119 ], [ 108.963829, 25.732572 ], [ 108.999553, 25.765453 ], [ 108.989698, 25.778926 ], [ 109.048213, 25.790781 ], [ 109.077778, 25.776771 ], [ 109.095024, 25.80533 ], [ 109.143683, 25.795092 ], [ 109.13198, 25.762758 ], [ 109.147995, 25.741736 ], [ 109.206509, 25.788087 ], [ 109.207125, 25.740119 ], [ 109.296436, 25.71424 ], [ 109.340168, 25.731493 ], [ 109.327849, 25.76168 ], [ 109.339552, 25.83442 ], [ 109.359262, 25.836036 ], [ 109.396834, 25.900117 ], [ 109.435022, 25.93349 ], [ 109.408537, 25.967392 ], [ 109.462124, 25.995367 ], [ 109.48245, 26.029788 ], [ 109.513247, 25.998056 ], [ 109.560058, 26.021184 ], [ 109.588391, 26.019571 ], [ 109.635203, 26.047533 ], [ 109.649369, 26.016882 ], [ 109.730057, 25.989988 ], [ 109.710963, 25.954478 ], [ 109.693717, 25.959321 ], [ 109.67955, 25.921649 ], [ 109.685094, 25.880197 ], [ 109.768246, 25.890427 ], [ 109.779333, 25.866196 ], [ 109.811361, 25.877504 ], [ 109.826144, 25.911422 ], [ 109.806434, 25.973848 ], [ 109.782412, 25.996981 ], [ 109.814441, 26.041081 ], [ 109.864332, 26.027637 ], [ 109.898825, 26.095377 ], [ 109.904368, 26.135679 ], [ 109.970274, 26.195301 ], [ 110.03002, 26.166299 ], [ 110.099005, 26.168985 ], [ 110.100853, 26.132455 ], [ 110.065128, 26.050221 ], [ 110.100853, 26.020108 ], [ 110.168606, 26.028713 ], [ 110.181541, 26.060437 ], [ 110.24991, 26.010965 ], [ 110.257301, 25.961473 ], [ 110.325671, 25.975462 ], [ 110.373098, 26.088927 ], [ 110.437772, 26.153945 ], [ 110.477808, 26.179727 ], [ 110.495054, 26.166299 ], [ 110.546793, 26.233421 ], [ 110.552952, 26.283335 ], [ 110.584365, 26.296749 ], [ 110.612083, 26.333764 ], [ 110.643495, 26.308552 ], [ 110.673676, 26.317135 ], [ 110.711249, 26.29192 ], [ 110.742046, 26.313917 ], [ 110.73835, 26.271529 ], [ 110.759292, 26.248451 ], [ 110.836284, 26.255966 ], [ 110.939762, 26.286554 ], [ 110.926212, 26.320354 ], [ 110.944074, 26.326791 ], [ 110.94469, 26.373447 ], [ 110.974255, 26.385778 ], [ 111.008747, 26.35897 ], [ 111.008132, 26.336982 ], [ 111.090667, 26.308016 ], [ 111.208928, 26.30426 ], [ 111.204616, 26.276359 ], [ 111.228022, 26.261333 ], [ 111.277913, 26.272066 ], [ 111.293311, 26.222148 ], [ 111.271754, 26.217316 ], [ 111.274833, 26.183486 ], [ 111.258203, 26.151796 ], [ 111.26621, 26.095914 ], [ 111.244652, 26.078177 ], [ 111.267442, 26.058824 ], [ 111.235413, 26.048071 ], [ 111.189834, 25.953402 ], [ 111.230486, 25.916267 ], [ 111.251428, 25.864581 ], [ 111.29208, 25.854349 ], [ 111.297007, 25.874274 ], [ 111.346282, 25.906577 ], [ 111.376463, 25.906039 ], [ 111.383239, 25.881812 ], [ 111.460231, 25.885042 ], [ 111.4861, 25.859196 ], [ 111.43313, 25.84627 ], [ 111.442369, 25.77192 ], [ 111.399869, 25.744431 ], [ 111.30871, 25.720171 ], [ 111.309942, 25.645203 ], [ 111.343202, 25.602574 ], [ 111.324724, 25.564249 ], [ 111.32842, 25.521592 ], [ 111.300087, 25.44812 ], [ 111.26313, 25.42326 ], [ 111.257587, 25.395691 ], [ 111.210776, 25.363248 ], [ 111.184906, 25.367034 ], [ 111.138711, 25.303748 ], [ 111.103602, 25.285351 ], [ 111.112841, 25.21715 ], [ 110.998892, 25.161371 ], [ 110.98411, 25.101772 ], [ 110.951465, 25.04377 ], [ 110.968711, 24.975434 ], [ 111.009363, 24.921172 ], [ 111.100522, 24.945593 ], [ 111.101754, 25.035095 ], [ 111.139943, 25.042144 ], [ 111.200921, 25.074672 ], [ 111.221862, 25.106649 ], [ 111.274833, 25.151078 ], [ 111.321645, 25.105023 ], [ 111.36784, 25.108817 ], [ 111.375231, 25.128324 ], [ 111.435593, 25.093642 ], [ 111.416499, 25.047566 ], [ 111.467622, 25.02208 ], [ 111.460231, 24.992793 ], [ 111.43313, 24.979774 ], [ 111.434977, 24.951562 ], [ 111.470086, 24.92877 ], [ 111.447296, 24.892947 ], [ 111.449144, 24.857113 ], [ 111.479325, 24.797366 ], [ 111.461463, 24.728894 ], [ 111.431282, 24.687574 ], [ 111.451608, 24.665822 ], [ 111.499035, 24.667997 ], [ 111.526752, 24.637538 ], [ 111.570484, 24.64461 ], [ 111.588962, 24.690837 ], [ 111.641933, 24.684856 ], [ 111.637621, 24.715303 ], [ 111.666571, 24.760961 ], [ 111.708455, 24.788673 ], [ 111.783599, 24.785957 ], [ 111.814396, 24.770199 ], [ 111.868599, 24.771829 ], [ 111.875374, 24.756613 ], [ 111.929577, 24.75607 ], [ 111.951135, 24.769655 ], [ 112.024431, 24.740308 ] ] ], [ [ [ 105.096346, 24.928228 ], [ 105.082179, 24.915745 ], [ 105.077868, 24.918459 ], [ 105.09573, 24.92877 ], [ 105.096346, 24.928228 ] ] ], [ [ [ 109.088249, 21.014934 ], [ 109.088865, 21.031134 ], [ 109.09256, 21.057386 ], [ 109.138756, 21.067439 ], [ 109.144299, 21.041189 ], [ 109.117814, 21.017727 ], [ 109.11227, 21.02499 ], [ 109.088249, 21.014934 ] ] ] ] } },\n{ \"type\": \"Feature\", \"properties\": { \"adcode\": \"460000\", \"name\": \"海南省\", \"center\": [ 110.33119, 20.031971 ], \"centroid\": [ 109.754859, 19.189767 ], \"childrenNum\": 19, \"level\": \"province\", \"parent\": { \"adcode\": 100000 }, \"subFeatureIndex\": 20, \"acroutes\": [ 100000 ] }, \"geometry\": { \"type\": \"MultiPolygon\", \"coordinates\": [ [ [ [ 110.106396, 20.026812 ], [ 110.144585, 20.074598 ], [ 110.243135, 20.077408 ], [ 110.28933, 20.056047 ], [ 110.318279, 20.108882 ], [ 110.387265, 20.113378 ], [ 110.495054, 20.077408 ], [ 110.526467, 20.07516 ], [ 110.562191, 20.110006 ], [ 110.655814, 20.134169 ], [ 110.687843, 20.163947 ], [ 110.717408, 20.148778 ], [ 110.744509, 20.074036 ], [ 110.778386, 20.068415 ], [ 110.808567, 20.035808 ], [ 110.871393, 20.01163 ], [ 110.940994, 20.028499 ], [ 110.966248, 20.018377 ], [ 111.013675, 19.850159 ], [ 111.043856, 19.763448 ], [ 111.071573, 19.628784 ], [ 111.061718, 19.612436 ], [ 111.008747, 19.60398 ], [ 110.920668, 19.552668 ], [ 110.888023, 19.518827 ], [ 110.844292, 19.449996 ], [ 110.787009, 19.399765 ], [ 110.729727, 19.378878 ], [ 110.706321, 19.320153 ], [ 110.676756, 19.286264 ], [ 110.619474, 19.152334 ], [ 110.585597, 18.88075 ], [ 110.590525, 18.838841 ], [ 110.578206, 18.784458 ], [ 110.499366, 18.751592 ], [ 110.499366, 18.651824 ], [ 110.367555, 18.631977 ], [ 110.329366, 18.642185 ], [ 110.246215, 18.609859 ], [ 110.214186, 18.578662 ], [ 110.116867, 18.506602 ], [ 110.090382, 18.399309 ], [ 110.070672, 18.376025 ], [ 110.022629, 18.360121 ], [ 109.919767, 18.375457 ], [ 109.785492, 18.339672 ], [ 109.749767, 18.193618 ], [ 109.726362, 18.177698 ], [ 109.661688, 18.175424 ], [ 109.584696, 18.143579 ], [ 109.527413, 18.169169 ], [ 109.467051, 18.173718 ], [ 109.441182, 18.199303 ], [ 109.355566, 18.215221 ], [ 109.287813, 18.264671 ], [ 109.17448, 18.260125 ], [ 109.138756, 18.268081 ], [ 109.108575, 18.323766 ], [ 109.006329, 18.323198 ], [ 108.944735, 18.314107 ], [ 108.905315, 18.389087 ], [ 108.881293, 18.416344 ], [ 108.776583, 18.441894 ], [ 108.68912, 18.447571 ], [ 108.644772, 18.486738 ], [ 108.641077, 18.565614 ], [ 108.663866, 18.67337 ], [ 108.65278, 18.740258 ], [ 108.593033, 18.809386 ], [ 108.595497, 18.872256 ], [ 108.637997, 18.924346 ], [ 108.630606, 19.003017 ], [ 108.598577, 19.055633 ], [ 108.591186, 19.141592 ], [ 108.609048, 19.276661 ], [ 108.644772, 19.349518 ], [ 108.694047, 19.387346 ], [ 108.765496, 19.400894 ], [ 108.806148, 19.450561 ], [ 108.855424, 19.469182 ], [ 108.92872, 19.524468 ], [ 108.993394, 19.587065 ], [ 109.048829, 19.619764 ], [ 109.093792, 19.68965 ], [ 109.147379, 19.704863 ], [ 109.169553, 19.736411 ], [ 109.159082, 19.79048 ], [ 109.231147, 19.863105 ], [ 109.255784, 19.867045 ], [ 109.25948, 19.898561 ], [ 109.300748, 19.917693 ], [ 109.349407, 19.898561 ], [ 109.411001, 19.895184 ], [ 109.498464, 19.873236 ], [ 109.526797, 19.943573 ], [ 109.585312, 19.98801 ], [ 109.657993, 20.01163 ], [ 109.712195, 20.017253 ], [ 109.76147, 19.981261 ], [ 109.814441, 19.993072 ], [ 109.855093, 19.984073 ], [ 109.898825, 19.994196 ], [ 109.965346, 19.993634 ], [ 109.997375, 19.980136 ], [ 110.042339, 19.991384 ], [ 110.106396, 20.026812 ] ] ], [ [ [ 112.203848648399557, 3.87222818584552 ], [ 112.219068, 3.908969 ], [ 112.260336, 3.917925 ], [ 112.292871092971765, 3.856691249764521 ], [ 112.239961526858096, 3.836535224578359 ], [ 112.203848648399557, 3.87222818584552 ] ] ], [ [ [ 113.266165, 8.125929 ], [ 113.293882, 8.176284 ], [ 113.353628, 8.237887 ], [ 113.354244, 8.304217 ], [ 113.386273, 8.289412 ], [ 113.386273, 8.238479 ], [ 113.349933, 8.172137 ], [ 113.288955, 8.119412 ], [ 113.343157, 8.193463 ], [ 113.311129, 8.177469 ], [ 113.266165, 8.125929 ] ] ], [ [ [ 111.463311, 17.077491 ], [ 111.452224, 17.092936 ], [ 111.542151, 17.11982 ], [ 111.559397, 17.087788 ], [ 111.4861, 17.058039 ], [ 111.536607, 17.104949 ], [ 111.463311, 17.077491 ] ] ], [ [ [ 111.99733, 3.848065 ], [ 112.007327402834477, 3.874747688993791 ], [ 112.033782185891312, 3.88524561877825 ], [ 112.057717465799882, 3.882306198438601 ], [ 112.073707, 3.865979 ], [ 112.064467, 3.830152 ], [ 112.040500860953372, 3.814279613435307 ], [ 112.015192, 3.823583 ], [ 111.99733, 3.848065 ] ] ], [ [ [ 117.69258625690604, 15.174719308985452 ], [ 117.715095, 15.222561 ], [ 117.72659954940768, 15.237286970500829 ], [ 117.748355, 15.230068 ], [ 117.782848, 15.187333 ], [ 117.839977191079839, 15.157922621330318 ], [ 117.845856031759141, 15.138186513335535 ], [ 117.841656859845358, 15.124749163211428 ], [ 117.832838598826413, 15.152043780651022 ], [ 117.777409529564466, 15.172619723028561 ], [ 117.74466, 15.217941 ], [ 117.720638, 15.195418 ], [ 117.72495, 15.131302 ], [ 117.827812, 15.111659 ], [ 117.826959758147112, 15.099974048920105 ], [ 117.726798, 15.105303 ], [ 117.70980286175255, 15.108372392747672 ], [ 117.69258625690604, 15.174719308985452 ] ] ], [ [ [ 112.241858, 3.942404 ], [ 112.243320864389119, 3.968809139862543 ], [ 112.254177, 3.97942 ], [ 112.270195564637334, 3.986445661900434 ], [ 112.290771507014881, 3.980566821221137 ], [ 112.292365, 3.946583 ], [ 112.265156558340792, 3.932696261404004 ], [ 112.241858, 3.942404 ] ] ], [ [ [ 111.734324, 16.19732 ], [ 111.790374, 16.220307 ], [ 111.789758, 16.250186 ], [ 111.716462, 16.249036 ], [ 111.782367, 16.273741 ], [ 111.813164, 16.261676 ], [ 111.81686, 16.224329 ], [ 111.779903, 16.19732 ], [ 111.734324, 16.19732 ] ] ], [ [ [ 113.896887, 7.607204 ], [ 113.921524, 7.639235 ], [ 114.029314, 7.670078 ], [ 114.095219, 7.721082 ], [ 114.211632, 7.786904 ], [ 114.268298, 7.870501 ], [ 114.414892, 7.952895 ], [ 114.47279, 7.968898 ], [ 114.511594, 7.966527 ], [ 114.540543, 7.945783 ], [ 114.555326, 7.891249 ], [ 114.540543, 7.862201 ], [ 114.464167, 7.814771 ], [ 114.419819, 7.765557 ], [ 114.407501, 7.683126 ], [ 114.368696, 7.638642 ], [ 114.289856, 7.617288 ], [ 114.157429, 7.561525 ], [ 114.058879, 7.537794 ], [ 113.98743, 7.536014 ], [ 113.919677, 7.566865 ], [ 113.896887, 7.607204 ] ] ], [ [ [ 111.649324, 16.255931 ], [ 111.681353, 16.262251 ], [ 111.598817, 16.198469 ], [ 111.606825, 16.177779 ], [ 111.690592, 16.211112 ], [ 111.611136, 16.156511 ], [ 111.56802, 16.162834 ], [ 111.577875, 16.208239 ], [ 111.649324, 16.255931 ] ] ], [ [ [ 113.976959, 8.872888 ], [ 113.989894, 8.878801 ], [ 114.041017, 8.843913 ], [ 114.060111, 8.816119 ], [ 114.035473, 8.783591 ], [ 114.013299, 8.836817 ], [ 113.976959, 8.872888 ] ] ], [ [ [ 113.956017, 8.840365 ], [ 113.977575, 8.841548 ], [ 114.012068, 8.798376 ], [ 113.975111, 8.793054 ], [ 113.956017, 8.840365 ] ] ], [ [ [ 112.216604, 8.866383 ], [ 112.180264, 8.862244 ], [ 112.206133, 8.88767 ], [ 112.216604, 8.866383 ] ] ], [ [ [ 111.739251, 16.452898 ], [ 111.765737, 16.495366 ], [ 111.759577, 16.545857 ], [ 111.786679, 16.520039 ], [ 111.766969, 16.470116 ], [ 111.739251, 16.452898 ] ] ], [ [ [ 111.97454, 16.323715 ], [ 112.002874, 16.350707 ], [ 112.047221, 16.360469 ], [ 112.074938, 16.349558 ], [ 112.07617, 16.323715 ], [ 112.002258, 16.306484 ], [ 111.97454, 16.323715 ] ] ], [ [ [ 113.792177, 7.373422 ], [ 113.829134, 7.383511 ], [ 113.828518, 7.362145 ], [ 113.792177, 7.373422 ] ] ], [ [ [ 114.194386, 8.764664 ], [ 114.222103, 8.784773 ], [ 114.248588, 8.724442 ], [ 114.201161, 8.727991 ], [ 114.194386, 8.764664 ] ] ], [ [ [ 112.232619, 16.996239 ], [ 112.266496, 16.993949 ], [ 112.292981, 16.96762 ], [ 112.222764, 16.960751 ], [ 112.207981, 16.987081 ], [ 112.232619, 16.996239 ] ] ], [ [ [ 114.617536, 9.965688 ], [ 114.685905, 9.979245 ], [ 114.672355, 9.927963 ], [ 114.642173, 9.917351 ], [ 114.617536, 9.965688 ] ] ], [ [ [ 115.837712, 9.709775 ], [ 115.870972, 9.778785 ], [ 115.901153, 9.795888 ], [ 115.925791, 9.781734 ], [ 115.901153, 9.67084 ], [ 115.867277, 9.650191 ], [ 115.861117, 9.694438 ], [ 115.837712, 9.709775 ] ] ], [ [ [ 114.689601, 10.345648 ], [ 114.717318, 10.380381 ], [ 114.747499, 10.37214 ], [ 114.725941, 10.319154 ], [ 114.702536, 10.312677 ], [ 114.689601, 10.345648 ] ] ], [ [ [ 113.769387, 7.636862 ], [ 113.831597, 7.644573 ], [ 113.814967, 7.603051 ], [ 113.773699, 7.601865 ], [ 113.769387, 7.636862 ] ] ], [ [ [ 109.463972, 7.344339 ], [ 109.536037, 7.448792 ], [ 109.653065, 7.559745 ], [ 109.72205, 7.575763 ], [ 109.816289, 7.572797 ], [ 109.904984, 7.55144 ], [ 109.948716, 7.522962 ], [ 109.938861, 7.504569 ], [ 109.791651, 7.524742 ], [ 109.709115, 7.511095 ], [ 109.654297, 7.479648 ], [ 109.571761, 7.373422 ], [ 109.513247, 7.320002 ], [ 109.463972, 7.315254 ], [ 109.463972, 7.344339 ] ] ], [ [ [ 116.273181, 8.879392 ], [ 116.305826, 8.917233 ], [ 116.332311, 8.901269 ], [ 116.294123, 8.858105 ], [ 116.273181, 8.879392 ] ] ], [ [ [ 112.476531, 16.001247 ], [ 112.448814, 16.005274 ], [ 112.462364, 16.043813 ], [ 112.588016, 16.070844 ], [ 112.612037, 16.039212 ], [ 112.570154, 16.011027 ], [ 112.476531, 16.001247 ] ] ], [ [ [ 112.537509, 8.846278 ], [ 112.598487, 8.859288 ], [ 112.639755, 8.818484 ], [ 112.57077, 8.815527 ], [ 112.537509, 8.846278 ] ] ], [ [ [ 114.469095, 10.836261 ], [ 114.55471, 10.900911 ], [ 114.587355, 10.909138 ], [ 114.593514, 10.856245 ], [ 114.565181, 10.836261 ], [ 114.513442, 10.848605 ], [ 114.475254, 10.814512 ], [ 114.469095, 10.836261 ] ] ], [ [ [ 112.409393, 16.294996 ], [ 112.509176, 16.317397 ], [ 112.536893, 16.312228 ], [ 112.531349, 16.285805 ], [ 112.475915, 16.288677 ], [ 112.411241, 16.2634 ], [ 112.383524, 16.265698 ], [ 112.409393, 16.294996 ] ] ], [ [ [ 112.349031, 16.912088 ], [ 112.30222, 16.963041 ], [ 112.334249, 16.962469 ], [ 112.360734, 16.925257 ], [ 112.349031, 16.912088 ] ] ], [ [ [ 111.500267, 16.45175 ], [ 111.538455, 16.461507 ], [ 111.545847, 16.43453 ], [ 111.49534, 16.4374 ], [ 111.500267, 16.45175 ] ] ], [ [ [ 115.500177, 9.897897 ], [ 115.518039, 9.933857 ], [ 115.581481, 9.917351 ], [ 115.585177, 9.896128 ], [ 115.54822, 9.869007 ], [ 115.500177, 9.897897 ] ] ], [ [ [ 116.48876, 10.395686 ], [ 116.526332, 10.426883 ], [ 116.542346, 10.41982 ], [ 116.514629, 10.34918 ], [ 116.637817, 10.365076 ], [ 116.644592, 10.335051 ], [ 116.566368, 10.304434 ], [ 116.511549, 10.297957 ], [ 116.467202, 10.309144 ], [ 116.461658, 10.34918 ], [ 116.48876, 10.395686 ] ] ], [ [ [ 114.669891, 8.210048 ], [ 114.726557, 8.21064 ], [ 114.74134, 8.189316 ], [ 114.691449, 8.18517 ], [ 114.669891, 8.210048 ] ] ], [ [ [ 114.507899, 8.120004 ], [ 114.595978, 8.15792 ], [ 114.624311, 8.149626 ], [ 114.595978, 8.120596 ], [ 114.530073, 8.103415 ], [ 114.507899, 8.120004 ] ] ], [ [ [ 115.16757, 8.386523 ], [ 115.202678, 8.395403 ], [ 115.299381, 8.370537 ], [ 115.315395, 8.356326 ], [ 115.285214, 8.314876 ], [ 115.235939, 8.321982 ], [ 115.18112, 8.345668 ], [ 115.16757, 8.386523 ] ] ], [ [ [ 113.895039, 8.00505 ], [ 113.940003, 8.018088 ], [ 113.969568, 7.974825 ], [ 113.9708, 7.944597 ], [ 113.904894, 7.963564 ], [ 113.895039, 8.00505 ] ] ], [ [ [ 115.436119, 9.393447 ], [ 115.456445, 9.417064 ], [ 115.469996, 9.3592 ], [ 115.450286, 9.345028 ], [ 115.436119, 9.393447 ] ] ], [ [ [ 113.638192, 8.976942 ], [ 113.644968, 8.989355 ], [ 113.719496, 9.020092 ], [ 113.730583, 9.004133 ], [ 113.654823, 8.962163 ], [ 113.638192, 8.976942 ] ] ], [ [ [ 116.457347, 9.174326 ], [ 116.500462, 9.164282 ], [ 116.477057, 9.137103 ], [ 116.457347, 9.174326 ] ] ], [ [ [ 114.910723, 10.863298 ], [ 114.934129, 10.902674 ], [ 114.959998, 10.902087 ], [ 114.931049, 10.841551 ], [ 114.910723, 10.863298 ] ] ], [ [ [ 113.939387, 8.875253 ], [ 113.916597, 8.837999 ], [ 113.893807, 8.862836 ], [ 113.912285, 8.888853 ], [ 113.939387, 8.875253 ] ] ], [ [ [ 114.696992, 11.004322 ], [ 114.710543, 11.039567 ], [ 114.766593, 11.110045 ], [ 114.799854, 11.10476 ], [ 114.793079, 11.07657 ], [ 114.710543, 11.001972 ], [ 114.696992, 11.004322 ] ] ], [ [ [ 111.572948, 16.470116 ], [ 111.592658, 16.490775 ], [ 111.614216, 16.44027 ], [ 111.578491, 16.447158 ], [ 111.572948, 16.470116 ] ] ], [ [ [ 114.62, 11.432264 ], [ 114.621232, 11.518479 ], [ 114.661884, 11.522584 ], [ 114.652644, 11.436957 ], [ 114.62, 11.432264 ] ] ], [ [ [ 109.936397, 7.848566 ], [ 109.953027, 7.888878 ], [ 110.0331, 7.944597 ], [ 110.078063, 7.949339 ], [ 110.082991, 7.896584 ], [ 110.050346, 7.846194 ], [ 109.988136, 7.8124 ], [ 109.936397, 7.823665 ], [ 109.936397, 7.848566 ] ] ], [ [ [ 116.727128, 11.501473 ], [ 116.738215, 11.514961 ], [ 116.772092, 11.445755 ], [ 116.765316, 11.430504 ], [ 116.727128, 11.501473 ] ] ], [ [ [ 111.761425, 16.061642 ], [ 111.829795, 16.070844 ], [ 111.828563, 16.049565 ], [ 111.791606, 16.028859 ], [ 111.761425, 16.061642 ] ] ], [ [ [ 113.845764, 10.018733 ], [ 113.856851, 10.12185 ], [ 113.872249, 10.123029 ], [ 113.865474, 10.00341 ], [ 113.845764, 10.018733 ] ] ], [ [ [ 111.690592, 16.587731 ], [ 111.717078, 16.59404 ], [ 111.724469, 16.560198 ], [ 111.690592, 16.587731 ] ] ], [ [ [ 112.507328, 16.466098 ], [ 112.499321, 16.493645 ], [ 112.575081, 16.537251 ], [ 112.586784, 16.525777 ], [ 112.507328, 16.466098 ] ] ], [ [ [ 114.791847, 8.160882 ], [ 114.818332, 8.141332 ], [ 114.812173, 8.110524 ], [ 114.777064, 8.114079 ], [ 114.791847, 8.160882 ] ] ], [ [ [ 116.557129, 9.745167 ], [ 116.593469, 9.723932 ], [ 116.566368, 9.718623 ], [ 116.557129, 9.745167 ] ] ], [ [ [ 116.832454, 10.476908 ], [ 116.868794, 10.495739 ], [ 116.855243, 10.468669 ], [ 116.832454, 10.476908 ] ] ], [ [ [ 114.703151, 16.170307 ], [ 114.704383, 16.199044 ], [ 114.802934, 16.215135 ], [ 114.816484, 16.198469 ], [ 114.703151, 16.170307 ] ] ], [ [ [ 115.28275, 10.191951 ], [ 115.28891, 10.211388 ], [ 115.333257, 10.200198 ], [ 115.288294, 10.172513 ], [ 115.28275, 10.191951 ] ] ], [ [ [ 115.97753, 9.321997 ], [ 115.999088, 9.293649 ], [ 115.976298, 9.268252 ], [ 115.943037, 9.269433 ], [ 115.926407, 9.311366 ], [ 115.97753, 9.321997 ] ] ], [ [ [ 113.660366, 9.231039 ], [ 113.697323, 9.225722 ], [ 113.676997, 9.202683 ], [ 113.660366, 9.231039 ] ] ], [ [ [ 114.665579, 7.590001 ], [ 114.703767, 7.614915 ], [ 114.72163, 7.59178 ], [ 114.671739, 7.563898 ], [ 114.665579, 7.590001 ] ] ], [ [ [ 117.770529, 10.773361 ], [ 117.775457, 10.809222 ], [ 117.801942, 10.839788 ], [ 117.831507, 10.838612 ], [ 117.835819, 10.803931 ], [ 117.798862, 10.753371 ], [ 117.770529, 10.773361 ] ] ], [ [ [ 114.242429, 10.242014 ], [ 114.265219, 10.275581 ], [ 114.312646, 10.300901 ], [ 114.326197, 10.284414 ], [ 114.263371, 10.239658 ], [ 114.242429, 10.242014 ] ] ], [ [ [ 114.688985, 11.469217 ], [ 114.720398, 11.49209 ], [ 114.737644, 11.463938 ], [ 114.722246, 11.429331 ], [ 114.688985, 11.469217 ] ] ], [ [ [ 116.638433, 10.503977 ], [ 116.699411, 10.517511 ], [ 116.70865, 10.492797 ], [ 116.653215, 10.491031 ], [ 116.638433, 10.503977 ] ] ], [ [ [ 110.459946, 8.116449 ], [ 110.461793, 8.128298 ], [ 110.568351, 8.17273 ], [ 110.599764, 8.156735 ], [ 110.554184, 8.093935 ], [ 110.471032, 8.072012 ], [ 110.459946, 8.116449 ] ] ], [ [ [ 111.463311, 8.52504 ], [ 111.509506, 8.550489 ], [ 111.497187, 8.523857 ], [ 111.463311, 8.52504 ] ] ], [ [ [ 114.493116, 10.717504 ], [ 114.539312, 10.793349 ], [ 114.562717, 10.778064 ], [ 114.513442, 10.722208 ], [ 114.493116, 10.717504 ] ] ], [ [ [ 113.221817, 8.073789 ], [ 113.269861, 8.120004 ], [ 113.283411, 8.111117 ], [ 113.235984, 8.068456 ], [ 113.221817, 8.073789 ] ] ], [ [ [ 115.258113, 8.509652 ], [ 115.296301, 8.510836 ], [ 115.271048, 8.477098 ], [ 115.258113, 8.509652 ] ] ], [ [ [ 111.539071, 7.54432 ], [ 111.566788, 7.606017 ], [ 111.612368, 7.592374 ], [ 111.583419, 7.543134 ], [ 111.542767, 7.524742 ], [ 111.539071, 7.54432 ] ] ], [ [ [ 117.258068, 10.320331 ], [ 117.274698, 10.358011 ], [ 117.299952, 10.343293 ], [ 117.299336, 10.313855 ], [ 117.258068, 10.320331 ] ] ], [ [ [ 114.074893, 10.929118 ], [ 114.096451, 10.947921 ], [ 114.110002, 10.918541 ], [ 114.064422, 10.904437 ], [ 114.074893, 10.929118 ] ] ], [ [ [ 114.212864, 16.040937 ], [ 114.268914, 16.059342 ], [ 114.306487, 16.057616 ], [ 114.31203, 16.034611 ], [ 114.212864, 16.040937 ] ] ], [ [ [ 110.609003, 8.010976 ], [ 110.622553, 8.041199 ], [ 110.641648, 8.031125 ], [ 110.642879, 7.989049 ], [ 110.609003, 8.010976 ] ] ], [ [ [ 115.509416, 8.490712 ], [ 115.514344, 8.519122 ], [ 115.558691, 8.523265 ], [ 115.569162, 8.49012 ], [ 115.55438, 8.461115 ], [ 115.521735, 8.460523 ], [ 115.509416, 8.490712 ] ] ], [ [ [ 111.657947, 8.672974 ], [ 111.697368, 8.67889 ], [ 111.717694, 8.6499 ], [ 111.665955, 8.622683 ], [ 111.657947, 8.672974 ] ] ], [ [ [ 110.460561, 7.799948 ], [ 110.485199, 7.827815 ], [ 110.511684, 7.805878 ], [ 110.487663, 7.783346 ], [ 110.460561, 7.799948 ] ] ], [ [ [ 112.345952, 8.926101 ], [ 112.384756, 8.946793 ], [ 112.392763, 8.919598 ], [ 112.345952, 8.926101 ] ] ], [ [ [ 116.469665, 9.810041 ], [ 116.490607, 9.821246 ], [ 116.50847, 9.79117 ], [ 116.47952, 9.785272 ], [ 116.469665, 9.810041 ] ] ], [ [ [ 111.925265, 8.070827 ], [ 111.95483, 8.106377 ], [ 112.013344, 8.093342 ], [ 112.018888, 8.065494 ], [ 111.994866, 8.047125 ], [ 111.949287, 8.05068 ], [ 111.925265, 8.070827 ] ] ], [ [ [ 114.457392, 15.599305 ], [ 114.491884, 15.59354 ], [ 114.466631, 15.576823 ], [ 114.457392, 15.599305 ] ] ], [ [ [ 114.985252, 11.078332 ], [ 115.021592, 11.085967 ], [ 115.013585, 11.063062 ], [ 114.985252, 11.078332 ] ] ], [ [ [ 114.10569, 16.004124 ], [ 114.132176, 16.007575 ], [ 114.110618, 15.978235 ], [ 114.10569, 16.004124 ] ] ], [ [ [ 116.045283, 10.095338 ], [ 116.070537, 10.12892 ], [ 116.09579, 10.09357 ], [ 116.067457, 10.065876 ], [ 116.045283, 10.095338 ] ] ], [ [ [ 117.266691, 10.69163 ], [ 117.293176, 10.735144 ], [ 117.369553, 10.7422 ], [ 117.418212, 10.702803 ], [ 117.404661, 10.671047 ], [ 117.348611, 10.672811 ], [ 117.266691, 10.69163 ] ] ], [ [ [ 114.854057, 7.244611 ], [ 114.869455, 7.198895 ], [ 114.819564, 7.192957 ], [ 114.854057, 7.244611 ] ] ], [ [ [ 112.823305, 8.910729 ], [ 112.873196, 8.908364 ], [ 112.859645, 8.889444 ], [ 112.823305, 8.910729 ] ] ], [ [ [ 111.670266, 7.651098 ], [ 111.691208, 7.711593 ], [ 111.726317, 7.729977 ], [ 111.749722, 7.703884 ], [ 111.707223, 7.648725 ], [ 111.670266, 7.651098 ] ] ], [ [ [ 112.207981, 8.835634 ], [ 112.241242, 8.852783 ], [ 112.235699, 8.827355 ], [ 112.207981, 8.835634 ] ] ], [ [ [ 112.527654, 5.79444 ], [ 112.562146, 5.820637 ], [ 112.562762, 5.75931 ], [ 112.531965, 5.766455 ], [ 112.527654, 5.79444 ] ] ], [ [ [ 114.599058, 8.846278 ], [ 114.61692, 8.881166 ], [ 114.665579, 8.900087 ], [ 114.68221, 8.881166 ], [ 114.645869, 8.844504 ], [ 114.599058, 8.846278 ] ] ], [ [ [ 114.868223, 7.983715 ], [ 114.883006, 8.011569 ], [ 114.914419, 8.00742 ], [ 114.907643, 7.951117 ], [ 114.868223, 7.983715 ] ] ], [ [ [ 112.945261, 8.410204 ], [ 112.949572, 8.432701 ], [ 112.985297, 8.429149 ], [ 112.945261, 8.410204 ] ] ], [ [ [ 113.600004, 6.961929 ], [ 113.62341, 6.942325 ], [ 113.580294, 6.920344 ], [ 113.600004, 6.961929 ] ] ], [ [ [ 117.347995, 10.090624 ], [ 117.373864, 10.106532 ], [ 117.385567, 10.063519 ], [ 117.354154, 10.06293 ], [ 117.347995, 10.090624 ] ] ], [ [ [ 112.993304, 19.472003 ], [ 112.980369, 19.496263 ], [ 112.993304, 19.52616 ], [ 113.029028, 19.52898 ], [ 113.048123, 19.506417 ], [ 113.038883, 19.480466 ], [ 112.993304, 19.472003 ] ] ], [ [ [ 114.448153, 16.034035 ], [ 114.465399, 16.067393 ], [ 114.521449, 16.056466 ], [ 114.485109, 16.034611 ], [ 114.448153, 16.034035 ] ] ], [ [ [ 113.832213, 19.158552 ], [ 113.799568, 19.19925 ], [ 113.80696, 19.222986 ], [ 113.875945, 19.237113 ], [ 113.920293, 19.223551 ], [ 113.914749, 19.172119 ], [ 113.874097, 19.151203 ], [ 113.832213, 19.158552 ] ] ], [ [ [ 112.650842, 5.106941 ], [ 112.678559, 5.121247 ], [ 112.719211, 5.075944 ], [ 112.682871, 5.048522 ], [ 112.655769, 5.055676 ], [ 112.650842, 5.106941 ] ] ], [ [ [ 111.638853, 7.907254 ], [ 111.651788, 7.932743 ], [ 111.713382, 7.927408 ], [ 111.712766, 7.887099 ], [ 111.665339, 7.887099 ], [ 111.638853, 7.907254 ] ] ], [ [ [ 112.244322, 8.874662 ], [ 112.288669, 8.885896 ], [ 112.281278, 8.855148 ], [ 112.244322, 8.874662 ] ] ], [ [ [ 112.89229, 7.844416 ], [ 112.93171, 7.867537 ], [ 112.929862, 7.827815 ], [ 112.89229, 7.844416 ] ] ], [ [ [ 112.583088, 5.56159 ], [ 112.616349, 5.568737 ], [ 112.642834, 5.489512 ], [ 112.614501, 5.465683 ], [ 112.606494, 5.51751 ], [ 112.583088, 5.56159 ] ] ], [ [ [ 116.695099, 16.345538 ], [ 116.717889, 16.373676 ], [ 116.747454, 16.360469 ], [ 116.738831, 16.303612 ], [ 116.708034, 16.299591 ], [ 116.695099, 16.345538 ] ] ], [ [ [ 112.523342, 5.656289 ], [ 112.528886, 5.687257 ], [ 112.56153, 5.677133 ], [ 112.565842, 5.63068 ], [ 112.5449, 5.616386 ], [ 112.523342, 5.656289 ] ] ], [ [ [ 112.907072, 4.993079 ], [ 112.910768, 5.038388 ], [ 112.952652, 5.047926 ], [ 112.943413, 4.991887 ], [ 112.907072, 4.993079 ] ] ], [ [ [ 115.361591, 13.948985 ], [ 115.377605, 13.968732 ], [ 115.423185, 13.977443 ], [ 115.438583, 13.943757 ], [ 115.397315, 13.92517 ], [ 115.361591, 13.948985 ] ] ], [ [ [ 113.860546, 15.477068 ], [ 113.890112, 15.490909 ], [ 113.893807, 15.463802 ], [ 113.860546, 15.477068 ] ] ], [ [ [ 113.596924, 10.240836 ], [ 113.638192, 10.243192 ], [ 113.617866, 10.22199 ], [ 113.596924, 10.240836 ] ] ], [ [ [ 112.557219, 5.109326 ], [ 112.601567, 5.120055 ], [ 112.610806, 5.091443 ], [ 112.568922, 5.071771 ], [ 112.557219, 5.109326 ] ] ], [ [ [ 112.350263, 5.621747 ], [ 112.385372, 5.643187 ], [ 112.385988, 5.615791 ], [ 112.350263, 5.621747 ] ] ], [ [ [ 112.226459, 16.759147 ], [ 112.211061, 16.795819 ], [ 112.262184, 16.778057 ], [ 112.254177, 16.751698 ], [ 112.226459, 16.759147 ] ] ], [ [ [ 112.233851, 15.69612 ], [ 112.20367, 15.71398 ], [ 112.240626, 15.741055 ], [ 112.25972, 15.734718 ], [ 112.233851, 15.69612 ] ] ], [ [ [ 112.612037, 5.367973 ], [ 112.62374, 5.401935 ], [ 112.690878, 5.406702 ], [ 112.685334, 5.371548 ], [ 112.640371, 5.347715 ], [ 112.612037, 5.367973 ] ] ], [ [ [ 112.472219, 5.73966 ], [ 112.498089, 5.775387 ], [ 112.496857, 5.736683 ], [ 112.472219, 5.73966 ] ] ], [ [ [ 113.217506, 6.306249 ], [ 113.243991, 6.325878 ], [ 113.230441, 6.285429 ], [ 113.217506, 6.306249 ] ] ], [ [ [ 116.152457, 9.579384 ], [ 116.187565, 9.595317 ], [ 116.189413, 9.565221 ], [ 116.152457, 9.579384 ] ] ], [ [ [ 114.948911, 7.508722 ], [ 115.013585, 7.525928 ], [ 115.012353, 7.484988 ], [ 114.960614, 7.484988 ], [ 114.948911, 7.508722 ] ] ], [ [ [ 111.553854, 7.807656 ], [ 111.603745, 7.861608 ], [ 111.619759, 7.840265 ], [ 111.585267, 7.771487 ], [ 111.553854, 7.807656 ] ] ], [ [ [ 113.938771, 15.8355 ], [ 113.9708, 15.83953 ], [ 113.973263, 15.805558 ], [ 113.938771, 15.8355 ] ] ], [ [ [ 114.926122, 16.036911 ], [ 114.910723, 16.001823 ], [ 114.895325, 16.036336 ], [ 114.926122, 16.036911 ] ] ], [ [ [ 116.749302, 9.056736 ], [ 116.740679, 9.028367 ], [ 116.70865, 9.024229 ], [ 116.699411, 9.049053 ], [ 116.749302, 9.056736 ] ] ], [ [ [ 112.64653, 16.385733 ], [ 112.660081, 16.426494 ], [ 112.681639, 16.400661 ], [ 112.64653, 16.385733 ] ] ], [ [ [ 111.203384, 19.92557 ], [ 111.204, 19.926132 ], [ 111.204, 19.92557 ], [ 111.203384, 19.925007 ], [ 111.203384, 19.92557 ] ] ], [ [ [ 115.758256, 10.461018 ], [ 115.801987, 10.463372 ], [ 115.776118, 10.434534 ], [ 115.758256, 10.461018 ] ] ], [ [ [ 112.671784, 16.331755 ], [ 112.677943, 16.35932 ], [ 112.701349, 16.331755 ], [ 112.671784, 16.331755 ] ] ], [ [ [ 115.782277, 10.541046 ], [ 115.805067, 10.524571 ], [ 115.795212, 10.499858 ], [ 115.782277, 10.541046 ] ] ], [ [ [ 112.512255, 9.544566 ], [ 112.567074, 9.554008 ], [ 112.568922, 9.516826 ], [ 112.50856, 9.525679 ], [ 112.512255, 9.544566 ] ] ], [ [ [ 117.21372, 10.735144 ], [ 117.206945, 10.707507 ], [ 117.187235, 10.741612 ], [ 117.21372, 10.735144 ] ] ], [ [ [ 114.610145, 15.649447 ], [ 114.610761, 15.615444 ], [ 114.581195, 15.625242 ], [ 114.610145, 15.649447 ] ] ], [ [ [ 117.299336, 11.077745 ], [ 117.304263, 11.027232 ], [ 117.284553, 11.02547 ], [ 117.264227, 11.063062 ], [ 117.299336, 11.077745 ] ] ], [ [ [ 117.691073, 11.048965 ], [ 117.690457, 11.016658 ], [ 117.655965, 11.024882 ], [ 117.653501, 11.046029 ], [ 117.691073, 11.048965 ] ] ], [ [ [ 114.166668, 9.38459 ], [ 114.194386, 9.391676 ], [ 114.195617, 9.350933 ], [ 114.175291, 9.342075 ], [ 114.166668, 9.38459 ] ] ], [ [ [ 114.714854, 9.736909 ], [ 114.704999, 9.700337 ], [ 114.680978, 9.707416 ], [ 114.693296, 9.741038 ], [ 114.714854, 9.736909 ] ] ], [ [ [ 112.554139, 5.97839 ], [ 112.575697, 5.971247 ], [ 112.553523, 5.942676 ], [ 112.554139, 5.97839 ] ] ] ] } },\n{ \"type\": \"Feature\", \"properties\": { \"adcode\": \"500000\", \"name\": \"重庆市\", \"center\": [ 106.504962, 29.533155 ], \"centroid\": [ 107.883899, 30.067297 ], \"childrenNum\": 38, \"level\": \"province\", \"parent\": { \"adcode\": 100000 }, \"subFeatureIndex\": 21, \"acroutes\": [ 100000 ] }, \"geometry\": { \"type\": \"MultiPolygon\", \"coordinates\": [ [ [ [ 106.37442, 28.525742 ], [ 106.33192, 28.55308 ], [ 106.346703, 28.583565 ], [ 106.304203, 28.64976 ], [ 106.305435, 28.704365 ], [ 106.27279, 28.741103 ], [ 106.267863, 28.779402 ], [ 106.245689, 28.817686 ], [ 106.264783, 28.845997 ], [ 106.206885, 28.904691 ], [ 106.173008, 28.920407 ], [ 106.14837, 28.901548 ], [ 106.101559, 28.898928 ], [ 106.070762, 28.919884 ], [ 106.049204, 28.906263 ], [ 106.040581, 28.955498 ], [ 106.001161, 28.973824 ], [ 105.969132, 28.965971 ], [ 105.910002, 28.920407 ], [ 105.852719, 28.927217 ], [ 105.830546, 28.944501 ], [ 105.797285, 28.936121 ], [ 105.801596, 28.958116 ], [ 105.762176, 28.9911 ], [ 105.766488, 29.013607 ], [ 105.74185, 29.039249 ], [ 105.757865, 29.069068 ], [ 105.728916, 29.1062 ], [ 105.752321, 29.129727 ], [ 105.728916, 29.134432 ], [ 105.703662, 29.176766 ], [ 105.712285, 29.219082 ], [ 105.695039, 29.287482 ], [ 105.647612, 29.253027 ], [ 105.631597, 29.280174 ], [ 105.557684, 29.278608 ], [ 105.521344, 29.264513 ], [ 105.513337, 29.283306 ], [ 105.459134, 29.288526 ], [ 105.465294, 29.322969 ], [ 105.42033, 29.31149 ], [ 105.418482, 29.352185 ], [ 105.441888, 29.400686 ], [ 105.426489, 29.419454 ], [ 105.372903, 29.421018 ], [ 105.387069, 29.455416 ], [ 105.387069, 29.455416 ], [ 105.334099, 29.441345 ], [ 105.337794, 29.459064 ], [ 105.305149, 29.53199 ], [ 105.296526, 29.571035 ], [ 105.332867, 29.592374 ], [ 105.347649, 29.621512 ], [ 105.38091, 29.628275 ], [ 105.419714, 29.688082 ], [ 105.476996, 29.674564 ], [ 105.481924, 29.718232 ], [ 105.529351, 29.707836 ], [ 105.574931, 29.744216 ], [ 105.582938, 29.819013 ], [ 105.610655, 29.837184 ], [ 105.707974, 29.840818 ], [ 105.738771, 29.891159 ], [ 105.717213, 29.893753 ], [ 105.70243, 29.924879 ], [ 105.730763, 29.95755 ], [ 105.723372, 29.975177 ], [ 105.753553, 30.018196 ], [ 105.719677, 30.042548 ], [ 105.687032, 30.038922 ], [ 105.676561, 30.06793 ], [ 105.638988, 30.076216 ], [ 105.642068, 30.101072 ], [ 105.582938, 30.12385 ], [ 105.582938, 30.127474 ], [ 105.580474, 30.129544 ], [ 105.574315, 30.130579 ], [ 105.596489, 30.159043 ], [ 105.536127, 30.152834 ], [ 105.550909, 30.179222 ], [ 105.56138, 30.183878 ], [ 105.642684, 30.186464 ], [ 105.662394, 30.210258 ], [ 105.619894, 30.234045 ], [ 105.624822, 30.275918 ], [ 105.670401, 30.254208 ], [ 105.720292, 30.252657 ], [ 105.720292, 30.252657 ], [ 105.714749, 30.322939 ], [ 105.754785, 30.342567 ], [ 105.760329, 30.384393 ], [ 105.792357, 30.427234 ], [ 105.825618, 30.436006 ], [ 105.84656, 30.410203 ], [ 105.900763, 30.405042 ], [ 105.943263, 30.372002 ], [ 106.031958, 30.373551 ], [ 106.07261, 30.333786 ], [ 106.132972, 30.30279 ], [ 106.132356, 30.323972 ], [ 106.168696, 30.303823 ], [ 106.180399, 30.233011 ], [ 106.232754, 30.185947 ], [ 106.260471, 30.19681 ], [ 106.264167, 30.20974 ], [ 106.296196, 30.205603 ], [ 106.306667, 30.238182 ], [ 106.334384, 30.225772 ], [ 106.349167, 30.24542 ], [ 106.401521, 30.242318 ], [ 106.428623, 30.254725 ], [ 106.43971, 30.308473 ], [ 106.49884, 30.295556 ], [ 106.545035, 30.296589 ], [ 106.560434, 30.31519 ], [ 106.611557, 30.292455 ], [ 106.642354, 30.246454 ], [ 106.612789, 30.235596 ], [ 106.612789, 30.235596 ], [ 106.612173, 30.235596 ], [ 106.612173, 30.235596 ], [ 106.611557, 30.235596 ], [ 106.612173, 30.235596 ], [ 106.611557, 30.235596 ], [ 106.631883, 30.186464 ], [ 106.677462, 30.156974 ], [ 106.672535, 30.122297 ], [ 106.700252, 30.111944 ], [ 106.699636, 30.074145 ], [ 106.724274, 30.058607 ], [ 106.732281, 30.027005 ], [ 106.785252, 30.01716 ], [ 106.825904, 30.03115 ], [ 106.825904, 30.03115 ], [ 106.83699, 30.049801 ], [ 106.862244, 30.033223 ], [ 106.913367, 30.025451 ], [ 106.94478, 30.037367 ], [ 106.976193, 30.083467 ], [ 106.981736, 30.08502 ], [ 107.02054, 30.036849 ], [ 107.053801, 30.043584 ], [ 107.054417, 30.040994 ], [ 107.055649, 30.040476 ], [ 107.058113, 30.043066 ], [ 107.084598, 30.063786 ], [ 107.080286, 30.094341 ], [ 107.103076, 30.090198 ], [ 107.221337, 30.213878 ], [ 107.257677, 30.267131 ], [ 107.288474, 30.337402 ], [ 107.338981, 30.386459 ], [ 107.368546, 30.468508 ], [ 107.408582, 30.521623 ], [ 107.443075, 30.53348 ], [ 107.427676, 30.547397 ], [ 107.485575, 30.598408 ], [ 107.516987, 30.644759 ], [ 107.477567, 30.664837 ], [ 107.458473, 30.704981 ], [ 107.424597, 30.74048 ], [ 107.454162, 30.771851 ], [ 107.454162, 30.771851 ], [ 107.498509, 30.809381 ], [ 107.483111, 30.838675 ], [ 107.515756, 30.854603 ], [ 107.57735, 30.847924 ], [ 107.645103, 30.821202 ], [ 107.693146, 30.875665 ], [ 107.739957, 30.884396 ], [ 107.760899, 30.862823 ], [ 107.763979, 30.817091 ], [ 107.788001, 30.81966 ], [ 107.851443, 30.792931 ], [ 107.956152, 30.882855 ], [ 107.994956, 30.908533 ], [ 107.948145, 30.918802 ], [ 107.942602, 30.989114 ], [ 107.983254, 30.983983 ], [ 108.00358, 31.025533 ], [ 108.060246, 31.052197 ], [ 108.026985, 31.061938 ], [ 108.009123, 31.109602 ], [ 108.025753, 31.116263 ], [ 108.089811, 31.204859 ], [ 108.07626, 31.231985 ], [ 108.031297, 31.217144 ], [ 108.038688, 31.252964 ], [ 108.095354, 31.268311 ], [ 108.185898, 31.336831 ], [ 108.153869, 31.371073 ], [ 108.216079, 31.41041 ], [ 108.224086, 31.464024 ], [ 108.193289, 31.467598 ], [ 108.191441, 31.492096 ], [ 108.233941, 31.506894 ], [ 108.254883, 31.49873 ], [ 108.344194, 31.512506 ], [ 108.34789, 31.545664 ], [ 108.386078, 31.544134 ], [ 108.390389, 31.591555 ], [ 108.442744, 31.633856 ], [ 108.468614, 31.636404 ], [ 108.519121, 31.665952 ], [ 108.546838, 31.665442 ], [ 108.514809, 31.693963 ], [ 108.50557, 31.734182 ], [ 108.535135, 31.757592 ], [ 108.462454, 31.780488 ], [ 108.455063, 31.814059 ], [ 108.429194, 31.809482 ], [ 108.391005, 31.829822 ], [ 108.386078, 31.854226 ], [ 108.343578, 31.860834 ], [ 108.259194, 31.967006 ], [ 108.307238, 31.997463 ], [ 108.351585, 31.971575 ], [ 108.370063, 31.988835 ], [ 108.329411, 32.020299 ], [ 108.362056, 32.035521 ], [ 108.344194, 32.067477 ], [ 108.372527, 32.077112 ], [ 108.42981, 32.061391 ], [ 108.452599, 32.090296 ], [ 108.399628, 32.147065 ], [ 108.379303, 32.153652 ], [ 108.379303, 32.153652 ], [ 108.379918, 32.154158 ], [ 108.379918, 32.154158 ], [ 108.370063, 32.172397 ], [ 108.399013, 32.194176 ], [ 108.480317, 32.182527 ], [ 108.509882, 32.201266 ], [ 108.543758, 32.177969 ], [ 108.585026, 32.17189 ], [ 108.676801, 32.10297 ], [ 108.734084, 32.106519 ], [ 108.75133, 32.076098 ], [ 108.78767, 32.04871 ], [ 108.837561, 32.039072 ], [ 108.902235, 31.984774 ], [ 108.986619, 31.980205 ], [ 109.085785, 31.929428 ], [ 109.123357, 31.892851 ], [ 109.191111, 31.85575 ], [ 109.195422, 31.817618 ], [ 109.27611, 31.79931 ], [ 109.279806, 31.776418 ], [ 109.253936, 31.759628 ], [ 109.282885, 31.743343 ], [ 109.281654, 31.716874 ], [ 109.381436, 31.705165 ], [ 109.446109, 31.722983 ], [ 109.502776, 31.716365 ], [ 109.549587, 31.73011 ], [ 109.585928, 31.726546 ], [ 109.622268, 31.711783 ], [ 109.683246, 31.719929 ], [ 109.731289, 31.700582 ], [ 109.737449, 31.628761 ], [ 109.76455, 31.602769 ], [ 109.745456, 31.598182 ], [ 109.727594, 31.548214 ], [ 109.837847, 31.555354 ], [ 109.894513, 31.519139 ], [ 109.969658, 31.508935 ], [ 109.94502, 31.47066 ], [ 109.98752, 31.474744 ], [ 110.036795, 31.436966 ], [ 110.054042, 31.410921 ], [ 110.118715, 31.409899 ], [ 110.161831, 31.314338 ], [ 110.155671, 31.279564 ], [ 110.180309, 31.179774 ], [ 110.200019, 31.158779 ], [ 110.180309, 31.121899 ], [ 110.147048, 31.116776 ], [ 110.119947, 31.088592 ], [ 110.120563, 31.0322 ], [ 110.140273, 31.030661 ], [ 110.140889, 30.987062 ], [ 110.172918, 30.978853 ], [ 110.153824, 30.953708 ], [ 110.151976, 30.911613 ], [ 110.082375, 30.799614 ], [ 110.048498, 30.800642 ], [ 110.019549, 30.829425 ], [ 110.008462, 30.883369 ], [ 109.943788, 30.878746 ], [ 109.894513, 30.899803 ], [ 109.828608, 30.864364 ], [ 109.780564, 30.848437 ], [ 109.701724, 30.783677 ], [ 109.656761, 30.760538 ], [ 109.661072, 30.738936 ], [ 109.625348, 30.702923 ], [ 109.590855, 30.69366 ], [ 109.574225, 30.646818 ], [ 109.543428, 30.63961 ], [ 109.535421, 30.664837 ], [ 109.435638, 30.595832 ], [ 109.418392, 30.559766 ], [ 109.35495, 30.487076 ], [ 109.337088, 30.521623 ], [ 109.36111, 30.551004 ], [ 109.314298, 30.599953 ], [ 109.299516, 30.630341 ], [ 109.245313, 30.580892 ], [ 109.191726, 30.545851 ], [ 109.191726, 30.545851 ], [ 109.143683, 30.521108 ], [ 109.103647, 30.565949 ], [ 109.106111, 30.570587 ], [ 109.101183, 30.579346 ], [ 109.102415, 30.580377 ], [ 109.105495, 30.585529 ], [ 109.106111, 30.61077 ], [ 109.111654, 30.646303 ], [ 109.071002, 30.640125 ], [ 109.042669, 30.655571 ], [ 109.006329, 30.626736 ], [ 108.971836, 30.627766 ], [ 108.893612, 30.565434 ], [ 108.838793, 30.503062 ], [ 108.808612, 30.491202 ], [ 108.789518, 30.513374 ], [ 108.743939, 30.494812 ], [ 108.698975, 30.54482 ], [ 108.688504, 30.58759 ], [ 108.642925, 30.578831 ], [ 108.6497, 30.53915 ], [ 108.56778, 30.468508 ], [ 108.556077, 30.487592 ], [ 108.512961, 30.501515 ], [ 108.472925, 30.487076 ], [ 108.42673, 30.492233 ], [ 108.411331, 30.438586 ], [ 108.430425, 30.416397 ], [ 108.402092, 30.376649 ], [ 108.431041, 30.354446 ], [ 108.460606, 30.35961 ], [ 108.501258, 30.314673 ], [ 108.524048, 30.309506 ], [ 108.54499, 30.269716 ], [ 108.581947, 30.255759 ], [ 108.551766, 30.1637 ], [ 108.56778, 30.157491 ], [ 108.546222, 30.104178 ], [ 108.513577, 30.057571 ], [ 108.532055, 30.051873 ], [ 108.536367, 29.983472 ], [ 108.517889, 29.9394 ], [ 108.516041, 29.885451 ], [ 108.467998, 29.864175 ], [ 108.433505, 29.880262 ], [ 108.371295, 29.841337 ], [ 108.424266, 29.815897 ], [ 108.422418, 29.772791 ], [ 108.442744, 29.778505 ], [ 108.437201, 29.741098 ], [ 108.460606, 29.741098 ], [ 108.504338, 29.707836 ], [ 108.504954, 29.728626 ], [ 108.548686, 29.749412 ], [ 108.52528, 29.770713 ], [ 108.556077, 29.818493 ], [ 108.601041, 29.863656 ], [ 108.658939, 29.854833 ], [ 108.680497, 29.800319 ], [ 108.676801, 29.749412 ], [ 108.690968, 29.689642 ], [ 108.752562, 29.649082 ], [ 108.786438, 29.691721 ], [ 108.797525, 29.660003 ], [ 108.781511, 29.635558 ], [ 108.844337, 29.658443 ], [ 108.888068, 29.628795 ], [ 108.870206, 29.596537 ], [ 108.901003, 29.604863 ], [ 108.913322, 29.574679 ], [ 108.878213, 29.539279 ], [ 108.888684, 29.502305 ], [ 108.866511, 29.470527 ], [ 108.884373, 29.440824 ], [ 108.927488, 29.435612 ], [ 108.934264, 29.399643 ], [ 108.919481, 29.3261 ], [ 108.983539, 29.332883 ], [ 108.999553, 29.36366 ], [ 109.034662, 29.360531 ], [ 109.060531, 29.403292 ], [ 109.11227, 29.361053 ], [ 109.106727, 29.288526 ], [ 109.141835, 29.270256 ], [ 109.110422, 29.21647 ], [ 109.139372, 29.168927 ], [ 109.162777, 29.180946 ], [ 109.215748, 29.145409 ], [ 109.232378, 29.119271 ], [ 109.240386, 29.086328 ], [ 109.312451, 29.066453 ], [ 109.319842, 29.042388 ], [ 109.294588, 29.015177 ], [ 109.292741, 28.987436 ], [ 109.261328, 28.952356 ], [ 109.235458, 28.882161 ], [ 109.246545, 28.80143 ], [ 109.241002, 28.776779 ], [ 109.2989, 28.7474 ], [ 109.294588, 28.722211 ], [ 109.252704, 28.691767 ], [ 109.271183, 28.671816 ], [ 109.192958, 28.636104 ], [ 109.201581, 28.597753 ], [ 109.235458, 28.61982 ], [ 109.252089, 28.606685 ], [ 109.306907, 28.62087 ], [ 109.319842, 28.579886 ], [ 109.273646, 28.53836 ], [ 109.274262, 28.494714 ], [ 109.23361, 28.474726 ], [ 109.191726, 28.471043 ], [ 109.153538, 28.417369 ], [ 109.152306, 28.349975 ], [ 109.117198, 28.277795 ], [ 109.081473, 28.247749 ], [ 109.101799, 28.202401 ], [ 109.086401, 28.184467 ], [ 109.026655, 28.220331 ], [ 109.005713, 28.162837 ], [ 108.929952, 28.19027 ], [ 108.923793, 28.217167 ], [ 108.89546, 28.219804 ], [ 108.855424, 28.199764 ], [ 108.821547, 28.245113 ], [ 108.772888, 28.212949 ], [ 108.738395, 28.228241 ], [ 108.726692, 28.282011 ], [ 108.761801, 28.304143 ], [ 108.783359, 28.380518 ], [ 108.759953, 28.389995 ], [ 108.780279, 28.42579 ], [ 108.746402, 28.45105 ], [ 108.709446, 28.501026 ], [ 108.700207, 28.48209 ], [ 108.657091, 28.47683 ], [ 108.640461, 28.456838 ], [ 108.688504, 28.422106 ], [ 108.697127, 28.401051 ], [ 108.656475, 28.359981 ], [ 108.667562, 28.334173 ], [ 108.611512, 28.324691 ], [ 108.580099, 28.343128 ], [ 108.576403, 28.38631 ], [ 108.609048, 28.407368 ], [ 108.609664, 28.43579 ], [ 108.586874, 28.463678 ], [ 108.573939, 28.531 ], [ 108.610896, 28.539412 ], [ 108.604736, 28.590922 ], [ 108.636149, 28.621396 ], [ 108.575787, 28.659738 ], [ 108.50249, 28.63768 ], [ 108.501258, 28.626649 ], [ 108.439049, 28.634003 ], [ 108.332491, 28.679166 ], [ 108.347274, 28.736381 ], [ 108.385462, 28.772058 ], [ 108.386078, 28.803003 ], [ 108.352817, 28.815589 ], [ 108.346658, 28.859625 ], [ 108.357745, 28.893165 ], [ 108.345426, 28.943453 ], [ 108.319556, 28.961258 ], [ 108.297999, 29.045527 ], [ 108.306622, 29.079006 ], [ 108.277673, 29.091558 ], [ 108.256115, 29.040295 ], [ 108.193289, 29.072207 ], [ 108.150173, 29.053375 ], [ 108.070717, 29.086328 ], [ 108.026369, 29.039772 ], [ 107.925971, 29.032446 ], [ 107.908725, 29.007327 ], [ 107.882855, 29.00628 ], [ 107.867457, 28.960211 ], [ 107.810175, 28.984295 ], [ 107.823725, 29.034016 ], [ 107.784921, 29.048143 ], [ 107.810791, 29.139137 ], [ 107.749197, 29.199754 ], [ 107.700537, 29.141228 ], [ 107.659885, 29.162656 ], [ 107.605683, 29.164747 ], [ 107.589052, 29.150113 ], [ 107.570574, 29.218037 ], [ 107.486806, 29.174153 ], [ 107.441227, 29.203934 ], [ 107.401807, 29.184603 ], [ 107.408582, 29.138091 ], [ 107.427676, 29.128682 ], [ 107.412278, 29.094696 ], [ 107.369778, 29.091558 ], [ 107.395647, 29.041341 ], [ 107.364235, 29.00942 ], [ 107.396879, 28.993718 ], [ 107.412894, 28.960211 ], [ 107.441227, 28.943977 ], [ 107.41351, 28.911502 ], [ 107.383945, 28.848618 ], [ 107.339597, 28.845997 ], [ 107.327894, 28.810869 ], [ 107.261373, 28.792514 ], [ 107.24659, 28.76209 ], [ 107.219489, 28.772582 ], [ 107.210866, 28.817686 ], [ 107.227496, 28.836037 ], [ 107.194851, 28.838134 ], [ 107.206554, 28.868535 ], [ 107.14188, 28.887925 ], [ 107.016229, 28.882685 ], [ 107.019308, 28.861722 ], [ 106.983584, 28.851239 ], [ 106.988512, 28.776254 ], [ 106.951555, 28.766812 ], [ 106.923222, 28.809821 ], [ 106.872099, 28.777304 ], [ 106.845614, 28.780975 ], [ 106.824056, 28.756319 ], [ 106.86594, 28.690192 ], [ 106.889345, 28.695966 ], [ 106.866556, 28.624548 ], [ 106.830831, 28.623497 ], [ 106.807425, 28.589346 ], [ 106.784636, 28.626649 ], [ 106.756918, 28.607211 ], [ 106.77786, 28.563068 ], [ 106.73844, 28.554657 ], [ 106.726121, 28.51838 ], [ 106.747063, 28.467361 ], [ 106.708259, 28.450524 ], [ 106.697788, 28.47683 ], [ 106.632499, 28.503655 ], [ 106.564745, 28.485247 ], [ 106.567825, 28.523638 ], [ 106.615252, 28.549401 ], [ 106.606629, 28.593024 ], [ 106.63681, 28.622972 ], [ 106.618332, 28.645033 ], [ 106.651593, 28.649235 ], [ 106.617716, 28.66709 ], [ 106.6171, 28.691242 ], [ 106.587535, 28.691767 ], [ 106.56105, 28.719062 ], [ 106.561666, 28.756319 ], [ 106.474202, 28.832891 ], [ 106.45326, 28.817162 ], [ 106.461883, 28.761041 ], [ 106.492064, 28.742153 ], [ 106.528405, 28.677591 ], [ 106.502535, 28.661313 ], [ 106.49268, 28.591448 ], [ 106.466811, 28.586193 ], [ 106.504999, 28.544669 ], [ 106.477282, 28.530474 ], [ 106.403369, 28.569901 ], [ 106.37442, 28.525742 ] ] ], [ [ [ 109.105495, 30.585529 ], [ 109.102415, 30.580377 ], [ 109.101183, 30.579346 ], [ 109.09872, 30.579346 ], [ 109.09256, 30.578831 ], [ 109.106111, 30.61077 ], [ 109.105495, 30.585529 ] ] ], [ [ [ 105.582938, 30.12385 ], [ 105.574315, 30.130579 ], [ 105.580474, 30.129544 ], [ 105.582938, 30.127474 ], [ 105.582938, 30.12385 ] ] ], [ [ [ 109.09872, 30.579346 ], [ 109.106111, 30.570587 ], [ 109.103647, 30.565949 ], [ 109.09256, 30.578831 ], [ 109.09872, 30.579346 ] ] ], [ [ [ 107.058113, 30.043066 ], [ 107.055649, 30.040476 ], [ 107.054417, 30.040994 ], [ 107.053801, 30.043584 ], [ 107.058113, 30.043066 ] ] ] ] } },\n{ \"type\": \"Feature\", \"properties\": { \"adcode\": \"510000\", \"name\": \"四川省\", \"center\": [ 104.065735, 30.659462 ], \"centroid\": [ 102.693453, 30.674545 ], \"childrenNum\": 21, \"level\": \"province\", \"parent\": { \"adcode\": 100000 }, \"subFeatureIndex\": 22, \"acroutes\": [ 100000 ] }, \"geometry\": { \"type\": \"MultiPolygon\", \"coordinates\": [ [ [ [ 101.167885, 27.198311 ], [ 101.167885, 27.198311 ], [ 101.119226, 27.208957 ], [ 101.071798, 27.194585 ], [ 101.042233, 27.22173 ], [ 101.026219, 27.270679 ], [ 101.021907, 27.332899 ], [ 100.95169, 27.426961 ], [ 100.936908, 27.469448 ], [ 100.901183, 27.453517 ], [ 100.91227, 27.521473 ], [ 100.854988, 27.623858 ], [ 100.827886, 27.615904 ], [ 100.848212, 27.672099 ], [ 100.782307, 27.691708 ], [ 100.775532, 27.743098 ], [ 100.757053, 27.770107 ], [ 100.707162, 27.800816 ], [ 100.719481, 27.858503 ], [ 100.681293, 27.923035 ], [ 100.634482, 27.915631 ], [ 100.609228, 27.859033 ], [ 100.54517, 27.809286 ], [ 100.511294, 27.827811 ], [ 100.504518, 27.852154 ], [ 100.442924, 27.86644 ], [ 100.412127, 27.816167 ], [ 100.350534, 27.755809 ], [ 100.327744, 27.72032 ], [ 100.311729, 27.724028 ], [ 100.304954, 27.788639 ], [ 100.28586, 27.80611 ], [ 100.30865, 27.830457 ], [ 100.30865, 27.861149 ], [ 100.210715, 27.87702 ], [ 100.170063, 27.907699 ], [ 100.196549, 27.936254 ], [ 100.120788, 28.018703 ], [ 100.088759, 28.029269 ], [ 100.05673, 28.097922 ], [ 100.021006, 28.147008 ], [ 100.033325, 28.184467 ], [ 100.062274, 28.193962 ], [ 100.091223, 28.181302 ], [ 100.102926, 28.201873 ], [ 100.153433, 28.208202 ], [ 100.188541, 28.252493 ], [ 100.147274, 28.288862 ], [ 100.176223, 28.325218 ], [ 100.136803, 28.349975 ], [ 100.057346, 28.368934 ], [ 100.073977, 28.426317 ], [ 99.990209, 28.47683 ], [ 99.985281, 28.529422 ], [ 99.91876, 28.599329 ], [ 99.875644, 28.611939 ], [ 99.873181, 28.631902 ], [ 99.834376, 28.628225 ], [ 99.834992, 28.660788 ], [ 99.79434, 28.699116 ], [ 99.755536, 28.701216 ], [ 99.722275, 28.757369 ], [ 99.717964, 28.846521 ], [ 99.676696, 28.810345 ], [ 99.625573, 28.81454 ], [ 99.609559, 28.784122 ], [ 99.614486, 28.740054 ], [ 99.553508, 28.710664 ], [ 99.53195, 28.677591 ], [ 99.540573, 28.623497 ], [ 99.504233, 28.619294 ], [ 99.466045, 28.579886 ], [ 99.463581, 28.549401 ], [ 99.403219, 28.546246 ], [ 99.396444, 28.491032 ], [ 99.426625, 28.454207 ], [ 99.404451, 28.44421 ], [ 99.437095, 28.398419 ], [ 99.392748, 28.318369 ], [ 99.412458, 28.295186 ], [ 99.374886, 28.18183 ], [ 99.306516, 28.227714 ], [ 99.28927, 28.286227 ], [ 99.237531, 28.317842 ], [ 99.229524, 28.350502 ], [ 99.200575, 28.365774 ], [ 99.16485, 28.425264 ], [ 99.187024, 28.44 ], [ 99.191952, 28.494714 ], [ 99.170394, 28.566221 ], [ 99.183944, 28.58882 ], [ 99.147604, 28.640831 ], [ 99.126662, 28.698066 ], [ 99.134053, 28.734806 ], [ 99.114343, 28.765763 ], [ 99.103872, 28.841803 ], [ 99.123582, 28.890021 ], [ 99.132206, 28.94869 ], [ 99.113727, 29.07273 ], [ 99.118039, 29.100971 ], [ 99.105104, 29.162656 ], [ 99.113727, 29.221171 ], [ 99.114343, 29.243628 ], [ 99.075539, 29.316186 ], [ 99.058909, 29.417368 ], [ 99.066916, 29.421018 ], [ 99.044742, 29.520013 ], [ 99.052133, 29.563748 ], [ 99.014561, 29.607464 ], [ 98.992387, 29.677163 ], [ 99.018873, 29.792009 ], [ 99.0238, 29.846009 ], [ 99.068148, 29.931621 ], [ 99.055213, 29.958587 ], [ 99.036735, 30.053945 ], [ 99.044742, 30.079842 ], [ 98.989308, 30.151799 ], [ 98.9813, 30.182843 ], [ 98.993003, 30.215429 ], [ 98.970829, 30.260928 ], [ 98.986844, 30.280569 ], [ 98.967134, 30.33482 ], [ 98.965286, 30.449937 ], [ 98.932025, 30.521623 ], [ 98.926482, 30.569556 ], [ 98.939417, 30.598923 ], [ 98.92217, 30.609225 ], [ 98.907388, 30.698292 ], [ 98.963438, 30.728134 ], [ 98.957895, 30.765166 ], [ 98.904924, 30.782649 ], [ 98.850105, 30.849465 ], [ 98.797135, 30.87926 ], [ 98.774345, 30.908019 ], [ 98.797135, 30.948575 ], [ 98.806374, 30.995783 ], [ 98.774961, 31.031174 ], [ 98.736772, 31.049121 ], [ 98.712135, 31.082954 ], [ 98.710287, 31.1178 ], [ 98.675179, 31.15417 ], [ 98.602498, 31.192062 ], [ 98.62344, 31.221238 ], [ 98.60373, 31.257568 ], [ 98.616048, 31.3036 ], [ 98.643766, 31.338876 ], [ 98.691809, 31.333253 ], [ 98.773113, 31.249382 ], [ 98.805758, 31.279052 ], [ 98.810685, 31.306668 ], [ 98.887062, 31.37465 ], [ 98.84333, 31.416028 ], [ 98.844562, 31.429817 ], [ 98.714599, 31.508935 ], [ 98.696736, 31.538523 ], [ 98.651157, 31.57881 ], [ 98.619128, 31.591555 ], [ 98.553839, 31.660349 ], [ 98.545831, 31.717383 ], [ 98.516882, 31.717383 ], [ 98.508875, 31.751995 ], [ 98.461448, 31.800327 ], [ 98.414636, 31.832365 ], [ 98.426339, 31.856767 ], [ 98.399238, 31.895899 ], [ 98.432498, 31.922825 ], [ 98.434962, 32.007613 ], [ 98.402933, 32.026896 ], [ 98.404781, 32.045159 ], [ 98.357354, 32.087253 ], [ 98.303151, 32.121726 ], [ 98.260035, 32.208862 ], [ 98.218768, 32.234683 ], [ 98.23047, 32.262521 ], [ 98.208913, 32.318171 ], [ 98.218768, 32.342444 ], [ 98.125145, 32.401077 ], [ 98.107283, 32.391476 ], [ 98.079565, 32.415224 ], [ 97.940363, 32.482393 ], [ 97.880001, 32.486431 ], [ 97.863986, 32.499051 ], [ 97.80732, 32.50006 ], [ 97.795617, 32.521257 ], [ 97.730944, 32.527312 ], [ 97.700763, 32.53488 ], [ 97.616995, 32.586329 ], [ 97.607756, 32.614059 ], [ 97.543698, 32.62162 ], [ 97.535075, 32.638252 ], [ 97.48272, 32.654377 ], [ 97.42359, 32.70475 ], [ 97.429133, 32.714318 ], [ 97.386018, 32.77925 ], [ 97.392793, 32.828546 ], [ 97.376163, 32.886359 ], [ 97.347829, 32.895907 ], [ 97.375547, 32.956689 ], [ 97.438372, 32.976271 ], [ 97.523988, 32.988822 ], [ 97.499966, 33.011408 ], [ 97.542466, 33.035995 ], [ 97.517213, 33.097683 ], [ 97.487032, 33.107209 ], [ 97.498119, 33.137783 ], [ 97.487648, 33.168346 ], [ 97.548626, 33.203907 ], [ 97.607756, 33.263976 ], [ 97.622538, 33.337005 ], [ 97.676125, 33.341004 ], [ 97.754349, 33.409972 ], [ 97.674893, 33.432949 ], [ 97.625618, 33.461412 ], [ 97.552321, 33.465906 ], [ 97.511669, 33.520805 ], [ 97.523372, 33.577166 ], [ 97.450075, 33.582152 ], [ 97.415583, 33.605582 ], [ 97.435293, 33.682307 ], [ 97.418046, 33.728608 ], [ 97.422974, 33.754984 ], [ 97.406344, 33.795278 ], [ 97.373083, 33.817655 ], [ 97.371851, 33.842015 ], [ 97.398336, 33.848477 ], [ 97.395257, 33.889224 ], [ 97.460546, 33.887236 ], [ 97.503662, 33.912073 ], [ 97.52214, 33.903133 ], [ 97.601596, 33.929951 ], [ 97.629314, 33.919523 ], [ 97.660111, 33.956264 ], [ 97.652719, 33.998448 ], [ 97.70261, 34.036644 ], [ 97.665654, 34.126855 ], [ 97.766668, 34.158555 ], [ 97.789458, 34.182818 ], [ 97.789458, 34.182818 ], [ 97.796849, 34.199154 ], [ 97.796849, 34.199154 ], [ 97.898479, 34.209548 ], [ 97.95453, 34.190739 ], [ 98.051848, 34.11546 ], [ 98.098043, 34.122892 ], [ 98.157174, 34.107532 ], [ 98.206449, 34.08424 ], [ 98.258188, 34.083249 ], [ 98.344419, 34.094648 ], [ 98.392462, 34.089196 ], [ 98.396774, 34.053008 ], [ 98.428187, 34.029204 ], [ 98.440506, 33.981577 ], [ 98.415252, 33.956761 ], [ 98.425723, 33.913066 ], [ 98.407245, 33.867362 ], [ 98.434962, 33.843009 ], [ 98.463295, 33.848477 ], [ 98.492861, 33.796272 ], [ 98.494092, 33.768915 ], [ 98.51873, 33.77389 ], [ 98.537824, 33.74752 ], [ 98.582788, 33.731595 ], [ 98.610505, 33.682805 ], [ 98.6567, 33.64744 ], [ 98.61728, 33.637476 ], [ 98.622824, 33.610067 ], [ 98.652389, 33.595114 ], [ 98.648077, 33.548741 ], [ 98.678258, 33.522801 ], [ 98.725686, 33.503341 ], [ 98.742316, 33.477887 ], [ 98.736157, 33.406975 ], [ 98.779888, 33.370497 ], [ 98.759562, 33.276985 ], [ 98.802062, 33.270481 ], [ 98.804526, 33.219428 ], [ 98.858728, 33.150811 ], [ 98.92217, 33.118738 ], [ 98.967134, 33.115229 ], [ 98.971445, 33.098185 ], [ 99.014561, 33.081137 ], [ 99.024416, 33.094675 ], [ 99.090322, 33.079131 ], [ 99.124814, 33.046028 ], [ 99.196263, 33.035493 ], [ 99.214741, 32.991332 ], [ 99.235067, 32.982296 ], [ 99.24677, 32.924043 ], [ 99.268944, 32.878318 ], [ 99.353944, 32.885354 ], [ 99.376118, 32.899927 ], [ 99.45311, 32.862233 ], [ 99.558436, 32.839106 ], [ 99.589233, 32.789312 ], [ 99.640355, 32.790822 ], [ 99.646515, 32.774721 ], [ 99.705029, 32.76516 ], [ 99.717964, 32.732443 ], [ 99.760464, 32.769689 ], [ 99.766623, 32.826032 ], [ 99.791877, 32.883344 ], [ 99.764159, 32.924545 ], [ 99.788181, 32.956689 ], [ 99.805427, 32.940619 ], [ 99.851007, 32.941623 ], [ 99.877492, 32.993339 ], [ 99.877492, 33.045527 ], [ 99.947709, 32.986814 ], [ 99.956332, 32.948152 ], [ 100.038252, 32.929066 ], [ 100.029629, 32.895907 ], [ 100.064738, 32.895907 ], [ 100.123252, 32.837095 ], [ 100.117093, 32.802392 ], [ 100.139266, 32.724388 ], [ 100.088143, 32.668988 ], [ 100.109701, 32.640268 ], [ 100.189773, 32.630692 ], [ 100.208252, 32.606497 ], [ 100.229809, 32.650346 ], [ 100.231041, 32.696189 ], [ 100.258759, 32.742511 ], [ 100.339447, 32.719353 ], [ 100.399193, 32.756101 ], [ 100.378251, 32.698707 ], [ 100.420135, 32.73194 ], [ 100.450932, 32.694678 ], [ 100.470026, 32.694678 ], [ 100.516837, 32.632204 ], [ 100.54517, 32.569687 ], [ 100.603069, 32.553547 ], [ 100.645568, 32.526303 ], [ 100.657887, 32.546484 ], [ 100.661583, 32.616075 ], [ 100.673286, 32.628172 ], [ 100.710242, 32.610026 ], [ 100.71209, 32.645307 ], [ 100.690532, 32.678056 ], [ 100.77122, 32.643795 ], [ 100.834046, 32.648835 ], [ 100.887633, 32.632708 ], [ 100.93198, 32.600447 ], [ 100.956618, 32.621116 ], [ 100.99727, 32.627668 ], [ 101.030531, 32.660424 ], [ 101.077342, 32.68259 ], [ 101.124769, 32.658408 ], [ 101.157414, 32.661431 ], [ 101.22332, 32.725898 ], [ 101.237486, 32.825026 ], [ 101.223935, 32.855698 ], [ 101.178356, 32.892892 ], [ 101.124153, 32.909976 ], [ 101.134624, 32.95217 ], [ 101.129081, 32.989324 ], [ 101.183899, 32.984304 ], [ 101.171581, 33.009902 ], [ 101.184515, 33.041514 ], [ 101.146327, 33.056563 ], [ 101.143863, 33.086151 ], [ 101.169733, 33.10019 ], [ 101.11553, 33.194893 ], [ 101.124769, 33.221431 ], [ 101.156798, 33.236449 ], [ 101.182668, 33.26948 ], [ 101.217776, 33.256469 ], [ 101.297232, 33.262475 ], [ 101.381616, 33.153316 ], [ 101.393935, 33.157826 ], [ 101.386543, 33.207412 ], [ 101.403174, 33.225436 ], [ 101.487557, 33.226938 ], [ 101.515275, 33.192889 ], [ 101.557775, 33.167344 ], [ 101.633535, 33.101193 ], [ 101.661252, 33.135778 ], [ 101.653861, 33.162835 ], [ 101.709912, 33.21292 ], [ 101.735781, 33.279987 ], [ 101.677883, 33.297497 ], [ 101.64955, 33.323004 ], [ 101.663716, 33.383991 ], [ 101.695745, 33.433948 ], [ 101.769042, 33.45592 ], [ 101.777665, 33.533776 ], [ 101.769042, 33.538765 ], [ 101.783208, 33.556721 ], [ 101.831252, 33.554726 ], [ 101.844186, 33.602591 ], [ 101.884222, 33.578163 ], [ 101.907012, 33.539264 ], [ 101.906396, 33.48188 ], [ 101.946432, 33.442937 ], [ 101.915635, 33.425957 ], [ 101.887302, 33.383991 ], [ 101.877447, 33.314502 ], [ 101.769658, 33.26898 ], [ 101.770274, 33.248962 ], [ 101.83002, 33.213921 ], [ 101.841723, 33.184876 ], [ 101.825708, 33.119239 ], [ 101.865744, 33.103198 ], [ 101.887302, 33.135778 ], [ 101.921795, 33.153817 ], [ 101.935345, 33.186879 ], [ 101.99386, 33.1999 ], [ 102.054838, 33.189884 ], [ 102.08933, 33.204908 ], [ 102.08933, 33.227439 ], [ 102.117047, 33.288492 ], [ 102.144765, 33.273983 ], [ 102.160163, 33.242956 ], [ 102.200815, 33.223434 ], [ 102.217446, 33.247961 ], [ 102.192192, 33.337005 ], [ 102.218062, 33.349503 ], [ 102.258098, 33.409472 ], [ 102.296286, 33.413969 ], [ 102.310452, 33.397982 ], [ 102.368967, 33.41247 ], [ 102.392988, 33.404477 ], [ 102.447807, 33.454922 ], [ 102.462589, 33.449429 ], [ 102.461358, 33.501345 ], [ 102.446575, 33.53228 ], [ 102.477988, 33.543254 ], [ 102.440416, 33.574673 ], [ 102.346793, 33.605582 ], [ 102.31538, 33.665374 ], [ 102.342481, 33.725622 ], [ 102.284583, 33.719151 ], [ 102.324619, 33.754486 ], [ 102.296286, 33.783838 ], [ 102.243315, 33.786823 ], [ 102.261177, 33.821136 ], [ 102.25317, 33.861399 ], [ 102.136142, 33.965199 ], [ 102.16817, 33.983066 ], [ 102.226069, 33.963214 ], [ 102.248858, 33.98654 ], [ 102.287047, 33.977607 ], [ 102.315996, 33.993983 ], [ 102.345561, 33.969666 ], [ 102.392372, 33.971651 ], [ 102.406539, 34.033172 ], [ 102.437336, 34.087214 ], [ 102.471213, 34.072839 ], [ 102.511865, 34.086222 ], [ 102.615958, 34.099604 ], [ 102.649219, 34.080275 ], [ 102.655994, 34.113478 ], [ 102.598712, 34.14766 ], [ 102.651067, 34.165983 ], [ 102.664002, 34.192719 ], [ 102.694799, 34.198659 ], [ 102.728675, 34.235774 ], [ 102.779798, 34.236764 ], [ 102.798276, 34.272874 ], [ 102.856791, 34.270895 ], [ 102.85987, 34.301058 ], [ 102.911609, 34.312923 ], [ 102.949181, 34.292159 ], [ 102.977515, 34.252595 ], [ 102.973203, 34.205588 ], [ 103.005848, 34.184798 ], [ 103.052043, 34.195194 ], [ 103.100087, 34.181828 ], [ 103.124108, 34.162022 ], [ 103.121644, 34.112487 ], [ 103.178927, 34.079779 ], [ 103.129652, 34.065899 ], [ 103.119797, 34.03466 ], [ 103.147514, 34.036644 ], [ 103.157369, 33.998944 ], [ 103.120413, 33.953286 ], [ 103.1315, 33.931937 ], [ 103.16476, 33.929454 ], [ 103.181391, 33.900649 ], [ 103.153673, 33.819147 ], [ 103.165376, 33.805721 ], [ 103.228202, 33.79478 ], [ 103.24976, 33.814175 ], [ 103.284868, 33.80224 ], [ 103.278709, 33.774387 ], [ 103.35447, 33.743539 ], [ 103.434542, 33.752993 ], [ 103.464723, 33.80224 ], [ 103.518309, 33.807213 ], [ 103.545411, 33.719649 ], [ 103.520157, 33.678323 ], [ 103.552186, 33.671351 ], [ 103.563889, 33.699735 ], [ 103.593454, 33.716164 ], [ 103.645809, 33.708697 ], [ 103.667983, 33.685793 ], [ 103.690772, 33.69376 ], [ 103.778236, 33.658898 ], [ 103.861388, 33.682307 ], [ 103.980264, 33.670852 ], [ 104.046169, 33.686291 ], [ 104.103452, 33.663381 ], [ 104.176749, 33.5996 ], [ 104.155191, 33.542755 ], [ 104.180444, 33.472895 ], [ 104.213089, 33.446932 ], [ 104.22048, 33.404477 ], [ 104.272219, 33.391486 ], [ 104.292545, 33.336505 ], [ 104.373849, 33.345004 ], [ 104.420045, 33.327004 ], [ 104.386168, 33.298497 ], [ 104.333813, 33.315502 ], [ 104.303632, 33.304499 ], [ 104.323958, 33.26898 ], [ 104.32827, 33.223934 ], [ 104.351059, 33.158828 ], [ 104.378161, 33.109214 ], [ 104.337509, 33.038002 ], [ 104.391711, 33.035493 ], [ 104.426204, 33.010906 ], [ 104.383704, 32.994343 ], [ 104.378161, 32.953174 ], [ 104.345516, 32.940117 ], [ 104.288234, 32.942628 ], [ 104.277147, 32.90244 ], [ 104.294393, 32.835586 ], [ 104.363994, 32.822511 ], [ 104.458849, 32.748551 ], [ 104.51182, 32.753585 ], [ 104.526602, 32.728416 ], [ 104.582653, 32.722374 ], [ 104.592508, 32.695685 ], [ 104.643015, 32.661935 ], [ 104.696601, 32.673522 ], [ 104.739717, 32.635228 ], [ 104.795768, 32.643292 ], [ 104.820405, 32.662943 ], [ 104.845659, 32.653873 ], [ 104.881999, 32.600951 ], [ 104.925115, 32.607505 ], [ 105.026745, 32.650346 ], [ 105.0791, 32.637244 ], [ 105.111128, 32.593893 ], [ 105.185041, 32.617587 ], [ 105.215222, 32.63674 ], [ 105.219534, 32.666469 ], [ 105.263265, 32.652362 ], [ 105.297758, 32.656897 ], [ 105.347033, 32.68259 ], [ 105.368591, 32.712807 ], [ 105.448663, 32.732946 ], [ 105.454207, 32.767173 ], [ 105.427721, 32.784281 ], [ 105.396308, 32.85067 ], [ 105.396308, 32.85067 ], [ 105.38091, 32.876307 ], [ 105.408011, 32.885857 ], [ 105.414171, 32.922034 ], [ 105.467757, 32.930071 ], [ 105.49917, 32.911986 ], [ 105.495475, 32.873292 ], [ 105.524424, 32.847654 ], [ 105.534279, 32.790822 ], [ 105.555221, 32.794343 ], [ 105.563844, 32.724891 ], [ 105.585402, 32.728919 ], [ 105.596489, 32.69921 ], [ 105.677793, 32.726402 ], [ 105.719061, 32.759624 ], [ 105.768952, 32.767676 ], [ 105.779423, 32.750061 ], [ 105.822538, 32.770192 ], [ 105.825002, 32.824523 ], [ 105.849024, 32.817985 ], [ 105.893371, 32.838603 ], [ 105.93156, 32.826032 ], [ 105.969132, 32.849162 ], [ 106.011632, 32.829552 ], [ 106.044277, 32.864747 ], [ 106.071378, 32.828546 ], [ 106.093552, 32.82402 ], [ 106.07261, 32.76365 ], [ 106.071378, 32.758114 ], [ 106.120037, 32.719856 ], [ 106.17424, 32.6977 ], [ 106.254928, 32.693671 ], [ 106.267863, 32.673522 ], [ 106.301123, 32.680071 ], [ 106.347935, 32.671003 ], [ 106.389203, 32.62666 ], [ 106.421231, 32.616579 ], [ 106.451412, 32.65992 ], [ 106.498224, 32.649338 ], [ 106.517934, 32.668485 ], [ 106.585687, 32.68813 ], [ 106.626955, 32.682086 ], [ 106.670071, 32.694678 ], [ 106.733513, 32.739491 ], [ 106.783404, 32.735967 ], [ 106.793259, 32.712807 ], [ 106.82344, 32.705254 ], [ 106.854853, 32.724388 ], [ 106.903512, 32.721367 ], [ 106.912751, 32.704247 ], [ 107.012533, 32.721367 ], [ 107.066736, 32.708779 ], [ 107.05996, 32.686115 ], [ 107.098765, 32.649338 ], [ 107.108004, 32.600951 ], [ 107.080286, 32.542448 ], [ 107.127098, 32.482393 ], [ 107.189924, 32.468256 ], [ 107.212097, 32.428864 ], [ 107.263836, 32.403099 ], [ 107.287858, 32.457147 ], [ 107.313727, 32.489965 ], [ 107.356843, 32.506622 ], [ 107.382097, 32.54043 ], [ 107.436299, 32.529835 ], [ 107.438763, 32.465732 ], [ 107.460937, 32.453612 ], [ 107.456625, 32.41775 ], [ 107.489886, 32.425328 ], [ 107.527458, 32.38238 ], [ 107.598291, 32.411688 ], [ 107.648183, 32.413709 ], [ 107.680827, 32.397035 ], [ 107.707929, 32.331826 ], [ 107.753508, 32.338399 ], [ 107.812022, 32.247844 ], [ 107.864377, 32.201266 ], [ 107.890247, 32.214432 ], [ 107.924739, 32.197215 ], [ 107.979558, 32.146051 ], [ 108.024521, 32.177462 ], [ 108.018362, 32.2119 ], [ 108.086731, 32.233165 ], [ 108.143398, 32.219495 ], [ 108.156948, 32.239239 ], [ 108.179738, 32.221521 ], [ 108.240716, 32.274666 ], [ 108.310933, 32.232152 ], [ 108.389773, 32.263533 ], [ 108.414411, 32.252399 ], [ 108.469846, 32.270618 ], [ 108.507418, 32.245819 ], [ 108.509882, 32.201266 ], [ 108.480317, 32.182527 ], [ 108.399013, 32.194176 ], [ 108.370063, 32.172397 ], [ 108.379918, 32.154158 ], [ 108.379918, 32.154158 ], [ 108.379303, 32.153652 ], [ 108.379303, 32.153652 ], [ 108.399628, 32.147065 ], [ 108.452599, 32.090296 ], [ 108.42981, 32.061391 ], [ 108.372527, 32.077112 ], [ 108.344194, 32.067477 ], [ 108.362056, 32.035521 ], [ 108.329411, 32.020299 ], [ 108.370063, 31.988835 ], [ 108.351585, 31.971575 ], [ 108.307238, 31.997463 ], [ 108.259194, 31.967006 ], [ 108.343578, 31.860834 ], [ 108.386078, 31.854226 ], [ 108.391005, 31.829822 ], [ 108.429194, 31.809482 ], [ 108.455063, 31.814059 ], [ 108.462454, 31.780488 ], [ 108.535135, 31.757592 ], [ 108.50557, 31.734182 ], [ 108.514809, 31.693963 ], [ 108.546838, 31.665442 ], [ 108.519121, 31.665952 ], [ 108.468614, 31.636404 ], [ 108.442744, 31.633856 ], [ 108.390389, 31.591555 ], [ 108.386078, 31.544134 ], [ 108.34789, 31.545664 ], [ 108.344194, 31.512506 ], [ 108.254883, 31.49873 ], [ 108.233941, 31.506894 ], [ 108.191441, 31.492096 ], [ 108.193289, 31.467598 ], [ 108.224086, 31.464024 ], [ 108.216079, 31.41041 ], [ 108.153869, 31.371073 ], [ 108.185898, 31.336831 ], [ 108.095354, 31.268311 ], [ 108.038688, 31.252964 ], [ 108.031297, 31.217144 ], [ 108.07626, 31.231985 ], [ 108.089811, 31.204859 ], [ 108.025753, 31.116263 ], [ 108.009123, 31.109602 ], [ 108.026985, 31.061938 ], [ 108.060246, 31.052197 ], [ 108.00358, 31.025533 ], [ 107.983254, 30.983983 ], [ 107.942602, 30.989114 ], [ 107.948145, 30.918802 ], [ 107.994956, 30.908533 ], [ 107.956152, 30.882855 ], [ 107.851443, 30.792931 ], [ 107.788001, 30.81966 ], [ 107.763979, 30.817091 ], [ 107.760899, 30.862823 ], [ 107.739957, 30.884396 ], [ 107.693146, 30.875665 ], [ 107.645103, 30.821202 ], [ 107.57735, 30.847924 ], [ 107.515756, 30.854603 ], [ 107.483111, 30.838675 ], [ 107.498509, 30.809381 ], [ 107.454162, 30.771851 ], [ 107.454162, 30.771851 ], [ 107.424597, 30.74048 ], [ 107.458473, 30.704981 ], [ 107.477567, 30.664837 ], [ 107.516987, 30.644759 ], [ 107.485575, 30.598408 ], [ 107.427676, 30.547397 ], [ 107.443075, 30.53348 ], [ 107.408582, 30.521623 ], [ 107.368546, 30.468508 ], [ 107.338981, 30.386459 ], [ 107.288474, 30.337402 ], [ 107.257677, 30.267131 ], [ 107.221337, 30.213878 ], [ 107.103076, 30.090198 ], [ 107.080286, 30.094341 ], [ 107.084598, 30.063786 ], [ 107.058113, 30.043066 ], [ 107.053801, 30.043584 ], [ 107.02054, 30.036849 ], [ 106.981736, 30.08502 ], [ 106.980504, 30.087609 ], [ 106.979888, 30.088127 ], [ 106.978656, 30.087609 ], [ 106.977425, 30.087609 ], [ 106.976809, 30.088127 ], [ 106.975577, 30.088127 ], [ 106.976193, 30.083467 ], [ 106.94478, 30.037367 ], [ 106.913367, 30.025451 ], [ 106.862244, 30.033223 ], [ 106.83699, 30.049801 ], [ 106.825904, 30.03115 ], [ 106.825904, 30.03115 ], [ 106.785252, 30.01716 ], [ 106.732281, 30.027005 ], [ 106.724274, 30.058607 ], [ 106.699636, 30.074145 ], [ 106.700252, 30.111944 ], [ 106.672535, 30.122297 ], [ 106.677462, 30.156974 ], [ 106.631883, 30.186464 ], [ 106.611557, 30.235596 ], [ 106.612173, 30.235596 ], [ 106.611557, 30.235596 ], [ 106.612173, 30.235596 ], [ 106.612173, 30.235596 ], [ 106.612789, 30.235596 ], [ 106.612789, 30.235596 ], [ 106.642354, 30.246454 ], [ 106.611557, 30.292455 ], [ 106.560434, 30.31519 ], [ 106.545035, 30.296589 ], [ 106.49884, 30.295556 ], [ 106.43971, 30.308473 ], [ 106.428623, 30.254725 ], [ 106.401521, 30.242318 ], [ 106.349167, 30.24542 ], [ 106.334384, 30.225772 ], [ 106.306667, 30.238182 ], [ 106.296196, 30.205603 ], [ 106.264167, 30.20974 ], [ 106.260471, 30.207672 ], [ 106.260471, 30.204051 ], [ 106.260471, 30.19681 ], [ 106.232754, 30.185947 ], [ 106.180399, 30.233011 ], [ 106.168696, 30.303823 ], [ 106.132356, 30.323972 ], [ 106.132972, 30.30279 ], [ 106.07261, 30.333786 ], [ 106.031958, 30.373551 ], [ 105.943263, 30.372002 ], [ 105.900763, 30.405042 ], [ 105.84656, 30.410203 ], [ 105.825618, 30.436006 ], [ 105.792357, 30.427234 ], [ 105.760329, 30.384393 ], [ 105.754785, 30.342567 ], [ 105.714749, 30.322939 ], [ 105.720292, 30.252657 ], [ 105.720292, 30.252657 ], [ 105.670401, 30.254208 ], [ 105.624822, 30.275918 ], [ 105.619894, 30.234045 ], [ 105.662394, 30.210258 ], [ 105.642684, 30.186464 ], [ 105.56138, 30.183878 ], [ 105.558916, 30.18543 ], [ 105.556453, 30.187499 ], [ 105.550909, 30.179222 ], [ 105.536127, 30.152834 ], [ 105.596489, 30.159043 ], [ 105.574315, 30.130579 ], [ 105.582938, 30.12385 ], [ 105.642068, 30.101072 ], [ 105.638988, 30.076216 ], [ 105.676561, 30.06793 ], [ 105.687032, 30.038922 ], [ 105.719677, 30.042548 ], [ 105.753553, 30.018196 ], [ 105.723372, 29.975177 ], [ 105.730763, 29.95755 ], [ 105.70243, 29.924879 ], [ 105.717213, 29.893753 ], [ 105.738771, 29.891159 ], [ 105.707974, 29.840818 ], [ 105.610655, 29.837184 ], [ 105.582938, 29.819013 ], [ 105.574931, 29.744216 ], [ 105.529351, 29.707836 ], [ 105.481924, 29.718232 ], [ 105.476996, 29.674564 ], [ 105.419714, 29.688082 ], [ 105.38091, 29.628275 ], [ 105.347649, 29.621512 ], [ 105.332867, 29.592374 ], [ 105.296526, 29.571035 ], [ 105.305149, 29.53199 ], [ 105.337794, 29.459064 ], [ 105.334099, 29.441345 ], [ 105.387069, 29.455416 ], [ 105.387069, 29.455416 ], [ 105.372903, 29.421018 ], [ 105.426489, 29.419454 ], [ 105.441888, 29.400686 ], [ 105.418482, 29.352185 ], [ 105.42033, 29.31149 ], [ 105.465294, 29.322969 ], [ 105.459134, 29.288526 ], [ 105.513337, 29.283306 ], [ 105.521344, 29.264513 ], [ 105.557684, 29.278608 ], [ 105.631597, 29.280174 ], [ 105.647612, 29.253027 ], [ 105.695039, 29.287482 ], [ 105.712285, 29.219082 ], [ 105.703662, 29.176766 ], [ 105.728916, 29.134432 ], [ 105.752321, 29.129727 ], [ 105.728916, 29.1062 ], [ 105.757865, 29.069068 ], [ 105.74185, 29.039249 ], [ 105.766488, 29.013607 ], [ 105.762176, 28.9911 ], [ 105.801596, 28.958116 ], [ 105.797285, 28.936121 ], [ 105.830546, 28.944501 ], [ 105.852719, 28.927217 ], [ 105.910002, 28.920407 ], [ 105.969132, 28.965971 ], [ 106.001161, 28.973824 ], [ 106.040581, 28.955498 ], [ 106.049204, 28.906263 ], [ 106.070762, 28.919884 ], [ 106.101559, 28.898928 ], [ 106.14837, 28.901548 ], [ 106.173008, 28.920407 ], [ 106.206885, 28.904691 ], [ 106.264783, 28.845997 ], [ 106.245689, 28.817686 ], [ 106.267863, 28.779402 ], [ 106.27279, 28.741103 ], [ 106.305435, 28.704365 ], [ 106.304203, 28.64976 ], [ 106.346703, 28.583565 ], [ 106.33192, 28.55308 ], [ 106.37442, 28.525742 ], [ 106.379348, 28.479986 ], [ 106.349167, 28.473674 ], [ 106.304819, 28.505233 ], [ 106.2925, 28.537309 ], [ 106.254928, 28.539412 ], [ 106.184711, 28.58882 ], [ 106.17116, 28.629275 ], [ 106.14837, 28.642932 ], [ 106.103407, 28.636104 ], [ 106.085544, 28.681792 ], [ 106.030726, 28.694917 ], [ 106.001161, 28.743727 ], [ 105.966668, 28.761041 ], [ 105.937719, 28.686517 ], [ 105.889676, 28.670765 ], [ 105.884748, 28.595126 ], [ 105.808372, 28.599855 ], [ 105.78435, 28.610889 ], [ 105.757249, 28.590397 ], [ 105.74493, 28.616668 ], [ 105.712901, 28.586718 ], [ 105.693191, 28.58882 ], [ 105.68272, 28.534154 ], [ 105.62359, 28.517854 ], [ 105.612503, 28.438947 ], [ 105.643916, 28.431053 ], [ 105.655003, 28.362615 ], [ 105.639604, 28.324164 ], [ 105.68888, 28.284119 ], [ 105.730147, 28.271997 ], [ 105.737539, 28.30309 ], [ 105.76464, 28.308359 ], [ 105.76464, 28.308359 ], [ 105.78743, 28.335753 ], [ 105.824386, 28.306251 ], [ 105.848408, 28.255656 ], [ 105.889676, 28.237732 ], [ 105.860727, 28.159672 ], [ 105.895219, 28.119565 ], [ 105.943878, 28.143314 ], [ 105.975907, 28.107952 ], [ 106.093552, 28.162837 ], [ 106.145291, 28.162837 ], [ 106.206885, 28.134343 ], [ 106.266631, 28.066769 ], [ 106.246305, 28.011835 ], [ 106.286341, 28.007079 ], [ 106.328225, 27.952643 ], [ 106.307899, 27.936782 ], [ 106.304819, 27.899237 ], [ 106.325145, 27.898708 ], [ 106.337464, 27.859033 ], [ 106.306667, 27.808756 ], [ 106.242609, 27.767459 ], [ 106.193334, 27.75422 ], [ 106.120653, 27.779638 ], [ 106.063987, 27.776991 ], [ 106.023335, 27.746805 ], [ 105.985146, 27.749983 ], [ 105.92848, 27.729855 ], [ 105.922937, 27.746805 ], [ 105.868118, 27.732504 ], [ 105.848408, 27.707074 ], [ 105.76772, 27.7182 ], [ 105.722756, 27.706015 ], [ 105.720292, 27.683759 ], [ 105.664242, 27.683759 ], [ 105.62359, 27.666269 ], [ 105.605112, 27.715552 ], [ 105.560148, 27.71979 ], [ 105.508409, 27.769048 ], [ 105.44004, 27.775402 ], [ 105.353809, 27.748924 ], [ 105.308229, 27.704955 ], [ 105.290367, 27.712373 ], [ 105.293447, 27.770637 ], [ 105.273736, 27.794992 ], [ 105.313157, 27.810874 ], [ 105.25957, 27.827811 ], [ 105.233084, 27.895534 ], [ 105.284823, 27.935725 ], [ 105.270657, 27.99704 ], [ 105.247867, 28.009193 ], [ 105.218302, 27.990698 ], [ 105.186273, 27.995454 ], [ 105.167795, 28.021345 ], [ 105.186889, 28.054623 ], [ 105.168411, 28.071522 ], [ 105.119752, 28.07205 ], [ 105.061853, 28.096866 ], [ 105.002107, 28.064129 ], [ 104.980549, 28.063073 ], [ 104.975006, 28.020816 ], [ 104.903557, 27.962158 ], [ 104.918339, 27.938897 ], [ 104.888158, 27.914574 ], [ 104.842579, 27.900294 ], [ 104.796999, 27.901352 ], [ 104.761891, 27.884426 ], [ 104.743413, 27.901881 ], [ 104.676275, 27.880723 ], [ 104.63316, 27.850567 ], [ 104.607906, 27.857974 ], [ 104.573413, 27.840512 ], [ 104.52537, 27.889187 ], [ 104.508124, 27.878078 ], [ 104.44961, 27.927794 ], [ 104.40095, 27.952114 ], [ 104.362762, 28.012891 ], [ 104.30856, 28.036136 ], [ 104.304248, 28.050926 ], [ 104.373233, 28.051454 ], [ 104.40095, 28.091586 ], [ 104.448994, 28.113758 ], [ 104.444682, 28.16231 ], [ 104.406494, 28.173389 ], [ 104.402182, 28.202928 ], [ 104.442834, 28.211366 ], [ 104.462544, 28.241422 ], [ 104.44961, 28.269889 ], [ 104.420045, 28.269889 ], [ 104.392943, 28.291497 ], [ 104.384936, 28.329959 ], [ 104.343052, 28.334173 ], [ 104.314103, 28.306778 ], [ 104.282074, 28.343128 ], [ 104.254357, 28.403683 ], [ 104.267908, 28.499448 ], [ 104.260516, 28.536257 ], [ 104.323342, 28.540989 ], [ 104.355987, 28.555183 ], [ 104.375697, 28.5946 ], [ 104.417581, 28.598279 ], [ 104.425588, 28.626649 ], [ 104.372617, 28.649235 ], [ 104.314719, 28.615617 ], [ 104.277147, 28.631902 ], [ 104.252509, 28.660788 ], [ 104.230951, 28.635579 ], [ 104.170589, 28.642932 ], [ 104.117618, 28.634003 ], [ 104.09606, 28.603533 ], [ 104.05972, 28.6277 ], [ 103.953779, 28.600906 ], [ 103.910047, 28.631377 ], [ 103.887873, 28.61982 ], [ 103.850917, 28.66709 ], [ 103.833054, 28.605109 ], [ 103.838598, 28.587244 ], [ 103.802873, 28.563068 ], [ 103.781931, 28.525216 ], [ 103.829975, 28.459995 ], [ 103.828743, 28.44 ], [ 103.860156, 28.383677 ], [ 103.85338, 28.356822 ], [ 103.877402, 28.316262 ], [ 103.828743, 28.285173 ], [ 103.770845, 28.233514 ], [ 103.740048, 28.23615 ], [ 103.701859, 28.198709 ], [ 103.692004, 28.232459 ], [ 103.643961, 28.260401 ], [ 103.573128, 28.230877 ], [ 103.533092, 28.168641 ], [ 103.470266, 28.122204 ], [ 103.430846, 28.044587 ], [ 103.459179, 28.021345 ], [ 103.486281, 28.033495 ], [ 103.515846, 27.965329 ], [ 103.55465, 27.978543 ], [ 103.502295, 27.910343 ], [ 103.509686, 27.843687 ], [ 103.487512, 27.794992 ], [ 103.461027, 27.779638 ], [ 103.393274, 27.709194 ], [ 103.369868, 27.708664 ], [ 103.349542, 27.678459 ], [ 103.29226, 27.632872 ], [ 103.2861, 27.561802 ], [ 103.232514, 27.56976 ], [ 103.19063, 27.523596 ], [ 103.144434, 27.450331 ], [ 103.141355, 27.420586 ], [ 103.080992, 27.396679 ], [ 103.055739, 27.40943 ], [ 102.989833, 27.367983 ], [ 102.941174, 27.405711 ], [ 102.899906, 27.317481 ], [ 102.883892, 27.299401 ], [ 102.883276, 27.258444 ], [ 102.904218, 27.227584 ], [ 102.913457, 27.133886 ], [ 102.870957, 27.026782 ], [ 102.894979, 27.001724 ], [ 102.896211, 26.91264 ], [ 102.949181, 26.843244 ], [ 102.966428, 26.837904 ], [ 102.991681, 26.775409 ], [ 102.983674, 26.76686 ], [ 103.008312, 26.710741 ], [ 103.005232, 26.679195 ], [ 103.026174, 26.664221 ], [ 103.035413, 26.556673 ], [ 103.052659, 26.555602 ], [ 103.052659, 26.514374 ], [ 103.030485, 26.485989 ], [ 102.989833, 26.482775 ], [ 102.988602, 26.413117 ], [ 102.998457, 26.371839 ], [ 102.975667, 26.340736 ], [ 102.893131, 26.338591 ], [ 102.878964, 26.364332 ], [ 102.833385, 26.306406 ], [ 102.785342, 26.298895 ], [ 102.739762, 26.268846 ], [ 102.709581, 26.210336 ], [ 102.659074, 26.221611 ], [ 102.60056, 26.250598 ], [ 102.638748, 26.307479 ], [ 102.629509, 26.336982 ], [ 102.570995, 26.362723 ], [ 102.542046, 26.338591 ], [ 102.440416, 26.300505 ], [ 102.392372, 26.296749 ], [ 102.349257, 26.244694 ], [ 102.245163, 26.212483 ], [ 102.242699, 26.190468 ], [ 102.174946, 26.146961 ], [ 102.152156, 26.10935 ], [ 102.107808, 26.068501 ], [ 102.080091, 26.065275 ], [ 102.020961, 26.096451 ], [ 101.954439, 26.084627 ], [ 101.929186, 26.105588 ], [ 101.899621, 26.099139 ], [ 101.857737, 26.049146 ], [ 101.835563, 26.04592 ], [ 101.839875, 26.082477 ], [ 101.796759, 26.114723 ], [ 101.807846, 26.156093 ], [ 101.773353, 26.168448 ], [ 101.737013, 26.219463 ], [ 101.690202, 26.241473 ], [ 101.630455, 26.224832 ], [ 101.586108, 26.279579 ], [ 101.597195, 26.303187 ], [ 101.64031, 26.318745 ], [ 101.660636, 26.346635 ], [ 101.635383, 26.357361 ], [ 101.637847, 26.388995 ], [ 101.565782, 26.454381 ], [ 101.530057, 26.467239 ], [ 101.506652, 26.499915 ], [ 101.458608, 26.49563 ], [ 101.422884, 26.53151 ], [ 101.395783, 26.591998 ], [ 101.402558, 26.604841 ], [ 101.461688, 26.606447 ], [ 101.461072, 26.640687 ], [ 101.481398, 26.673313 ], [ 101.453065, 26.692563 ], [ 101.513427, 26.768463 ], [ 101.466, 26.786629 ], [ 101.445674, 26.77434 ], [ 101.458608, 26.731054 ], [ 101.435819, 26.740675 ], [ 101.389623, 26.723036 ], [ 101.387159, 26.753501 ], [ 101.358826, 26.771669 ], [ 101.399478, 26.841642 ], [ 101.365602, 26.883819 ], [ 101.311399, 26.903034 ], [ 101.267667, 26.903034 ], [ 101.264587, 26.955323 ], [ 101.227015, 26.959057 ], [ 101.228863, 26.981992 ], [ 101.136472, 27.023584 ], [ 101.157414, 27.094999 ], [ 101.145095, 27.103523 ], [ 101.170349, 27.175421 ], [ 101.167885, 27.198311 ] ] ], [ [ [ 106.264167, 30.20974 ], [ 106.260471, 30.19681 ], [ 106.260471, 30.204051 ], [ 106.260471, 30.207672 ], [ 106.264167, 30.20974 ] ] ], [ [ [ 106.976809, 30.088127 ], [ 106.977425, 30.087609 ], [ 106.978656, 30.087609 ], [ 106.979888, 30.088127 ], [ 106.980504, 30.087609 ], [ 106.981736, 30.08502 ], [ 106.976193, 30.083467 ], [ 106.975577, 30.088127 ], [ 106.976809, 30.088127 ] ] ], [ [ [ 105.558916, 30.18543 ], [ 105.56138, 30.183878 ], [ 105.550909, 30.179222 ], [ 105.556453, 30.187499 ], [ 105.558916, 30.18543 ] ] ] ] } },\n{ \"type\": \"Feature\", \"properties\": { \"adcode\": \"520000\", \"name\": \"贵州省\", \"center\": [ 106.713478, 26.578343 ], \"centroid\": [ 106.880457, 26.826368 ], \"childrenNum\": 9, \"level\": \"province\", \"parent\": { \"adcode\": 100000 }, \"subFeatureIndex\": 23, \"acroutes\": [ 100000 ] }, \"geometry\": { \"type\": \"MultiPolygon\", \"coordinates\": [ [ [ [ 109.274262, 28.494714 ], [ 109.260712, 28.46473 ], [ 109.264407, 28.392628 ], [ 109.289045, 28.373673 ], [ 109.268719, 28.33786 ], [ 109.275494, 28.313101 ], [ 109.317994, 28.277795 ], [ 109.33524, 28.293605 ], [ 109.388211, 28.268307 ], [ 109.367885, 28.254602 ], [ 109.340168, 28.19027 ], [ 109.33832, 28.141731 ], [ 109.314298, 28.103729 ], [ 109.298284, 28.036136 ], [ 109.335856, 28.063073 ], [ 109.378972, 28.034551 ], [ 109.362342, 28.007608 ], [ 109.319842, 27.988585 ], [ 109.30198, 27.956343 ], [ 109.32169, 27.868027 ], [ 109.346943, 27.838396 ], [ 109.332777, 27.782815 ], [ 109.37774, 27.736741 ], [ 109.366653, 27.721909 ], [ 109.414081, 27.725087 ], [ 109.470747, 27.680049 ], [ 109.45658, 27.673689 ], [ 109.470131, 27.62863 ], [ 109.451037, 27.586204 ], [ 109.461508, 27.567637 ], [ 109.404841, 27.55066 ], [ 109.303211, 27.47582 ], [ 109.300132, 27.423774 ], [ 109.245313, 27.41793 ], [ 109.202197, 27.450331 ], [ 109.167089, 27.41793 ], [ 109.141835, 27.448207 ], [ 109.142451, 27.418461 ], [ 109.103647, 27.336621 ], [ 109.044517, 27.331304 ], [ 109.053756, 27.293551 ], [ 108.983539, 27.26802 ], [ 108.963213, 27.235565 ], [ 108.907778, 27.204699 ], [ 108.926873, 27.160512 ], [ 108.878829, 27.106187 ], [ 108.79075, 27.084343 ], [ 108.877597, 27.01612 ], [ 108.942887, 27.017186 ], [ 108.942887, 27.017186 ], [ 108.940423, 27.044907 ], [ 109.007561, 27.08008 ], [ 109.032814, 27.104056 ], [ 109.128901, 27.122701 ], [ 109.101183, 27.06889 ], [ 109.165857, 27.066758 ], [ 109.21698, 27.114711 ], [ 109.239154, 27.14933 ], [ 109.264407, 27.131755 ], [ 109.33524, 27.139212 ], [ 109.358646, 27.153058 ], [ 109.415312, 27.154123 ], [ 109.441182, 27.117907 ], [ 109.472595, 27.134951 ], [ 109.454733, 27.069423 ], [ 109.486761, 27.053968 ], [ 109.497848, 27.079548 ], [ 109.520022, 27.058764 ], [ 109.555131, 26.946788 ], [ 109.436254, 26.892359 ], [ 109.452885, 26.861932 ], [ 109.467051, 26.83203 ], [ 109.47629, 26.829894 ], [ 109.486761, 26.759913 ], [ 109.447957, 26.759913 ], [ 109.407305, 26.719829 ], [ 109.35495, 26.693098 ], [ 109.283501, 26.698445 ], [ 109.306291, 26.661012 ], [ 109.334008, 26.646036 ], [ 109.35495, 26.658873 ], [ 109.390675, 26.598955 ], [ 109.407305, 26.533116 ], [ 109.381436, 26.518659 ], [ 109.385747, 26.493487 ], [ 109.362342, 26.472061 ], [ 109.38082, 26.454381 ], [ 109.319842, 26.418477 ], [ 109.29582, 26.350389 ], [ 109.271183, 26.327863 ], [ 109.285965, 26.295676 ], [ 109.325385, 26.29031 ], [ 109.351255, 26.264016 ], [ 109.369733, 26.277432 ], [ 109.442414, 26.289774 ], [ 109.467051, 26.313917 ], [ 109.439334, 26.238789 ], [ 109.47629, 26.148035 ], [ 109.513863, 26.128157 ], [ 109.502776, 26.096451 ], [ 109.449805, 26.101826 ], [ 109.452885, 26.055598 ], [ 109.48245, 26.029788 ], [ 109.462124, 25.995367 ], [ 109.408537, 25.967392 ], [ 109.435022, 25.93349 ], [ 109.396834, 25.900117 ], [ 109.359262, 25.836036 ], [ 109.339552, 25.83442 ], [ 109.327849, 25.76168 ], [ 109.340168, 25.731493 ], [ 109.296436, 25.71424 ], [ 109.207125, 25.740119 ], [ 109.206509, 25.788087 ], [ 109.147995, 25.741736 ], [ 109.13198, 25.762758 ], [ 109.143683, 25.795092 ], [ 109.095024, 25.80533 ], [ 109.077778, 25.776771 ], [ 109.048213, 25.790781 ], [ 108.989698, 25.778926 ], [ 108.999553, 25.765453 ], [ 108.963829, 25.732572 ], [ 108.940423, 25.740119 ], [ 108.896076, 25.71424 ], [ 108.900387, 25.682423 ], [ 108.953974, 25.686738 ], [ 108.953974, 25.686738 ], [ 109.007561, 25.734728 ], [ 109.043285, 25.738502 ], [ 109.07901, 25.72071 ], [ 109.075314, 25.693749 ], [ 109.030966, 25.629556 ], [ 109.051908, 25.566949 ], [ 109.088249, 25.550752 ], [ 109.024807, 25.51241 ], [ 108.949046, 25.557231 ], [ 108.8893, 25.543193 ], [ 108.890532, 25.556151 ], [ 108.826474, 25.550212 ], [ 108.814772, 25.526992 ], [ 108.781511, 25.554531 ], [ 108.799989, 25.576666 ], [ 108.783975, 25.628477 ], [ 108.724844, 25.634952 ], [ 108.68912, 25.623081 ], [ 108.68604, 25.587462 ], [ 108.660787, 25.584763 ], [ 108.658323, 25.550212 ], [ 108.68912, 25.533473 ], [ 108.634917, 25.520512 ], [ 108.6072, 25.491885 ], [ 108.600425, 25.432448 ], [ 108.62999, 25.335666 ], [ 108.625062, 25.308076 ], [ 108.589338, 25.335125 ], [ 108.585642, 25.365952 ], [ 108.471693, 25.458928 ], [ 108.418723, 25.443257 ], [ 108.400244, 25.491344 ], [ 108.359592, 25.513491 ], [ 108.348506, 25.536173 ], [ 108.308469, 25.525912 ], [ 108.280752, 25.48 ], [ 108.241332, 25.46217 ], [ 108.251803, 25.430286 ], [ 108.192673, 25.458928 ], [ 108.162492, 25.444878 ], [ 108.193289, 25.405421 ], [ 108.142782, 25.390825 ], [ 108.152021, 25.324306 ], [ 108.143398, 25.269658 ], [ 108.115065, 25.210112 ], [ 108.080572, 25.193867 ], [ 108.001732, 25.196574 ], [ 107.928435, 25.155954 ], [ 107.872384, 25.141327 ], [ 107.839124, 25.115861 ], [ 107.762747, 25.125073 ], [ 107.789233, 25.15487 ], [ 107.760283, 25.188451 ], [ 107.762131, 25.229061 ], [ 107.741805, 25.24043 ], [ 107.700537, 25.194408 ], [ 107.696226, 25.219858 ], [ 107.661733, 25.258833 ], [ 107.659885, 25.316192 ], [ 107.632168, 25.310241 ], [ 107.599523, 25.250714 ], [ 107.576734, 25.256668 ], [ 107.512676, 25.209029 ], [ 107.472024, 25.213902 ], [ 107.489886, 25.276693 ], [ 107.481263, 25.299961 ], [ 107.432604, 25.289139 ], [ 107.409198, 25.347024 ], [ 107.420901, 25.392987 ], [ 107.375937, 25.411908 ], [ 107.358691, 25.393528 ], [ 107.318039, 25.401637 ], [ 107.308184, 25.432988 ], [ 107.336517, 25.461089 ], [ 107.263836, 25.543193 ], [ 107.232423, 25.556691 ], [ 107.228728, 25.604733 ], [ 107.205322, 25.607971 ], [ 107.185612, 25.578825 ], [ 107.064272, 25.559391 ], [ 107.066736, 25.50917 ], [ 107.015613, 25.495666 ], [ 106.996519, 25.442716 ], [ 106.963874, 25.437852 ], [ 106.987896, 25.358922 ], [ 107.012533, 25.352973 ], [ 107.013765, 25.275611 ], [ 106.975577, 25.232851 ], [ 106.933077, 25.250714 ], [ 106.904128, 25.231768 ], [ 106.888113, 25.181953 ], [ 106.853005, 25.186827 ], [ 106.787715, 25.17112 ], [ 106.764926, 25.183036 ], [ 106.732281, 25.162454 ], [ 106.691013, 25.179245 ], [ 106.644817, 25.164621 ], [ 106.63989, 25.132658 ], [ 106.590615, 25.08768 ], [ 106.551195, 25.082802 ], [ 106.519782, 25.054072 ], [ 106.450181, 25.033468 ], [ 106.442173, 25.019369 ], [ 106.332536, 24.988454 ], [ 106.304819, 24.973807 ], [ 106.253696, 24.971094 ], [ 106.215508, 24.981944 ], [ 106.191486, 24.95319 ], [ 106.145291, 24.954275 ], [ 106.197645, 24.885889 ], [ 106.206269, 24.851139 ], [ 106.173008, 24.760417 ], [ 106.150218, 24.762591 ], [ 106.113878, 24.714216 ], [ 106.047356, 24.684312 ], [ 106.024566, 24.633186 ], [ 105.961741, 24.677786 ], [ 105.942031, 24.725088 ], [ 105.863806, 24.729437 ], [ 105.827466, 24.702799 ], [ 105.767104, 24.719109 ], [ 105.70551, 24.768569 ], [ 105.617431, 24.78161 ], [ 105.607576, 24.803885 ], [ 105.573083, 24.797366 ], [ 105.497322, 24.809318 ], [ 105.493011, 24.833217 ], [ 105.457286, 24.87123 ], [ 105.428337, 24.930941 ], [ 105.365511, 24.943423 ], [ 105.334099, 24.9266 ], [ 105.267577, 24.929313 ], [ 105.251563, 24.967296 ], [ 105.212758, 24.995505 ], [ 105.178266, 24.985199 ], [ 105.157324, 24.958616 ], [ 105.131454, 24.959701 ], [ 105.09573, 24.92877 ], [ 105.077868, 24.918459 ], [ 105.039064, 24.872859 ], [ 105.026745, 24.815836 ], [ 105.03352, 24.787586 ], [ 104.899245, 24.752809 ], [ 104.865985, 24.730524 ], [ 104.841963, 24.676155 ], [ 104.771746, 24.659839 ], [ 104.729246, 24.617953 ], [ 104.703377, 24.645698 ], [ 104.628848, 24.660927 ], [ 104.595587, 24.709323 ], [ 104.529682, 24.731611 ], [ 104.542616, 24.75607 ], [ 104.539537, 24.813663 ], [ 104.586964, 24.872859 ], [ 104.635623, 24.903803 ], [ 104.663957, 24.964584 ], [ 104.713232, 24.996048 ], [ 104.684898, 25.054072 ], [ 104.619609, 25.060577 ], [ 104.685514, 25.078466 ], [ 104.695369, 25.122364 ], [ 104.732326, 25.167871 ], [ 104.724319, 25.195491 ], [ 104.753884, 25.214443 ], [ 104.801927, 25.163537 ], [ 104.822869, 25.170037 ], [ 104.806854, 25.224189 ], [ 104.826565, 25.235558 ], [ 104.816094, 25.262622 ], [ 104.736021, 25.268034 ], [ 104.689826, 25.296173 ], [ 104.639935, 25.295632 ], [ 104.646094, 25.356759 ], [ 104.615913, 25.364871 ], [ 104.566638, 25.402719 ], [ 104.543232, 25.400556 ], [ 104.556783, 25.524832 ], [ 104.524138, 25.526992 ], [ 104.483486, 25.494585 ], [ 104.44961, 25.495126 ], [ 104.434827, 25.472436 ], [ 104.418813, 25.499447 ], [ 104.436059, 25.520512 ], [ 104.428668, 25.576126 ], [ 104.389248, 25.595558 ], [ 104.332581, 25.598796 ], [ 104.310407, 25.647901 ], [ 104.328886, 25.760602 ], [ 104.370769, 25.730415 ], [ 104.397871, 25.76168 ], [ 104.42374, 25.841961 ], [ 104.441602, 25.868889 ], [ 104.414501, 25.909807 ], [ 104.438523, 25.92757 ], [ 104.470552, 26.009352 ], [ 104.460081, 26.085702 ], [ 104.499501, 26.070651 ], [ 104.52845, 26.114186 ], [ 104.518595, 26.165762 ], [ 104.548776, 26.226979 ], [ 104.542616, 26.253282 ], [ 104.592508, 26.317672 ], [ 104.659645, 26.335373 ], [ 104.684283, 26.3772 ], [ 104.664572, 26.397572 ], [ 104.665804, 26.434019 ], [ 104.631928, 26.451702 ], [ 104.638703, 26.477954 ], [ 104.598667, 26.520801 ], [ 104.57095, 26.524549 ], [ 104.579573, 26.568449 ], [ 104.556783, 26.590393 ], [ 104.488414, 26.579689 ], [ 104.459465, 26.602701 ], [ 104.468088, 26.644431 ], [ 104.424356, 26.709137 ], [ 104.398487, 26.686147 ], [ 104.353523, 26.620893 ], [ 104.313487, 26.612867 ], [ 104.274683, 26.633733 ], [ 104.268524, 26.617683 ], [ 104.222328, 26.620358 ], [ 104.160734, 26.646571 ], [ 104.121314, 26.638012 ], [ 104.068343, 26.573266 ], [ 104.067727, 26.51491 ], [ 104.008597, 26.511697 ], [ 103.953163, 26.521336 ], [ 103.865699, 26.512232 ], [ 103.819504, 26.529903 ], [ 103.815808, 26.55239 ], [ 103.763453, 26.585041 ], [ 103.748671, 26.623568 ], [ 103.759142, 26.689355 ], [ 103.773308, 26.716621 ], [ 103.725265, 26.742812 ], [ 103.705555, 26.794642 ], [ 103.722185, 26.851253 ], [ 103.779468, 26.87421 ], [ 103.763453, 26.905702 ], [ 103.775156, 26.951056 ], [ 103.753598, 26.963858 ], [ 103.73204, 27.018785 ], [ 103.704939, 27.049171 ], [ 103.675374, 27.051836 ], [ 103.623019, 27.007056 ], [ 103.623635, 27.035312 ], [ 103.601461, 27.061962 ], [ 103.614396, 27.079548 ], [ 103.659975, 27.065692 ], [ 103.652584, 27.092868 ], [ 103.620555, 27.096598 ], [ 103.63349, 27.12057 ], [ 103.696316, 27.126429 ], [ 103.748671, 27.210021 ], [ 103.801641, 27.250464 ], [ 103.80041, 27.26536 ], [ 103.865699, 27.28185 ], [ 103.874322, 27.331304 ], [ 103.903271, 27.347785 ], [ 103.905119, 27.38552 ], [ 103.932221, 27.443958 ], [ 103.956242, 27.425367 ], [ 104.015372, 27.429086 ], [ 104.01722, 27.383926 ], [ 104.084358, 27.330773 ], [ 104.113923, 27.338216 ], [ 104.173053, 27.263232 ], [ 104.210625, 27.297273 ], [ 104.248813, 27.291955 ], [ 104.247582, 27.336621 ], [ 104.295625, 27.37436 ], [ 104.30856, 27.407305 ], [ 104.363378, 27.467855 ], [ 104.467472, 27.414211 ], [ 104.497037, 27.414743 ], [ 104.539537, 27.327583 ], [ 104.570334, 27.331836 ], [ 104.611602, 27.306846 ], [ 104.7545, 27.345658 ], [ 104.77113, 27.317481 ], [ 104.824717, 27.3531 ], [ 104.856746, 27.332368 ], [ 104.851818, 27.299401 ], [ 104.871528, 27.290891 ], [ 104.913412, 27.327051 ], [ 105.01073, 27.379143 ], [ 105.068013, 27.418461 ], [ 105.120984, 27.418461 ], [ 105.184425, 27.392959 ], [ 105.182577, 27.367451 ], [ 105.233084, 27.436522 ], [ 105.234316, 27.489093 ], [ 105.260186, 27.514573 ], [ 105.232469, 27.546945 ], [ 105.25649, 27.582491 ], [ 105.304533, 27.611661 ], [ 105.29591, 27.631811 ], [ 105.308229, 27.704955 ], [ 105.353809, 27.748924 ], [ 105.44004, 27.775402 ], [ 105.508409, 27.769048 ], [ 105.560148, 27.71979 ], [ 105.605112, 27.715552 ], [ 105.62359, 27.666269 ], [ 105.664242, 27.683759 ], [ 105.720292, 27.683759 ], [ 105.722756, 27.706015 ], [ 105.76772, 27.7182 ], [ 105.848408, 27.707074 ], [ 105.868118, 27.732504 ], [ 105.922937, 27.746805 ], [ 105.92848, 27.729855 ], [ 105.985146, 27.749983 ], [ 106.023335, 27.746805 ], [ 106.063987, 27.776991 ], [ 106.120653, 27.779638 ], [ 106.193334, 27.75422 ], [ 106.242609, 27.767459 ], [ 106.306667, 27.808756 ], [ 106.337464, 27.859033 ], [ 106.325145, 27.898708 ], [ 106.304819, 27.899237 ], [ 106.307899, 27.936782 ], [ 106.328225, 27.952643 ], [ 106.286341, 28.007079 ], [ 106.246305, 28.011835 ], [ 106.266631, 28.066769 ], [ 106.206885, 28.134343 ], [ 106.145291, 28.162837 ], [ 106.093552, 28.162837 ], [ 105.975907, 28.107952 ], [ 105.943878, 28.143314 ], [ 105.895219, 28.119565 ], [ 105.860727, 28.159672 ], [ 105.889676, 28.237732 ], [ 105.848408, 28.255656 ], [ 105.824386, 28.306251 ], [ 105.78743, 28.335753 ], [ 105.76464, 28.308359 ], [ 105.76464, 28.308359 ], [ 105.737539, 28.30309 ], [ 105.730147, 28.271997 ], [ 105.68888, 28.284119 ], [ 105.639604, 28.324164 ], [ 105.655003, 28.362615 ], [ 105.643916, 28.431053 ], [ 105.612503, 28.438947 ], [ 105.62359, 28.517854 ], [ 105.68272, 28.534154 ], [ 105.693191, 28.58882 ], [ 105.712901, 28.586718 ], [ 105.74493, 28.616668 ], [ 105.757249, 28.590397 ], [ 105.78435, 28.610889 ], [ 105.808372, 28.599855 ], [ 105.884748, 28.595126 ], [ 105.889676, 28.670765 ], [ 105.937719, 28.686517 ], [ 105.966668, 28.761041 ], [ 106.001161, 28.743727 ], [ 106.030726, 28.694917 ], [ 106.085544, 28.681792 ], [ 106.103407, 28.636104 ], [ 106.14837, 28.642932 ], [ 106.17116, 28.629275 ], [ 106.184711, 28.58882 ], [ 106.254928, 28.539412 ], [ 106.2925, 28.537309 ], [ 106.304819, 28.505233 ], [ 106.349167, 28.473674 ], [ 106.379348, 28.479986 ], [ 106.37442, 28.525742 ], [ 106.403369, 28.569901 ], [ 106.477282, 28.530474 ], [ 106.504999, 28.544669 ], [ 106.466811, 28.586193 ], [ 106.49268, 28.591448 ], [ 106.502535, 28.661313 ], [ 106.528405, 28.677591 ], [ 106.492064, 28.742153 ], [ 106.461883, 28.761041 ], [ 106.45326, 28.817162 ], [ 106.474202, 28.832891 ], [ 106.561666, 28.756319 ], [ 106.56105, 28.719062 ], [ 106.587535, 28.691767 ], [ 106.6171, 28.691242 ], [ 106.617716, 28.66709 ], [ 106.651593, 28.649235 ], [ 106.618332, 28.645033 ], [ 106.63681, 28.622972 ], [ 106.606629, 28.593024 ], [ 106.615252, 28.549401 ], [ 106.567825, 28.523638 ], [ 106.564745, 28.485247 ], [ 106.632499, 28.503655 ], [ 106.697788, 28.47683 ], [ 106.708259, 28.450524 ], [ 106.747063, 28.467361 ], [ 106.726121, 28.51838 ], [ 106.73844, 28.554657 ], [ 106.77786, 28.563068 ], [ 106.756918, 28.607211 ], [ 106.784636, 28.626649 ], [ 106.807425, 28.589346 ], [ 106.830831, 28.623497 ], [ 106.866556, 28.624548 ], [ 106.889345, 28.695966 ], [ 106.86594, 28.690192 ], [ 106.824056, 28.756319 ], [ 106.845614, 28.780975 ], [ 106.872099, 28.777304 ], [ 106.923222, 28.809821 ], [ 106.951555, 28.766812 ], [ 106.988512, 28.776254 ], [ 106.983584, 28.851239 ], [ 107.019308, 28.861722 ], [ 107.016229, 28.882685 ], [ 107.14188, 28.887925 ], [ 107.206554, 28.868535 ], [ 107.194851, 28.838134 ], [ 107.227496, 28.836037 ], [ 107.210866, 28.817686 ], [ 107.219489, 28.772582 ], [ 107.24659, 28.76209 ], [ 107.261373, 28.792514 ], [ 107.327894, 28.810869 ], [ 107.339597, 28.845997 ], [ 107.383945, 28.848618 ], [ 107.41351, 28.911502 ], [ 107.441227, 28.943977 ], [ 107.412894, 28.960211 ], [ 107.396879, 28.993718 ], [ 107.364235, 29.00942 ], [ 107.395647, 29.041341 ], [ 107.369778, 29.091558 ], [ 107.412278, 29.094696 ], [ 107.427676, 29.128682 ], [ 107.408582, 29.138091 ], [ 107.401807, 29.184603 ], [ 107.441227, 29.203934 ], [ 107.486806, 29.174153 ], [ 107.570574, 29.218037 ], [ 107.589052, 29.150113 ], [ 107.605683, 29.164747 ], [ 107.659885, 29.162656 ], [ 107.700537, 29.141228 ], [ 107.749197, 29.199754 ], [ 107.810791, 29.139137 ], [ 107.784921, 29.048143 ], [ 107.823725, 29.034016 ], [ 107.810175, 28.984295 ], [ 107.867457, 28.960211 ], [ 107.882855, 29.00628 ], [ 107.908725, 29.007327 ], [ 107.925971, 29.032446 ], [ 108.026369, 29.039772 ], [ 108.070717, 29.086328 ], [ 108.150173, 29.053375 ], [ 108.193289, 29.072207 ], [ 108.256115, 29.040295 ], [ 108.277673, 29.091558 ], [ 108.306622, 29.079006 ], [ 108.297999, 29.045527 ], [ 108.319556, 28.961258 ], [ 108.345426, 28.943453 ], [ 108.357745, 28.893165 ], [ 108.346658, 28.859625 ], [ 108.352817, 28.815589 ], [ 108.386078, 28.803003 ], [ 108.385462, 28.772058 ], [ 108.347274, 28.736381 ], [ 108.332491, 28.679166 ], [ 108.439049, 28.634003 ], [ 108.501258, 28.626649 ], [ 108.50249, 28.63768 ], [ 108.575787, 28.659738 ], [ 108.636149, 28.621396 ], [ 108.604736, 28.590922 ], [ 108.610896, 28.539412 ], [ 108.573939, 28.531 ], [ 108.586874, 28.463678 ], [ 108.609664, 28.43579 ], [ 108.609048, 28.407368 ], [ 108.576403, 28.38631 ], [ 108.580099, 28.343128 ], [ 108.611512, 28.324691 ], [ 108.667562, 28.334173 ], [ 108.656475, 28.359981 ], [ 108.697127, 28.401051 ], [ 108.688504, 28.422106 ], [ 108.640461, 28.456838 ], [ 108.657091, 28.47683 ], [ 108.700207, 28.48209 ], [ 108.709446, 28.501026 ], [ 108.746402, 28.45105 ], [ 108.780279, 28.42579 ], [ 108.759953, 28.389995 ], [ 108.783359, 28.380518 ], [ 108.761801, 28.304143 ], [ 108.726692, 28.282011 ], [ 108.738395, 28.228241 ], [ 108.772888, 28.212949 ], [ 108.821547, 28.245113 ], [ 108.855424, 28.199764 ], [ 108.89546, 28.219804 ], [ 108.923793, 28.217167 ], [ 108.929952, 28.19027 ], [ 109.005713, 28.162837 ], [ 109.026655, 28.220331 ], [ 109.086401, 28.184467 ], [ 109.101799, 28.202401 ], [ 109.081473, 28.247749 ], [ 109.117198, 28.277795 ], [ 109.152306, 28.349975 ], [ 109.153538, 28.417369 ], [ 109.191726, 28.471043 ], [ 109.23361, 28.474726 ], [ 109.274262, 28.494714 ] ] ], [ [ [ 109.47629, 26.829894 ], [ 109.467051, 26.83203 ], [ 109.452885, 26.861932 ], [ 109.486761, 26.895562 ], [ 109.509551, 26.877947 ], [ 109.513247, 26.84004 ], [ 109.497232, 26.815474 ], [ 109.522486, 26.749226 ], [ 109.52187, 26.749226 ], [ 109.486761, 26.759913 ], [ 109.47629, 26.829894 ] ] ], [ [ [ 109.528645, 26.743881 ], [ 109.554515, 26.73533 ], [ 109.597015, 26.756173 ], [ 109.568065, 26.726243 ], [ 109.528645, 26.743881 ] ] ] ] } },\n{ \"type\": \"Feature\", \"properties\": { \"adcode\": \"530000\", \"name\": \"云南省\", \"center\": [ 102.712251, 25.040609 ], \"centroid\": [ 101.485106, 25.008644 ], \"childrenNum\": 16, \"level\": \"province\", \"parent\": { \"adcode\": 100000 }, \"subFeatureIndex\": 24, \"acroutes\": [ 100000 ] }, \"geometry\": { \"type\": \"MultiPolygon\", \"coordinates\": [ [ [ [ 105.308229, 27.704955 ], [ 105.29591, 27.631811 ], [ 105.304533, 27.611661 ], [ 105.25649, 27.582491 ], [ 105.232469, 27.546945 ], [ 105.260186, 27.514573 ], [ 105.234316, 27.489093 ], [ 105.233084, 27.436522 ], [ 105.182577, 27.367451 ], [ 105.184425, 27.392959 ], [ 105.120984, 27.418461 ], [ 105.068013, 27.418461 ], [ 105.01073, 27.379143 ], [ 104.913412, 27.327051 ], [ 104.871528, 27.290891 ], [ 104.851818, 27.299401 ], [ 104.856746, 27.332368 ], [ 104.824717, 27.3531 ], [ 104.77113, 27.317481 ], [ 104.7545, 27.345658 ], [ 104.611602, 27.306846 ], [ 104.570334, 27.331836 ], [ 104.539537, 27.327583 ], [ 104.497037, 27.414743 ], [ 104.467472, 27.414211 ], [ 104.363378, 27.467855 ], [ 104.30856, 27.407305 ], [ 104.295625, 27.37436 ], [ 104.247582, 27.336621 ], [ 104.248813, 27.291955 ], [ 104.210625, 27.297273 ], [ 104.173053, 27.263232 ], [ 104.113923, 27.338216 ], [ 104.084358, 27.330773 ], [ 104.01722, 27.383926 ], [ 104.015372, 27.429086 ], [ 103.956242, 27.425367 ], [ 103.932221, 27.443958 ], [ 103.905119, 27.38552 ], [ 103.903271, 27.347785 ], [ 103.874322, 27.331304 ], [ 103.865699, 27.28185 ], [ 103.80041, 27.26536 ], [ 103.801641, 27.250464 ], [ 103.748671, 27.210021 ], [ 103.696316, 27.126429 ], [ 103.63349, 27.12057 ], [ 103.620555, 27.096598 ], [ 103.652584, 27.092868 ], [ 103.659975, 27.065692 ], [ 103.614396, 27.079548 ], [ 103.601461, 27.061962 ], [ 103.623635, 27.035312 ], [ 103.623019, 27.007056 ], [ 103.675374, 27.051836 ], [ 103.704939, 27.049171 ], [ 103.73204, 27.018785 ], [ 103.753598, 26.963858 ], [ 103.775156, 26.951056 ], [ 103.763453, 26.905702 ], [ 103.779468, 26.87421 ], [ 103.722185, 26.851253 ], [ 103.705555, 26.794642 ], [ 103.725265, 26.742812 ], [ 103.773308, 26.716621 ], [ 103.759142, 26.689355 ], [ 103.748671, 26.623568 ], [ 103.763453, 26.585041 ], [ 103.815808, 26.55239 ], [ 103.819504, 26.529903 ], [ 103.865699, 26.512232 ], [ 103.953163, 26.521336 ], [ 104.008597, 26.511697 ], [ 104.067727, 26.51491 ], [ 104.068343, 26.573266 ], [ 104.121314, 26.638012 ], [ 104.160734, 26.646571 ], [ 104.222328, 26.620358 ], [ 104.268524, 26.617683 ], [ 104.274683, 26.633733 ], [ 104.313487, 26.612867 ], [ 104.353523, 26.620893 ], [ 104.398487, 26.686147 ], [ 104.424356, 26.709137 ], [ 104.468088, 26.644431 ], [ 104.459465, 26.602701 ], [ 104.488414, 26.579689 ], [ 104.556783, 26.590393 ], [ 104.579573, 26.568449 ], [ 104.57095, 26.524549 ], [ 104.598667, 26.520801 ], [ 104.638703, 26.477954 ], [ 104.631928, 26.451702 ], [ 104.665804, 26.434019 ], [ 104.664572, 26.397572 ], [ 104.684283, 26.3772 ], [ 104.659645, 26.335373 ], [ 104.592508, 26.317672 ], [ 104.542616, 26.253282 ], [ 104.548776, 26.226979 ], [ 104.518595, 26.165762 ], [ 104.52845, 26.114186 ], [ 104.499501, 26.070651 ], [ 104.460081, 26.085702 ], [ 104.470552, 26.009352 ], [ 104.438523, 25.92757 ], [ 104.414501, 25.909807 ], [ 104.441602, 25.868889 ], [ 104.42374, 25.841961 ], [ 104.397871, 25.76168 ], [ 104.370769, 25.730415 ], [ 104.328886, 25.760602 ], [ 104.310407, 25.647901 ], [ 104.332581, 25.598796 ], [ 104.389248, 25.595558 ], [ 104.428668, 25.576126 ], [ 104.436059, 25.520512 ], [ 104.418813, 25.499447 ], [ 104.434827, 25.472436 ], [ 104.44961, 25.495126 ], [ 104.483486, 25.494585 ], [ 104.524138, 25.526992 ], [ 104.556783, 25.524832 ], [ 104.543232, 25.400556 ], [ 104.566638, 25.402719 ], [ 104.615913, 25.364871 ], [ 104.646094, 25.356759 ], [ 104.639935, 25.295632 ], [ 104.689826, 25.296173 ], [ 104.736021, 25.268034 ], [ 104.816094, 25.262622 ], [ 104.826565, 25.235558 ], [ 104.806854, 25.224189 ], [ 104.822869, 25.170037 ], [ 104.801927, 25.163537 ], [ 104.753884, 25.214443 ], [ 104.724319, 25.195491 ], [ 104.732326, 25.167871 ], [ 104.695369, 25.122364 ], [ 104.685514, 25.078466 ], [ 104.619609, 25.060577 ], [ 104.684898, 25.054072 ], [ 104.713232, 24.996048 ], [ 104.663957, 24.964584 ], [ 104.635623, 24.903803 ], [ 104.586964, 24.872859 ], [ 104.539537, 24.813663 ], [ 104.542616, 24.75607 ], [ 104.529682, 24.731611 ], [ 104.489646, 24.653313 ], [ 104.520443, 24.535228 ], [ 104.550008, 24.518894 ], [ 104.575877, 24.424661 ], [ 104.616529, 24.421937 ], [ 104.63008, 24.397958 ], [ 104.610986, 24.377246 ], [ 104.641783, 24.367979 ], [ 104.70892, 24.321087 ], [ 104.721239, 24.340173 ], [ 104.703377, 24.419757 ], [ 104.715695, 24.441552 ], [ 104.74834, 24.435559 ], [ 104.765587, 24.45953 ], [ 104.784681, 24.443732 ], [ 104.83642, 24.446456 ], [ 104.914028, 24.426296 ], [ 104.930042, 24.411038 ], [ 104.979933, 24.412673 ], [ 105.042759, 24.442097 ], [ 105.106817, 24.414853 ], [ 105.111744, 24.37234 ], [ 105.138846, 24.376701 ], [ 105.188121, 24.347261 ], [ 105.196744, 24.326541 ], [ 105.164715, 24.288362 ], [ 105.215222, 24.214699 ], [ 105.24294, 24.208695 ], [ 105.229389, 24.165567 ], [ 105.182577, 24.167205 ], [ 105.20044, 24.105491 ], [ 105.260186, 24.061236 ], [ 105.292831, 24.074896 ], [ 105.273121, 24.092927 ], [ 105.320548, 24.116416 ], [ 105.334099, 24.094566 ], [ 105.395692, 24.065607 ], [ 105.406163, 24.043748 ], [ 105.493011, 24.016965 ], [ 105.533663, 24.130071 ], [ 105.594641, 24.137718 ], [ 105.628518, 24.126794 ], [ 105.649459, 24.032816 ], [ 105.704278, 24.0667 ], [ 105.739387, 24.059596 ], [ 105.765256, 24.073804 ], [ 105.802212, 24.051945 ], [ 105.796669, 24.023524 ], [ 105.841633, 24.03063 ], [ 105.859495, 24.056864 ], [ 105.89214, 24.040468 ], [ 105.908154, 24.069432 ], [ 105.901995, 24.099482 ], [ 105.919241, 24.122425 ], [ 105.963589, 24.110954 ], [ 105.998081, 24.120786 ], [ 106.011632, 24.099482 ], [ 106.04982, 24.089649 ], [ 106.053516, 24.051399 ], [ 106.096631, 24.018058 ], [ 106.091088, 23.998924 ], [ 106.128044, 23.956819 ], [ 106.157609, 23.891174 ], [ 106.192718, 23.879135 ], [ 106.173008, 23.861622 ], [ 106.192102, 23.824947 ], [ 106.136667, 23.795381 ], [ 106.157609, 23.724175 ], [ 106.149602, 23.665538 ], [ 106.120653, 23.605229 ], [ 106.141595, 23.569579 ], [ 106.08616, 23.524043 ], [ 106.071994, 23.495506 ], [ 106.039965, 23.484529 ], [ 105.999929, 23.447748 ], [ 105.986378, 23.489469 ], [ 105.935871, 23.508678 ], [ 105.913081, 23.499348 ], [ 105.89214, 23.52514 ], [ 105.852103, 23.526786 ], [ 105.815763, 23.507031 ], [ 105.805908, 23.467512 ], [ 105.758481, 23.459826 ], [ 105.699966, 23.40162 ], [ 105.637757, 23.404366 ], [ 105.694423, 23.363168 ], [ 105.699966, 23.327453 ], [ 105.649459, 23.346136 ], [ 105.593409, 23.312614 ], [ 105.560148, 23.257093 ], [ 105.526272, 23.234548 ], [ 105.542902, 23.184495 ], [ 105.50225, 23.202648 ], [ 105.445584, 23.292827 ], [ 105.416018, 23.283482 ], [ 105.372903, 23.317561 ], [ 105.353809, 23.362069 ], [ 105.325475, 23.390086 ], [ 105.260186, 23.31811 ], [ 105.238012, 23.26424 ], [ 105.181962, 23.279084 ], [ 105.122215, 23.247745 ], [ 105.093266, 23.260942 ], [ 104.958991, 23.188896 ], [ 104.949136, 23.152033 ], [ 104.912796, 23.175693 ], [ 104.882615, 23.163589 ], [ 104.874608, 23.123417 ], [ 104.804391, 23.110207 ], [ 104.821021, 23.032022 ], [ 104.860441, 22.970874 ], [ 104.846275, 22.926235 ], [ 104.772362, 22.893711 ], [ 104.760659, 22.862282 ], [ 104.732942, 22.852356 ], [ 104.737869, 22.825882 ], [ 104.674428, 22.817056 ], [ 104.596203, 22.846289 ], [ 104.527834, 22.814298 ], [ 104.498885, 22.774574 ], [ 104.422508, 22.734838 ], [ 104.375697, 22.690122 ], [ 104.323342, 22.728767 ], [ 104.272835, 22.73815 ], [ 104.256821, 22.77347 ], [ 104.274067, 22.828088 ], [ 104.261748, 22.841877 ], [ 104.224176, 22.826434 ], [ 104.117618, 22.808781 ], [ 104.089901, 22.768504 ], [ 104.045553, 22.728215 ], [ 104.04309, 22.67687 ], [ 104.022148, 22.593463 ], [ 104.009213, 22.575228 ], [ 104.009213, 22.517745 ], [ 103.964865, 22.502265 ], [ 103.894032, 22.564728 ], [ 103.875554, 22.565833 ], [ 103.863851, 22.584069 ], [ 103.825047, 22.615562 ], [ 103.766533, 22.688465 ], [ 103.669215, 22.766297 ], [ 103.642113, 22.794989 ], [ 103.567585, 22.701164 ], [ 103.580519, 22.66693 ], [ 103.529396, 22.59291 ], [ 103.50907, 22.601198 ], [ 103.457947, 22.658646 ], [ 103.436389, 22.6973 ], [ 103.441317, 22.753052 ], [ 103.375411, 22.794989 ], [ 103.323057, 22.807678 ], [ 103.321209, 22.777885 ], [ 103.288564, 22.732078 ], [ 103.283021, 22.678526 ], [ 103.220195, 22.643734 ], [ 103.195557, 22.648153 ], [ 103.161065, 22.590147 ], [ 103.183238, 22.558649 ], [ 103.119181, 22.518298 ], [ 103.085304, 22.509452 ], [ 103.071753, 22.445304 ], [ 103.030485, 22.441432 ], [ 102.986754, 22.477935 ], [ 102.930703, 22.482359 ], [ 102.892515, 22.533223 ], [ 102.880196, 22.586832 ], [ 102.82353, 22.623296 ], [ 102.80074, 22.620534 ], [ 102.688639, 22.70006 ], [ 102.657226, 22.687913 ], [ 102.607335, 22.730975 ], [ 102.569763, 22.701164 ], [ 102.551285, 22.743669 ], [ 102.498314, 22.777885 ], [ 102.45951, 22.762986 ], [ 102.43672, 22.699508 ], [ 102.384365, 22.679631 ], [ 102.404691, 22.629925 ], [ 102.356648, 22.563623 ], [ 102.322771, 22.554227 ], [ 102.25625, 22.457473 ], [ 102.270416, 22.419858 ], [ 102.179257, 22.430369 ], [ 102.145381, 22.397727 ], [ 102.131214, 22.430922 ], [ 102.046214, 22.458026 ], [ 101.978461, 22.427603 ], [ 101.907628, 22.437007 ], [ 101.901469, 22.384447 ], [ 101.862665, 22.389427 ], [ 101.823244, 22.42705 ], [ 101.824476, 22.45692 ], [ 101.774585, 22.506135 ], [ 101.715455, 22.477935 ], [ 101.672339, 22.47517 ], [ 101.648318, 22.400494 ], [ 101.671723, 22.372826 ], [ 101.625528, 22.28259 ], [ 101.56455, 22.269299 ], [ 101.547304, 22.238282 ], [ 101.596579, 22.161262 ], [ 101.602738, 22.131883 ], [ 101.573789, 22.115251 ], [ 101.626144, 22.005986 ], [ 101.606434, 21.967695 ], [ 101.666796, 21.934391 ], [ 101.701288, 21.938832 ], [ 101.700057, 21.897191 ], [ 101.735165, 21.875534 ], [ 101.740093, 21.845541 ], [ 101.771506, 21.833319 ], [ 101.747484, 21.729953 ], [ 101.76781, 21.716054 ], [ 101.780129, 21.640975 ], [ 101.807846, 21.644313 ], [ 101.828788, 21.617054 ], [ 101.804766, 21.577546 ], [ 101.754875, 21.58478 ], [ 101.755491, 21.538027 ], [ 101.772737, 21.512975 ], [ 101.741324, 21.482906 ], [ 101.749948, 21.409379 ], [ 101.730238, 21.336929 ], [ 101.745636, 21.297345 ], [ 101.791832, 21.285636 ], [ 101.833715, 21.252731 ], [ 101.834331, 21.204756 ], [ 101.794911, 21.208104 ], [ 101.76473, 21.147835 ], [ 101.703136, 21.14616 ], [ 101.672339, 21.194713 ], [ 101.605818, 21.172392 ], [ 101.588572, 21.191365 ], [ 101.601506, 21.233208 ], [ 101.532521, 21.252174 ], [ 101.439514, 21.227072 ], [ 101.387775, 21.225956 ], [ 101.290457, 21.17853 ], [ 101.222088, 21.234324 ], [ 101.246725, 21.275598 ], [ 101.244877, 21.302364 ], [ 101.183899, 21.334699 ], [ 101.142631, 21.409379 ], [ 101.194986, 21.424979 ], [ 101.193138, 21.473996 ], [ 101.225167, 21.499055 ], [ 101.210385, 21.509077 ], [ 101.209153, 21.55751 ], [ 101.146943, 21.560293 ], [ 101.169117, 21.590345 ], [ 101.153102, 21.669343 ], [ 101.116762, 21.691032 ], [ 101.111835, 21.746074 ], [ 101.123537, 21.771642 ], [ 101.089661, 21.773865 ], [ 101.015132, 21.707157 ], [ 100.940603, 21.697149 ], [ 100.870386, 21.67268 ], [ 100.847597, 21.634856 ], [ 100.804481, 21.609821 ], [ 100.789082, 21.570867 ], [ 100.753358, 21.555283 ], [ 100.730568, 21.518542 ], [ 100.691764, 21.510748 ], [ 100.579047, 21.451717 ], [ 100.526692, 21.471211 ], [ 100.48296, 21.458958 ], [ 100.437381, 21.533017 ], [ 100.350534, 21.52912 ], [ 100.298795, 21.477894 ], [ 100.235353, 21.466756 ], [ 100.206404, 21.509634 ], [ 100.180534, 21.514088 ], [ 100.168831, 21.482906 ], [ 100.131259, 21.504066 ], [ 100.123252, 21.565302 ], [ 100.107853, 21.585337 ], [ 100.169447, 21.663225 ], [ 100.131875, 21.699929 ], [ 100.094303, 21.702709 ], [ 100.049339, 21.669899 ], [ 99.991441, 21.703821 ], [ 99.944014, 21.821097 ], [ 99.960028, 21.907186 ], [ 99.982202, 21.919401 ], [ 100.000064, 21.973245 ], [ 99.965571, 22.014309 ], [ 99.972347, 22.053141 ], [ 99.871333, 22.067007 ], [ 99.870101, 22.029288 ], [ 99.762927, 22.068117 ], [ 99.696406, 22.067562 ], [ 99.648979, 22.100835 ], [ 99.581841, 22.103053 ], [ 99.578762, 22.098617 ], [ 99.562747, 22.113034 ], [ 99.516552, 22.099726 ], [ 99.486987, 22.128557 ], [ 99.400139, 22.100281 ], [ 99.35456, 22.095845 ], [ 99.294814, 22.109152 ], [ 99.219669, 22.110816 ], [ 99.156227, 22.159599 ], [ 99.188256, 22.162924 ], [ 99.175321, 22.185647 ], [ 99.207966, 22.232188 ], [ 99.235683, 22.250468 ], [ 99.233836, 22.296434 ], [ 99.278183, 22.34626 ], [ 99.251698, 22.393301 ], [ 99.297277, 22.41156 ], [ 99.382277, 22.493418 ], [ 99.359487, 22.535435 ], [ 99.385973, 22.57136 ], [ 99.339777, 22.708894 ], [ 99.31514, 22.737598 ], [ 99.326842, 22.751396 ], [ 99.385357, 22.761882 ], [ 99.401371, 22.826434 ], [ 99.462965, 22.844635 ], [ 99.43648, 22.913557 ], [ 99.446951, 22.934503 ], [ 99.531334, 22.897019 ], [ 99.563363, 22.925684 ], [ 99.533798, 22.961507 ], [ 99.517168, 23.006685 ], [ 99.528255, 23.065614 ], [ 99.477747, 23.083233 ], [ 99.440791, 23.079379 ], [ 99.380429, 23.099748 ], [ 99.3484, 23.12892 ], [ 99.281879, 23.101399 ], [ 99.255393, 23.077727 ], [ 99.187024, 23.100299 ], [ 99.106336, 23.086536 ], [ 99.048438, 23.11461 ], [ 99.057677, 23.164689 ], [ 99.002242, 23.160287 ], [ 98.906772, 23.185595 ], [ 98.889525, 23.209249 ], [ 98.928946, 23.26589 ], [ 98.936953, 23.309866 ], [ 98.906772, 23.331849 ], [ 98.872895, 23.329651 ], [ 98.920938, 23.360971 ], [ 98.912315, 23.426333 ], [ 98.874743, 23.483431 ], [ 98.826084, 23.470257 ], [ 98.80391, 23.540504 ], [ 98.844562, 23.578904 ], [ 98.882134, 23.595358 ], [ 98.882134, 23.620035 ], [ 98.847026, 23.632097 ], [ 98.835939, 23.683625 ], [ 98.811917, 23.703354 ], [ 98.824236, 23.727462 ], [ 98.784816, 23.781691 ], [ 98.696121, 23.784429 ], [ 98.669019, 23.800857 ], [ 98.701664, 23.834254 ], [ 98.68565, 23.90157 ], [ 98.701048, 23.946427 ], [ 98.673331, 23.960647 ], [ 98.701048, 23.981427 ], [ 98.727533, 23.970491 ], [ 98.773729, 24.022431 ], [ 98.807606, 24.025164 ], [ 98.895069, 24.098936 ], [ 98.876591, 24.15137 ], [ 98.841482, 24.126794 ], [ 98.818692, 24.133348 ], [ 98.71891, 24.127887 ], [ 98.681954, 24.100029 ], [ 98.646229, 24.106038 ], [ 98.593875, 24.08036 ], [ 98.547063, 24.128433 ], [ 98.487933, 24.123517 ], [ 98.48239, 24.122425 ], [ 98.37768, 24.114232 ], [ 98.343187, 24.098936 ], [ 98.219999, 24.113685 ], [ 98.19721, 24.09839 ], [ 98.132536, 24.09238 ], [ 98.125761, 24.092927 ], [ 98.123297, 24.092927 ], [ 98.096196, 24.08637 ], [ 98.091268, 24.085824 ], [ 97.995182, 24.04648 ], [ 97.984095, 24.031177 ], [ 97.902175, 24.014231 ], [ 97.896015, 23.974319 ], [ 97.863371, 23.978693 ], [ 97.8104, 23.943146 ], [ 97.795617, 23.951897 ], [ 97.763588, 23.907041 ], [ 97.72848, 23.895551 ], [ 97.718009, 23.867643 ], [ 97.684132, 23.876946 ], [ 97.647176, 23.840823 ], [ 97.640401, 23.866001 ], [ 97.633009, 23.879682 ], [ 97.5283, 23.926736 ], [ 97.529531, 23.943146 ], [ 97.572647, 23.983068 ], [ 97.628698, 24.004938 ], [ 97.637321, 24.04812 ], [ 97.730944, 24.113685 ], [ 97.753733, 24.168843 ], [ 97.72848, 24.183585 ], [ 97.729712, 24.227252 ], [ 97.767284, 24.258357 ], [ 97.721089, 24.295999 ], [ 97.665038, 24.296544 ], [ 97.662574, 24.339083 ], [ 97.716161, 24.358711 ], [ 97.679821, 24.401228 ], [ 97.669966, 24.452993 ], [ 97.588662, 24.435559 ], [ 97.530147, 24.443187 ], [ 97.554785, 24.490577 ], [ 97.570799, 24.602719 ], [ 97.569567, 24.708236 ], [ 97.547394, 24.739221 ], [ 97.569567, 24.765852 ], [ 97.652103, 24.790846 ], [ 97.680437, 24.827243 ], [ 97.765436, 24.823984 ], [ 97.797465, 24.845709 ], [ 97.785762, 24.876117 ], [ 97.729712, 24.908689 ], [ 97.716777, 24.978147 ], [ 97.727864, 25.042686 ], [ 97.719857, 25.080634 ], [ 97.743262, 25.078466 ], [ 97.796233, 25.155954 ], [ 97.839349, 25.27074 ], [ 97.875689, 25.25721 ], [ 97.904023, 25.216609 ], [ 97.940363, 25.214985 ], [ 98.0075, 25.279399 ], [ 98.006884, 25.298338 ], [ 98.06971, 25.311864 ], [ 98.099891, 25.354055 ], [ 98.101123, 25.388662 ], [ 98.137464, 25.381633 ], [ 98.15779, 25.457307 ], [ 98.131304, 25.51025 ], [ 98.163949, 25.524292 ], [ 98.189818, 25.569108 ], [ 98.170724, 25.620383 ], [ 98.247717, 25.607971 ], [ 98.314854, 25.543193 ], [ 98.326557, 25.566409 ], [ 98.402317, 25.593939 ], [ 98.409709, 25.664084 ], [ 98.457752, 25.682963 ], [ 98.461448, 25.735267 ], [ 98.476846, 25.77731 ], [ 98.529201, 25.840884 ], [ 98.553839, 25.845731 ], [ 98.640686, 25.798864 ], [ 98.677642, 25.816105 ], [ 98.705976, 25.855426 ], [ 98.686881, 25.925955 ], [ 98.637606, 25.971696 ], [ 98.614201, 25.968468 ], [ 98.602498, 26.054523 ], [ 98.575396, 26.118485 ], [ 98.632679, 26.145887 ], [ 98.656084, 26.139977 ], [ 98.661012, 26.087852 ], [ 98.720142, 26.127082 ], [ 98.712751, 26.156093 ], [ 98.735541, 26.185097 ], [ 98.713367, 26.231274 ], [ 98.672715, 26.239863 ], [ 98.681338, 26.308016 ], [ 98.733693, 26.350926 ], [ 98.750323, 26.424372 ], [ 98.741084, 26.432947 ], [ 98.757098, 26.491881 ], [ 98.753403, 26.559349 ], [ 98.773113, 26.578083 ], [ 98.781736, 26.620893 ], [ 98.762642, 26.660478 ], [ 98.770033, 26.690424 ], [ 98.746012, 26.696841 ], [ 98.762026, 26.798916 ], [ 98.730613, 26.851253 ], [ 98.757098, 26.877947 ], [ 98.732461, 27.002257 ], [ 98.762642, 27.018252 ], [ 98.765722, 27.05077 ], [ 98.712751, 27.075817 ], [ 98.713983, 27.139744 ], [ 98.696121, 27.211086 ], [ 98.723222, 27.221198 ], [ 98.717062, 27.271211 ], [ 98.734925, 27.287168 ], [ 98.741084, 27.330241 ], [ 98.706591, 27.362136 ], [ 98.702896, 27.412618 ], [ 98.686881, 27.425367 ], [ 98.704128, 27.463607 ], [ 98.685034, 27.484315 ], [ 98.706591, 27.553313 ], [ 98.662244, 27.586734 ], [ 98.650541, 27.567637 ], [ 98.583404, 27.571351 ], [ 98.587099, 27.587265 ], [ 98.554454, 27.646126 ], [ 98.53536, 27.620676 ], [ 98.474998, 27.634462 ], [ 98.444201, 27.665209 ], [ 98.430035, 27.653547 ], [ 98.429419, 27.549068 ], [ 98.388767, 27.515104 ], [ 98.337644, 27.508734 ], [ 98.317318, 27.51935 ], [ 98.310542, 27.583552 ], [ 98.283441, 27.654608 ], [ 98.234166, 27.690648 ], [ 98.215688, 27.810874 ], [ 98.169492, 27.851096 ], [ 98.205217, 27.889716 ], [ 98.187355, 27.939426 ], [ 98.143007, 27.948942 ], [ 98.133152, 27.990698 ], [ 98.160253, 28.101089 ], [ 98.139311, 28.142259 ], [ 98.17442, 28.163365 ], [ 98.169492, 28.206093 ], [ 98.21692, 28.212949 ], [ 98.266811, 28.242477 ], [ 98.231702, 28.314681 ], [ 98.207681, 28.330486 ], [ 98.208913, 28.358401 ], [ 98.301303, 28.384204 ], [ 98.317934, 28.324691 ], [ 98.353042, 28.293078 ], [ 98.37768, 28.246167 ], [ 98.370289, 28.18394 ], [ 98.389999, 28.16442 ], [ 98.389383, 28.114814 ], [ 98.428803, 28.104785 ], [ 98.464527, 28.151229 ], [ 98.494092, 28.141203 ], [ 98.559382, 28.182885 ], [ 98.625903, 28.165475 ], [ 98.649925, 28.200291 ], [ 98.712135, 28.229296 ], [ 98.710287, 28.288862 ], [ 98.746628, 28.321003 ], [ 98.740468, 28.348395 ], [ 98.693041, 28.43158 ], [ 98.673947, 28.478934 ], [ 98.625903, 28.489455 ], [ 98.619128, 28.50944 ], [ 98.637606, 28.552029 ], [ 98.594491, 28.667615 ], [ 98.666555, 28.712239 ], [ 98.683802, 28.740054 ], [ 98.652389, 28.817162 ], [ 98.668403, 28.843376 ], [ 98.643766, 28.895261 ], [ 98.6567, 28.910454 ], [ 98.624056, 28.95864 ], [ 98.655469, 28.976966 ], [ 98.70228, 28.9644 ], [ 98.757714, 29.004186 ], [ 98.786048, 28.998952 ], [ 98.821772, 28.920931 ], [ 98.827932, 28.821356 ], [ 98.852569, 28.798283 ], [ 98.912931, 28.800906 ], [ 98.922786, 28.823978 ], [ 98.972677, 28.832367 ], [ 98.973909, 28.864867 ], [ 98.917859, 28.886877 ], [ 98.925866, 28.978536 ], [ 99.013329, 29.036632 ], [ 98.991771, 29.105677 ], [ 98.967134, 29.128159 ], [ 98.960974, 29.165792 ], [ 98.9813, 29.204978 ], [ 99.024416, 29.188783 ], [ 99.037351, 29.20759 ], [ 99.113727, 29.221171 ], [ 99.105104, 29.162656 ], [ 99.118039, 29.100971 ], [ 99.113727, 29.07273 ], [ 99.132206, 28.94869 ], [ 99.123582, 28.890021 ], [ 99.103872, 28.841803 ], [ 99.114343, 28.765763 ], [ 99.134053, 28.734806 ], [ 99.126662, 28.698066 ], [ 99.147604, 28.640831 ], [ 99.183944, 28.58882 ], [ 99.170394, 28.566221 ], [ 99.191952, 28.494714 ], [ 99.187024, 28.44 ], [ 99.16485, 28.425264 ], [ 99.200575, 28.365774 ], [ 99.229524, 28.350502 ], [ 99.237531, 28.317842 ], [ 99.28927, 28.286227 ], [ 99.306516, 28.227714 ], [ 99.374886, 28.18183 ], [ 99.412458, 28.295186 ], [ 99.392748, 28.318369 ], [ 99.437095, 28.398419 ], [ 99.404451, 28.44421 ], [ 99.426625, 28.454207 ], [ 99.396444, 28.491032 ], [ 99.403219, 28.546246 ], [ 99.463581, 28.549401 ], [ 99.466045, 28.579886 ], [ 99.504233, 28.619294 ], [ 99.540573, 28.623497 ], [ 99.53195, 28.677591 ], [ 99.553508, 28.710664 ], [ 99.614486, 28.740054 ], [ 99.609559, 28.784122 ], [ 99.625573, 28.81454 ], [ 99.676696, 28.810345 ], [ 99.717964, 28.846521 ], [ 99.722275, 28.757369 ], [ 99.755536, 28.701216 ], [ 99.79434, 28.699116 ], [ 99.834992, 28.660788 ], [ 99.834376, 28.628225 ], [ 99.873181, 28.631902 ], [ 99.875644, 28.611939 ], [ 99.91876, 28.599329 ], [ 99.985281, 28.529422 ], [ 99.990209, 28.47683 ], [ 100.073977, 28.426317 ], [ 100.057346, 28.368934 ], [ 100.136803, 28.349975 ], [ 100.176223, 28.325218 ], [ 100.147274, 28.288862 ], [ 100.188541, 28.252493 ], [ 100.153433, 28.208202 ], [ 100.102926, 28.201873 ], [ 100.091223, 28.181302 ], [ 100.062274, 28.193962 ], [ 100.033325, 28.184467 ], [ 100.021006, 28.147008 ], [ 100.05673, 28.097922 ], [ 100.088759, 28.029269 ], [ 100.120788, 28.018703 ], [ 100.196549, 27.936254 ], [ 100.170063, 27.907699 ], [ 100.210715, 27.87702 ], [ 100.30865, 27.861149 ], [ 100.30865, 27.830457 ], [ 100.28586, 27.80611 ], [ 100.304954, 27.788639 ], [ 100.311729, 27.724028 ], [ 100.327744, 27.72032 ], [ 100.350534, 27.755809 ], [ 100.412127, 27.816167 ], [ 100.442924, 27.86644 ], [ 100.504518, 27.852154 ], [ 100.511294, 27.827811 ], [ 100.54517, 27.809286 ], [ 100.609228, 27.859033 ], [ 100.634482, 27.915631 ], [ 100.681293, 27.923035 ], [ 100.719481, 27.858503 ], [ 100.707162, 27.800816 ], [ 100.757053, 27.770107 ], [ 100.775532, 27.743098 ], [ 100.782307, 27.691708 ], [ 100.848212, 27.672099 ], [ 100.827886, 27.615904 ], [ 100.854988, 27.623858 ], [ 100.91227, 27.521473 ], [ 100.901183, 27.453517 ], [ 100.936908, 27.469448 ], [ 100.95169, 27.426961 ], [ 101.021907, 27.332899 ], [ 101.026219, 27.270679 ], [ 101.042233, 27.22173 ], [ 101.071798, 27.194585 ], [ 101.119226, 27.208957 ], [ 101.167885, 27.198311 ], [ 101.167885, 27.198311 ], [ 101.170349, 27.175421 ], [ 101.145095, 27.103523 ], [ 101.157414, 27.094999 ], [ 101.136472, 27.023584 ], [ 101.228863, 26.981992 ], [ 101.227015, 26.959057 ], [ 101.264587, 26.955323 ], [ 101.267667, 26.903034 ], [ 101.311399, 26.903034 ], [ 101.365602, 26.883819 ], [ 101.399478, 26.841642 ], [ 101.358826, 26.771669 ], [ 101.387159, 26.753501 ], [ 101.389623, 26.723036 ], [ 101.435819, 26.740675 ], [ 101.458608, 26.731054 ], [ 101.445674, 26.77434 ], [ 101.466, 26.786629 ], [ 101.513427, 26.768463 ], [ 101.453065, 26.692563 ], [ 101.481398, 26.673313 ], [ 101.461072, 26.640687 ], [ 101.461688, 26.606447 ], [ 101.402558, 26.604841 ], [ 101.395783, 26.591998 ], [ 101.422884, 26.53151 ], [ 101.458608, 26.49563 ], [ 101.506652, 26.499915 ], [ 101.530057, 26.467239 ], [ 101.565782, 26.454381 ], [ 101.637847, 26.388995 ], [ 101.635383, 26.357361 ], [ 101.660636, 26.346635 ], [ 101.64031, 26.318745 ], [ 101.597195, 26.303187 ], [ 101.586108, 26.279579 ], [ 101.630455, 26.224832 ], [ 101.690202, 26.241473 ], [ 101.737013, 26.219463 ], [ 101.773353, 26.168448 ], [ 101.807846, 26.156093 ], [ 101.796759, 26.114723 ], [ 101.839875, 26.082477 ], [ 101.835563, 26.04592 ], [ 101.857737, 26.049146 ], [ 101.899621, 26.099139 ], [ 101.929186, 26.105588 ], [ 101.954439, 26.084627 ], [ 102.020961, 26.096451 ], [ 102.080091, 26.065275 ], [ 102.107808, 26.068501 ], [ 102.152156, 26.10935 ], [ 102.174946, 26.146961 ], [ 102.242699, 26.190468 ], [ 102.245163, 26.212483 ], [ 102.349257, 26.244694 ], [ 102.392372, 26.296749 ], [ 102.440416, 26.300505 ], [ 102.542046, 26.338591 ], [ 102.570995, 26.362723 ], [ 102.629509, 26.336982 ], [ 102.638748, 26.307479 ], [ 102.60056, 26.250598 ], [ 102.659074, 26.221611 ], [ 102.709581, 26.210336 ], [ 102.739762, 26.268846 ], [ 102.785342, 26.298895 ], [ 102.833385, 26.306406 ], [ 102.878964, 26.364332 ], [ 102.893131, 26.338591 ], [ 102.975667, 26.340736 ], [ 102.998457, 26.371839 ], [ 102.988602, 26.413117 ], [ 102.989833, 26.482775 ], [ 103.030485, 26.485989 ], [ 103.052659, 26.514374 ], [ 103.052659, 26.555602 ], [ 103.035413, 26.556673 ], [ 103.026174, 26.664221 ], [ 103.005232, 26.679195 ], [ 103.008312, 26.710741 ], [ 102.983674, 26.76686 ], [ 102.991681, 26.775409 ], [ 102.966428, 26.837904 ], [ 102.949181, 26.843244 ], [ 102.896211, 26.91264 ], [ 102.894979, 27.001724 ], [ 102.870957, 27.026782 ], [ 102.913457, 27.133886 ], [ 102.904218, 27.227584 ], [ 102.883276, 27.258444 ], [ 102.883892, 27.299401 ], [ 102.899906, 27.317481 ], [ 102.941174, 27.405711 ], [ 102.989833, 27.367983 ], [ 103.055739, 27.40943 ], [ 103.080992, 27.396679 ], [ 103.141355, 27.420586 ], [ 103.144434, 27.450331 ], [ 103.19063, 27.523596 ], [ 103.232514, 27.56976 ], [ 103.2861, 27.561802 ], [ 103.29226, 27.632872 ], [ 103.349542, 27.678459 ], [ 103.369868, 27.708664 ], [ 103.393274, 27.709194 ], [ 103.461027, 27.779638 ], [ 103.487512, 27.794992 ], [ 103.509686, 27.843687 ], [ 103.502295, 27.910343 ], [ 103.55465, 27.978543 ], [ 103.515846, 27.965329 ], [ 103.486281, 28.033495 ], [ 103.459179, 28.021345 ], [ 103.430846, 28.044587 ], [ 103.470266, 28.122204 ], [ 103.533092, 28.168641 ], [ 103.573128, 28.230877 ], [ 103.643961, 28.260401 ], [ 103.692004, 28.232459 ], [ 103.701859, 28.198709 ], [ 103.740048, 28.23615 ], [ 103.770845, 28.233514 ], [ 103.828743, 28.285173 ], [ 103.877402, 28.316262 ], [ 103.85338, 28.356822 ], [ 103.860156, 28.383677 ], [ 103.828743, 28.44 ], [ 103.829975, 28.459995 ], [ 103.781931, 28.525216 ], [ 103.802873, 28.563068 ], [ 103.838598, 28.587244 ], [ 103.833054, 28.605109 ], [ 103.850917, 28.66709 ], [ 103.887873, 28.61982 ], [ 103.910047, 28.631377 ], [ 103.953779, 28.600906 ], [ 104.05972, 28.6277 ], [ 104.09606, 28.603533 ], [ 104.117618, 28.634003 ], [ 104.170589, 28.642932 ], [ 104.230951, 28.635579 ], [ 104.252509, 28.660788 ], [ 104.277147, 28.631902 ], [ 104.314719, 28.615617 ], [ 104.372617, 28.649235 ], [ 104.425588, 28.626649 ], [ 104.417581, 28.598279 ], [ 104.375697, 28.5946 ], [ 104.355987, 28.555183 ], [ 104.323342, 28.540989 ], [ 104.260516, 28.536257 ], [ 104.267908, 28.499448 ], [ 104.254357, 28.403683 ], [ 104.282074, 28.343128 ], [ 104.314103, 28.306778 ], [ 104.343052, 28.334173 ], [ 104.384936, 28.329959 ], [ 104.392943, 28.291497 ], [ 104.420045, 28.269889 ], [ 104.44961, 28.269889 ], [ 104.462544, 28.241422 ], [ 104.442834, 28.211366 ], [ 104.402182, 28.202928 ], [ 104.406494, 28.173389 ], [ 104.444682, 28.16231 ], [ 104.448994, 28.113758 ], [ 104.40095, 28.091586 ], [ 104.373233, 28.051454 ], [ 104.304248, 28.050926 ], [ 104.30856, 28.036136 ], [ 104.362762, 28.012891 ], [ 104.40095, 27.952114 ], [ 104.44961, 27.927794 ], [ 104.508124, 27.878078 ], [ 104.52537, 27.889187 ], [ 104.573413, 27.840512 ], [ 104.607906, 27.857974 ], [ 104.63316, 27.850567 ], [ 104.676275, 27.880723 ], [ 104.743413, 27.901881 ], [ 104.761891, 27.884426 ], [ 104.796999, 27.901352 ], [ 104.842579, 27.900294 ], [ 104.888158, 27.914574 ], [ 104.918339, 27.938897 ], [ 104.903557, 27.962158 ], [ 104.975006, 28.020816 ], [ 104.980549, 28.063073 ], [ 105.002107, 28.064129 ], [ 105.061853, 28.096866 ], [ 105.119752, 28.07205 ], [ 105.168411, 28.071522 ], [ 105.186889, 28.054623 ], [ 105.167795, 28.021345 ], [ 105.186273, 27.995454 ], [ 105.218302, 27.990698 ], [ 105.247867, 28.009193 ], [ 105.270657, 27.99704 ], [ 105.284823, 27.935725 ], [ 105.233084, 27.895534 ], [ 105.25957, 27.827811 ], [ 105.313157, 27.810874 ], [ 105.273736, 27.794992 ], [ 105.293447, 27.770637 ], [ 105.290367, 27.712373 ], [ 105.308229, 27.704955 ] ] ] ] } },\n{ \"type\": \"Feature\", \"properties\": { \"adcode\": \"540000\", \"name\": \"西藏自治区\", \"center\": [ 91.132212, 29.660361 ], \"centroid\": [ 88.388277, 31.56375 ], \"childrenNum\": 7, \"level\": \"province\", \"parent\": { \"adcode\": 100000 }, \"subFeatureIndex\": 25, \"acroutes\": [ 100000 ] }, \"geometry\": { \"type\": \"MultiPolygon\", \"coordinates\": [ [ [ [ 89.711414, 36.093272 ], [ 89.688624, 36.091337 ], [ 89.605472, 36.038123 ], [ 89.474893, 36.022151 ], [ 89.417611, 36.044897 ], [ 89.404676, 36.016827 ], [ 89.434857, 35.992136 ], [ 89.428082, 35.917531 ], [ 89.489676, 35.903475 ], [ 89.554965, 35.873414 ], [ 89.550654, 35.856924 ], [ 89.62395, 35.859349 ], [ 89.654747, 35.848193 ], [ 89.707718, 35.849163 ], [ 89.778551, 35.861775 ], [ 89.801957, 35.848193 ], [ 89.767464, 35.799183 ], [ 89.782863, 35.773453 ], [ 89.747138, 35.7516 ], [ 89.748986, 35.66267 ], [ 89.726196, 35.648082 ], [ 89.765616, 35.599922 ], [ 89.75145, 35.580942 ], [ 89.71203, 35.581915 ], [ 89.699711, 35.544916 ], [ 89.720037, 35.501566 ], [ 89.740979, 35.507412 ], [ 89.765, 35.482563 ], [ 89.739131, 35.468429 ], [ 89.685544, 35.416259 ], [ 89.658443, 35.425526 ], [ 89.619639, 35.412357 ], [ 89.58761, 35.383575 ], [ 89.497067, 35.361128 ], [ 89.516161, 35.330862 ], [ 89.494603, 35.298632 ], [ 89.531559, 35.276161 ], [ 89.48598, 35.256616 ], [ 89.450255, 35.223867 ], [ 89.46935, 35.214577 ], [ 89.519241, 35.133862 ], [ 89.579603, 35.118688 ], [ 89.593153, 35.104491 ], [ 89.59069, 35.057965 ], [ 89.560509, 34.938836 ], [ 89.578987, 34.895162 ], [ 89.670146, 34.887798 ], [ 89.707102, 34.919701 ], [ 89.747138, 34.903506 ], [ 89.78779, 34.921664 ], [ 89.821051, 34.902033 ], [ 89.814891, 34.86816 ], [ 89.838913, 34.865705 ], [ 89.867862, 34.81069 ], [ 89.825978, 34.796931 ], [ 89.799493, 34.743838 ], [ 89.732356, 34.732035 ], [ 89.72558, 34.660689 ], [ 89.74837, 34.641981 ], [ 89.798877, 34.628686 ], [ 89.777935, 34.574499 ], [ 89.814891, 34.548871 ], [ 89.823515, 34.455657 ], [ 89.819819, 34.420614 ], [ 89.799493, 34.39642 ], [ 89.820435, 34.369255 ], [ 89.858623, 34.359375 ], [ 89.86663, 34.324785 ], [ 89.825362, 34.293642 ], [ 89.838297, 34.263477 ], [ 89.816739, 34.16945 ], [ 89.789638, 34.150632 ], [ 89.760073, 34.152613 ], [ 89.756993, 34.124874 ], [ 89.71203, 34.131809 ], [ 89.655979, 34.097126 ], [ 89.656595, 34.057966 ], [ 89.635037, 34.049537 ], [ 89.684928, 33.990013 ], [ 89.688008, 33.959739 ], [ 89.718805, 33.946832 ], [ 89.73174, 33.921509 ], [ 89.795181, 33.865374 ], [ 89.837065, 33.868853 ], [ 89.899891, 33.80771 ], [ 89.942391, 33.801246 ], [ 89.902355, 33.758467 ], [ 89.907282, 33.741051 ], [ 89.983659, 33.725622 ], [ 89.981195, 33.70322 ], [ 90.008296, 33.687785 ], [ 89.984275, 33.612061 ], [ 90.01076, 33.553728 ], [ 90.083441, 33.525295 ], [ 90.088984, 33.478885 ], [ 90.107463, 33.460913 ], [ 90.22018, 33.437943 ], [ 90.246665, 33.423959 ], [ 90.332896, 33.310501 ], [ 90.363077, 33.279487 ], [ 90.405577, 33.260473 ], [ 90.490577, 33.264977 ], [ 90.562642, 33.229441 ], [ 90.627315, 33.180368 ], [ 90.704308, 33.135778 ], [ 90.740032, 33.142293 ], [ 90.803474, 33.114227 ], [ 90.88293, 33.120241 ], [ 90.902024, 33.083143 ], [ 90.927894, 33.120241 ], [ 91.001807, 33.11573 ], [ 91.037531, 33.098686 ], [ 91.072024, 33.113224 ], [ 91.147784, 33.07211 ], [ 91.161335, 33.108712 ], [ 91.18782, 33.106206 ], [ 91.226624, 33.141792 ], [ 91.261733, 33.141291 ], [ 91.311624, 33.108211 ], [ 91.370138, 33.100691 ], [ 91.436044, 33.066092 ], [ 91.49579, 33.109214 ], [ 91.535826, 33.10019 ], [ 91.55492, 33.060074 ], [ 91.583253, 33.0375 ], [ 91.664557, 33.012913 ], [ 91.685499, 32.989324 ], [ 91.752637, 32.969242 ], [ 91.799448, 32.942126 ], [ 91.839484, 32.948152 ], [ 91.857962, 32.90244 ], [ 91.896766, 32.907967 ], [ 91.955897, 32.8205 ], [ 92.018722, 32.829552 ], [ 92.038432, 32.860725 ], [ 92.101874, 32.860222 ], [ 92.145606, 32.885857 ], [ 92.205352, 32.866255 ], [ 92.227526, 32.821003 ], [ 92.193649, 32.801889 ], [ 92.211511, 32.788306 ], [ 92.198577, 32.754591 ], [ 92.255243, 32.720863 ], [ 92.310062, 32.751571 ], [ 92.343938, 32.738484 ], [ 92.355641, 32.764657 ], [ 92.411076, 32.748048 ], [ 92.459119, 32.76365 ], [ 92.484372, 32.745028 ], [ 92.56814, 32.73194 ], [ 92.574916, 32.741001 ], [ 92.634662, 32.720863 ], [ 92.667922, 32.73194 ], [ 92.686401, 32.76516 ], [ 92.756618, 32.743014 ], [ 92.789262, 32.719856 ], [ 92.822523, 32.729926 ], [ 92.866871, 32.698203 ], [ 92.933392, 32.719353 ], [ 92.964189, 32.714821 ], [ 93.00053, 32.741001 ], [ 93.019624, 32.737477 ], [ 93.023935, 32.703239 ], [ 93.069515, 32.626156 ], [ 93.087993, 32.63674 ], [ 93.159442, 32.644803 ], [ 93.176688, 32.6705 ], [ 93.210565, 32.655385 ], [ 93.239514, 32.662439 ], [ 93.260456, 32.62666 ], [ 93.300492, 32.619604 ], [ 93.308499, 32.580278 ], [ 93.33868, 32.5712 ], [ 93.385492, 32.525294 ], [ 93.411977, 32.558086 ], [ 93.4631, 32.556069 ], [ 93.476651, 32.504603 ], [ 93.501904, 32.503593 ], [ 93.516687, 32.47583 ], [ 93.618933, 32.522771 ], [ 93.651577, 32.571705 ], [ 93.721795, 32.578261 ], [ 93.75136, 32.56313 ], [ 93.820345, 32.549511 ], [ 93.851142, 32.50965 ], [ 93.861613, 32.466237 ], [ 93.90904, 32.463207 ], [ 93.960163, 32.484917 ], [ 93.978641, 32.459672 ], [ 94.03038, 32.448057 ], [ 94.049474, 32.469771 ], [ 94.091974, 32.463207 ], [ 94.137554, 32.433915 ], [ 94.176974, 32.454117 ], [ 94.196684, 32.51621 ], [ 94.250886, 32.51722 ], [ 94.292154, 32.502584 ], [ 94.294002, 32.519743 ], [ 94.350053, 32.533871 ], [ 94.371611, 32.524789 ], [ 94.395016, 32.594397 ], [ 94.435052, 32.562626 ], [ 94.463386, 32.572209 ], [ 94.459074, 32.599439 ], [ 94.522516, 32.595909 ], [ 94.591501, 32.640772 ], [ 94.614291, 32.673522 ], [ 94.638312, 32.645307 ], [ 94.737479, 32.587338 ], [ 94.762116, 32.526303 ], [ 94.78737, 32.522266 ], [ 94.80708, 32.486431 ], [ 94.852043, 32.463712 ], [ 94.889616, 32.472295 ], [ 94.912405, 32.41573 ], [ 94.944434, 32.404109 ], [ 94.988166, 32.422802 ], [ 95.057151, 32.395014 ], [ 95.075013, 32.376315 ], [ 95.075013, 32.376315 ], [ 95.081789, 32.384907 ], [ 95.153853, 32.386423 ], [ 95.218527, 32.397035 ], [ 95.228382, 32.363678 ], [ 95.261643, 32.348006 ], [ 95.193274, 32.332331 ], [ 95.096571, 32.322217 ], [ 95.079325, 32.279726 ], [ 95.10581, 32.258979 ], [ 95.20744, 32.297433 ], [ 95.214216, 32.321712 ], [ 95.241317, 32.3207 ], [ 95.239469, 32.287315 ], [ 95.270266, 32.194683 ], [ 95.270266, 32.194683 ], [ 95.31523, 32.148585 ], [ 95.366968, 32.151118 ], [ 95.367584, 32.178982 ], [ 95.406389, 32.182021 ], [ 95.440265, 32.157705 ], [ 95.454432, 32.061898 ], [ 95.421171, 32.033999 ], [ 95.454432, 32.007613 ], [ 95.395918, 32.001523 ], [ 95.360809, 31.95939 ], [ 95.3682, 31.92892 ], [ 95.408852, 31.918761 ], [ 95.406389, 31.896915 ], [ 95.456896, 31.801853 ], [ 95.480301, 31.795749 ], [ 95.511714, 31.750468 ], [ 95.546823, 31.73978 ], [ 95.580083, 31.76726 ], [ 95.634286, 31.782523 ], [ 95.779648, 31.748941 ], [ 95.823995, 31.68225 ], [ 95.853561, 31.714329 ], [ 95.846169, 31.736218 ], [ 95.89914, 31.81711 ], [ 95.983524, 31.816601 ], [ 95.989067, 31.78761 ], [ 96.064828, 31.720438 ], [ 96.135661, 31.70211 ], [ 96.148595, 31.686324 ], [ 96.156603, 31.602769 ], [ 96.207726, 31.598691 ], [ 96.221892, 31.647613 ], [ 96.245298, 31.657802 ], [ 96.252073, 31.697527 ], [ 96.222508, 31.733164 ], [ 96.231131, 31.749959 ], [ 96.178161, 31.775401 ], [ 96.183088, 31.835924 ], [ 96.202798, 31.841008 ], [ 96.214501, 31.876589 ], [ 96.188632, 31.904028 ], [ 96.220044, 31.905553 ], [ 96.253305, 31.929936 ], [ 96.288414, 31.919777 ], [ 96.389428, 31.919777 ], [ 96.407906, 31.845583 ], [ 96.435623, 31.796258 ], [ 96.468884, 31.769804 ], [ 96.519391, 31.74945 ], [ 96.56805, 31.711783 ], [ 96.615477, 31.737236 ], [ 96.661057, 31.705674 ], [ 96.691854, 31.722474 ], [ 96.722651, 31.686833 ], [ 96.778701, 31.675629 ], [ 96.790404, 31.698545 ], [ 96.840295, 31.720438 ], [ 96.799027, 31.792188 ], [ 96.765767, 31.819144 ], [ 96.760223, 31.860325 ], [ 96.794716, 31.869474 ], [ 96.81073, 31.894375 ], [ 96.776238, 31.935015 ], [ 96.753448, 31.944156 ], [ 96.742977, 32.001016 ], [ 96.722651, 32.013195 ], [ 96.824281, 32.007613 ], [ 96.868629, 31.964975 ], [ 96.863085, 31.996448 ], [ 96.894498, 32.013703 ], [ 96.941925, 31.986297 ], [ 96.965947, 32.008628 ], [ 96.935766, 32.048203 ], [ 97.006599, 32.067984 ], [ 97.028773, 32.04871 ], [ 97.127323, 32.044145 ], [ 97.169823, 32.032984 ], [ 97.188301, 32.055304 ], [ 97.214786, 32.042623 ], [ 97.233881, 32.063927 ], [ 97.201852, 32.090296 ], [ 97.219714, 32.109054 ], [ 97.258518, 32.072041 ], [ 97.308409, 32.076605 ], [ 97.293011, 32.096887 ], [ 97.313953, 32.130342 ], [ 97.271453, 32.139971 ], [ 97.264062, 32.182527 ], [ 97.299786, 32.294904 ], [ 97.32196, 32.303503 ], [ 97.371235, 32.273148 ], [ 97.415583, 32.296421 ], [ 97.424822, 32.322723 ], [ 97.387865, 32.427349 ], [ 97.341054, 32.440987 ], [ 97.388481, 32.501575 ], [ 97.334895, 32.514192 ], [ 97.332431, 32.542448 ], [ 97.3583, 32.563635 ], [ 97.374315, 32.546484 ], [ 97.411887, 32.575235 ], [ 97.448843, 32.586833 ], [ 97.463626, 32.55506 ], [ 97.50243, 32.530844 ], [ 97.540618, 32.536899 ], [ 97.670582, 32.51722 ], [ 97.684132, 32.530339 ], [ 97.730944, 32.527312 ], [ 97.795617, 32.521257 ], [ 97.80732, 32.50006 ], [ 97.863986, 32.499051 ], [ 97.880001, 32.486431 ], [ 97.940363, 32.482393 ], [ 98.079565, 32.415224 ], [ 98.107283, 32.391476 ], [ 98.125145, 32.401077 ], [ 98.218768, 32.342444 ], [ 98.208913, 32.318171 ], [ 98.23047, 32.262521 ], [ 98.218768, 32.234683 ], [ 98.260035, 32.208862 ], [ 98.303151, 32.121726 ], [ 98.357354, 32.087253 ], [ 98.404781, 32.045159 ], [ 98.402933, 32.026896 ], [ 98.434962, 32.007613 ], [ 98.432498, 31.922825 ], [ 98.399238, 31.895899 ], [ 98.426339, 31.856767 ], [ 98.414636, 31.832365 ], [ 98.461448, 31.800327 ], [ 98.508875, 31.751995 ], [ 98.516882, 31.717383 ], [ 98.545831, 31.717383 ], [ 98.553839, 31.660349 ], [ 98.619128, 31.591555 ], [ 98.651157, 31.57881 ], [ 98.696736, 31.538523 ], [ 98.714599, 31.508935 ], [ 98.844562, 31.429817 ], [ 98.84333, 31.416028 ], [ 98.887062, 31.37465 ], [ 98.810685, 31.306668 ], [ 98.805758, 31.279052 ], [ 98.773113, 31.249382 ], [ 98.691809, 31.333253 ], [ 98.643766, 31.338876 ], [ 98.616048, 31.3036 ], [ 98.60373, 31.257568 ], [ 98.62344, 31.221238 ], [ 98.602498, 31.192062 ], [ 98.675179, 31.15417 ], [ 98.710287, 31.1178 ], [ 98.712135, 31.082954 ], [ 98.736772, 31.049121 ], [ 98.774961, 31.031174 ], [ 98.806374, 30.995783 ], [ 98.797135, 30.948575 ], [ 98.774345, 30.908019 ], [ 98.797135, 30.87926 ], [ 98.850105, 30.849465 ], [ 98.904924, 30.782649 ], [ 98.957895, 30.765166 ], [ 98.963438, 30.728134 ], [ 98.907388, 30.698292 ], [ 98.92217, 30.609225 ], [ 98.939417, 30.598923 ], [ 98.926482, 30.569556 ], [ 98.932025, 30.521623 ], [ 98.965286, 30.449937 ], [ 98.967134, 30.33482 ], [ 98.986844, 30.280569 ], [ 98.970829, 30.260928 ], [ 98.993003, 30.215429 ], [ 98.9813, 30.182843 ], [ 98.989308, 30.151799 ], [ 99.044742, 30.079842 ], [ 99.036735, 30.053945 ], [ 99.055213, 29.958587 ], [ 99.068148, 29.931621 ], [ 99.0238, 29.846009 ], [ 99.018873, 29.792009 ], [ 98.992387, 29.677163 ], [ 99.014561, 29.607464 ], [ 99.052133, 29.563748 ], [ 99.044742, 29.520013 ], [ 99.066916, 29.421018 ], [ 99.058909, 29.417368 ], [ 99.075539, 29.316186 ], [ 99.114343, 29.243628 ], [ 99.113727, 29.221171 ], [ 99.037351, 29.20759 ], [ 99.024416, 29.188783 ], [ 98.9813, 29.204978 ], [ 98.960974, 29.165792 ], [ 98.967134, 29.128159 ], [ 98.991771, 29.105677 ], [ 99.013329, 29.036632 ], [ 98.925866, 28.978536 ], [ 98.917859, 28.886877 ], [ 98.973909, 28.864867 ], [ 98.972677, 28.832367 ], [ 98.922786, 28.823978 ], [ 98.912931, 28.800906 ], [ 98.852569, 28.798283 ], [ 98.827932, 28.821356 ], [ 98.821772, 28.920931 ], [ 98.786048, 28.998952 ], [ 98.757714, 29.004186 ], [ 98.70228, 28.9644 ], [ 98.655469, 28.976966 ], [ 98.624056, 28.95864 ], [ 98.6567, 28.910454 ], [ 98.643766, 28.895261 ], [ 98.668403, 28.843376 ], [ 98.652389, 28.817162 ], [ 98.683802, 28.740054 ], [ 98.666555, 28.712239 ], [ 98.594491, 28.667615 ], [ 98.637606, 28.552029 ], [ 98.619128, 28.50944 ], [ 98.625903, 28.489455 ], [ 98.673947, 28.478934 ], [ 98.693041, 28.43158 ], [ 98.740468, 28.348395 ], [ 98.746628, 28.321003 ], [ 98.710287, 28.288862 ], [ 98.712135, 28.229296 ], [ 98.649925, 28.200291 ], [ 98.625903, 28.165475 ], [ 98.559382, 28.182885 ], [ 98.494092, 28.141203 ], [ 98.464527, 28.151229 ], [ 98.428803, 28.104785 ], [ 98.389383, 28.114814 ], [ 98.389999, 28.16442 ], [ 98.370289, 28.18394 ], [ 98.37768, 28.246167 ], [ 98.353042, 28.293078 ], [ 98.317934, 28.324691 ], [ 98.301303, 28.384204 ], [ 98.208913, 28.358401 ], [ 98.207681, 28.330486 ], [ 98.231702, 28.314681 ], [ 98.266811, 28.242477 ], [ 98.21692, 28.212949 ], [ 98.169492, 28.206093 ], [ 98.17442, 28.163365 ], [ 98.139311, 28.142259 ], [ 98.097427, 28.166531 ], [ 98.090036, 28.195544 ], [ 98.056775, 28.202401 ], [ 98.03337, 28.187105 ], [ 98.008116, 28.214003 ], [ 98.020435, 28.253548 ], [ 97.907718, 28.363141 ], [ 97.871378, 28.361561 ], [ 97.842429, 28.326798 ], [ 97.801161, 28.326798 ], [ 97.769748, 28.3742 ], [ 97.738335, 28.396313 ], [ 97.737103, 28.465782 ], [ 97.68598, 28.519958 ], [ 97.634857, 28.532051 ], [ 97.60406, 28.515225 ], [ 97.569567, 28.541515 ], [ 97.521524, 28.495766 ], [ 97.507974, 28.46473 ], [ 97.521524, 28.444736 ], [ 97.499966, 28.428948 ], [ 97.485184, 28.38631 ], [ 97.488879, 28.347341 ], [ 97.518445, 28.327852 ], [ 97.469169, 28.30309 ], [ 97.461162, 28.26778 ], [ 97.422358, 28.297293 ], [ 97.402032, 28.279903 ], [ 97.398336, 28.238786 ], [ 97.349677, 28.235623 ], [ 97.362612, 28.199236 ], [ 97.352757, 28.149646 ], [ 97.326887, 28.132759 ], [ 97.340438, 28.104785 ], [ 97.305945, 28.071522 ], [ 97.320728, 28.054095 ], [ 97.375547, 28.062545 ], [ 97.378626, 28.031382 ], [ 97.413119, 28.01342 ], [ 97.379242, 27.970087 ], [ 97.372467, 27.907699 ], [ 97.386634, 27.882839 ], [ 97.324424, 27.880723 ], [ 97.303482, 27.913516 ], [ 97.253591, 27.891832 ], [ 97.167975, 27.811932 ], [ 97.103301, 27.780697 ], [ 97.097758, 27.740979 ], [ 97.062649, 27.742568 ], [ 97.049099, 27.81405 ], [ 97.008447, 27.807698 ], [ 96.972722, 27.861149 ], [ 96.908049, 27.884426 ], [ 96.849534, 27.874375 ], [ 96.810114, 27.890245 ], [ 96.784245, 27.931495 ], [ 96.711564, 27.9574 ], [ 96.690622, 27.948942 ], [ 96.635188, 27.994926 ], [ 96.623485, 28.024514 ], [ 96.538485, 28.075218 ], [ 96.499681, 28.067297 ], [ 96.46334, 28.143314 ], [ 96.426384, 28.161782 ], [ 96.395587, 28.143842 ], [ 96.398667, 28.118509 ], [ 96.367254, 28.118509 ], [ 96.298269, 28.140148 ], [ 96.275479, 28.228241 ], [ 96.194175, 28.212949 ], [ 96.098088, 28.212421 ], [ 96.074683, 28.193434 ], [ 95.989067, 28.198181 ], [ 95.936096, 28.240368 ], [ 95.907763, 28.241422 ], [ 95.899756, 28.278322 ], [ 95.874502, 28.29782 ], [ 95.832003, 28.295186 ], [ 95.787655, 28.270416 ], [ 95.740228, 28.275159 ], [ 95.674322, 28.254075 ], [ 95.528345, 28.182885 ], [ 95.437802, 28.161782 ], [ 95.39715, 28.142259 ], [ 95.371896, 28.110063 ], [ 95.352802, 28.04089 ], [ 95.32878, 28.017646 ], [ 95.28628, 27.939955 ], [ 95.067006, 27.840512 ], [ 95.015267, 27.82887 ], [ 94.947514, 27.792345 ], [ 94.88592, 27.743098 ], [ 94.836645, 27.728796 ], [ 94.78121, 27.699127 ], [ 94.722696, 27.683759 ], [ 94.660486, 27.650367 ], [ 94.524979, 27.596282 ], [ 94.478168, 27.602116 ], [ 94.443675, 27.585143 ], [ 94.399944, 27.589386 ], [ 94.353132, 27.578778 ], [ 94.277372, 27.58143 ], [ 94.220705, 27.536333 ], [ 94.147409, 27.458297 ], [ 94.056866, 27.375423 ], [ 93.970634, 27.30525 ], [ 93.849294, 27.168499 ], [ 93.841903, 27.045973 ], [ 93.817265, 27.025183 ], [ 93.747048, 27.015587 ], [ 93.625092, 26.955323 ], [ 93.56781, 26.938252 ], [ 93.232739, 26.906769 ], [ 93.111399, 26.880082 ], [ 93.050421, 26.883819 ], [ 92.909371, 26.914241 ], [ 92.802813, 26.895028 ], [ 92.682089, 26.947855 ], [ 92.64698, 26.952656 ], [ 92.549046, 26.941453 ], [ 92.496691, 26.921711 ], [ 92.404916, 26.9025 ], [ 92.28604, 26.892359 ], [ 92.197961, 26.86994 ], [ 92.109265, 26.854991 ], [ 92.124664, 26.960124 ], [ 92.076005, 27.041175 ], [ 92.043976, 27.052902 ], [ 92.02673, 27.108318 ], [ 92.032273, 27.167967 ], [ 92.061222, 27.190327 ], [ 92.071077, 27.237694 ], [ 92.091403, 27.264296 ], [ 92.125896, 27.273339 ], [ 92.064918, 27.391365 ], [ 92.021802, 27.444489 ], [ 92.010715, 27.474758 ], [ 91.946657, 27.464138 ], [ 91.839484, 27.489624 ], [ 91.753868, 27.462545 ], [ 91.71876, 27.467324 ], [ 91.663325, 27.507142 ], [ 91.626985, 27.509265 ], [ 91.585101, 27.540578 ], [ 91.564775, 27.58196 ], [ 91.582637, 27.598933 ], [ 91.562311, 27.627569 ], [ 91.570934, 27.650897 ], [ 91.622673, 27.692238 ], [ 91.642383, 27.7664 ], [ 91.610355, 27.819343 ], [ 91.544449, 27.820401 ], [ 91.561079, 27.855329 ], [ 91.618978, 27.856916 ], [ 91.611586, 27.891303 ], [ 91.552456, 27.90717 ], [ 91.486551, 27.937311 ], [ 91.490246, 27.971672 ], [ 91.464993, 28.002852 ], [ 91.309776, 28.057791 ], [ 91.251878, 27.970615 ], [ 91.216153, 27.989113 ], [ 91.162567, 27.968501 ], [ 91.147784, 27.927794 ], [ 91.155175, 27.894476 ], [ 91.113292, 27.846333 ], [ 91.025828, 27.857445 ], [ 90.96485, 27.900294 ], [ 90.976553, 27.935725 ], [ 90.96177, 27.9537 ], [ 90.896481, 27.946299 ], [ 90.853365, 27.969029 ], [ 90.806554, 28.015005 ], [ 90.802242, 28.040362 ], [ 90.741264, 28.053038 ], [ 90.701844, 28.076274 ], [ 90.591591, 28.021345 ], [ 90.569417, 28.044059 ], [ 90.513983, 28.062016 ], [ 90.47949, 28.044587 ], [ 90.43699, 28.063073 ], [ 90.384019, 28.06096 ], [ 90.367389, 28.088946 ], [ 90.297172, 28.153868 ], [ 90.231882, 28.144897 ], [ 90.189999, 28.161782 ], [ 90.166593, 28.187632 ], [ 90.124709, 28.190797 ], [ 90.103151, 28.141731 ], [ 90.07297, 28.155451 ], [ 90.03355, 28.136981 ], [ 90.017536, 28.162837 ], [ 89.976268, 28.189215 ], [ 89.901739, 28.18183 ], [ 89.869094, 28.221386 ], [ 89.789638, 28.240895 ], [ 89.779167, 28.197127 ], [ 89.720037, 28.170224 ], [ 89.605472, 28.161782 ], [ 89.541414, 28.088418 ], [ 89.511233, 28.086307 ], [ 89.461958, 28.03191 ], [ 89.44348, 27.968501 ], [ 89.375727, 27.875962 ], [ 89.295655, 27.84845 ], [ 89.238988, 27.796581 ], [ 89.184786, 27.673689 ], [ 89.131815, 27.633402 ], [ 89.128735, 27.611131 ], [ 89.163228, 27.574534 ], [ 89.109025, 27.537925 ], [ 89.095474, 27.471572 ], [ 89.132431, 27.441302 ], [ 89.182938, 27.373829 ], [ 89.152757, 27.319076 ], [ 89.077612, 27.287168 ], [ 89.067757, 27.240354 ], [ 88.984605, 27.208957 ], [ 88.942105, 27.261636 ], [ 88.911924, 27.272807 ], [ 88.920548, 27.325456 ], [ 88.901453, 27.327583 ], [ 88.867577, 27.3818 ], [ 88.838012, 27.37808 ], [ 88.809063, 27.405711 ], [ 88.783193, 27.467324 ], [ 88.797976, 27.521473 ], [ 88.770874, 27.563924 ], [ 88.813374, 27.606889 ], [ 88.816454, 27.641354 ], [ 88.852178, 27.671039 ], [ 88.850331, 27.710783 ], [ 88.870657, 27.743098 ], [ 88.863265, 27.811932 ], [ 88.888519, 27.846863 ], [ 88.864497, 27.921448 ], [ 88.846635, 27.921448 ], [ 88.842939, 28.006023 ], [ 88.812142, 28.018175 ], [ 88.764099, 28.068353 ], [ 88.67602, 28.068353 ], [ 88.645223, 28.111119 ], [ 88.620585, 28.091586 ], [ 88.565151, 28.083139 ], [ 88.554064, 28.027684 ], [ 88.498013, 28.04089 ], [ 88.469064, 28.009721 ], [ 88.43334, 28.002852 ], [ 88.401311, 27.976958 ], [ 88.357579, 27.986471 ], [ 88.254101, 27.939426 ], [ 88.242398, 27.967444 ], [ 88.203594, 27.943127 ], [ 88.156783, 27.957929 ], [ 88.120442, 27.915103 ], [ 88.137689, 27.878607 ], [ 88.111819, 27.864852 ], [ 88.090877, 27.885484 ], [ 88.037291, 27.901881 ], [ 87.982472, 27.884426 ], [ 87.930733, 27.909285 ], [ 87.826639, 27.927794 ], [ 87.782292, 27.890774 ], [ 87.77798, 27.860091 ], [ 87.727473, 27.802933 ], [ 87.668343, 27.809815 ], [ 87.670191, 27.832045 ], [ 87.598126, 27.814579 ], [ 87.58088, 27.859562 ], [ 87.45954, 27.820931 ], [ 87.418272, 27.825694 ], [ 87.421967, 27.856916 ], [ 87.364069, 27.824106 ], [ 87.317258, 27.826753 ], [ 87.280917, 27.845275 ], [ 87.249504, 27.839454 ], [ 87.227946, 27.812991 ], [ 87.173744, 27.818284 ], [ 87.118309, 27.840512 ], [ 87.080737, 27.910872 ], [ 87.035157, 27.946299 ], [ 86.935375, 27.955286 ], [ 86.926752, 27.985942 ], [ 86.885484, 27.995983 ], [ 86.864542, 28.022401 ], [ 86.827586, 28.012363 ], [ 86.756753, 28.032967 ], [ 86.768456, 28.06941 ], [ 86.74813, 28.089474 ], [ 86.700086, 28.101617 ], [ 86.662514, 28.092114 ], [ 86.647732, 28.06941 ], [ 86.611391, 28.069938 ], [ 86.60092, 28.097922 ], [ 86.568891, 28.103201 ], [ 86.55842, 28.047757 ], [ 86.537478, 28.044587 ], [ 86.513457, 27.996511 ], [ 86.514689, 27.954757 ], [ 86.475884, 27.944713 ], [ 86.450015, 27.908757 ], [ 86.414906, 27.904526 ], [ 86.393349, 27.926736 ], [ 86.308965, 27.950528 ], [ 86.27324, 27.976958 ], [ 86.231972, 27.974315 ], [ 86.206103, 28.084195 ], [ 86.223965, 28.092642 ], [ 86.19132, 28.167058 ], [ 86.140198, 28.114814 ], [ 86.128495, 28.086835 ], [ 86.086611, 28.090002 ], [ 86.082915, 28.018175 ], [ 86.125415, 27.923035 ], [ 86.053966, 27.900823 ], [ 86.002227, 27.90717 ], [ 85.949256, 27.937311 ], [ 85.980053, 27.984357 ], [ 85.901213, 28.053566 ], [ 85.898749, 28.101617 ], [ 85.871648, 28.124843 ], [ 85.854402, 28.172334 ], [ 85.791576, 28.195544 ], [ 85.753388, 28.227714 ], [ 85.720743, 28.372093 ], [ 85.682555, 28.375779 ], [ 85.650526, 28.283592 ], [ 85.601251, 28.254075 ], [ 85.602483, 28.295712 ], [ 85.520563, 28.326798 ], [ 85.458969, 28.332593 ], [ 85.415853, 28.321003 ], [ 85.379512, 28.274105 ], [ 85.349947, 28.298347 ], [ 85.272339, 28.282538 ], [ 85.209513, 28.338914 ], [ 85.179948, 28.324164 ], [ 85.113427, 28.344708 ], [ 85.129441, 28.377885 ], [ 85.108499, 28.461047 ], [ 85.160238, 28.49261 ], [ 85.189803, 28.544669 ], [ 85.18426, 28.587244 ], [ 85.195963, 28.624022 ], [ 85.155926, 28.643983 ], [ 85.126361, 28.676016 ], [ 85.05676, 28.674441 ], [ 84.995782, 28.611414 ], [ 84.981616, 28.586193 ], [ 84.896616, 28.587244 ], [ 84.857196, 28.567798 ], [ 84.773428, 28.610363 ], [ 84.698284, 28.633478 ], [ 84.699515, 28.671816 ], [ 84.669334, 28.680742 ], [ 84.650856, 28.714338 ], [ 84.620059, 28.732182 ], [ 84.557233, 28.74635 ], [ 84.483321, 28.735331 ], [ 84.445133, 28.764189 ], [ 84.434046, 28.823978 ], [ 84.404481, 28.828173 ], [ 84.408176, 28.85386 ], [ 84.340423, 28.866963 ], [ 84.330568, 28.859101 ], [ 84.268358, 28.895261 ], [ 84.234481, 28.889497 ], [ 84.228322, 28.949738 ], [ 84.248648, 29.030353 ], [ 84.224626, 29.049189 ], [ 84.194445, 29.045004 ], [ 84.192597, 29.084236 ], [ 84.20738, 29.118749 ], [ 84.176583, 29.133909 ], [ 84.17104, 29.19453 ], [ 84.197525, 29.210202 ], [ 84.203068, 29.239972 ], [ 84.130388, 29.239972 ], [ 84.116837, 29.286438 ], [ 84.052163, 29.296877 ], [ 84.002272, 29.291658 ], [ 83.986874, 29.325057 ], [ 83.949301, 29.312533 ], [ 83.911729, 29.323491 ], [ 83.851367, 29.294789 ], [ 83.82057, 29.294267 ], [ 83.800244, 29.249372 ], [ 83.727563, 29.244672 ], [ 83.667201, 29.200277 ], [ 83.656114, 29.16736 ], [ 83.596368, 29.174153 ], [ 83.57789, 29.203934 ], [ 83.548941, 29.201322 ], [ 83.492274, 29.280174 ], [ 83.463941, 29.285916 ], [ 83.450391, 29.332883 ], [ 83.423289, 29.361053 ], [ 83.415898, 29.420496 ], [ 83.383253, 29.42206 ], [ 83.325355, 29.502826 ], [ 83.27608, 29.505951 ], [ 83.266841, 29.571035 ], [ 83.217565, 29.60018 ], [ 83.164595, 29.595496 ], [ 83.159667, 29.61735 ], [ 83.12887, 29.623593 ], [ 83.088834, 29.604863 ], [ 83.011226, 29.667804 ], [ 82.966878, 29.658963 ], [ 82.9484, 29.704718 ], [ 82.885574, 29.689122 ], [ 82.830756, 29.687562 ], [ 82.816589, 29.717192 ], [ 82.774089, 29.726548 ], [ 82.757459, 29.761881 ], [ 82.691553, 29.766037 ], [ 82.737749, 29.80655 ], [ 82.703872, 29.847566 ], [ 82.6238, 29.834588 ], [ 82.64351, 29.868846 ], [ 82.609017, 29.886489 ], [ 82.560974, 29.955476 ], [ 82.498148, 29.947698 ], [ 82.474743, 29.973622 ], [ 82.431011, 29.989692 ], [ 82.412533, 30.011978 ], [ 82.368185, 30.014051 ], [ 82.333693, 30.045138 ], [ 82.311519, 30.035813 ], [ 82.246845, 30.071555 ], [ 82.17786, 30.06793 ], [ 82.183403, 30.12178 ], [ 82.207425, 30.143519 ], [ 82.188947, 30.18543 ], [ 82.142135, 30.200948 ], [ 82.114418, 30.226806 ], [ 82.11873, 30.279019 ], [ 82.132896, 30.30434 ], [ 82.104563, 30.346182 ], [ 82.060215, 30.332237 ], [ 82.022027, 30.339468 ], [ 81.99123, 30.322939 ], [ 81.954274, 30.355995 ], [ 81.939491, 30.344633 ], [ 81.872354, 30.373035 ], [ 81.759021, 30.385426 ], [ 81.723913, 30.407623 ], [ 81.63029, 30.446842 ], [ 81.613044, 30.412784 ], [ 81.566232, 30.428782 ], [ 81.555761, 30.369421 ], [ 81.494783, 30.381296 ], [ 81.454131, 30.412268 ], [ 81.418407, 30.420525 ], [ 81.406704, 30.40401 ], [ 81.432573, 30.379231 ], [ 81.406088, 30.369421 ], [ 81.399929, 30.319323 ], [ 81.427646, 30.305373 ], [ 81.406088, 30.291938 ], [ 81.419023, 30.270232 ], [ 81.397465, 30.240767 ], [ 81.393769, 30.199396 ], [ 81.335871, 30.149729 ], [ 81.269349, 30.153351 ], [ 81.293371, 30.094859 ], [ 81.2829, 30.061197 ], [ 81.247792, 30.032705 ], [ 81.256415, 30.011978 ], [ 81.225618, 30.005759 ], [ 81.131995, 30.016124 ], [ 81.09627, 30.052909 ], [ 81.110437, 30.085538 ], [ 81.085799, 30.100554 ], [ 81.082104, 30.151281 ], [ 81.038372, 30.205086 ], [ 81.034677, 30.246971 ], [ 80.996488, 30.267648 ], [ 80.933662, 30.266614 ], [ 80.910873, 30.30279 ], [ 80.81725, 30.321389 ], [ 80.719316, 30.414848 ], [ 80.692214, 30.416913 ], [ 80.633084, 30.458707 ], [ 80.585041, 30.463866 ], [ 80.549316, 30.448905 ], [ 80.504969, 30.483466 ], [ 80.446454, 30.495327 ], [ 80.43044, 30.515952 ], [ 80.357759, 30.520592 ], [ 80.322035, 30.564403 ], [ 80.261673, 30.566465 ], [ 80.214245, 30.586044 ], [ 80.143412, 30.55822 ], [ 80.04363, 30.603559 ], [ 80.014065, 30.661748 ], [ 79.970333, 30.685941 ], [ 79.955551, 30.738422 ], [ 79.961094, 30.771337 ], [ 79.900732, 30.7991 ], [ 79.913051, 30.833022 ], [ 79.890877, 30.855116 ], [ 79.835443, 30.851006 ], [ 79.75845, 30.936769 ], [ 79.729501, 30.941389 ], [ 79.668523, 30.980392 ], [ 79.660516, 30.956787 ], [ 79.59769, 30.925989 ], [ 79.550879, 30.957813 ], [ 79.505915, 31.027584 ], [ 79.427075, 31.018353 ], [ 79.424611, 31.061425 ], [ 79.404901, 31.071678 ], [ 79.35809, 31.031174 ], [ 79.316206, 31.01784 ], [ 79.33222, 30.969103 ], [ 79.227511, 30.949088 ], [ 79.205953, 31.0004 ], [ 79.181931, 31.015788 ], [ 79.096931, 30.992192 ], [ 79.059359, 31.028097 ], [ 79.010084, 31.043994 ], [ 78.97436, 31.115751 ], [ 78.997765, 31.158779 ], [ 78.930628, 31.220726 ], [ 78.923852, 31.246824 ], [ 78.884432, 31.277006 ], [ 78.865338, 31.312804 ], [ 78.859179, 31.289281 ], [ 78.795121, 31.301043 ], [ 78.755085, 31.355742 ], [ 78.760013, 31.392531 ], [ 78.792041, 31.435944 ], [ 78.755701, 31.478316 ], [ 78.729832, 31.478316 ], [ 78.740303, 31.532912 ], [ 78.779723, 31.545154 ], [ 78.833925, 31.584927 ], [ 78.845628, 31.609905 ], [ 78.806824, 31.64099 ], [ 78.798817, 31.675629 ], [ 78.763092, 31.668499 ], [ 78.706426, 31.778453 ], [ 78.654687, 31.819144 ], [ 78.665158, 31.851684 ], [ 78.739687, 31.885228 ], [ 78.768636, 31.92638 ], [ 78.762476, 31.947203 ], [ 78.705194, 31.988835 ], [ 78.60726, 32.023851 ], [ 78.609107, 32.052768 ], [ 78.527188, 32.11463 ], [ 78.509941, 32.147065 ], [ 78.469905, 32.127808 ], [ 78.429869, 32.194683 ], [ 78.430485, 32.212407 ], [ 78.475449, 32.236708 ], [ 78.508709, 32.297939 ], [ 78.480992, 32.329297 ], [ 78.483456, 32.357106 ], [ 78.458818, 32.379853 ], [ 78.472985, 32.435431 ], [ 78.426174, 32.502584 ], [ 78.395377, 32.530339 ], [ 78.424942, 32.565652 ], [ 78.500086, 32.580782 ], [ 78.518564, 32.605993 ], [ 78.577695, 32.615067 ], [ 78.588782, 32.637748 ], [ 78.628202, 32.630188 ], [ 78.675013, 32.658408 ], [ 78.6861, 32.680071 ], [ 78.741534, 32.703743 ], [ 78.74215, 32.654881 ], [ 78.781571, 32.608009 ], [ 78.760629, 32.563635 ], [ 78.782186, 32.480373 ], [ 78.81052, 32.436441 ], [ 78.87273, 32.40512 ], [ 78.904142, 32.374798 ], [ 78.970664, 32.331826 ], [ 79.005772, 32.375304 ], [ 79.067982, 32.380863 ], [ 79.103091, 32.369744 ], [ 79.124649, 32.416235 ], [ 79.135736, 32.472295 ], [ 79.180083, 32.492994 ], [ 79.190554, 32.511669 ], [ 79.252148, 32.516715 ], [ 79.272474, 32.561113 ], [ 79.308199, 32.596918 ], [ 79.299575, 32.637244 ], [ 79.27309, 32.678056 ], [ 79.301423, 32.728919 ], [ 79.275554, 32.778746 ], [ 79.225047, 32.784281 ], [ 79.237982, 32.846145 ], [ 79.227511, 32.89038 ], [ 79.255844, 32.942628 ], [ 79.204721, 32.964724 ], [ 79.162837, 33.01191 ], [ 79.139431, 33.117735 ], [ 79.162221, 33.165841 ], [ 79.152366, 33.184375 ], [ 79.10925, 33.200401 ], [ 79.072294, 33.22844 ], [ 79.083997, 33.245459 ], [ 79.041497, 33.268479 ], [ 79.022403, 33.323504 ], [ 78.9682, 33.334505 ], [ 78.949722, 33.376495 ], [ 78.896751, 33.41247 ], [ 78.84994, 33.419963 ], [ 78.816679, 33.480882 ], [ 78.74215, 33.55323 ], [ 78.755085, 33.623025 ], [ 78.713201, 33.623025 ], [ 78.684868, 33.654415 ], [ 78.692259, 33.676331 ], [ 78.779723, 33.73259 ], [ 78.758165, 33.790802 ], [ 78.766172, 33.823124 ], [ 78.756317, 33.8773 ], [ 78.762476, 33.90959 ], [ 78.734143, 33.918529 ], [ 78.744614, 33.980585 ], [ 78.736607, 33.999937 ], [ 78.656535, 34.030196 ], [ 78.661462, 34.086718 ], [ 78.737223, 34.089692 ], [ 78.801897, 34.137258 ], [ 78.828998, 34.125369 ], [ 78.878273, 34.163012 ], [ 78.910302, 34.143202 ], [ 78.9257, 34.155584 ], [ 78.941099, 34.212022 ], [ 78.958345, 34.230827 ], [ 78.981751, 34.31836 ], [ 79.019939, 34.313417 ], [ 79.039649, 34.33467 ], [ 79.048888, 34.348506 ], [ 79.0107, 34.399877 ], [ 79.039033, 34.421601 ], [ 79.072294, 34.412714 ], [ 79.161605, 34.441345 ], [ 79.179467, 34.422588 ], [ 79.241677, 34.415183 ], [ 79.274322, 34.435916 ], [ 79.326677, 34.44332 ], [ 79.363017, 34.428018 ], [ 79.435082, 34.447761 ], [ 79.504683, 34.45467 ], [ 79.545335, 34.476381 ], [ 79.58106, 34.456151 ], [ 79.675914, 34.451216 ], [ 79.699936, 34.477861 ], [ 79.735661, 34.471447 ], [ 79.801566, 34.478847 ], [ 79.861312, 34.528166 ], [ 79.84345, 34.55725 ], [ 79.88595, 34.642965 ], [ 79.866856, 34.671517 ], [ 79.906892, 34.683821 ], [ 79.898268, 34.732035 ], [ 79.947544, 34.821008 ], [ 79.926602, 34.849499 ], [ 79.961094, 34.862759 ], [ 79.996819, 34.856375 ], [ 80.003594, 34.895162 ], [ 80.034391, 34.902033 ], [ 80.041782, 34.943252 ], [ 80.02392, 34.971209 ], [ 80.04363, 35.022196 ], [ 80.031311, 35.034447 ], [ 80.078123, 35.076578 ], [ 80.118159, 35.066293 ], [ 80.23026, 35.147565 ], [ 80.223484, 35.177409 ], [ 80.257977, 35.203331 ], [ 80.362687, 35.20871 ], [ 80.267832, 35.295701 ], [ 80.286926, 35.35283 ], [ 80.321419, 35.38699 ], [ 80.375006, 35.387966 ], [ 80.432904, 35.449418 ], [ 80.444607, 35.417235 ], [ 80.514824, 35.391869 ], [ 80.532686, 35.404553 ], [ 80.56841, 35.391381 ], [ 80.599823, 35.409431 ], [ 80.65649, 35.393821 ], [ 80.690982, 35.364544 ], [ 80.689135, 35.339162 ], [ 80.759968, 35.334768 ], [ 80.844351, 35.345508 ], [ 80.894242, 35.324027 ], [ 80.924423, 35.330862 ], [ 80.963844, 35.310842 ], [ 81.026053, 35.31133 ], [ 81.002648, 35.334768 ], [ 81.030981, 35.337209 ], [ 81.031597, 35.380648 ], [ 81.054387, 35.402602 ], [ 81.09935, 35.40748 ], [ 81.103662, 35.386015 ], [ 81.142466, 35.365032 ], [ 81.191741, 35.36552 ], [ 81.219458, 35.319144 ], [ 81.26627, 35.322562 ], [ 81.285364, 35.345508 ], [ 81.314313, 35.337209 ], [ 81.363588, 35.354783 ], [ 81.385762, 35.335256 ], [ 81.441196, 35.333303 ], [ 81.447972, 35.318167 ], [ 81.504638, 35.279092 ], [ 81.513261, 35.23511 ], [ 81.68634, 35.235599 ], [ 81.736847, 35.26248 ], [ 81.804601, 35.270786 ], [ 81.853876, 35.25857 ], [ 81.927789, 35.271275 ], [ 81.955506, 35.307423 ], [ 81.99123, 35.30547 ], [ 82.030034, 35.321585 ], [ 82.05344, 35.35039 ], [ 82.029419, 35.426013 ], [ 82.034346, 35.451855 ], [ 82.071302, 35.450393 ], [ 82.086701, 35.467454 ], [ 82.164925, 35.495719 ], [ 82.189563, 35.513258 ], [ 82.234526, 35.520565 ], [ 82.263475, 35.547837 ], [ 82.2992, 35.544916 ], [ 82.328149, 35.559523 ], [ 82.350323, 35.611113 ], [ 82.336156, 35.651486 ], [ 82.392823, 35.656349 ], [ 82.424852, 35.712736 ], [ 82.468583, 35.717595 ], [ 82.501844, 35.701073 ], [ 82.546192, 35.708362 ], [ 82.628727, 35.692324 ], [ 82.652133, 35.67288 ], [ 82.731589, 35.637868 ], [ 82.780249, 35.666073 ], [ 82.795031, 35.688436 ], [ 82.873871, 35.688922 ], [ 82.894813, 35.673852 ], [ 82.967494, 35.667532 ], [ 82.956407, 35.636409 ], [ 82.981661, 35.599922 ], [ 82.971806, 35.548324 ], [ 82.998907, 35.484512 ], [ 83.067892, 35.46258 ], [ 83.088834, 35.425526 ], [ 83.127022, 35.398699 ], [ 83.178145, 35.38943 ], [ 83.251442, 35.417722 ], [ 83.280391, 35.401138 ], [ 83.333978, 35.397236 ], [ 83.405427, 35.380648 ], [ 83.449159, 35.382111 ], [ 83.502745, 35.360639 ], [ 83.540318, 35.364056 ], [ 83.54155, 35.341603 ], [ 83.599448, 35.351366 ], [ 83.622238, 35.335256 ], [ 83.677672, 35.361128 ], [ 83.785462, 35.36308 ], [ 83.79778, 35.354783 ], [ 83.885244, 35.367472 ], [ 83.906186, 35.40309 ], [ 84.005968, 35.422599 ], [ 84.077417, 35.400163 ], [ 84.095895, 35.362592 ], [ 84.140859, 35.379184 ], [ 84.160569, 35.359663 ], [ 84.200605, 35.381135 ], [ 84.274517, 35.404065 ], [ 84.333032, 35.413821 ], [ 84.424191, 35.466479 ], [ 84.45314, 35.473303 ], [ 84.475929, 35.516181 ], [ 84.448828, 35.550272 ], [ 84.513502, 35.564391 ], [ 84.570168, 35.588242 ], [ 84.628067, 35.595055 ], [ 84.704443, 35.616951 ], [ 84.729081, 35.613546 ], [ 84.798066, 35.647595 ], [ 84.920022, 35.696213 ], [ 84.973608, 35.709334 ], [ 84.99455, 35.737028 ], [ 85.053065, 35.752086 ], [ 85.146071, 35.742371 ], [ 85.271107, 35.788989 ], [ 85.341324, 35.753543 ], [ 85.373969, 35.700101 ], [ 85.518715, 35.680658 ], [ 85.566142, 35.6403 ], [ 85.612953, 35.651486 ], [ 85.65299, 35.731199 ], [ 85.691178, 35.751114 ], [ 85.811286, 35.778794 ], [ 85.835308, 35.771996 ], [ 85.903677, 35.78462 ], [ 85.949256, 35.778794 ], [ 86.035488, 35.846738 ], [ 86.05335, 35.842857 ], [ 86.090306, 35.876809 ], [ 86.093386, 35.906868 ], [ 86.129111, 35.941761 ], [ 86.150668, 36.00424 ], [ 86.173458, 36.008113 ], [ 86.199944, 36.047801 ], [ 86.182081, 36.064734 ], [ 86.187625, 36.130983 ], [ 86.248603, 36.141616 ], [ 86.2794, 36.170608 ], [ 86.35824, 36.168676 ], [ 86.392733, 36.206834 ], [ 86.454943, 36.221319 ], [ 86.515305, 36.205385 ], [ 86.531935, 36.227113 ], [ 86.599072, 36.222285 ], [ 86.69947, 36.24449 ], [ 86.746282, 36.291777 ], [ 86.836209, 36.291294 ], [ 86.86331, 36.299977 ], [ 86.887332, 36.262829 ], [ 86.931064, 36.265242 ], [ 86.943998, 36.284058 ], [ 86.996353, 36.308658 ], [ 87.051788, 36.2966 ], [ 87.08628, 36.310587 ], [ 87.149106, 36.297565 ], [ 87.161425, 36.325535 ], [ 87.193454, 36.349158 ], [ 87.292004, 36.358797 ], [ 87.348055, 36.393008 ], [ 87.363453, 36.420463 ], [ 87.386859, 36.412757 ], [ 87.426895, 36.42576 ], [ 87.460155, 36.409868 ], [ 87.470626, 36.354459 ], [ 87.570409, 36.342409 ], [ 87.6203, 36.360243 ], [ 87.731785, 36.384818 ], [ 87.767509, 36.3747 ], [ 87.826023, 36.391563 ], [ 87.838342, 36.383855 ], [ 87.919646, 36.39349 ], [ 87.95845, 36.408423 ], [ 87.983088, 36.437797 ], [ 88.006494, 36.430575 ], [ 88.092109, 36.43539 ], [ 88.134609, 36.427205 ], [ 88.182652, 36.452721 ], [ 88.222688, 36.447426 ], [ 88.241782, 36.468605 ], [ 88.282434, 36.470049 ], [ 88.366202, 36.458016 ], [ 88.356963, 36.477268 ], [ 88.41055, 36.473418 ], [ 88.470912, 36.48208 ], [ 88.498629, 36.446463 ], [ 88.573158, 36.461386 ], [ 88.618121, 36.428168 ], [ 88.623665, 36.389636 ], [ 88.690186, 36.367954 ], [ 88.766563, 36.292259 ], [ 88.783809, 36.291777 ], [ 88.802903, 36.33807 ], [ 88.838628, 36.353496 ], [ 88.870657, 36.348193 ], [ 88.926091, 36.36458 ], [ 88.964279, 36.318785 ], [ 89.013554, 36.315409 ], [ 89.054822, 36.291777 ], [ 89.10225, 36.281164 ], [ 89.126887, 36.254626 ], [ 89.198952, 36.260417 ], [ 89.232213, 36.295636 ], [ 89.292575, 36.231457 ], [ 89.335075, 36.23725 ], [ 89.375727, 36.228078 ], [ 89.490291, 36.151281 ], [ 89.594385, 36.126632 ], [ 89.614711, 36.109712 ], [ 89.711414, 36.093272 ] ] ] ] } },\n{ \"type\": \"Feature\", \"properties\": { \"adcode\": \"610000\", \"name\": \"陕西省\", \"center\": [ 108.948024, 34.263161 ], \"centroid\": [ 108.887304, 35.263625 ], \"childrenNum\": 10, \"level\": \"province\", \"parent\": { \"adcode\": 100000 }, \"subFeatureIndex\": 26, \"acroutes\": [ 100000 ] }, \"geometry\": { \"type\": \"MultiPolygon\", \"coordinates\": [ [ [ [ 110.398352, 33.176862 ], [ 110.398352, 33.176862 ], [ 110.372482, 33.186379 ], [ 110.33799, 33.160331 ], [ 110.285635, 33.171352 ], [ 110.218497, 33.163336 ], [ 110.164911, 33.209415 ], [ 110.031252, 33.191888 ], [ 109.999223, 33.212419 ], [ 109.973353, 33.203907 ], [ 109.916687, 33.229942 ], [ 109.852013, 33.247961 ], [ 109.813209, 33.236449 ], [ 109.732521, 33.231443 ], [ 109.693101, 33.254468 ], [ 109.649985, 33.251465 ], [ 109.619804, 33.275484 ], [ 109.60687, 33.235949 ], [ 109.514479, 33.237951 ], [ 109.498464, 33.207412 ], [ 109.438718, 33.152314 ], [ 109.468283, 33.140288 ], [ 109.522486, 33.138785 ], [ 109.576073, 33.110216 ], [ 109.688174, 33.116733 ], [ 109.704188, 33.101694 ], [ 109.794731, 33.067095 ], [ 109.785492, 32.987316 ], [ 109.76455, 32.909474 ], [ 109.789804, 32.882339 ], [ 109.847702, 32.893395 ], [ 109.856941, 32.910479 ], [ 109.907448, 32.903947 ], [ 109.927158, 32.887364 ], [ 109.988752, 32.886359 ], [ 110.051578, 32.851676 ], [ 110.105164, 32.832569 ], [ 110.142121, 32.802895 ], [ 110.127338, 32.77774 ], [ 110.159367, 32.767173 ], [ 110.156903, 32.683093 ], [ 110.206179, 32.633212 ], [ 110.153824, 32.593388 ], [ 110.124259, 32.616579 ], [ 110.090382, 32.617083 ], [ 110.084223, 32.580782 ], [ 110.017701, 32.546989 ], [ 109.97089, 32.577756 ], [ 109.910528, 32.592884 ], [ 109.816905, 32.577252 ], [ 109.746072, 32.594901 ], [ 109.726978, 32.608513 ], [ 109.631507, 32.599943 ], [ 109.619804, 32.56767 ], [ 109.637051, 32.540935 ], [ 109.575457, 32.506622 ], [ 109.526797, 32.43341 ], [ 109.529877, 32.405625 ], [ 109.502776, 32.38895 ], [ 109.513247, 32.342444 ], [ 109.495385, 32.300468 ], [ 109.528645, 32.270112 ], [ 109.550203, 32.225065 ], [ 109.592703, 32.219495 ], [ 109.604406, 32.199241 ], [ 109.58716, 32.161251 ], [ 109.621652, 32.106519 ], [ 109.590855, 32.047696 ], [ 109.590855, 32.012688 ], [ 109.631507, 31.962436 ], [ 109.62042, 31.928412 ], [ 109.584696, 31.900472 ], [ 109.60379, 31.885737 ], [ 109.633971, 31.824738 ], [ 109.633971, 31.804396 ], [ 109.592087, 31.789136 ], [ 109.585928, 31.726546 ], [ 109.549587, 31.73011 ], [ 109.502776, 31.716365 ], [ 109.446109, 31.722983 ], [ 109.381436, 31.705165 ], [ 109.281654, 31.716874 ], [ 109.282885, 31.743343 ], [ 109.253936, 31.759628 ], [ 109.279806, 31.776418 ], [ 109.27611, 31.79931 ], [ 109.195422, 31.817618 ], [ 109.191111, 31.85575 ], [ 109.123357, 31.892851 ], [ 109.085785, 31.929428 ], [ 108.986619, 31.980205 ], [ 108.902235, 31.984774 ], [ 108.837561, 32.039072 ], [ 108.78767, 32.04871 ], [ 108.75133, 32.076098 ], [ 108.734084, 32.106519 ], [ 108.676801, 32.10297 ], [ 108.585026, 32.17189 ], [ 108.543758, 32.177969 ], [ 108.509882, 32.201266 ], [ 108.507418, 32.245819 ], [ 108.469846, 32.270618 ], [ 108.414411, 32.252399 ], [ 108.389773, 32.263533 ], [ 108.310933, 32.232152 ], [ 108.240716, 32.274666 ], [ 108.179738, 32.221521 ], [ 108.156948, 32.239239 ], [ 108.143398, 32.219495 ], [ 108.086731, 32.233165 ], [ 108.018362, 32.2119 ], [ 108.024521, 32.177462 ], [ 107.979558, 32.146051 ], [ 107.924739, 32.197215 ], [ 107.890247, 32.214432 ], [ 107.864377, 32.201266 ], [ 107.812022, 32.247844 ], [ 107.753508, 32.338399 ], [ 107.707929, 32.331826 ], [ 107.680827, 32.397035 ], [ 107.648183, 32.413709 ], [ 107.598291, 32.411688 ], [ 107.527458, 32.38238 ], [ 107.489886, 32.425328 ], [ 107.456625, 32.41775 ], [ 107.460937, 32.453612 ], [ 107.438763, 32.465732 ], [ 107.436299, 32.529835 ], [ 107.382097, 32.54043 ], [ 107.356843, 32.506622 ], [ 107.313727, 32.489965 ], [ 107.287858, 32.457147 ], [ 107.263836, 32.403099 ], [ 107.212097, 32.428864 ], [ 107.189924, 32.468256 ], [ 107.127098, 32.482393 ], [ 107.080286, 32.542448 ], [ 107.108004, 32.600951 ], [ 107.098765, 32.649338 ], [ 107.05996, 32.686115 ], [ 107.066736, 32.708779 ], [ 107.012533, 32.721367 ], [ 106.912751, 32.704247 ], [ 106.903512, 32.721367 ], [ 106.854853, 32.724388 ], [ 106.82344, 32.705254 ], [ 106.793259, 32.712807 ], [ 106.783404, 32.735967 ], [ 106.733513, 32.739491 ], [ 106.670071, 32.694678 ], [ 106.626955, 32.682086 ], [ 106.585687, 32.68813 ], [ 106.517934, 32.668485 ], [ 106.498224, 32.649338 ], [ 106.451412, 32.65992 ], [ 106.421231, 32.616579 ], [ 106.389203, 32.62666 ], [ 106.347935, 32.671003 ], [ 106.301123, 32.680071 ], [ 106.267863, 32.673522 ], [ 106.254928, 32.693671 ], [ 106.17424, 32.6977 ], [ 106.120037, 32.719856 ], [ 106.071378, 32.758114 ], [ 106.076305, 32.759121 ], [ 106.076921, 32.76365 ], [ 106.07261, 32.76365 ], [ 106.093552, 32.82402 ], [ 106.071378, 32.828546 ], [ 106.044277, 32.864747 ], [ 106.011632, 32.829552 ], [ 105.969132, 32.849162 ], [ 105.93156, 32.826032 ], [ 105.893371, 32.838603 ], [ 105.849024, 32.817985 ], [ 105.825002, 32.824523 ], [ 105.822538, 32.770192 ], [ 105.779423, 32.750061 ], [ 105.768952, 32.767676 ], [ 105.719061, 32.759624 ], [ 105.677793, 32.726402 ], [ 105.596489, 32.69921 ], [ 105.585402, 32.728919 ], [ 105.563844, 32.724891 ], [ 105.555221, 32.794343 ], [ 105.534279, 32.790822 ], [ 105.524424, 32.847654 ], [ 105.495475, 32.873292 ], [ 105.49917, 32.911986 ], [ 105.528119, 32.919019 ], [ 105.565692, 32.906962 ], [ 105.590329, 32.87681 ], [ 105.638373, 32.879323 ], [ 105.656851, 32.895405 ], [ 105.735691, 32.905454 ], [ 105.82685, 32.950663 ], [ 105.861959, 32.939112 ], [ 105.917393, 32.993841 ], [ 105.926632, 33.042517 ], [ 105.914929, 33.066092 ], [ 105.934639, 33.112221 ], [ 105.923552, 33.147805 ], [ 105.897067, 33.146803 ], [ 105.93156, 33.178365 ], [ 105.968516, 33.154318 ], [ 105.965436, 33.204407 ], [ 105.917393, 33.237951 ], [ 105.862574, 33.234447 ], [ 105.799133, 33.258471 ], [ 105.791741, 33.278486 ], [ 105.752937, 33.291994 ], [ 105.755401, 33.329004 ], [ 105.709822, 33.382991 ], [ 105.827466, 33.379993 ], [ 105.837937, 33.410971 ], [ 105.831162, 33.451926 ], [ 105.842248, 33.489866 ], [ 105.871198, 33.511325 ], [ 105.902611, 33.556222 ], [ 105.940183, 33.570684 ], [ 105.971596, 33.613058 ], [ 106.047356, 33.610067 ], [ 106.086776, 33.617045 ], [ 106.117573, 33.602591 ], [ 106.108334, 33.569686 ], [ 106.187174, 33.546746 ], [ 106.237681, 33.564201 ], [ 106.303587, 33.604585 ], [ 106.35163, 33.587137 ], [ 106.384891, 33.612061 ], [ 106.447101, 33.613058 ], [ 106.456956, 33.532779 ], [ 106.540108, 33.512822 ], [ 106.58076, 33.576169 ], [ 106.575832, 33.631497 ], [ 106.534564, 33.695254 ], [ 106.482825, 33.707203 ], [ 106.488369, 33.757969 ], [ 106.461883, 33.789807 ], [ 106.491448, 33.834559 ], [ 106.475434, 33.875809 ], [ 106.428007, 33.866368 ], [ 106.41076, 33.909093 ], [ 106.474202, 33.970659 ], [ 106.471738, 34.024244 ], [ 106.505615, 34.056479 ], [ 106.501919, 34.105055 ], [ 106.560434, 34.109514 ], [ 106.585071, 34.149641 ], [ 106.55797, 34.229837 ], [ 106.5321, 34.254079 ], [ 106.496376, 34.238248 ], [ 106.526557, 34.292159 ], [ 106.577064, 34.280786 ], [ 106.589383, 34.253584 ], [ 106.63373, 34.260014 ], [ 106.652825, 34.24369 ], [ 106.68239, 34.256057 ], [ 106.705179, 34.299575 ], [ 106.691013, 34.337635 ], [ 106.717498, 34.369255 ], [ 106.638042, 34.391481 ], [ 106.610941, 34.454177 ], [ 106.558586, 34.48822 ], [ 106.513622, 34.498085 ], [ 106.514238, 34.511894 ], [ 106.455108, 34.531617 ], [ 106.334384, 34.517811 ], [ 106.341159, 34.568093 ], [ 106.314058, 34.578934 ], [ 106.419384, 34.643458 ], [ 106.471122, 34.634102 ], [ 106.442173, 34.675455 ], [ 106.456956, 34.703996 ], [ 106.487137, 34.715311 ], [ 106.505615, 34.746789 ], [ 106.539492, 34.745805 ], [ 106.575216, 34.769897 ], [ 106.550579, 34.82936 ], [ 106.556122, 34.861285 ], [ 106.527789, 34.876507 ], [ 106.493296, 34.941289 ], [ 106.484673, 34.983959 ], [ 106.494528, 35.006021 ], [ 106.494528, 35.006021 ], [ 106.52163, 35.027587 ], [ 106.541956, 35.083925 ], [ 106.577064, 35.089312 ], [ 106.615252, 35.071191 ], [ 106.706411, 35.081966 ], [ 106.710723, 35.100574 ], [ 106.838222, 35.080007 ], [ 106.901664, 35.094698 ], [ 106.950323, 35.066782 ], [ 106.990975, 35.068252 ], [ 107.012533, 35.029547 ], [ 107.08275, 35.024156 ], [ 107.089526, 34.976604 ], [ 107.119707, 34.950119 ], [ 107.162206, 34.944233 ], [ 107.189308, 34.893198 ], [ 107.252749, 34.880925 ], [ 107.286626, 34.931968 ], [ 107.350068, 34.93393 ], [ 107.369162, 34.917738 ], [ 107.400575, 34.932949 ], [ 107.455394, 34.916757 ], [ 107.523763, 34.909886 ], [ 107.564415, 34.968757 ], [ 107.619849, 34.964834 ], [ 107.638943, 34.935402 ], [ 107.675284, 34.9511 ], [ 107.741805, 34.953553 ], [ 107.842203, 34.979056 ], [ 107.863145, 34.999158 ], [ 107.846515, 35.024646 ], [ 107.814486, 35.024646 ], [ 107.773218, 35.060904 ], [ 107.773218, 35.060904 ], [ 107.769523, 35.064333 ], [ 107.769523, 35.064333 ], [ 107.727639, 35.120157 ], [ 107.715936, 35.168114 ], [ 107.686371, 35.218 ], [ 107.652494, 35.244886 ], [ 107.667277, 35.257104 ], [ 107.737494, 35.267366 ], [ 107.745501, 35.311819 ], [ 107.841587, 35.276649 ], [ 107.867457, 35.256127 ], [ 107.960464, 35.263457 ], [ 107.949993, 35.245375 ], [ 108.049159, 35.253683 ], [ 108.094739, 35.280069 ], [ 108.174811, 35.304981 ], [ 108.221622, 35.296678 ], [ 108.239484, 35.256127 ], [ 108.296767, 35.267855 ], [ 108.345426, 35.300586 ], [ 108.36144, 35.279581 ], [ 108.48894, 35.275184 ], [ 108.547454, 35.304981 ], [ 108.583178, 35.294724 ], [ 108.614591, 35.328909 ], [ 108.61028, 35.355271 ], [ 108.631222, 35.418698 ], [ 108.605968, 35.503028 ], [ 108.625678, 35.537124 ], [ 108.618287, 35.557088 ], [ 108.539447, 35.605761 ], [ 108.517889, 35.699615 ], [ 108.533903, 35.746257 ], [ 108.527744, 35.82442 ], [ 108.499411, 35.872444 ], [ 108.518505, 35.905414 ], [ 108.562852, 35.921409 ], [ 108.593649, 35.950967 ], [ 108.652164, 35.94806 ], [ 108.659555, 35.990683 ], [ 108.688504, 36.021183 ], [ 108.682345, 36.062316 ], [ 108.712526, 36.138716 ], [ 108.646004, 36.254143 ], [ 108.641693, 36.359279 ], [ 108.651548, 36.384818 ], [ 108.618903, 36.433946 ], [ 108.562852, 36.43876 ], [ 108.510498, 36.47438 ], [ 108.514809, 36.445501 ], [ 108.495099, 36.422389 ], [ 108.460606, 36.422871 ], [ 108.408252, 36.45946 ], [ 108.391621, 36.505654 ], [ 108.365136, 36.519603 ], [ 108.340498, 36.559032 ], [ 108.262274, 36.549417 ], [ 108.245644, 36.571048 ], [ 108.210535, 36.577296 ], [ 108.204992, 36.606607 ], [ 108.204992, 36.606607 ], [ 108.222854, 36.631105 ], [ 108.1976, 36.630144 ], [ 108.163724, 36.563839 ], [ 108.092891, 36.587388 ], [ 108.079956, 36.614294 ], [ 108.060862, 36.592194 ], [ 108.001732, 36.639269 ], [ 108.02329, 36.647912 ], [ 108.006659, 36.683435 ], [ 107.938906, 36.655594 ], [ 107.940754, 36.694953 ], [ 107.914268, 36.720861 ], [ 107.907493, 36.750118 ], [ 107.866841, 36.766899 ], [ 107.768291, 36.792783 ], [ 107.742421, 36.811951 ], [ 107.722095, 36.802367 ], [ 107.670356, 36.83303 ], [ 107.642023, 36.819137 ], [ 107.5909, 36.836382 ], [ 107.540393, 36.828718 ], [ 107.533618, 36.867031 ], [ 107.478183, 36.908196 ], [ 107.365466, 36.905324 ], [ 107.336517, 36.925899 ], [ 107.310032, 36.912502 ], [ 107.291554, 36.979463 ], [ 107.291554, 36.979463 ], [ 107.288474, 37.008143 ], [ 107.288474, 37.008143 ], [ 107.28601, 37.054963 ], [ 107.268764, 37.099367 ], [ 107.281083, 37.127047 ], [ 107.306952, 37.100799 ], [ 107.334669, 37.138975 ], [ 107.336517, 37.165687 ], [ 107.317423, 37.200017 ], [ 107.270612, 37.229089 ], [ 107.309416, 37.239095 ], [ 107.273075, 37.29101 ], [ 107.257677, 37.337179 ], [ 107.282931, 37.437036 ], [ 107.284162, 37.481691 ], [ 107.345756, 37.518725 ], [ 107.369162, 37.58752 ], [ 107.330358, 37.584201 ], [ 107.311264, 37.609806 ], [ 107.361155, 37.613125 ], [ 107.422133, 37.665254 ], [ 107.389488, 37.671413 ], [ 107.387024, 37.691305 ], [ 107.425828, 37.684201 ], [ 107.484959, 37.706458 ], [ 107.499125, 37.765619 ], [ 107.57119, 37.776499 ], [ 107.599523, 37.791162 ], [ 107.620465, 37.776026 ], [ 107.646335, 37.805349 ], [ 107.659269, 37.844112 ], [ 107.65003, 37.86443 ], [ 107.684523, 37.888522 ], [ 107.732566, 37.84931 ], [ 107.842819, 37.828987 ], [ 107.884703, 37.808186 ], [ 107.982022, 37.787378 ], [ 107.993109, 37.735335 ], [ 108.025753, 37.696041 ], [ 108.012819, 37.66857 ], [ 108.025137, 37.649619 ], [ 108.055318, 37.652462 ], [ 108.134159, 37.622131 ], [ 108.193905, 37.638246 ], [ 108.205608, 37.655779 ], [ 108.24626, 37.665728 ], [ 108.293071, 37.656726 ], [ 108.301078, 37.640616 ], [ 108.422418, 37.648672 ], [ 108.485244, 37.678044 ], [ 108.532671, 37.690832 ], [ 108.628142, 37.651988 ], [ 108.699591, 37.669518 ], [ 108.720533, 37.683728 ], [ 108.777815, 37.683728 ], [ 108.791982, 37.700303 ], [ 108.784591, 37.764673 ], [ 108.799989, 37.784068 ], [ 108.791982, 37.872934 ], [ 108.798141, 37.93385 ], [ 108.82709, 37.989056 ], [ 108.797525, 38.04799 ], [ 108.830786, 38.049875 ], [ 108.883141, 38.01405 ], [ 108.893612, 37.978207 ], [ 108.93488, 37.922521 ], [ 108.9743, 37.931962 ], [ 108.982923, 37.964053 ], [ 109.018648, 37.971602 ], [ 109.037742, 38.021593 ], [ 109.06977, 38.023008 ], [ 109.050676, 38.055059 ], [ 109.069155, 38.091336 ], [ 108.964445, 38.154894 ], [ 108.938575, 38.207582 ], [ 108.976148, 38.245192 ], [ 108.961981, 38.26493 ], [ 109.007561, 38.359316 ], [ 109.051292, 38.385122 ], [ 109.054372, 38.433892 ], [ 109.128901, 38.480288 ], [ 109.175712, 38.518694 ], [ 109.196654, 38.552867 ], [ 109.276726, 38.623035 ], [ 109.331545, 38.597783 ], [ 109.367269, 38.627711 ], [ 109.329081, 38.66043 ], [ 109.338936, 38.701542 ], [ 109.404226, 38.720689 ], [ 109.444262, 38.782763 ], [ 109.511399, 38.833595 ], [ 109.549587, 38.805618 ], [ 109.624116, 38.85457 ], [ 109.672159, 38.928167 ], [ 109.685094, 38.968195 ], [ 109.665384, 38.981687 ], [ 109.72513, 39.018429 ], [ 109.762086, 39.057476 ], [ 109.793499, 39.074204 ], [ 109.851397, 39.122971 ], [ 109.890818, 39.103932 ], [ 109.92223, 39.107183 ], [ 109.893897, 39.141075 ], [ 109.961035, 39.191651 ], [ 109.871723, 39.243581 ], [ 109.90252, 39.271848 ], [ 109.962267, 39.212056 ], [ 110.041107, 39.21623 ], [ 110.109476, 39.249606 ], [ 110.217881, 39.281113 ], [ 110.184005, 39.355192 ], [ 110.161831, 39.387115 ], [ 110.136577, 39.39174 ], [ 110.12549, 39.432891 ], [ 110.152592, 39.45415 ], [ 110.243751, 39.423645 ], [ 110.257917, 39.407001 ], [ 110.385417, 39.310291 ], [ 110.429764, 39.341308 ], [ 110.434692, 39.381101 ], [ 110.482735, 39.360745 ], [ 110.524003, 39.382952 ], [ 110.559728, 39.351027 ], [ 110.566503, 39.320014 ], [ 110.596684, 39.282966 ], [ 110.626249, 39.266751 ], [ 110.702626, 39.273701 ], [ 110.731575, 39.30705 ], [ 110.73835, 39.348713 ], [ 110.782698, 39.38804 ], [ 110.869545, 39.494341 ], [ 110.891103, 39.509118 ], [ 110.958856, 39.519275 ], [ 111.017371, 39.552045 ], [ 111.101138, 39.559428 ], [ 111.136863, 39.587106 ], [ 111.154725, 39.569116 ], [ 111.148566, 39.531277 ], [ 111.10545, 39.497573 ], [ 111.10545, 39.472631 ], [ 111.058639, 39.447681 ], [ 111.064182, 39.400989 ], [ 111.098059, 39.401914 ], [ 111.087588, 39.376013 ], [ 111.125776, 39.366297 ], [ 111.159037, 39.362596 ], [ 111.155341, 39.338531 ], [ 111.186138, 39.35149 ], [ 111.179363, 39.326959 ], [ 111.202152, 39.305197 ], [ 111.247732, 39.302419 ], [ 111.213239, 39.257021 ], [ 111.219399, 39.244044 ], [ 111.163348, 39.152678 ], [ 111.173819, 39.135041 ], [ 111.147334, 39.100681 ], [ 111.138095, 39.064447 ], [ 111.094363, 39.030053 ], [ 111.038313, 39.020289 ], [ 110.998276, 38.998433 ], [ 110.980414, 38.970056 ], [ 111.009979, 38.932823 ], [ 111.016755, 38.889981 ], [ 110.995813, 38.868084 ], [ 111.009363, 38.847579 ], [ 110.965016, 38.755699 ], [ 110.915125, 38.704345 ], [ 110.916357, 38.673981 ], [ 110.880632, 38.626776 ], [ 110.898494, 38.587024 ], [ 110.920052, 38.581878 ], [ 110.907733, 38.521035 ], [ 110.870777, 38.510265 ], [ 110.874473, 38.453579 ], [ 110.840596, 38.439986 ], [ 110.796864, 38.453579 ], [ 110.77777, 38.440924 ], [ 110.746973, 38.366355 ], [ 110.701394, 38.353215 ], [ 110.661358, 38.308617 ], [ 110.601612, 38.308147 ], [ 110.57759, 38.297345 ], [ 110.565887, 38.215105 ], [ 110.528315, 38.211814 ], [ 110.509221, 38.192061 ], [ 110.519692, 38.130889 ], [ 110.501829, 38.097929 ], [ 110.507989, 38.013107 ], [ 110.528315, 37.990471 ], [ 110.522771, 37.955088 ], [ 110.59422, 37.922049 ], [ 110.680452, 37.790216 ], [ 110.735886, 37.77035 ], [ 110.750669, 37.736281 ], [ 110.716792, 37.728708 ], [ 110.706321, 37.705511 ], [ 110.775306, 37.680886 ], [ 110.793169, 37.650567 ], [ 110.763604, 37.639668 ], [ 110.771611, 37.594634 ], [ 110.795017, 37.558586 ], [ 110.770995, 37.538184 ], [ 110.759292, 37.474567 ], [ 110.740198, 37.44939 ], [ 110.644111, 37.435135 ], [ 110.630561, 37.372858 ], [ 110.641648, 37.360015 ], [ 110.695234, 37.34955 ], [ 110.678604, 37.317668 ], [ 110.690307, 37.287201 ], [ 110.660126, 37.281011 ], [ 110.651503, 37.256722 ], [ 110.590525, 37.187145 ], [ 110.53509, 37.138021 ], [ 110.535706, 37.115118 ], [ 110.49567, 37.086956 ], [ 110.460561, 37.044932 ], [ 110.417446, 37.027257 ], [ 110.426685, 37.008621 ], [ 110.382953, 37.022001 ], [ 110.381721, 37.002408 ], [ 110.424221, 36.963685 ], [ 110.408823, 36.892403 ], [ 110.376178, 36.882351 ], [ 110.424221, 36.855539 ], [ 110.406975, 36.824886 ], [ 110.423605, 36.818179 ], [ 110.407591, 36.776007 ], [ 110.447011, 36.737649 ], [ 110.438388, 36.685835 ], [ 110.402663, 36.697352 ], [ 110.394656, 36.676716 ], [ 110.426685, 36.657514 ], [ 110.447627, 36.621018 ], [ 110.496902, 36.582102 ], [ 110.488895, 36.556628 ], [ 110.503677, 36.488335 ], [ 110.47288, 36.453203 ], [ 110.489511, 36.430094 ], [ 110.487047, 36.393972 ], [ 110.459946, 36.327946 ], [ 110.474112, 36.306729 ], [ 110.474112, 36.248352 ], [ 110.45625, 36.22663 ], [ 110.447011, 36.164328 ], [ 110.467953, 36.074893 ], [ 110.491974, 36.034735 ], [ 110.49259, 35.994073 ], [ 110.516612, 35.971796 ], [ 110.502445, 35.947575 ], [ 110.516612, 35.918501 ], [ 110.511684, 35.879718 ], [ 110.549257, 35.877778 ], [ 110.550489, 35.838005 ], [ 110.571431, 35.800639 ], [ 110.57759, 35.701559 ], [ 110.609619, 35.632031 ], [ 110.567735, 35.539559 ], [ 110.531394, 35.511309 ], [ 110.477808, 35.413821 ], [ 110.45009, 35.327933 ], [ 110.374946, 35.251728 ], [ 110.369402, 35.158329 ], [ 110.325671, 35.014844 ], [ 110.272084, 34.942761 ], [ 110.257301, 34.934912 ], [ 110.259149, 34.884853 ], [ 110.233896, 34.83722 ], [ 110.232664, 34.80332 ], [ 110.259149, 34.737937 ], [ 110.231432, 34.701044 ], [ 110.23636, 34.670533 ], [ 110.29549, 34.610956 ], [ 110.379257, 34.600612 ], [ 110.366939, 34.566614 ], [ 110.404511, 34.557743 ], [ 110.372482, 34.544435 ], [ 110.360779, 34.516825 ], [ 110.403279, 34.433448 ], [ 110.403279, 34.433448 ], [ 110.473496, 34.393457 ], [ 110.503677, 34.33714 ], [ 110.451938, 34.292653 ], [ 110.428533, 34.288203 ], [ 110.43962, 34.243196 ], [ 110.507989, 34.217466 ], [ 110.55172, 34.213012 ], [ 110.55788, 34.193214 ], [ 110.621938, 34.177372 ], [ 110.642264, 34.161032 ], [ 110.61393, 34.113478 ], [ 110.591757, 34.101586 ], [ 110.587445, 34.023252 ], [ 110.620706, 34.035652 ], [ 110.671213, 33.966192 ], [ 110.665669, 33.937895 ], [ 110.627481, 33.925482 ], [ 110.628713, 33.910086 ], [ 110.587445, 33.887733 ], [ 110.612083, 33.852453 ], [ 110.66259, 33.85295 ], [ 110.712481, 33.833564 ], [ 110.74143, 33.798759 ], [ 110.782082, 33.796272 ], [ 110.81719, 33.751003 ], [ 110.831973, 33.713675 ], [ 110.823966, 33.685793 ], [ 110.878784, 33.634486 ], [ 110.966864, 33.609071 ], [ 111.00382, 33.578662 ], [ 111.002588, 33.535772 ], [ 111.02661, 33.478386 ], [ 111.021682, 33.476389 ], [ 111.021066, 33.471397 ], [ 111.02661, 33.467903 ], [ 110.996429, 33.435946 ], [ 111.025994, 33.375495 ], [ 111.025994, 33.330504 ], [ 110.984726, 33.255469 ], [ 110.960704, 33.253967 ], [ 110.9219, 33.203907 ], [ 110.865234, 33.213921 ], [ 110.828893, 33.201403 ], [ 110.824582, 33.158327 ], [ 110.753133, 33.15031 ], [ 110.702626, 33.097182 ], [ 110.650887, 33.157324 ], [ 110.623785, 33.143796 ], [ 110.59422, 33.168346 ], [ 110.57759, 33.250464 ], [ 110.54125, 33.255469 ], [ 110.471032, 33.171352 ], [ 110.398352, 33.176862 ] ] ], [ [ [ 111.02661, 33.478386 ], [ 111.02661, 33.467903 ], [ 111.021066, 33.471397 ], [ 111.021682, 33.476389 ], [ 111.02661, 33.478386 ] ] ], [ [ [ 106.076921, 32.76365 ], [ 106.076305, 32.759121 ], [ 106.071378, 32.758114 ], [ 106.07261, 32.76365 ], [ 106.076921, 32.76365 ] ] ] ] } },\n{ \"type\": \"Feature\", \"properties\": { \"adcode\": \"620000\", \"name\": \"甘肃省\", \"center\": [ 103.823557, 36.058039 ], \"childrenNum\": 14, \"level\": \"province\", \"parent\": { \"adcode\": 100000 }, \"subFeatureIndex\": 27, \"acroutes\": [ 100000 ] }, \"geometry\": { \"type\": \"MultiPolygon\", \"coordinates\": [ [ [ [ 106.506231, 35.737514 ], [ 106.566593, 35.738971 ], [ 106.595542, 35.727312 ], [ 106.620796, 35.743829 ], [ 106.633115, 35.714679 ], [ 106.66268, 35.70739 ], [ 106.674998, 35.728284 ], [ 106.750759, 35.689408 ], [ 106.750759, 35.725369 ], [ 106.806193, 35.70982 ], [ 106.819128, 35.7448 ], [ 106.867171, 35.738485 ], [ 106.868403, 35.771996 ], [ 106.897353, 35.759856 ], [ 106.927534, 35.810346 ], [ 106.849925, 35.887476 ], [ 106.912751, 35.93207 ], [ 106.940468, 35.931101 ], [ 106.93862, 35.952905 ], [ 106.90228, 35.943699 ], [ 106.94786, 35.988262 ], [ 106.928149, 36.011502 ], [ 106.940468, 36.064734 ], [ 106.957715, 36.091337 ], [ 106.925686, 36.115997 ], [ 106.930613, 36.138716 ], [ 106.873947, 36.178338 ], [ 106.873947, 36.178338 ], [ 106.858548, 36.206834 ], [ 106.858548, 36.206834 ], [ 106.833295, 36.229044 ], [ 106.808657, 36.21118 ], [ 106.772933, 36.212628 ], [ 106.735976, 36.23725 ], [ 106.698404, 36.244008 ], [ 106.685469, 36.273445 ], [ 106.647897, 36.259451 ], [ 106.559202, 36.292259 ], [ 106.54134, 36.25366 ], [ 106.504383, 36.266207 ], [ 106.470507, 36.306246 ], [ 106.497608, 36.31348 ], [ 106.510543, 36.379037 ], [ 106.492064, 36.422389 ], [ 106.523477, 36.468605 ], [ 106.494528, 36.494589 ], [ 106.455724, 36.496995 ], [ 106.39721, 36.548455 ], [ 106.37134, 36.549417 ], [ 106.363949, 36.577296 ], [ 106.392282, 36.556628 ], [ 106.397826, 36.576816 ], [ 106.444637, 36.557109 ], [ 106.465579, 36.583063 ], [ 106.444637, 36.624861 ], [ 106.491448, 36.628703 ], [ 106.490833, 36.685835 ], [ 106.530869, 36.690154 ], [ 106.519782, 36.708868 ], [ 106.519782, 36.708868 ], [ 106.514238, 36.715584 ], [ 106.59431, 36.750118 ], [ 106.644817, 36.72278 ], [ 106.627571, 36.752995 ], [ 106.657752, 36.820575 ], [ 106.637426, 36.867031 ], [ 106.637426, 36.867031 ], [ 106.626955, 36.892403 ], [ 106.609709, 36.878521 ], [ 106.609709, 36.878521 ], [ 106.601702, 36.918244 ], [ 106.549347, 36.941685 ], [ 106.540108, 36.984244 ], [ 106.595542, 36.94025 ], [ 106.594926, 36.967988 ], [ 106.64297, 36.962729 ], [ 106.646665, 37.000496 ], [ 106.666991, 37.016745 ], [ 106.645433, 37.064992 ], [ 106.605397, 37.127524 ], [ 106.6171, 37.135158 ], [ 106.673151, 37.1113 ], [ 106.687933, 37.12991 ], [ 106.728585, 37.121321 ], [ 106.750143, 37.09889 ], [ 106.772933, 37.120367 ], [ 106.776012, 37.158056 ], [ 106.818512, 37.141838 ], [ 106.891193, 37.098413 ], [ 106.912135, 37.110345 ], [ 106.905976, 37.151378 ], [ 106.998367, 37.106527 ], [ 107.031011, 37.108436 ], [ 107.030395, 37.140883 ], [ 107.095685, 37.115595 ], [ 107.133873, 37.134681 ], [ 107.181916, 37.143269 ], [ 107.234887, 37.096503 ], [ 107.268764, 37.099367 ], [ 107.28601, 37.054963 ], [ 107.288474, 37.008143 ], [ 107.288474, 37.008143 ], [ 107.291554, 36.979463 ], [ 107.291554, 36.979463 ], [ 107.310032, 36.912502 ], [ 107.336517, 36.925899 ], [ 107.365466, 36.905324 ], [ 107.478183, 36.908196 ], [ 107.533618, 36.867031 ], [ 107.540393, 36.828718 ], [ 107.5909, 36.836382 ], [ 107.642023, 36.819137 ], [ 107.670356, 36.83303 ], [ 107.722095, 36.802367 ], [ 107.742421, 36.811951 ], [ 107.768291, 36.792783 ], [ 107.866841, 36.766899 ], [ 107.907493, 36.750118 ], [ 107.914268, 36.720861 ], [ 107.940754, 36.694953 ], [ 107.938906, 36.655594 ], [ 108.006659, 36.683435 ], [ 108.02329, 36.647912 ], [ 108.001732, 36.639269 ], [ 108.060862, 36.592194 ], [ 108.079956, 36.614294 ], [ 108.092891, 36.587388 ], [ 108.163724, 36.563839 ], [ 108.1976, 36.630144 ], [ 108.222854, 36.631105 ], [ 108.204992, 36.606607 ], [ 108.204992, 36.606607 ], [ 108.210535, 36.577296 ], [ 108.245644, 36.571048 ], [ 108.262274, 36.549417 ], [ 108.340498, 36.559032 ], [ 108.365136, 36.519603 ], [ 108.391621, 36.505654 ], [ 108.408252, 36.45946 ], [ 108.460606, 36.422871 ], [ 108.495099, 36.422389 ], [ 108.514809, 36.445501 ], [ 108.510498, 36.47438 ], [ 108.562852, 36.43876 ], [ 108.618903, 36.433946 ], [ 108.651548, 36.384818 ], [ 108.641693, 36.359279 ], [ 108.646004, 36.254143 ], [ 108.712526, 36.138716 ], [ 108.682345, 36.062316 ], [ 108.688504, 36.021183 ], [ 108.659555, 35.990683 ], [ 108.652164, 35.94806 ], [ 108.593649, 35.950967 ], [ 108.562852, 35.921409 ], [ 108.518505, 35.905414 ], [ 108.499411, 35.872444 ], [ 108.527744, 35.82442 ], [ 108.533903, 35.746257 ], [ 108.517889, 35.699615 ], [ 108.539447, 35.605761 ], [ 108.618287, 35.557088 ], [ 108.625678, 35.537124 ], [ 108.605968, 35.503028 ], [ 108.631222, 35.418698 ], [ 108.61028, 35.355271 ], [ 108.614591, 35.328909 ], [ 108.583178, 35.294724 ], [ 108.547454, 35.304981 ], [ 108.48894, 35.275184 ], [ 108.36144, 35.279581 ], [ 108.345426, 35.300586 ], [ 108.296767, 35.267855 ], [ 108.239484, 35.256127 ], [ 108.221622, 35.296678 ], [ 108.174811, 35.304981 ], [ 108.094739, 35.280069 ], [ 108.049159, 35.253683 ], [ 107.949993, 35.245375 ], [ 107.960464, 35.263457 ], [ 107.867457, 35.256127 ], [ 107.841587, 35.276649 ], [ 107.745501, 35.311819 ], [ 107.737494, 35.267366 ], [ 107.667277, 35.257104 ], [ 107.652494, 35.244886 ], [ 107.686371, 35.218 ], [ 107.715936, 35.168114 ], [ 107.727639, 35.120157 ], [ 107.769523, 35.064333 ], [ 107.769523, 35.064333 ], [ 107.773218, 35.060904 ], [ 107.773218, 35.060904 ], [ 107.814486, 35.024646 ], [ 107.846515, 35.024646 ], [ 107.863145, 34.999158 ], [ 107.842203, 34.979056 ], [ 107.741805, 34.953553 ], [ 107.675284, 34.9511 ], [ 107.638943, 34.935402 ], [ 107.619849, 34.964834 ], [ 107.564415, 34.968757 ], [ 107.523763, 34.909886 ], [ 107.455394, 34.916757 ], [ 107.400575, 34.932949 ], [ 107.369162, 34.917738 ], [ 107.350068, 34.93393 ], [ 107.286626, 34.931968 ], [ 107.252749, 34.880925 ], [ 107.189308, 34.893198 ], [ 107.162206, 34.944233 ], [ 107.119707, 34.950119 ], [ 107.089526, 34.976604 ], [ 107.08275, 35.024156 ], [ 107.012533, 35.029547 ], [ 106.990975, 35.068252 ], [ 106.950323, 35.066782 ], [ 106.901664, 35.094698 ], [ 106.838222, 35.080007 ], [ 106.710723, 35.100574 ], [ 106.706411, 35.081966 ], [ 106.615252, 35.071191 ], [ 106.577064, 35.089312 ], [ 106.541956, 35.083925 ], [ 106.52163, 35.027587 ], [ 106.494528, 35.006021 ], [ 106.494528, 35.006021 ], [ 106.484673, 34.983959 ], [ 106.493296, 34.941289 ], [ 106.527789, 34.876507 ], [ 106.556122, 34.861285 ], [ 106.550579, 34.82936 ], [ 106.575216, 34.769897 ], [ 106.539492, 34.745805 ], [ 106.505615, 34.746789 ], [ 106.487137, 34.715311 ], [ 106.456956, 34.703996 ], [ 106.442173, 34.675455 ], [ 106.471122, 34.634102 ], [ 106.419384, 34.643458 ], [ 106.314058, 34.578934 ], [ 106.341159, 34.568093 ], [ 106.334384, 34.517811 ], [ 106.455108, 34.531617 ], [ 106.514238, 34.511894 ], [ 106.513622, 34.498085 ], [ 106.558586, 34.48822 ], [ 106.610941, 34.454177 ], [ 106.638042, 34.391481 ], [ 106.717498, 34.369255 ], [ 106.691013, 34.337635 ], [ 106.705179, 34.299575 ], [ 106.68239, 34.256057 ], [ 106.652825, 34.24369 ], [ 106.63373, 34.260014 ], [ 106.589383, 34.253584 ], [ 106.577064, 34.280786 ], [ 106.526557, 34.292159 ], [ 106.496376, 34.238248 ], [ 106.5321, 34.254079 ], [ 106.55797, 34.229837 ], [ 106.585071, 34.149641 ], [ 106.560434, 34.109514 ], [ 106.501919, 34.105055 ], [ 106.505615, 34.056479 ], [ 106.471738, 34.024244 ], [ 106.474202, 33.970659 ], [ 106.41076, 33.909093 ], [ 106.428007, 33.866368 ], [ 106.475434, 33.875809 ], [ 106.491448, 33.834559 ], [ 106.461883, 33.789807 ], [ 106.488369, 33.757969 ], [ 106.482825, 33.707203 ], [ 106.534564, 33.695254 ], [ 106.575832, 33.631497 ], [ 106.58076, 33.576169 ], [ 106.540108, 33.512822 ], [ 106.456956, 33.532779 ], [ 106.447101, 33.613058 ], [ 106.384891, 33.612061 ], [ 106.35163, 33.587137 ], [ 106.303587, 33.604585 ], [ 106.237681, 33.564201 ], [ 106.187174, 33.546746 ], [ 106.108334, 33.569686 ], [ 106.117573, 33.602591 ], [ 106.086776, 33.617045 ], [ 106.047356, 33.610067 ], [ 105.971596, 33.613058 ], [ 105.940183, 33.570684 ], [ 105.902611, 33.556222 ], [ 105.871198, 33.511325 ], [ 105.842248, 33.489866 ], [ 105.831162, 33.451926 ], [ 105.837937, 33.410971 ], [ 105.827466, 33.379993 ], [ 105.709822, 33.382991 ], [ 105.755401, 33.329004 ], [ 105.752937, 33.291994 ], [ 105.791741, 33.278486 ], [ 105.799133, 33.258471 ], [ 105.862574, 33.234447 ], [ 105.917393, 33.237951 ], [ 105.965436, 33.204407 ], [ 105.968516, 33.154318 ], [ 105.93156, 33.178365 ], [ 105.897067, 33.146803 ], [ 105.923552, 33.147805 ], [ 105.934639, 33.112221 ], [ 105.914929, 33.066092 ], [ 105.926632, 33.042517 ], [ 105.917393, 32.993841 ], [ 105.861959, 32.939112 ], [ 105.82685, 32.950663 ], [ 105.735691, 32.905454 ], [ 105.656851, 32.895405 ], [ 105.638373, 32.879323 ], [ 105.590329, 32.87681 ], [ 105.565692, 32.906962 ], [ 105.528119, 32.919019 ], [ 105.49917, 32.911986 ], [ 105.467757, 32.930071 ], [ 105.414171, 32.922034 ], [ 105.408011, 32.885857 ], [ 105.38091, 32.876307 ], [ 105.396308, 32.85067 ], [ 105.396308, 32.85067 ], [ 105.427721, 32.784281 ], [ 105.454207, 32.767173 ], [ 105.448663, 32.732946 ], [ 105.368591, 32.712807 ], [ 105.347033, 32.68259 ], [ 105.297758, 32.656897 ], [ 105.263265, 32.652362 ], [ 105.219534, 32.666469 ], [ 105.215222, 32.63674 ], [ 105.185041, 32.617587 ], [ 105.111128, 32.593893 ], [ 105.0791, 32.637244 ], [ 105.026745, 32.650346 ], [ 104.925115, 32.607505 ], [ 104.881999, 32.600951 ], [ 104.845659, 32.653873 ], [ 104.820405, 32.662943 ], [ 104.795768, 32.643292 ], [ 104.739717, 32.635228 ], [ 104.696601, 32.673522 ], [ 104.643015, 32.661935 ], [ 104.592508, 32.695685 ], [ 104.582653, 32.722374 ], [ 104.526602, 32.728416 ], [ 104.51182, 32.753585 ], [ 104.458849, 32.748551 ], [ 104.363994, 32.822511 ], [ 104.294393, 32.835586 ], [ 104.277147, 32.90244 ], [ 104.288234, 32.942628 ], [ 104.345516, 32.940117 ], [ 104.378161, 32.953174 ], [ 104.383704, 32.994343 ], [ 104.426204, 33.010906 ], [ 104.391711, 33.035493 ], [ 104.337509, 33.038002 ], [ 104.378161, 33.109214 ], [ 104.351059, 33.158828 ], [ 104.32827, 33.223934 ], [ 104.323958, 33.26898 ], [ 104.303632, 33.304499 ], [ 104.333813, 33.315502 ], [ 104.386168, 33.298497 ], [ 104.420045, 33.327004 ], [ 104.373849, 33.345004 ], [ 104.292545, 33.336505 ], [ 104.272219, 33.391486 ], [ 104.22048, 33.404477 ], [ 104.213089, 33.446932 ], [ 104.180444, 33.472895 ], [ 104.155191, 33.542755 ], [ 104.176749, 33.5996 ], [ 104.103452, 33.663381 ], [ 104.046169, 33.686291 ], [ 103.980264, 33.670852 ], [ 103.861388, 33.682307 ], [ 103.778236, 33.658898 ], [ 103.690772, 33.69376 ], [ 103.667983, 33.685793 ], [ 103.645809, 33.708697 ], [ 103.593454, 33.716164 ], [ 103.563889, 33.699735 ], [ 103.552186, 33.671351 ], [ 103.520157, 33.678323 ], [ 103.545411, 33.719649 ], [ 103.518309, 33.807213 ], [ 103.464723, 33.80224 ], [ 103.434542, 33.752993 ], [ 103.35447, 33.743539 ], [ 103.278709, 33.774387 ], [ 103.284868, 33.80224 ], [ 103.24976, 33.814175 ], [ 103.228202, 33.79478 ], [ 103.165376, 33.805721 ], [ 103.153673, 33.819147 ], [ 103.181391, 33.900649 ], [ 103.16476, 33.929454 ], [ 103.1315, 33.931937 ], [ 103.120413, 33.953286 ], [ 103.157369, 33.998944 ], [ 103.147514, 34.036644 ], [ 103.119797, 34.03466 ], [ 103.129652, 34.065899 ], [ 103.178927, 34.079779 ], [ 103.121644, 34.112487 ], [ 103.124108, 34.162022 ], [ 103.100087, 34.181828 ], [ 103.052043, 34.195194 ], [ 103.005848, 34.184798 ], [ 102.973203, 34.205588 ], [ 102.977515, 34.252595 ], [ 102.949181, 34.292159 ], [ 102.911609, 34.312923 ], [ 102.85987, 34.301058 ], [ 102.856791, 34.270895 ], [ 102.798276, 34.272874 ], [ 102.779798, 34.236764 ], [ 102.728675, 34.235774 ], [ 102.694799, 34.198659 ], [ 102.664002, 34.192719 ], [ 102.651067, 34.165983 ], [ 102.598712, 34.14766 ], [ 102.655994, 34.113478 ], [ 102.649219, 34.080275 ], [ 102.615958, 34.099604 ], [ 102.511865, 34.086222 ], [ 102.471213, 34.072839 ], [ 102.437336, 34.087214 ], [ 102.406539, 34.033172 ], [ 102.392372, 33.971651 ], [ 102.345561, 33.969666 ], [ 102.315996, 33.993983 ], [ 102.287047, 33.977607 ], [ 102.248858, 33.98654 ], [ 102.226069, 33.963214 ], [ 102.16817, 33.983066 ], [ 102.136142, 33.965199 ], [ 102.25317, 33.861399 ], [ 102.261177, 33.821136 ], [ 102.243315, 33.786823 ], [ 102.296286, 33.783838 ], [ 102.324619, 33.754486 ], [ 102.284583, 33.719151 ], [ 102.342481, 33.725622 ], [ 102.31538, 33.665374 ], [ 102.346793, 33.605582 ], [ 102.440416, 33.574673 ], [ 102.477988, 33.543254 ], [ 102.446575, 33.53228 ], [ 102.461358, 33.501345 ], [ 102.462589, 33.449429 ], [ 102.447807, 33.454922 ], [ 102.392988, 33.404477 ], [ 102.368967, 33.41247 ], [ 102.310452, 33.397982 ], [ 102.296286, 33.413969 ], [ 102.258098, 33.409472 ], [ 102.218062, 33.349503 ], [ 102.192192, 33.337005 ], [ 102.217446, 33.247961 ], [ 102.200815, 33.223434 ], [ 102.160163, 33.242956 ], [ 102.144765, 33.273983 ], [ 102.117047, 33.288492 ], [ 102.08933, 33.227439 ], [ 102.08933, 33.204908 ], [ 102.054838, 33.189884 ], [ 101.99386, 33.1999 ], [ 101.935345, 33.186879 ], [ 101.921795, 33.153817 ], [ 101.887302, 33.135778 ], [ 101.865744, 33.103198 ], [ 101.825708, 33.119239 ], [ 101.841723, 33.184876 ], [ 101.83002, 33.213921 ], [ 101.770274, 33.248962 ], [ 101.769658, 33.26898 ], [ 101.877447, 33.314502 ], [ 101.887302, 33.383991 ], [ 101.915635, 33.425957 ], [ 101.946432, 33.442937 ], [ 101.906396, 33.48188 ], [ 101.907012, 33.539264 ], [ 101.884222, 33.578163 ], [ 101.844186, 33.602591 ], [ 101.831252, 33.554726 ], [ 101.783208, 33.556721 ], [ 101.769042, 33.538765 ], [ 101.748716, 33.505337 ], [ 101.718535, 33.494857 ], [ 101.622448, 33.502343 ], [ 101.611977, 33.565199 ], [ 101.616905, 33.598603 ], [ 101.585492, 33.645448 ], [ 101.58426, 33.674339 ], [ 101.501724, 33.702723 ], [ 101.428427, 33.680315 ], [ 101.424732, 33.655411 ], [ 101.385312, 33.644949 ], [ 101.302776, 33.657902 ], [ 101.23687, 33.685793 ], [ 101.217776, 33.669856 ], [ 101.166653, 33.659894 ], [ 101.177124, 33.685295 ], [ 101.162957, 33.719649 ], [ 101.186363, 33.741051 ], [ 101.190675, 33.791796 ], [ 101.153102, 33.823124 ], [ 101.153718, 33.8445 ], [ 101.054552, 33.863386 ], [ 101.023139, 33.896178 ], [ 100.994806, 33.891707 ], [ 100.965857, 33.946832 ], [ 100.927669, 33.975126 ], [ 100.93506, 33.990013 ], [ 100.880857, 34.036644 ], [ 100.870386, 34.083744 ], [ 100.848828, 34.089692 ], [ 100.806329, 34.155584 ], [ 100.764445, 34.178857 ], [ 100.809408, 34.247153 ], [ 100.798321, 34.260014 ], [ 100.821727, 34.317371 ], [ 100.868538, 34.332693 ], [ 100.895024, 34.375183 ], [ 100.951074, 34.38358 ], [ 100.986799, 34.374689 ], [ 101.054552, 34.322808 ], [ 101.098284, 34.329233 ], [ 101.178356, 34.320831 ], [ 101.193754, 34.336646 ], [ 101.235022, 34.325279 ], [ 101.228863, 34.298586 ], [ 101.268899, 34.278808 ], [ 101.325565, 34.268423 ], [ 101.327413, 34.24468 ], [ 101.369913, 34.248143 ], [ 101.417956, 34.227858 ], [ 101.482014, 34.218951 ], [ 101.492485, 34.195689 ], [ 101.53868, 34.212022 ], [ 101.6206, 34.178857 ], [ 101.674187, 34.110506 ], [ 101.703136, 34.119424 ], [ 101.718535, 34.083249 ], [ 101.736397, 34.080275 ], [ 101.764114, 34.122892 ], [ 101.788136, 34.131809 ], [ 101.836795, 34.124378 ], [ 101.851578, 34.153108 ], [ 101.874367, 34.130323 ], [ 101.897773, 34.133791 ], [ 101.955055, 34.109514 ], [ 101.965526, 34.167469 ], [ 102.003099, 34.162022 ], [ 102.030816, 34.190739 ], [ 102.01357, 34.218456 ], [ 102.062229, 34.227858 ], [ 102.067772, 34.293642 ], [ 102.149692, 34.271885 ], [ 102.186649, 34.352952 ], [ 102.237156, 34.34307 ], [ 102.237156, 34.34307 ], [ 102.259329, 34.355917 ], [ 102.205743, 34.407777 ], [ 102.169402, 34.457631 ], [ 102.155852, 34.507456 ], [ 102.139837, 34.50351 ], [ 102.093026, 34.536547 ], [ 102.001867, 34.538519 ], [ 101.97415, 34.548871 ], [ 101.956287, 34.582876 ], [ 101.934729, 34.58731 ], [ 101.919947, 34.621791 ], [ 101.917483, 34.705964 ], [ 101.923027, 34.835746 ], [ 101.916867, 34.873561 ], [ 101.985852, 34.90007 ], [ 102.068388, 34.887798 ], [ 102.048062, 34.910868 ], [ 102.094874, 34.986901 ], [ 102.133678, 35.014844 ], [ 102.157699, 35.010923 ], [ 102.176178, 35.032977 ], [ 102.211286, 35.034937 ], [ 102.218062, 35.057475 ], [ 102.252554, 35.048657 ], [ 102.29567, 35.071681 ], [ 102.310452, 35.128967 ], [ 102.346793, 35.164201 ], [ 102.404075, 35.179366 ], [ 102.365887, 35.235599 ], [ 102.370199, 35.263946 ], [ 102.3123, 35.282512 ], [ 102.280887, 35.303028 ], [ 102.311684, 35.31426 ], [ 102.317844, 35.343067 ], [ 102.287663, 35.36552 ], [ 102.293822, 35.424063 ], [ 102.314764, 35.434303 ], [ 102.408387, 35.409431 ], [ 102.447807, 35.437229 ], [ 102.437952, 35.455268 ], [ 102.49893, 35.545403 ], [ 102.503241, 35.585322 ], [ 102.531575, 35.580455 ], [ 102.570995, 35.548324 ], [ 102.695414, 35.528358 ], [ 102.743458, 35.494745 ], [ 102.782878, 35.527871 ], [ 102.729291, 35.523487 ], [ 102.746537, 35.545403 ], [ 102.808747, 35.560496 ], [ 102.763168, 35.612086 ], [ 102.7644, 35.653431 ], [ 102.744074, 35.657807 ], [ 102.707733, 35.70496 ], [ 102.686175, 35.771996 ], [ 102.715125, 35.815685 ], [ 102.739146, 35.821023 ], [ 102.787189, 35.862745 ], [ 102.81737, 35.850133 ], [ 102.914073, 35.845282 ], [ 102.94487, 35.829757 ], [ 102.954725, 35.858864 ], [ 102.942406, 35.92674 ], [ 102.971971, 35.995525 ], [ 102.951645, 36.021667 ], [ 102.968276, 36.044414 ], [ 102.932551, 36.048285 ], [ 102.882044, 36.082632 ], [ 102.941174, 36.104877 ], [ 102.948566, 36.150798 ], [ 102.965812, 36.151765 ], [ 102.986754, 36.193312 ], [ 103.048964, 36.199107 ], [ 103.066826, 36.216974 ], [ 103.021246, 36.232906 ], [ 103.024942, 36.256556 ], [ 102.922696, 36.298047 ], [ 102.896827, 36.331803 ], [ 102.845704, 36.331803 ], [ 102.836465, 36.344819 ], [ 102.838928, 36.345783 ], [ 102.831537, 36.365544 ], [ 102.829689, 36.365544 ], [ 102.771791, 36.47438 ], [ 102.793349, 36.497957 ], [ 102.753313, 36.525855 ], [ 102.734219, 36.562396 ], [ 102.761936, 36.568645 ], [ 102.714509, 36.599401 ], [ 102.724364, 36.613813 ], [ 102.684328, 36.619097 ], [ 102.630741, 36.650793 ], [ 102.601176, 36.710307 ], [ 102.612879, 36.738129 ], [ 102.639364, 36.732853 ], [ 102.692335, 36.775528 ], [ 102.720052, 36.767858 ], [ 102.639364, 36.852666 ], [ 102.587009, 36.869904 ], [ 102.56114, 36.91968 ], [ 102.526031, 36.928291 ], [ 102.499546, 36.954599 ], [ 102.450271, 36.968467 ], [ 102.506321, 37.019134 ], [ 102.488459, 37.078362 ], [ 102.583314, 37.104618 ], [ 102.642444, 37.099845 ], [ 102.599944, 37.174748 ], [ 102.578386, 37.17284 ], [ 102.533422, 37.217176 ], [ 102.490307, 37.223371 ], [ 102.457662, 37.248147 ], [ 102.45335, 37.271487 ], [ 102.419474, 37.294343 ], [ 102.428097, 37.308624 ], [ 102.368351, 37.327662 ], [ 102.29875, 37.370004 ], [ 102.299981, 37.391404 ], [ 102.19712, 37.420403 ], [ 102.176794, 37.458892 ], [ 102.125055, 37.48549 ], [ 102.103497, 37.482641 ], [ 102.131214, 37.54625 ], [ 102.102265, 37.582304 ], [ 102.035128, 37.627819 ], [ 102.048678, 37.651515 ], [ 102.036359, 37.685149 ], [ 101.998787, 37.724921 ], [ 101.946432, 37.728235 ], [ 101.873135, 37.686569 ], [ 101.854657, 37.664781 ], [ 101.815853, 37.654357 ], [ 101.791832, 37.696041 ], [ 101.659405, 37.733441 ], [ 101.670491, 37.754264 ], [ 101.598427, 37.827569 ], [ 101.551615, 37.835604 ], [ 101.459224, 37.86632 ], [ 101.382848, 37.822369 ], [ 101.362522, 37.791162 ], [ 101.276906, 37.83655 ], [ 101.202994, 37.84742 ], [ 101.159262, 37.86821 ], [ 101.152486, 37.891356 ], [ 101.114298, 37.92016 ], [ 101.103211, 37.946593 ], [ 101.077342, 37.941874 ], [ 100.964009, 38.011221 ], [ 100.91843, 37.999432 ], [ 100.895024, 38.013107 ], [ 100.888864, 38.056001 ], [ 100.922125, 38.084741 ], [ 100.91843, 38.129006 ], [ 100.93814, 38.16007 ], [ 100.913502, 38.17889 ], [ 100.860531, 38.148305 ], [ 100.825423, 38.158658 ], [ 100.752126, 38.238612 ], [ 100.71517, 38.253652 ], [ 100.619083, 38.26587 ], [ 100.595061, 38.242372 ], [ 100.545786, 38.247072 ], [ 100.516837, 38.272448 ], [ 100.474953, 38.288891 ], [ 100.459555, 38.2654 ], [ 100.432453, 38.275267 ], [ 100.424446, 38.307208 ], [ 100.396729, 38.293118 ], [ 100.318505, 38.329276 ], [ 100.331439, 38.337257 ], [ 100.301874, 38.388405 ], [ 100.259374, 38.366355 ], [ 100.24028, 38.441861 ], [ 100.163288, 38.461546 ], [ 100.113397, 38.497151 ], [ 100.086911, 38.492936 ], [ 100.064122, 38.518694 ], [ 100.025933, 38.507923 ], [ 100.001296, 38.467169 ], [ 100.022238, 38.432017 ], [ 100.093071, 38.407166 ], [ 100.136803, 38.33444 ], [ 100.163904, 38.328337 ], [ 100.159592, 38.291239 ], [ 100.182998, 38.222158 ], [ 100.126332, 38.231561 ], [ 100.117093, 38.253652 ], [ 100.071513, 38.284663 ], [ 100.049955, 38.283254 ], [ 100.001912, 38.315191 ], [ 99.960028, 38.320825 ], [ 99.826985, 38.370109 ], [ 99.758, 38.410449 ], [ 99.727203, 38.415607 ], [ 99.65945, 38.449361 ], [ 99.63974, 38.474666 ], [ 99.585537, 38.498556 ], [ 99.52887, 38.546314 ], [ 99.501769, 38.612281 ], [ 99.450646, 38.60433 ], [ 99.412458, 38.665571 ], [ 99.375502, 38.684727 ], [ 99.361951, 38.718354 ], [ 99.291118, 38.765966 ], [ 99.222133, 38.788827 ], [ 99.141445, 38.852706 ], [ 99.068764, 38.896968 ], [ 99.071843, 38.921184 ], [ 99.107568, 38.951907 ], [ 99.054597, 38.97657 ], [ 98.951735, 38.987735 ], [ 98.903076, 39.012384 ], [ 98.886446, 39.040744 ], [ 98.818076, 39.064911 ], [ 98.816845, 39.085818 ], [ 98.743548, 39.086747 ], [ 98.730613, 39.057011 ], [ 98.70536, 39.043533 ], [ 98.661628, 38.993782 ], [ 98.612353, 38.977035 ], [ 98.624056, 38.959353 ], [ 98.584635, 38.93003 ], [ 98.526737, 38.95563 ], [ 98.457752, 38.952838 ], [ 98.428187, 38.976104 ], [ 98.432498, 38.996107 ], [ 98.401086, 39.001688 ], [ 98.383839, 39.029588 ], [ 98.316702, 39.040744 ], [ 98.280977, 39.027263 ], [ 98.287753, 38.992386 ], [ 98.276666, 38.963541 ], [ 98.235398, 38.918855 ], [ 98.242173, 38.880664 ], [ 98.167645, 38.840121 ], [ 98.091884, 38.786495 ], [ 98.068478, 38.816344 ], [ 98.029058, 38.834061 ], [ 98.009348, 38.85923 ], [ 97.875689, 38.898365 ], [ 97.828878, 38.93003 ], [ 97.701379, 38.963076 ], [ 97.679205, 39.010524 ], [ 97.58127, 39.052364 ], [ 97.504894, 39.076527 ], [ 97.458698, 39.117863 ], [ 97.401416, 39.146645 ], [ 97.371235, 39.140611 ], [ 97.347213, 39.167528 ], [ 97.315185, 39.164744 ], [ 97.220946, 39.193042 ], [ 97.14149, 39.199999 ], [ 97.060186, 39.19768 ], [ 97.017686, 39.208347 ], [ 96.962251, 39.198144 ], [ 97.012142, 39.142004 ], [ 96.969643, 39.097895 ], [ 96.95794, 39.041674 ], [ 96.965331, 39.017034 ], [ 96.938846, 38.95563 ], [ 96.940693, 38.90768 ], [ 96.983809, 38.869016 ], [ 96.993664, 38.834993 ], [ 96.987505, 38.793025 ], [ 97.00044, 38.7613 ], [ 97.023229, 38.755699 ], [ 97.009063, 38.702477 ], [ 97.057722, 38.67258 ], [ 97.047251, 38.653888 ], [ 97.055874, 38.594508 ], [ 96.961019, 38.558015 ], [ 96.876636, 38.580475 ], [ 96.847071, 38.599186 ], [ 96.7941, 38.608072 ], [ 96.808882, 38.582346 ], [ 96.767614, 38.552399 ], [ 96.800259, 38.52759 ], [ 96.780549, 38.504177 ], [ 96.706637, 38.505582 ], [ 96.6666, 38.483567 ], [ 96.707868, 38.459203 ], [ 96.698013, 38.422172 ], [ 96.626564, 38.356031 ], [ 96.638883, 38.307208 ], [ 96.655514, 38.295936 ], [ 96.665369, 38.23015 ], [ 96.46334, 38.277616 ], [ 96.378341, 38.277146 ], [ 96.335841, 38.246132 ], [ 96.301964, 38.183124 ], [ 96.313051, 38.161952 ], [ 96.264392, 38.145952 ], [ 96.252689, 38.167599 ], [ 96.221892, 38.149246 ], [ 96.109175, 38.187358 ], [ 96.06606, 38.173245 ], [ 96.006929, 38.207582 ], [ 95.93856, 38.237202 ], [ 95.932401, 38.259291 ], [ 95.89606, 38.2903 ], [ 95.852945, 38.287481 ], [ 95.83693, 38.344298 ], [ 95.775952, 38.356031 ], [ 95.723597, 38.378554 ], [ 95.703887, 38.400131 ], [ 95.671858, 38.388405 ], [ 95.608417, 38.339134 ], [ 95.585011, 38.343359 ], [ 95.51849, 38.294997 ], [ 95.487693, 38.314721 ], [ 95.455664, 38.291709 ], [ 95.440881, 38.310965 ], [ 95.408236, 38.300163 ], [ 95.315846, 38.318947 ], [ 95.259179, 38.302981 ], [ 95.229614, 38.330685 ], [ 95.209904, 38.327868 ], [ 95.185266, 38.379492 ], [ 95.140919, 38.392158 ], [ 95.122441, 38.417014 ], [ 95.072549, 38.402476 ], [ 95.045448, 38.418889 ], [ 94.973999, 38.430142 ], [ 94.884072, 38.414669 ], [ 94.861282, 38.393565 ], [ 94.812623, 38.385591 ], [ 94.672805, 38.386998 ], [ 94.582878, 38.36917 ], [ 94.56132, 38.351807 ], [ 94.527443, 38.365416 ], [ 94.527443, 38.425922 ], [ 94.511429, 38.445142 ], [ 94.370379, 38.7627 ], [ 94.281067, 38.7599 ], [ 93.973098, 38.724891 ], [ 93.95154, 38.715086 ], [ 93.885018, 38.720689 ], [ 93.800019, 38.750566 ], [ 93.773533, 38.771099 ], [ 93.756287, 38.807484 ], [ 93.769838, 38.821007 ], [ 93.884403, 38.826136 ], [ 93.884403, 38.867618 ], [ 93.834511, 38.867618 ], [ 93.729186, 38.924443 ], [ 93.453245, 38.915596 ], [ 93.274007, 38.896036 ], [ 93.237666, 38.916062 ], [ 93.179152, 38.923977 ], [ 93.198246, 39.045857 ], [ 93.165601, 39.090928 ], [ 93.131725, 39.108112 ], [ 93.142196, 39.160567 ], [ 93.115094, 39.17959 ], [ 93.043029, 39.146645 ], [ 92.978356, 39.143396 ], [ 92.938936, 39.169848 ], [ 92.889045, 39.160103 ], [ 92.866871, 39.138754 ], [ 92.765857, 39.136898 ], [ 92.659299, 39.109969 ], [ 92.545966, 39.111362 ], [ 92.489916, 39.099753 ], [ 92.459119, 39.063982 ], [ 92.459119, 39.042604 ], [ 92.41046, 39.03842 ], [ 92.366728, 39.059335 ], [ 92.366112, 39.096037 ], [ 92.343938, 39.146181 ], [ 92.339011, 39.236628 ], [ 92.378431, 39.258411 ], [ 92.52564, 39.368611 ], [ 92.639589, 39.514196 ], [ 92.687632, 39.657174 ], [ 92.745531, 39.868331 ], [ 92.796654, 40.153897 ], [ 92.906907, 40.310609 ], [ 92.920458, 40.391792 ], [ 92.928465, 40.572504 ], [ 93.506216, 40.648376 ], [ 93.760599, 40.664721 ], [ 93.820961, 40.793519 ], [ 93.809874, 40.879548 ], [ 93.908424, 40.983539 ], [ 94.01067, 41.114875 ], [ 94.184365, 41.268444 ], [ 94.534219, 41.505966 ], [ 94.750413, 41.538227 ], [ 94.809543, 41.619256 ], [ 94.861898, 41.668451 ], [ 94.969072, 41.718948 ], [ 95.011572, 41.726541 ], [ 95.110738, 41.768513 ], [ 95.135991, 41.772976 ], [ 95.16494, 41.735474 ], [ 95.199433, 41.719395 ], [ 95.194505, 41.694821 ], [ 95.247476, 41.61344 ], [ 95.299831, 41.565994 ], [ 95.335556, 41.644305 ], [ 95.39407, 41.693481 ], [ 95.445193, 41.719841 ], [ 95.57146, 41.796181 ], [ 95.65646, 41.826067 ], [ 95.759322, 41.835878 ], [ 95.801206, 41.848361 ], [ 95.855408, 41.849699 ], [ 95.998306, 41.906289 ], [ 96.054973, 41.936124 ], [ 96.117183, 41.985966 ], [ 96.137509, 42.019765 ], [ 96.13874, 42.05399 ], [ 96.077147, 42.149457 ], [ 96.178161, 42.21775 ], [ 96.040806, 42.326688 ], [ 96.042038, 42.352787 ], [ 96.06606, 42.414674 ], [ 95.978596, 42.436762 ], [ 96.0174, 42.482239 ], [ 96.02356, 42.542675 ], [ 96.072219, 42.569566 ], [ 96.103632, 42.604375 ], [ 96.166458, 42.623314 ], [ 96.386348, 42.727592 ], [ 96.742361, 42.75704 ], [ 96.968411, 42.756161 ], [ 97.172903, 42.795257 ], [ 97.371235, 42.457076 ], [ 97.500582, 42.243894 ], [ 97.653335, 41.986856 ], [ 97.84674, 41.656379 ], [ 97.613915, 41.477276 ], [ 97.629314, 41.440498 ], [ 97.903407, 41.168057 ], [ 97.971776, 41.09774 ], [ 98.142391, 41.001607 ], [ 98.184891, 40.988056 ], [ 98.25018, 40.93925 ], [ 98.333332, 40.918903 ], [ 98.344419, 40.568413 ], [ 98.627751, 40.677884 ], [ 98.569853, 40.746836 ], [ 98.668403, 40.773128 ], [ 98.689345, 40.691952 ], [ 98.72199, 40.657911 ], [ 98.762642, 40.639748 ], [ 98.802678, 40.607043 ], [ 98.80699, 40.660181 ], [ 98.790975, 40.705564 ], [ 98.984996, 40.782644 ], [ 99.041662, 40.693767 ], [ 99.102025, 40.676522 ], [ 99.12543, 40.715091 ], [ 99.172858, 40.747289 ], [ 99.174705, 40.858278 ], [ 99.565827, 40.846961 ], [ 99.673, 40.93292 ], [ 99.985897, 40.909858 ], [ 100.057346, 40.908049 ], [ 100.107853, 40.875475 ], [ 100.224882, 40.727337 ], [ 100.237201, 40.716905 ], [ 100.242744, 40.618855 ], [ 100.169447, 40.541131 ], [ 100.169447, 40.277743 ], [ 100.007455, 40.20008 ], [ 99.955716, 40.150695 ], [ 99.927383, 40.063727 ], [ 99.841152, 40.013326 ], [ 99.751225, 40.006909 ], [ 99.714268, 39.972061 ], [ 99.533182, 39.891753 ], [ 99.491298, 39.884406 ], [ 99.459885, 39.898181 ], [ 99.440791, 39.885783 ], [ 99.469124, 39.875221 ], [ 99.672384, 39.888079 ], [ 99.822058, 39.860063 ], [ 99.904593, 39.785601 ], [ 99.958796, 39.769504 ], [ 100.040716, 39.757083 ], [ 100.128179, 39.702312 ], [ 100.250135, 39.685274 ], [ 100.314193, 39.606935 ], [ 100.301258, 39.572345 ], [ 100.326512, 39.509118 ], [ 100.44354, 39.485565 ], [ 100.500823, 39.481408 ], [ 100.498975, 39.400527 ], [ 100.606764, 39.387577 ], [ 100.707778, 39.404689 ], [ 100.842053, 39.405614 ], [ 100.842669, 39.199999 ], [ 100.864227, 39.106719 ], [ 100.829118, 39.075133 ], [ 100.835278, 39.025869 ], [ 100.875314, 39.002619 ], [ 100.901799, 39.030053 ], [ 100.961545, 39.005874 ], [ 100.969553, 38.946788 ], [ 101.117378, 38.975174 ], [ 101.228863, 39.020754 ], [ 101.198682, 38.943064 ], [ 101.237486, 38.907214 ], [ 101.24303, 38.860628 ], [ 101.33542, 38.847113 ], [ 101.34158, 38.822406 ], [ 101.307087, 38.80282 ], [ 101.331109, 38.777164 ], [ 101.412413, 38.764099 ], [ 101.562702, 38.713218 ], [ 101.601506, 38.65529 ], [ 101.672955, 38.6908 ], [ 101.777049, 38.66043 ], [ 101.873751, 38.733761 ], [ 101.941505, 38.808883 ], [ 102.075164, 38.891378 ], [ 102.045599, 38.904885 ], [ 101.955055, 38.985874 ], [ 101.926106, 39.000758 ], [ 101.833715, 39.08907 ], [ 101.902701, 39.111827 ], [ 102.012338, 39.127149 ], [ 102.050526, 39.141075 ], [ 102.276576, 39.188868 ], [ 102.3548, 39.231993 ], [ 102.45335, 39.255167 ], [ 102.579002, 39.183301 ], [ 102.616574, 39.171703 ], [ 102.883892, 39.120649 ], [ 103.007696, 39.099753 ], [ 103.133347, 39.192579 ], [ 103.188166, 39.215302 ], [ 103.259615, 39.263971 ], [ 103.344615, 39.331588 ], [ 103.428998, 39.353341 ], [ 103.595302, 39.386652 ], [ 103.728961, 39.430117 ], [ 103.85338, 39.461543 ], [ 103.955626, 39.456923 ], [ 104.089901, 39.419947 ], [ 104.073271, 39.351953 ], [ 104.047401, 39.297788 ], [ 104.171205, 39.160567 ], [ 104.207546, 39.083495 ], [ 104.190915, 39.042139 ], [ 104.196459, 38.9882 ], [ 104.173053, 38.94446 ], [ 104.044322, 38.895105 ], [ 104.011677, 38.85923 ], [ 103.85954, 38.64454 ], [ 103.416063, 38.404821 ], [ 103.465339, 38.353215 ], [ 103.507838, 38.280905 ], [ 103.53494, 38.156776 ], [ 103.368636, 38.08898 ], [ 103.362477, 38.037621 ], [ 103.40744, 37.860651 ], [ 103.627947, 37.797783 ], [ 103.683381, 37.777919 ], [ 103.841062, 37.64725 ], [ 103.874938, 37.604117 ], [ 103.935916, 37.572818 ], [ 104.089285, 37.465067 ], [ 104.183524, 37.406618 ], [ 104.237727, 37.411847 ], [ 104.287002, 37.428007 ], [ 104.298705, 37.414223 ], [ 104.365226, 37.418026 ], [ 104.437907, 37.445589 ], [ 104.448994, 37.42468 ], [ 104.499501, 37.421353 ], [ 104.521059, 37.43466 ], [ 104.679971, 37.408044 ], [ 104.662109, 37.367626 ], [ 104.713848, 37.329566 ], [ 104.673812, 37.317668 ], [ 104.651022, 37.290534 ], [ 104.624536, 37.298627 ], [ 104.600515, 37.242907 ], [ 104.638087, 37.201923 ], [ 104.717543, 37.208597 ], [ 104.776673, 37.246718 ], [ 104.85613, 37.211933 ], [ 104.864753, 37.17284 ], [ 104.888158, 37.15901 ], [ 104.914644, 37.097935 ], [ 104.954064, 37.077407 ], [ 104.95468, 37.040156 ], [ 105.004571, 37.035378 ], [ 105.03968, 37.007187 ], [ 105.05939, 37.022956 ], [ 105.128991, 36.996194 ], [ 105.165331, 36.99476 ], [ 105.185657, 36.942164 ], [ 105.178882, 36.892403 ], [ 105.244787, 36.894796 ], [ 105.279896, 36.86751 ], [ 105.303302, 36.820575 ], [ 105.334714, 36.80093 ], [ 105.340874, 36.764502 ], [ 105.319932, 36.742924 ], [ 105.275584, 36.752515 ], [ 105.272505, 36.739567 ], [ 105.218302, 36.730455 ], [ 105.201056, 36.700711 ], [ 105.225693, 36.664716 ], [ 105.22015, 36.631105 ], [ 105.261418, 36.602764 ], [ 105.2762, 36.563358 ], [ 105.252179, 36.553263 ], [ 105.281744, 36.522489 ], [ 105.322396, 36.535954 ], [ 105.362432, 36.496514 ], [ 105.363048, 36.443093 ], [ 105.398156, 36.430575 ], [ 105.401236, 36.369881 ], [ 105.425873, 36.330357 ], [ 105.455439, 36.321678 ], [ 105.476381, 36.293224 ], [ 105.45975, 36.268137 ], [ 105.460366, 36.223733 ], [ 105.478844, 36.213111 ], [ 105.515185, 36.147415 ], [ 105.491163, 36.101009 ], [ 105.430801, 36.10391 ], [ 105.406163, 36.074409 ], [ 105.343954, 36.033767 ], [ 105.324859, 35.941761 ], [ 105.350113, 35.875839 ], [ 105.39754, 35.857409 ], [ 105.371055, 35.844312 ], [ 105.38091, 35.792873 ], [ 105.408627, 35.822479 ], [ 105.428953, 35.819082 ], [ 105.432033, 35.787533 ], [ 105.457286, 35.771511 ], [ 105.481924, 35.727312 ], [ 105.595873, 35.715651 ], [ 105.667322, 35.749657 ], [ 105.70243, 35.733142 ], [ 105.759097, 35.724883 ], [ 105.740618, 35.698643 ], [ 105.723988, 35.725854 ], [ 105.690727, 35.698643 ], [ 105.722756, 35.673366 ], [ 105.713517, 35.650513 ], [ 105.759097, 35.634464 ], [ 105.762176, 35.602841 ], [ 105.800365, 35.564878 ], [ 105.816379, 35.575101 ], [ 105.847176, 35.490359 ], [ 105.868734, 35.540046 ], [ 105.900147, 35.54735 ], [ 106.017175, 35.519103 ], [ 106.023335, 35.49377 ], [ 106.047356, 35.498155 ], [ 106.048588, 35.488898 ], [ 105.897683, 35.451368 ], [ 105.894603, 35.413821 ], [ 106.002393, 35.438692 ], [ 106.034422, 35.469404 ], [ 106.054132, 35.45478 ], [ 106.071994, 35.463555 ], [ 106.06953, 35.458193 ], [ 106.071378, 35.449418 ], [ 106.073226, 35.447468 ], [ 106.067682, 35.436254 ], [ 106.073226, 35.420649 ], [ 106.083081, 35.421624 ], [ 106.113262, 35.361616 ], [ 106.129892, 35.393333 ], [ 106.173008, 35.437716 ], [ 106.196414, 35.409919 ], [ 106.237681, 35.409431 ], [ 106.241377, 35.358687 ], [ 106.319601, 35.265411 ], [ 106.363333, 35.238532 ], [ 106.368261, 35.273718 ], [ 106.415688, 35.276161 ], [ 106.472354, 35.310842 ], [ 106.501304, 35.364056 ], [ 106.503767, 35.415284 ], [ 106.483441, 35.450393 ], [ 106.490217, 35.480613 ], [ 106.465579, 35.481101 ], [ 106.440941, 35.52641 ], [ 106.460036, 35.578995 ], [ 106.47913, 35.575101 ], [ 106.460036, 35.643705 ], [ 106.434782, 35.688436 ], [ 106.49268, 35.732656 ], [ 106.498224, 35.732656 ], [ 106.504383, 35.736057 ], [ 106.506231, 35.737514 ] ] ], [ [ [ 106.047356, 35.498155 ], [ 106.078769, 35.509848 ], [ 106.071994, 35.463555 ], [ 106.054132, 35.45478 ], [ 106.048588, 35.488898 ], [ 106.047356, 35.498155 ] ] ], [ [ [ 102.831537, 36.365544 ], [ 102.838928, 36.345783 ], [ 102.836465, 36.344819 ], [ 102.829689, 36.365544 ], [ 102.831537, 36.365544 ] ] ], [ [ [ 106.073226, 35.447468 ], [ 106.083081, 35.421624 ], [ 106.073226, 35.420649 ], [ 106.067682, 35.436254 ], [ 106.073226, 35.447468 ] ] ], [ [ [ 106.504383, 35.736057 ], [ 106.498224, 35.732656 ], [ 106.49268, 35.732656 ], [ 106.506231, 35.737514 ], [ 106.504383, 35.736057 ] ] ] ] } },\n{ \"type\": \"Feature\", \"properties\": { \"adcode\": \"630000\", \"name\": \"青海省\", \"center\": [ 101.778916, 36.623178 ], \"centroid\": [ 96.043533, 35.726403 ], \"childrenNum\": 8, \"level\": \"province\", \"parent\": { \"adcode\": 100000 }, \"subFeatureIndex\": 28, \"acroutes\": [ 100000 ] }, \"geometry\": { \"type\": \"MultiPolygon\", \"coordinates\": [ [ [ [ 102.829689, 36.365544 ], [ 102.836465, 36.344819 ], [ 102.845704, 36.331803 ], [ 102.896827, 36.331803 ], [ 102.922696, 36.298047 ], [ 103.024942, 36.256556 ], [ 103.021246, 36.232906 ], [ 103.066826, 36.216974 ], [ 103.048964, 36.199107 ], [ 102.986754, 36.193312 ], [ 102.965812, 36.151765 ], [ 102.948566, 36.150798 ], [ 102.941174, 36.104877 ], [ 102.882044, 36.082632 ], [ 102.932551, 36.048285 ], [ 102.968276, 36.044414 ], [ 102.951645, 36.021667 ], [ 102.971971, 35.995525 ], [ 102.942406, 35.92674 ], [ 102.954725, 35.858864 ], [ 102.94487, 35.829757 ], [ 102.914073, 35.845282 ], [ 102.81737, 35.850133 ], [ 102.787189, 35.862745 ], [ 102.739146, 35.821023 ], [ 102.715125, 35.815685 ], [ 102.686175, 35.771996 ], [ 102.707733, 35.70496 ], [ 102.744074, 35.657807 ], [ 102.7644, 35.653431 ], [ 102.763168, 35.612086 ], [ 102.808747, 35.560496 ], [ 102.746537, 35.545403 ], [ 102.729291, 35.523487 ], [ 102.782878, 35.527871 ], [ 102.743458, 35.494745 ], [ 102.695414, 35.528358 ], [ 102.570995, 35.548324 ], [ 102.531575, 35.580455 ], [ 102.503241, 35.585322 ], [ 102.49893, 35.545403 ], [ 102.437952, 35.455268 ], [ 102.447807, 35.437229 ], [ 102.408387, 35.409431 ], [ 102.314764, 35.434303 ], [ 102.293822, 35.424063 ], [ 102.287663, 35.36552 ], [ 102.317844, 35.343067 ], [ 102.311684, 35.31426 ], [ 102.280887, 35.303028 ], [ 102.3123, 35.282512 ], [ 102.370199, 35.263946 ], [ 102.365887, 35.235599 ], [ 102.404075, 35.179366 ], [ 102.346793, 35.164201 ], [ 102.310452, 35.128967 ], [ 102.29567, 35.071681 ], [ 102.252554, 35.048657 ], [ 102.218062, 35.057475 ], [ 102.211286, 35.034937 ], [ 102.176178, 35.032977 ], [ 102.157699, 35.010923 ], [ 102.133678, 35.014844 ], [ 102.094874, 34.986901 ], [ 102.048062, 34.910868 ], [ 102.068388, 34.887798 ], [ 101.985852, 34.90007 ], [ 101.916867, 34.873561 ], [ 101.923027, 34.835746 ], [ 101.917483, 34.705964 ], [ 101.919947, 34.621791 ], [ 101.934729, 34.58731 ], [ 101.956287, 34.582876 ], [ 101.97415, 34.548871 ], [ 102.001867, 34.538519 ], [ 102.093026, 34.536547 ], [ 102.139837, 34.50351 ], [ 102.155852, 34.507456 ], [ 102.169402, 34.457631 ], [ 102.205743, 34.407777 ], [ 102.259329, 34.355917 ], [ 102.237156, 34.34307 ], [ 102.237156, 34.34307 ], [ 102.186649, 34.352952 ], [ 102.149692, 34.271885 ], [ 102.067772, 34.293642 ], [ 102.062229, 34.227858 ], [ 102.01357, 34.218456 ], [ 102.030816, 34.190739 ], [ 102.003099, 34.162022 ], [ 101.965526, 34.167469 ], [ 101.955055, 34.109514 ], [ 101.897773, 34.133791 ], [ 101.874367, 34.130323 ], [ 101.851578, 34.153108 ], [ 101.836795, 34.124378 ], [ 101.788136, 34.131809 ], [ 101.764114, 34.122892 ], [ 101.736397, 34.080275 ], [ 101.718535, 34.083249 ], [ 101.703136, 34.119424 ], [ 101.674187, 34.110506 ], [ 101.6206, 34.178857 ], [ 101.53868, 34.212022 ], [ 101.492485, 34.195689 ], [ 101.482014, 34.218951 ], [ 101.417956, 34.227858 ], [ 101.369913, 34.248143 ], [ 101.327413, 34.24468 ], [ 101.325565, 34.268423 ], [ 101.268899, 34.278808 ], [ 101.228863, 34.298586 ], [ 101.235022, 34.325279 ], [ 101.193754, 34.336646 ], [ 101.178356, 34.320831 ], [ 101.098284, 34.329233 ], [ 101.054552, 34.322808 ], [ 100.986799, 34.374689 ], [ 100.951074, 34.38358 ], [ 100.895024, 34.375183 ], [ 100.868538, 34.332693 ], [ 100.821727, 34.317371 ], [ 100.798321, 34.260014 ], [ 100.809408, 34.247153 ], [ 100.764445, 34.178857 ], [ 100.806329, 34.155584 ], [ 100.848828, 34.089692 ], [ 100.870386, 34.083744 ], [ 100.880857, 34.036644 ], [ 100.93506, 33.990013 ], [ 100.927669, 33.975126 ], [ 100.965857, 33.946832 ], [ 100.994806, 33.891707 ], [ 101.023139, 33.896178 ], [ 101.054552, 33.863386 ], [ 101.153718, 33.8445 ], [ 101.153102, 33.823124 ], [ 101.190675, 33.791796 ], [ 101.186363, 33.741051 ], [ 101.162957, 33.719649 ], [ 101.177124, 33.685295 ], [ 101.166653, 33.659894 ], [ 101.217776, 33.669856 ], [ 101.23687, 33.685793 ], [ 101.302776, 33.657902 ], [ 101.385312, 33.644949 ], [ 101.424732, 33.655411 ], [ 101.428427, 33.680315 ], [ 101.501724, 33.702723 ], [ 101.58426, 33.674339 ], [ 101.585492, 33.645448 ], [ 101.616905, 33.598603 ], [ 101.611977, 33.565199 ], [ 101.622448, 33.502343 ], [ 101.718535, 33.494857 ], [ 101.748716, 33.505337 ], [ 101.769042, 33.538765 ], [ 101.777665, 33.533776 ], [ 101.769042, 33.45592 ], [ 101.695745, 33.433948 ], [ 101.663716, 33.383991 ], [ 101.64955, 33.323004 ], [ 101.677883, 33.297497 ], [ 101.735781, 33.279987 ], [ 101.709912, 33.21292 ], [ 101.653861, 33.162835 ], [ 101.661252, 33.135778 ], [ 101.633535, 33.101193 ], [ 101.557775, 33.167344 ], [ 101.515275, 33.192889 ], [ 101.487557, 33.226938 ], [ 101.403174, 33.225436 ], [ 101.386543, 33.207412 ], [ 101.393935, 33.157826 ], [ 101.381616, 33.153316 ], [ 101.297232, 33.262475 ], [ 101.217776, 33.256469 ], [ 101.182668, 33.26948 ], [ 101.156798, 33.236449 ], [ 101.124769, 33.221431 ], [ 101.11553, 33.194893 ], [ 101.169733, 33.10019 ], [ 101.143863, 33.086151 ], [ 101.146327, 33.056563 ], [ 101.184515, 33.041514 ], [ 101.171581, 33.009902 ], [ 101.183899, 32.984304 ], [ 101.129081, 32.989324 ], [ 101.134624, 32.95217 ], [ 101.124153, 32.909976 ], [ 101.178356, 32.892892 ], [ 101.223935, 32.855698 ], [ 101.237486, 32.825026 ], [ 101.22332, 32.725898 ], [ 101.157414, 32.661431 ], [ 101.124769, 32.658408 ], [ 101.077342, 32.68259 ], [ 101.030531, 32.660424 ], [ 100.99727, 32.627668 ], [ 100.956618, 32.621116 ], [ 100.93198, 32.600447 ], [ 100.887633, 32.632708 ], [ 100.834046, 32.648835 ], [ 100.77122, 32.643795 ], [ 100.690532, 32.678056 ], [ 100.71209, 32.645307 ], [ 100.710242, 32.610026 ], [ 100.673286, 32.628172 ], [ 100.661583, 32.616075 ], [ 100.657887, 32.546484 ], [ 100.645568, 32.526303 ], [ 100.603069, 32.553547 ], [ 100.54517, 32.569687 ], [ 100.516837, 32.632204 ], [ 100.470026, 32.694678 ], [ 100.450932, 32.694678 ], [ 100.420135, 32.73194 ], [ 100.378251, 32.698707 ], [ 100.399193, 32.756101 ], [ 100.339447, 32.719353 ], [ 100.258759, 32.742511 ], [ 100.231041, 32.696189 ], [ 100.229809, 32.650346 ], [ 100.208252, 32.606497 ], [ 100.189773, 32.630692 ], [ 100.109701, 32.640268 ], [ 100.088143, 32.668988 ], [ 100.139266, 32.724388 ], [ 100.117093, 32.802392 ], [ 100.123252, 32.837095 ], [ 100.064738, 32.895907 ], [ 100.029629, 32.895907 ], [ 100.038252, 32.929066 ], [ 99.956332, 32.948152 ], [ 99.947709, 32.986814 ], [ 99.877492, 33.045527 ], [ 99.877492, 32.993339 ], [ 99.851007, 32.941623 ], [ 99.805427, 32.940619 ], [ 99.788181, 32.956689 ], [ 99.764159, 32.924545 ], [ 99.791877, 32.883344 ], [ 99.766623, 32.826032 ], [ 99.760464, 32.769689 ], [ 99.717964, 32.732443 ], [ 99.705029, 32.76516 ], [ 99.646515, 32.774721 ], [ 99.640355, 32.790822 ], [ 99.589233, 32.789312 ], [ 99.558436, 32.839106 ], [ 99.45311, 32.862233 ], [ 99.376118, 32.899927 ], [ 99.353944, 32.885354 ], [ 99.268944, 32.878318 ], [ 99.24677, 32.924043 ], [ 99.235067, 32.982296 ], [ 99.214741, 32.991332 ], [ 99.196263, 33.035493 ], [ 99.124814, 33.046028 ], [ 99.090322, 33.079131 ], [ 99.024416, 33.094675 ], [ 99.014561, 33.081137 ], [ 98.971445, 33.098185 ], [ 98.967134, 33.115229 ], [ 98.92217, 33.118738 ], [ 98.858728, 33.150811 ], [ 98.804526, 33.219428 ], [ 98.802062, 33.270481 ], [ 98.759562, 33.276985 ], [ 98.779888, 33.370497 ], [ 98.736157, 33.406975 ], [ 98.742316, 33.477887 ], [ 98.725686, 33.503341 ], [ 98.678258, 33.522801 ], [ 98.648077, 33.548741 ], [ 98.652389, 33.595114 ], [ 98.622824, 33.610067 ], [ 98.61728, 33.637476 ], [ 98.6567, 33.64744 ], [ 98.610505, 33.682805 ], [ 98.582788, 33.731595 ], [ 98.537824, 33.74752 ], [ 98.51873, 33.77389 ], [ 98.494092, 33.768915 ], [ 98.492861, 33.796272 ], [ 98.463295, 33.848477 ], [ 98.434962, 33.843009 ], [ 98.407245, 33.867362 ], [ 98.425723, 33.913066 ], [ 98.415252, 33.956761 ], [ 98.440506, 33.981577 ], [ 98.428187, 34.029204 ], [ 98.396774, 34.053008 ], [ 98.392462, 34.089196 ], [ 98.344419, 34.094648 ], [ 98.258188, 34.083249 ], [ 98.206449, 34.08424 ], [ 98.157174, 34.107532 ], [ 98.098043, 34.122892 ], [ 98.051848, 34.11546 ], [ 97.95453, 34.190739 ], [ 97.898479, 34.209548 ], [ 97.796849, 34.199154 ], [ 97.796849, 34.199154 ], [ 97.789458, 34.182818 ], [ 97.789458, 34.182818 ], [ 97.766668, 34.158555 ], [ 97.665654, 34.126855 ], [ 97.70261, 34.036644 ], [ 97.652719, 33.998448 ], [ 97.660111, 33.956264 ], [ 97.629314, 33.919523 ], [ 97.601596, 33.929951 ], [ 97.52214, 33.903133 ], [ 97.503662, 33.912073 ], [ 97.460546, 33.887236 ], [ 97.395257, 33.889224 ], [ 97.398336, 33.848477 ], [ 97.371851, 33.842015 ], [ 97.373083, 33.817655 ], [ 97.406344, 33.795278 ], [ 97.422974, 33.754984 ], [ 97.418046, 33.728608 ], [ 97.435293, 33.682307 ], [ 97.415583, 33.605582 ], [ 97.450075, 33.582152 ], [ 97.523372, 33.577166 ], [ 97.511669, 33.520805 ], [ 97.552321, 33.465906 ], [ 97.625618, 33.461412 ], [ 97.674893, 33.432949 ], [ 97.754349, 33.409972 ], [ 97.676125, 33.341004 ], [ 97.622538, 33.337005 ], [ 97.607756, 33.263976 ], [ 97.548626, 33.203907 ], [ 97.487648, 33.168346 ], [ 97.498119, 33.137783 ], [ 97.487032, 33.107209 ], [ 97.517213, 33.097683 ], [ 97.542466, 33.035995 ], [ 97.499966, 33.011408 ], [ 97.523988, 32.988822 ], [ 97.438372, 32.976271 ], [ 97.375547, 32.956689 ], [ 97.347829, 32.895907 ], [ 97.376163, 32.886359 ], [ 97.392793, 32.828546 ], [ 97.386018, 32.77925 ], [ 97.429133, 32.714318 ], [ 97.42359, 32.70475 ], [ 97.48272, 32.654377 ], [ 97.535075, 32.638252 ], [ 97.543698, 32.62162 ], [ 97.607756, 32.614059 ], [ 97.616995, 32.586329 ], [ 97.700763, 32.53488 ], [ 97.730944, 32.527312 ], [ 97.684132, 32.530339 ], [ 97.670582, 32.51722 ], [ 97.540618, 32.536899 ], [ 97.50243, 32.530844 ], [ 97.463626, 32.55506 ], [ 97.448843, 32.586833 ], [ 97.411887, 32.575235 ], [ 97.374315, 32.546484 ], [ 97.3583, 32.563635 ], [ 97.332431, 32.542448 ], [ 97.334895, 32.514192 ], [ 97.388481, 32.501575 ], [ 97.341054, 32.440987 ], [ 97.387865, 32.427349 ], [ 97.424822, 32.322723 ], [ 97.415583, 32.296421 ], [ 97.371235, 32.273148 ], [ 97.32196, 32.303503 ], [ 97.299786, 32.294904 ], [ 97.264062, 32.182527 ], [ 97.271453, 32.139971 ], [ 97.313953, 32.130342 ], [ 97.293011, 32.096887 ], [ 97.308409, 32.076605 ], [ 97.258518, 32.072041 ], [ 97.219714, 32.109054 ], [ 97.201852, 32.090296 ], [ 97.233881, 32.063927 ], [ 97.214786, 32.042623 ], [ 97.188301, 32.055304 ], [ 97.169823, 32.032984 ], [ 97.127323, 32.044145 ], [ 97.028773, 32.04871 ], [ 97.006599, 32.067984 ], [ 96.935766, 32.048203 ], [ 96.965947, 32.008628 ], [ 96.941925, 31.986297 ], [ 96.894498, 32.013703 ], [ 96.863085, 31.996448 ], [ 96.868629, 31.964975 ], [ 96.824281, 32.007613 ], [ 96.722651, 32.013195 ], [ 96.742977, 32.001016 ], [ 96.753448, 31.944156 ], [ 96.776238, 31.935015 ], [ 96.81073, 31.894375 ], [ 96.794716, 31.869474 ], [ 96.760223, 31.860325 ], [ 96.765767, 31.819144 ], [ 96.799027, 31.792188 ], [ 96.840295, 31.720438 ], [ 96.790404, 31.698545 ], [ 96.778701, 31.675629 ], [ 96.722651, 31.686833 ], [ 96.691854, 31.722474 ], [ 96.661057, 31.705674 ], [ 96.615477, 31.737236 ], [ 96.56805, 31.711783 ], [ 96.519391, 31.74945 ], [ 96.468884, 31.769804 ], [ 96.435623, 31.796258 ], [ 96.407906, 31.845583 ], [ 96.389428, 31.919777 ], [ 96.288414, 31.919777 ], [ 96.253305, 31.929936 ], [ 96.220044, 31.905553 ], [ 96.188632, 31.904028 ], [ 96.214501, 31.876589 ], [ 96.202798, 31.841008 ], [ 96.183088, 31.835924 ], [ 96.178161, 31.775401 ], [ 96.231131, 31.749959 ], [ 96.222508, 31.733164 ], [ 96.252073, 31.697527 ], [ 96.245298, 31.657802 ], [ 96.221892, 31.647613 ], [ 96.207726, 31.598691 ], [ 96.156603, 31.602769 ], [ 96.148595, 31.686324 ], [ 96.135661, 31.70211 ], [ 96.064828, 31.720438 ], [ 95.989067, 31.78761 ], [ 95.983524, 31.816601 ], [ 95.89914, 31.81711 ], [ 95.846169, 31.736218 ], [ 95.853561, 31.714329 ], [ 95.823995, 31.68225 ], [ 95.779648, 31.748941 ], [ 95.634286, 31.782523 ], [ 95.580083, 31.76726 ], [ 95.546823, 31.73978 ], [ 95.511714, 31.750468 ], [ 95.480301, 31.795749 ], [ 95.456896, 31.801853 ], [ 95.406389, 31.896915 ], [ 95.408852, 31.918761 ], [ 95.3682, 31.92892 ], [ 95.360809, 31.95939 ], [ 95.395918, 32.001523 ], [ 95.454432, 32.007613 ], [ 95.421171, 32.033999 ], [ 95.454432, 32.061898 ], [ 95.440265, 32.157705 ], [ 95.406389, 32.182021 ], [ 95.367584, 32.178982 ], [ 95.366968, 32.151118 ], [ 95.31523, 32.148585 ], [ 95.270266, 32.194683 ], [ 95.270266, 32.194683 ], [ 95.239469, 32.287315 ], [ 95.241317, 32.3207 ], [ 95.214216, 32.321712 ], [ 95.20744, 32.297433 ], [ 95.10581, 32.258979 ], [ 95.079325, 32.279726 ], [ 95.096571, 32.322217 ], [ 95.193274, 32.332331 ], [ 95.261643, 32.348006 ], [ 95.228382, 32.363678 ], [ 95.218527, 32.397035 ], [ 95.153853, 32.386423 ], [ 95.081789, 32.384907 ], [ 95.075013, 32.376315 ], [ 95.075013, 32.376315 ], [ 95.057151, 32.395014 ], [ 94.988166, 32.422802 ], [ 94.944434, 32.404109 ], [ 94.912405, 32.41573 ], [ 94.889616, 32.472295 ], [ 94.852043, 32.463712 ], [ 94.80708, 32.486431 ], [ 94.78737, 32.522266 ], [ 94.762116, 32.526303 ], [ 94.737479, 32.587338 ], [ 94.638312, 32.645307 ], [ 94.614291, 32.673522 ], [ 94.591501, 32.640772 ], [ 94.522516, 32.595909 ], [ 94.459074, 32.599439 ], [ 94.463386, 32.572209 ], [ 94.435052, 32.562626 ], [ 94.395016, 32.594397 ], [ 94.371611, 32.524789 ], [ 94.350053, 32.533871 ], [ 94.294002, 32.519743 ], [ 94.292154, 32.502584 ], [ 94.250886, 32.51722 ], [ 94.196684, 32.51621 ], [ 94.176974, 32.454117 ], [ 94.137554, 32.433915 ], [ 94.091974, 32.463207 ], [ 94.049474, 32.469771 ], [ 94.03038, 32.448057 ], [ 93.978641, 32.459672 ], [ 93.960163, 32.484917 ], [ 93.90904, 32.463207 ], [ 93.861613, 32.466237 ], [ 93.851142, 32.50965 ], [ 93.820345, 32.549511 ], [ 93.75136, 32.56313 ], [ 93.721795, 32.578261 ], [ 93.651577, 32.571705 ], [ 93.618933, 32.522771 ], [ 93.516687, 32.47583 ], [ 93.501904, 32.503593 ], [ 93.476651, 32.504603 ], [ 93.4631, 32.556069 ], [ 93.411977, 32.558086 ], [ 93.385492, 32.525294 ], [ 93.33868, 32.5712 ], [ 93.308499, 32.580278 ], [ 93.300492, 32.619604 ], [ 93.260456, 32.62666 ], [ 93.239514, 32.662439 ], [ 93.210565, 32.655385 ], [ 93.176688, 32.6705 ], [ 93.159442, 32.644803 ], [ 93.087993, 32.63674 ], [ 93.069515, 32.626156 ], [ 93.023935, 32.703239 ], [ 93.019624, 32.737477 ], [ 93.00053, 32.741001 ], [ 92.964189, 32.714821 ], [ 92.933392, 32.719353 ], [ 92.866871, 32.698203 ], [ 92.822523, 32.729926 ], [ 92.789262, 32.719856 ], [ 92.756618, 32.743014 ], [ 92.686401, 32.76516 ], [ 92.667922, 32.73194 ], [ 92.634662, 32.720863 ], [ 92.574916, 32.741001 ], [ 92.56814, 32.73194 ], [ 92.484372, 32.745028 ], [ 92.459119, 32.76365 ], [ 92.411076, 32.748048 ], [ 92.355641, 32.764657 ], [ 92.343938, 32.738484 ], [ 92.310062, 32.751571 ], [ 92.255243, 32.720863 ], [ 92.198577, 32.754591 ], [ 92.211511, 32.788306 ], [ 92.193649, 32.801889 ], [ 92.227526, 32.821003 ], [ 92.205352, 32.866255 ], [ 92.145606, 32.885857 ], [ 92.101874, 32.860222 ], [ 92.038432, 32.860725 ], [ 92.018722, 32.829552 ], [ 91.955897, 32.8205 ], [ 91.896766, 32.907967 ], [ 91.857962, 32.90244 ], [ 91.839484, 32.948152 ], [ 91.799448, 32.942126 ], [ 91.752637, 32.969242 ], [ 91.685499, 32.989324 ], [ 91.664557, 33.012913 ], [ 91.583253, 33.0375 ], [ 91.55492, 33.060074 ], [ 91.535826, 33.10019 ], [ 91.49579, 33.109214 ], [ 91.436044, 33.066092 ], [ 91.370138, 33.100691 ], [ 91.311624, 33.108211 ], [ 91.261733, 33.141291 ], [ 91.226624, 33.141792 ], [ 91.18782, 33.106206 ], [ 91.161335, 33.108712 ], [ 91.147784, 33.07211 ], [ 91.072024, 33.113224 ], [ 91.037531, 33.098686 ], [ 91.001807, 33.11573 ], [ 90.927894, 33.120241 ], [ 90.902024, 33.083143 ], [ 90.88293, 33.120241 ], [ 90.803474, 33.114227 ], [ 90.740032, 33.142293 ], [ 90.704308, 33.135778 ], [ 90.627315, 33.180368 ], [ 90.562642, 33.229441 ], [ 90.490577, 33.264977 ], [ 90.405577, 33.260473 ], [ 90.363077, 33.279487 ], [ 90.332896, 33.310501 ], [ 90.246665, 33.423959 ], [ 90.22018, 33.437943 ], [ 90.107463, 33.460913 ], [ 90.088984, 33.478885 ], [ 90.083441, 33.525295 ], [ 90.01076, 33.553728 ], [ 89.984275, 33.612061 ], [ 90.008296, 33.687785 ], [ 89.981195, 33.70322 ], [ 89.983659, 33.725622 ], [ 89.907282, 33.741051 ], [ 89.902355, 33.758467 ], [ 89.942391, 33.801246 ], [ 89.899891, 33.80771 ], [ 89.837065, 33.868853 ], [ 89.795181, 33.865374 ], [ 89.73174, 33.921509 ], [ 89.718805, 33.946832 ], [ 89.688008, 33.959739 ], [ 89.684928, 33.990013 ], [ 89.635037, 34.049537 ], [ 89.656595, 34.057966 ], [ 89.655979, 34.097126 ], [ 89.71203, 34.131809 ], [ 89.756993, 34.124874 ], [ 89.760073, 34.152613 ], [ 89.789638, 34.150632 ], [ 89.816739, 34.16945 ], [ 89.838297, 34.263477 ], [ 89.825362, 34.293642 ], [ 89.86663, 34.324785 ], [ 89.858623, 34.359375 ], [ 89.820435, 34.369255 ], [ 89.799493, 34.39642 ], [ 89.819819, 34.420614 ], [ 89.823515, 34.455657 ], [ 89.814891, 34.548871 ], [ 89.777935, 34.574499 ], [ 89.798877, 34.628686 ], [ 89.74837, 34.641981 ], [ 89.72558, 34.660689 ], [ 89.732356, 34.732035 ], [ 89.799493, 34.743838 ], [ 89.825978, 34.796931 ], [ 89.867862, 34.81069 ], [ 89.838913, 34.865705 ], [ 89.814891, 34.86816 ], [ 89.821051, 34.902033 ], [ 89.78779, 34.921664 ], [ 89.747138, 34.903506 ], [ 89.707102, 34.919701 ], [ 89.670146, 34.887798 ], [ 89.578987, 34.895162 ], [ 89.560509, 34.938836 ], [ 89.59069, 35.057965 ], [ 89.593153, 35.104491 ], [ 89.579603, 35.118688 ], [ 89.519241, 35.133862 ], [ 89.46935, 35.214577 ], [ 89.450255, 35.223867 ], [ 89.48598, 35.256616 ], [ 89.531559, 35.276161 ], [ 89.494603, 35.298632 ], [ 89.516161, 35.330862 ], [ 89.497067, 35.361128 ], [ 89.58761, 35.383575 ], [ 89.619639, 35.412357 ], [ 89.658443, 35.425526 ], [ 89.685544, 35.416259 ], [ 89.739131, 35.468429 ], [ 89.765, 35.482563 ], [ 89.740979, 35.507412 ], [ 89.720037, 35.501566 ], [ 89.699711, 35.544916 ], [ 89.71203, 35.581915 ], [ 89.75145, 35.580942 ], [ 89.765616, 35.599922 ], [ 89.726196, 35.648082 ], [ 89.748986, 35.66267 ], [ 89.747138, 35.7516 ], [ 89.782863, 35.773453 ], [ 89.767464, 35.799183 ], [ 89.801957, 35.848193 ], [ 89.778551, 35.861775 ], [ 89.707718, 35.849163 ], [ 89.654747, 35.848193 ], [ 89.62395, 35.859349 ], [ 89.550654, 35.856924 ], [ 89.554965, 35.873414 ], [ 89.489676, 35.903475 ], [ 89.428082, 35.917531 ], [ 89.434857, 35.992136 ], [ 89.404676, 36.016827 ], [ 89.417611, 36.044897 ], [ 89.474893, 36.022151 ], [ 89.605472, 36.038123 ], [ 89.688624, 36.091337 ], [ 89.711414, 36.093272 ], [ 89.766848, 36.073925 ], [ 89.819819, 36.080697 ], [ 89.914058, 36.079246 ], [ 89.941159, 36.067637 ], [ 89.944855, 36.140649 ], [ 89.997825, 36.168193 ], [ 90.019999, 36.213594 ], [ 90.028006, 36.258486 ], [ 90.003369, 36.278752 ], [ 90.043405, 36.276822 ], [ 90.058188, 36.255591 ], [ 90.145651, 36.239181 ], [ 90.130252, 36.2078 ], [ 90.198006, 36.187516 ], [ 90.23681, 36.160462 ], [ 90.325505, 36.159496 ], [ 90.424055, 36.133883 ], [ 90.478258, 36.13195 ], [ 90.534925, 36.147899 ], [ 90.613149, 36.126632 ], [ 90.659344, 36.13485 ], [ 90.776373, 36.086501 ], [ 90.815793, 36.035703 ], [ 90.850285, 36.016827 ], [ 90.922966, 36.028927 ], [ 90.979017, 36.106811 ], [ 91.081263, 36.088436 ], [ 91.124994, 36.115514 ], [ 91.09235, 36.163844 ], [ 91.096045, 36.219871 ], [ 91.051698, 36.238215 ], [ 91.07264, 36.299012 ], [ 91.026444, 36.323607 ], [ 91.051698, 36.433946 ], [ 91.028292, 36.443093 ], [ 91.039995, 36.474861 ], [ 91.035683, 36.529703 ], [ 91.011662, 36.539801 ], [ 90.905104, 36.560474 ], [ 90.831191, 36.55807 ], [ 90.810865, 36.585466 ], [ 90.741264, 36.585947 ], [ 90.72217, 36.620058 ], [ 90.730793, 36.655594 ], [ 90.706156, 36.658955 ], [ 90.720938, 36.708868 ], [ 90.754815, 36.721341 ], [ 90.727098, 36.755872 ], [ 90.732025, 36.825844 ], [ 90.758511, 36.825844 ], [ 90.853981, 36.915373 ], [ 90.924198, 36.921115 ], [ 90.983944, 36.913459 ], [ 91.036915, 36.929727 ], [ 91.051698, 36.96751 ], [ 91.126842, 36.978507 ], [ 91.133618, 37.007665 ], [ 91.181045, 37.025345 ], [ 91.216153, 37.010054 ], [ 91.303617, 37.012444 ], [ 91.291298, 37.042544 ], [ 91.303617, 37.083136 ], [ 91.286371, 37.105095 ], [ 91.280211, 37.163779 ], [ 91.1909, 37.205737 ], [ 91.194596, 37.273868 ], [ 91.134849, 37.324331 ], [ 91.136081, 37.355734 ], [ 91.113292, 37.387124 ], [ 91.099741, 37.447965 ], [ 91.073256, 37.475992 ], [ 91.019669, 37.493088 ], [ 90.958075, 37.477891 ], [ 90.911879, 37.519674 ], [ 90.865684, 37.53059 ], [ 90.882314, 37.575664 ], [ 90.854597, 37.604117 ], [ 90.820104, 37.613599 ], [ 90.777605, 37.648672 ], [ 90.643946, 37.696988 ], [ 90.586663, 37.703144 ], [ 90.579272, 37.720661 ], [ 90.519526, 37.730601 ], [ 90.516446, 38.207111 ], [ 90.531229, 38.319886 ], [ 90.401882, 38.311434 ], [ 90.361846, 38.300163 ], [ 90.352607, 38.233441 ], [ 90.280542, 38.238142 ], [ 90.137644, 38.340543 ], [ 90.179528, 38.396848 ], [ 90.129636, 38.400131 ], [ 90.111774, 38.418889 ], [ 90.111774, 38.477945 ], [ 90.130868, 38.494341 ], [ 90.248513, 38.491531 ], [ 90.315034, 38.501835 ], [ 90.353222, 38.482162 ], [ 90.427135, 38.493873 ], [ 90.465323, 38.521971 ], [ 90.463476, 38.556611 ], [ 90.525685, 38.561291 ], [ 90.560794, 38.593573 ], [ 90.608837, 38.594508 ], [ 90.606374, 38.610878 ], [ 90.645794, 38.635191 ], [ 90.619308, 38.664636 ], [ 90.65996, 38.674449 ], [ 90.724634, 38.658094 ], [ 90.899561, 38.679588 ], [ 90.970394, 38.697806 ], [ 90.992567, 38.695003 ], [ 91.188436, 38.73096 ], [ 91.242639, 38.752433 ], [ 91.298689, 38.746365 ], [ 91.446515, 38.813546 ], [ 91.501333, 38.815411 ], [ 91.681188, 38.852706 ], [ 91.694738, 38.86622 ], [ 91.806223, 38.872744 ], [ 91.87952, 38.884391 ], [ 91.880752, 38.899297 ], [ 91.966368, 38.930961 ], [ 92.10865, 38.963541 ], [ 92.173323, 38.960749 ], [ 92.197961, 38.983548 ], [ 92.263866, 39.002153 ], [ 92.380279, 38.999828 ], [ 92.416003, 39.010524 ], [ 92.41046, 39.03842 ], [ 92.459119, 39.042604 ], [ 92.459119, 39.063982 ], [ 92.489916, 39.099753 ], [ 92.545966, 39.111362 ], [ 92.659299, 39.109969 ], [ 92.765857, 39.136898 ], [ 92.866871, 39.138754 ], [ 92.889045, 39.160103 ], [ 92.938936, 39.169848 ], [ 92.978356, 39.143396 ], [ 93.043029, 39.146645 ], [ 93.115094, 39.17959 ], [ 93.142196, 39.160567 ], [ 93.131725, 39.108112 ], [ 93.165601, 39.090928 ], [ 93.198246, 39.045857 ], [ 93.179152, 38.923977 ], [ 93.237666, 38.916062 ], [ 93.274007, 38.896036 ], [ 93.453245, 38.915596 ], [ 93.729186, 38.924443 ], [ 93.834511, 38.867618 ], [ 93.884403, 38.867618 ], [ 93.884403, 38.826136 ], [ 93.769838, 38.821007 ], [ 93.756287, 38.807484 ], [ 93.773533, 38.771099 ], [ 93.800019, 38.750566 ], [ 93.885018, 38.720689 ], [ 93.95154, 38.715086 ], [ 93.973098, 38.724891 ], [ 94.281067, 38.7599 ], [ 94.370379, 38.7627 ], [ 94.511429, 38.445142 ], [ 94.527443, 38.425922 ], [ 94.527443, 38.365416 ], [ 94.56132, 38.351807 ], [ 94.582878, 38.36917 ], [ 94.672805, 38.386998 ], [ 94.812623, 38.385591 ], [ 94.861282, 38.393565 ], [ 94.884072, 38.414669 ], [ 94.973999, 38.430142 ], [ 95.045448, 38.418889 ], [ 95.072549, 38.402476 ], [ 95.122441, 38.417014 ], [ 95.140919, 38.392158 ], [ 95.185266, 38.379492 ], [ 95.209904, 38.327868 ], [ 95.229614, 38.330685 ], [ 95.259179, 38.302981 ], [ 95.315846, 38.318947 ], [ 95.408236, 38.300163 ], [ 95.440881, 38.310965 ], [ 95.455664, 38.291709 ], [ 95.487693, 38.314721 ], [ 95.51849, 38.294997 ], [ 95.585011, 38.343359 ], [ 95.608417, 38.339134 ], [ 95.671858, 38.388405 ], [ 95.703887, 38.400131 ], [ 95.723597, 38.378554 ], [ 95.775952, 38.356031 ], [ 95.83693, 38.344298 ], [ 95.852945, 38.287481 ], [ 95.89606, 38.2903 ], [ 95.932401, 38.259291 ], [ 95.93856, 38.237202 ], [ 96.006929, 38.207582 ], [ 96.06606, 38.173245 ], [ 96.109175, 38.187358 ], [ 96.221892, 38.149246 ], [ 96.252689, 38.167599 ], [ 96.264392, 38.145952 ], [ 96.313051, 38.161952 ], [ 96.301964, 38.183124 ], [ 96.335841, 38.246132 ], [ 96.378341, 38.277146 ], [ 96.46334, 38.277616 ], [ 96.665369, 38.23015 ], [ 96.655514, 38.295936 ], [ 96.638883, 38.307208 ], [ 96.626564, 38.356031 ], [ 96.698013, 38.422172 ], [ 96.707868, 38.459203 ], [ 96.6666, 38.483567 ], [ 96.706637, 38.505582 ], [ 96.780549, 38.504177 ], [ 96.800259, 38.52759 ], [ 96.767614, 38.552399 ], [ 96.808882, 38.582346 ], [ 96.7941, 38.608072 ], [ 96.847071, 38.599186 ], [ 96.876636, 38.580475 ], [ 96.961019, 38.558015 ], [ 97.055874, 38.594508 ], [ 97.047251, 38.653888 ], [ 97.057722, 38.67258 ], [ 97.009063, 38.702477 ], [ 97.023229, 38.755699 ], [ 97.00044, 38.7613 ], [ 96.987505, 38.793025 ], [ 96.993664, 38.834993 ], [ 96.983809, 38.869016 ], [ 96.940693, 38.90768 ], [ 96.938846, 38.95563 ], [ 96.965331, 39.017034 ], [ 96.95794, 39.041674 ], [ 96.969643, 39.097895 ], [ 97.012142, 39.142004 ], [ 96.962251, 39.198144 ], [ 97.017686, 39.208347 ], [ 97.060186, 39.19768 ], [ 97.14149, 39.199999 ], [ 97.220946, 39.193042 ], [ 97.315185, 39.164744 ], [ 97.347213, 39.167528 ], [ 97.371235, 39.140611 ], [ 97.401416, 39.146645 ], [ 97.458698, 39.117863 ], [ 97.504894, 39.076527 ], [ 97.58127, 39.052364 ], [ 97.679205, 39.010524 ], [ 97.701379, 38.963076 ], [ 97.828878, 38.93003 ], [ 97.875689, 38.898365 ], [ 98.009348, 38.85923 ], [ 98.029058, 38.834061 ], [ 98.068478, 38.816344 ], [ 98.091884, 38.786495 ], [ 98.167645, 38.840121 ], [ 98.242173, 38.880664 ], [ 98.235398, 38.918855 ], [ 98.276666, 38.963541 ], [ 98.287753, 38.992386 ], [ 98.280977, 39.027263 ], [ 98.316702, 39.040744 ], [ 98.383839, 39.029588 ], [ 98.401086, 39.001688 ], [ 98.432498, 38.996107 ], [ 98.428187, 38.976104 ], [ 98.457752, 38.952838 ], [ 98.526737, 38.95563 ], [ 98.584635, 38.93003 ], [ 98.624056, 38.959353 ], [ 98.612353, 38.977035 ], [ 98.661628, 38.993782 ], [ 98.70536, 39.043533 ], [ 98.730613, 39.057011 ], [ 98.743548, 39.086747 ], [ 98.816845, 39.085818 ], [ 98.818076, 39.064911 ], [ 98.886446, 39.040744 ], [ 98.903076, 39.012384 ], [ 98.951735, 38.987735 ], [ 99.054597, 38.97657 ], [ 99.107568, 38.951907 ], [ 99.071843, 38.921184 ], [ 99.068764, 38.896968 ], [ 99.141445, 38.852706 ], [ 99.222133, 38.788827 ], [ 99.291118, 38.765966 ], [ 99.361951, 38.718354 ], [ 99.375502, 38.684727 ], [ 99.412458, 38.665571 ], [ 99.450646, 38.60433 ], [ 99.501769, 38.612281 ], [ 99.52887, 38.546314 ], [ 99.585537, 38.498556 ], [ 99.63974, 38.474666 ], [ 99.65945, 38.449361 ], [ 99.727203, 38.415607 ], [ 99.758, 38.410449 ], [ 99.826985, 38.370109 ], [ 99.960028, 38.320825 ], [ 100.001912, 38.315191 ], [ 100.049955, 38.283254 ], [ 100.071513, 38.284663 ], [ 100.117093, 38.253652 ], [ 100.126332, 38.231561 ], [ 100.182998, 38.222158 ], [ 100.159592, 38.291239 ], [ 100.163904, 38.328337 ], [ 100.136803, 38.33444 ], [ 100.093071, 38.407166 ], [ 100.022238, 38.432017 ], [ 100.001296, 38.467169 ], [ 100.025933, 38.507923 ], [ 100.064122, 38.518694 ], [ 100.086911, 38.492936 ], [ 100.113397, 38.497151 ], [ 100.163288, 38.461546 ], [ 100.24028, 38.441861 ], [ 100.259374, 38.366355 ], [ 100.301874, 38.388405 ], [ 100.331439, 38.337257 ], [ 100.318505, 38.329276 ], [ 100.396729, 38.293118 ], [ 100.424446, 38.307208 ], [ 100.432453, 38.275267 ], [ 100.459555, 38.2654 ], [ 100.474953, 38.288891 ], [ 100.516837, 38.272448 ], [ 100.545786, 38.247072 ], [ 100.595061, 38.242372 ], [ 100.619083, 38.26587 ], [ 100.71517, 38.253652 ], [ 100.752126, 38.238612 ], [ 100.825423, 38.158658 ], [ 100.860531, 38.148305 ], [ 100.913502, 38.17889 ], [ 100.93814, 38.16007 ], [ 100.91843, 38.129006 ], [ 100.922125, 38.084741 ], [ 100.888864, 38.056001 ], [ 100.895024, 38.013107 ], [ 100.91843, 37.999432 ], [ 100.964009, 38.011221 ], [ 101.077342, 37.941874 ], [ 101.103211, 37.946593 ], [ 101.114298, 37.92016 ], [ 101.152486, 37.891356 ], [ 101.159262, 37.86821 ], [ 101.202994, 37.84742 ], [ 101.276906, 37.83655 ], [ 101.362522, 37.791162 ], [ 101.382848, 37.822369 ], [ 101.459224, 37.86632 ], [ 101.551615, 37.835604 ], [ 101.598427, 37.827569 ], [ 101.670491, 37.754264 ], [ 101.659405, 37.733441 ], [ 101.791832, 37.696041 ], [ 101.815853, 37.654357 ], [ 101.854657, 37.664781 ], [ 101.873135, 37.686569 ], [ 101.946432, 37.728235 ], [ 101.998787, 37.724921 ], [ 102.036359, 37.685149 ], [ 102.048678, 37.651515 ], [ 102.035128, 37.627819 ], [ 102.102265, 37.582304 ], [ 102.131214, 37.54625 ], [ 102.103497, 37.482641 ], [ 102.125055, 37.48549 ], [ 102.176794, 37.458892 ], [ 102.19712, 37.420403 ], [ 102.299981, 37.391404 ], [ 102.29875, 37.370004 ], [ 102.368351, 37.327662 ], [ 102.428097, 37.308624 ], [ 102.419474, 37.294343 ], [ 102.45335, 37.271487 ], [ 102.457662, 37.248147 ], [ 102.490307, 37.223371 ], [ 102.533422, 37.217176 ], [ 102.578386, 37.17284 ], [ 102.599944, 37.174748 ], [ 102.642444, 37.099845 ], [ 102.583314, 37.104618 ], [ 102.488459, 37.078362 ], [ 102.506321, 37.019134 ], [ 102.450271, 36.968467 ], [ 102.499546, 36.954599 ], [ 102.526031, 36.928291 ], [ 102.56114, 36.91968 ], [ 102.587009, 36.869904 ], [ 102.639364, 36.852666 ], [ 102.720052, 36.767858 ], [ 102.692335, 36.775528 ], [ 102.639364, 36.732853 ], [ 102.612879, 36.738129 ], [ 102.601176, 36.710307 ], [ 102.630741, 36.650793 ], [ 102.684328, 36.619097 ], [ 102.724364, 36.613813 ], [ 102.714509, 36.599401 ], [ 102.761936, 36.568645 ], [ 102.734219, 36.562396 ], [ 102.753313, 36.525855 ], [ 102.793349, 36.497957 ], [ 102.771791, 36.47438 ], [ 102.829689, 36.365544 ] ] ] ] } },\n{ \"type\": \"Feature\", \"properties\": { \"adcode\": \"640000\", \"name\": \"宁夏回族自治区\", \"center\": [ 106.278179, 38.46637 ], \"centroid\": [ 106.169867, 37.291331 ], \"childrenNum\": 5, \"level\": \"province\", \"parent\": { \"adcode\": 100000 }, \"subFeatureIndex\": 29, \"acroutes\": [ 100000 ] }, \"geometry\": { \"type\": \"MultiPolygon\", \"coordinates\": [ [ [ [ 107.268764, 37.099367 ], [ 107.234887, 37.096503 ], [ 107.181916, 37.143269 ], [ 107.133873, 37.134681 ], [ 107.095685, 37.115595 ], [ 107.030395, 37.140883 ], [ 107.031011, 37.108436 ], [ 106.998367, 37.106527 ], [ 106.905976, 37.151378 ], [ 106.912135, 37.110345 ], [ 106.891193, 37.098413 ], [ 106.818512, 37.141838 ], [ 106.776012, 37.158056 ], [ 106.772933, 37.120367 ], [ 106.750143, 37.09889 ], [ 106.728585, 37.121321 ], [ 106.687933, 37.12991 ], [ 106.673151, 37.1113 ], [ 106.6171, 37.135158 ], [ 106.605397, 37.127524 ], [ 106.645433, 37.064992 ], [ 106.666991, 37.016745 ], [ 106.646665, 37.000496 ], [ 106.64297, 36.962729 ], [ 106.594926, 36.967988 ], [ 106.595542, 36.94025 ], [ 106.540108, 36.984244 ], [ 106.549347, 36.941685 ], [ 106.601702, 36.918244 ], [ 106.609709, 36.878521 ], [ 106.609709, 36.878521 ], [ 106.626955, 36.892403 ], [ 106.637426, 36.867031 ], [ 106.637426, 36.867031 ], [ 106.657752, 36.820575 ], [ 106.627571, 36.752995 ], [ 106.644817, 36.72278 ], [ 106.59431, 36.750118 ], [ 106.514238, 36.715584 ], [ 106.519782, 36.708868 ], [ 106.519782, 36.708868 ], [ 106.530869, 36.690154 ], [ 106.490833, 36.685835 ], [ 106.491448, 36.628703 ], [ 106.444637, 36.624861 ], [ 106.465579, 36.583063 ], [ 106.444637, 36.557109 ], [ 106.397826, 36.576816 ], [ 106.392282, 36.556628 ], [ 106.363949, 36.577296 ], [ 106.37134, 36.549417 ], [ 106.39721, 36.548455 ], [ 106.455724, 36.496995 ], [ 106.494528, 36.494589 ], [ 106.523477, 36.468605 ], [ 106.492064, 36.422389 ], [ 106.510543, 36.379037 ], [ 106.497608, 36.31348 ], [ 106.470507, 36.306246 ], [ 106.504383, 36.266207 ], [ 106.54134, 36.25366 ], [ 106.559202, 36.292259 ], [ 106.647897, 36.259451 ], [ 106.685469, 36.273445 ], [ 106.698404, 36.244008 ], [ 106.735976, 36.23725 ], [ 106.772933, 36.212628 ], [ 106.808657, 36.21118 ], [ 106.833295, 36.229044 ], [ 106.858548, 36.206834 ], [ 106.858548, 36.206834 ], [ 106.873947, 36.178338 ], [ 106.873947, 36.178338 ], [ 106.930613, 36.138716 ], [ 106.925686, 36.115997 ], [ 106.957715, 36.091337 ], [ 106.940468, 36.064734 ], [ 106.928149, 36.011502 ], [ 106.94786, 35.988262 ], [ 106.90228, 35.943699 ], [ 106.93862, 35.952905 ], [ 106.940468, 35.931101 ], [ 106.912751, 35.93207 ], [ 106.849925, 35.887476 ], [ 106.927534, 35.810346 ], [ 106.897353, 35.759856 ], [ 106.868403, 35.771996 ], [ 106.867171, 35.738485 ], [ 106.819128, 35.7448 ], [ 106.806193, 35.70982 ], [ 106.750759, 35.725369 ], [ 106.750759, 35.689408 ], [ 106.674998, 35.728284 ], [ 106.66268, 35.70739 ], [ 106.633115, 35.714679 ], [ 106.620796, 35.743829 ], [ 106.595542, 35.727312 ], [ 106.566593, 35.738971 ], [ 106.506231, 35.737514 ], [ 106.49268, 35.732656 ], [ 106.434782, 35.688436 ], [ 106.460036, 35.643705 ], [ 106.47913, 35.575101 ], [ 106.460036, 35.578995 ], [ 106.440941, 35.52641 ], [ 106.465579, 35.481101 ], [ 106.490217, 35.480613 ], [ 106.483441, 35.450393 ], [ 106.503767, 35.415284 ], [ 106.501304, 35.364056 ], [ 106.472354, 35.310842 ], [ 106.415688, 35.276161 ], [ 106.368261, 35.273718 ], [ 106.363333, 35.238532 ], [ 106.319601, 35.265411 ], [ 106.241377, 35.358687 ], [ 106.237681, 35.409431 ], [ 106.196414, 35.409919 ], [ 106.173008, 35.437716 ], [ 106.129892, 35.393333 ], [ 106.113262, 35.361616 ], [ 106.083081, 35.421624 ], [ 106.073226, 35.447468 ], [ 106.071378, 35.449418 ], [ 106.073226, 35.450393 ], [ 106.073842, 35.45478 ], [ 106.06953, 35.458193 ], [ 106.071994, 35.463555 ], [ 106.078769, 35.509848 ], [ 106.047356, 35.498155 ], [ 106.023335, 35.49377 ], [ 106.017175, 35.519103 ], [ 105.900147, 35.54735 ], [ 105.868734, 35.540046 ], [ 105.847176, 35.490359 ], [ 105.816379, 35.575101 ], [ 105.800365, 35.564878 ], [ 105.762176, 35.602841 ], [ 105.759097, 35.634464 ], [ 105.713517, 35.650513 ], [ 105.722756, 35.673366 ], [ 105.690727, 35.698643 ], [ 105.723988, 35.725854 ], [ 105.740618, 35.698643 ], [ 105.759097, 35.724883 ], [ 105.70243, 35.733142 ], [ 105.667322, 35.749657 ], [ 105.595873, 35.715651 ], [ 105.481924, 35.727312 ], [ 105.457286, 35.771511 ], [ 105.432033, 35.787533 ], [ 105.428953, 35.819082 ], [ 105.408627, 35.822479 ], [ 105.38091, 35.792873 ], [ 105.371055, 35.844312 ], [ 105.39754, 35.857409 ], [ 105.350113, 35.875839 ], [ 105.324859, 35.941761 ], [ 105.343954, 36.033767 ], [ 105.406163, 36.074409 ], [ 105.430801, 36.10391 ], [ 105.491163, 36.101009 ], [ 105.515185, 36.147415 ], [ 105.478844, 36.213111 ], [ 105.460366, 36.223733 ], [ 105.45975, 36.268137 ], [ 105.476381, 36.293224 ], [ 105.455439, 36.321678 ], [ 105.425873, 36.330357 ], [ 105.401236, 36.369881 ], [ 105.398156, 36.430575 ], [ 105.363048, 36.443093 ], [ 105.362432, 36.496514 ], [ 105.322396, 36.535954 ], [ 105.281744, 36.522489 ], [ 105.252179, 36.553263 ], [ 105.2762, 36.563358 ], [ 105.261418, 36.602764 ], [ 105.22015, 36.631105 ], [ 105.225693, 36.664716 ], [ 105.201056, 36.700711 ], [ 105.218302, 36.730455 ], [ 105.272505, 36.739567 ], [ 105.275584, 36.752515 ], [ 105.319932, 36.742924 ], [ 105.340874, 36.764502 ], [ 105.334714, 36.80093 ], [ 105.303302, 36.820575 ], [ 105.279896, 36.86751 ], [ 105.244787, 36.894796 ], [ 105.178882, 36.892403 ], [ 105.185657, 36.942164 ], [ 105.165331, 36.99476 ], [ 105.128991, 36.996194 ], [ 105.05939, 37.022956 ], [ 105.03968, 37.007187 ], [ 105.004571, 37.035378 ], [ 104.95468, 37.040156 ], [ 104.954064, 37.077407 ], [ 104.914644, 37.097935 ], [ 104.888158, 37.15901 ], [ 104.864753, 37.17284 ], [ 104.85613, 37.211933 ], [ 104.776673, 37.246718 ], [ 104.717543, 37.208597 ], [ 104.638087, 37.201923 ], [ 104.600515, 37.242907 ], [ 104.624536, 37.298627 ], [ 104.651022, 37.290534 ], [ 104.673812, 37.317668 ], [ 104.713848, 37.329566 ], [ 104.662109, 37.367626 ], [ 104.679971, 37.408044 ], [ 104.521059, 37.43466 ], [ 104.499501, 37.421353 ], [ 104.448994, 37.42468 ], [ 104.437907, 37.445589 ], [ 104.365226, 37.418026 ], [ 104.298705, 37.414223 ], [ 104.287002, 37.428007 ], [ 104.322726, 37.44844 ], [ 104.407726, 37.464592 ], [ 104.419429, 37.511604 ], [ 104.433595, 37.515402 ], [ 104.623305, 37.522522 ], [ 104.805007, 37.539133 ], [ 104.866601, 37.566651 ], [ 105.027977, 37.580881 ], [ 105.111128, 37.633981 ], [ 105.187505, 37.657674 ], [ 105.221998, 37.677097 ], [ 105.315004, 37.702197 ], [ 105.4037, 37.710246 ], [ 105.467141, 37.695094 ], [ 105.598952, 37.699356 ], [ 105.616199, 37.722555 ], [ 105.622358, 37.777919 ], [ 105.677177, 37.771769 ], [ 105.760944, 37.799674 ], [ 105.80406, 37.862068 ], [ 105.799749, 37.939986 ], [ 105.840401, 38.004147 ], [ 105.780655, 38.084741 ], [ 105.76772, 38.121474 ], [ 105.775111, 38.186887 ], [ 105.802828, 38.220277 ], [ 105.842248, 38.240962 ], [ 105.86627, 38.296406 ], [ 105.821307, 38.366824 ], [ 105.835473, 38.387467 ], [ 105.827466, 38.432486 ], [ 105.850872, 38.443736 ], [ 105.836705, 38.476071 ], [ 105.863806, 38.53508 ], [ 105.856415, 38.569714 ], [ 105.874277, 38.593105 ], [ 105.852719, 38.641735 ], [ 105.894603, 38.696405 ], [ 105.88598, 38.716953 ], [ 105.908154, 38.737496 ], [ 105.909386, 38.791159 ], [ 105.992538, 38.857366 ], [ 105.97098, 38.909077 ], [ 106.021487, 38.953769 ], [ 106.060907, 38.96866 ], [ 106.087392, 39.006339 ], [ 106.078153, 39.026333 ], [ 106.096631, 39.084889 ], [ 106.145907, 39.153142 ], [ 106.170544, 39.163352 ], [ 106.192718, 39.142932 ], [ 106.251232, 39.131327 ], [ 106.285109, 39.146181 ], [ 106.29558, 39.167992 ], [ 106.280181, 39.262118 ], [ 106.402753, 39.291767 ], [ 106.511774, 39.272311 ], [ 106.525325, 39.308439 ], [ 106.556122, 39.322329 ], [ 106.602318, 39.37555 ], [ 106.643586, 39.357969 ], [ 106.683622, 39.357506 ], [ 106.751375, 39.381564 ], [ 106.781556, 39.371849 ], [ 106.806809, 39.318625 ], [ 106.806193, 39.277407 ], [ 106.790795, 39.241263 ], [ 106.795723, 39.214375 ], [ 106.825288, 39.19397 ], [ 106.859164, 39.107648 ], [ 106.878874, 39.091392 ], [ 106.933693, 39.076527 ], [ 106.96757, 39.054688 ], [ 106.971881, 39.026333 ], [ 106.954019, 38.941202 ], [ 106.837606, 38.847579 ], [ 106.756302, 38.748699 ], [ 106.709491, 38.718821 ], [ 106.66268, 38.601524 ], [ 106.647897, 38.470917 ], [ 106.599854, 38.389812 ], [ 106.482209, 38.319417 ], [ 106.555506, 38.263521 ], [ 106.627571, 38.232501 ], [ 106.654672, 38.22921 ], [ 106.737824, 38.197706 ], [ 106.779092, 38.171833 ], [ 106.858548, 38.156306 ], [ 106.942316, 38.132302 ], [ 107.010069, 38.120532 ], [ 107.051337, 38.122886 ], [ 107.071047, 38.138892 ], [ 107.119091, 38.134185 ], [ 107.138801, 38.161011 ], [ 107.19054, 38.153953 ], [ 107.240431, 38.111586 ], [ 107.33159, 38.086625 ], [ 107.3938, 38.014993 ], [ 107.440611, 37.995659 ], [ 107.411662, 37.948009 ], [ 107.448618, 37.933378 ], [ 107.49235, 37.944706 ], [ 107.560719, 37.893717 ], [ 107.65003, 37.86443 ], [ 107.659269, 37.844112 ], [ 107.646335, 37.805349 ], [ 107.620465, 37.776026 ], [ 107.599523, 37.791162 ], [ 107.57119, 37.776499 ], [ 107.499125, 37.765619 ], [ 107.484959, 37.706458 ], [ 107.425828, 37.684201 ], [ 107.387024, 37.691305 ], [ 107.389488, 37.671413 ], [ 107.422133, 37.665254 ], [ 107.361155, 37.613125 ], [ 107.311264, 37.609806 ], [ 107.330358, 37.584201 ], [ 107.369162, 37.58752 ], [ 107.345756, 37.518725 ], [ 107.284162, 37.481691 ], [ 107.282931, 37.437036 ], [ 107.257677, 37.337179 ], [ 107.273075, 37.29101 ], [ 107.309416, 37.239095 ], [ 107.270612, 37.229089 ], [ 107.317423, 37.200017 ], [ 107.336517, 37.165687 ], [ 107.334669, 37.138975 ], [ 107.306952, 37.100799 ], [ 107.281083, 37.127047 ], [ 107.268764, 37.099367 ] ] ], [ [ [ 106.048588, 35.488898 ], [ 106.054132, 35.45478 ], [ 106.034422, 35.469404 ], [ 106.002393, 35.438692 ], [ 105.894603, 35.413821 ], [ 105.897683, 35.451368 ], [ 106.048588, 35.488898 ] ] ], [ [ [ 106.073842, 35.45478 ], [ 106.073226, 35.450393 ], [ 106.071378, 35.449418 ], [ 106.06953, 35.458193 ], [ 106.073842, 35.45478 ] ] ] ] } },\n{ \"type\": \"Feature\", \"properties\": { \"adcode\": \"650000\", \"name\": \"新疆维吾尔自治区\", \"center\": [ 87.617733, 43.792818 ], \"centroid\": [ 85.294711, 41.371801 ], \"childrenNum\": 24, \"level\": \"province\", \"parent\": { \"adcode\": 100000 }, \"subFeatureIndex\": 30, \"acroutes\": [ 100000 ] }, \"geometry\": { \"type\": \"MultiPolygon\", \"coordinates\": [ [ [ [ 96.386348, 42.727592 ], [ 96.166458, 42.623314 ], [ 96.103632, 42.604375 ], [ 96.072219, 42.569566 ], [ 96.02356, 42.542675 ], [ 96.0174, 42.482239 ], [ 95.978596, 42.436762 ], [ 96.06606, 42.414674 ], [ 96.042038, 42.352787 ], [ 96.040806, 42.326688 ], [ 96.178161, 42.21775 ], [ 96.077147, 42.149457 ], [ 96.13874, 42.05399 ], [ 96.137509, 42.019765 ], [ 96.117183, 41.985966 ], [ 96.054973, 41.936124 ], [ 95.998306, 41.906289 ], [ 95.855408, 41.849699 ], [ 95.801206, 41.848361 ], [ 95.759322, 41.835878 ], [ 95.65646, 41.826067 ], [ 95.57146, 41.796181 ], [ 95.445193, 41.719841 ], [ 95.39407, 41.693481 ], [ 95.335556, 41.644305 ], [ 95.299831, 41.565994 ], [ 95.247476, 41.61344 ], [ 95.194505, 41.694821 ], [ 95.199433, 41.719395 ], [ 95.16494, 41.735474 ], [ 95.135991, 41.772976 ], [ 95.110738, 41.768513 ], [ 95.011572, 41.726541 ], [ 94.969072, 41.718948 ], [ 94.861898, 41.668451 ], [ 94.809543, 41.619256 ], [ 94.750413, 41.538227 ], [ 94.534219, 41.505966 ], [ 94.184365, 41.268444 ], [ 94.01067, 41.114875 ], [ 93.908424, 40.983539 ], [ 93.809874, 40.879548 ], [ 93.820961, 40.793519 ], [ 93.760599, 40.664721 ], [ 93.506216, 40.648376 ], [ 92.928465, 40.572504 ], [ 92.920458, 40.391792 ], [ 92.906907, 40.310609 ], [ 92.796654, 40.153897 ], [ 92.745531, 39.868331 ], [ 92.687632, 39.657174 ], [ 92.639589, 39.514196 ], [ 92.52564, 39.368611 ], [ 92.378431, 39.258411 ], [ 92.339011, 39.236628 ], [ 92.343938, 39.146181 ], [ 92.366112, 39.096037 ], [ 92.366728, 39.059335 ], [ 92.41046, 39.03842 ], [ 92.416003, 39.010524 ], [ 92.380279, 38.999828 ], [ 92.263866, 39.002153 ], [ 92.197961, 38.983548 ], [ 92.173323, 38.960749 ], [ 92.10865, 38.963541 ], [ 91.966368, 38.930961 ], [ 91.880752, 38.899297 ], [ 91.87952, 38.884391 ], [ 91.806223, 38.872744 ], [ 91.694738, 38.86622 ], [ 91.681188, 38.852706 ], [ 91.501333, 38.815411 ], [ 91.446515, 38.813546 ], [ 91.298689, 38.746365 ], [ 91.242639, 38.752433 ], [ 91.188436, 38.73096 ], [ 90.992567, 38.695003 ], [ 90.970394, 38.697806 ], [ 90.899561, 38.679588 ], [ 90.724634, 38.658094 ], [ 90.65996, 38.674449 ], [ 90.619308, 38.664636 ], [ 90.645794, 38.635191 ], [ 90.606374, 38.610878 ], [ 90.608837, 38.594508 ], [ 90.560794, 38.593573 ], [ 90.525685, 38.561291 ], [ 90.463476, 38.556611 ], [ 90.465323, 38.521971 ], [ 90.427135, 38.493873 ], [ 90.353222, 38.482162 ], [ 90.315034, 38.501835 ], [ 90.248513, 38.491531 ], [ 90.130868, 38.494341 ], [ 90.111774, 38.477945 ], [ 90.111774, 38.418889 ], [ 90.129636, 38.400131 ], [ 90.179528, 38.396848 ], [ 90.137644, 38.340543 ], [ 90.280542, 38.238142 ], [ 90.352607, 38.233441 ], [ 90.361846, 38.300163 ], [ 90.401882, 38.311434 ], [ 90.531229, 38.319886 ], [ 90.516446, 38.207111 ], [ 90.519526, 37.730601 ], [ 90.579272, 37.720661 ], [ 90.586663, 37.703144 ], [ 90.643946, 37.696988 ], [ 90.777605, 37.648672 ], [ 90.820104, 37.613599 ], [ 90.854597, 37.604117 ], [ 90.882314, 37.575664 ], [ 90.865684, 37.53059 ], [ 90.911879, 37.519674 ], [ 90.958075, 37.477891 ], [ 91.019669, 37.493088 ], [ 91.073256, 37.475992 ], [ 91.099741, 37.447965 ], [ 91.113292, 37.387124 ], [ 91.136081, 37.355734 ], [ 91.134849, 37.324331 ], [ 91.194596, 37.273868 ], [ 91.1909, 37.205737 ], [ 91.280211, 37.163779 ], [ 91.286371, 37.105095 ], [ 91.303617, 37.083136 ], [ 91.291298, 37.042544 ], [ 91.303617, 37.012444 ], [ 91.216153, 37.010054 ], [ 91.181045, 37.025345 ], [ 91.133618, 37.007665 ], [ 91.126842, 36.978507 ], [ 91.051698, 36.96751 ], [ 91.036915, 36.929727 ], [ 90.983944, 36.913459 ], [ 90.924198, 36.921115 ], [ 90.853981, 36.915373 ], [ 90.758511, 36.825844 ], [ 90.732025, 36.825844 ], [ 90.727098, 36.755872 ], [ 90.754815, 36.721341 ], [ 90.720938, 36.708868 ], [ 90.706156, 36.658955 ], [ 90.730793, 36.655594 ], [ 90.72217, 36.620058 ], [ 90.741264, 36.585947 ], [ 90.810865, 36.585466 ], [ 90.831191, 36.55807 ], [ 90.905104, 36.560474 ], [ 91.011662, 36.539801 ], [ 91.035683, 36.529703 ], [ 91.039995, 36.474861 ], [ 91.028292, 36.443093 ], [ 91.051698, 36.433946 ], [ 91.026444, 36.323607 ], [ 91.07264, 36.299012 ], [ 91.051698, 36.238215 ], [ 91.096045, 36.219871 ], [ 91.09235, 36.163844 ], [ 91.124994, 36.115514 ], [ 91.081263, 36.088436 ], [ 90.979017, 36.106811 ], [ 90.922966, 36.028927 ], [ 90.850285, 36.016827 ], [ 90.815793, 36.035703 ], [ 90.776373, 36.086501 ], [ 90.659344, 36.13485 ], [ 90.613149, 36.126632 ], [ 90.534925, 36.147899 ], [ 90.478258, 36.13195 ], [ 90.424055, 36.133883 ], [ 90.325505, 36.159496 ], [ 90.23681, 36.160462 ], [ 90.198006, 36.187516 ], [ 90.130252, 36.2078 ], [ 90.145651, 36.239181 ], [ 90.058188, 36.255591 ], [ 90.043405, 36.276822 ], [ 90.003369, 36.278752 ], [ 90.028006, 36.258486 ], [ 90.019999, 36.213594 ], [ 89.997825, 36.168193 ], [ 89.944855, 36.140649 ], [ 89.941159, 36.067637 ], [ 89.914058, 36.079246 ], [ 89.819819, 36.080697 ], [ 89.766848, 36.073925 ], [ 89.711414, 36.093272 ], [ 89.614711, 36.109712 ], [ 89.594385, 36.126632 ], [ 89.490291, 36.151281 ], [ 89.375727, 36.228078 ], [ 89.335075, 36.23725 ], [ 89.292575, 36.231457 ], [ 89.232213, 36.295636 ], [ 89.198952, 36.260417 ], [ 89.126887, 36.254626 ], [ 89.10225, 36.281164 ], [ 89.054822, 36.291777 ], [ 89.013554, 36.315409 ], [ 88.964279, 36.318785 ], [ 88.926091, 36.36458 ], [ 88.870657, 36.348193 ], [ 88.838628, 36.353496 ], [ 88.802903, 36.33807 ], [ 88.783809, 36.291777 ], [ 88.766563, 36.292259 ], [ 88.690186, 36.367954 ], [ 88.623665, 36.389636 ], [ 88.618121, 36.428168 ], [ 88.573158, 36.461386 ], [ 88.498629, 36.446463 ], [ 88.470912, 36.48208 ], [ 88.41055, 36.473418 ], [ 88.356963, 36.477268 ], [ 88.366202, 36.458016 ], [ 88.282434, 36.470049 ], [ 88.241782, 36.468605 ], [ 88.222688, 36.447426 ], [ 88.182652, 36.452721 ], [ 88.134609, 36.427205 ], [ 88.092109, 36.43539 ], [ 88.006494, 36.430575 ], [ 87.983088, 36.437797 ], [ 87.95845, 36.408423 ], [ 87.919646, 36.39349 ], [ 87.838342, 36.383855 ], [ 87.826023, 36.391563 ], [ 87.767509, 36.3747 ], [ 87.731785, 36.384818 ], [ 87.6203, 36.360243 ], [ 87.570409, 36.342409 ], [ 87.470626, 36.354459 ], [ 87.460155, 36.409868 ], [ 87.426895, 36.42576 ], [ 87.386859, 36.412757 ], [ 87.363453, 36.420463 ], [ 87.348055, 36.393008 ], [ 87.292004, 36.358797 ], [ 87.193454, 36.349158 ], [ 87.161425, 36.325535 ], [ 87.149106, 36.297565 ], [ 87.08628, 36.310587 ], [ 87.051788, 36.2966 ], [ 86.996353, 36.308658 ], [ 86.943998, 36.284058 ], [ 86.931064, 36.265242 ], [ 86.887332, 36.262829 ], [ 86.86331, 36.299977 ], [ 86.836209, 36.291294 ], [ 86.746282, 36.291777 ], [ 86.69947, 36.24449 ], [ 86.599072, 36.222285 ], [ 86.531935, 36.227113 ], [ 86.515305, 36.205385 ], [ 86.454943, 36.221319 ], [ 86.392733, 36.206834 ], [ 86.35824, 36.168676 ], [ 86.2794, 36.170608 ], [ 86.248603, 36.141616 ], [ 86.187625, 36.130983 ], [ 86.182081, 36.064734 ], [ 86.199944, 36.047801 ], [ 86.173458, 36.008113 ], [ 86.150668, 36.00424 ], [ 86.129111, 35.941761 ], [ 86.093386, 35.906868 ], [ 86.090306, 35.876809 ], [ 86.05335, 35.842857 ], [ 86.035488, 35.846738 ], [ 85.949256, 35.778794 ], [ 85.903677, 35.78462 ], [ 85.835308, 35.771996 ], [ 85.811286, 35.778794 ], [ 85.691178, 35.751114 ], [ 85.65299, 35.731199 ], [ 85.612953, 35.651486 ], [ 85.566142, 35.6403 ], [ 85.518715, 35.680658 ], [ 85.373969, 35.700101 ], [ 85.341324, 35.753543 ], [ 85.271107, 35.788989 ], [ 85.146071, 35.742371 ], [ 85.053065, 35.752086 ], [ 84.99455, 35.737028 ], [ 84.973608, 35.709334 ], [ 84.920022, 35.696213 ], [ 84.798066, 35.647595 ], [ 84.729081, 35.613546 ], [ 84.704443, 35.616951 ], [ 84.628067, 35.595055 ], [ 84.570168, 35.588242 ], [ 84.513502, 35.564391 ], [ 84.448828, 35.550272 ], [ 84.475929, 35.516181 ], [ 84.45314, 35.473303 ], [ 84.424191, 35.466479 ], [ 84.333032, 35.413821 ], [ 84.274517, 35.404065 ], [ 84.200605, 35.381135 ], [ 84.160569, 35.359663 ], [ 84.140859, 35.379184 ], [ 84.095895, 35.362592 ], [ 84.077417, 35.400163 ], [ 84.005968, 35.422599 ], [ 83.906186, 35.40309 ], [ 83.885244, 35.367472 ], [ 83.79778, 35.354783 ], [ 83.785462, 35.36308 ], [ 83.677672, 35.361128 ], [ 83.622238, 35.335256 ], [ 83.599448, 35.351366 ], [ 83.54155, 35.341603 ], [ 83.540318, 35.364056 ], [ 83.502745, 35.360639 ], [ 83.449159, 35.382111 ], [ 83.405427, 35.380648 ], [ 83.333978, 35.397236 ], [ 83.280391, 35.401138 ], [ 83.251442, 35.417722 ], [ 83.178145, 35.38943 ], [ 83.127022, 35.398699 ], [ 83.088834, 35.425526 ], [ 83.067892, 35.46258 ], [ 82.998907, 35.484512 ], [ 82.971806, 35.548324 ], [ 82.981661, 35.599922 ], [ 82.956407, 35.636409 ], [ 82.967494, 35.667532 ], [ 82.894813, 35.673852 ], [ 82.873871, 35.688922 ], [ 82.795031, 35.688436 ], [ 82.780249, 35.666073 ], [ 82.731589, 35.637868 ], [ 82.652133, 35.67288 ], [ 82.628727, 35.692324 ], [ 82.546192, 35.708362 ], [ 82.501844, 35.701073 ], [ 82.468583, 35.717595 ], [ 82.424852, 35.712736 ], [ 82.392823, 35.656349 ], [ 82.336156, 35.651486 ], [ 82.350323, 35.611113 ], [ 82.328149, 35.559523 ], [ 82.2992, 35.544916 ], [ 82.263475, 35.547837 ], [ 82.234526, 35.520565 ], [ 82.189563, 35.513258 ], [ 82.164925, 35.495719 ], [ 82.086701, 35.467454 ], [ 82.071302, 35.450393 ], [ 82.034346, 35.451855 ], [ 82.029419, 35.426013 ], [ 82.05344, 35.35039 ], [ 82.030034, 35.321585 ], [ 81.99123, 35.30547 ], [ 81.955506, 35.307423 ], [ 81.927789, 35.271275 ], [ 81.853876, 35.25857 ], [ 81.804601, 35.270786 ], [ 81.736847, 35.26248 ], [ 81.68634, 35.235599 ], [ 81.513261, 35.23511 ], [ 81.504638, 35.279092 ], [ 81.447972, 35.318167 ], [ 81.441196, 35.333303 ], [ 81.385762, 35.335256 ], [ 81.363588, 35.354783 ], [ 81.314313, 35.337209 ], [ 81.285364, 35.345508 ], [ 81.26627, 35.322562 ], [ 81.219458, 35.319144 ], [ 81.191741, 35.36552 ], [ 81.142466, 35.365032 ], [ 81.103662, 35.386015 ], [ 81.09935, 35.40748 ], [ 81.054387, 35.402602 ], [ 81.031597, 35.380648 ], [ 81.030981, 35.337209 ], [ 81.002648, 35.334768 ], [ 81.026053, 35.31133 ], [ 80.963844, 35.310842 ], [ 80.924423, 35.330862 ], [ 80.894242, 35.324027 ], [ 80.844351, 35.345508 ], [ 80.759968, 35.334768 ], [ 80.689135, 35.339162 ], [ 80.690982, 35.364544 ], [ 80.65649, 35.393821 ], [ 80.599823, 35.409431 ], [ 80.56841, 35.391381 ], [ 80.532686, 35.404553 ], [ 80.514824, 35.391869 ], [ 80.444607, 35.417235 ], [ 80.432904, 35.449418 ], [ 80.375006, 35.387966 ], [ 80.321419, 35.38699 ], [ 80.286926, 35.35283 ], [ 80.267832, 35.295701 ], [ 80.362687, 35.20871 ], [ 80.257977, 35.203331 ], [ 80.223484, 35.177409 ], [ 80.23026, 35.147565 ], [ 80.118159, 35.066293 ], [ 80.078123, 35.076578 ], [ 80.031311, 35.034447 ], [ 80.04363, 35.022196 ], [ 80.02392, 34.971209 ], [ 80.041782, 34.943252 ], [ 80.034391, 34.902033 ], [ 80.003594, 34.895162 ], [ 79.996819, 34.856375 ], [ 79.961094, 34.862759 ], [ 79.926602, 34.849499 ], [ 79.947544, 34.821008 ], [ 79.898268, 34.732035 ], [ 79.906892, 34.683821 ], [ 79.866856, 34.671517 ], [ 79.88595, 34.642965 ], [ 79.84345, 34.55725 ], [ 79.861312, 34.528166 ], [ 79.801566, 34.478847 ], [ 79.735661, 34.471447 ], [ 79.699936, 34.477861 ], [ 79.675914, 34.451216 ], [ 79.58106, 34.456151 ], [ 79.545335, 34.476381 ], [ 79.504683, 34.45467 ], [ 79.435082, 34.447761 ], [ 79.363017, 34.428018 ], [ 79.326677, 34.44332 ], [ 79.274322, 34.435916 ], [ 79.241677, 34.415183 ], [ 79.179467, 34.422588 ], [ 79.161605, 34.441345 ], [ 79.072294, 34.412714 ], [ 79.039033, 34.421601 ], [ 79.0107, 34.399877 ], [ 79.048888, 34.348506 ], [ 79.039649, 34.33467 ], [ 78.973128, 34.362833 ], [ 78.958961, 34.386049 ], [ 78.899831, 34.354929 ], [ 78.878273, 34.391481 ], [ 78.809288, 34.432955 ], [ 78.742766, 34.45467 ], [ 78.758781, 34.481807 ], [ 78.715049, 34.502031 ], [ 78.708274, 34.522249 ], [ 78.634977, 34.538026 ], [ 78.58139, 34.505483 ], [ 78.562912, 34.51288 ], [ 78.559832, 34.55725 ], [ 78.542586, 34.574499 ], [ 78.492695, 34.578441 ], [ 78.436029, 34.543942 ], [ 78.427405, 34.594207 ], [ 78.397224, 34.605538 ], [ 78.346101, 34.60406 ], [ 78.280812, 34.623269 ], [ 78.265413, 34.651335 ], [ 78.267261, 34.705472 ], [ 78.213059, 34.717771 ], [ 78.21429, 34.760556 ], [ 78.230921, 34.776288 ], [ 78.237696, 34.882398 ], [ 78.206283, 34.891726 ], [ 78.182262, 34.936874 ], [ 78.201972, 34.974642 ], [ 78.160704, 34.990823 ], [ 78.123131, 35.036897 ], [ 78.150849, 35.069721 ], [ 78.124979, 35.108407 ], [ 78.078784, 35.100084 ], [ 78.062769, 35.114772 ], [ 78.060306, 35.180344 ], [ 78.01719, 35.228267 ], [ 78.020885, 35.315237 ], [ 78.013494, 35.366008 ], [ 78.046755, 35.384063 ], [ 78.107117, 35.437229 ], [ 78.113892, 35.466967 ], [ 78.140378, 35.494745 ], [ 78.048603, 35.491334 ], [ 78.029509, 35.469404 ], [ 78.009799, 35.491821 ], [ 77.951284, 35.478664 ], [ 77.917408, 35.490847 ], [ 77.914944, 35.465017 ], [ 77.870596, 35.495232 ], [ 77.85643, 35.487436 ], [ 77.816394, 35.518616 ], [ 77.797299, 35.491334 ], [ 77.757879, 35.497181 ], [ 77.735706, 35.461605 ], [ 77.690742, 35.448443 ], [ 77.657481, 35.477689 ], [ 77.639619, 35.45478 ], [ 77.590344, 35.460143 ], [ 77.578025, 35.47574 ], [ 77.518895, 35.482075 ], [ 77.451758, 35.46063 ], [ 77.396939, 35.467942 ], [ 77.355055, 35.494257 ], [ 77.331649, 35.530793 ], [ 77.307628, 35.540533 ], [ 77.195527, 35.519103 ], [ 77.093281, 35.569746 ], [ 77.072339, 35.591162 ], [ 76.99781, 35.611113 ], [ 76.967013, 35.591649 ], [ 76.906651, 35.615005 ], [ 76.848753, 35.668018 ], [ 76.769297, 35.653917 ], [ 76.69292, 35.747714 ], [ 76.593754, 35.771996 ], [ 76.566037, 35.819082 ], [ 76.587595, 35.840431 ], [ 76.579587, 35.866625 ], [ 76.59745, 35.895718 ], [ 76.55803, 35.923347 ], [ 76.51553, 35.881173 ], [ 76.471798, 35.886021 ], [ 76.431762, 35.851589 ], [ 76.369552, 35.86323 ], [ 76.365857, 35.82442 ], [ 76.298719, 35.841401 ], [ 76.228502, 35.837035 ], [ 76.221727, 35.823449 ], [ 76.160133, 35.82442 ], [ 76.146582, 35.839946 ], [ 76.16506, 35.908807 ], [ 76.117017, 35.975186 ], [ 76.097307, 36.022635 ], [ 76.044336, 36.026991 ], [ 76.028322, 36.016827 ], [ 75.982742, 36.031347 ], [ 75.949482, 36.070056 ], [ 75.936547, 36.13485 ], [ 75.96796, 36.159013 ], [ 76.016619, 36.165294 ], [ 76.011691, 36.229044 ], [ 76.060967, 36.225182 ], [ 76.055423, 36.252695 ], [ 75.998757, 36.312034 ], [ 75.991365, 36.35205 ], [ 76.035097, 36.409386 ], [ 75.991981, 36.505654 ], [ 75.924228, 36.566242 ], [ 75.947018, 36.590752 ], [ 75.871257, 36.666636 ], [ 75.8072, 36.707908 ], [ 75.724048, 36.750597 ], [ 75.634121, 36.771693 ], [ 75.588541, 36.762584 ], [ 75.537418, 36.773131 ], [ 75.536802, 36.729975 ], [ 75.504773, 36.743404 ], [ 75.458578, 36.720861 ], [ 75.425933, 36.778883 ], [ 75.434556, 36.83303 ], [ 75.430245, 36.873255 ], [ 75.396368, 36.904367 ], [ 75.413614, 36.954599 ], [ 75.345861, 36.960816 ], [ 75.288579, 36.974682 ], [ 75.244847, 36.963207 ], [ 75.16847, 36.991892 ], [ 75.172166, 37.013877 ], [ 75.063145, 37.006231 ], [ 75.032348, 37.016745 ], [ 75.005862, 36.99476 ], [ 74.927638, 36.978029 ], [ 74.938725, 36.94312 ], [ 74.893762, 36.939772 ], [ 74.86974, 36.990458 ], [ 74.84387, 37.0134 ], [ 74.84695, 37.056873 ], [ 74.806914, 37.054485 ], [ 74.792747, 37.027257 ], [ 74.739161, 37.028212 ], [ 74.70898, 37.084569 ], [ 74.632603, 37.066425 ], [ 74.617205, 37.043499 ], [ 74.56793, 37.032512 ], [ 74.530357, 37.082182 ], [ 74.498944, 37.072155 ], [ 74.496481, 37.116072 ], [ 74.465068, 37.147085 ], [ 74.487858, 37.161871 ], [ 74.477387, 37.19954 ], [ 74.511263, 37.240048 ], [ 74.54514, 37.2491 ], [ 74.578401, 37.231472 ], [ 74.598727, 37.258151 ], [ 74.642458, 37.261485 ], [ 74.665864, 37.23576 ], [ 74.727458, 37.282916 ], [ 74.753943, 37.281011 ], [ 74.800139, 37.248147 ], [ 74.816153, 37.216699 ], [ 74.911008, 37.233378 ], [ 74.927022, 37.277678 ], [ 75.018181, 37.293867 ], [ 75.078543, 37.318144 ], [ 75.125971, 37.322427 ], [ 75.140137, 37.355258 ], [ 75.125971, 37.388075 ], [ 75.153072, 37.414223 ], [ 75.129666, 37.459367 ], [ 75.090862, 37.486915 ], [ 75.078543, 37.511129 ], [ 75.035428, 37.500685 ], [ 75.002167, 37.511604 ], [ 75.000935, 37.53059 ], [ 74.940573, 37.559061 ], [ 74.891914, 37.668097 ], [ 74.920863, 37.684675 ], [ 74.923327, 37.717347 ], [ 74.949196, 37.725395 ], [ 75.006478, 37.770823 ], [ 74.989848, 37.797783 ], [ 74.917167, 37.845057 ], [ 74.936877, 37.876241 ], [ 74.919015, 37.908357 ], [ 74.911008, 37.966884 ], [ 74.92579, 38.01735 ], [ 74.879595, 38.021122 ], [ 74.821697, 38.10311 ], [ 74.80445, 38.167128 ], [ 74.816769, 38.215576 ], [ 74.793363, 38.271039 ], [ 74.806914, 38.285602 ], [ 74.789668, 38.324581 ], [ 74.834015, 38.361193 ], [ 74.868508, 38.403883 ], [ 74.862965, 38.484035 ], [ 74.821697, 38.491062 ], [ 74.78474, 38.538357 ], [ 74.717603, 38.542102 ], [ 74.639995, 38.599653 ], [ 74.613509, 38.593105 ], [ 74.546988, 38.607604 ], [ 74.506336, 38.637528 ], [ 74.455829, 38.632853 ], [ 74.421952, 38.647812 ], [ 74.353583, 38.655757 ], [ 74.229779, 38.656224 ], [ 74.147859, 38.676785 ], [ 74.11275, 38.611345 ], [ 74.088113, 38.610878 ], [ 74.068403, 38.585621 ], [ 74.090577, 38.542102 ], [ 74.034526, 38.541634 ], [ 74.011736, 38.52478 ], [ 73.926121, 38.536016 ], [ 73.89902, 38.579071 ], [ 73.852208, 38.584217 ], [ 73.799237, 38.610878 ], [ 73.809092, 38.634256 ], [ 73.757353, 38.719755 ], [ 73.769056, 38.775765 ], [ 73.729636, 38.837324 ], [ 73.699455, 38.857832 ], [ 73.70931, 38.893241 ], [ 73.742571, 38.933754 ], [ 73.767824, 38.941202 ], [ 73.826339, 38.916993 ], [ 73.846665, 38.962145 ], [ 73.839889, 39.008199 ], [ 73.820179, 39.041674 ], [ 73.780143, 39.026798 ], [ 73.743187, 39.029588 ], [ 73.720397, 39.071881 ], [ 73.719781, 39.108112 ], [ 73.688368, 39.154999 ], [ 73.657571, 39.166136 ], [ 73.639709, 39.220402 ], [ 73.623079, 39.235237 ], [ 73.580579, 39.237555 ], [ 73.564564, 39.266288 ], [ 73.542391, 39.269531 ], [ 73.554709, 39.295935 ], [ 73.554094, 39.350102 ], [ 73.502355, 39.383877 ], [ 73.592898, 39.412087 ], [ 73.61076, 39.465702 ], [ 73.6471, 39.474479 ], [ 73.745651, 39.462005 ], [ 73.836194, 39.472169 ], [ 73.868223, 39.482794 ], [ 73.893476, 39.528046 ], [ 73.883621, 39.540969 ], [ 73.914418, 39.564041 ], [ 73.916266, 39.586644 ], [ 73.953838, 39.600018 ], [ 73.924273, 39.722108 ], [ 73.905795, 39.741899 ], [ 73.841737, 39.756163 ], [ 73.845433, 39.831115 ], [ 73.907027, 39.873843 ], [ 73.910722, 39.934443 ], [ 73.980324, 40.004617 ], [ 73.943367, 40.016076 ], [ 74.008041, 40.050901 ], [ 74.023439, 40.085251 ], [ 74.113366, 40.086624 ], [ 74.126301, 40.104479 ], [ 74.26304, 40.125074 ], [ 74.280902, 40.09807 ], [ 74.316626, 40.106767 ], [ 74.356662, 40.089371 ], [ 74.433039, 40.13148 ], [ 74.485394, 40.182251 ], [ 74.534669, 40.207851 ], [ 74.577169, 40.260391 ], [ 74.618437, 40.27957 ], [ 74.673255, 40.278656 ], [ 74.697893, 40.310153 ], [ 74.700357, 40.346195 ], [ 74.824776, 40.344371 ], [ 74.862965, 40.32658 ], [ 74.908544, 40.338897 ], [ 74.795211, 40.443278 ], [ 74.814921, 40.461039 ], [ 74.819233, 40.505647 ], [ 74.844486, 40.521117 ], [ 74.891914, 40.507467 ], [ 74.963363, 40.464681 ], [ 74.995392, 40.455119 ], [ 75.021877, 40.466958 ], [ 75.051442, 40.449654 ], [ 75.102565, 40.44009 ], [ 75.13521, 40.463315 ], [ 75.206659, 40.447833 ], [ 75.242383, 40.448743 ], [ 75.268869, 40.483802 ], [ 75.292274, 40.483802 ], [ 75.355716, 40.537947 ], [ 75.432093, 40.563412 ], [ 75.467817, 40.599773 ], [ 75.550353, 40.64883 ], [ 75.599628, 40.659727 ], [ 75.636584, 40.624306 ], [ 75.627345, 40.605226 ], [ 75.631041, 40.548862 ], [ 75.646439, 40.516567 ], [ 75.733287, 40.474242 ], [ 75.717272, 40.443278 ], [ 75.686475, 40.418223 ], [ 75.669845, 40.363982 ], [ 75.688323, 40.343915 ], [ 75.709265, 40.280939 ], [ 75.739446, 40.299199 ], [ 75.785642, 40.301025 ], [ 75.831221, 40.327492 ], [ 75.84046, 40.312434 ], [ 75.890351, 40.30924 ], [ 75.921764, 40.291439 ], [ 75.932235, 40.339353 ], [ 75.986438, 40.381763 ], [ 76.026474, 40.355317 ], [ 76.048648, 40.357141 ], [ 76.048648, 40.388601 ], [ 76.081293, 40.39635 ], [ 76.144118, 40.393615 ], [ 76.176147, 40.381307 ], [ 76.22419, 40.401819 ], [ 76.279625, 40.439179 ], [ 76.283321, 40.415034 ], [ 76.327668, 40.391336 ], [ 76.333212, 40.343459 ], [ 76.381871, 40.39088 ], [ 76.390494, 40.37766 ], [ 76.442233, 40.391336 ], [ 76.470566, 40.422779 ], [ 76.508754, 40.429613 ], [ 76.539551, 40.464226 ], [ 76.543247, 40.513837 ], [ 76.556798, 40.542495 ], [ 76.601145, 40.578868 ], [ 76.611, 40.601591 ], [ 76.657196, 40.620218 ], [ 76.654732, 40.652917 ], [ 76.676906, 40.696036 ], [ 76.646725, 40.73686 ], [ 76.646725, 40.759983 ], [ 76.693536, 40.779472 ], [ 76.731724, 40.818887 ], [ 76.741579, 40.912119 ], [ 76.761905, 40.954167 ], [ 76.817956, 40.975406 ], [ 76.85368, 40.97631 ], [ 76.885709, 41.027347 ], [ 76.940528, 41.028701 ], [ 77.002122, 41.073381 ], [ 77.023064, 41.059394 ], [ 77.091433, 41.062553 ], [ 77.108063, 41.038181 ], [ 77.169041, 41.009285 ], [ 77.236795, 41.027798 ], [ 77.296541, 41.004769 ], [ 77.363062, 41.04089 ], [ 77.415417, 41.038633 ], [ 77.473931, 41.022832 ], [ 77.476395, 40.999349 ], [ 77.540453, 41.006575 ], [ 77.591576, 40.992122 ], [ 77.597119, 41.005221 ], [ 77.654402, 41.016059 ], [ 77.684583, 41.00793 ], [ 77.737553, 41.032313 ], [ 77.780669, 41.022832 ], [ 77.796068, 41.049014 ], [ 77.829328, 41.059394 ], [ 77.807155, 41.091876 ], [ 77.814546, 41.13426 ], [ 77.836104, 41.153189 ], [ 77.905089, 41.185174 ], [ 77.972842, 41.173013 ], [ 78.094798, 41.224347 ], [ 78.129291, 41.228398 ], [ 78.136682, 41.279239 ], [ 78.165015, 41.340825 ], [ 78.149617, 41.368228 ], [ 78.163783, 41.383497 ], [ 78.235232, 41.399211 ], [ 78.324544, 41.384395 ], [ 78.338094, 41.397415 ], [ 78.385522, 41.394721 ], [ 78.391681, 41.408189 ], [ 78.454507, 41.412228 ], [ 78.527188, 41.440947 ], [ 78.580774, 41.481759 ], [ 78.650375, 41.467411 ], [ 78.675629, 41.50238 ], [ 78.707042, 41.522098 ], [ 78.696571, 41.54181 ], [ 78.739071, 41.555695 ], [ 78.825302, 41.560173 ], [ 78.86657, 41.593749 ], [ 78.891824, 41.597777 ], [ 78.957729, 41.65146 ], [ 78.99407, 41.664427 ], [ 79.021787, 41.657273 ], [ 79.043345, 41.681414 ], [ 79.10925, 41.697503 ], [ 79.138199, 41.722968 ], [ 79.21704, 41.725648 ], [ 79.271858, 41.767174 ], [ 79.276786, 41.78101 ], [ 79.326061, 41.809565 ], [ 79.356242, 41.795735 ], [ 79.415372, 41.836769 ], [ 79.457256, 41.847915 ], [ 79.500988, 41.835432 ], [ 79.550879, 41.834094 ], [ 79.616784, 41.856385 ], [ 79.640806, 41.884907 ], [ 79.724574, 41.896935 ], [ 79.776313, 41.89248 ], [ 79.822508, 41.963275 ], [ 79.854537, 41.984186 ], [ 79.852689, 42.015319 ], [ 79.923522, 42.042436 ], [ 80.089826, 42.047325 ], [ 80.14218, 42.03488 ], [ 80.193303, 42.081535 ], [ 80.16805, 42.096635 ], [ 80.139717, 42.151232 ], [ 80.163738, 42.152563 ], [ 80.168666, 42.200462 ], [ 80.233339, 42.210215 ], [ 80.28631, 42.233261 ], [ 80.29247, 42.259842 ], [ 80.272144, 42.281984 ], [ 80.283847, 42.320493 ], [ 80.229028, 42.358536 ], [ 80.239499, 42.389927 ], [ 80.206238, 42.431462 ], [ 80.225948, 42.485769 ], [ 80.265368, 42.502097 ], [ 80.221637, 42.533415 ], [ 80.180985, 42.590718 ], [ 80.163738, 42.629919 ], [ 80.179753, 42.670415 ], [ 80.228412, 42.692852 ], [ 80.225948, 42.713083 ], [ 80.259209, 42.790865 ], [ 80.262289, 42.828623 ], [ 80.280151, 42.838278 ], [ 80.338049, 42.831695 ], [ 80.407034, 42.834767 ], [ 80.450766, 42.861971 ], [ 80.503737, 42.882146 ], [ 80.602903, 42.894424 ], [ 80.5912, 42.923354 ], [ 80.487106, 42.948766 ], [ 80.397795, 42.996933 ], [ 80.378701, 43.031502 ], [ 80.416889, 43.05687 ], [ 80.482795, 43.06955 ], [ 80.556092, 43.104515 ], [ 80.593048, 43.133347 ], [ 80.650946, 43.147321 ], [ 80.706997, 43.143828 ], [ 80.73225, 43.131163 ], [ 80.752576, 43.148194 ], [ 80.79446, 43.137277 ], [ 80.804315, 43.178314 ], [ 80.789533, 43.201876 ], [ 80.788917, 43.242433 ], [ 80.769207, 43.265535 ], [ 80.777214, 43.308227 ], [ 80.69283, 43.32042 ], [ 80.686055, 43.333916 ], [ 80.735946, 43.389609 ], [ 80.746417, 43.439167 ], [ 80.761199, 43.446554 ], [ 80.75504, 43.494329 ], [ 80.522215, 43.816473 ], [ 80.511128, 43.906657 ], [ 80.475404, 43.938124 ], [ 80.485259, 43.95579 ], [ 80.457541, 43.981203 ], [ 80.458773, 44.047054 ], [ 80.449534, 44.078017 ], [ 80.3941, 44.127009 ], [ 80.407034, 44.149772 ], [ 80.400875, 44.198704 ], [ 80.413194, 44.264741 ], [ 80.399027, 44.30587 ], [ 80.383013, 44.401297 ], [ 80.350368, 44.484615 ], [ 80.411962, 44.605321 ], [ 80.400259, 44.628751 ], [ 80.313412, 44.704938 ], [ 80.238883, 44.7228 ], [ 80.200695, 44.756808 ], [ 80.178521, 44.796741 ], [ 80.18776, 44.825612 ], [ 80.169898, 44.84471 ], [ 80.115695, 44.815424 ], [ 80.087978, 44.817122 ], [ 79.999283, 44.793768 ], [ 79.991891, 44.830281 ], [ 79.953703, 44.849377 ], [ 79.969102, 44.877797 ], [ 79.887798, 44.90917 ], [ 79.944464, 44.937985 ], [ 79.951855, 44.957892 ], [ 79.98142, 44.964244 ], [ 80.056565, 45.011227 ], [ 80.060876, 45.026033 ], [ 80.111999, 45.052675 ], [ 80.136021, 45.041259 ], [ 80.144644, 45.059017 ], [ 80.195767, 45.030686 ], [ 80.24381, 45.031532 ], [ 80.291854, 45.06578 ], [ 80.328194, 45.070007 ], [ 80.358375, 45.040836 ], [ 80.404571, 45.049293 ], [ 80.443991, 45.077614 ], [ 80.445839, 45.097895 ], [ 80.493882, 45.127037 ], [ 80.519135, 45.108878 ], [ 80.599207, 45.105921 ], [ 80.686055, 45.129148 ], [ 80.731634, 45.156164 ], [ 80.816634, 45.152788 ], [ 80.862214, 45.127037 ], [ 80.897938, 45.127459 ], [ 80.93551, 45.160384 ], [ 80.966307, 45.168402 ], [ 81.024821, 45.162916 ], [ 81.080872, 45.182745 ], [ 81.111669, 45.218168 ], [ 81.170183, 45.211001 ], [ 81.175111, 45.227863 ], [ 81.236705, 45.247248 ], [ 81.284748, 45.23882 ], [ 81.327864, 45.260729 ], [ 81.382066, 45.257781 ], [ 81.398697, 45.275471 ], [ 81.437501, 45.28263 ], [ 81.462754, 45.264099 ], [ 81.52866, 45.285999 ], [ 81.536667, 45.304101 ], [ 81.575471, 45.30789 ], [ 81.582863, 45.336503 ], [ 81.645072, 45.359216 ], [ 81.677101, 45.35459 ], [ 81.78797, 45.3836 ], [ 81.832318, 45.319673 ], [ 81.879745, 45.284314 ], [ 81.921013, 45.233342 ], [ 81.993078, 45.237978 ], [ 82.052824, 45.255674 ], [ 82.09594, 45.249776 ], [ 82.091012, 45.222383 ], [ 82.109491, 45.211422 ], [ 82.206809, 45.236713 ], [ 82.294272, 45.247669 ], [ 82.344779, 45.219011 ], [ 82.487061, 45.181058 ], [ 82.562822, 45.204676 ], [ 82.58746, 45.224069 ], [ 82.60101, 45.346178 ], [ 82.546808, 45.426038 ], [ 82.448257, 45.461309 ], [ 82.281954, 45.53891 ], [ 82.266555, 45.620172 ], [ 82.288729, 45.655321 ], [ 82.289961, 45.71636 ], [ 82.340468, 45.772742 ], [ 82.349707, 45.822811 ], [ 82.336156, 45.882418 ], [ 82.342932, 45.935303 ], [ 82.401446, 45.972333 ], [ 82.461808, 45.97982 ], [ 82.518474, 46.153798 ], [ 82.609017, 46.294985 ], [ 82.726662, 46.494756 ], [ 82.774089, 46.600124 ], [ 82.788872, 46.677784 ], [ 82.829524, 46.772551 ], [ 82.878183, 46.797138 ], [ 82.876335, 46.823762 ], [ 82.923762, 46.932169 ], [ 82.937929, 47.014248 ], [ 82.993364, 47.065229 ], [ 83.031552, 47.168265 ], [ 83.02724, 47.21544 ], [ 83.108544, 47.221944 ], [ 83.15474, 47.236168 ], [ 83.17445, 47.218286 ], [ 83.207094, 47.213814 ], [ 83.221877, 47.186977 ], [ 83.257602, 47.173147 ], [ 83.306261, 47.179656 ], [ 83.324739, 47.167858 ], [ 83.370318, 47.178436 ], [ 83.418978, 47.119012 ], [ 83.463325, 47.132042 ], [ 83.53847, 47.083977 ], [ 83.566803, 47.080717 ], [ 83.576042, 47.059114 ], [ 83.700462, 47.032199 ], [ 83.69923, 47.015472 ], [ 83.766367, 47.026896 ], [ 83.88586, 46.982003 ], [ 83.932671, 46.970161 ], [ 83.951765, 46.98731 ], [ 84.002888, 46.990576 ], [ 84.038613, 46.973428 ], [ 84.086656, 46.965261 ], [ 84.150098, 46.977512 ], [ 84.195061, 47.003638 ], [ 84.2893, 46.994658 ], [ 84.336727, 47.00527 ], [ 84.37122, 46.993434 ], [ 84.425422, 47.008943 ], [ 84.506726, 46.97302 ], [ 84.563393, 46.991801 ], [ 84.668718, 46.995067 ], [ 84.699515, 47.008535 ], [ 84.748175, 47.009759 ], [ 84.781435, 46.979962 ], [ 84.849189, 46.957092 ], [ 84.867051, 46.927673 ], [ 84.934188, 46.863878 ], [ 84.95513, 46.861013 ], [ 84.979768, 46.883106 ], [ 84.987159, 46.918272 ], [ 85.082014, 46.939933 ], [ 85.102956, 46.968936 ], [ 85.175637, 46.997924 ], [ 85.213825, 47.041172 ], [ 85.276651, 47.068898 ], [ 85.325926, 47.044842 ], [ 85.355491, 47.054629 ], [ 85.441106, 47.063191 ], [ 85.545816, 47.057891 ], [ 85.547048, 47.096609 ], [ 85.582772, 47.142626 ], [ 85.641903, 47.18413 ], [ 85.682555, 47.222757 ], [ 85.682555, 47.249982 ], [ 85.701033, 47.28856 ], [ 85.675779, 47.321837 ], [ 85.701649, 47.384275 ], [ 85.685018, 47.428829 ], [ 85.614801, 47.498015 ], [ 85.617881, 47.550552 ], [ 85.547048, 48.008205 ], [ 85.531649, 48.046227 ], [ 85.551975, 48.081423 ], [ 85.55136, 48.127781 ], [ 85.576613, 48.15853 ], [ 85.587084, 48.191654 ], [ 85.622193, 48.202824 ], [ 85.633895, 48.232731 ], [ 85.678243, 48.266205 ], [ 85.695489, 48.302445 ], [ 85.695489, 48.335078 ], [ 85.758315, 48.403064 ], [ 85.791576, 48.418954 ], [ 85.916612, 48.438015 ], [ 86.053966, 48.441192 ], [ 86.225813, 48.432456 ], [ 86.270161, 48.452307 ], [ 86.305269, 48.491984 ], [ 86.38103, 48.49357 ], [ 86.416138, 48.481671 ], [ 86.579978, 48.538763 ], [ 86.594761, 48.576789 ], [ 86.635413, 48.612016 ], [ 86.640956, 48.629027 ], [ 86.693311, 48.64366 ], [ 86.70255, 48.666195 ], [ 86.771535, 48.717156 ], [ 86.780774, 48.731369 ], [ 86.754289, 48.78463 ], [ 86.770303, 48.810255 ], [ 86.818963, 48.831139 ], [ 86.821426, 48.850439 ], [ 86.782006, 48.887049 ], [ 86.757985, 48.894919 ], [ 86.730267, 48.959797 ], [ 86.732115, 48.994757 ], [ 86.772151, 49.02773 ], [ 86.836209, 49.051269 ], [ 86.84976, 49.066563 ], [ 86.854071, 49.109284 ], [ 86.887948, 49.132001 ], [ 86.953853, 49.131218 ], [ 87.000049, 49.142572 ], [ 87.088128, 49.133567 ], [ 87.112766, 49.15549 ], [ 87.211932, 49.140615 ], [ 87.239033, 49.114376 ], [ 87.304939, 49.112418 ], [ 87.388707, 49.097921 ], [ 87.43675, 49.075188 ], [ 87.511894, 49.10184 ], [ 87.49588, 49.132001 ], [ 87.517438, 49.145704 ], [ 87.563017, 49.142572 ], [ 87.602437, 49.152359 ], [ 87.67635, 49.15549 ], [ 87.700372, 49.175839 ], [ 87.762582, 49.172709 ], [ 87.793379, 49.18249 ], [ 87.821096, 49.173883 ], [ 87.82048, 49.148445 ], [ 87.845733, 49.146096 ], [ 87.867291, 49.108892 ], [ 87.844502, 49.090084 ], [ 87.858052, 49.07362 ], [ 87.835263, 49.054406 ], [ 87.883306, 49.023806 ], [ 87.883922, 48.993971 ], [ 87.911639, 48.979833 ], [ 87.871603, 48.963726 ], [ 87.87653, 48.949186 ], [ 87.814321, 48.945256 ], [ 87.793995, 48.927565 ], [ 87.760118, 48.925992 ], [ 87.742256, 48.881146 ], [ 87.78106, 48.872094 ], [ 87.792147, 48.849258 ], [ 87.829103, 48.825623 ], [ 87.803234, 48.824835 ], [ 87.826639, 48.800795 ], [ 87.872219, 48.799612 ], [ 87.93874, 48.757809 ], [ 87.96153, 48.773588 ], [ 88.029283, 48.750313 ], [ 88.064392, 48.712813 ], [ 88.090877, 48.71992 ], [ 88.089645, 48.69504 ], [ 88.02682, 48.65315 ], [ 88.010805, 48.618742 ], [ 87.96153, 48.599353 ], [ 87.973233, 48.575997 ], [ 88.041602, 48.548272 ], [ 88.10874, 48.545895 ], [ 88.130297, 48.521721 ], [ 88.151855, 48.526478 ], [ 88.196819, 48.493967 ], [ 88.229464, 48.498329 ], [ 88.318159, 48.478497 ], [ 88.363123, 48.460641 ], [ 88.360659, 48.433251 ], [ 88.438267, 48.393528 ], [ 88.462289, 48.392335 ], [ 88.503557, 48.412996 ], [ 88.523267, 48.403461 ], [ 88.535586, 48.368884 ], [ 88.573158, 48.369679 ], [ 88.573774, 48.351785 ], [ 88.605803, 48.337863 ], [ 88.575006, 48.277757 ], [ 88.594716, 48.259831 ], [ 88.601491, 48.221567 ], [ 88.638447, 48.183674 ], [ 88.668628, 48.171303 ], [ 88.700657, 48.180881 ], [ 88.721599, 48.160526 ], [ 88.79736, 48.133772 ], [ 88.824461, 48.107005 ], [ 88.939026, 48.115396 ], [ 88.953808, 48.090618 ], [ 89.027105, 48.051028 ], [ 89.044967, 48.009806 ], [ 89.078228, 47.98698 ], [ 89.156452, 47.996992 ], [ 89.231597, 47.98017 ], [ 89.282104, 47.994189 ], [ 89.308589, 48.021816 ], [ 89.359712, 48.026219 ], [ 89.38127, 48.046227 ], [ 89.498299, 48.02822 ], [ 89.569132, 48.037825 ], [ 89.599313, 48.015811 ], [ 89.595617, 47.973359 ], [ 89.645508, 47.947711 ], [ 89.651052, 47.913627 ], [ 89.735435, 47.89758 ], [ 89.761921, 47.835751 ], [ 89.86971, 47.834144 ], [ 89.957789, 47.842982 ], [ 89.960253, 47.885942 ], [ 90.040941, 47.874704 ], [ 90.066195, 47.883534 ], [ 90.086521, 47.86547 ], [ 90.070506, 47.820483 ], [ 90.07605, 47.777469 ], [ 90.13518, 47.723147 ], [ 90.180144, 47.72516 ], [ 90.216484, 47.70543 ], [ 90.331665, 47.681663 ], [ 90.384635, 47.644179 ], [ 90.346447, 47.637324 ], [ 90.376012, 47.603036 ], [ 90.398186, 47.547724 ], [ 90.468403, 47.497611 ], [ 90.474562, 47.462422 ], [ 90.459164, 47.43895 ], [ 90.468403, 47.404937 ], [ 90.507823, 47.400076 ], [ 90.526301, 47.379007 ], [ 90.488113, 47.317374 ], [ 90.521374, 47.2845 ], [ 90.56141, 47.206903 ], [ 90.579888, 47.198364 ], [ 90.653801, 47.111681 ], [ 90.691989, 47.080717 ], [ 90.767134, 46.992617 ], [ 90.830575, 46.995883 ], [ 90.901408, 46.960768 ], [ 90.92235, 46.938707 ], [ 90.929742, 46.893331 ], [ 90.958075, 46.879425 ], [ 90.942676, 46.82581 ], [ 90.992567, 46.790583 ], [ 90.992567, 46.769682 ], [ 91.019053, 46.766402 ], [ 91.054161, 46.717598 ], [ 91.036299, 46.670393 ], [ 91.017821, 46.58244 ], [ 91.068328, 46.579149 ], [ 91.079415, 46.558989 ], [ 91.060937, 46.516999 ], [ 91.038147, 46.500936 ], [ 91.025828, 46.444057 ], [ 90.996263, 46.419309 ], [ 90.983328, 46.374734 ], [ 90.900177, 46.31235 ], [ 90.955611, 46.233752 ], [ 90.94822, 46.219262 ], [ 90.98456, 46.160431 ], [ 91.021517, 46.121038 ], [ 91.014741, 46.06667 ], [ 91.028292, 46.023054 ], [ 90.890937, 45.921566 ], [ 90.799778, 45.834905 ], [ 90.714779, 45.728895 ], [ 90.676591, 45.582488 ], [ 90.671047, 45.487747 ], [ 90.723402, 45.464667 ], [ 90.772677, 45.432338 ], [ 90.773909, 45.405874 ], [ 90.813329, 45.32851 ], [ 90.804706, 45.29484 ], [ 90.831807, 45.300313 ], [ 90.877387, 45.280946 ], [ 90.897713, 45.249776 ], [ 90.866916, 45.209314 ], [ 90.881698, 45.192025 ], [ 90.96177, 45.201303 ], [ 91.007966, 45.218589 ], [ 91.050466, 45.208892 ], [ 91.129922, 45.21606 ], [ 91.17119, 45.199616 ], [ 91.195827, 45.159118 ], [ 91.230936, 45.153632 ], [ 91.242023, 45.13717 ], [ 91.33503, 45.129571 ], [ 91.37753, 45.11099 ], [ 91.429268, 45.156586 ], [ 91.448978, 45.156586 ], [ 91.500101, 45.103809 ], [ 91.561695, 45.075501 ], [ 91.694738, 45.065357 ], [ 91.803144, 45.082685 ], [ 91.885679, 45.078882 ], [ 92.056911, 45.086911 ], [ 92.100026, 45.081417 ], [ 92.240461, 45.015881 ], [ 92.315605, 45.028994 ], [ 92.348866, 45.014188 ], [ 92.414155, 45.018419 ], [ 92.501003, 45.001072 ], [ 92.547814, 45.018419 ], [ 92.683937, 45.02561 ], [ 92.779407, 45.050561 ], [ 92.847777, 45.038721 ], [ 92.884117, 45.046756 ], [ 92.922921, 45.03703 ], [ 92.932776, 45.017573 ], [ 93.002377, 45.009958 ], [ 93.062124, 45.018419 ], [ 93.100312, 45.007419 ], [ 93.174225, 45.015458 ], [ 93.252449, 44.991761 ], [ 93.314043, 44.980333 ], [ 93.314659, 44.995147 ], [ 93.376869, 44.985412 ], [ 93.434767, 44.955351 ], [ 93.509296, 44.968055 ], [ 93.613389, 44.926546 ], [ 93.716251, 44.894334 ], [ 93.723642, 44.865498 ], [ 94.066105, 44.732154 ], [ 94.152336, 44.684944 ], [ 94.215162, 44.667921 ], [ 94.227481, 44.645785 ], [ 94.279836, 44.603617 ], [ 94.329727, 44.582734 ], [ 94.359292, 44.515775 ], [ 94.390705, 44.521749 ], [ 94.470777, 44.509373 ], [ 94.557008, 44.462408 ], [ 94.606283, 44.448311 ], [ 94.673421, 44.397021 ], [ 94.722696, 44.34055 ], [ 94.768275, 44.34055 ], [ 94.826174, 44.320001 ], [ 94.945666, 44.292592 ], [ 94.998637, 44.253169 ], [ 95.1286, 44.269884 ], [ 95.238853, 44.277169 ], [ 95.41378, 44.298589 ], [ 95.43041, 44.281882 ], [ 95.4107, 44.245024 ], [ 95.376208, 44.227444 ], [ 95.355882, 44.166087 ], [ 95.35157, 44.090054 ], [ 95.326932, 44.028554 ], [ 95.377439, 44.025972 ], [ 95.426099, 44.009618 ], [ 95.527113, 44.007466 ], [ 95.623199, 43.855756 ], [ 95.645373, 43.787966 ], [ 95.705735, 43.67077 ], [ 95.735916, 43.597569 ], [ 95.857872, 43.417436 ], [ 95.880046, 43.28035 ], [ 95.921314, 43.229789 ], [ 96.363558, 42.900562 ], [ 96.386348, 42.727592 ] ] ] ] } },\n{ \"type\": \"Feature\", \"properties\": { \"adcode\": \"710000\", \"name\": \"台湾省\", \"center\": [ 121.509062, 25.044332 ], \"centroid\": [ 120.971485, 23.749452 ], \"childrenNum\": 0, \"level\": \"province\", \"parent\": { \"adcode\": 100000 }, \"subFeatureIndex\": 31, \"acroutes\": [ 100000 ] }, \"geometry\": { \"type\": \"MultiPolygon\", \"coordinates\": [ [ [ [ 120.443706, 22.441432 ], [ 120.297112, 22.531565 ], [ 120.274323, 22.560307 ], [ 120.20041, 22.721039 ], [ 120.149287, 22.896468 ], [ 120.133272, 23.000625 ], [ 120.029795, 23.048544 ], [ 120.018708, 23.073322 ], [ 120.081534, 23.291728 ], [ 120.108019, 23.341191 ], [ 120.12157, 23.504836 ], [ 120.095084, 23.58768 ], [ 120.102476, 23.701162 ], [ 120.175156, 23.807427 ], [ 120.245989, 23.840276 ], [ 120.278018, 23.92783 ], [ 120.316206, 23.984708 ], [ 120.391967, 24.118055 ], [ 120.451713, 24.182493 ], [ 120.470807, 24.242533 ], [ 120.520698, 24.311816 ], [ 120.546568, 24.370159 ], [ 120.589068, 24.43229 ], [ 120.642654, 24.490033 ], [ 120.68885, 24.600542 ], [ 120.762147, 24.658208 ], [ 120.82374, 24.688118 ], [ 120.89211, 24.767482 ], [ 120.914899, 24.864715 ], [ 120.961095, 24.940167 ], [ 121.009754, 24.993878 ], [ 121.024537, 25.040517 ], [ 121.102145, 25.075214 ], [ 121.132942, 25.078466 ], [ 121.209318, 25.12724 ], [ 121.319572, 25.140785 ], [ 121.371926, 25.159746 ], [ 121.413194, 25.238806 ], [ 121.444607, 25.27074 ], [ 121.53515, 25.307535 ], [ 121.585041, 25.309159 ], [ 121.62323, 25.29455 ], [ 121.655259, 25.242054 ], [ 121.700222, 25.226896 ], [ 121.707613, 25.191701 ], [ 121.745186, 25.161912 ], [ 121.782142, 25.160287 ], [ 121.841888, 25.135367 ], [ 121.917033, 25.138076 ], [ 121.947214, 25.031841 ], [ 121.98109, 25.030757 ], [ 122.012503, 25.001471 ], [ 121.933047, 24.938539 ], [ 121.844968, 24.836476 ], [ 121.841272, 24.734329 ], [ 121.86283, 24.671261 ], [ 121.892395, 24.617953 ], [ 121.88562, 24.529784 ], [ 121.867758, 24.47914 ], [ 121.82649, 24.423572 ], [ 121.809243, 24.339083 ], [ 121.689135, 24.174303 ], [ 121.678048, 24.133895 ], [ 121.643556, 24.097843 ], [ 121.63986, 24.064514 ], [ 121.65957, 24.007125 ], [ 121.621382, 23.920718 ], [ 121.587505, 23.760878 ], [ 121.522832, 23.538858 ], [ 121.5216, 23.483431 ], [ 121.497578, 23.419744 ], [ 121.479716, 23.322507 ], [ 121.440296, 23.271937 ], [ 121.415042, 23.196047 ], [ 121.430441, 23.137175 ], [ 121.409499, 23.1025 ], [ 121.370695, 23.084334 ], [ 121.35468, 23.00999 ], [ 121.324499, 22.945526 ], [ 121.276456, 22.877171 ], [ 121.237652, 22.836362 ], [ 121.21055, 22.770711 ], [ 121.170514, 22.723247 ], [ 121.078739, 22.669691 ], [ 121.03316, 22.650914 ], [ 121.014682, 22.584069 ], [ 120.981421, 22.528248 ], [ 120.914899, 22.302525 ], [ 120.903197, 22.12634 ], [ 120.912436, 22.086418 ], [ 120.907508, 22.033171 ], [ 120.86624, 21.984345 ], [ 120.873016, 21.897191 ], [ 120.854537, 21.883309 ], [ 120.781857, 21.923843 ], [ 120.743052, 21.915515 ], [ 120.701784, 21.927174 ], [ 120.667908, 21.983235 ], [ 120.651277, 22.033171 ], [ 120.661748, 22.067007 ], [ 120.659285, 22.154056 ], [ 120.640806, 22.241605 ], [ 120.569973, 22.361757 ], [ 120.517619, 22.408793 ], [ 120.443706, 22.441432 ] ] ], [ [ [ 124.541855565478286, 25.891845867343921 ], [ 124.530097884119826, 25.910742140955961 ], [ 124.518340202761223, 25.930898166142125 ], [ 124.541015731095655, 25.946015185031744 ], [ 124.566804, 25.941563 ], [ 124.584666, 25.908731 ], [ 124.568730265726629, 25.884707275090506 ], [ 124.541855565478286, 25.891845867343921 ] ] ], [ [ [ 123.445178, 25.726102 ], [ 123.438733103727387, 25.753273194189074 ], [ 123.468967141506624, 25.783087314776932 ], [ 123.513478363792743, 25.768810130270065 ], [ 123.510958860644465, 25.71464081258226 ], [ 123.468547224315259, 25.703722965606424 ], [ 123.445178, 25.726102 ] ] ], [ [ [ 119.646064, 23.550928 ], [ 119.609108, 23.503738 ], [ 119.578927, 23.502641 ], [ 119.562297, 23.530627 ], [ 119.566608, 23.584937 ], [ 119.601717, 23.575613 ], [ 119.61034, 23.604132 ], [ 119.678093, 23.600294 ], [ 119.691028, 23.547087 ], [ 119.646064, 23.550928 ] ] ], [ [ [ 123.652470954139019, 25.910742140955957 ], [ 123.675986316856211, 25.947274936605876 ], [ 123.705800437444026, 25.935517255247277 ], [ 123.71503861565435, 25.912421809721465 ], [ 123.696562259233758, 25.878828434411201 ], [ 123.66968755898553, 25.88680686104739 ], [ 123.652470954139019, 25.910742140955957 ] ] ], [ [ [ 119.506246, 23.625518 ], [ 119.52534, 23.62497 ], [ 119.519181, 23.559705 ], [ 119.47237, 23.556962 ], [ 119.506246, 23.577259 ], [ 119.506246, 23.625518 ] ] ], [ [ [ 119.497623, 23.38679 ], [ 119.516717, 23.349982 ], [ 119.495159, 23.349982 ], [ 119.497623, 23.38679 ] ] ], [ [ [ 119.557369, 23.666634 ], [ 119.586318, 23.675952 ], [ 119.615268, 23.661153 ], [ 119.608492, 23.620035 ], [ 119.557369, 23.666634 ] ] ], [ [ [ 122.066706, 25.6247 ], [ 122.092575, 25.639268 ], [ 122.087032, 25.61067 ], [ 122.066706, 25.6247 ] ] ], [ [ [ 121.468013, 22.67687 ], [ 121.514824, 22.676318 ], [ 121.513592, 22.631582 ], [ 121.474788, 22.643734 ], [ 121.468013, 22.67687 ] ] ], [ [ [ 121.510513, 22.086972 ], [ 121.575802, 22.0842 ], [ 121.575186, 22.037055 ], [ 121.604752, 22.022631 ], [ 121.594281, 21.995443 ], [ 121.533918, 22.022076 ], [ 121.507433, 22.048704 ], [ 121.510513, 22.086972 ] ] ], [ [ [ 122.097503, 25.499987 ], [ 122.122141, 25.495666 ], [ 122.110438, 25.465952 ], [ 122.097503, 25.499987 ] ] ], [ [ [ 119.421247, 23.216949 ], [ 119.453275, 23.216399 ], [ 119.436029, 23.186146 ], [ 119.421247, 23.216949 ] ] ], [ [ [ 120.355011, 22.327439 ], [ 120.383344, 22.355669 ], [ 120.395663, 22.342385 ], [ 120.355011, 22.327439 ] ] ] ] } },\n{ \"type\": \"Feature\", \"properties\": { \"adcode\": \"810000\", \"name\": \"香港特别行政区\", \"center\": [ 114.173355, 22.320048 ], \"centroid\": [ 114.134391, 22.37737 ], \"childrenNum\": 18, \"level\": \"province\", \"parent\": { \"adcode\": 100000 }, \"subFeatureIndex\": 32, \"acroutes\": [ 100000 ] }, \"geometry\": { \"type\": \"MultiPolygon\", \"coordinates\": [ [ [ [ 114.031778, 22.503923 ], [ 114.082285, 22.512216 ], [ 114.095219, 22.534329 ], [ 114.156813, 22.543726 ], [ 114.166052, 22.559201 ], [ 114.222719, 22.553122 ], [ 114.232574, 22.539857 ], [ 114.232574, 22.528801 ], [ 114.260291, 22.547595 ], [ 114.263371, 22.541515 ], [ 114.263987, 22.541515 ], [ 114.28924, 22.52272 ], [ 114.309566, 22.497288 ], [ 114.340979, 22.50337 ], [ 114.2529, 22.445304 ], [ 114.23319, 22.466875 ], [ 114.205473, 22.449729 ], [ 114.220255, 22.427603 ], [ 114.278769, 22.435901 ], [ 114.325581, 22.479041 ], [ 114.376088, 22.436454 ], [ 114.406269, 22.433688 ], [ 114.406269, 22.432582 ], [ 114.385327, 22.41156 ], [ 114.394566, 22.361757 ], [ 114.356994, 22.340171 ], [ 114.323733, 22.384447 ], [ 114.323733, 22.385001 ], [ 114.323117, 22.385554 ], [ 114.322501, 22.385554 ], [ 114.283081, 22.386661 ], [ 114.278153, 22.328546 ], [ 114.315726, 22.299756 ], [ 114.315726, 22.299203 ], [ 114.313262, 22.264315 ], [ 114.284929, 22.263761 ], [ 114.262139, 22.294773 ], [ 114.248588, 22.274837 ], [ 114.265835, 22.200608 ], [ 114.203009, 22.206703 ], [ 114.200545, 22.232188 ], [ 114.164821, 22.226648 ], [ 114.120473, 22.272068 ], [ 114.145726, 22.300864 ], [ 114.121089, 22.320795 ], [ 114.069966, 22.326885 ], [ 114.034857, 22.300864 ], [ 114.029314, 22.262653 ], [ 114.004676, 22.239389 ], [ 114.026234, 22.229418 ], [ 113.996669, 22.206149 ], [ 113.981271, 22.229972 ], [ 113.935691, 22.205041 ], [ 113.899351, 22.215568 ], [ 113.852539, 22.191188 ], [ 113.8433, 22.229418 ], [ 113.889496, 22.271514 ], [ 113.898119, 22.308615 ], [ 113.969568, 22.321349 ], [ 113.955401, 22.298649 ], [ 114.026234, 22.34792 ], [ 113.980039, 22.366185 ], [ 113.941235, 22.355116 ], [ 113.920293, 22.367845 ], [ 113.918445, 22.418199 ], [ 113.977575, 22.45692 ], [ 114.000981, 22.491206 ], [ 114.031778, 22.503923 ] ] ], [ [ [ 114.142647, 22.213906 ], [ 114.166668, 22.205041 ], [ 114.154965, 22.177888 ], [ 114.120473, 22.177888 ], [ 114.123553, 22.238836 ], [ 114.142647, 22.213906 ] ] ], [ [ [ 114.305871, 22.372273 ], [ 114.305255, 22.372826 ], [ 114.332972, 22.353455 ], [ 114.313878, 22.340724 ], [ 114.305871, 22.372273 ] ] ], [ [ [ 114.320037, 22.381127 ], [ 114.320037, 22.38168 ], [ 114.319421, 22.382234 ], [ 114.322501, 22.385554 ], [ 114.323117, 22.385554 ], [ 114.323733, 22.385001 ], [ 114.323733, 22.384447 ], [ 114.320037, 22.381127 ] ] ], [ [ [ 114.305871, 22.369506 ], [ 114.305255, 22.372826 ], [ 114.305871, 22.372273 ], [ 114.305871, 22.369506 ] ] ], [ [ [ 114.315726, 22.299203 ], [ 114.315726, 22.299756 ], [ 114.316342, 22.30031 ], [ 114.316958, 22.298649 ], [ 114.315726, 22.299203 ] ] ], [ [ [ 114.319421, 22.382234 ], [ 114.320037, 22.38168 ], [ 114.320037, 22.381127 ], [ 114.319421, 22.382234 ] ] ], [ [ [ 114.372392, 22.32301 ], [ 114.372392, 22.323564 ], [ 114.373008, 22.323564 ], [ 114.372392, 22.32301 ] ] ], [ [ [ 114.323733, 22.297541 ], [ 114.323733, 22.298095 ], [ 114.324349, 22.297541 ], [ 114.323733, 22.297541 ] ] ] ] } },\n{ \"type\": \"Feature\", \"properties\": { \"adcode\": \"820000\", \"name\": \"澳门特别行政区\", \"center\": [ 113.54909, 22.198951 ], \"centroid\": [ 113.566988, 22.159307 ], \"childrenNum\": 8, \"level\": \"province\", \"parent\": { \"adcode\": 100000 }, \"subFeatureIndex\": 33, \"acroutes\": [ 100000 ] }, \"geometry\": { \"type\": \"MultiPolygon\", \"coordinates\": [ [ [ [ 113.554425, 22.107489 ], [ 113.554425, 22.142416 ], [ 113.534715, 22.174009 ], [ 113.53841, 22.209473 ], [ 113.558736, 22.212244 ], [ 113.575983, 22.194513 ], [ 113.6037, 22.132438 ], [ 113.554425, 22.107489 ] ] ], [ [ [ 113.586453, 22.201162 ], [ 113.575983, 22.194513 ], [ 113.575983, 22.201162 ], [ 113.586453, 22.201162 ] ] ] ] } },\n{ \"type\": \"Feature\", \"properties\": { \"adcode\": \"100000\", \"name\": \"\", \"adchar\": \"JD\" }, \"geometry\": { \"type\": \"MultiPolygon\", \"coordinates\": [ [ [ [ 122.51865306, 23.46078502 ], [ 122.51742454, 23.45790762 ], [ 122.51536697, 23.45555069 ], [ 122.51268178, 23.45394494 ], [ 122.50963181, 23.45324755 ], [ 122.5065156, 23.45352678 ], [ 122.5036382, 23.45475531 ], [ 122.50128127, 23.45681287 ], [ 122.49967552, 23.45949807 ], [ 122.49897813, 23.46254804 ], [ 122.49925737, 23.46566424 ], [ 122.77921829, 24.57855302 ], [ 122.78044682, 24.58143041 ], [ 122.78250438, 24.58378734 ], [ 122.78518957, 24.5853931 ], [ 122.78823955, 24.58609049 ], [ 122.79135575, 24.58581125 ], [ 122.79423315, 24.58458272 ], [ 122.79659008, 24.58252516 ], [ 122.79819583, 24.57983997 ], [ 122.79889322, 24.57678999 ], [ 122.79861399, 24.57367379 ], [ 122.51865306, 23.46078502 ] ] ], [ [ [ 121.17202617, 20.8054593 ], [ 121.16966862, 20.80340244 ], [ 121.16679085, 20.80217478 ], [ 121.16367457, 20.80189649 ], [ 121.1606248, 20.8025948 ], [ 121.1579401, 20.80420136 ], [ 121.15588324, 20.80655891 ], [ 121.15465558, 20.80943668 ], [ 121.15437729, 20.81255297 ], [ 121.1550756, 20.81560273 ], [ 121.15668216, 20.81828744 ], [ 121.89404403, 21.70026162 ], [ 121.89640158, 21.70231847 ], [ 121.89927934, 21.70354613 ], [ 121.90239563, 21.70382443 ], [ 121.9054454, 21.70312611 ], [ 121.9081301, 21.70151955 ], [ 121.91018696, 21.699162 ], [ 121.91141462, 21.69628423 ], [ 121.91169291, 21.69316794 ], [ 121.9109946, 21.69011818 ], [ 121.90938804, 21.68743347 ], [ 121.17202617, 20.8054593 ] ] ], [ [ [ 119.47366172, 18.00707291 ], [ 119.47175735, 18.00459056 ], [ 119.46917909, 18.0028182 ], [ 119.46617933, 18.0019293 ], [ 119.4630517, 18.00201089 ], [ 119.46010237, 18.00305497 ], [ 119.45762002, 18.00495935 ], [ 119.45584765, 18.00753761 ], [ 119.45495876, 18.01053737 ], [ 119.45504035, 18.01366499 ], [ 119.45608443, 18.01661433 ], [ 120.00812005, 19.0335793 ], [ 120.01002443, 19.03606165 ], [ 120.01260269, 19.03783401 ], [ 120.01560245, 19.03872291 ], [ 120.01873007, 19.03864132 ], [ 120.02167941, 19.03759723 ], [ 120.02416175, 19.03569286 ], [ 120.02593412, 19.0331146 ], [ 120.02682302, 19.03011484 ], [ 120.02674143, 19.02698721 ], [ 120.02569734, 19.02403788 ], [ 119.47366172, 18.00707291 ] ] ], [ [ [ 119.0726757, 15.04098494 ], [ 119.0726746, 15.04083704 ], [ 119.07218171, 15.00751424 ], [ 119.07164663, 15.00443165 ], [ 119.07018516, 15.00166528 ], [ 119.06794036, 14.99948592 ], [ 119.06513198, 14.99810691 ], [ 119.06203491, 14.99766324 ], [ 119.05895232, 14.99819832 ], [ 119.05618595, 14.99965979 ], [ 119.05400659, 15.00190458 ], [ 119.05262758, 15.00471297 ], [ 119.0521839, 15.00781004 ], [ 119.0526757, 15.04105889 ], [ 119.0526757, 16.04388528 ], [ 119.05316513, 16.04697545 ], [ 119.05458553, 16.04976313 ], [ 119.05679784, 16.05197545 ], [ 119.05958553, 16.05339584 ], [ 119.0626757, 16.05388528 ], [ 119.06576587, 16.05339584 ], [ 119.06855355, 16.05197545 ], [ 119.07076587, 16.04976313 ], [ 119.07218626, 16.04697545 ], [ 119.0726757, 16.04388528 ], [ 119.0726757, 15.04098494 ] ] ], [ [ [ 118.68646749, 11.18959191 ], [ 118.85557939, 11.6136711 ], [ 118.9698053, 11.99151854 ], [ 118.97116801, 11.99433487 ], [ 118.97333431, 11.99659227 ], [ 118.97609216, 11.99806975 ], [ 118.9791716, 11.99862269 ], [ 118.98227119, 11.99819697 ], [ 118.98508753, 11.99683427 ], [ 118.98734492, 11.99466796 ], [ 118.9888224, 11.99191011 ], [ 118.98937534, 11.98883067 ], [ 118.98894963, 11.98573108 ], [ 118.87459939, 11.60747236 ], [ 118.87431591, 11.606662 ], [ 118.70476212, 11.18147468 ], [ 118.70409227, 11.18010771 ], [ 118.54242469, 10.9053354 ], [ 118.54043581, 10.90292022 ], [ 118.53779795, 10.90123786 ], [ 118.53476931, 10.90045298 ], [ 118.53164636, 10.90064241 ], [ 118.5287348, 10.90178762 ], [ 118.52631962, 10.9037765 ], [ 118.52463726, 10.90641436 ], [ 118.52385237, 10.909443 ], [ 118.52404181, 10.91256595 ], [ 118.52518702, 10.91547751 ], [ 118.68646749, 11.18959191 ] ] ], [ [ [ 115.54466883, 7.14672265 ], [ 115.54229721, 7.14468204 ], [ 115.53941108, 7.14347417 ], [ 115.53629295, 7.14321728 ], [ 115.53324806, 7.14393652 ], [ 115.53057445, 7.14556148 ], [ 115.52853383, 7.1479331 ], [ 115.52732596, 7.15081924 ], [ 115.52706908, 7.15393736 ], [ 115.52778832, 7.15698226 ], [ 115.52941328, 7.15965587 ], [ 116.23523025, 7.99221221 ], [ 116.23760187, 7.99425282 ], [ 116.240488, 7.99546069 ], [ 116.24360613, 7.99571758 ], [ 116.24665102, 7.99499834 ], [ 116.24932463, 7.99337338 ], [ 116.25136525, 7.99100176 ], [ 116.25257312, 7.98811563 ], [ 116.25283001, 7.9849975 ], [ 116.25211077, 7.98195261 ], [ 116.2504858, 7.979279 ], [ 115.54466883, 7.14672265 ] ] ], [ [ [ 112.30705249, 3.53487257 ], [ 112.51501594, 3.59753306 ], [ 112.84361424, 3.7506962 ], [ 112.84662187, 3.75155809 ], [ 112.84974864, 3.7514484 ], [ 112.85268847, 3.75037785 ], [ 112.8551536, 3.74845124 ], [ 112.85690272, 3.74585715 ], [ 112.85776462, 3.74284952 ], [ 112.85765492, 3.73972276 ], [ 112.85658437, 3.73678292 ], [ 112.85465776, 3.7343178 ], [ 112.85206367, 3.73256867 ], [ 112.52281386, 3.57910186 ], [ 112.52147408, 3.5785908 ], [ 112.31248917, 3.51562254 ], [ 112.31181658, 3.51544515 ], [ 111.79132585, 3.39736822 ], [ 111.78820398, 3.39716187 ], [ 111.78517113, 3.39793033 ], [ 111.78252419, 3.39959839 ], [ 111.78052226, 3.40200275 ], [ 111.77936129, 3.40490807 ], [ 111.77915495, 3.40802995 ], [ 111.77992341, 3.41106279 ], [ 111.78159146, 3.41370973 ], [ 111.78399583, 3.41571167 ], [ 111.78690114, 3.41687263 ], [ 112.30705249, 3.53487257 ] ] ], [ [ [ 108.26055972, 6.08912451 ], [ 108.26004031, 6.09098419 ], [ 108.23638164, 6.22427602 ], [ 108.23630689, 6.22476797 ], [ 108.19687578, 6.53630242 ], [ 108.19679674, 6.53760583 ], [ 108.1987683, 6.95072469 ], [ 108.19897125, 6.95268198 ], [ 108.22460147, 7.07791743 ], [ 108.22570055, 7.08084671 ], [ 108.22765103, 7.083293 ], [ 108.230262, 7.08501682 ], [ 108.23327786, 7.08584944 ], [ 108.23640341, 7.08570936 ], [ 108.2393327, 7.08461028 ], [ 108.24177899, 7.0826598 ], [ 108.24350281, 7.08004883 ], [ 108.24433543, 7.07703297 ], [ 108.24419535, 7.07390742 ], [ 108.21876335, 6.94964057 ], [ 108.21679964, 6.53816468 ], [ 108.25611734, 6.22752625 ], [ 108.279563, 6.09543449 ], [ 108.30878645, 6.01987736 ], [ 108.30944469, 6.0168187 ], [ 108.30912553, 6.01370633 ], [ 108.30786022, 6.01084492 ], [ 108.30577262, 6.00851455 ], [ 108.30306706, 6.00694335 ], [ 108.3000084, 6.00628511 ], [ 108.29689603, 6.00660426 ], [ 108.29403462, 6.00786957 ], [ 108.29170425, 6.00995718 ], [ 108.29013305, 6.01266273 ], [ 108.26055972, 6.08912451 ] ] ], [ [ [ 110.12822847, 11.36894451 ], [ 110.18898148, 11.48996382 ], [ 110.23982347, 11.61066468 ], [ 110.28485499, 11.78705054 ], [ 110.3083549, 11.94803461 ], [ 110.3142445, 12.14195265 ], [ 110.312278, 12.23998238 ], [ 110.31270536, 12.24308175 ], [ 110.31406956, 12.24589736 ], [ 110.31623706, 12.2481536 ], [ 110.3189957, 12.24962962 ], [ 110.32207543, 12.25018094 ], [ 110.32517479, 12.24975358 ], [ 110.3279904, 12.24838938 ], [ 110.33024665, 12.24622187 ], [ 110.33172267, 12.24346324 ], [ 110.33227398, 12.24038351 ], [ 110.33424553, 12.14210167 ], [ 110.33424294, 12.14159753 ], [ 110.32832827, 11.94685414 ], [ 110.32822801, 11.94571326 ], [ 110.30456934, 11.78364161 ], [ 110.30436343, 11.7826124 ], [ 110.25901765, 11.60499559 ], [ 110.25854422, 11.60358735 ], [ 110.20728377, 11.48189306 ], [ 110.20700505, 11.48128846 ], [ 110.14588682, 11.35954163 ], [ 110.14541497, 11.35870461 ], [ 110.07246741, 11.24270688 ], [ 110.07040803, 11.24035153 ], [ 110.0677216, 11.23874785 ], [ 110.06467109, 11.23805281 ], [ 110.0615551, 11.23833444 ], [ 110.05867865, 11.23956519 ], [ 110.05632331, 11.24162456 ], [ 110.05471962, 11.24431099 ], [ 110.05402458, 11.2473615 ], [ 110.05430621, 11.25047749 ], [ 110.05553696, 11.25335394 ], [ 110.12822847, 11.36894451 ] ] ], [ [ [ 109.82951587, 15.22896754 ], [ 109.77065019, 15.44468789 ], [ 109.67264555, 15.66561455 ], [ 109.57455994, 15.82609887 ], [ 109.51574449, 15.91095759 ], [ 109.29314007, 16.19491896 ], [ 109.29161878, 16.19765288 ], [ 109.29101677, 16.20072311 ], [ 109.29139298, 16.2038291 ], [ 109.29271057, 16.20666681 ], [ 109.29484059, 16.20895848 ], [ 109.29757451, 16.21047978 ], [ 109.30064474, 16.21108179 ], [ 109.30375073, 16.21070558 ], [ 109.30658844, 16.20938798 ], [ 109.30888011, 16.20725797 ], [ 109.53166592, 15.92306523 ], [ 109.53201478, 15.92259221 ], [ 109.59116145, 15.8372556 ], [ 109.59147511, 15.83677407 ], [ 109.6900529, 15.67548445 ], [ 109.69066131, 15.67432448 ], [ 109.7892391, 15.45210582 ], [ 109.78974541, 15.45068337 ], [ 109.84889209, 15.23393326 ], [ 109.84903675, 15.23333003 ], [ 109.8648092, 15.15722425 ], [ 109.86495704, 15.15409906 ], [ 109.86413191, 15.15108113 ], [ 109.86241457, 15.1484659 ], [ 109.85997314, 15.14650935 ], [ 109.85704658, 15.145403 ], [ 109.85392139, 15.14525516 ], [ 109.85090347, 15.14608029 ], [ 109.84828823, 15.14779763 ], [ 109.84633168, 15.15023907 ], [ 109.84522534, 15.15316562 ], [ 109.82951587, 15.22896754 ] ] ] ] } }\n]\n}\n', 'admin', '2021-06-30 10:15:13', NULL, NULL, '0', NULL); + +-- ---------------------------- +-- Table structure for jimu_report_share +-- ---------------------------- +DROP TABLE IF EXISTS `jimu_report_share`; +CREATE TABLE `jimu_report_share` ( + `id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '主键', + `report_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '在线excel设计器id', + `preview_url` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '预览地址', + `preview_lock` varchar(4) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '密码锁', + `last_update_time` datetime(0) NULL DEFAULT NULL COMMENT '最后更新时间', + `term_of_validity` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '有效期(0:永久有效,1:1天,2:7天)', + `status` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '是否过期(0未过期,1已过期)', + `preview_lock_status` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '密码锁状态', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '积木报表预览权限表' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of jimu_report_share +-- ---------------------------- + +-- ---------------------------- +-- Table structure for rep_demo_dxtj +-- ---------------------------- +DROP TABLE IF EXISTS `rep_demo_dxtj`; +CREATE TABLE `rep_demo_dxtj` ( + `id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '主键', + `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '姓名', + `gtime` datetime(0) NULL DEFAULT NULL COMMENT '雇佣日期', + `update_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '职务', + `jphone` varchar(125) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '家庭电话', + `birth` datetime(0) NULL DEFAULT NULL COMMENT '出生日期', + `hukou` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '户口所在地', + `laddress` varchar(125) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '联系地址', + `jperson` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '紧急联系人', + `sex` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'xingbie', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of rep_demo_dxtj +-- ---------------------------- +INSERT INTO `rep_demo_dxtj` VALUES ('1338808084247613441', '张三', '2019-11-06 00:00:00', '1', '18034596970', '1988-12-15 00:00:00', '北京市朝阳区奥运村街道亚运村小区', '18034596972', '王亮', '1'); +INSERT INTO `rep_demo_dxtj` VALUES ('1338809169074982920', '张小哲', '2019-11-06 00:00:00', '2', '18034596971', '1988-12-15 00:00:00', '北京市朝阳区奥运村街道亚运村小区', '18034596972', '王亮', '1'); +INSERT INTO `rep_demo_dxtj` VALUES ('1338809448658898952', '闫妮', '2019-11-06 00:00:00', '2', '18034596972', '1988-12-15 00:00:00', '北京市朝阳区奥运村街道亚运村小区', '18034596972', '王亮', '1'); +INSERT INTO `rep_demo_dxtj` VALUES ('1338809620973490184', '陌生', '2019-11-06 00:00:00', '2', '18034596973', '1988-12-15 00:00:00', '北京市朝阳区奥运村街道亚运村小区', '18034596972', '王亮', '1'); +INSERT INTO `rep_demo_dxtj` VALUES ('1338809652606930952', '贺江', '2019-11-06 00:00:00', '2', '18034596974', '1988-12-15 00:00:00', '北京市朝阳区奥运村街道亚运村小区', '18034596972', '王亮', '2'); +INSERT INTO `rep_demo_dxtj` VALUES ('1338809685200867336', '村子明', '2019-11-06 00:00:00', '3', '18034596975', '1988-12-15 00:00:00', '北京市朝阳区奥运村街道亚运村小区', '18034596972', '王亮', '2'); +INSERT INTO `rep_demo_dxtj` VALUES ('1338809710203113481', '尚德', '2019-11-06 00:00:00', '4', '18034596977', '1988-12-15 00:00:00', '北京市朝阳区奥运村街道亚运村小区', '18034596972', '王亮', '1'); +INSERT INTO `rep_demo_dxtj` VALUES ('1338809749470187528', '郑恺', '2019-11-06 00:00:00', '4', '18034596978', '1988-12-15 00:00:00', '北京市朝阳区奥运村街道亚运村小区', '18034596972', '王亮', '1'); +INSERT INTO `rep_demo_dxtj` VALUES ('1338809774971555849', '未名园', '2019-11-06 00:00:00', '4', '18034596970', '1988-12-15 00:00:00', '北京市朝阳区奥运村街道亚运村小区', '18034596972', '王亮', '1'); +INSERT INTO `rep_demo_dxtj` VALUES ('1338809805199904777', '韩寒', '2019-11-06 00:00:00', '5', '18034596970', '1988-12-15 00:00:00', '北京市朝阳区奥运村街道亚运村小区', '18034596972', '王亮', '1'); +INSERT INTO `rep_demo_dxtj` VALUES ('1338809830017601544', '迪丽热拉', '2019-11-06 00:00:00', '6', '18034596970', '1988-12-15 00:00:00', '北京市朝阳区奥运村街道亚运村小区', '18034596972', '王亮', '1'); +INSERT INTO `rep_demo_dxtj` VALUES ('1338809864356368393', '张一山', '2019-11-06 00:00:00', '6', '18034596970', '1988-12-15 00:00:00', '北京市朝阳区奥运村街道亚运村小区', '18034596972', '王亮', '1'); +INSERT INTO `rep_demo_dxtj` VALUES ('1339160157602480137', '张三', '2019-11-06 00:00:00', '1', '18034596970', '1988-12-15 00:00:00', '北京市朝阳区奥运村街道亚运村小区', '18034596972', '王亮', '1'); +INSERT INTO `rep_demo_dxtj` VALUES ('1339160157602480146', '张大大', '2019-11-06 00:00:00', '2', '18034596971', '1988-12-15 00:00:00', '北京市朝阳区奥运村街道亚运村小区', '18034596972', '王亮', '1'); +INSERT INTO `rep_demo_dxtj` VALUES ('1339160157606674439', '郭美美', '2019-11-06 00:00:00', '2', '18034596972', '1988-12-15 00:00:00', '北京市朝阳区奥运村街道亚运村小区', '18034596972', '王亮', '1'); +INSERT INTO `rep_demo_dxtj` VALUES ('1339160157606674448', '莫愁', '2019-11-06 00:00:00', '2', '18034596973', '1988-12-15 00:00:00', '北京市朝阳区奥运村街道亚运村小区', '18034596972', '王亮', '1'); +INSERT INTO `rep_demo_dxtj` VALUES ('1339160157606674457', '鲁与', '2019-11-06 00:00:00', '2', '18034596974', '1988-12-15 00:00:00', '北京市朝阳区奥运村街道亚运村小区', '18034596972', '王亮', '2'); +INSERT INTO `rep_demo_dxtj` VALUES ('1339160157606674466', '高尚', '2019-11-06 00:00:00', '3', '18034596975', '1988-12-15 00:00:00', '北京市朝阳区奥运村街道亚运村小区', '18034596972', '王亮', '2'); +INSERT INTO `rep_demo_dxtj` VALUES ('1339160157606674475', '尚北京', '2019-11-06 00:00:00', '4', '18034596977', '1988-12-15 00:00:00', '北京市朝阳区奥运村街道亚运村小区', '18034596972', '王亮', '1'); +INSERT INTO `rep_demo_dxtj` VALUES ('1339160157606674484', '杨颖花', '2019-11-06 00:00:00', '4', '18034596978', '1988-12-15 00:00:00', '北京市朝阳区奥运村街道亚运村小区', '18034596972', '王亮', '1'); +INSERT INTO `rep_demo_dxtj` VALUES ('1339160157606674493', '李丽', '2019-11-06 00:00:00', '4', '18034596970', '1988-12-15 00:00:00', '北京市朝阳区奥运村街道亚运村小区', '18034596972', '王亮', '1'); +INSERT INTO `rep_demo_dxtj` VALUES ('1339160157606674502', '韩露露', '2019-11-06 00:00:00', '5', '18034596970', '1988-12-15 00:00:00', '北京市朝阳区奥运村街道亚运村小区', '18034596972', '王亮', '1'); +INSERT INTO `rep_demo_dxtj` VALUES ('1339160157606674511', '李凯泽', '2019-11-06 00:00:00', '6', '18034596970', '1988-12-15 00:00:00', '北京市朝阳区奥运村街道亚运村小区', '18034596972', '王亮', '1'); +INSERT INTO `rep_demo_dxtj` VALUES ('1339160157606674520', '王明阳', '2019-11-06 00:00:00', '6', '18034596970', '1988-12-15 00:00:00', '北京市朝阳区奥运村街道亚运村小区', '18034596972', '王亮', '1'); + +-- ---------------------------- +-- Table structure for rep_demo_employee +-- ---------------------------- +DROP TABLE IF EXISTS `rep_demo_employee`; +CREATE TABLE `rep_demo_employee` ( + `id` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '主键', + `num` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '编号', + `name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '姓名', + `sex` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '性别', + `birthday` datetime(0) NULL DEFAULT NULL COMMENT '出生日期', + `nation` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '民族', + `political` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '政治面貌', + `native_place` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '籍贯', + `height` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '身高', + `weight` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '体重', + `health` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '健康状况', + `id_card` varchar(80) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '身份证号', + `education` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '学历', + `school` varchar(80) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '毕业学校', + `major` varchar(80) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '专业', + `address` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '联系地址', + `zip_code` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '邮编', + `email` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'Email', + `phone` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '手机号', + `foreign_language` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '外语语种', + `foreign_language_level` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '外语水平', + `computer_level` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '计算机水平', + `graduation_time` datetime(0) NULL DEFAULT NULL COMMENT '毕业时间', + `arrival_time` datetime(0) NULL DEFAULT NULL COMMENT '到职时间', + `positional_titles` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '职称', + `education_experience` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '教育经历', + `work_experience` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '工作经历', + `create_by` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '修改人', + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '修改时间', + `del_flag` tinyint(1) NULL DEFAULT NULL COMMENT '删除标识0-正常,1-已删除', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of rep_demo_employee +-- ---------------------------- +INSERT INTO `rep_demo_employee` VALUES ('1', '001', '张三', '男', '2000-02-04 13:36:19', '汉族', '团员', '北京', '170', '65', '良好', '110101200002044853', '大专', '北京科技', '计算机', '北京朝阳区', '1001', 'zhang@163.com', '18011111111', '英语', '三级', '三级', '2019-02-04 13:41:17', '2020-02-04 13:41:31', '项目经理', '2018年9月—2019年7月:北京语言文化大学比较文学研究所攻读博士学位,获得比较文学博士学位', '2019年5月---至今 XX公司     网络系统工程师  \n2019年5月---至今 XX公司     网络系统工程师', NULL, '2020-02-04 15:18:03', NULL, NULL, NULL); +INSERT INTO `rep_demo_employee` VALUES ('2', '002', '王红', '女', '2000-02-04 13:36:19', '汉族', '团员', '北京', '170', '65', '良好', '110101200002044853', '大专', '北京科技', '计算机', '北京朝阳区', '1001', 'zhang@163.com', '18011111111', '英语', '三级', '三级', '2019-02-04 13:41:17', '2020-02-04 13:41:31', '项目经理', '2018年9月—2019年7月:北京语言文化大学比较文学研究所攻读博士学位,获得比较文学博士学位', '2019年5月---至今 XX公司     网络系统工程师  \n2019年5月---至今 XX公司     网络系统工程师', NULL, '2020-02-04 18:39:27', NULL, NULL, NULL); + +-- ---------------------------- +-- Table structure for rep_demo_gongsi +-- ---------------------------- +DROP TABLE IF EXISTS `rep_demo_gongsi`; +CREATE TABLE `rep_demo_gongsi` ( + `id` int(0) NOT NULL AUTO_INCREMENT, + `gname` varchar(125) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '货品名称', + `gdata` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '返利', + `tdata` varchar(125) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '备注', + `didian` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `zhaiyao` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `num` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of rep_demo_gongsi +-- ---------------------------- +INSERT INTO `rep_demo_gongsi` VALUES (1, '北京天山海世界', '2020-02-30 11:12:25', '2020-02-25', '天山大厦', '1', '2399845661'); +INSERT INTO `rep_demo_gongsi` VALUES (2, 'dd天山海世界', '2020-02-30 11:12:25', '2020-02-25', '天山大厦', '1', '2399845661'); + +-- ---------------------------- +-- Table structure for rep_demo_jianpiao +-- ---------------------------- +DROP TABLE IF EXISTS `rep_demo_jianpiao`; +CREATE TABLE `rep_demo_jianpiao` ( + `id` int(0) NOT NULL AUTO_INCREMENT, + `bnum` varchar(125) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `ftime` varchar(125) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `sfkong` varchar(125) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `kaishi` varchar(125) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `jieshu` varchar(125) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `hezairen` varchar(125) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `jpnum` varchar(125) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `shihelv` varchar(125) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `s_id` int(0) NOT NULL, + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 87 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of rep_demo_jianpiao +-- ---------------------------- +INSERT INTO `rep_demo_jianpiao` VALUES (1, 'K7725', '21:13', '否', '秦皇岛', '邯郸', '300', '258', '86', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (2, 'k99', '16:55', '否', '包头', '广州', '800', '700', '88', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (3, 'G6737', '05:34', '否', '北京西', '邯郸东', '500', '256', '51', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (4, 'K7705', '07:03', '否', '北京', '邯郸', '400', '200', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (5, 'G437', '06:27', '否', '北京西', '兰州西', '800', '586', '73', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (6, 'G673', '06:32', '否', '北京西', '邯郸东', '300', '289', '87', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (7, 'G507', '06:43', '否', '北京西', '邯郸东', '300', '200', '67', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (8, 'G89', '06:53', '否', '北京西', '成都东', '800', '500', '62', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (9, 'K7712', '09:43', '否', '北京西', '西安北', '400', '200', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (10, 'G405', '10:05', '否', '北京西', '昆明南', '300', '200', '67', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (11, 'G6701', '10:38', '否', '北京西', '石家庄', '300', '200', '67', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (12, 'G487', '10:52', '否', '北京西', '南昌西', '800', '700', '88', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (13, 'G607', '11:14', '否', '北京西', '太原南', '400', '200', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (14, 'G667', '11:19', '否', '北京西', '西安北', '400', '200', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (15, 'Z49', '11:28', '否', '北京西', '成都', '400', '200', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (16, 'Z49', '11:28', '否', '北京西', '上海', '300', '200', '80', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (17, 'Z49', '11:56', '否', '北京西', '上海', '200', '180', '95', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (18, 'Z49', '11:36', '否', '北京南', '大晒', '200', '180', '96', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (19, 'Z123', '12:00', '否', '北京南', '重庆', '1000', '1000', '100', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (20, 'G78', '13:56', '否', '北京东', '厦门北', '800', '700', '90', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (21, 'G56', '18:36', '否', '上海西', '深圳', '800', '700', '90', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (22, 'H78', '12:00', '否', '上海', '北京西', '800', '700', '90', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (23, 'H78', '12:00', '否', '上海', '北京西', '800', '700', '90', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (24, 'H78', '12:00', '否', '上海', '北京西', '800', '700', '90', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (25, 'H78', '12:00', '否', '北京西', '南昌', '800', '700', '90', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (26, 'G70', '7:23', '是', '北京西', '厦门', '500', '450', '95', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (27, 'G14', '9:50', '是', '北京西', '上海', '800', '700', '95', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (28, 'G90', '8:30', '是', '北京南', '武昌', '1000', '1000', '100', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (29, 'G25', '7:56', '是', '厦门北', '福州', '500', '100', '20', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (30, 'G50', '14:23', '否', '北京西', '深圳', '500', '100', '20', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (31, 'G10', '13:00', '否', '北京西', '深圳', '500', '100', '20', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (32, 'G10', '13:00', '否', '北京西', '深圳', '500', '100', '20', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (33, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (34, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (35, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (36, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (37, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (38, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (39, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (40, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (41, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (42, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (43, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (44, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (45, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (46, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (47, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (48, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (49, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (50, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (51, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (52, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (53, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (54, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (55, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (56, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (57, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (58, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (59, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (60, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (61, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (62, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (63, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (64, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (65, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (66, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (67, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (68, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (69, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (70, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (71, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (72, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (73, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (74, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (75, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (76, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (77, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (78, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (79, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (80, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (81, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (82, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (83, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (84, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (85, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (86, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); + +-- ---------------------------- +-- Table structure for tmp_report_data_1 +-- ---------------------------- +DROP TABLE IF EXISTS `tmp_report_data_1`; +CREATE TABLE `tmp_report_data_1` ( + `monty` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '月份', + `main_income` decimal(10, 2) NULL DEFAULT NULL, + `total` decimal(10, 2) NULL DEFAULT NULL, + `his_lowest` decimal(10, 2) NULL DEFAULT NULL, + `his_average` decimal(10, 2) NULL DEFAULT NULL, + `his_highest` decimal(10, 2) NULL DEFAULT NULL +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of tmp_report_data_1 +-- ---------------------------- +INSERT INTO `tmp_report_data_1` VALUES ('1月', 483834.66, 483834.66, 57569.77, 216797.62, 483834.66); +INSERT INTO `tmp_report_data_1` VALUES ('2月', 11666578.65, 12150413.31, 22140.00, 4985361.57, 11666578.65); +INSERT INTO `tmp_report_data_1` VALUES ('3月', 27080982.08, 39231395.39, 73106.29, 16192642.30, 27080982.08); +INSERT INTO `tmp_report_data_1` VALUES ('4月', 0.00, 39231395.39, 73106.29, 8513415.34, 17428381.40); +INSERT INTO `tmp_report_data_1` VALUES ('5月', 0.00, 39231395.39, NULL, NULL, NULL); +INSERT INTO `tmp_report_data_1` VALUES ('6月', 0.00, 39231395.39, NULL, NULL, NULL); +INSERT INTO `tmp_report_data_1` VALUES ('7月', 0.00, 39231395.39, NULL, NULL, NULL); +INSERT INTO `tmp_report_data_1` VALUES ('8月', 0.00, 39231395.39, NULL, NULL, NULL); +INSERT INTO `tmp_report_data_1` VALUES ('9月', 0.00, 39231395.39, NULL, NULL, NULL); +INSERT INTO `tmp_report_data_1` VALUES ('10月', 0.00, 39231395.39, NULL, NULL, NULL); +INSERT INTO `tmp_report_data_1` VALUES ('11月', 0.00, 39231395.39, NULL, NULL, NULL); +INSERT INTO `tmp_report_data_1` VALUES ('12月', 0.00, 39231395.39, NULL, NULL, NULL); + +-- ---------------------------- +-- Table structure for tmp_report_data_income +-- ---------------------------- +DROP TABLE IF EXISTS `tmp_report_data_income`; +CREATE TABLE `tmp_report_data_income` ( + `biz_income` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `bx_jj_yongjin` decimal(10, 2) NULL DEFAULT NULL, + `bx_zx_money` decimal(10, 2) NULL DEFAULT NULL, + `chengbao_gz_money` decimal(10, 2) NULL DEFAULT NULL, + `bx_gg_moeny` decimal(10, 2) NULL DEFAULT NULL, + `tb_zx_money` decimal(10, 2) NULL DEFAULT NULL, + `neikong_zx_money` decimal(10, 2) NULL DEFAULT NULL, + `total` decimal(10, 2) NULL DEFAULT NULL +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of tmp_report_data_income +-- ---------------------------- +INSERT INTO `tmp_report_data_income` VALUES ('中国石油全资(集团所属)', 37134.58, 1099273.32, 0.00, 0.00, 0.00, 226415.09, 38460270.57); +INSERT INTO `tmp_report_data_income` VALUES ('中国石油全资(股份所属)', 227595.77, 0.00, 0.00, 0.00, 0.00, 0.00, 227595.77); +INSERT INTO `tmp_report_data_income` VALUES ('中石油控股或有控股权', 310628.11, 369298.64, 0.00, 0.00, 0.00, 0.00, 679926.75); +INSERT INTO `tmp_report_data_income` VALUES ('中石油参股', 72062.45, 0.00, 0.00, 0.00, 0.00, 0.00, 72062.75); +INSERT INTO `tmp_report_data_income` VALUES ('非中石油', 1486526.90, 212070.72, 0.00, 0.00, 0.00, 226415.09, 1698597.62); + +SET FOREIGN_KEY_CHECKS = 1; diff --git a/db/Dockerfile b/db/Dockerfile new file mode 100644 index 0000000..79e2eb5 --- /dev/null +++ b/db/Dockerfile @@ -0,0 +1,27 @@ +FROM mysql/mysql-server:8.0.32 + +MAINTAINER lengleng(wangiegie@gmail.com) + +ENV TZ=Asia/Shanghai + +RUN ln -sf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone + +COPY ./1schema.sql /docker-entrypoint-initdb.d + +COPY ./2pigxx.sql /docker-entrypoint-initdb.d + +COPY ./3pigxx_flow.sql /docker-entrypoint-initdb.d + +COPY ./4pigxx_job.sql /docker-entrypoint-initdb.d + +COPY ./5pigxx_mp.sql /docker-entrypoint-initdb.d + +COPY ./6pigxx_config.sql /docker-entrypoint-initdb.d + +COPY ./7pigxx_pay.sql /docker-entrypoint-initdb.d + +COPY ./8pigxx_codegen.sql /docker-entrypoint-initdb.d + +COPY ./99pigxx_bi.sql /docker-entrypoint-initdb.d + +COPY ./999pigxx_app.sql /docker-entrypoint-initdb.d diff --git a/db/ishare_schema.sql b/db/ishare_schema.sql new file mode 100644 index 0000000..2b12f89 --- /dev/null +++ b/db/ishare_schema.sql @@ -0,0 +1,292 @@ +-- ============================================================ +-- iShare (AiShare) 完整建表脚本 +-- 生成时间: 2026-02-16 +-- 用途: iShare 流媒体账号合租平台 - 全部 17 张表 +-- 数据库: pigxx_app +-- 依赖顺序: 基础表 → 业务表 → 关联表 +-- ============================================================ + +USE pigxx_app; +SET NAMES utf8mb4; +SET FOREIGN_KEY_CHECKS = 0; + +-- ============================================================ +-- 一、App 基础表(9 张) +-- ============================================================ + +-- 1. app_user — App 用户 +CREATE TABLE IF NOT EXISTS `app_user` ( + `user_id` bigint NOT NULL COMMENT '用户ID', + `username` varchar(255) DEFAULT NULL COMMENT '用户名', + `password` varchar(255) DEFAULT NULL COMMENT '密码(BCrypt)', + `salt` varchar(255) DEFAULT NULL COMMENT '盐值', + `phone` varchar(20) DEFAULT NULL COMMENT '手机号码', + `avatar` varchar(255) DEFAULT NULL COMMENT '头像', + `nickname` varchar(64) DEFAULT NULL COMMENT '昵称', + `name` varchar(64) DEFAULT NULL COMMENT '姓名', + `email` varchar(128) DEFAULT NULL COMMENT '邮箱', + `wx_openid` varchar(32) DEFAULT NULL COMMENT '微信登录openId', + `lock_flag` char(1) DEFAULT '0' COMMENT '锁定状态: 0=正常, 1=锁定', + `del_flag` char(1) DEFAULT '0' COMMENT '删除标志: 0=正常, 1=删除', + `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户ID', + `create_by` varchar(64) NOT NULL DEFAULT ' ' COMMENT '创建人', + `update_by` varchar(64) NOT NULL DEFAULT ' ' COMMENT '修改人', + `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', + `last_modified_time` datetime DEFAULT NULL COMMENT '最后密码修改时间', + PRIMARY KEY (`user_id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='App用户表'; + +-- 2. app_role — 角色表 +CREATE TABLE IF NOT EXISTS `app_role` ( + `role_id` bigint NOT NULL COMMENT '角色ID', + `role_name` varchar(64) DEFAULT NULL COMMENT '角色名称', + `role_code` varchar(64) DEFAULT NULL COMMENT '角色编码', + `role_desc` varchar(255) DEFAULT NULL COMMENT '角色描述', + `del_flag` char(1) DEFAULT '0' COMMENT '删除标志', + `tenant_id` bigint DEFAULT NULL COMMENT '租户ID', + `create_by` varchar(64) NOT NULL DEFAULT ' ' COMMENT '创建人', + `update_by` varchar(64) NOT NULL DEFAULT ' ' COMMENT '修改人', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', + PRIMARY KEY (`role_id`) USING BTREE, + KEY `idx_role_code` (`role_code`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='App角色表'; + +-- 3. app_user_role — 用户角色关联 +CREATE TABLE IF NOT EXISTS `app_user_role` ( + `user_id` bigint NOT NULL COMMENT '用户ID', + `role_id` bigint NOT NULL COMMENT '角色ID', + PRIMARY KEY (`user_id`, `role_id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户角色关联表'; + +-- 4. app_social_details — 社交登录配置 +CREATE TABLE IF NOT EXISTS `app_social_details` ( + `id` bigint NOT NULL COMMENT '主键', + `type` varchar(16) DEFAULT NULL COMMENT '社交类型', + `remark` varchar(64) DEFAULT NULL COMMENT '备注', + `app_id` varchar(64) DEFAULT NULL COMMENT '应用ID', + `app_secret` varchar(64) DEFAULT NULL COMMENT '应用密钥', + `redirect_url` varchar(128) DEFAULT NULL COMMENT '重定向URL', + `ext` varchar(255) DEFAULT NULL COMMENT '拓展字段', + `del_flag` char(1) DEFAULT '0' COMMENT '删除标志', + `create_by` varchar(64) NOT NULL DEFAULT ' ' COMMENT '创建人', + `update_by` varchar(64) NOT NULL DEFAULT ' ' COMMENT '修改人', + `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='社交登录配置表'; + +-- 5. app_article_category — 文章分类 +CREATE TABLE IF NOT EXISTS `app_article_category` ( + `id` bigint UNSIGNED NOT NULL COMMENT '主键', + `name` varchar(60) NOT NULL DEFAULT '' COMMENT '分类名称', + `sort` smallint UNSIGNED NOT NULL DEFAULT 50 COMMENT '排序', + `is_show` tinyint UNSIGNED NOT NULL DEFAULT 1 COMMENT '是否显示: 0=否, 1=是', + `del_flag` char(1) DEFAULT '0' COMMENT '删除标志', + `tenant_id` bigint DEFAULT NULL COMMENT '租户ID', + `create_by` varchar(32) DEFAULT '0' COMMENT '创建人', + `update_by` varchar(32) DEFAULT NULL COMMENT '修改人', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='文章分类表'; + +-- 6. app_article — 文章资讯 +CREATE TABLE IF NOT EXISTS `app_article` ( + `id` bigint NOT NULL COMMENT '主键', + `cid` bigint NOT NULL COMMENT '分类ID', + `title` varchar(200) NOT NULL DEFAULT '' COMMENT '标题', + `intro` varchar(200) NOT NULL DEFAULT '' COMMENT '简介', + `summary` varchar(200) DEFAULT '' COMMENT '摘要', + `image` varchar(200) NOT NULL DEFAULT '' COMMENT '封面图片', + `content` text COMMENT '内容', + `author` varchar(32) NOT NULL DEFAULT '' COMMENT '作者', + `visit` int UNSIGNED NOT NULL DEFAULT 0 COMMENT '浏览量', + `sort` int UNSIGNED NOT NULL DEFAULT 50 COMMENT '排序', + `del_flag` char(1) NOT NULL DEFAULT '0' COMMENT '删除标志', + `tenant_id` bigint DEFAULT NULL COMMENT '租户ID', + `create_by` varchar(32) NOT NULL COMMENT '创建人', + `update_by` varchar(32) DEFAULT NULL COMMENT '修改人', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + PRIMARY KEY (`id`) USING BTREE, + KEY `idx_cid` (`cid`) USING BTREE COMMENT '分类索引' +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='文章资讯表'; + +-- 7. app_article_collect — 文章收藏 +CREATE TABLE IF NOT EXISTS `app_article_collect` ( + `id` bigint UNSIGNED NOT NULL COMMENT '主键', + `user_id` bigint UNSIGNED NOT NULL DEFAULT 0 COMMENT '用户ID', + `article_id` bigint UNSIGNED NOT NULL DEFAULT 0 COMMENT '文章ID', + `del_flag` char(1) NOT NULL DEFAULT '0' COMMENT '删除标志', + `tenant_id` bigint DEFAULT NULL COMMENT '租户ID', + `create_by` varchar(32) DEFAULT NULL COMMENT '创建人', + `update_by` varchar(32) DEFAULT NULL COMMENT '修改人', + `create_time` datetime NOT NULL COMMENT '创建时间', + `update_time` datetime NOT NULL COMMENT '更新时间', + PRIMARY KEY (`id`) USING BTREE, + KEY `idx_user_id` (`user_id`) USING BTREE, + KEY `idx_article_id` (`article_id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='文章收藏表'; + +-- 8. app_page — 页面装修 +CREATE TABLE IF NOT EXISTS `app_page` ( + `id` bigint UNSIGNED NOT NULL COMMENT '主键', + `page_type` tinyint UNSIGNED NOT NULL DEFAULT 10 COMMENT '页面类型', + `page_name` varchar(100) NOT NULL DEFAULT '' COMMENT '页面名称', + `page_data` text COMMENT '页面数据(JSON)', + `del_flag` char(1) DEFAULT NULL COMMENT '删除标志', + `tenant_id` bigint DEFAULT NULL COMMENT '租户ID', + `create_by` varchar(32) DEFAULT NULL COMMENT '创建人', + `update_by` varchar(32) DEFAULT NULL COMMENT '修改人', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_time` datetime DEFAULT NULL COMMENT '修改时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='页面装修表'; + +-- 9. app_tabbar — 底部导航栏 +CREATE TABLE IF NOT EXISTS `app_tabbar` ( + `id` bigint UNSIGNED NOT NULL COMMENT '主键', + `name` varchar(20) NOT NULL DEFAULT '' COMMENT '导航名称', + `selected` varchar(200) NOT NULL DEFAULT '' COMMENT '选中图标', + `unselected` varchar(200) NOT NULL DEFAULT '' COMMENT '未选图标', + `link` varchar(200) NOT NULL COMMENT '链接地址(JSON)', + `del_flag` char(1) DEFAULT NULL COMMENT '删除标志', + `tenant_id` bigint DEFAULT NULL COMMENT '租户ID', + `create_by` varchar(32) DEFAULT NULL COMMENT '创建人', + `update_by` varchar(32) DEFAULT NULL COMMENT '修改人', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='底部导航栏表'; + +-- ============================================================ +-- 二、iShare 核心业务表(8 张) +-- ============================================================ + +-- 10. as_platform_type — 平台类型(基础字典表) +CREATE TABLE IF NOT EXISTS `as_platform_type` ( + `id` bigint NOT NULL COMMENT '主键', + `name` varchar(64) NOT NULL COMMENT '类型名称(视频、音乐、AI等)', + `platform_type` int DEFAULT 0 COMMENT '类型编号,0=全部', + `sort_order` varchar(32) DEFAULT NULL COMMENT '排序', + PRIMARY KEY (`id`) USING BTREE, + KEY `idx_platform_type` (`platform_type`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='平台类型表'; + +-- 11. as_platform — 流媒体平台 +CREATE TABLE IF NOT EXISTS `as_platform` ( + `id` bigint NOT NULL COMMENT '主键', + `platform_name` varchar(128) NOT NULL COMMENT '平台名称', + `platform_type` int DEFAULT 0 COMMENT '平台类型(关联as_platform_type),0=全部', + `icon` varchar(512) DEFAULT NULL COMMENT '应用图标URL', + `company` varchar(128) DEFAULT NULL COMMENT '所属公司', + `website` varchar(256) DEFAULT NULL COMMENT '平台官网', + `sort_order` varchar(32) DEFAULT NULL COMMENT '排序', + `product_code` varchar(64) DEFAULT NULL COMMENT '产品编码(类型_名称_id)', + PRIMARY KEY (`id`) USING BTREE, + KEY `idx_platform_type` (`platform_type`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='流媒体平台表'; + +-- 12. as_sub_plan — 订阅计划 +CREATE TABLE IF NOT EXISTS `as_sub_plan` ( + `id` bigint NOT NULL COMMENT '计划ID', + `name` varchar(128) NOT NULL COMMENT '计划名称(标准版、高级版等)', + `platform_id` varchar(64) DEFAULT NULL COMMENT '所属平台ID', + `capacity` varchar(16) DEFAULT NULL COMMENT '用户容量(可共享席位数)', + `remark` varchar(256) DEFAULT NULL COMMENT '备注', + `sort_order` varchar(32) DEFAULT NULL COMMENT '排序', + PRIMARY KEY (`id`) USING BTREE, + KEY `idx_platform_id` (`platform_id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='订阅计划表'; + +-- 13. as_sub_payroll — 付费方案 +CREATE TABLE IF NOT EXISTS `as_sub_payroll` ( + `id` bigint NOT NULL COMMENT '主键', + `sub_plans` bigint DEFAULT NULL COMMENT '关联的订阅计划ID', + `platform_id` int DEFAULT NULL COMMENT '平台ID', + `payroll` int DEFAULT NULL COMMENT '付费周期: 1=月付, 2=季付, 3=年付', + `price` decimal(10,2) DEFAULT NULL COMMENT '价格', + `currency` varchar(16) DEFAULT NULL COMMENT '货币(CNY/USD等)', + `region` varchar(64) DEFAULT NULL COMMENT '地区', + `product_code` varchar(64) DEFAULT NULL COMMENT '产品编码', + PRIMARY KEY (`id`) USING BTREE, + KEY `idx_sub_plans` (`sub_plans`) USING BTREE, + KEY `idx_platform_id` (`platform_id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='付费方案表'; + +-- 14. as_sub_product — 订阅产品(合租商品) +CREATE TABLE IF NOT EXISTS `as_sub_product` ( + `id` bigint NOT NULL COMMENT '主键', + `title` varchar(256) NOT NULL COMMENT '产品标题', + `description` varchar(1024) DEFAULT NULL COMMENT '描述', + `tags` varchar(256) DEFAULT NULL COMMENT '标签(逗号分隔)', + `star` int DEFAULT NULL COMMENT '综合评分', + `sub_plan_ids` varchar(256) DEFAULT NULL COMMENT '关联的订阅计划ID列表', + `amount` decimal(10,2) DEFAULT NULL COMMENT '总价', + `user_id` bigint DEFAULT NULL COMMENT '发布者用户ID', + `product_type` bigint DEFAULT NULL COMMENT '产品类型: 1=自营, 2=个人', + `sub_type` bigint DEFAULT NULL COMMENT '订阅类型: 1=单品, 2=多品组合', + `product_code` varchar(64) DEFAULT NULL COMMENT '产品编码(类型_名称_id)', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + PRIMARY KEY (`id`) USING BTREE, + KEY `idx_user_id` (`user_id`) USING BTREE, + KEY `idx_product_type` (`product_type`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='订阅产品表(合租商品)'; + +-- 15. as_sub_product_comment — 产品评价 +CREATE TABLE IF NOT EXISTS `as_sub_product_comment` ( + `id` bigint NOT NULL COMMENT '主键', + `star` int DEFAULT NULL COMMENT '评分', + `comment` varchar(1024) DEFAULT NULL COMMENT '评价内容', + `user_id` bigint DEFAULT NULL COMMENT '评价用户ID', + `product_id` bigint DEFAULT NULL COMMENT '关联产品ID', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + PRIMARY KEY (`id`) USING BTREE, + KEY `idx_product_id` (`product_id`) USING BTREE, + KEY `idx_user_id` (`user_id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='产品评价表'; + +-- 16. as_sub_account — 订阅账号 +CREATE TABLE IF NOT EXISTS `as_sub_account` ( + `id` bigint NOT NULL COMMENT '主键', + `product_id` bigint DEFAULT NULL COMMENT '关联产品ID', + `sub_plan_id` int DEFAULT NULL COMMENT '订阅计划ID', + `user_id` int DEFAULT NULL COMMENT '账号持有者(主用户)', + `sub_payroll_id` int DEFAULT NULL COMMENT '付费方案ID', + `region` varchar(64) DEFAULT NULL COMMENT '地区', + `share_type` int DEFAULT NULL COMMENT '分享类型', + `account_type` int DEFAULT NULL COMMENT '账号类型', + `renew_date` datetime DEFAULT NULL COMMENT '续费日期', + `platform_id` int DEFAULT NULL COMMENT '平台ID', + `account_name` varchar(256) DEFAULT NULL COMMENT '平台登录用户名', + `account_passwd` varchar(256) DEFAULT NULL COMMENT '平台登录密码', + `passwd_salt` int DEFAULT NULL COMMENT '密码盐值', + PRIMARY KEY (`id`) USING BTREE, + KEY `idx_product_id` (`product_id`) USING BTREE, + KEY `idx_user_id` (`user_id`) USING BTREE, + KEY `idx_platform_id` (`platform_id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='订阅账号表'; + +-- 17. as_user_sub — 用户订阅关系 +CREATE TABLE IF NOT EXISTS `as_user_sub` ( + `id` bigint NOT NULL COMMENT '主键', + `platform_id` int DEFAULT NULL COMMENT '平台ID', + `capacity` int DEFAULT NULL COMMENT '总容量(席位数)', + `capacity_loaded` int DEFAULT NULL COMMENT '已占用容量', + `plan_id` int DEFAULT NULL COMMENT '订阅计划ID', + `user_id` int DEFAULT NULL COMMENT '用户ID', + `main_account` int DEFAULT NULL COMMENT '主账号ID(关联as_sub_account)', + `region` varchar(64) DEFAULT NULL COMMENT '地区', + `target_ip` varchar(64) DEFAULT NULL COMMENT '目标IP(区域限制用)', + `remark` int DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`id`) USING BTREE, + KEY `idx_user_id` (`user_id`) USING BTREE, + KEY `idx_plan_id` (`plan_id`) USING BTREE, + KEY `idx_main_account` (`main_account`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户订阅关系表'; + +SET FOREIGN_KEY_CHECKS = 1; diff --git a/db/update/5.1_to_5.2_update.sql b/db/update/5.1_to_5.2_update.sql new file mode 100644 index 0000000..a10cd9f --- /dev/null +++ b/db/update/5.1_to_5.2_update.sql @@ -0,0 +1,117 @@ +USE pigxx_config; + +DELETE FROM `pigxx_config`.`config_info` WHERE `id` = 10; + +INSERT INTO `pigxx_config`.`config_info`(`id`, `data_id`, `group_id`, `content`, `md5`, `gmt_create`, `gmt_modified`, `src_user`, `src_ip`, `app_name`, `tenant_id`, `c_desc`, `c_use`, `effect`, `type`, `c_schema`, `encrypted_data_key`) VALUES (116, 'pigx-flow-engine-biz-dev.yml', 'DEFAULT_GROUP', '# 数据源\nspring:\n datasource:\n type: com.alibaba.druid.pool.DruidDataSource\n druid:\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: ${MYSQL_USER:root}\n password: ${MYSQL_PWD:root}\n url: jdbc:mysql://${MYSQL_HOST:pigx-mysql}:${MYSQL_PORT:3309}/${MYSQL_DB:pigxx_flow}?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&allowMultiQueries=true&nullCatalogMeansCurrent=true', '233121e20445609e1ba378c3686ea7d5', '2023-07-28 13:41:32', '2023-07-28 13:43:36', 'nacos', '0:0:0:0:0:0:0:1', '', '', 'flowable 工作引擎', '', '', 'yaml', '', ''); + +INSERT INTO `pigxx_config`.`config_info`(`id`, `data_id`, `group_id`, `content`, `md5`, `gmt_create`, `gmt_modified`, `src_user`, `src_ip`, `app_name`, `tenant_id`, `c_desc`, `c_use`, `effect`, `type`, `c_schema`, `encrypted_data_key`) VALUES (117, 'pigx-flow-task-biz-dev.yml', 'DEFAULT_GROUP', '# 数据源\nspring:\n datasource:\n type: com.alibaba.druid.pool.DruidDataSource\n druid:\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: ${MYSQL_USER:root}\n password: ${MYSQL_PWD:root}\n url: jdbc:mysql://${MYSQL_HOST:pigx-mysql}:${MYSQL_PORT:3309}/${MYSQL_DB:pigxx_flow}?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&allowMultiQueries=true&nullCatalogMeansCurrent=true\n\n# 租户表维护\npigx:\n tenant:\n column: tenant_id\n tables:\n - process\n - process_copy\n - process_group\n - process_instance_record\n - process_node_data\n - process_node_record\n - process_node_record_assign_user\n - process_starter', 'bdead04cdd3666d04786f69e5fb32633', '2023-07-28 13:44:25', '2023-07-28 13:50:08', 'nacos', '0:0:0:0:0:0:0:1', '', '', 'flowable 业务', '', '', 'yaml', '', ''); + +UPDATE `pigxx_config`.`config_info` SET `data_id` = 'application-dev.yml', `group_id` = 'DEFAULT_GROUP', `content` = '# 配置文件加密根密码\njasypt:\n encryptor:\n password: pigx\n algorithm: PBEWithMD5AndDES\n iv-generator-classname: org.jasypt.iv.NoIvGenerator\n\n\nspring:\n redis:\n host: pigx-redis\n servlet:\n multipart:\n max-file-size: 100MB\n max-request-size: 100MB\n cloud:\n sentinel:\n eager: true\n transport:\n dashboard: pigx-sentinel:5020\nfeign:\n sentinel:\n enabled: true\n okhttp:\n enabled: true\n httpclient:\n enabled: false\n connection-timeout: 20000\n compression:\n request:\n enabled: true\n response:\n enabled: true\n\n# 端点对外暴露\nmanagement:\n endpoints:\n web:\n exposure:\n include: \'*\' \n endpoint:\n restart:\n enabled: true\n health:\n show-details: ALWAYS\n\n#开启灰度\ngray:\n rule:\n enabled: true\n\n# mybatis-plus 配置\nmybatis-plus:\n tenant-enable: ture\n mapper-locations: classpath:/mapper/*Mapper.xml\n global-config:\n capitalMode: true\n banner: false\n db-config:\n id-type: auto\n select-strategy: not_empty\n insert-strategy: not_empty\n update-strategy: not_null\n type-handlers-package: com.pig4cloud.pigx.common.data.handler\n configuration:\n jdbc-type-for-null: \'null\'\n call-setters-on-nulls: true\n shrink-whitespaces-in-sql: true\nmybatis-plus-join:\n banner: false #关闭连表查询组件banner', `md5` = '0d8e6819eaf052914700e3e24c20b227', `gmt_create` = '2022-12-16 10:44:25', `gmt_modified` = '2023-09-11 11:57:29', `src_user` = 'nacos', `src_ip` = '127.0.0.1', `app_name` = '', `tenant_id` = '', `c_desc` = '', `c_use` = '', `effect` = '', `type` = 'yaml', `c_schema` = '', `encrypted_data_key` = '' WHERE `id` = 1; + +UPDATE `pigxx_config`.`config_info` SET `data_id` = 'pigx-gateway-dev.yml', `group_id` = 'DEFAULT_GROUP', `content` = 'gateway:\n encode-key: \'pigxpigxpigxpigx\'\n\n# 验证码相关配置参考: http://t.cn/A647jEdu\naj:\n captcha:\n cache-type: redis\n water-mark: pig4cloud\n\n# 固定路由转发配置 无修改\nspring:\n cloud:\n gateway:\n routes:\n - id: openapi\n uri: lb://pigx-gateway\n predicates:\n - Path=/v3/api-docs/**\n filters:\n - RewritePath=/v3/api-docs/(?.*), /$\\{path}/$\\{path}/v3/api-docs\n\n# gateway 刷新端点\nmanagement:\n endpoint:\n gateway:\n enabled: true\n', `md5` = 'd138f5bafa91ab76dca8c4c1a01c1de2', `gmt_create` = '2022-12-16 10:44:25', `gmt_modified` = '2023-07-28 16:49:29', `src_user` = 'nacos', `src_ip` = '0:0:0:0:0:0:0:1', `app_name` = '', `tenant_id` = '', `c_desc` = '', `c_use` = '', `effect` = '', `type` = 'yaml', `c_schema` = '', `encrypted_data_key` = '' WHERE `id` = 5; + +UPDATE `pigxx_config`.`config_info` SET `data_id` = 'pigx-upms-biz-dev.yml', `group_id` = 'DEFAULT_GROUP', `content` = '## spring security 配置\nsecurity:\n oauth2:\n client:\n ignore-urls:\n - /druid/**\n\n# 数据源\nspring:\n autoconfigure:\n exclude: org.springframework.cloud.gateway.config.GatewayAutoConfiguration,org.springframework.cloud.gateway.config.GatewayClassPathWarningAutoConfiguration\n datasource:\n type: com.alibaba.druid.pool.DruidDataSource\n druid:\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: ${MYSQL_USER:root}\n password: ${MYSQL_PWD:root}\n url: jdbc:mysql://${MYSQL_HOST:pigx-mysql}:${MYSQL_PORT:3309}/${MYSQL_DB:pigxx}?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&allowMultiQueries=true&allowPublicKeyRetrieval=true\n stat-view-servlet:\n enabled: true\n allow: \"\"\n url-pattern: /druid/*\n #login-username: admin\n #login-password: admin\n filter:\n stat:\n enabled: true\n log-slow-sql: true\n slow-sql-millis: 10000\n merge-sql: false\n wall:\n config:\n multi-statement-allow: true\n\n# 本地文件系统\nfile:\n local:\n enable: true\n basePath: /Users/lengleng/Downloads/files\n\n# Logger Config\nlogging:\n level:\n com.pig4cloud.pigx.admin.mapper: debug\n\n# 租户表维护\npigx:\n tenant:\n column: tenant_id\n tables:\n - sys_user\n - sys_role\n - sys_menu\n - sys_dept\n - sys_log\n - sys_social_details\n - sys_dict\n - sys_dict_item\n - sys_public_param\n - sys_log\n - sys_file\n - sys_file_group\n - sys_oauth_client_details\n - sys_post', `md5` = 'a37e3dc8cf649be64bd35cc5e5e355a9', `gmt_create` = '2022-12-16 10:44:25', `gmt_modified` = '2023-07-28 13:47:59', `src_user` = 'nacos', `src_ip` = '0:0:0:0:0:0:0:1', `app_name` = '', `tenant_id` = '', `c_desc` = '', `c_use` = '', `effect` = '', `type` = 'yaml', `c_schema` = '', `encrypted_data_key` = '' WHERE `id` = 7; + +UPDATE `pigxx_config`.`config_info` SET `data_id` = 'pigx-jimu-platform-dev.yml', `group_id` = 'DEFAULT_GROUP', `content` = 'spring:\n #配置静态资源\n mvc:\n static-path-pattern: /**\n resource:\n static-locations: classpath:/static/\n #配置数据库\n datasource:\n type: com.alibaba.druid.pool.DruidDataSource\n druid:\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: ${MYSQL_USER:root}\n password: ${MYSQL_PWD:root}\n url: jdbc:mysql://${MYSQL_HOST:pigx-mysql}:${MYSQL_PORT:3309}/${MYSQL_DB:pigxx_bi}?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&allowMultiQueries=true&allowPublicKeyRetrieval=true\n \n#JimuReport[minidao配置]\nminidao :\n base-package: org.jeecg.modules.jmreport.desreport.dao*\n db-type: mysql\n#JimuReport[上传配置]\njeecg :\n jmreport:\n saas: true\n openTenant: true\n #saasMode: tenant\n customPrePath: /api/jimu\n # 自动保存\n autoSave: true\n # 单位毫秒 默认5*60*1000 \n interval: 10000\n # local|minio|alioss\n uploadType: local\n # local\n path :\n #文件路径A\n upload: ~/jimu/data\n # alioss\n oss:\n endpoint: oss-cn-beijing.aliyuncs.com\n accessKey: ??\n secretKey: ??\n staticDomain: ??\n bucketName: ??\n # minio\n minio:\n minio_url: http://minio.jeecg.com\n minio_name: ??\n minio_pass: ??\n bucketName: ??\n#输出sql日志\nlogging:\n level:\n org.jeecg.modules.jmreport : debug', `md5` = '1397b44dcc28a7fb5fd455805b932983', `gmt_create` = '2022-12-16 10:44:25', `gmt_modified` = '2023-09-08 13:06:11', `src_user` = 'nacos', `src_ip` = '0:0:0:0:0:0:0:1', `app_name` = '', `tenant_id` = '', `c_desc` = '', `c_use` = '', `effect` = '', `type` = 'yaml', `c_schema` = '', `encrypted_data_key` = '' WHERE `id` = 14; + +USE pigxx; + +CREATE TABLE `pigxx`.`sys_file_group` ( + `id` bigint(0) UNSIGNED NOT NULL COMMENT '主键ID', + `type` tinyint(0) UNSIGNED NULL DEFAULT 10 COMMENT '类型: [10=图片, 20=视频]', + `name` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '分类名称', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '删除标记', + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建人', + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '修改人', + `tenant_id` bigint(0) NULL DEFAULT NULL COMMENT '租户', + `pid` bigint(0) NULL DEFAULT NULL COMMENT '父ID', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '文件分类表' ROW_FORMAT = DYNAMIC; + +ALTER TABLE `pigxx`.`sys_tenant` ADD COLUMN `website_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '网站名称' AFTER `tenant_domain`; + +ALTER TABLE `pigxx`.`sys_tenant` ADD COLUMN `mini_qr` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '移动端二维码' AFTER `website_name`; + +ALTER TABLE `pigxx`.`sys_tenant` ADD COLUMN `background` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '登录页背景图' AFTER `mini_qr`; + +ALTER TABLE `pigxx`.`sys_tenant` ADD COLUMN `footer` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '页脚信息' AFTER `background`; + +ALTER TABLE `pigxx`.`sys_tenant` ADD COLUMN `logo` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'logo' AFTER `footer`; + +ALTER TABLE `pigxx`.`sys_tenant` MODIFY COLUMN `id` bigint(0) NOT NULL COMMENT '租户ID' FIRST; + +ALTER TABLE `pigxx`.`sys_tenant` MODIFY COLUMN `menu_id` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '租户菜单ID' AFTER `update_time`; + +DROP TABLE `pigxx`.`sys_tenant_menu`; + +DELETE FROM `pigxx`.`sys_menu` WHERE `menu_id` = 6009; + +DELETE FROM `pigxx`.`sys_menu` WHERE `menu_id` = 6010; + +DELETE FROM `pigxx`.`sys_menu` WHERE `menu_id` = 6011; + +DELETE FROM `pigxx`.`sys_menu` WHERE `menu_id` = 6012; + +DELETE FROM `pigxx`.`sys_menu` WHERE `menu_id` = 6013; + +DELETE FROM `pigxx`.`sys_menu` WHERE `menu_id` = 6014; + +DELETE FROM `pigxx`.`sys_menu` WHERE `menu_id` = 6015; + +DELETE FROM `pigxx`.`sys_menu` WHERE `menu_id` = 6016; + +DELETE FROM `pigxx`.`sys_menu` WHERE `menu_id` = 6017; + +DELETE FROM `pigxx`.`sys_menu` WHERE `menu_id` = 6018; + +DELETE FROM `pigxx`.`sys_menu` WHERE `menu_id` = 6019; + +UPDATE `pigxx`.`sys_menu` SET `name` = '协同办公', `permission` = NULL, `path` = '/flow', `parent_id` = -1, `icon` = 'ele-Present', `visible` = '1', `sort_order` = 5, `keep_alive` = '0', `embedded` = '0', `menu_type` = '0', `create_by` = 'admin', `create_time` = '2023-03-02 16:36:49', `update_by` = 'admin', `update_time` = '2023-07-27 13:12:32', `del_flag` = '0', `tenant_id` = 1 WHERE `menu_id` = 6000; + +UPDATE `pigxx`.`sys_menu` SET `name` = '流程管理', `permission` = NULL, `path` = '/flow/group/index', `parent_id` = 6000, `icon` = 'iconfont icon-gongju', `visible` = '1', `sort_order` = 0, `keep_alive` = '0', `embedded` = '0', `menu_type` = '0', `create_by` = 'admin', `create_time` = '2023-03-02 16:37:55', `update_by` = 'admin', `update_time` = '2023-07-27 13:12:42', `del_flag` = '0', `tenant_id` = 1 WHERE `menu_id` = 6001; + +UPDATE `pigxx`.`sys_menu` SET `name` = '创建流程', `permission` = NULL, `path` = '/flow/create/all', `parent_id` = 6000, `icon` = 'fa fa-arrow-circle-right', `visible` = '0', `sort_order` = 2, `keep_alive` = '0', `embedded` = NULL, `menu_type` = '0', `create_by` = '', `create_time` = '2023-07-27 13:14:56', `update_by` = 'admin', `update_time` = '2023-07-27 13:32:32', `del_flag` = '0', `tenant_id` = 1 WHERE `menu_id` = 6002; + +UPDATE `pigxx`.`sys_menu` SET `name` = '发起流程', `permission` = NULL, `path` = '/flow/list/index', `parent_id` = 6000, `icon` = 'fa fa-play', `visible` = '1', `sort_order` = 1, `keep_alive` = '0', `embedded` = '0', `menu_type` = '0', `create_by` = 'admin', `create_time` = '2023-03-02 18:18:10', `update_by` = 'admin', `update_time` = '2023-07-27 13:29:00', `del_flag` = '0', `tenant_id` = 1 WHERE `menu_id` = 6003; + +UPDATE `pigxx`.`sys_menu` SET `name` = '任务管理', `permission` = NULL, `path` = '/task', `parent_id` = 6000, `icon` = 'fa fa-th', `visible` = '1', `sort_order` = 2, `keep_alive` = '0', `embedded` = '0', `menu_type` = '0', `create_by` = 'admin', `create_time` = '2023-03-02 22:13:29', `update_by` = 'admin', `update_time` = '2023-07-27 13:29:17', `del_flag` = '0', `tenant_id` = 1 WHERE `menu_id` = 6004; + +UPDATE `pigxx`.`sys_menu` SET `name` = '代办任务', `permission` = NULL, `path` = '/task/pending', `parent_id` = 6004, `icon` = 'fa fa-flag-checkered', `visible` = '1', `sort_order` = 0, `keep_alive` = '0', `embedded` = '0', `menu_type` = '0', `create_by` = 'admin', `create_time` = '2023-03-02 22:59:35', `update_by` = 'admin', `update_time` = '2023-07-27 13:32:18', `del_flag` = '0', `tenant_id` = 1 WHERE `menu_id` = 6005; + +UPDATE `pigxx`.`sys_menu` SET `name` = '我的已办', `permission` = NULL, `path` = '/task/completed', `parent_id` = 6004, `icon` = 'fa fa-hand-o-right', `visible` = '1', `sort_order` = 3, `keep_alive` = '0', `embedded` = '0', `menu_type` = '0', `create_by` = 'admin', `create_time` = '2023-03-02 23:23:13', `update_by` = 'admin', `update_time` = '2023-07-27 13:30:51', `del_flag` = '0', `tenant_id` = 1 WHERE `menu_id` = 6006; + +UPDATE `pigxx`.`sys_menu` SET `name` = '我的发起', `permission` = NULL, `path` = '/task/started', `parent_id` = 6004, `icon` = 'fa fa-plane', `visible` = '1', `sort_order` = 1, `keep_alive` = '0', `embedded` = NULL, `menu_type` = '0', `create_by` = '', `create_time` = '2023-07-27 13:14:51', `update_by` = 'admin', `update_time` = '2023-07-27 13:29:47', `del_flag` = '0', `tenant_id` = 1 WHERE `menu_id` = 6007; + +UPDATE `pigxx`.`sys_menu` SET `name` = '抄送给我', `permission` = NULL, `path` = '/task/cc', `parent_id` = 6004, `icon` = 'fa fa-arrow-circle-right', `visible` = '1', `sort_order` = 2, `keep_alive` = '0', `embedded` = NULL, `menu_type` = '0', `create_by` = '', `create_time` = '2023-07-27 13:14:56', `update_by` = 'admin', `update_time` = '2023-07-27 13:32:32', `del_flag` = '0', `tenant_id` = 1 WHERE `menu_id` = 6008; + +USE pigxx_codegen; + +ALTER TABLE `pigxx_codegen`.`gen_table` AUTO_INCREMENT = 0; + +ALTER TABLE `pigxx_codegen`.`gen_group` MODIFY COLUMN `id` bigint(0) NOT NULL FIRST; + +ALTER TABLE `pigxx_codegen`.`gen_group` MODIFY COLUMN `tenant_id` bigint(0) NOT NULL COMMENT '租户ID' AFTER `group_desc`; + +ALTER TABLE `pigxx_codegen`.`gen_table` MODIFY COLUMN `i18n` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '是否生成带有i18n 0 不带有 1带有' AFTER `version`; + +ALTER TABLE `pigxx_codegen`.`gen_table` MODIFY COLUMN `style` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '代码风格' AFTER `i18n`; + +ALTER TABLE `pigxx_codegen`.`gen_table` MODIFY COLUMN `generator_type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '生成方式 0:zip压缩包 1:自定义目录' AFTER `child_field`; + +ALTER TABLE `pigxx_codegen`.`gen_table` MODIFY COLUMN `form_layout` tinyint(0) NULL DEFAULT NULL COMMENT '表单布局 1:一列 2:两列' AFTER `function_name`; + +ALTER TABLE `pigxx_codegen`.`gen_table_column` MODIFY COLUMN `primary_pk` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '主键 0:否 1:是' AFTER `auto_fill`; + +ALTER TABLE `pigxx_codegen`.`gen_table_column` MODIFY COLUMN `base_field` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '基类字段 0:否 1:是' AFTER `primary_pk`; + +ALTER TABLE `pigxx_codegen`.`gen_table_column` MODIFY COLUMN `form_item` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '表单项 0:否 1:是' AFTER `base_field`; + +ALTER TABLE `pigxx_codegen`.`gen_table_column` MODIFY COLUMN `form_required` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '表单必填 0:否 1:是' AFTER `form_item`; + +ALTER TABLE `pigxx_codegen`.`gen_table_column` MODIFY COLUMN `grid_item` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '列表项 0:否 1:是' AFTER `form_validator`; + +ALTER TABLE `pigxx_codegen`.`gen_table_column` MODIFY COLUMN `grid_sort` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '列表排序 0:否 1:是' AFTER `grid_item`; + +ALTER TABLE `pigxx_codegen`.`gen_table_column` MODIFY COLUMN `query_item` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '查询项 0:否 1:是' AFTER `grid_sort`; diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..264ca98 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,201 @@ +# 使用说明 V5.2 +# 1. 使用docker-compose 宿主机不需要配置host来发现 +# 2. 无需修改源码,根目录 docker-compose up 即可 +# 3. 静静等待服务启动 + +version: '3' +services: + pigx-mysql: + build: + context: ./db + environment: + MYSQL_ROOT_HOST: "%" + MYSQL_ROOT_PASSWORD: root + restart: always + container_name: pigx-mysql + image: pigx-mysql + volumes: + - ./pigx-mysql:/var/lib/mysql + command: --lower_case_table_names=1 + networks: + - spring_cloud_default + + pigx-redis: + container_name: pigx-redis + image: redis:6.2.6 + restart: always + networks: + - spring_cloud_default + + pigx-register: + build: + context: ./pigx-register + restart: always + container_name: pigx-register + image: pigx-register + ports: + - 8848:8848 + networks: + - spring_cloud_default + + pigx-gateway: + build: + context: as-gateway + restart: always + container_name: pigx-gateway + image: pigx-gateway + ports: + - 9999:9999 + networks: + - spring_cloud_default + + pigx-auth: + build: + context: ./pigx-auth + restart: always + container_name: pigx-auth + image: pigx-auth + networks: + - spring_cloud_default + + pigx-upms: + build: + context: as-upms/as-upms-biz + restart: always + container_name: pigx-upms + image: pigx-upms + networks: + - spring_cloud_default + + pigx-flow-task: + build: + context: ./pigx-flow/pigx-flow-task/pigx-flow-task-biz + restart: always + container_name: pigx-flow-task + image: pigx-flow-task + networks: + - spring_cloud_default + + pigx-flow-engine: + build: + context: ./pigx-flow/pigx-flow-engine/pigx-flow-engine-biz + restart: always + container_name: pigx-flow-engine + image: pigx-flow-engine + networks: + - spring_cloud_default + + pigx-app-server: + build: + context: ./pigx-app-server/pigx-app-server-biz + restart: always + container_name: pigx-app-server + image: pigx-app-server + networks: + - spring_cloud_default + + pigx-monitor: + build: + context: ./pigx-visual/pigx-monitor + restart: always + image: pigx-monitor + container_name: pigx-monitor + ports: + - 5001:5001 + networks: + - spring_cloud_default + + pigx-daemon-quartz: + build: + context: ./pigx-visual/pigx-daemon-quartz + restart: always + image: pigx-daemon-quartz + container_name: pigx-daemon-quartz + networks: + - spring_cloud_default + + pigx-daemon-elastic-job: + build: + context: ./pigx-visual/pigx-daemon-elastic-job + restart: always + image: pigx-daemon-elastic-job + container_name: pigx-daemon-elastic-job + networks: + - spring_cloud_default + + pigx-codegen: + build: + context: ./pigx-visual/pigx-codegen + restart: always + image: pigx-codegen + container_name: pigx-codegen + networks: + - spring_cloud_default + + pigx-mp-platform: + build: + context: ./pigx-visual/pigx-mp-platform + restart: always + image: pigx-mp-platform + container_name: pigx-mp-platform + networks: + - spring_cloud_default + + pigx-pay-platform: + build: + context: ./pigx-visual/pigx-pay-platform + restart: always + image: pigx-pay-platform + container_name: pigx-pay-platform + networks: + - spring_cloud_default + + pigx-report-platform: + build: + context: ./pigx-visual/pigx-report-platform + restart: always + image: pigx-report-platform + container_name: pigx-report-platform + ports: + - 9095:9095 + networks: + - spring_cloud_default + + pigx-jimu-platform: + build: + context: ./pigx-visual/pigx-jimu-platform + restart: always + image: pigx-jimu-platform + container_name: pigx-jimu-platform + ports: + - 5008:5008 + networks: + - spring_cloud_default + + pigxx-job: + build: + context: ./pigx-visual/pigx-xxl-job-admin + restart: always + container_name: pigx-job + hostname: pigx-job + image: pigx-job + ports: + - 9080:9080 + networks: + - spring_cloud_default + + pigx-sentinel: + build: + context: ./pigx-visual/pigx-sentinel-dashboard + restart: always + image: pigx-sentinel + container_name: pigx-sentinel + ports: + - 5020:5020 + networks: + - spring_cloud_default + +networks: + spring_cloud_default: + name: spring_cloud_default + driver: bridge diff --git a/logs/as-app-server-biz/2023-11/debug.2023-11-14.0.log.gz b/logs/as-app-server-biz/2023-11/debug.2023-11-14.0.log.gz new file mode 100644 index 0000000..c9f2644 Binary files /dev/null and b/logs/as-app-server-biz/2023-11/debug.2023-11-14.0.log.gz differ diff --git a/logs/as-gateway/2023-11/debug.2023-11-14.0.log.gz b/logs/as-gateway/2023-11/debug.2023-11-14.0.log.gz new file mode 100644 index 0000000..b2e3d74 Binary files /dev/null and b/logs/as-gateway/2023-11/debug.2023-11-14.0.log.gz differ diff --git a/logs/as-gateway/2023-11/error.2023-11-14.0.log.gz b/logs/as-gateway/2023-11/error.2023-11-14.0.log.gz new file mode 100644 index 0000000..490da88 Binary files /dev/null and b/logs/as-gateway/2023-11/error.2023-11-14.0.log.gz differ diff --git a/logs/as-upms-biz/2023-11/debug.2023-11-13.0.log.gz b/logs/as-upms-biz/2023-11/debug.2023-11-13.0.log.gz new file mode 100644 index 0000000..2fe0379 Binary files /dev/null and b/logs/as-upms-biz/2023-11/debug.2023-11-13.0.log.gz differ diff --git a/logs/as-upms-biz/2023-11/debug.2023-11-14.0.log.gz b/logs/as-upms-biz/2023-11/debug.2023-11-14.0.log.gz new file mode 100644 index 0000000..ca3ed70 Binary files /dev/null and b/logs/as-upms-biz/2023-11/debug.2023-11-14.0.log.gz differ diff --git a/logs/as-upms-biz/2023-11/error.2023-11-14.0.log.gz b/logs/as-upms-biz/2023-11/error.2023-11-14.0.log.gz new file mode 100644 index 0000000..0b0b56c Binary files /dev/null and b/logs/as-upms-biz/2023-11/error.2023-11-14.0.log.gz differ diff --git a/logs/pigx-auth/2023-11/debug.2023-11-14.0.log.gz b/logs/pigx-auth/2023-11/debug.2023-11-14.0.log.gz new file mode 100644 index 0000000..58d92d6 Binary files /dev/null and b/logs/pigx-auth/2023-11/debug.2023-11-14.0.log.gz differ diff --git a/logs/pigx-auth/2023-11/error.2023-11-14.0.log.gz b/logs/pigx-auth/2023-11/error.2023-11-14.0.log.gz new file mode 100644 index 0000000..00da3c0 Binary files /dev/null and b/logs/pigx-auth/2023-11/error.2023-11-14.0.log.gz differ diff --git a/pigx-auth/Dockerfile b/pigx-auth/Dockerfile new file mode 100644 index 0000000..ae17b57 --- /dev/null +++ b/pigx-auth/Dockerfile @@ -0,0 +1,18 @@ +FROM pig4cloud/java:8-jre + +MAINTAINER wangiegie@gmail.com + +ENV TZ=Asia/Shanghai +ENV JAVA_OPTS="-Xms128m -Xmx256m -Djava.security.egd=file:/dev/./urandom" + +RUN ln -sf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone + +RUN mkdir -p /pigx-auth + +WORKDIR /pigx-auth + +EXPOSE 3000 + +ADD ./target/pigx-auth.jar ./ + +CMD sleep 120;java $JAVA_OPTS -jar pigx-auth.jar diff --git a/pigx-auth/pom.xml b/pigx-auth/pom.xml new file mode 100644 index 0000000..c8e9e36 --- /dev/null +++ b/pigx-auth/pom.xml @@ -0,0 +1,97 @@ + + + 4.0.0 + + com.pig4cloud + pigx + 5.2.0 + + + pigx-auth + jar + + pigx 认证授权中心,基于 spring security oAuth2 + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-config + + + + com.pig4cloud + pigx-common-log + + + + com.pig4cloud + pigx-common-security + + + + com.pig4cloud + pigx-common-feign + + + + com.pig4cloud + pigx-common-data + + + + com.pig4cloud + pigx-common-sentinel + + + + com.pig4cloud + pigx-common-gray + + + + org.springframework.boot + spring-boot-starter-freemarker + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-undertow + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + org.apache.maven.plugins + maven-deploy-plugin + + true + + + + io.fabric8 + docker-maven-plugin + + false + + + + + + diff --git a/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/PigxAuthApplication.java b/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/PigxAuthApplication.java new file mode 100644 index 0000000..57e8c87 --- /dev/null +++ b/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/PigxAuthApplication.java @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.pig4cloud.pigx.auth; + +import com.pig4cloud.pigx.common.feign.annotation.EnablePigxFeignClients; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.client.discovery.EnableDiscoveryClient; + +/** + * @author lengleng + * @date 2018年06月21日 认证授权中心 + */ +@EnablePigxFeignClients +@EnableDiscoveryClient +@SpringBootApplication +public class PigxAuthApplication { + + public static void main(String[] args) { + SpringApplication.run(PigxAuthApplication.class, args); + } + +} diff --git a/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/config/AuthorizationServerConfiguration.java b/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/config/AuthorizationServerConfiguration.java new file mode 100644 index 0000000..a2ec7a6 --- /dev/null +++ b/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/config/AuthorizationServerConfiguration.java @@ -0,0 +1,159 @@ +/* + * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.pig4cloud.pigx.auth.config; + +import com.pig4cloud.pigx.auth.support.CustomeOAuth2AccessTokenGenerator; +import com.pig4cloud.pigx.auth.support.core.CustomeOAuth2TokenCustomizer; +import com.pig4cloud.pigx.auth.support.core.FormIdentityLoginConfigurer; +import com.pig4cloud.pigx.auth.support.core.PigxDaoAuthenticationProvider; +import com.pig4cloud.pigx.auth.support.handler.PigxAuthenticationFailureEventHandler; +import com.pig4cloud.pigx.auth.support.handler.PigxAuthenticationSuccessEventHandler; +import com.pig4cloud.pigx.auth.support.password.OAuth2ResourceOwnerPasswordAuthenticationConverter; +import com.pig4cloud.pigx.auth.support.password.OAuth2ResourceOwnerPasswordAuthenticationProvider; +import com.pig4cloud.pigx.auth.support.sms.OAuth2ResourceOwnerSmsAuthenticationConverter; +import com.pig4cloud.pigx.auth.support.sms.OAuth2ResourceOwnerSmsAuthenticationProvider; +import com.pig4cloud.pigx.common.core.constant.SecurityConstants; +import com.pig4cloud.pigx.common.security.handler.FormAuthenticationFailureHandler; +import com.pig4cloud.pigx.common.security.handler.SsoLogoutSuccessHandler; +import lombok.RequiredArgsConstructor; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationService; +import org.springframework.security.oauth2.server.authorization.config.annotation.web.configurers.OAuth2AuthorizationServerConfigurer; +import org.springframework.security.oauth2.server.authorization.settings.AuthorizationServerSettings; +import org.springframework.security.oauth2.server.authorization.token.DelegatingOAuth2TokenGenerator; +import org.springframework.security.oauth2.server.authorization.token.OAuth2RefreshTokenGenerator; +import org.springframework.security.oauth2.server.authorization.token.OAuth2TokenGenerator; +import org.springframework.security.oauth2.server.authorization.web.authentication.*; +import org.springframework.security.web.DefaultSecurityFilterChain; +import org.springframework.security.web.SecurityFilterChain; +import org.springframework.security.web.authentication.AuthenticationConverter; +import org.springframework.security.web.authentication.AuthenticationFailureHandler; +import org.springframework.security.web.authentication.logout.LogoutSuccessHandler; + +import java.util.Arrays; + +/** + * @author lengleng + * @date 2022/5/27 + * + * 认证服务器配置 + */ +@Configuration +@RequiredArgsConstructor +public class AuthorizationServerConfiguration { + + private final OAuth2AuthorizationService authorizationService; + + @Bean + @Order(Ordered.HIGHEST_PRECEDENCE) + public SecurityFilterChain authorizationServerSecurityFilterChain(HttpSecurity http, + PigxAuthenticationSuccessEventHandler successEventHandler, + PigxAuthenticationFailureEventHandler failureEventHandler) throws Exception { + OAuth2AuthorizationServerConfigurer authorizationServerConfigurer = new OAuth2AuthorizationServerConfigurer(); + + http.apply(authorizationServerConfigurer.tokenEndpoint((tokenEndpoint) -> {// 个性化认证授权端点 + tokenEndpoint.accessTokenRequestConverter(accessTokenRequestConverter()) // 注入自定义的授权认证Converter + .accessTokenResponseHandler(successEventHandler) // 登录成功处理器 + .errorResponseHandler(failureEventHandler);// 登录失败处理器 + }).clientAuthentication(oAuth2ClientAuthenticationConfigurer -> // 个性化客户端认证 + oAuth2ClientAuthenticationConfigurer.errorResponseHandler(failureEventHandler))// 处理客户端认证异常 + .authorizationEndpoint(authorizationEndpoint -> authorizationEndpoint// 授权码端点个性化confirm页面 + .consentPage(SecurityConstants.CUSTOM_CONSENT_PAGE_URI))); + + DefaultSecurityFilterChain securityFilterChain = http.authorizeHttpRequests(authorizeRequests -> { + // 自定义接口、端点暴露 + authorizeRequests.antMatchers("/token/**", "/actuator/**", "/css/**", "/error").permitAll(); + authorizeRequests.anyRequest().authenticated(); + }).apply(authorizationServerConfigurer.authorizationService(authorizationService)// redis存储token的实现 + .authorizationServerSettings( + AuthorizationServerSettings.builder().issuer(SecurityConstants.PIGX_LICENSE).build())) + // 授权码登录的登录页个性化 + .and().apply(new FormIdentityLoginConfigurer()).and().build(); + + // 注入自定义授权模式实现 + addCustomOAuth2GrantAuthenticationProvider(http); + return securityFilterChain; + } + + /** + * 令牌生成规则实现
+ * client:username:uuid + * @return OAuth2TokenGenerator + */ + @Bean + public OAuth2TokenGenerator oAuth2TokenGenerator() { + CustomeOAuth2AccessTokenGenerator accessTokenGenerator = new CustomeOAuth2AccessTokenGenerator(); + // 注入Token 增加关联用户信息 + accessTokenGenerator.setAccessTokenCustomizer(new CustomeOAuth2TokenCustomizer()); + return new DelegatingOAuth2TokenGenerator(accessTokenGenerator, new OAuth2RefreshTokenGenerator()); + } + + @Bean + public AuthenticationFailureHandler authenticationFailureHandler() { + return new FormAuthenticationFailureHandler(); + } + + @Bean + public LogoutSuccessHandler logoutSuccessHandler() { + return new SsoLogoutSuccessHandler(); + } + + /** + * request -> xToken 注入请求转换器 + * @return DelegatingAuthenticationConverter + */ + private AuthenticationConverter accessTokenRequestConverter() { + return new DelegatingAuthenticationConverter(Arrays.asList( + new OAuth2ResourceOwnerPasswordAuthenticationConverter(), + new OAuth2ResourceOwnerSmsAuthenticationConverter(), new OAuth2RefreshTokenAuthenticationConverter(), + new OAuth2ClientCredentialsAuthenticationConverter(), + new OAuth2AuthorizationCodeAuthenticationConverter(), + new OAuth2AuthorizationCodeRequestAuthenticationConverter())); + } + + /** + * 注入授权模式实现提供方 + * + * 1. 密码模式
+ * 2. 短信登录
+ * + */ + @SuppressWarnings("unchecked") + private void addCustomOAuth2GrantAuthenticationProvider(HttpSecurity http) { + AuthenticationManager authenticationManager = http.getSharedObject(AuthenticationManager.class); + OAuth2AuthorizationService authorizationService = http.getSharedObject(OAuth2AuthorizationService.class); + + OAuth2ResourceOwnerPasswordAuthenticationProvider resourceOwnerPasswordAuthenticationProvider = new OAuth2ResourceOwnerPasswordAuthenticationProvider( + authenticationManager, authorizationService, oAuth2TokenGenerator()); + + OAuth2ResourceOwnerSmsAuthenticationProvider resourceOwnerSmsAuthenticationProvider = new OAuth2ResourceOwnerSmsAuthenticationProvider( + authenticationManager, authorizationService, oAuth2TokenGenerator()); + + // 处理 UsernamePasswordAuthenticationToken + http.authenticationProvider(new PigxDaoAuthenticationProvider()); + // 处理 OAuth2ResourceOwnerPasswordAuthenticationToken + http.authenticationProvider(resourceOwnerPasswordAuthenticationProvider); + // 处理 OAuth2ResourceOwnerSmsAuthenticationToken + http.authenticationProvider(resourceOwnerSmsAuthenticationProvider); + } + +} diff --git a/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/endpoint/PigxTokenEndpoint.java b/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/endpoint/PigxTokenEndpoint.java new file mode 100644 index 0000000..dc3af05 --- /dev/null +++ b/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/endpoint/PigxTokenEndpoint.java @@ -0,0 +1,260 @@ +/* + * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.pig4cloud.pigx.auth.endpoint; + +import cn.hutool.core.date.DatePattern; +import cn.hutool.core.date.TemporalAccessorUtil; +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.pig4cloud.pigx.admin.api.entity.SysOauthClientDetails; +import com.pig4cloud.pigx.admin.api.entity.SysTenant; +import com.pig4cloud.pigx.admin.api.feign.RemoteClientDetailsService; +import com.pig4cloud.pigx.admin.api.feign.RemoteTenantService; +import com.pig4cloud.pigx.admin.api.vo.TokenVo; +import com.pig4cloud.pigx.auth.support.handler.PigxAuthenticationFailureEventHandler; +import com.pig4cloud.pigx.common.core.constant.CacheConstants; +import com.pig4cloud.pigx.common.core.constant.CommonConstants; +import com.pig4cloud.pigx.common.core.constant.SecurityConstants; +import com.pig4cloud.pigx.common.core.util.KeyStrResolver; +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.common.core.util.RetOps; +import com.pig4cloud.pigx.common.core.util.SpringContextHolder; +import com.pig4cloud.pigx.common.security.annotation.Inner; +import com.pig4cloud.pigx.common.security.service.PigxUser; +import com.pig4cloud.pigx.common.security.util.OAuth2ErrorCodesExpand; +import com.pig4cloud.pigx.common.security.util.OAuthClientException; +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.springframework.cache.CacheManager; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.server.ServletServerHttpResponse; +import org.springframework.security.authentication.event.LogoutSuccessEvent; +import org.springframework.security.core.Authentication; +import org.springframework.security.oauth2.core.OAuth2AccessToken; +import org.springframework.security.oauth2.core.endpoint.OAuth2ParameterNames; +import org.springframework.security.oauth2.server.authorization.OAuth2Authorization; +import org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationService; +import org.springframework.security.oauth2.server.authorization.OAuth2TokenType; +import org.springframework.security.oauth2.server.resource.InvalidBearerTokenException; +import org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationToken; +import org.springframework.util.StringUtils; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.servlet.ModelAndView; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.security.Principal; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * @author lengleng + * @date 2019/2/1 删除token端点 + */ +@Slf4j +@RestController +@RequiredArgsConstructor +@RequestMapping("/token") +public class PigxTokenEndpoint { + + private final PigxAuthenticationFailureEventHandler authenticationFailureHandler; + + private final OAuth2AuthorizationService authorizationService; + + private final RemoteClientDetailsService clientDetailsService; + + private final RedisTemplate redisTemplate; + + private final RemoteTenantService tenantService; + + private final KeyStrResolver tenantKeyStrResolver; + + private final CacheManager cacheManager; + + /** + * 认证页面 + * @param modelAndView + * @param error 表单登录失败处理回调的错误信息 + * @return ModelAndView + */ + @GetMapping("/login") + public ModelAndView require(ModelAndView modelAndView, @RequestParam(required = false) String error) { + modelAndView.setViewName("ftl/login"); + modelAndView.addObject("error", error); + + R> tenantList = tenantService.list(SecurityConstants.FROM_IN); + modelAndView.addObject("tenantList", tenantList.getData()); + return modelAndView; + } + + @GetMapping("/confirm_access") + public ModelAndView confirm(Principal principal, ModelAndView modelAndView, + @RequestParam(OAuth2ParameterNames.CLIENT_ID) String clientId, + @RequestParam(OAuth2ParameterNames.SCOPE) String scope, + @RequestParam(OAuth2ParameterNames.STATE) String state) { + SysOauthClientDetails clientDetails = RetOps + .of(clientDetailsService.getClientDetailsById(clientId, SecurityConstants.FROM_IN)).getData() + .orElseThrow(() -> new OAuthClientException("clientId 不合法")); + + Set authorizedScopes = StringUtils.commaDelimitedListToSet(clientDetails.getScope()); + modelAndView.addObject("clientId", clientId); + modelAndView.addObject("state", state); + modelAndView.addObject("scopeList", authorizedScopes); + modelAndView.addObject("principalName", principal.getName()); + modelAndView.setViewName("ftl/confirm"); + return modelAndView; + } + + /** + * 退出并删除token + * @param authHeader Authorization + */ + @DeleteMapping("/logout") + public R logout(@RequestHeader(value = HttpHeaders.AUTHORIZATION, required = false) String authHeader) { + if (StrUtil.isBlank(authHeader)) { + return R.ok(); + } + + String tokenValue = authHeader.replace(OAuth2AccessToken.TokenType.BEARER.getValue(), StrUtil.EMPTY).trim(); + return removeToken(tokenValue); + } + + /** + * 校验token + * @param token 令牌 + * @return + */ + @SneakyThrows + @GetMapping("/check_token") + public R checkToken(String token, HttpServletResponse response, HttpServletRequest request) { + ServletServerHttpResponse httpResponse = new ServletServerHttpResponse(response); + + if (StrUtil.isBlank(token)) { + httpResponse.setStatusCode(HttpStatus.UNAUTHORIZED); + this.authenticationFailureHandler.onAuthenticationFailure(request, response, + new InvalidBearerTokenException(OAuth2ErrorCodesExpand.TOKEN_MISSING)); + return R.failed(); + } + OAuth2Authorization authorization = authorizationService.findByToken(token, OAuth2TokenType.ACCESS_TOKEN); + + // 如果令牌不存在 返回401 + if (authorization == null || authorization.getAccessToken() == null) { + this.authenticationFailureHandler.onAuthenticationFailure(request, response, + new InvalidBearerTokenException(OAuth2ErrorCodesExpand.INVALID_BEARER_TOKEN)); + } + + // 获取令牌 + return R.ok(Objects.requireNonNull(authorization).getAccessToken().getToken()); + } + + /** + * 令牌管理调用 + * @param token token + */ + @Inner + @DeleteMapping("/{token}") + public R removeToken(@PathVariable("token") String token) { + OAuth2Authorization authorization = authorizationService.findByToken(token, OAuth2TokenType.ACCESS_TOKEN); + if (authorization == null) { + return R.ok(); + } + + OAuth2Authorization.Token accessToken = authorization.getAccessToken(); + if (accessToken == null || StrUtil.isBlank(accessToken.getToken().getTokenValue())) { + return R.ok(); + } + // 清空用户信息 + cacheManager.getCache(CacheConstants.USER_DETAILS).evict(authorization.getPrincipalName()); + // 清空access token + authorizationService.remove(authorization); + // 处理自定义退出事件,保存相关日志 + SpringContextHolder.publishEvent(new LogoutSuccessEvent(new PreAuthenticatedAuthenticationToken( + authorization.getPrincipalName(), authorization.getRegisteredClientId()))); + return R.ok(); + } + + /** + * 查询token + * @param params 分页参数 + * @return + */ + @Inner + @PostMapping("/page") + public R> tokenList(@RequestBody Map params) { + // 根据分页参数获取对应数据 + String key = String.format("%s::%s::*", tenantKeyStrResolver.key(), CacheConstants.PROJECT_OAUTH_ACCESS); + int current = MapUtil.getInt(params, CommonConstants.CURRENT); + int size = MapUtil.getInt(params, CommonConstants.SIZE); + Set keys = redisTemplate.keys(key); + List pages = keys.stream().skip((current - 1) * size).limit(size).collect(Collectors.toList()); + Page result = new Page(current, size); + + List tokenVoList = redisTemplate.opsForValue().multiGet(pages).stream().map(obj -> { + OAuth2Authorization authorization = (OAuth2Authorization) obj; + TokenVo tokenVo = new TokenVo(); + tokenVo.setClientId(authorization.getRegisteredClientId()); + tokenVo.setId(authorization.getId()); + tokenVo.setUsername(authorization.getPrincipalName()); + OAuth2Authorization.Token accessToken = authorization.getAccessToken(); + tokenVo.setAccessToken(accessToken.getToken().getTokenValue()); + + String expiresAt = TemporalAccessorUtil.format(accessToken.getToken().getExpiresAt(), + DatePattern.NORM_DATETIME_PATTERN); + tokenVo.setExpiresAt(expiresAt); + + String issuedAt = TemporalAccessorUtil.format(accessToken.getToken().getIssuedAt(), + DatePattern.NORM_DATETIME_PATTERN); + tokenVo.setIssuedAt(issuedAt); + + Map attributes = authorization.getAttributes(); + Authentication authentication = (Authentication) attributes.get(Principal.class.getName()); + + if (Objects.isNull(authentication)) { + return tokenVo; + } + + PigxUser pigxUser = (PigxUser) authentication.getPrincipal(); + tokenVo.setUserId(pigxUser.getId()); + return tokenVo; + }).filter(tokenVo -> { + // 根据用户名过滤 + String username = MapUtil.getStr(params, SecurityConstants.DETAILS_USERNAME); + if (StrUtil.isBlank(username)) { + return true; + } + return tokenVo.getUsername().contains(username); + }).collect(Collectors.toList()); + result.setRecords(tokenVoList); + result.setTotal(keys.size()); + return R.ok(result); + } + + @Inner + @GetMapping("/query-token") + public R queryToken(String token) { + OAuth2Authorization authorization = authorizationService.findByToken(token, OAuth2TokenType.ACCESS_TOKEN); + return R.ok(authorization); + } + +} diff --git a/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/support/CustomeOAuth2AccessTokenGenerator.java b/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/support/CustomeOAuth2AccessTokenGenerator.java new file mode 100644 index 0000000..eedc4ae --- /dev/null +++ b/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/support/CustomeOAuth2AccessTokenGenerator.java @@ -0,0 +1,119 @@ +package com.pig4cloud.pigx.auth.support; + +import org.springframework.lang.Nullable; +import org.springframework.security.oauth2.core.ClaimAccessor; +import org.springframework.security.oauth2.core.OAuth2AccessToken; +import org.springframework.security.oauth2.core.endpoint.OAuth2ParameterNames; +import org.springframework.security.oauth2.server.authorization.OAuth2TokenType; +import org.springframework.security.oauth2.server.authorization.client.RegisteredClient; +import org.springframework.security.oauth2.server.authorization.settings.OAuth2TokenFormat; +import org.springframework.security.oauth2.server.authorization.token.*; +import org.springframework.util.Assert; +import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; + +import java.time.Instant; +import java.util.Collections; +import java.util.Map; +import java.util.Set; +import java.util.UUID; + +/** + * @author lengleng + * @date 2022/5/29 + */ +public class CustomeOAuth2AccessTokenGenerator implements OAuth2TokenGenerator { + + private OAuth2TokenCustomizer accessTokenCustomizer; + + @Nullable + @Override + public OAuth2AccessToken generate(OAuth2TokenContext context) { + if (!OAuth2TokenType.ACCESS_TOKEN.equals(context.getTokenType()) || !OAuth2TokenFormat.REFERENCE + .equals(context.getRegisteredClient().getTokenSettings().getAccessTokenFormat())) { + return null; + } + + String issuer = null; + if (context.getAuthorizationServerContext() != null) { + issuer = context.getAuthorizationServerContext().getIssuer(); + } + RegisteredClient registeredClient = context.getRegisteredClient(); + + Instant issuedAt = Instant.now(); + Instant expiresAt = issuedAt.plus(registeredClient.getTokenSettings().getAccessTokenTimeToLive()); + + // @formatter:off + OAuth2TokenClaimsSet.Builder claimsBuilder = OAuth2TokenClaimsSet.builder(); + if (StringUtils.hasText(issuer)) { + claimsBuilder.issuer(issuer); + } + claimsBuilder + .subject(context.getPrincipal().getName()) + .audience(Collections.singletonList(registeredClient.getClientId())) + .issuedAt(issuedAt) + .expiresAt(expiresAt) + .notBefore(issuedAt) + .id(UUID.randomUUID().toString()); + if (!CollectionUtils.isEmpty(context.getAuthorizedScopes())) { + claimsBuilder.claim(OAuth2ParameterNames.SCOPE, context.getAuthorizedScopes()); + } + // @formatter:on + + if (this.accessTokenCustomizer != null) { + // @formatter:off + OAuth2TokenClaimsContext.Builder accessTokenContextBuilder = OAuth2TokenClaimsContext.with(claimsBuilder) + .registeredClient(context.getRegisteredClient()) + .principal(context.getPrincipal()) + .authorizationServerContext(context.getAuthorizationServerContext()) + .authorizedScopes(context.getAuthorizedScopes()) + .tokenType(context.getTokenType()) + .authorizationGrantType(context.getAuthorizationGrantType()); + if (context.getAuthorization() != null) { + accessTokenContextBuilder.authorization(context.getAuthorization()); + } + if (context.getAuthorizationGrant() != null) { + accessTokenContextBuilder.authorizationGrant(context.getAuthorizationGrant()); + } + // @formatter:on + + OAuth2TokenClaimsContext accessTokenContext = accessTokenContextBuilder.build(); + this.accessTokenCustomizer.customize(accessTokenContext); + } + + OAuth2TokenClaimsSet accessTokenClaimsSet = claimsBuilder.build(); + return new OAuth2AccessTokenClaims(OAuth2AccessToken.TokenType.BEARER, UUID.randomUUID().toString(), + accessTokenClaimsSet.getIssuedAt(), accessTokenClaimsSet.getExpiresAt(), context.getAuthorizedScopes(), + accessTokenClaimsSet.getClaims()); + } + + /** + * Sets the {@link OAuth2TokenCustomizer} that customizes the + * {@link OAuth2TokenClaimsContext#getClaims() claims} for the + * {@link OAuth2AccessToken}. + * @param accessTokenCustomizer the {@link OAuth2TokenCustomizer} that customizes the + * claims for the {@code OAuth2AccessToken} + */ + public void setAccessTokenCustomizer(OAuth2TokenCustomizer accessTokenCustomizer) { + Assert.notNull(accessTokenCustomizer, "accessTokenCustomizer cannot be null"); + this.accessTokenCustomizer = accessTokenCustomizer; + } + + private static final class OAuth2AccessTokenClaims extends OAuth2AccessToken implements ClaimAccessor { + + private final Map claims; + + private OAuth2AccessTokenClaims(TokenType tokenType, String tokenValue, Instant issuedAt, Instant expiresAt, + Set scopes, Map claims) { + super(tokenType, tokenValue, issuedAt, expiresAt, scopes); + this.claims = claims; + } + + @Override + public Map getClaims() { + return this.claims; + } + + } + +} diff --git a/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/support/base/OAuth2ResourceOwnerBaseAuthenticationConverter.java b/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/support/base/OAuth2ResourceOwnerBaseAuthenticationConverter.java new file mode 100644 index 0000000..a841014 --- /dev/null +++ b/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/support/base/OAuth2ResourceOwnerBaseAuthenticationConverter.java @@ -0,0 +1,96 @@ +package com.pig4cloud.pigx.auth.support.base; + +import com.pig4cloud.pigx.common.security.util.OAuth2EndpointUtils; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.oauth2.core.OAuth2ErrorCodes; +import org.springframework.security.oauth2.core.endpoint.OAuth2ParameterNames; +import org.springframework.security.web.authentication.AuthenticationConverter; +import org.springframework.util.MultiValueMap; +import org.springframework.util.StringUtils; + +import javax.servlet.http.HttpServletRequest; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * @author jumuning + * @date 2022-06-02 + * + * 自定义模式认证转换器 + */ +public abstract class OAuth2ResourceOwnerBaseAuthenticationConverter + implements AuthenticationConverter { + + /** + * 是否支持此convert + * @param grantType 授权类型 + * @return + */ + public abstract boolean support(String grantType); + + /** + * 校验参数 + * @param request 请求 + */ + public void checkParams(HttpServletRequest request) { + + } + + /** + * 构建具体类型的token + * @param clientPrincipal + * @param requestedScopes + * @param additionalParameters + * @return + */ + public abstract T buildToken(Authentication clientPrincipal, Set requestedScopes, + Map additionalParameters); + + @Override + public Authentication convert(HttpServletRequest request) { + + // grant_type (REQUIRED) + String grantType = request.getParameter(OAuth2ParameterNames.GRANT_TYPE); + if (!support(grantType)) { + return null; + } + + MultiValueMap parameters = OAuth2EndpointUtils.getParameters(request); + // scope (OPTIONAL) + String scope = parameters.getFirst(OAuth2ParameterNames.SCOPE); + if (StringUtils.hasText(scope) && parameters.get(OAuth2ParameterNames.SCOPE).size() != 1) { + OAuth2EndpointUtils.throwError(OAuth2ErrorCodes.INVALID_REQUEST, OAuth2ParameterNames.SCOPE, + OAuth2EndpointUtils.ACCESS_TOKEN_REQUEST_ERROR_URI); + } + + Set requestedScopes = null; + if (StringUtils.hasText(scope)) { + requestedScopes = new HashSet<>(Arrays.asList(StringUtils.delimitedListToStringArray(scope, " "))); + } + + // 校验个性化参数 + checkParams(request); + + // 获取当前已经认证的客户端信息 + Authentication clientPrincipal = SecurityContextHolder.getContext().getAuthentication(); + if (clientPrincipal == null) { + OAuth2EndpointUtils.throwError(OAuth2ErrorCodes.INVALID_REQUEST, OAuth2ErrorCodes.INVALID_CLIENT, + OAuth2EndpointUtils.ACCESS_TOKEN_REQUEST_ERROR_URI); + } + + // 扩展信息 + Map additionalParameters = parameters.entrySet().stream() + .filter(e -> !e.getKey().equals(OAuth2ParameterNames.GRANT_TYPE) + && !e.getKey().equals(OAuth2ParameterNames.SCOPE)) + .collect(Collectors.toMap(Map.Entry::getKey, e -> e.getValue().get(0))); + + // 创建token + return buildToken(clientPrincipal, requestedScopes, additionalParameters); + + } + +} diff --git a/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/support/base/OAuth2ResourceOwnerBaseAuthenticationProvider.java b/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/support/base/OAuth2ResourceOwnerBaseAuthenticationProvider.java new file mode 100644 index 0000000..d24903a --- /dev/null +++ b/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/support/base/OAuth2ResourceOwnerBaseAuthenticationProvider.java @@ -0,0 +1,323 @@ +package com.pig4cloud.pigx.auth.support.base; + +import cn.hutool.core.util.BooleanUtil; +import cn.hutool.extra.spring.SpringUtil; +import com.pig4cloud.pigx.common.core.constant.CommonConstants; +import com.pig4cloud.pigx.common.security.service.PigxRedisOAuth2AuthorizationService; +import com.pig4cloud.pigx.common.security.util.OAuth2ErrorCodesExpand; +import com.pig4cloud.pigx.common.security.util.ScopeException; +import lombok.extern.slf4j.Slf4j; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.jetbrains.annotations.NotNull; +import org.springframework.context.support.MessageSourceAccessor; +import org.springframework.security.authentication.*; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.security.oauth2.core.*; +import org.springframework.security.oauth2.server.authorization.OAuth2Authorization; +import org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationService; +import org.springframework.security.oauth2.server.authorization.OAuth2TokenType; +import org.springframework.security.oauth2.server.authorization.authentication.OAuth2AccessTokenAuthenticationToken; +import org.springframework.security.oauth2.server.authorization.authentication.OAuth2ClientAuthenticationToken; +import org.springframework.security.oauth2.server.authorization.client.RegisteredClient; +import org.springframework.security.oauth2.server.authorization.context.AuthorizationServerContextHolder; +import org.springframework.security.oauth2.server.authorization.token.DefaultOAuth2TokenContext; +import org.springframework.security.oauth2.server.authorization.token.OAuth2TokenContext; +import org.springframework.security.oauth2.server.authorization.token.OAuth2TokenGenerator; +import org.springframework.util.Assert; +import org.springframework.util.CollectionUtils; + +import java.security.Principal; +import java.time.Instant; +import java.util.*; +import java.util.function.Supplier; + +/** + * @author jumuning + * @description + * + * 处理自定义授权 + */ +@Slf4j +public abstract class OAuth2ResourceOwnerBaseAuthenticationProvider + implements AuthenticationProvider { + + private static final Logger LOGGER = LogManager.getLogger(OAuth2ResourceOwnerBaseAuthenticationProvider.class); + + private static final String ERROR_URI = "https://datatracker.ietf.org/doc/html/rfc6749#section-4.1.2.1"; + + private final OAuth2AuthorizationService authorizationService; + + private final OAuth2TokenGenerator tokenGenerator; + + private final AuthenticationManager authenticationManager; + + private final MessageSourceAccessor messages; + + @Deprecated + private Supplier refreshTokenGenerator; + + /** + * Constructs an {@code OAuth2AuthorizationCodeAuthenticationProvider} using the + * provided parameters. + * @param authorizationService the authorization service + * @param tokenGenerator the token generator + * @since 0.2.3 + */ + public OAuth2ResourceOwnerBaseAuthenticationProvider(AuthenticationManager authenticationManager, + OAuth2AuthorizationService authorizationService, + OAuth2TokenGenerator tokenGenerator) { + Assert.notNull(authorizationService, "authorizationService cannot be null"); + Assert.notNull(tokenGenerator, "tokenGenerator cannot be null"); + this.authenticationManager = authenticationManager; + this.authorizationService = authorizationService; + this.tokenGenerator = tokenGenerator; + + // 国际化配置 + this.messages = new MessageSourceAccessor(SpringUtil.getBean("securityMessageSource"), Locale.CHINA); + } + + @Deprecated + public void setRefreshTokenGenerator(Supplier refreshTokenGenerator) { + Assert.notNull(refreshTokenGenerator, "refreshTokenGenerator cannot be null"); + this.refreshTokenGenerator = refreshTokenGenerator; + } + + public abstract UsernamePasswordAuthenticationToken buildToken(Map reqParameters); + + /** + * 当前provider是否支持此令牌类型 + * @param authentication + * @return + */ + @Override + public abstract boolean supports(Class authentication); + + /** + * 当前的请求客户端是否支持此模式 + * @param registeredClient + */ + public abstract void checkClient(RegisteredClient registeredClient); + + /** + * Performs authentication with the same contract as + * {@link AuthenticationManager#authenticate(Authentication)} . + * @param authentication the authentication request object. + * @return a fully authenticated object including credentials. May return + * null if the AuthenticationProvider is unable to support + * authentication of the passed Authentication object. In such a case, + * the next AuthenticationProvider that supports the presented + * Authentication class will be tried. + * @throws AuthenticationException if authentication fails. + */ + @Override + public Authentication authenticate(Authentication authentication) throws AuthenticationException { + + T resouceOwnerBaseAuthentication = (T) authentication; + + OAuth2ClientAuthenticationToken clientPrincipal = getAuthenticatedClientElseThrowInvalidClient( + resouceOwnerBaseAuthentication); + + RegisteredClient registeredClient = clientPrincipal.getRegisteredClient(); + checkClient(registeredClient); + + Set authorizedScopes; + // Default to configured scopes + if (!CollectionUtils.isEmpty(resouceOwnerBaseAuthentication.getScopes())) { + for (String requestedScope : resouceOwnerBaseAuthentication.getScopes()) { + if (!registeredClient.getScopes().contains(requestedScope)) { + throw new OAuth2AuthenticationException(OAuth2ErrorCodes.INVALID_SCOPE); + } + } + authorizedScopes = new LinkedHashSet<>(resouceOwnerBaseAuthentication.getScopes()); + } + else { + throw new ScopeException(OAuth2ErrorCodesExpand.SCOPE_IS_EMPTY); + } + + Map reqParameters = resouceOwnerBaseAuthentication.getAdditionalParameters(); + try { + + UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken = buildToken(reqParameters); + + LOGGER.debug("got usernamePasswordAuthenticationToken=" + usernamePasswordAuthenticationToken); + + Authentication usernamePasswordAuthentication = authenticationManager + .authenticate(usernamePasswordAuthenticationToken); + + Object onlineQuantity = registeredClient.getClientSettings().getSettings() + .get(CommonConstants.ONLINE_QUANTITY); + // 没有设置并发控制走原有逻辑生成 || 设置同时在线为 true + if (Objects.isNull(onlineQuantity) || BooleanUtil.toBooleanObject((String) onlineQuantity)) { + return generatAuthenticationToken(resouceOwnerBaseAuthentication, clientPrincipal, registeredClient, + authorizedScopes, usernamePasswordAuthentication); + } + + // 不允许同时在线,删除原有username 关联的所有token + PigxRedisOAuth2AuthorizationService redisOAuth2AuthorizationService = (PigxRedisOAuth2AuthorizationService) this.authorizationService; + redisOAuth2AuthorizationService.removeByUsername(usernamePasswordAuthentication); + + return generatAuthenticationToken(resouceOwnerBaseAuthentication, clientPrincipal, registeredClient, + authorizedScopes, usernamePasswordAuthentication); + + } + catch (Exception ex) { + throw oAuth2AuthenticationException(authentication, (AuthenticationException) ex); + } + + } + + /** + * 生成新的令牌 + * @param resouceOwnerBaseAuthentication + * @param clientPrincipal + * @param registeredClient + * @param authorizedScopes + * @param usernamePasswordAuthentication + * @return OAuth2AccessTokenAuthenticationToken + */ + @NotNull + private OAuth2AccessTokenAuthenticationToken generatAuthenticationToken(T resouceOwnerBaseAuthentication, + OAuth2ClientAuthenticationToken clientPrincipal, RegisteredClient registeredClient, + Set authorizedScopes, Authentication usernamePasswordAuthentication) { + // @formatter:off + DefaultOAuth2TokenContext.Builder tokenContextBuilder = DefaultOAuth2TokenContext.builder() + .registeredClient(registeredClient) + .principal(usernamePasswordAuthentication) + .authorizationServerContext(AuthorizationServerContextHolder.getContext()) + .authorizedScopes(authorizedScopes) + .authorizationGrantType(resouceOwnerBaseAuthentication.getAuthorizationGrantType()) + .authorizationGrant(resouceOwnerBaseAuthentication); + // @formatter:on + + OAuth2Authorization.Builder authorizationBuilder = OAuth2Authorization.withRegisteredClient(registeredClient) + .principalName(usernamePasswordAuthentication.getName()) + .authorizationGrantType(resouceOwnerBaseAuthentication.getAuthorizationGrantType()) + // 0.4.0 新增的方法 + .authorizedScopes(authorizedScopes); + + // ----- Access token ----- + OAuth2TokenContext tokenContext = tokenContextBuilder.tokenType(OAuth2TokenType.ACCESS_TOKEN).build(); + OAuth2Token generatedAccessToken = this.tokenGenerator.generate(tokenContext); + if (generatedAccessToken == null) { + OAuth2Error error = new OAuth2Error(OAuth2ErrorCodes.SERVER_ERROR, + "The token generator failed to generate the access token.", ERROR_URI); + throw new OAuth2AuthenticationException(error); + } + OAuth2AccessToken accessToken = new OAuth2AccessToken(OAuth2AccessToken.TokenType.BEARER, + generatedAccessToken.getTokenValue(), generatedAccessToken.getIssuedAt(), + generatedAccessToken.getExpiresAt(), tokenContext.getAuthorizedScopes()); + if (generatedAccessToken instanceof ClaimAccessor) { + authorizationBuilder.id(accessToken.getTokenValue()) + .token(accessToken, + (metadata) -> metadata.put(OAuth2Authorization.Token.CLAIMS_METADATA_NAME, + ((ClaimAccessor) generatedAccessToken).getClaims())) + // 0.4.0 新增的方法 + .authorizedScopes(authorizedScopes) + .attribute(Principal.class.getName(), usernamePasswordAuthentication); + } + else { + authorizationBuilder.id(accessToken.getTokenValue()).accessToken(accessToken); + } + + // ----- Refresh token ----- + OAuth2RefreshToken refreshToken = null; + if (registeredClient.getAuthorizationGrantTypes().contains(AuthorizationGrantType.REFRESH_TOKEN) && + // Do not issue refresh token to public client + !clientPrincipal.getClientAuthenticationMethod().equals(ClientAuthenticationMethod.NONE)) { + + if (this.refreshTokenGenerator != null) { + Instant issuedAt = Instant.now(); + Instant expiresAt = issuedAt.plus(registeredClient.getTokenSettings().getRefreshTokenTimeToLive()); + refreshToken = new OAuth2RefreshToken(this.refreshTokenGenerator.get(), issuedAt, expiresAt); + } + else { + tokenContext = tokenContextBuilder.tokenType(OAuth2TokenType.REFRESH_TOKEN).build(); + OAuth2Token generatedRefreshToken = this.tokenGenerator.generate(tokenContext); + if (!(generatedRefreshToken instanceof OAuth2RefreshToken)) { + OAuth2Error error = new OAuth2Error(OAuth2ErrorCodes.SERVER_ERROR, + "The token generator failed to generate the refresh token.", ERROR_URI); + throw new OAuth2AuthenticationException(error); + } + refreshToken = (OAuth2RefreshToken) generatedRefreshToken; + } + authorizationBuilder.refreshToken(refreshToken); + } + + OAuth2Authorization authorization = authorizationBuilder.build(); + + this.authorizationService.save(authorization); + + LOGGER.debug("returning OAuth2AccessTokenAuthenticationToken"); + + return new OAuth2AccessTokenAuthenticationToken(registeredClient, clientPrincipal, accessToken, refreshToken, + Objects.requireNonNull(authorization.getAccessToken().getClaims())); + } + + /** + * 登录异常转换为oauth2异常 + * @param authentication 身份验证 + * @param authenticationException 身份验证异常 + * @return {@link OAuth2AuthenticationException} + */ + private OAuth2AuthenticationException oAuth2AuthenticationException(Authentication authentication, + AuthenticationException authenticationException) { + if (authenticationException instanceof UsernameNotFoundException) { + return new OAuth2AuthenticationException(new OAuth2Error(OAuth2ErrorCodesExpand.USERNAME_NOT_FOUND, + this.messages.getMessage("JdbcDaoImpl.notFound", new Object[] { authentication.getName() }, + "Username {0} not found"), + "")); + } + if (authenticationException instanceof BadCredentialsException) { + return new OAuth2AuthenticationException( + new OAuth2Error(OAuth2ErrorCodesExpand.BAD_CREDENTIALS, this.messages.getMessage( + "AbstractUserDetailsAuthenticationProvider.badCredentials", "Bad credentials"), "")); + } + if (authenticationException instanceof LockedException) { + return new OAuth2AuthenticationException(new OAuth2Error(OAuth2ErrorCodesExpand.USER_LOCKED, this.messages + .getMessage("AbstractUserDetailsAuthenticationProvider.locked", "User account is locked"), "")); + } + if (authenticationException instanceof DisabledException) { + return new OAuth2AuthenticationException(new OAuth2Error(OAuth2ErrorCodesExpand.USER_DISABLE, + this.messages.getMessage("AbstractUserDetailsAuthenticationProvider.disabled", "User is disabled"), + "")); + } + if (authenticationException instanceof AccountExpiredException) { + return new OAuth2AuthenticationException(new OAuth2Error(OAuth2ErrorCodesExpand.USER_EXPIRED, this.messages + .getMessage("AbstractUserDetailsAuthenticationProvider.expired", "User account has expired"), "")); + } + if (authenticationException instanceof CredentialsExpiredException) { + return new OAuth2AuthenticationException(new OAuth2Error(OAuth2ErrorCodesExpand.CREDENTIALS_EXPIRED, + this.messages.getMessage("AbstractUserDetailsAuthenticationProvider.credentialsExpired", + "User credentials have expired"), + "")); + } + if (authenticationException instanceof ScopeException) { + return new OAuth2AuthenticationException(new OAuth2Error(OAuth2ErrorCodes.INVALID_SCOPE, + this.messages.getMessage("AbstractAccessDecisionManager.accessDenied", "invalid_scope"), "")); + } + + log.error(authenticationException.getLocalizedMessage()); + return new OAuth2AuthenticationException(new OAuth2Error(OAuth2ErrorCodes.SERVER_ERROR), + authenticationException.getLocalizedMessage(), authenticationException); + } + + private OAuth2ClientAuthenticationToken getAuthenticatedClientElseThrowInvalidClient( + Authentication authentication) { + + OAuth2ClientAuthenticationToken clientPrincipal = null; + + if (OAuth2ClientAuthenticationToken.class.isAssignableFrom(authentication.getPrincipal().getClass())) { + clientPrincipal = (OAuth2ClientAuthenticationToken) authentication.getPrincipal(); + } + + if (clientPrincipal != null && clientPrincipal.isAuthenticated()) { + return clientPrincipal; + } + + throw new OAuth2AuthenticationException(OAuth2ErrorCodes.INVALID_CLIENT); + } + +} diff --git a/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/support/base/OAuth2ResourceOwnerBaseAuthenticationToken.java b/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/support/base/OAuth2ResourceOwnerBaseAuthenticationToken.java new file mode 100644 index 0000000..00b6be4 --- /dev/null +++ b/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/support/base/OAuth2ResourceOwnerBaseAuthenticationToken.java @@ -0,0 +1,61 @@ +package com.pig4cloud.pigx.auth.support.base; + +import lombok.Getter; +import org.springframework.lang.Nullable; +import org.springframework.security.authentication.AbstractAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.oauth2.core.AuthorizationGrantType; +import org.springframework.util.Assert; + +import java.util.*; + +/** + * @author lengleng + * @date 2022/6/2 + * + * 自定义授权模式抽象 + */ +public abstract class OAuth2ResourceOwnerBaseAuthenticationToken extends AbstractAuthenticationToken { + + @Getter + private final AuthorizationGrantType authorizationGrantType; + + @Getter + private final Authentication clientPrincipal; + + @Getter + private final Set scopes; + + @Getter + private final Map additionalParameters; + + public OAuth2ResourceOwnerBaseAuthenticationToken(AuthorizationGrantType authorizationGrantType, + Authentication clientPrincipal, @Nullable Set scopes, + @Nullable Map additionalParameters) { + super(Collections.emptyList()); + Assert.notNull(authorizationGrantType, "authorizationGrantType cannot be null"); + Assert.notNull(clientPrincipal, "clientPrincipal cannot be null"); + this.authorizationGrantType = authorizationGrantType; + this.clientPrincipal = clientPrincipal; + this.scopes = Collections.unmodifiableSet(scopes != null ? new HashSet<>(scopes) : Collections.emptySet()); + this.additionalParameters = Collections.unmodifiableMap( + additionalParameters != null ? new HashMap<>(additionalParameters) : Collections.emptyMap()); + } + + /** + * 扩展模式一般不需要密码 + */ + @Override + public Object getCredentials() { + return ""; + } + + /** + * 获取用户名 + */ + @Override + public Object getPrincipal() { + return this.clientPrincipal; + } + +} diff --git a/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/support/base/package-info.java b/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/support/base/package-info.java new file mode 100644 index 0000000..a24b1fb --- /dev/null +++ b/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/support/base/package-info.java @@ -0,0 +1,4 @@ +/** + * 自定义认证模式接入的抽象实现 + */ +package com.pig4cloud.pigx.auth.support.base; diff --git a/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/support/core/CustomeOAuth2TokenCustomizer.java b/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/support/core/CustomeOAuth2TokenCustomizer.java new file mode 100644 index 0000000..ae375eb --- /dev/null +++ b/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/support/core/CustomeOAuth2TokenCustomizer.java @@ -0,0 +1,39 @@ +package com.pig4cloud.pigx.auth.support.core; + +import com.pig4cloud.pigx.common.core.constant.SecurityConstants; +import com.pig4cloud.pigx.common.security.service.PigxUser; +import org.springframework.security.oauth2.server.authorization.token.OAuth2TokenClaimsContext; +import org.springframework.security.oauth2.server.authorization.token.OAuth2TokenClaimsSet; +import org.springframework.security.oauth2.server.authorization.token.OAuth2TokenCustomizer; + +/** + * token 输出增强 + * + * @author lengleng + * @date 2022/6/3 + */ +public class CustomeOAuth2TokenCustomizer implements OAuth2TokenCustomizer { + + /** + * Customize the OAuth 2.0 Token attributes. + * @param context the context containing the OAuth 2.0 Token attributes + */ + @Override + public void customize(OAuth2TokenClaimsContext context) { + OAuth2TokenClaimsSet.Builder claims = context.getClaims(); + claims.claim(SecurityConstants.DETAILS_LICENSE, SecurityConstants.PIGX_LICENSE); + String clientId = context.getAuthorizationGrant().getName(); + claims.claim(SecurityConstants.CLIENT_ID, clientId); + claims.claim(SecurityConstants.ACTIVE, Boolean.TRUE); + + // 客户端模式不返回具体用户信息 + if (SecurityConstants.CLIENT_CREDENTIALS.equals(context.getAuthorizationGrantType().getValue())) { + return; + } + + PigxUser pigxUser = (PigxUser) context.getPrincipal().getPrincipal(); + claims.claim(SecurityConstants.DETAILS_USER_ID, pigxUser.getId()); + claims.claim(SecurityConstants.DETAILS_USERNAME, pigxUser.getUsername()); + } + +} diff --git a/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/support/core/FormIdentityLoginConfigurer.java b/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/support/core/FormIdentityLoginConfigurer.java new file mode 100644 index 0000000..4dbfdbe --- /dev/null +++ b/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/support/core/FormIdentityLoginConfigurer.java @@ -0,0 +1,31 @@ +package com.pig4cloud.pigx.auth.support.core; + +import com.pig4cloud.pigx.auth.support.handler.FormAuthenticationFailureHandler; +import com.pig4cloud.pigx.auth.support.handler.SsoLogoutSuccessHandler; +import com.pig4cloud.pigx.auth.support.handler.TenantSavedRequestAwareAuthenticationSuccessHandler; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer; + +/** + * @author lengleng + * @data 2022-06-04 + * + * 基于授权码模式 统一认证登录 spring security & sas 都可以使用 所以抽取成 HttpConfigurer + */ +public final class FormIdentityLoginConfigurer + extends AbstractHttpConfigurer { + + @Override + public void init(HttpSecurity http) throws Exception { + http.formLogin(formLogin -> { + formLogin.loginPage("/token/login"); + formLogin.loginProcessingUrl("/token/form"); + formLogin.failureHandler(new FormAuthenticationFailureHandler()); + formLogin.successHandler(new TenantSavedRequestAwareAuthenticationSuccessHandler()); + + }).logout() // SSO登出成功处理 + .logoutSuccessHandler(new SsoLogoutSuccessHandler()).deleteCookies("JSESSIONID") + .invalidateHttpSession(true).and().csrf().disable(); + } + +} diff --git a/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/support/core/PigxDaoAuthenticationProvider.java b/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/support/core/PigxDaoAuthenticationProvider.java new file mode 100644 index 0000000..d7ddd21 --- /dev/null +++ b/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/support/core/PigxDaoAuthenticationProvider.java @@ -0,0 +1,185 @@ +package com.pig4cloud.pigx.auth.support.core; + +import cn.hutool.core.util.StrUtil; +import cn.hutool.extra.spring.SpringUtil; +import com.pig4cloud.pigx.common.core.constant.SecurityConstants; +import com.pig4cloud.pigx.common.core.util.WebUtils; +import com.pig4cloud.pigx.common.security.service.PigxUserDetailsService; +import lombok.SneakyThrows; +import org.springframework.core.Ordered; +import org.springframework.security.authentication.BadCredentialsException; +import org.springframework.security.authentication.InternalAuthenticationServiceException; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.authentication.dao.AbstractUserDetailsAuthenticationProvider; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsPasswordService; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.security.crypto.factory.PasswordEncoderFactories; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.security.oauth2.core.endpoint.OAuth2ParameterNames; +import org.springframework.security.web.authentication.www.BasicAuthenticationConverter; +import org.springframework.util.Assert; + +import java.util.Comparator; +import java.util.Map; +import java.util.Optional; + +/** + * @author lengleng + * @date 2022-06-04 + */ +public class PigxDaoAuthenticationProvider extends AbstractUserDetailsAuthenticationProvider { + + /** + * The plaintext password used to perform PasswordEncoder#matches(CharSequence, + * String)} on when the user is not found to avoid SEC-2056. + */ + private static final String USER_NOT_FOUND_PASSWORD = "userNotFoundPassword"; + + private final static BasicAuthenticationConverter basicConvert = new BasicAuthenticationConverter(); + + private PasswordEncoder passwordEncoder; + + /** + * The password used to perform {@link PasswordEncoder#matches(CharSequence, String)} + * on when the user is not found to avoid SEC-2056. This is necessary, because some + * {@link PasswordEncoder} implementations will short circuit if the password is not + * in a valid format. + */ + private volatile String userNotFoundEncodedPassword; + + private UserDetailsService userDetailsService; + + private UserDetailsPasswordService userDetailsPasswordService; + + public PigxDaoAuthenticationProvider() { + setMessageSource(SpringUtil.getBean("securityMessageSource")); + setPasswordEncoder(PasswordEncoderFactories.createDelegatingPasswordEncoder()); + } + + @Override + @SuppressWarnings("deprecation") + protected void additionalAuthenticationChecks(UserDetails userDetails, + UsernamePasswordAuthenticationToken authentication) throws AuthenticationException { + + // app 模式不用校验密码 + String grantType = WebUtils.getRequest().getParameter(OAuth2ParameterNames.GRANT_TYPE); + if (StrUtil.equals(SecurityConstants.APP, grantType)) { + return; + } + + if (authentication.getCredentials() == null) { + this.logger.debug("Failed to authenticate since no credentials provided"); + throw new BadCredentialsException(this.messages + .getMessage("AbstractUserDetailsAuthenticationProvider.badCredentials", "Bad credentials")); + } + String presentedPassword = authentication.getCredentials().toString(); + if (!this.passwordEncoder.matches(presentedPassword, userDetails.getPassword())) { + this.logger.debug("Failed to authenticate since password does not match stored value"); + throw new BadCredentialsException(this.messages + .getMessage("AbstractUserDetailsAuthenticationProvider.badCredentials", "Bad credentials")); + } + } + + @SneakyThrows + @Override + protected final UserDetails retrieveUser(String username, UsernamePasswordAuthenticationToken authentication) { + prepareTimingAttackProtection(); + String grantType = WebUtils.getRequest().getParameter(OAuth2ParameterNames.GRANT_TYPE); + String clientId = WebUtils.getRequest().getParameter(OAuth2ParameterNames.CLIENT_ID); + + if (StrUtil.isBlank(clientId)) { + clientId = basicConvert.convert(WebUtils.getRequest()).getName(); + } + + Map userDetailsServiceMap = SpringUtil + .getBeansOfType(PigxUserDetailsService.class); + + String finalClientId = clientId; + Optional optional = userDetailsServiceMap.values().stream() + .filter(service -> service.support(finalClientId, grantType)) + .max(Comparator.comparingInt(Ordered::getOrder)); + + if (!optional.isPresent()) { + throw new InternalAuthenticationServiceException("UserDetailsService error , not register"); + } + + try { + UserDetails loadedUser = optional.get().loadUserByUsername(username); + if (loadedUser == null) { + throw new InternalAuthenticationServiceException( + "UserDetailsService returned null, which is an interface contract violation"); + } + return loadedUser; + } + catch (UsernameNotFoundException ex) { + mitigateAgainstTimingAttack(authentication); + throw ex; + } + catch (InternalAuthenticationServiceException ex) { + throw ex; + } + catch (Exception ex) { + throw new InternalAuthenticationServiceException(ex.getMessage(), ex); + } + } + + @Override + protected Authentication createSuccessAuthentication(Object principal, Authentication authentication, + UserDetails user) { + boolean upgradeEncoding = this.userDetailsPasswordService != null + && this.passwordEncoder.upgradeEncoding(user.getPassword()); + if (upgradeEncoding) { + String presentedPassword = authentication.getCredentials().toString(); + String newPassword = this.passwordEncoder.encode(presentedPassword); + user = this.userDetailsPasswordService.updatePassword(user, newPassword); + } + return super.createSuccessAuthentication(principal, authentication, user); + } + + private void prepareTimingAttackProtection() { + if (this.userNotFoundEncodedPassword == null) { + this.userNotFoundEncodedPassword = this.passwordEncoder.encode(USER_NOT_FOUND_PASSWORD); + } + } + + private void mitigateAgainstTimingAttack(UsernamePasswordAuthenticationToken authentication) { + if (authentication.getCredentials() != null) { + String presentedPassword = authentication.getCredentials().toString(); + this.passwordEncoder.matches(presentedPassword, this.userNotFoundEncodedPassword); + } + } + + /** + * Sets the PasswordEncoder instance to be used to encode and validate passwords. If + * not set, the password will be compared using + * {@link PasswordEncoderFactories#createDelegatingPasswordEncoder()} + * @param passwordEncoder must be an instance of one of the {@code PasswordEncoder} + * types. + */ + public void setPasswordEncoder(PasswordEncoder passwordEncoder) { + Assert.notNull(passwordEncoder, "passwordEncoder cannot be null"); + this.passwordEncoder = passwordEncoder; + this.userNotFoundEncodedPassword = null; + } + + protected PasswordEncoder getPasswordEncoder() { + return this.passwordEncoder; + } + + public void setUserDetailsService(UserDetailsService userDetailsService) { + this.userDetailsService = userDetailsService; + } + + protected UserDetailsService getUserDetailsService() { + return this.userDetailsService; + } + + public void setUserDetailsPasswordService(UserDetailsPasswordService userDetailsPasswordService) { + this.userDetailsPasswordService = userDetailsPasswordService; + } + +} diff --git a/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/support/handler/FormAuthenticationFailureHandler.java b/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/support/handler/FormAuthenticationFailureHandler.java new file mode 100644 index 0000000..307e3bb --- /dev/null +++ b/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/support/handler/FormAuthenticationFailureHandler.java @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.pig4cloud.pigx.auth.support.handler; + +import cn.hutool.core.util.CharsetUtil; +import cn.hutool.http.HttpUtil; +import com.pig4cloud.pigx.common.core.util.WebUtils; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.web.authentication.AuthenticationFailureHandler; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * @author lengleng + * @date 2022-06-02 + *

+ * 表单登录失败处理逻辑 + */ +@Slf4j +public class FormAuthenticationFailureHandler implements AuthenticationFailureHandler { + + /** + * Called when an authentication attempt fails. + * @param request the request during which the authentication attempt occurred. + * @param response the response. + * @param exception the exception which was thrown to reject the authentication + */ + @Override + @SneakyThrows + public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, + AuthenticationException exception) { + log.debug("表单登录失败:{}", exception.getLocalizedMessage()); + String url = HttpUtil.encodeParams(String.format("/token/login?error=%s", exception.getMessage()), + CharsetUtil.CHARSET_UTF_8); + WebUtils.getResponse().sendRedirect(url); + } + +} diff --git a/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/support/handler/PigxAuthenticationFailureEventHandler.java b/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/support/handler/PigxAuthenticationFailureEventHandler.java new file mode 100644 index 0000000..3effcbb --- /dev/null +++ b/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/support/handler/PigxAuthenticationFailureEventHandler.java @@ -0,0 +1,175 @@ +/* + * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.pig4cloud.pigx.auth.support.handler; + +import cn.hutool.core.util.StrUtil; +import com.pig4cloud.pigx.admin.api.dto.SysLogDTO; +import com.pig4cloud.pigx.admin.api.feign.RemoteUserService; +import com.pig4cloud.pigx.common.core.constant.CacheConstants; +import com.pig4cloud.pigx.common.core.constant.CommonConstants; +import com.pig4cloud.pigx.common.core.constant.SecurityConstants; +import com.pig4cloud.pigx.common.core.util.KeyStrResolver; +import com.pig4cloud.pigx.common.core.util.MsgUtils; +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.common.core.util.WebUtils; +import com.pig4cloud.pigx.common.data.resolver.ParamResolver; +import com.pig4cloud.pigx.common.log.event.SysLogEvent; +import com.pig4cloud.pigx.common.log.util.LogTypeEnum; +import com.pig4cloud.pigx.common.log.util.SysLogUtils; +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.ApplicationEventPublisher; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; +import org.springframework.http.server.ServletServerHttpResponse; +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.oauth2.core.OAuth2AuthenticationException; +import org.springframework.security.oauth2.core.endpoint.OAuth2ParameterNames; +import org.springframework.security.web.authentication.AuthenticationFailureHandler; +import org.springframework.stereotype.Component; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.concurrent.TimeUnit; + +/** + * @author lengleng + * @date 2022-06-02 + */ +@Slf4j +@Component +@RequiredArgsConstructor +public class PigxAuthenticationFailureEventHandler implements AuthenticationFailureHandler { + + private static final MappingJackson2HttpMessageConverter errorHttpResponseConverter = new MappingJackson2HttpMessageConverter(); + + private final RedisTemplate redisTemplate; + + private final ApplicationEventPublisher publisher; + + private final KeyStrResolver tenantKeyStrResolver; + + private final RemoteUserService userService; + + /** + * Called when an authentication attempt fails. + * @param request the request during which the authentication attempt occurred. + * @param response the response. + * @param exception the exception which was thrown to reject the authentication + * request. + */ + @Override + @SneakyThrows + public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, + AuthenticationException exception) { + String grantType = request.getParameter(OAuth2ParameterNames.GRANT_TYPE); + log.info("登录失败,异常:{}", exception.getLocalizedMessage()); + + // 密码模式记录错误信息 + if (OAuth2ParameterNames.PASSWORD.equals(grantType)) { + String username = request.getParameter(OAuth2ParameterNames.USERNAME); + + // 密码错误记录错误次数 (TOC用户不记录) + String header = WebUtils.getRequest().getHeader(SecurityConstants.HEADER_TOC); + if (exception instanceof OAuth2AuthenticationException + && !SecurityConstants.HEADER_TOC_YES.equals(header)) { + recordLoginFailureTimes(username); + } + + // 记录登录失败错误信息 + sendFailureEventLog(request, exception, username); + } + + // 写出错误信息 + sendErrorResponse(request, response, exception); + } + + /** + * 记录失败日志 + * @param request HttpServletRequest + * @param exception 错误日志 + * @param username 用户名 + */ + private void sendFailureEventLog(HttpServletRequest request, AuthenticationException exception, String username) { + SysLogDTO logVo = SysLogUtils.getSysLog(); + logVo.setTitle("登录失败"); + logVo.setLogType(LogTypeEnum.ERROR.getType()); + logVo.setException(exception.getLocalizedMessage()); + // 发送异步日志事件 + String startTimeStr = request.getHeader(CommonConstants.REQUEST_START_TIME); + if (StrUtil.isNotBlank(startTimeStr)) { + Long startTime = Long.parseLong(startTimeStr); + Long endTime = System.currentTimeMillis(); + logVo.setTime(endTime - startTime); + } + String header = request.getHeader(HttpHeaders.AUTHORIZATION); + String clientId = WebUtils.extractClientId(header).orElse(null); + logVo.setServiceId(clientId); + logVo.setCreateBy(username); + logVo.setTenantId(Long.parseLong(tenantKeyStrResolver.key())); + publisher.publishEvent(new SysLogEvent(logVo)); + } + + /** + * 记录登录失败此处,如果操作阈值 调用接口锁定用户 + * @param username username + */ + private void recordLoginFailureTimes(String username) { + String key = String.format("%s:%s:%s", tenantKeyStrResolver.key(), CacheConstants.LOGIN_ERROR_TIMES, username); + Long deltaTimes = ParamResolver.getLong("LOGIN_ERROR_TIMES", 5L); + Long times = redisTemplate.opsForValue().increment(key); + + // 自动过期时间 + Long deltaTime = ParamResolver.getLong("DELTA_TIME", 1L); + redisTemplate.expire(key, deltaTime, TimeUnit.HOURS); + + if (deltaTimes <= times) { + userService.lockUser(username, SecurityConstants.FROM_IN); + } + } + + private void sendErrorResponse(HttpServletRequest request, HttpServletResponse response, + AuthenticationException exception) throws IOException { + ServletServerHttpResponse httpResponse = new ServletServerHttpResponse(response); + httpResponse.setStatusCode(HttpStatus.UNAUTHORIZED); + String errorMessage; + + if (exception instanceof OAuth2AuthenticationException) { + OAuth2AuthenticationException authorizationException = (OAuth2AuthenticationException) exception; + errorMessage = StrUtil.isBlank(authorizationException.getError().getDescription()) + ? authorizationException.getError().getErrorCode() + : authorizationException.getError().getDescription(); + } + else { + errorMessage = exception.getLocalizedMessage(); + } + + // 手机号登录 + String grantType = request.getParameter(OAuth2ParameterNames.GRANT_TYPE); + if (SecurityConstants.APP.equals(grantType)) { + errorMessage = MsgUtils.getSecurityMessage("AbstractUserDetailsAuthenticationProvider.smsBadCredentials"); + } + + this.errorHttpResponseConverter.write(R.failed(errorMessage), MediaType.APPLICATION_JSON, httpResponse); + } + +} diff --git a/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/support/handler/PigxAuthenticationSuccessEventHandler.java b/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/support/handler/PigxAuthenticationSuccessEventHandler.java new file mode 100644 index 0000000..7955da2 --- /dev/null +++ b/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/support/handler/PigxAuthenticationSuccessEventHandler.java @@ -0,0 +1,166 @@ +/* + * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.pig4cloud.pigx.auth.support.handler; + +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.StrUtil; +import com.pig4cloud.pigx.admin.api.dto.SysLogDTO; +import com.pig4cloud.pigx.common.core.constant.CacheConstants; +import com.pig4cloud.pigx.common.core.constant.CommonConstants; +import com.pig4cloud.pigx.common.core.constant.SecurityConstants; +import com.pig4cloud.pigx.common.core.util.KeyStrResolver; +import com.pig4cloud.pigx.common.log.event.SysLogEvent; +import com.pig4cloud.pigx.common.log.util.LogTypeEnum; +import com.pig4cloud.pigx.common.log.util.SysLogUtils; +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.ApplicationEventPublisher; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.http.converter.HttpMessageConverter; +import org.springframework.http.server.ServletServerHttpResponse; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContext; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.oauth2.core.OAuth2AccessToken; +import org.springframework.security.oauth2.core.OAuth2RefreshToken; +import org.springframework.security.oauth2.core.endpoint.OAuth2AccessTokenResponse; +import org.springframework.security.oauth2.core.http.converter.OAuth2AccessTokenResponseHttpMessageConverter; +import org.springframework.security.oauth2.server.authorization.authentication.OAuth2AccessTokenAuthenticationToken; +import org.springframework.security.web.authentication.AuthenticationSuccessHandler; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.time.temporal.ChronoUnit; +import java.util.Map; + +/** + * @author lengleng + * @date 2022-06-02 + */ +@Slf4j +@Component +@RequiredArgsConstructor +public class PigxAuthenticationSuccessEventHandler implements AuthenticationSuccessHandler { + + private static final HttpMessageConverter accessTokenHttpResponseConverter = new OAuth2AccessTokenResponseHttpMessageConverter(); + + private final RedisTemplate redisTemplate; + + private final ApplicationEventPublisher publisher; + + private final KeyStrResolver tenantKeyStrResolver; + + /** + * Called when a user has been successfully authenticated. + * @param request the request which caused the successful authentication + * @param response the response + * @param authentication the Authentication object which was created during + * the authentication process. + */ + @SneakyThrows + @Override + public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, + Authentication authentication) { + + // 写入登录成功的日志 + OAuth2AccessTokenAuthenticationToken accessTokenAuthentication = (OAuth2AccessTokenAuthenticationToken) authentication; + Map map = accessTokenAuthentication.getAdditionalParameters(); + if (MapUtil.isNotEmpty(map)) { + sendSuccessEventLog(request, accessTokenAuthentication, map); + } + + // 清除账号历史锁定次数 + clearLoginFailureTimes(map); + + // 输出token + sendAccessTokenResponse(response, authentication); + } + + /** + * 记录登录成功事件 + * @param request HttpServletRequest + * @param accessTokenAuthentication Authentication + * @param map 请求参数 + */ + private void sendSuccessEventLog(HttpServletRequest request, + OAuth2AccessTokenAuthenticationToken accessTokenAuthentication, Map map) { + // 发送异步日志事件 + + SecurityContext context = SecurityContextHolder.createEmptyContext(); + context.setAuthentication(accessTokenAuthentication); + SecurityContextHolder.setContext(context); + + SysLogDTO logVo = SysLogUtils.getSysLog(); + logVo.setTitle("登录成功"); + logVo.setLogType(LogTypeEnum.NORMAL.getType()); + String startTimeStr = request.getHeader(CommonConstants.REQUEST_START_TIME); + if (StrUtil.isNotBlank(startTimeStr)) { + Long startTime = Long.parseLong(startTimeStr); + Long endTime = System.currentTimeMillis(); + logVo.setTime(endTime - startTime); + } + + logVo.setServiceId(accessTokenAuthentication.getRegisteredClient().getClientId()); + logVo.setCreateBy(MapUtil.getStr(map, SecurityConstants.DETAILS_USERNAME)); + logVo.setTenantId(Long.parseLong(tenantKeyStrResolver.key())); + + publisher.publishEvent(new SysLogEvent(logVo)); + } + + /** + * 清空登录失败的记录 + * @param map + */ + private void clearLoginFailureTimes(Map map) { + String key = String.format("%s:%s:%s", tenantKeyStrResolver.key(), CacheConstants.LOGIN_ERROR_TIMES, + MapUtil.getStr(map, SecurityConstants.DETAILS_USERNAME)); + redisTemplate.delete(key); + } + + private void sendAccessTokenResponse(HttpServletResponse response, Authentication authentication) + throws IOException { + + OAuth2AccessTokenAuthenticationToken accessTokenAuthentication = (OAuth2AccessTokenAuthenticationToken) authentication; + + OAuth2AccessToken accessToken = accessTokenAuthentication.getAccessToken(); + OAuth2RefreshToken refreshToken = accessTokenAuthentication.getRefreshToken(); + Map additionalParameters = accessTokenAuthentication.getAdditionalParameters(); + + OAuth2AccessTokenResponse.Builder builder = OAuth2AccessTokenResponse.withToken(accessToken.getTokenValue()) + .tokenType(accessToken.getTokenType()).scopes(accessToken.getScopes()); + if (accessToken.getIssuedAt() != null && accessToken.getExpiresAt() != null) { + builder.expiresIn(ChronoUnit.SECONDS.between(accessToken.getIssuedAt(), accessToken.getExpiresAt())); + } + if (refreshToken != null) { + builder.refreshToken(refreshToken.getTokenValue()); + } + if (!CollectionUtils.isEmpty(additionalParameters)) { + builder.additionalParameters(additionalParameters); + } + OAuth2AccessTokenResponse accessTokenResponse = builder.build(); + ServletServerHttpResponse httpResponse = new ServletServerHttpResponse(response); + + // 无状态 注意删除 context 上下文的信息 + SecurityContextHolder.clearContext(); + this.accessTokenHttpResponseConverter.write(accessTokenResponse, null, httpResponse); + } + +} diff --git a/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/support/handler/PigxLogoutSuccessEventHandler.java b/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/support/handler/PigxLogoutSuccessEventHandler.java new file mode 100644 index 0000000..9e0acbb --- /dev/null +++ b/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/support/handler/PigxLogoutSuccessEventHandler.java @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.pig4cloud.pigx.auth.support.handler; + +import com.pig4cloud.pigx.admin.api.dto.SysLogDTO; +import com.pig4cloud.pigx.common.core.util.WebUtils; +import com.pig4cloud.pigx.common.log.util.SysLogUtils; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.ApplicationListener; +import org.springframework.http.HttpHeaders; +import org.springframework.security.authentication.event.LogoutSuccessEvent; +import org.springframework.security.core.Authentication; +import org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationToken; +import org.springframework.stereotype.Component; + +/** + * @author zhangran + * @date 2022-06-02 + * + * 事件机制处理退出相关 + */ +@Slf4j +@Component +public class PigxLogoutSuccessEventHandler implements ApplicationListener { + + @Override + public void onApplicationEvent(LogoutSuccessEvent event) { + Authentication authentication = (Authentication) event.getSource(); + if (authentication instanceof PreAuthenticatedAuthenticationToken) { + handle(authentication); + } + } + + /** + * 处理退出成功方法 + *

+ * 获取到登录的authentication 对象 + * @param authentication 登录对象 + */ + public void handle(Authentication authentication) { + log.info("用户:{} 退出成功", authentication.getPrincipal()); + SysLogDTO logVo = SysLogUtils.getSysLog(); + logVo.setTitle("退出成功"); + // 发送异步日志事件 + Long startTime = System.currentTimeMillis(); + Long endTime = System.currentTimeMillis(); + logVo.setTime(endTime - startTime); + + // 设置对应的token + logVo.setParams(WebUtils.getRequest().getHeader(HttpHeaders.AUTHORIZATION)); + + // 这边设置ServiceId + if (authentication instanceof PreAuthenticatedAuthenticationToken) { + logVo.setServiceId(authentication.getCredentials().toString()); + } + logVo.setCreateBy(authentication.getName()); + } + +} diff --git a/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/support/handler/SsoLogoutSuccessHandler.java b/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/support/handler/SsoLogoutSuccessHandler.java new file mode 100644 index 0000000..acac8c1 --- /dev/null +++ b/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/support/handler/SsoLogoutSuccessHandler.java @@ -0,0 +1,41 @@ +package com.pig4cloud.pigx.auth.support.handler; + +import cn.hutool.core.util.StrUtil; +import org.springframework.http.HttpHeaders; +import org.springframework.security.core.Authentication; +import org.springframework.security.web.authentication.logout.LogoutSuccessHandler; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * @author lengleng + * @date 2022-06-02 + *

+ * sso 退出功能 ,根据客户端传入跳转 + */ +public class SsoLogoutSuccessHandler implements LogoutSuccessHandler { + + private static final String REDIRECT_URL = "redirect_url"; + + @Override + public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) + throws IOException { + if (response == null) { + return; + } + + // 获取请求参数中是否包含 回调地址 + String redirectUrl = request.getParameter(REDIRECT_URL); + if (StrUtil.isNotBlank(redirectUrl)) { + response.sendRedirect(redirectUrl); + } + else if (StrUtil.isNotBlank(request.getHeader(HttpHeaders.REFERER))) { + // 默认跳转referer 地址 + String referer = request.getHeader(HttpHeaders.REFERER); + response.sendRedirect(referer); + } + } + +} diff --git a/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/support/handler/TenantSavedRequestAwareAuthenticationSuccessHandler.java b/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/support/handler/TenantSavedRequestAwareAuthenticationSuccessHandler.java new file mode 100644 index 0000000..636f14e --- /dev/null +++ b/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/support/handler/TenantSavedRequestAwareAuthenticationSuccessHandler.java @@ -0,0 +1,60 @@ +package com.pig4cloud.pigx.auth.support.handler; + +import com.pig4cloud.pigx.common.core.util.KeyStrResolver; +import com.pig4cloud.pigx.common.core.util.SpringContextHolder; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.security.core.Authentication; +import org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler; +import org.springframework.security.web.authentication.SimpleUrlAuthenticationSuccessHandler; +import org.springframework.security.web.savedrequest.HttpSessionRequestCache; +import org.springframework.security.web.savedrequest.RequestCache; +import org.springframework.security.web.savedrequest.SavedRequest; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * @author lengleng + * @date 2021/2/7 + * + * 增强成功回调增加租户上下文避免极端情况下丢失问题 + * @see SavedRequestAwareAuthenticationSuccessHandler + */ +@Slf4j +public class TenantSavedRequestAwareAuthenticationSuccessHandler extends SimpleUrlAuthenticationSuccessHandler { + + protected final Log logger = LogFactory.getLog(this.getClass()); + + private RequestCache requestCache = new HttpSessionRequestCache(); + + public TenantSavedRequestAwareAuthenticationSuccessHandler() { + } + + @Override + public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, + Authentication authentication) throws ServletException, IOException { + SavedRequest savedRequest = this.requestCache.getRequest(request, response); + if (savedRequest == null) { + super.onAuthenticationSuccess(request, response, authentication); + } + + if (isAlwaysUseDefaultTargetUrl()) { + this.requestCache.removeRequest(request, response); + super.onAuthenticationSuccess(request, response, authentication); + } + else { + this.clearAuthenticationAttributes(request); + // 增加租户信息 + assert savedRequest != null; + String targetUrl = savedRequest.getRedirectUrl() + "&TENANT-ID=" + + SpringContextHolder.getBean(KeyStrResolver.class).key(); + + this.getRedirectStrategy().sendRedirect(request, response, targetUrl); + } + } + +} diff --git a/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/support/password/OAuth2ResourceOwnerPasswordAuthenticationConverter.java b/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/support/password/OAuth2ResourceOwnerPasswordAuthenticationConverter.java new file mode 100644 index 0000000..ea69a0d --- /dev/null +++ b/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/support/password/OAuth2ResourceOwnerPasswordAuthenticationConverter.java @@ -0,0 +1,63 @@ +package com.pig4cloud.pigx.auth.support.password; + +import com.pig4cloud.pigx.auth.support.base.OAuth2ResourceOwnerBaseAuthenticationConverter; +import com.pig4cloud.pigx.common.security.util.OAuth2EndpointUtils; +import org.springframework.security.core.Authentication; +import org.springframework.security.oauth2.core.AuthorizationGrantType; +import org.springframework.security.oauth2.core.OAuth2ErrorCodes; +import org.springframework.security.oauth2.core.endpoint.OAuth2ParameterNames; +import org.springframework.util.MultiValueMap; +import org.springframework.util.StringUtils; + +import javax.servlet.http.HttpServletRequest; +import java.util.Map; +import java.util.Set; + +/** + * @author jumuning + * @date 2022-06-02 + * + * 密码认证转换器 + */ +public class OAuth2ResourceOwnerPasswordAuthenticationConverter + extends OAuth2ResourceOwnerBaseAuthenticationConverter { + + /** + * 支持密码模式 + * @param grantType 授权类型 + */ + @Override + public boolean support(String grantType) { + return AuthorizationGrantType.PASSWORD.getValue().equals(grantType); + } + + @Override + public OAuth2ResourceOwnerPasswordAuthenticationToken buildToken(Authentication clientPrincipal, + Set requestedScopes, Map additionalParameters) { + return new OAuth2ResourceOwnerPasswordAuthenticationToken(AuthorizationGrantType.PASSWORD, clientPrincipal, + requestedScopes, additionalParameters); + } + + /** + * 校验扩展参数 密码模式密码必须不为空 + * @param request 参数列表 + */ + @Override + public void checkParams(HttpServletRequest request) { + MultiValueMap parameters = OAuth2EndpointUtils.getParameters(request); + // username (REQUIRED) + String username = parameters.getFirst(OAuth2ParameterNames.USERNAME); + if (!StringUtils.hasText(username) || parameters.get(OAuth2ParameterNames.USERNAME).size() != 1) { + OAuth2EndpointUtils.throwError(OAuth2ErrorCodes.INVALID_REQUEST, OAuth2ParameterNames.USERNAME, + OAuth2EndpointUtils.ACCESS_TOKEN_REQUEST_ERROR_URI); + } + + // password (REQUIRED) + String password = parameters.getFirst(OAuth2ParameterNames.PASSWORD); + if (!StringUtils.hasText(password) || parameters.get(OAuth2ParameterNames.PASSWORD).size() != 1) { + OAuth2EndpointUtils.throwError(OAuth2ErrorCodes.INVALID_REQUEST, OAuth2ParameterNames.PASSWORD, + OAuth2EndpointUtils.ACCESS_TOKEN_REQUEST_ERROR_URI); + } + } + +} diff --git a/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/support/password/OAuth2ResourceOwnerPasswordAuthenticationProvider.java b/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/support/password/OAuth2ResourceOwnerPasswordAuthenticationProvider.java new file mode 100644 index 0000000..f02157b --- /dev/null +++ b/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/support/password/OAuth2ResourceOwnerPasswordAuthenticationProvider.java @@ -0,0 +1,64 @@ +package com.pig4cloud.pigx.auth.support.password; + +import com.pig4cloud.pigx.auth.support.base.OAuth2ResourceOwnerBaseAuthenticationProvider; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.oauth2.core.AuthorizationGrantType; +import org.springframework.security.oauth2.core.OAuth2AuthenticationException; +import org.springframework.security.oauth2.core.OAuth2ErrorCodes; +import org.springframework.security.oauth2.core.OAuth2Token; +import org.springframework.security.oauth2.core.endpoint.OAuth2ParameterNames; +import org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationService; +import org.springframework.security.oauth2.server.authorization.client.RegisteredClient; +import org.springframework.security.oauth2.server.authorization.token.OAuth2TokenGenerator; + +import java.util.Map; + +/** + * @author jumuning + * @description 处理用户名密码授权 + */ +public class OAuth2ResourceOwnerPasswordAuthenticationProvider + extends OAuth2ResourceOwnerBaseAuthenticationProvider { + + private static final Logger LOGGER = LogManager.getLogger(OAuth2ResourceOwnerPasswordAuthenticationProvider.class); + + /** + * Constructs an {@code OAuth2AuthorizationCodeAuthenticationProvider} using the + * provided parameters. + * @param authenticationManager + * @param authorizationService the authorization service + * @param tokenGenerator the token generator + * @since 0.2.3 + */ + public OAuth2ResourceOwnerPasswordAuthenticationProvider(AuthenticationManager authenticationManager, + OAuth2AuthorizationService authorizationService, + OAuth2TokenGenerator tokenGenerator) { + super(authenticationManager, authorizationService, tokenGenerator); + } + + @Override + public UsernamePasswordAuthenticationToken buildToken(Map reqParameters) { + String username = (String) reqParameters.get(OAuth2ParameterNames.USERNAME); + String password = (String) reqParameters.get(OAuth2ParameterNames.PASSWORD); + return new UsernamePasswordAuthenticationToken(username, password); + } + + @Override + public boolean supports(Class authentication) { + boolean supports = OAuth2ResourceOwnerPasswordAuthenticationToken.class.isAssignableFrom(authentication); + LOGGER.debug("supports authentication=" + authentication + " returning " + supports); + return supports; + } + + @Override + public void checkClient(RegisteredClient registeredClient) { + assert registeredClient != null; + if (!registeredClient.getAuthorizationGrantTypes().contains(AuthorizationGrantType.PASSWORD)) { + throw new OAuth2AuthenticationException(OAuth2ErrorCodes.UNAUTHORIZED_CLIENT); + } + } + +} diff --git a/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/support/password/OAuth2ResourceOwnerPasswordAuthenticationToken.java b/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/support/password/OAuth2ResourceOwnerPasswordAuthenticationToken.java new file mode 100644 index 0000000..cb8e818 --- /dev/null +++ b/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/support/password/OAuth2ResourceOwnerPasswordAuthenticationToken.java @@ -0,0 +1,21 @@ +package com.pig4cloud.pigx.auth.support.password; + +import com.pig4cloud.pigx.auth.support.base.OAuth2ResourceOwnerBaseAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.oauth2.core.AuthorizationGrantType; + +import java.util.Map; +import java.util.Set; + +/** + * @author jumuning + * @description 密码授权token信息 + */ +public class OAuth2ResourceOwnerPasswordAuthenticationToken extends OAuth2ResourceOwnerBaseAuthenticationToken { + + public OAuth2ResourceOwnerPasswordAuthenticationToken(AuthorizationGrantType authorizationGrantType, + Authentication clientPrincipal, Set scopes, Map additionalParameters) { + super(authorizationGrantType, clientPrincipal, scopes, additionalParameters); + } + +} diff --git a/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/support/password/package-info.java b/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/support/password/package-info.java new file mode 100644 index 0000000..6cb3459 --- /dev/null +++ b/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/support/password/package-info.java @@ -0,0 +1,4 @@ +/** + * 密码模式 + */ +package com.pig4cloud.pigx.auth.support.password; diff --git a/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/support/sms/OAuth2ResourceOwnerSmsAuthenticationConverter.java b/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/support/sms/OAuth2ResourceOwnerSmsAuthenticationConverter.java new file mode 100644 index 0000000..28d0d90 --- /dev/null +++ b/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/support/sms/OAuth2ResourceOwnerSmsAuthenticationConverter.java @@ -0,0 +1,57 @@ +package com.pig4cloud.pigx.auth.support.sms; + +import com.pig4cloud.pigx.auth.support.base.OAuth2ResourceOwnerBaseAuthenticationConverter; +import com.pig4cloud.pigx.common.core.constant.SecurityConstants; +import com.pig4cloud.pigx.common.security.util.OAuth2EndpointUtils; +import org.springframework.security.core.Authentication; +import org.springframework.security.oauth2.core.AuthorizationGrantType; +import org.springframework.security.oauth2.core.OAuth2ErrorCodes; +import org.springframework.util.MultiValueMap; +import org.springframework.util.StringUtils; + +import javax.servlet.http.HttpServletRequest; +import java.util.Map; +import java.util.Set; + +/** + * @author lengleng + * @date 2022-05-31 + * + * 短信登录转换器 + */ +public class OAuth2ResourceOwnerSmsAuthenticationConverter + extends OAuth2ResourceOwnerBaseAuthenticationConverter { + + /** + * 是否支持此convert + * @param grantType 授权类型 + * @return + */ + @Override + public boolean support(String grantType) { + return SecurityConstants.APP.equals(grantType); + } + + @Override + public OAuth2ResourceOwnerSmsAuthenticationToken buildToken(Authentication clientPrincipal, Set requestedScopes, + Map additionalParameters) { + return new OAuth2ResourceOwnerSmsAuthenticationToken(new AuthorizationGrantType(SecurityConstants.APP), + clientPrincipal, requestedScopes, additionalParameters); + } + + /** + * 校验扩展参数 密码模式密码必须不为空 + * @param request 参数列表 + */ + @Override + public void checkParams(HttpServletRequest request) { + MultiValueMap parameters = OAuth2EndpointUtils.getParameters(request); + // PHONE (REQUIRED) + String phone = parameters.getFirst(SecurityConstants.SMS_PARAMETER_NAME); + if (!StringUtils.hasText(phone) || parameters.get(SecurityConstants.SMS_PARAMETER_NAME).size() != 1) { + OAuth2EndpointUtils.throwError(OAuth2ErrorCodes.INVALID_REQUEST, SecurityConstants.SMS_PARAMETER_NAME, + OAuth2EndpointUtils.ACCESS_TOKEN_REQUEST_ERROR_URI); + } + } + +} diff --git a/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/support/sms/OAuth2ResourceOwnerSmsAuthenticationProvider.java b/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/support/sms/OAuth2ResourceOwnerSmsAuthenticationProvider.java new file mode 100644 index 0000000..2cb2ed6 --- /dev/null +++ b/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/support/sms/OAuth2ResourceOwnerSmsAuthenticationProvider.java @@ -0,0 +1,66 @@ +package com.pig4cloud.pigx.auth.support.sms; + +import com.pig4cloud.pigx.auth.support.base.OAuth2ResourceOwnerBaseAuthenticationProvider; +import com.pig4cloud.pigx.common.core.constant.SecurityConstants; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.oauth2.core.AuthorizationGrantType; +import org.springframework.security.oauth2.core.OAuth2AuthenticationException; +import org.springframework.security.oauth2.core.OAuth2ErrorCodes; +import org.springframework.security.oauth2.core.OAuth2Token; +import org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationService; +import org.springframework.security.oauth2.server.authorization.client.RegisteredClient; +import org.springframework.security.oauth2.server.authorization.token.OAuth2TokenGenerator; + +import java.util.Map; + +/** + * @author lengleng + * @date date + * + * 短信登录的核心处理 + */ +public class OAuth2ResourceOwnerSmsAuthenticationProvider + extends OAuth2ResourceOwnerBaseAuthenticationProvider { + + private static final Logger LOGGER = LogManager.getLogger(OAuth2ResourceOwnerSmsAuthenticationProvider.class); + + /** + * Constructs an {@code OAuth2AuthorizationCodeAuthenticationProvider} using the + * provided parameters. + * @param authenticationManager + * @param authorizationService the authorization service + * @param tokenGenerator the token generator + * @since 0.2.3 + */ + public OAuth2ResourceOwnerSmsAuthenticationProvider(AuthenticationManager authenticationManager, + OAuth2AuthorizationService authorizationService, + OAuth2TokenGenerator tokenGenerator) { + super(authenticationManager, authorizationService, tokenGenerator); + } + + @Override + public boolean supports(Class authentication) { + boolean supports = OAuth2ResourceOwnerSmsAuthenticationToken.class.isAssignableFrom(authentication); + LOGGER.debug("supports authentication=" + authentication + " returning " + supports); + return supports; + } + + @Override + public void checkClient(RegisteredClient registeredClient) { + assert registeredClient != null; + if (!registeredClient.getAuthorizationGrantTypes() + .contains(new AuthorizationGrantType(SecurityConstants.APP))) { + throw new OAuth2AuthenticationException(OAuth2ErrorCodes.UNAUTHORIZED_CLIENT); + } + } + + @Override + public UsernamePasswordAuthenticationToken buildToken(Map reqParameters) { + String phone = (String) reqParameters.get(SecurityConstants.SMS_PARAMETER_NAME); + return new UsernamePasswordAuthenticationToken(phone, null); + } + +} diff --git a/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/support/sms/OAuth2ResourceOwnerSmsAuthenticationToken.java b/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/support/sms/OAuth2ResourceOwnerSmsAuthenticationToken.java new file mode 100644 index 0000000..1cf74ab --- /dev/null +++ b/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/support/sms/OAuth2ResourceOwnerSmsAuthenticationToken.java @@ -0,0 +1,21 @@ +package com.pig4cloud.pigx.auth.support.sms; + +import com.pig4cloud.pigx.auth.support.base.OAuth2ResourceOwnerBaseAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.oauth2.core.AuthorizationGrantType; + +import java.util.Map; +import java.util.Set; + +/** + * @author lengleng + * @description 短信登录token信息 + */ +public class OAuth2ResourceOwnerSmsAuthenticationToken extends OAuth2ResourceOwnerBaseAuthenticationToken { + + public OAuth2ResourceOwnerSmsAuthenticationToken(AuthorizationGrantType authorizationGrantType, + Authentication clientPrincipal, Set scopes, Map additionalParameters) { + super(authorizationGrantType, clientPrincipal, scopes, additionalParameters); + } + +} diff --git a/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/support/sms/package-info.java b/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/support/sms/package-info.java new file mode 100644 index 0000000..38a1771 --- /dev/null +++ b/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/support/sms/package-info.java @@ -0,0 +1,4 @@ +/** + * 短信模式 + */ +package com.pig4cloud.pigx.auth.support.sms; diff --git a/pigx-auth/src/main/resources/application.yml b/pigx-auth/src/main/resources/application.yml new file mode 100644 index 0000000..8b97a87 --- /dev/null +++ b/pigx-auth/src/main/resources/application.yml @@ -0,0 +1,18 @@ +server: + port: 3000 + +spring: + application: + name: @artifactId@ + cloud: + nacos: + username: @nacos.username@ + password: @nacos.password@ + discovery: + server-addr: ${NACOS_HOST:pigx-register}:${NACOS_PORT:8848} + config: + server-addr: ${spring.cloud.nacos.discovery.server-addr} + config: + import: + - optional:nacos:application-@profiles.active@.yml + - optional:nacos:${spring.application.name}-@profiles.active@.yml diff --git a/pigx-auth/src/main/resources/logback-spring.xml b/pigx-auth/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..528c50d --- /dev/null +++ b/pigx-auth/src/main/resources/logback-spring.xml @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + + + + + + ${log.path}/debug.log + + ${log.path}/%d{yyyy-MM, aux}/debug.%d{yyyy-MM-dd}.%i.log.gz + 50MB + 30 + + + %date [%thread] %-5level [%logger{50}] %file:%line - %msg%n + + + + + + ${log.path}/error.log + + ${log.path}/%d{yyyy-MM}/error.%d{yyyy-MM-dd}.%i.log.gz + 50MB + 30 + + + %date [%thread] %-5level [%logger{50}] %file:%line - %msg%n + + + ERROR + + + + + + + + + + + + + + + + + + diff --git a/pigx-auth/src/main/resources/static/css/bootstrap.min.css b/pigx-auth/src/main/resources/static/css/bootstrap.min.css new file mode 100644 index 0000000..c54ad99 --- /dev/null +++ b/pigx-auth/src/main/resources/static/css/bootstrap.min.css @@ -0,0 +1,6 @@ +/*! + * Bootstrap v3.3.7 (http://getbootstrap.com) + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff2) format('woff2'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\002a"}.glyphicon-plus:before{content:"\002b"}.glyphicon-eur:before,.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:focus,a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:focus,a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:focus,a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:focus,a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:focus,a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:focus,a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:focus,a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:focus,a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:focus,a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:focus,a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px\9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control::-ms-expand{background-color:transparent;border:0}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=time].form-control,input[type=datetime-local].form-control,input[type=month].form-control{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px\9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:11px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled.focus,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled].focus,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled.focus,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled].focus,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{color:#fff;background-color:#398439;border-color:#255625}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled.focus,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled].focus,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled.focus,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled].focus,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled.focus,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled].focus,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled.focus,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled].focus,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid\9;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px dashed;border-bottom:4px solid\9}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control:focus{z-index:3}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:2;color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:3;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{padding-right:15px;padding-left:15px;border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-left-radius:0;border-top-right-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;filter:alpha(opacity=0);opacity:0;line-break:auto}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);line-break:auto}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.active.right,.carousel-inner>.item.next{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);background-color:rgba(0,0,0,0);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-10px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;font-family:serif;line-height:1}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000\9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-10px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-10px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.modal-header:after,.modal-header:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.modal-header:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-lg,.visible-md,.visible-sm,.visible-xs{display:none!important}.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table!important}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}} +/*# sourceMappingURL=bootstrap.min.css.map */ \ No newline at end of file diff --git a/pigx-auth/src/main/resources/static/css/signin.css b/pigx-auth/src/main/resources/static/css/signin.css new file mode 100644 index 0000000..93d3765 --- /dev/null +++ b/pigx-auth/src/main/resources/static/css/signin.css @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +.sign_body { + padding-top: 40px; + padding-bottom: 40px; + background-color: #eee; +} + +.form-signin { + max-width: 330px; + padding: 15px; + margin: 0 auto; +} +.form-margin-top { + margin-top: 50px; +} +.form-signin .form-signin-heading, +.form-signin .checkbox { + margin-bottom: 10px; +} +.form-signin .checkbox { + font-weight: normal; +} +.form-signin .form-control { + position: relative; + height: auto; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + padding: 10px; + font-size: 16px; +} +.form-signin .form-control:focus { + z-index: 2; +} +.form-signin input[type="email"] { + margin-bottom: -1px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.form-signin input[type="password"] { + margin-bottom: 10px; + border-top-left-radius: 0; + border-top-right-radius: 0; +} +footer{ + text-align: center; + position:absolute; + bottom:0; + width:100%; + height:100px; +} diff --git a/pigx-auth/src/main/resources/templates/ftl/confirm.ftl b/pigx-auth/src/main/resources/templates/ftl/confirm.ftl new file mode 100644 index 0000000..ba21567 --- /dev/null +++ b/pigx-auth/src/main/resources/templates/ftl/confirm.ftl @@ -0,0 +1,56 @@ + + + + + + + PigX 第三方授权 + + + + + +

+
+
+ + + +

+ 将获得以下权限:

+
    +
  • + <#list scopeList as scope> + + +
+

授权后表明你已同意 服务协议

+ +

+
+
+ + + diff --git a/pigx-auth/src/main/resources/templates/ftl/login.ftl b/pigx-auth/src/main/resources/templates/ftl/login.ftl new file mode 100644 index 0000000..d259751 --- /dev/null +++ b/pigx-auth/src/main/resources/templates/ftl/login.ftl @@ -0,0 +1,44 @@ + + + + + + + + + + + PigX微服务统一认证 + + + + + + +
+ +
+ + + diff --git a/pigx-common/pigx-common-audit/pom.xml b/pigx-common/pigx-common-audit/pom.xml new file mode 100644 index 0000000..c5b6c53 --- /dev/null +++ b/pigx-common/pigx-common-audit/pom.xml @@ -0,0 +1,38 @@ + + + 4.0.0 + + com.pig4cloud + pigx-common + 5.2.0 + + + pigx-common-audit + jar + + pigx 数据审计相关工具类 + + + + + org.javers + javers-core + + + + org.springframework.boot + spring-boot-starter-aop + + + + com.pig4cloud + as-upms-api + + + + org.springframework.security + spring-security-core + + + diff --git a/pigx-common/pigx-common-audit/src/main/java/com/pig4cloud/pigx/common/audit/AuditAutoConfiguration.java b/pigx-common/pigx-common-audit/src/main/java/com/pig4cloud/pigx/common/audit/AuditAutoConfiguration.java new file mode 100644 index 0000000..00c8fcb --- /dev/null +++ b/pigx-common/pigx-common-audit/src/main/java/com/pig4cloud/pigx/common/audit/AuditAutoConfiguration.java @@ -0,0 +1,51 @@ +package com.pig4cloud.pigx.common.audit; + +import com.pig4cloud.pigx.admin.api.feign.RemoteAuditLogService; +import com.pig4cloud.pigx.common.audit.aop.AuditAspect; +import com.pig4cloud.pigx.common.audit.handle.DefaultAuditLogHandle; +import com.pig4cloud.pigx.common.audit.handle.IAuditLogHandle; +import com.pig4cloud.pigx.common.audit.handle.ICompareHandle; +import com.pig4cloud.pigx.common.audit.handle.JavesCompareHandle; +import com.pig4cloud.pigx.common.audit.support.SpelParser; +import com.pig4cloud.pigx.common.core.util.KeyStrResolver; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Import; +import org.springframework.scheduling.annotation.EnableAsync; + +import java.util.Optional; + +/** + * 审计自动配置类 + * + * @author lengleng + * @date 2023/2/26 + */ +@EnableAsync +@AutoConfiguration +@Import({ AuditAspect.class, SpelParser.class }) +public class AuditAutoConfiguration { + + /** + * 默认注入 javers 的比较器实现 + * @param auditNameHandleOptional 注入审计用户来源 + * @return ICompareHandle + */ + @Bean + @ConditionalOnMissingBean + public ICompareHandle compareHandle(Optional auditNameHandleOptional) { + return new JavesCompareHandle(auditNameHandleOptional); + } + + /** + * 默认的审计日志存储策略 + * @return DefaultAuditLogHandle + */ + @Bean + @ConditionalOnMissingBean + public IAuditLogHandle auditLogHandle(RemoteAuditLogService logService, KeyStrResolver tenantKeyStrResolver) { + return new DefaultAuditLogHandle(logService, tenantKeyStrResolver); + } + +} diff --git a/pigx-common/pigx-common-audit/src/main/java/com/pig4cloud/pigx/common/audit/annotation/Audit.java b/pigx-common/pigx-common-audit/src/main/java/com/pig4cloud/pigx/common/audit/annotation/Audit.java new file mode 100644 index 0000000..4388549 --- /dev/null +++ b/pigx-common/pigx-common-audit/src/main/java/com/pig4cloud/pigx/common/audit/annotation/Audit.java @@ -0,0 +1,47 @@ +package com.pig4cloud.pigx.common.audit.annotation; + +import org.springframework.core.annotation.AliasFor; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * @author lengleng + * + * 记需要进行审计的方法 + */ +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +public @interface Audit { + + /** + * 此审计的名称 + * @return 审计名称 + */ + String name(); + + @AliasFor("spel") + String value() default ""; + + /** + * 默认查询的表达式 + * @return string + */ + @AliasFor("value") + String spel() default ""; + + /** + * 查询原有结果的表达式,如果为空取 spel() + * @return string + */ + String oldVal() default ""; + + /** + * 查询编辑后的表达式,如果为空取 spel() + * @return string + */ + String newVal() default ""; + +} diff --git a/pigx-common/pigx-common-audit/src/main/java/com/pig4cloud/pigx/common/audit/aop/AuditAspect.java b/pigx-common/pigx-common-audit/src/main/java/com/pig4cloud/pigx/common/audit/aop/AuditAspect.java new file mode 100644 index 0000000..8ade8e8 --- /dev/null +++ b/pigx-common/pigx-common-audit/src/main/java/com/pig4cloud/pigx/common/audit/aop/AuditAspect.java @@ -0,0 +1,36 @@ +package com.pig4cloud.pigx.common.audit.aop; + +import com.pig4cloud.pigx.common.audit.annotation.Audit; +import com.pig4cloud.pigx.common.audit.handle.ICompareHandle; +import com.pig4cloud.pigx.common.audit.support.SpelParser; +import lombok.RequiredArgsConstructor; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.springframework.util.StringUtils; + +/** + * @author lengleng + * @date 2023/2/26 + * + * 拦截被@Audit注解标记的方法,并记录前后变化值 + */ + +@Aspect +@RequiredArgsConstructor +public class AuditAspect { + + private final ICompareHandle compareHandle; + + @Around("@annotation(audit)") + public Object auditLog(ProceedingJoinPoint joinPoint, Audit audit) throws Throwable { + // 获取变更之前的结果 + Object oldVal = SpelParser.parser(joinPoint, + StringUtils.hasText(audit.oldVal()) ? audit.oldVal() : audit.spel()); + Object result = joinPoint.proceed(); + + compareHandle.compare(oldVal, joinPoint, audit); + return result; + } + +} diff --git a/pigx-common/pigx-common-audit/src/main/java/com/pig4cloud/pigx/common/audit/handle/DefaultAuditLogHandle.java b/pigx-common/pigx-common-audit/src/main/java/com/pig4cloud/pigx/common/audit/handle/DefaultAuditLogHandle.java new file mode 100644 index 0000000..6c7be11 --- /dev/null +++ b/pigx-common/pigx-common-audit/src/main/java/com/pig4cloud/pigx/common/audit/handle/DefaultAuditLogHandle.java @@ -0,0 +1,83 @@ +package com.pig4cloud.pigx.common.audit.handle; + +import com.pig4cloud.pigx.admin.api.entity.SysAuditLog; +import com.pig4cloud.pigx.admin.api.feign.RemoteAuditLogService; +import com.pig4cloud.pigx.common.audit.annotation.Audit; +import com.pig4cloud.pigx.common.core.constant.SecurityConstants; +import com.pig4cloud.pigx.common.core.util.KeyStrResolver; +import com.pig4cloud.pigx.common.core.util.SpringContextHolder; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.javers.core.Changes; +import org.javers.core.diff.Change; +import org.javers.core.diff.changetype.ValueChange; +import org.springframework.scheduling.annotation.Async; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * 默认的审计日志存储 + * + * @author lengleng + * @date 2023/2/27 + */ +@Slf4j +@RequiredArgsConstructor +public class DefaultAuditLogHandle implements IAuditLogHandle { + + private final RemoteAuditLogService remoteLogService; + + private final KeyStrResolver tenantKeyStrResolver; + + @Override + public void handle(Audit audit, Changes changes) { + // 如果变更项为空则不进行审计 + if (changes.isEmpty()) { + return; + } + + // 获取当前操作人 + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + // 如果获取不到授权信息、或者没有身份信息的接口 直接跳过处理 + if (Objects.isNull(authentication) || !authentication.isAuthenticated()) { + return; + } + + List auditLogList = new ArrayList<>(); + for (Change change : changes) { + ValueChange valueChange = (ValueChange) change; + + SysAuditLog auditLog = new SysAuditLog(); + auditLog.setAuditName(audit.name()); + auditLog.setAuditField(valueChange.getPropertyName()); // 修改的字段名称 + + if (Objects.nonNull(valueChange.getLeft())) { + auditLog.setBeforeVal(valueChange.getLeft().toString()); // 更改前的值 + } + if (Objects.nonNull(valueChange.getRight())) { + auditLog.setAfterVal(valueChange.getRight().toString()); // getRight + } + + auditLog.setCreateBy(authentication.getName()); // 操作人 + auditLog.setCreateTime(LocalDateTime.now()); // 操作时间 + auditLog.setTenantId(Long.parseLong(tenantKeyStrResolver.key())); // 设置操作所属租户 + + auditLogList.add(auditLog); + } + + // 异步保存日志,提升性能 + IAuditLogHandle auditLogHandle = SpringContextHolder.getBean(IAuditLogHandle.class); + auditLogHandle.asyncSend(auditLogList); + } + + @Async + public void asyncSend(List auditLogList) { + remoteLogService.saveLog(auditLogList, SecurityConstants.FROM_IN); + } + +} diff --git a/pigx-common/pigx-common-audit/src/main/java/com/pig4cloud/pigx/common/audit/handle/IAuditLogHandle.java b/pigx-common/pigx-common-audit/src/main/java/com/pig4cloud/pigx/common/audit/handle/IAuditLogHandle.java new file mode 100644 index 0000000..3f3fc87 --- /dev/null +++ b/pigx-common/pigx-common-audit/src/main/java/com/pig4cloud/pigx/common/audit/handle/IAuditLogHandle.java @@ -0,0 +1,21 @@ +package com.pig4cloud.pigx.common.audit.handle; + +import com.pig4cloud.pigx.admin.api.entity.SysAuditLog; +import com.pig4cloud.pigx.common.audit.annotation.Audit; +import org.javers.core.Changes; + +import java.util.List; + +/** + * @author lengleng + * @date 2023/2/26 + * + * 审计日志处理器 + */ +public interface IAuditLogHandle { + + void handle(Audit audit, Changes changes); + + void asyncSend(List auditLogList); + +} diff --git a/pigx-common/pigx-common-audit/src/main/java/com/pig4cloud/pigx/common/audit/handle/ICompareHandle.java b/pigx-common/pigx-common-audit/src/main/java/com/pig4cloud/pigx/common/audit/handle/ICompareHandle.java new file mode 100644 index 0000000..97f6ff1 --- /dev/null +++ b/pigx-common/pigx-common-audit/src/main/java/com/pig4cloud/pigx/common/audit/handle/ICompareHandle.java @@ -0,0 +1,22 @@ +package com.pig4cloud.pigx.common.audit.handle; + +import com.pig4cloud.pigx.common.audit.annotation.Audit; +import org.aspectj.lang.ProceedingJoinPoint; +import org.javers.core.Changes; + +/** + * 比较器抽象类 + * + * @author lengleng + * @date 2023/2/26 + */ +public interface ICompareHandle { + + /** + * 比较两个对象是否变更,及其变更后如何审计 + * @param oldVal 原有值 + * @param newVal 变更后值 + */ + Changes compare(Object oldVal, ProceedingJoinPoint joinPoint, Audit audit); + +} diff --git a/pigx-common/pigx-common-audit/src/main/java/com/pig4cloud/pigx/common/audit/handle/JavesCompareHandle.java b/pigx-common/pigx-common-audit/src/main/java/com/pig4cloud/pigx/common/audit/handle/JavesCompareHandle.java new file mode 100644 index 0000000..d99d403 --- /dev/null +++ b/pigx-common/pigx-common-audit/src/main/java/com/pig4cloud/pigx/common/audit/handle/JavesCompareHandle.java @@ -0,0 +1,37 @@ +package com.pig4cloud.pigx.common.audit.handle; + +import com.pig4cloud.pigx.common.audit.annotation.Audit; +import com.pig4cloud.pigx.common.audit.support.DataAuditor; +import com.pig4cloud.pigx.common.audit.support.SpelParser; +import lombok.RequiredArgsConstructor; +import org.aspectj.lang.ProceedingJoinPoint; +import org.javers.core.Changes; +import org.springframework.util.StringUtils; + +import java.util.Optional; + +/** + * javers 比较实现 + * + * @author lengleng + * @date 2023/2/26 + */ +@RequiredArgsConstructor +public class JavesCompareHandle implements ICompareHandle { + + private final Optional auditLogHandleOptional; + + /** + * 比较两个对象是否变更,及其变更后如何审计 + * @param oldVal 原有值 + */ + @Override + public Changes compare(Object oldVal, ProceedingJoinPoint joinPoint, Audit audit) { + Object newVal = SpelParser.parser(joinPoint, + StringUtils.hasText(audit.newVal()) ? audit.newVal() : audit.spel()); + Changes compare = DataAuditor.compare(oldVal, newVal); + auditLogHandleOptional.ifPresent(handle -> handle.handle(audit, compare)); + return compare; + } + +} diff --git a/pigx-common/pigx-common-audit/src/main/java/com/pig4cloud/pigx/common/audit/support/DataAuditor.java b/pigx-common/pigx-common-audit/src/main/java/com/pig4cloud/pigx/common/audit/support/DataAuditor.java new file mode 100644 index 0000000..5c570e2 --- /dev/null +++ b/pigx-common/pigx-common-audit/src/main/java/com/pig4cloud/pigx/common/audit/support/DataAuditor.java @@ -0,0 +1,27 @@ +package com.pig4cloud.pigx.common.audit.support; + +import lombok.experimental.UtilityClass; +import org.javers.core.Changes; +import org.javers.core.Javers; +import org.javers.core.JaversBuilder; +import org.javers.core.diff.Diff; + +import static org.javers.core.diff.ListCompareAlgorithm.LEVENSHTEIN_DISTANCE; + +/** + * javers 审计工具 + * + * @author lengleng + * @date 2023/2/26 + */ +@UtilityClass +public class DataAuditor { + + private final Javers javers = JaversBuilder.javers().withListCompareAlgorithm(LEVENSHTEIN_DISTANCE).build(); + + public Changes compare(Object newObj, Object oldObj) { + Diff compare = javers.compare(newObj, oldObj); + return compare.getChanges(); + } + +} diff --git a/pigx-common/pigx-common-audit/src/main/java/com/pig4cloud/pigx/common/audit/support/SpelParser.java b/pigx-common/pigx-common-audit/src/main/java/com/pig4cloud/pigx/common/audit/support/SpelParser.java new file mode 100644 index 0000000..9890eeb --- /dev/null +++ b/pigx-common/pigx-common-audit/src/main/java/com/pig4cloud/pigx/common/audit/support/SpelParser.java @@ -0,0 +1,39 @@ +package com.pig4cloud.pigx.common.audit.support; + +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.reflect.MethodSignature; +import org.springframework.beans.BeansException; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.context.expression.BeanFactoryResolver; +import org.springframework.expression.spel.standard.SpelExpressionParser; +import org.springframework.expression.spel.support.StandardEvaluationContext; + +/** + * 表达式处理器 + * + * @author lengleng + * @date 2023/2/26 + */ +public class SpelParser implements ApplicationContextAware { + + private final static SpelExpressionParser parser = new SpelExpressionParser(); + + private static ApplicationContext applicationContext; + + public static Object parser(ProceedingJoinPoint joinPoint, String spel) { + StandardEvaluationContext context = new StandardEvaluationContext(); + context.setBeanResolver(new BeanFactoryResolver(applicationContext)); + for (int i = 0; i < joinPoint.getArgs().length; i++) { + String paramName = ((MethodSignature) joinPoint.getSignature()).getParameterNames()[i]; + context.setVariable(paramName, joinPoint.getArgs()[i]); + } + return parser.parseExpression(spel).getValue(context); + } + + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + SpelParser.applicationContext = applicationContext; + } + +} diff --git a/pigx-common/pigx-common-audit/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/pigx-common/pigx-common-audit/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 0000000..1f69a6f --- /dev/null +++ b/pigx-common/pigx-common-audit/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1 @@ +com.pig4cloud.pigx.common.audit.AuditAutoConfiguration diff --git a/pigx-common/pigx-common-bom/pom.xml b/pigx-common/pigx-common-bom/pom.xml new file mode 100644 index 0000000..d6ad1db --- /dev/null +++ b/pigx-common/pigx-common-bom/pom.xml @@ -0,0 +1,446 @@ + + + 4.0.0 + + group.springframework + spring-cloud-dependencies-parent + 2021.0.7 + + + + com.pig4cloud + pigx-common-bom + pom + ${pigx.version} + pigx 公共版本控制 + + + 5.2.0 + 3.5.3.2 + 1.4.5 + 4.1.3 + 1.2.19 + 5.8.21 + 8.0.32 + 21.3.0.0 + 8.4.1.jre8 + 8.1.2.192 + 6.2.0 + 3.0.3 + 2.2.8 + 1.6.15 + 4.4.0 + 2.8.0 + 3.0.3 + 1.13.1 + 5.3.3 + 6.8.0 + 2.3.6.RELEASE + 1.2.83 + 2.3.0 + 3.0.52.ALL + 1.12.261 + 6.10.0 + 1.6.1 + 7.1 + 2.17.1 + 0.0.23 + 0.33.0 + 1.0.0 + 1.8.4 + + + + + + com.pig4cloud + pigx-common-core + ${pigx.version} + + + com.pig4cloud + pigx-common-audit + ${pigx.version} + + + com.pig4cloud + pigx-common-data + ${pigx.version} + + + com.pig4cloud + pigx-common-gateway + ${pigx.version} + + + com.pig4cloud + pigx-common-gray + ${pigx.version} + + + com.pig4cloud + pigx-common-datasource + ${pigx.version} + + + com.pig4cloud + pigx-common-idempotent + ${pigx.version} + + + com.pig4cloud + pigx-common-job + ${pigx.version} + + + com.pig4cloud + pigx-common-log + ${pigx.version} + + + com.pig4cloud + pigx-common-oss + ${pigx.version} + + + com.pig4cloud + pigx-common-security + ${pigx.version} + + + com.pig4cloud + pigx-common-sentinel + ${pigx.version} + + + com.pig4cloud + pigx-common-feign + ${pigx.version} + + + com.pig4cloud + pigx-common-sequence + ${pigx.version} + + + com.pig4cloud + pigx-common-swagger + ${pigx.version} + + + com.pig4cloud + pigx-common-seata + ${pigx.version} + + + com.pig4cloud + pigx-common-xss + ${pigx.version} + + + com.pig4cloud + pigx-common-websocket + ${pigx.version} + + + com.pig4cloud + pigx-common-encrypt-api + ${pigx.version} + + + com.pig4cloud + pigx-common-excel + ${pigx.version} + + + com.pig4cloud + as-upms-api + ${pigx.version} + + + + com.pig4cloud + as-app-server-api + ${pigx.version} + + + + com.pig4cloud + pigx-flow-task-api + ${pigx.version} + + + + com.pig4cloud + pigx-flow-engine-api + ${pigx.version} + + + + org.ow2.asm + asm + ${asm.version} + + + + io.seata + seata-serializer-kryo + ${seata.version} + + + + com.baomidou + mybatis-plus-extension + ${mybatis-plus.version} + + + + com.baomidou + mybatis-plus-boot-starter + ${mybatis-plus.version} + + + com.baomidou + dynamic-datasource-spring-boot-starter + ${dynamic-ds.version} + + + + com.github.yulichang + mybatis-plus-join-boot-starter + ${mybatis-plus-join.version} + + + + com.github.yulichang + mybatis-plus-join-annotation + ${mybatis-plus-join.version} + + + + com.alibaba + druid-spring-boot-starter + ${druid.version} + + + com.alibaba + druid + ${druid.version} + + + + com.mysql + mysql-connector-j + ${mysql.connector.version} + + + + com.oracle.database.jdbc + ojdbc8 + ${oracle.version} + + + + com.microsoft.sqlserver + mssql-jdbc + ${sqlserver.version} + + + + com.dameng + DmJdbcDriver18 + ${dm.version} + + + com.dameng + DmDialect-for-hibernate5.3 + ${dm.version} + + + com.highgo + HgdbJdbc + ${highgo.version} + + + + com.alibaba + fastjson + ${fastjson.version} + + + + org.javers + javers-core + ${javers.version} + + + + org.springdoc + springdoc-openapi-webmvc-core + ${springdoc.version} + + + io.springboot + knife4j-openapi3-ui + 3.0.3 + + + io.swagger.core.v3 + swagger-models + ${swagger.core.version} + + + io.swagger.core.v3 + swagger-annotations + ${swagger.core.version} + + + org.springdoc + springdoc-openapi-webflux-ui + ${springdoc.version} + + + org.springdoc + springdoc-openapi-webflux-core + ${springdoc.version} + + + org.springdoc + springdoc-openapi-common + ${springdoc.version} + + + org.springdoc + springdoc-openapi-security + ${springdoc.version} + + + + com.github.binarywang + weixin-java-mp + ${mp.weixin.version} + + + com.github.binarywang + weixin-java-cp + ${mp.weixin.version} + + + com.github.binarywang + weixin-java-common + ${mp.weixin.version} + + + + com.googlecode.aviator + aviator + ${aviator.version} + + + + org.flowable + flowable-spring-boot-starter-process + ${flowable.version} + + + + com.github.javen205 + IJPay-WxPay + ${ijpay.version} + + + com.github.javen205 + IJPay-AliPay + ${ijpay.version} + + + + org.codehaus.groovy + groovy + ${groovy.version} + + + + org.springframework.security.oauth + spring-security-oauth2 + ${security.oauth.version} + + + + org.jsoup + jsoup + ${jsoup.version} + + + + org.apache.logging.log4j + log4j-to-slf4j + ${log4j2.version} + + + org.apache.logging.log4j + log4j-bom + ${log4j2.version} + pom + import + + + + cn.hutool + hutool-bom + ${hutool.version} + pom + import + + + com.alibaba.csp + sentinel-core + ${sentinel.version} + pom + import + + + com.alibaba.csp + sentinel-web-servlet + ${sentinel.version} + pom + import + + + com.alibaba.csp + sentinel-transport-simple-http + ${sentinel.version} + pom + import + + + com.alibaba.csp + sentinel-parameter-flow-control + ${sentinel.version} + pom + import + + + com.alibaba.csp + sentinel-api-gateway-adapter-common + ${sentinel.version} + pom + import + + + + + + + + rdc-releases + https://packages.aliyun.com/maven/repository/2161442-release-DcBZC1/ + + + rdc-snapshots + https://packages.aliyun.com/maven/repository/2161442-snapshot-FzKqZK/ + + + diff --git a/pigx-common/pigx-common-core/pom.xml b/pigx-common/pigx-common-core/pom.xml new file mode 100644 index 0000000..07439cf --- /dev/null +++ b/pigx-common/pigx-common-core/pom.xml @@ -0,0 +1,56 @@ + + + 4.0.0 + + com.pig4cloud + pigx-common + 5.2.0 + + + pigx-common-core + jar + + pigx 公共工具类核心包 + + + + + + cn.hutool + hutool-json + + + + org.springframework + spring-webmvc + provided + + + + javax.servlet + javax.servlet-api + + + + org.springframework.boot + spring-boot-starter-validation + + + + org.springframework.boot + spring-boot-starter-json + + + + com.alibaba + transmittable-thread-local + ${ttl.version} + + + + io.swagger.core.v3 + swagger-annotations + + + diff --git a/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/config/JacksonConfiguration.java b/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/config/JacksonConfiguration.java new file mode 100644 index 0000000..3ea0269 --- /dev/null +++ b/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/config/JacksonConfiguration.java @@ -0,0 +1,86 @@ +package com.pig4cloud.pigx.common.core.config; + +import cn.hutool.core.date.DatePattern; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import com.pig4cloud.pigx.common.core.jackson.PigxJavaTimeModule; +import org.springframework.boot.autoconfigure.AutoConfigureBefore; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication; +import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer; +import org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration; +import org.springframework.boot.web.servlet.filter.OrderedCharacterEncodingFilter; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.Ordered; +import org.springframework.format.FormatterRegistry; +import org.springframework.format.datetime.standard.DateTimeFormatterRegistrar; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +import java.nio.charset.StandardCharsets; +import java.time.format.DateTimeFormatter; +import java.util.Locale; +import java.util.TimeZone; + +/** + * JacksonConfig 配置时间转换规则 + * {@link com.pig4cloud.pigx.common.core.jackson.PigxJavaTimeModule}、默认时区等 + * + * @author L.cm + * @author lengleng + * @author lishangbu + * @date 2020-06-15 + */ +@Configuration +@ConditionalOnClass(ObjectMapper.class) +@AutoConfigureBefore(JacksonAutoConfiguration.class) +@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET) +public class JacksonConfiguration implements WebMvcConfigurer { + + private static final String ASIA_SHANGHAI = "Asia/Shanghai"; + + @Bean + @ConditionalOnMissingBean + public Jackson2ObjectMapperBuilderCustomizer customizer() { + return builder -> { + builder.locale(Locale.CHINA); + builder.timeZone(TimeZone.getTimeZone(ASIA_SHANGHAI)); + builder.simpleDateFormat(DatePattern.NORM_DATETIME_PATTERN); + builder.serializerByType(Long.class, ToStringSerializer.instance); + builder.modules(new PigxJavaTimeModule()); + }; + } + + /** + * 增加GET请求参数中时间类型转换 {@link com.pig4cloud.pigx.common.core.jackson.PigxJavaTimeModule} + *
    + *
  • HH:mm:ss -> LocalTime
  • + *
  • yyyy-MM-dd -> LocalDate
  • + *
  • yyyy-MM-dd HH:mm:ss -> LocalDateTime
  • + *
+ * @param registry + */ + @Override + public void addFormatters(FormatterRegistry registry) { + DateTimeFormatterRegistrar registrar = new DateTimeFormatterRegistrar(); + registrar.setTimeFormatter(DateTimeFormatter.ofPattern(DatePattern.NORM_TIME_PATTERN)); + registrar.setDateFormatter(DateTimeFormatter.ofPattern(DatePattern.NORM_DATE_PATTERN)); + registrar.setDateTimeFormatter(DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_PATTERN)); + registrar.registerFormatters(registry); + } + + /** + * 避免form 提交 context-type 不规范中文乱码 + * @return Filter + */ + @Bean + public OrderedCharacterEncodingFilter characterEncodingFilter() { + OrderedCharacterEncodingFilter filter = new OrderedCharacterEncodingFilter(); + filter.setEncoding(StandardCharsets.UTF_8.name()); + filter.setForceEncoding(true); + filter.setOrder(Ordered.HIGHEST_PRECEDENCE); + return filter; + } + +} diff --git a/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/config/MessageSourceConfiguration.java b/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/config/MessageSourceConfiguration.java new file mode 100644 index 0000000..e8bc58a --- /dev/null +++ b/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/config/MessageSourceConfiguration.java @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.common.core.config; + +import org.springframework.context.MessageSource; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.support.ReloadableResourceBundleMessageSource; + +/** + * @author lengleng + * @date 2018/11/14 + *

+ * 国际化配置 + */ +@Configuration +public class MessageSourceConfiguration { + + @Bean + public MessageSource pigxMessageSource() { + ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource(); + messageSource.setBasename("classpath:i18n/messages"); + return messageSource; + } + +} diff --git a/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/config/RestTemplateConfiguration.java b/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/config/RestTemplateConfiguration.java new file mode 100644 index 0000000..861b67f --- /dev/null +++ b/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/config/RestTemplateConfiguration.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.common.core.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.client.RestTemplate; + +/** + * @author lengleng + * @date 2018/8/16 RestTemplate + */ +@Configuration +public class RestTemplateConfiguration { + + @Bean + public RestTemplate restTemplate() { + return new RestTemplate(); + } + +} diff --git a/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/constant/CacheConstants.java b/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/constant/CacheConstants.java new file mode 100644 index 0000000..989c005 --- /dev/null +++ b/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/constant/CacheConstants.java @@ -0,0 +1,118 @@ +package com.pig4cloud.pigx.common.core.constant; + +/** + * @author lengleng + * @date 2019-04-28 + *

+ * 缓存的key 常量 + */ +public interface CacheConstants { + + /** + * 全局缓存,在缓存名称上加上该前缀表示该缓存不区分租户,比如: + *

+ * {@code @Cacheable(value = CacheConstants.GLOBALLY+CacheConstants.MENU_DETAILS, key = "#roleId + '_menu'", unless = "#result == null")} + */ + String GLOBALLY = "gl:"; + + /** + * 验证码前缀 + */ + String DEFAULT_CODE_KEY = "DEFAULT_CODE_KEY:"; + + /** + * 菜单信息缓存 + */ + String MENU_DETAILS = "menu_details"; + + /** + * 用户信息缓存 + */ + String USER_DETAILS = "user_details"; + + /** + * 移动端用户信息缓存 + */ + String USER_DETAILS_MINI = "user_details_mini"; + + /** + * 角色信息缓存 + */ + String ROLE_DETAILS = "role_details"; + + /** + * 字典信息缓存 + */ + String DICT_DETAILS = "dict_details"; + + /** + * oauth 客户端信息 + */ + String CLIENT_DETAILS_KEY = "pigx_oauth:client:details"; + + /** + * spring boot admin 事件key + */ + String EVENT_KEY = GLOBALLY + "event_key"; + + /** + * 路由存放 + */ + String ROUTE_KEY = GLOBALLY + "gateway_route_key"; + + /** + * 内存reload 时间 + */ + String ROUTE_JVM_RELOAD_TOPIC = "gateway_jvm_route_reload_topic"; + + /** + * redis 重新加载 路由信息 + */ + String ROUTE_REDIS_RELOAD_TOPIC = "upms_redis_route_reload_topic"; + + /** + * redis 重新加载客户端信息 + */ + String CLIENT_REDIS_RELOAD_TOPIC = "upms_redis_client_reload_topic"; + + /** + * 公众号 reload + */ + String MP_REDIS_RELOAD_TOPIC = "mp_redis_reload_topic"; + + /** + * 支付 reload 事件 + */ + String PAY_REDIS_RELOAD_TOPIC = "pay_redis_reload_topic"; + + /** + * 参数缓存 + */ + String PARAMS_DETAILS = "params_details"; + + /** + * 租户缓存 (不区分租户) + */ + String TENANT_DETAILS = GLOBALLY + "tenant_details"; + + /** + * i18n缓存 (不区分租户) + */ + String I18N_DETAILS = GLOBALLY + "i18n_details"; + + /** + * 客户端配置缓存 + */ + String CLIENT_FLAG = "client_config_flag"; + + /** + * 登录错误次数 + */ + String LOGIN_ERROR_TIMES = "login_error_times"; + + /** + * oauth 缓存前缀 + */ + String PROJECT_OAUTH_ACCESS = "token::access_token"; + +} diff --git a/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/constant/CommonConstants.java b/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/constant/CommonConstants.java new file mode 100644 index 0000000..93bcc21 --- /dev/null +++ b/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/constant/CommonConstants.java @@ -0,0 +1,138 @@ +/* + * + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + * + */ + +package com.pig4cloud.pigx.common.core.constant; + +/** + * @author lengleng + * @date 2017/10/29 + */ +public interface CommonConstants { + + /** + * header 中租户ID + */ + String TENANT_ID = "TENANT-ID"; + + /** + * header 中版本信息 + */ + String VERSION = "VERSION"; + + /** + * 租户ID + */ + Long TENANT_ID_1 = 1L; + + /** + * 删除 + */ + String STATUS_DEL = "1"; + + /** + * 正常 + */ + String STATUS_NORMAL = "0"; + + /** + * 锁定 + */ + String STATUS_LOCK = "9"; + + /** + * 菜单树根节点 + */ + Long MENU_TREE_ROOT_ID = -1L; + + /** + * 编码 + */ + String UTF8 = "UTF-8"; + + /** + * 前端工程名 + */ + String FRONT_END_PROJECT = "pigx-ui"; + + /** + * 移动端工程名 + */ + String UNI_END_PROJECT = "pigx-app"; + + /** + * 后端工程名 + */ + String BACK_END_PROJECT = "pigx"; + + /** + * 公共参数 + */ + String PIG_PUBLIC_PARAM_KEY = "PIG_PUBLIC_PARAM_KEY"; + + /** + * 成功标记 + */ + Integer SUCCESS = 0; + + /** + * 失败标记 + */ + Integer FAIL = 1; + + /** + * 默认存储bucket + */ + String BUCKET_NAME = "lengleng"; + + /** + * 滑块验证码 + */ + String IMAGE_CODE_TYPE = "blockPuzzle"; + + /** + * 验证码开关 + */ + String CAPTCHA_FLAG = "captcha_flag"; + + /** + * 密码传输是否加密 + */ + String ENC_FLAG = "enc_flag"; + + /** + * 客户端允许同时在线数量 + */ + String ONLINE_QUANTITY = "online_quantity"; + + /** + * 请求开始时间 + */ + String REQUEST_START_TIME = "REQUEST-START-TIME"; + + /** + * 当前页 + */ + String CURRENT = "current"; + + /** + * size + */ + String SIZE = "size"; + +} diff --git a/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/constant/PaginationConstants.java b/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/constant/PaginationConstants.java new file mode 100644 index 0000000..70adcf5 --- /dev/null +++ b/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/constant/PaginationConstants.java @@ -0,0 +1,21 @@ +package com.pig4cloud.pigx.common.core.constant; + +/** + * 分页相关的参数 + * + * @author lishangbu + * @date 2018/11/22 + */ +public interface PaginationConstants { + + /** + * 当前页 + */ + String CURRENT = "current"; + + /** + * 每页大小 + */ + String SIZE = "size"; + +} diff --git a/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/constant/SecurityConstants.java b/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/constant/SecurityConstants.java new file mode 100644 index 0000000..49d1717 --- /dev/null +++ b/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/constant/SecurityConstants.java @@ -0,0 +1,252 @@ +/* + * + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + * + */ + +package com.pig4cloud.pigx.common.core.constant; + +/** + * @author lengleng + * @date 2017-12-18 + */ +public interface SecurityConstants { + + /** + * 启动时是否检查Inner注解安全性 + */ + boolean INNER_CHECK = true; + + /** + * 刷新 + */ + String REFRESH_TOKEN = "refresh_token"; + + /** + * 验证码有效期 + */ + int CODE_TIME = 60; + + /** + * 验证码长度 + */ + String CODE_SIZE = "4"; + + /** + * 角色前缀 + */ + String ROLE = "ROLE_"; + + /** + * 前缀 + */ + String PIGX_PREFIX = "pigx_"; + + /** + * token 相关前缀 + */ + String TOKEN_PREFIX = "token:"; + + /** + * oauth 相关前缀 + */ + String OAUTH_PREFIX = "oauth:"; + + /** + * 授权码模式code key 前缀 + */ + String OAUTH_CODE_PREFIX = "oauth:code:"; + + /** + * 项目的license + */ + String PIGX_LICENSE = "https://pig4cloud.com"; + + /** + * 内部 + */ + String FROM_IN = "Y"; + + /** + * 标志 + */ + String FROM = "from"; + + /** + * 请求header + */ + String HEADER_FROM_IN = FROM + "=" + FROM_IN; + + /** + * OAUTH URL + */ + String OAUTH_TOKEN_URL = "/oauth2/token"; + + /** + * 移动端授权 + */ + String GRANT_MOBILE = "mobile"; + + /** + * TOC 客户端 + */ + String HEADER_TOC = "CLIENT-TOC"; + + /** + * TOC 客户端 + */ + String HEADER_TOC_YES = "Y"; + + /** + * QQ获取token + */ + String QQ_AUTHORIZATION_CODE_URL = "https://graph.qq.com/oauth2.0/token?grant_type=" + + "authorization_code&code=%S&client_id=%s&redirect_uri=" + "%s&client_secret=%s"; + + /** + * 微信获取OPENID + */ + String WX_AUTHORIZATION_CODE_URL = "https://api.weixin.qq.com/sns/oauth2/access_token" + + "?appid=%s&secret=%s&code=%s&grant_type=authorization_code"; + + /** + * 微信小程序OPENID + */ + String MINI_APP_AUTHORIZATION_CODE_URL = "https://api.weixin.qq.com/sns/jscode2session" + + "?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code"; + + /** + * 码云获取token + */ + String GITEE_AUTHORIZATION_CODE_URL = "https://gitee.com/oauth/token?grant_type=" + + "authorization_code&code=%S&client_id=%s&redirect_uri=" + "%s&client_secret=%s"; + + /** + * 开源中国获取token + */ + String OSC_AUTHORIZATION_CODE_URL = "https://www.oschina.net/action/openapi/token"; + + /** + * QQ获取用户信息 + */ + String QQ_USER_INFO_URL = "https://graph.qq.com/oauth2.0/me?access_token=%s"; + + /** + * 码云获取用户信息 + */ + String GITEE_USER_INFO_URL = "https://gitee.com/api/v5/user?access_token=%s"; + + /** + * 开源中国用户信息 + */ + String OSC_USER_INFO_URL = "https://www.oschina.net/action/openapi/user?access_token=%s&dataType=json"; + + /** + * 钉钉获取 token + */ + String DING_OLD_GET_TOKEN = "https://oapi.dingtalk.com/gettoken"; + + /** + * 钉钉同步部门列表 + */ + String DING_OLD_DEPT_URL = "https://oapi.dingtalk.com/topapi/v2/department/listsub"; + + /** + * 钉钉部门用户id列表 + */ + String DING_DEPT_USERIDS_URL = "https://oapi.dingtalk.com/topapi/user/listid"; + + /** + * 钉钉用户详情 + */ + String DING_USER_INFO_URL = "https://oapi.dingtalk.com/topapi/v2/user/get"; + + /** + * {bcrypt} 加密的特征码 + */ + String BCRYPT = "{bcrypt}"; + + /** + * 客户端模式 + */ + String CLIENT_CREDENTIALS = "client_credentials"; + + /** + * 客户端编号 + */ + String CLIENT_ID = "client_id"; + + /** + * 客户端唯一令牌 + */ + String CLIENT_RECREATE = "recreate_flag"; + + /** + * 用户ID字段 + */ + String DETAILS_USER_ID = "user_id"; + + /** + * 用户名 + */ + String DETAILS_USERNAME = "username"; + + /** + * 姓名 + */ + String NAME = "name"; + + /** + * 协议字段 + */ + String DETAILS_LICENSE = "license"; + + /** + * 激活字段 兼容外围系统接入 + */ + String ACTIVE = "active"; + + /** + * AES 加密 + */ + String AES = "aes"; + + /** + * 授权码模式confirm + */ + String CUSTOM_CONSENT_PAGE_URI = "/token/confirm_access"; + + /** + * {noop} 加密的特征码 + */ + String NOOP = "{noop}"; + + /** + * 短信登录 参数名称 + */ + String SMS_PARAMETER_NAME = "mobile"; + + /** + * 手机号登录 + */ + String APP = "mobile"; + + /** + * 用户信息 + */ + String DETAILS_USER = "user_info"; + +} diff --git a/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/constant/ServiceNameConstants.java b/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/constant/ServiceNameConstants.java new file mode 100644 index 0000000..40095bb --- /dev/null +++ b/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/constant/ServiceNameConstants.java @@ -0,0 +1,55 @@ +/* + * + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + * + */ + +package com.pig4cloud.pigx.common.core.constant; + +/** + * @author lengleng + * @date 2018年06月22日16:41:01 服务名称 + */ +public interface ServiceNameConstants { + + /** + * 认证中心 + */ + String AUTH_SERVICE = "pigx-auth"; + + /** + * UMPS模块 + */ +// String UPMS_SERVICE = "pigx-upms-biz"; + String UPMS_SERVICE = "as-upms-biz"; + + /** + * app服务 + */ +// String APP_SERVER = "pigx-app-server-biz"; + String APP_SERVER = "as-app-server-biz"; + + /** + * 流程引擎 + */ + String FLOW_ENGINE_SERVER = "pigx-flow-engine-biz"; + + /** + * 流程工单 + */ + String FLOW_TASK_SERVER = "pigx-flow-task-biz"; + +} diff --git a/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/constant/enums/CaptchaFlagTypeEnum.java b/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/constant/enums/CaptchaFlagTypeEnum.java new file mode 100644 index 0000000..cc813c6 --- /dev/null +++ b/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/constant/enums/CaptchaFlagTypeEnum.java @@ -0,0 +1,36 @@ +package com.pig4cloud.pigx.common.core.constant.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @author lengleng + * @date 2020-11-18 + *

+ * 验证码状态 + */ +@Getter +@AllArgsConstructor +public enum CaptchaFlagTypeEnum { + + /** + * 开启验证码 + */ + ON("1", "开启验证码"), + + /** + * 关闭验证码 + */ + OFF("0", "关闭验证码"); + + /** + * 类型 + */ + private String type; + + /** + * 描述 + */ + private String description; + +} diff --git a/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/constant/enums/DictTypeEnum.java b/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/constant/enums/DictTypeEnum.java new file mode 100644 index 0000000..902b995 --- /dev/null +++ b/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/constant/enums/DictTypeEnum.java @@ -0,0 +1,36 @@ +package com.pig4cloud.pigx.common.core.constant.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @author lengleng + * @date 2019-05-16 + *

+ * 字典类型 + */ +@Getter +@AllArgsConstructor +public enum DictTypeEnum { + + /** + * 字典类型-系统内置(不可修改) + */ + SYSTEM("1", "系统内置"), + + /** + * 字典类型-业务类型 + */ + BIZ("0", "业务类"); + + /** + * 类型 + */ + private String type; + + /** + * 描述 + */ + private String description; + +} diff --git a/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/constant/enums/EncFlagTypeEnum.java b/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/constant/enums/EncFlagTypeEnum.java new file mode 100644 index 0000000..e86c7ac --- /dev/null +++ b/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/constant/enums/EncFlagTypeEnum.java @@ -0,0 +1,36 @@ +package com.pig4cloud.pigx.common.core.constant.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @author lengleng + * @date 2020-11-18 + *

+ * 密码是否加密传输 + */ +@Getter +@AllArgsConstructor +public enum EncFlagTypeEnum { + + /** + * 是 + */ + YES("1", "是"), + + /** + * 否 + */ + NO("0", "否"); + + /** + * 类型 + */ + private String type; + + /** + * 描述 + */ + private String description; + +} diff --git a/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/constant/enums/LoginTypeEnum.java b/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/constant/enums/LoginTypeEnum.java new file mode 100644 index 0000000..35006f4 --- /dev/null +++ b/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/constant/enums/LoginTypeEnum.java @@ -0,0 +1,93 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.common.core.constant.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @author lengleng + * @date 2018/8/15 社交登录类型 + */ +@Getter +@AllArgsConstructor +public enum LoginTypeEnum { + + /** + * 账号密码登录 + */ + PWD("PWD", "账号密码登录"), + + /** + * 验证码登录 + */ + SMS("SMS", "验证码登录"), + + APPSMS("APP-SMS", "APP验证码登录"), + + /** + * QQ登录 + */ + QQ("QQ", "QQ登录"), + + /** + * 微信登录 + */ + WECHAT("WX", "微信登录"), + + /** + * 微信小程序 + */ + MINI_APP("MINI", "微信小程序"), + + /** + * 码云登录 + */ + GITEE("GITEE", "码云登录"), + + /** + * 开源中国登录 + */ + OSC("OSC", "开源中国登录"), + + /** + * 钉钉 + */ + DINGTALK("DINGTALK", "钉钉"), + + /** + * 企业微信 + */ + WEIXIN_CP("WEIXIN_CP", "企业微信"), + + /** + * CAS 登录 + */ + CAS("CAS", "CAS 登录"); + + /** + * 类型 + */ + private String type; + + /** + * 描述 + */ + private String description; + +} diff --git a/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/constant/enums/MenuTypeEnum.java b/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/constant/enums/MenuTypeEnum.java new file mode 100644 index 0000000..eb30da8 --- /dev/null +++ b/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/constant/enums/MenuTypeEnum.java @@ -0,0 +1,41 @@ +package com.pig4cloud.pigx.common.core.constant.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @author lengleng + * @date 2020-02-17 + *

+ * 菜单类型 + */ +@Getter +@AllArgsConstructor +public enum MenuTypeEnum { + + /** + * 左侧菜单 + */ + LEFT_MENU("0", "left"), + + /** + * 顶部菜单 + */ + TOP_MENU("2", "top"), + + /** + * 按钮 + */ + BUTTON("1", "button"); + + /** + * 类型 + */ + private String type; + + /** + * 描述 + */ + private String description; + +} diff --git a/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/constant/enums/ProcessStatusEnum.java b/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/constant/enums/ProcessStatusEnum.java new file mode 100644 index 0000000..bd6bfd8 --- /dev/null +++ b/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/constant/enums/ProcessStatusEnum.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.common.core.constant.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @author lengleng + * @date 2018/9/30 流程状态 + */ +@Getter +@AllArgsConstructor +public enum ProcessStatusEnum { + + /** + * 激活 + */ + ACTIVE("active"), + + /** + * 暂停 + */ + SUSPEND("suspend"); + + /** + * 状态 + */ + private final String status; + +} diff --git a/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/constant/enums/ResourceTypeEnum.java b/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/constant/enums/ResourceTypeEnum.java new file mode 100644 index 0000000..d33070f --- /dev/null +++ b/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/constant/enums/ResourceTypeEnum.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.common.core.constant.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @author lengleng + * @date 2018/9/30 资源类型 + */ +@Getter +@AllArgsConstructor +public enum ResourceTypeEnum { + + /** + * 图片资源 + */ + IMAGE("image", "图片资源"), + + /** + * xml资源 + */ + XML("xml", "xml资源"); + + /** + * 类型 + */ + private final String type; + + /** + * 描述 + */ + private final String description; + +} diff --git a/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/constant/enums/StyleTypeEnum.java b/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/constant/enums/StyleTypeEnum.java new file mode 100644 index 0000000..e3ff055 --- /dev/null +++ b/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/constant/enums/StyleTypeEnum.java @@ -0,0 +1,57 @@ +package com.pig4cloud.pigx.common.core.constant.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; + +/** + * @author lengleng + * @date 2020-01-19 + *

+ * 前端类型类型 + */ +@Getter +@AllArgsConstructor +public enum StyleTypeEnum { + + /** + * 前端类型-avue 风格 + */ + AVUE("0", "avue"), + + /** + * 前端类型-element 风格 + */ + ELEMENT("1", "element"), + + /** + * 前端风格-uview 风格 + */ + UVIEW("2", "uview"), + + /** + * magic + */ + MAGIC("3", "magic"), + /** + * element-plus + */ + PLUS("4", "plus"); + + /** + * 类型 + */ + private String style; + + /** + * 描述 + */ + private String description; + + public static String getDecs(String style) { + return Arrays.stream(StyleTypeEnum.values()).filter(styleTypeEnum -> styleTypeEnum.getStyle().equals(style)) + .findFirst().get().getDescription(); + } + +} diff --git a/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/constant/enums/TaskStatusEnum.java b/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/constant/enums/TaskStatusEnum.java new file mode 100644 index 0000000..aee85c7 --- /dev/null +++ b/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/constant/enums/TaskStatusEnum.java @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.common.core.constant.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @author lengleng + * @date 2018/9/30 流程状态 + */ +@Getter +@AllArgsConstructor +public enum TaskStatusEnum { + + /** + * 未提交 + */ + UNSUBMIT("0", "未提交"), + + /** + * 审核中 + */ + CHECK("1", "审核中"), + + /** + * 已完成 + */ + COMPLETED("2", "已完成"), + + /** + * 驳回 + */ + OVERRULE("9", "驳回"); + + /** + * 类型 + */ + private final String status; + + /** + * 描述 + */ + private final String description; + +} diff --git a/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/constant/enums/UserTypeEnum.java b/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/constant/enums/UserTypeEnum.java new file mode 100644 index 0000000..e0c065f --- /dev/null +++ b/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/constant/enums/UserTypeEnum.java @@ -0,0 +1,22 @@ +package com.pig4cloud.pigx.common.core.constant.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum UserTypeEnum { + + TOB("0", "面向后台应用"), TOC("1", "面向小程序"); + + /** + * 类型 + */ + private final String status; + + /** + * 描述 + */ + private final String description; + +} diff --git a/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/exception/CheckedException.java b/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/exception/CheckedException.java new file mode 100644 index 0000000..524df74 --- /dev/null +++ b/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/exception/CheckedException.java @@ -0,0 +1,49 @@ +/* + * + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + * + */ + +package com.pig4cloud.pigx.common.core.exception; + +import lombok.NoArgsConstructor; + +/** + * @author lengleng + * @date 😴2018年06月22日16:21:57 + */ +@NoArgsConstructor +public class CheckedException extends RuntimeException { + + private static final long serialVersionUID = 1L; + + public CheckedException(String message) { + super(message); + } + + public CheckedException(Throwable cause) { + super(cause); + } + + public CheckedException(String message, Throwable cause) { + super(message, cause); + } + + public CheckedException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } + +} diff --git a/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/exception/ErrorCodes.java b/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/exception/ErrorCodes.java new file mode 100644 index 0000000..c83ef68 --- /dev/null +++ b/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/exception/ErrorCodes.java @@ -0,0 +1,113 @@ +package com.pig4cloud.pigx.common.core.exception; + +/** + * 错误编码 + * + * @author lengleng + * @date 2022/3/30 + */ +public interface ErrorCodes { + + /** + * 系统编码错误 + */ + String SYS_PARAM_CONFIG_ERROR = "sys.param.config.error"; + + /** + * 系统内置参数不能删除 + */ + String SYS_PARAM_DELETE_SYSTEM = "sys.param.delete.system"; + + /** + * 用户已存在 + */ + String SYS_USER_USERNAME_EXISTING = "sys.user.username.existing"; + + /** + * 用户已存在 + */ + String SYS_USER_PHONE_EXISTING = "sys.user.phone.existing"; + + /** + * 用户原密码错误,修改失败 + */ + String SYS_USER_UPDATE_PASSWORDERROR = "sys.user.update.passwordError"; + + /** + * 用户信息为空 + */ + String SYS_USER_USERINFO_EMPTY = "sys.user.userInfo.empty"; + + /** + * 获取当前用户信息失败 + */ + String SYS_USER_QUERY_ERROR = "sys.user.query.error"; + + String SYS_USER_IMPORT_SUCCEED = "sys.user.import.succeed"; + + /** + * 部门名称不存在 + */ + String SYS_DEPT_DEPTNAME_INEXISTENCE = "sys.dept.deptName.inexistence"; + + /** + * 岗位名称不存在 + */ + String SYS_POST_POSTNAME_INEXISTENCE = "sys.post.postName.inexistence"; + + /** + * 岗位名称或编码已经存在 + */ + String SYS_POST_NAMEORCODE_EXISTING = "sys.post.nameOrCode.existing"; + + /** + * 角色名称不存在 + */ + String SYS_ROLE_ROLENAME_INEXISTENCE = "sys.role.roleName.inexistence"; + + /** + * 角色名或角色编码已经存在 + */ + String SYS_ROLE_NAMEORCODE_EXISTING = "sys.role.nameOrCode.existing"; + + /** + * 菜单存在下级节点 删除失败 + */ + String SYS_MENU_DELETE_EXISTING = "sys.menu.delete.existing"; + + /** + * 系统内置字典不允许删除 + */ + String SYS_DICT_DELETE_SYSTEM = "sys.dict.delete.system"; + + /** + * 系统内置字典不能修改 + */ + String SYS_DICT_UPDATE_SYSTEM = "sys.dict.update.system"; + + /** + * 验证码发送频繁 + */ + String SYS_APP_SMS_OFTEN = "sys.app.sms.often"; + + /** + * 手机号未注册 + */ + String SYS_APP_PHONE_UNREGISTERED = "sys.app.phone.unregistered"; + + /** + * 企微调用接口错误 + */ + String SYS_CONNECT_CP_DEPT_SYNC_ERROR = "sys.connect.cp.dept.sync.error"; + + /** + * 企微调用接口错误 + */ + String SYS_CONNECT_CP_USER_SYNC_ERROR = "sys.connect.cp.user.sync.error"; + + /** + * 用户信息为空 + */ + String APP_USER_USERINFO_EMPTY = "app.user.userInfo.empty"; + +} diff --git a/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/exception/ValidateCodeException.java b/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/exception/ValidateCodeException.java new file mode 100644 index 0000000..036458a --- /dev/null +++ b/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/exception/ValidateCodeException.java @@ -0,0 +1,37 @@ +/* + * + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + * + */ + +package com.pig4cloud.pigx.common.core.exception; + +/** + * @author lengleng + * @date 2018年06月22日16:22:15 + */ +public class ValidateCodeException extends RuntimeException { + + private static final long serialVersionUID = -7285211528095468156L; + + public ValidateCodeException() { + } + + public ValidateCodeException(String msg) { + super(msg); + } + +} diff --git a/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/factory/YamlPropertySourceFactory.java b/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/factory/YamlPropertySourceFactory.java new file mode 100644 index 0000000..9e38466 --- /dev/null +++ b/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/factory/YamlPropertySourceFactory.java @@ -0,0 +1,44 @@ +package com.pig4cloud.pigx.common.core.factory; + +import org.springframework.beans.factory.config.YamlPropertiesFactoryBean; +import org.springframework.core.env.PropertiesPropertySource; +import org.springframework.core.env.PropertySource; +import org.springframework.core.io.support.EncodedResource; +import org.springframework.core.io.support.PropertySourceFactory; +import org.springframework.lang.Nullable; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.Properties; + +/** + * @author lengleng + * @date 2022/3/29 + *

+ * 读取自定义 yaml 文件工厂类 + */ +public class YamlPropertySourceFactory implements PropertySourceFactory { + + @Override + public PropertySource createPropertySource(@Nullable String name, EncodedResource resource) throws IOException { + Properties propertiesFromYaml = loadYamlIntoProperties(resource); + String sourceName = name != null ? name : resource.getResource().getFilename(); + return new PropertiesPropertySource(sourceName, propertiesFromYaml); + } + + private Properties loadYamlIntoProperties(EncodedResource resource) throws FileNotFoundException { + try { + YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean(); + factory.setResources(resource.getResource()); + factory.afterPropertiesSet(); + return factory.getObject(); + } + catch (IllegalStateException e) { + Throwable cause = e.getCause(); + if (cause instanceof FileNotFoundException) + throw (FileNotFoundException) e.getCause(); + throw e; + } + } + +} diff --git a/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/jackson/PigxJavaTimeModule.java b/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/jackson/PigxJavaTimeModule.java new file mode 100644 index 0000000..e9c1fb7 --- /dev/null +++ b/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/jackson/PigxJavaTimeModule.java @@ -0,0 +1,64 @@ +package com.pig4cloud.pigx.common.core.jackson; + +import cn.hutool.core.date.DatePattern; +import com.fasterxml.jackson.databind.module.SimpleModule; +import com.fasterxml.jackson.datatype.jsr310.PackageVersion; +import com.fasterxml.jackson.datatype.jsr310.deser.InstantDeserializer; +import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer; +import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; +import com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer; +import com.fasterxml.jackson.datatype.jsr310.ser.InstantSerializer; +import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer; +import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; +import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer; + +import java.time.Instant; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; + +/** + * java 8 时间默认序列化 + * + * @author L.cm + * @author lishanbu + */ +public class PigxJavaTimeModule extends SimpleModule { + + /** + * 指定序列化规则 + */ + public PigxJavaTimeModule() { + super(PackageVersion.VERSION); + + // ======================= 时间序列化规则 =============================== + // yyyy-MM-dd HH:mm:ss + this.addSerializer(LocalDateTime.class, + new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_PATTERN))); + // yyyy-MM-dd + this.addSerializer(LocalDate.class, + new LocalDateSerializer(DateTimeFormatter.ofPattern(DatePattern.NORM_DATE_PATTERN))); + // HH:mm:ss + this.addSerializer(LocalTime.class, + new LocalTimeSerializer(DateTimeFormatter.ofPattern(DatePattern.NORM_TIME_PATTERN))); + + // Instant 类型序列化 + this.addSerializer(Instant.class, InstantSerializer.INSTANCE); + + // ======================= 时间反序列化规则 ============================== + // yyyy-MM-dd HH:mm:ss + this.addDeserializer(LocalDateTime.class, + new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_PATTERN))); + // yyyy-MM-dd + this.addDeserializer(LocalDate.class, + new LocalDateDeserializer(DateTimeFormatter.ofPattern(DatePattern.NORM_DATE_PATTERN))); + // HH:mm:ss + this.addDeserializer(LocalTime.class, + new LocalTimeDeserializer(DateTimeFormatter.ofPattern(DatePattern.NORM_TIME_PATTERN))); + // Instant 反序列化 + this.addDeserializer(Instant.class, InstantDeserializer.INSTANT); + + } + +} diff --git a/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/sensitive/Sensitive.java b/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/sensitive/Sensitive.java new file mode 100644 index 0000000..e0fe4d3 --- /dev/null +++ b/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/sensitive/Sensitive.java @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.common.core.sensitive; + +import com.fasterxml.jackson.annotation.JacksonAnnotationsInside; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 对象脱敏注解 + * + * @author mayee + * @version v1.0 + **/ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.FIELD) +@JacksonAnnotationsInside +@JsonSerialize(using = SensitiveSerialize.class) +public @interface Sensitive { + + /** + * 脱敏数据类型, 非Customer时, 将忽略 refixNoMaskLen 和 suffixNoMaskLen 和 maskStr + */ + SensitiveTypeEnum type() default SensitiveTypeEnum.CUSTOMER; + + /** + * 前置不需要打码的长度 + */ + int prefixNoMaskLen() default 0; + + /** + * 后置不需要打码的长度 + */ + int suffixNoMaskLen() default 0; + + /** + * 用什么打码 + */ + String maskStr() default "*"; + +} diff --git a/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/sensitive/SensitiveSerialize.java b/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/sensitive/SensitiveSerialize.java new file mode 100644 index 0000000..6e21be6 --- /dev/null +++ b/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/sensitive/SensitiveSerialize.java @@ -0,0 +1,110 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.common.core.sensitive; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.BeanProperty; +import com.fasterxml.jackson.databind.JsonMappingException; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.ser.ContextualSerializer; +import com.pig4cloud.pigx.common.core.util.DesensitizedUtils; +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; + +import java.io.IOException; +import java.util.Objects; + +/** + * @author lengleng + * @date 2019-08-13 + *

+ * 脱敏序列化 + */ +@NoArgsConstructor +@AllArgsConstructor +public class SensitiveSerialize extends JsonSerializer implements ContextualSerializer { + + private SensitiveTypeEnum type; + + private Integer prefixNoMaskLen; + + private Integer suffixNoMaskLen; + + private String maskStr; + + @Override + public void serialize(final String origin, final JsonGenerator jsonGenerator, + final SerializerProvider serializerProvider) throws IOException { + switch (type) { + case CHINESE_NAME: + jsonGenerator.writeString(DesensitizedUtils.chineseName(origin)); + break; + case ID_CARD: + jsonGenerator.writeString(DesensitizedUtils.idCardNum(origin)); + break; + case FIXED_PHONE: + jsonGenerator.writeString(DesensitizedUtils.fixedPhone(origin)); + break; + case MOBILE_PHONE: + jsonGenerator.writeString(DesensitizedUtils.mobilePhone(origin)); + break; + case ADDRESS: + jsonGenerator.writeString(DesensitizedUtils.address(origin)); + break; + case EMAIL: + jsonGenerator.writeString(DesensitizedUtils.email(origin)); + break; + case BANK_CARD: + jsonGenerator.writeString(DesensitizedUtils.bankCard(origin)); + break; + case PASSWORD: + jsonGenerator.writeString(DesensitizedUtils.password(origin)); + break; + case KEY: + jsonGenerator.writeString(DesensitizedUtils.key(origin)); + break; + case CUSTOMER: + jsonGenerator + .writeString(DesensitizedUtils.desValue(origin, prefixNoMaskLen, suffixNoMaskLen, maskStr)); + break; + default: + throw new IllegalArgumentException("Unknow sensitive type enum " + type); + } + } + + @Override + public JsonSerializer createContextual(final SerializerProvider serializerProvider, + final BeanProperty beanProperty) throws JsonMappingException { + if (beanProperty != null) { + if (Objects.equals(beanProperty.getType().getRawClass(), String.class)) { + Sensitive sensitive = beanProperty.getAnnotation(Sensitive.class); + if (sensitive == null) { + sensitive = beanProperty.getContextAnnotation(Sensitive.class); + } + if (sensitive != null) { + return new SensitiveSerialize(sensitive.type(), sensitive.prefixNoMaskLen(), + sensitive.suffixNoMaskLen(), sensitive.maskStr()); + } + } + return serializerProvider.findValueSerializer(beanProperty.getType(), beanProperty); + } + return serializerProvider.findNullValueSerializer(null); + } + +} diff --git a/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/sensitive/SensitiveTypeEnum.java b/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/sensitive/SensitiveTypeEnum.java new file mode 100644 index 0000000..882072a --- /dev/null +++ b/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/sensitive/SensitiveTypeEnum.java @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.common.core.sensitive; + +/** + * 敏感信息枚举类 + * + * @author mayee + * @version v1.0 + **/ +public enum SensitiveTypeEnum { + + /** + * 自定义 + */ + CUSTOMER, + /** + * 用户名, 刘*华, 徐* + */ + CHINESE_NAME, + /** + * 身份证号, 110110********1234 + */ + ID_CARD, + /** + * 座机号, ****1234 + */ + FIXED_PHONE, + /** + * 手机号, 176****1234 + */ + MOBILE_PHONE, + /** + * 地址, 北京******** + */ + ADDRESS, + /** + * 电子邮件, s*****o@xx.com + */ + EMAIL, + /** + * 银行卡, 622202************1234 + */ + BANK_CARD, + /** + * 密码, 永远是 ******, 与长度无关 + */ + PASSWORD, + /** + * 密钥, 【密钥】密钥除了最后三位其他都是***, 与长度无关 + */ + KEY + +} diff --git a/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/util/ClassUtils.java b/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/util/ClassUtils.java new file mode 100644 index 0000000..dbc8adc --- /dev/null +++ b/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/util/ClassUtils.java @@ -0,0 +1,113 @@ +/* + * + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + * + */ + +package com.pig4cloud.pigx.common.core.util; + +import lombok.experimental.UtilityClass; +import org.springframework.core.BridgeMethodResolver; +import org.springframework.core.DefaultParameterNameDiscoverer; +import org.springframework.core.MethodParameter; +import org.springframework.core.ParameterNameDiscoverer; +import org.springframework.core.annotation.AnnotatedElementUtils; +import org.springframework.core.annotation.SynthesizingMethodParameter; +import org.springframework.web.method.HandlerMethod; + +import java.lang.annotation.Annotation; +import java.lang.reflect.Constructor; +import java.lang.reflect.Method; + +/** + * 类工具类 + * + * @author L.cm + */ +@UtilityClass +public class ClassUtils extends org.springframework.util.ClassUtils { + + private final ParameterNameDiscoverer PARAMETERNAMEDISCOVERER = new DefaultParameterNameDiscoverer(); + + /** + * 获取方法参数信息 + * @param constructor 构造器 + * @param parameterIndex 参数序号 + * @return {MethodParameter} + */ + public MethodParameter getMethodParameter(Constructor constructor, int parameterIndex) { + MethodParameter methodParameter = new SynthesizingMethodParameter(constructor, parameterIndex); + methodParameter.initParameterNameDiscovery(PARAMETERNAMEDISCOVERER); + return methodParameter; + } + + /** + * 获取方法参数信息 + * @param method 方法 + * @param parameterIndex 参数序号 + * @return {MethodParameter} + */ + public MethodParameter getMethodParameter(Method method, int parameterIndex) { + MethodParameter methodParameter = new SynthesizingMethodParameter(method, parameterIndex); + methodParameter.initParameterNameDiscovery(PARAMETERNAMEDISCOVERER); + return methodParameter; + } + + /** + * 获取Annotation + * @param method Method + * @param annotationType 注解类 + * @param 泛型标记 + * @return {Annotation} + */ + public A getAnnotation(Method method, Class annotationType) { + Class targetClass = method.getDeclaringClass(); + // The method may be on an interface, but we need attributes from the target + // class. + // If the target class is null, the method will be unchanged. + Method specificMethod = ClassUtils.getMostSpecificMethod(method, targetClass); + // If we are dealing with method with generic parameters, find the original + // method. + specificMethod = BridgeMethodResolver.findBridgedMethod(specificMethod); + // 先找方法,再找方法上的类 + A annotation = AnnotatedElementUtils.findMergedAnnotation(specificMethod, annotationType); + + if (null != annotation) { + return annotation; + } + // 获取类上面的Annotation,可能包含组合注解,故采用spring的工具类 + return AnnotatedElementUtils.findMergedAnnotation(specificMethod.getDeclaringClass(), annotationType); + } + + /** + * 获取Annotation + * @param handlerMethod HandlerMethod + * @param annotationType 注解类 + * @param 泛型标记 + * @return {Annotation} + */ + public A getAnnotation(HandlerMethod handlerMethod, Class annotationType) { + // 先找方法,再找方法上的类 + A annotation = handlerMethod.getMethodAnnotation(annotationType); + if (null != annotation) { + return annotation; + } + // 获取类上面的Annotation,可能包含组合注解,故采用spring的工具类 + Class beanType = handlerMethod.getBeanType(); + return AnnotatedElementUtils.findMergedAnnotation(beanType, annotationType); + } + +} diff --git a/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/util/DesensitizedUtils.java b/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/util/DesensitizedUtils.java new file mode 100644 index 0000000..2cda13e --- /dev/null +++ b/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/util/DesensitizedUtils.java @@ -0,0 +1,171 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.common.core.util; + +import cn.hutool.core.util.StrUtil; + +/** + * 脱敏工具类 + * + * @author mayee + * @version v1.0 + **/ +public class DesensitizedUtils { + + /** + * 对字符串进行脱敏操作 + * @param origin 原始字符串 + * @param prefixNoMaskLen 左侧需要保留几位明文字段 + * @param suffixNoMaskLen 右侧需要保留几位明文字段 + * @param maskStr 用于遮罩的字符串, 如'*' + * @return 脱敏后结果 + */ + public static String desValue(String origin, int prefixNoMaskLen, int suffixNoMaskLen, String maskStr) { + if (origin == null) { + return null; + } + + StringBuilder sb = new StringBuilder(); + for (int i = 0, n = origin.length(); i < n; i++) { + if (i < prefixNoMaskLen) { + sb.append(origin.charAt(i)); + continue; + } + if (i > (n - suffixNoMaskLen - 1)) { + sb.append(origin.charAt(i)); + continue; + } + sb.append(maskStr); + } + return sb.toString(); + } + + /** + * 【中文姓名】只显示最后一个汉字,其他隐藏为星号,比如:**梦 + * @param fullName 姓名 + * @return 结果 + */ + public static String chineseName(String fullName) { + if (fullName == null) { + return null; + } + return desValue(fullName, 0, 1, "*"); + } + + /** + * 【身份证号】显示前六位, 四位,其他隐藏。共计18位或者15位,比如:340304*******1234 + * @param id 身份证号码 + * @return 结果 + */ + public static String idCardNum(String id) { + return desValue(id, 6, 4, "*"); + } + + /** + * 【固定电话】后四位,其他隐藏,比如 ****1234 + * @param num 固定电话 + * @return 结果 + */ + public static String fixedPhone(String num) { + return desValue(num, 0, 4, "*"); + } + + /** + * 【手机号码】前三位,后四位,其他隐藏,比如135****6810 + * @param num 手机号码 + * @return 结果 + */ + public static String mobilePhone(String num) { + return desValue(num, 3, 4, "*"); + } + + /** + * 【地址】只显示到地区,不显示详细地址,比如:北京市海淀区**** + * @param address 地址 + * @return 结果 + */ + public static String address(String address) { + return desValue(address, 6, 0, "*"); + } + + /** + * 【电子邮箱 邮箱前缀仅显示第一个字母,前缀其他隐藏,用星号代替,@及后面的地址显示,比如:d**@126.com + * @param email 电子邮箱 + * @return 结果 + */ + public static String email(String email) { + if (email == null) { + return null; + } + int index = StrUtil.indexOf(email, '@'); + if (index <= 1) { + return email; + } + String preEmail = desValue(email.substring(0, index), 1, 0, "*"); + return preEmail + email.substring(index); + + } + + /** + * 【银行卡号】前六位,后四位,其他用星号隐藏每位1个星号,比如:622260**********1234 + * @param cardNum 银行卡号 + * @return 结果 + */ + public static String bankCard(String cardNum) { + return desValue(cardNum, 6, 4, "*"); + } + + /** + * 【密码】密码的全部字符都用*代替,比如:****** + * @param password 密码 + * @return 结果 + */ + public static String password(String password) { + if (password == null) { + return null; + } + return "******"; + } + + /** + * 【密钥】密钥除了最后三位,全部都用*代替,比如:***xdS 脱敏后长度为6,如果明文长度不足三位,则按实际长度显示,剩余位置补* + * @param key 密钥 + * @return 结果 + */ + public static String key(String key) { + if (key == null) { + return null; + } + int viewLength = 6; + StringBuilder tmpKey = new StringBuilder(desValue(key, 0, 3, "*")); + if (tmpKey.length() > viewLength) { + return tmpKey.substring(tmpKey.length() - viewLength); + } + else if (tmpKey.length() < viewLength) { + int buffLength = viewLength - tmpKey.length(); + for (int i = 0; i < buffLength; i++) { + tmpKey.insert(0, "*"); + } + return tmpKey.toString(); + } + else { + return tmpKey.toString(); + } + } + +} diff --git a/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/util/KeyStrResolver.java b/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/util/KeyStrResolver.java new file mode 100644 index 0000000..d20650e --- /dev/null +++ b/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/util/KeyStrResolver.java @@ -0,0 +1,25 @@ +package com.pig4cloud.pigx.common.core.util; + +/** + * @author lengleng + * @date 2020/9/29 + *

+ * 字符串处理,方便其他模块解耦处理 + */ +public interface KeyStrResolver { + + /** + * 字符串加工 + * @param in 输入字符串 + * @param split 分割符 + * @return 输出字符串 + */ + String extract(String in, String split); + + /** + * 字符串获取 + * @return 模块返回字符串 + */ + String key(); + +} diff --git a/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/util/MsgUtils.java b/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/util/MsgUtils.java new file mode 100644 index 0000000..4fda386 --- /dev/null +++ b/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/util/MsgUtils.java @@ -0,0 +1,47 @@ +package com.pig4cloud.pigx.common.core.util; + +import lombok.experimental.UtilityClass; +import org.springframework.context.MessageSource; + +import java.util.Locale; + +/** + * i18n 工具类 + * + * @author lengleng + * @date 2022/3/30 + */ +@UtilityClass +public class MsgUtils { + + /** + * 通过code 获取中文错误信息 + * @param code + * @return + */ + public String getMessage(String code) { + MessageSource messageSource = SpringContextHolder.getBean("pigxMessageSource"); + return messageSource.getMessage(code, null, Locale.CHINA); + } + + /** + * 通过code 和参数获取中文错误信息 + * @param code + * @return + */ + public String getMessage(String code, Object... objects) { + MessageSource messageSource = SpringContextHolder.getBean("pigxMessageSource"); + return messageSource.getMessage(code, objects, Locale.CHINA); + } + + /** + * security 通过code 和参数获取中文错误信息 + * @param code + * @return + */ + public String getSecurityMessage(String code, Object... objects) { + MessageSource messageSource = SpringContextHolder.getBean("securityMessageSource"); + return messageSource.getMessage(code, objects, Locale.CHINA); + } + +} diff --git a/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/util/R.java b/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/util/R.java new file mode 100644 index 0000000..bf7c45d --- /dev/null +++ b/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/util/R.java @@ -0,0 +1,100 @@ +/* + * + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + * + */ + +package com.pig4cloud.pigx.common.core.util; + +import com.pig4cloud.pigx.common.core.constant.CommonConstants; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * 响应信息主体 + * + * @param + * @author lengleng + */ +@Builder +@ToString +@NoArgsConstructor +@AllArgsConstructor +@Accessors(chain = true) +@Schema(description = "响应信息主体") +public class R implements Serializable { + + private static final long serialVersionUID = 1L; + + @Getter + @Setter + @Schema(description = "返回标记:成功标记=0,失败标记=1") + private int code; + + @Getter + @Setter + @Schema(description = "返回信息") + private String msg; + + @Getter + @Setter + @Schema(description = "数据") + private T data; + + public static R ok() { + return restResult(null, CommonConstants.SUCCESS, null); + } + + public static R ok(T data) { + return restResult(data, CommonConstants.SUCCESS, null); + } + + public static R ok(T data, String msg) { + return restResult(data, CommonConstants.SUCCESS, msg); + } + + public static R failed() { + return restResult(null, CommonConstants.FAIL, null); + } + + public static R failed(String msg) { + return restResult(null, CommonConstants.FAIL, msg); + } + + public static R failed(T data) { + return restResult(data, CommonConstants.FAIL, null); + } + + public static R failed(T data, String msg) { + return restResult(data, CommonConstants.FAIL, msg); + } + + static R restResult(T data, int code, String msg) { + R apiResult = new R<>(); + apiResult.setCode(code); + apiResult.setData(data); + apiResult.setMsg(msg); + return apiResult; + } + + public boolean isOk() { + return this.code == CommonConstants.SUCCESS; + } + +} diff --git a/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/util/RetOps.java b/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/util/RetOps.java new file mode 100644 index 0000000..295220f --- /dev/null +++ b/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/util/RetOps.java @@ -0,0 +1,289 @@ +/* + * + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + * + */ + +package com.pig4cloud.pigx.common.core.util; + +import cn.hutool.core.util.ObjectUtil; +import com.pig4cloud.pigx.common.core.constant.CommonConstants; + +import java.util.Arrays; +import java.util.Objects; +import java.util.Optional; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.function.Predicate; + +/** + * 简化{@code R} 的访问操作,例子

+ * R result = R.ok(0);
+ * // 使用场景1: 链式操作: 断言然后消费
+ * RetOps.of(result)
+ * 		.assertCode(-1,r -> new RuntimeException("error "+r.getCode()))
+ * 		.assertDataNotEmpty(r -> new IllegalStateException("oops!"))
+ * 		.useData(System.out::println);
+ *
+ * // 使用场景2: 读取原始值(data),这里返回的是Optional
+ * RetOps.of(result).getData().orElse(null);
+ *
+ * // 使用场景3: 类型转换
+ * R s = RetOps.of(result)
+ *        .assertDataNotNull(r -> new IllegalStateException("nani??"))
+ *        .map(i -> Integer.toHexString(i))
+ *        .peek();
+ * 
+ * + * @author CJ (power4j@outlook.com) + * @date 2022/5/12 + * @since 4.4 + */ +public class RetOps { + + /** 状态码为成功 */ + public static final Predicate> CODE_SUCCESS = r -> CommonConstants.SUCCESS == r.getCode(); + + /** 数据有值 */ + public static final Predicate> HAS_DATA = r -> ObjectUtil.isNotEmpty(r.getData()); + + /** 数据有值,并且包含元素 */ + public static final Predicate> HAS_ELEMENT = r -> ObjectUtil.isNotEmpty(r.getData()); + + /** 状态码为成功并且有值 */ + public static final Predicate> DATA_AVAILABLE = CODE_SUCCESS.and(HAS_DATA); + + private final R original; + + // ~ 初始化 + // =================================================================================================== + + RetOps(R original) { + this.original = original; + } + + public static RetOps of(R original) { + return new RetOps<>(Objects.requireNonNull(original)); + } + + // ~ 杂项方法 + // =================================================================================================== + + /** + * 观察原始值 + * @return R + */ + public R peek() { + return original; + } + + /** + * 读取{@code code}的值 + * @return 返回code的值 + */ + public int getCode() { + return original.getCode(); + } + + /** + * 读取{@code data}的值 + * @return 返回 Optional 包装的data + */ + public Optional getData() { + return Optional.ofNullable(original.getData()); + } + + /** + * 有条件地读取{@code data}的值 + * @param predicate 断言函数 + * @return 返回 Optional 包装的data,如果断言失败返回empty + */ + public Optional getDataIf(Predicate> predicate) { + return predicate.test(original) ? getData() : Optional.empty(); + } + + /** + * 读取{@code msg}的值 + * @return 返回Optional包装的 msg + */ + public Optional getMsg() { + return Optional.ofNullable(original.getMsg()); + } + + /** + * 对{@code code}的值进行相等性测试 + * @param value 基准值 + * @return 返回ture表示相等 + */ + public boolean codeEquals(int value) { + return original.getCode() == value; + } + + /** + * 对{@code code}的值进行相等性测试 + * @param value 基准值 + * @return 返回ture表示不相等 + */ + public boolean codeNotEquals(int value) { + return !codeEquals(value); + } + + /** + * 是否成功 + * @return 返回ture表示成功 + * @see CommonConstants#SUCCESS + */ + public boolean isSuccess() { + return codeEquals(CommonConstants.SUCCESS); + } + + /** + * 是否失败 + * @return 返回ture表示失败 + */ + public boolean notSuccess() { + return !isSuccess(); + } + + // ~ 链式操作 + // =================================================================================================== + + /** + * 断言{@code code}的值 + * @param expect 预期的值 + * @param func 用户函数,负责创建异常对象 + * @param 异常类型 + * @return 返回实例,以便于继续进行链式操作 + * @throws Ex 断言失败时抛出 + */ + public RetOps assertCode(int expect, Function, ? extends Ex> func) + throws Ex { + if (codeNotEquals(expect)) { + throw func.apply(original); + } + return this; + } + + /** + * 断言成功 + * @param func 用户函数,负责创建异常对象 + * @param 异常类型 + * @return 返回实例,以便于继续进行链式操作 + * @throws Ex 断言失败时抛出 + */ + public RetOps assertSuccess(Function, ? extends Ex> func) throws Ex { + return assertCode(CommonConstants.SUCCESS, func); + } + + /** + * 断言业务数据有值 + * @param func 用户函数,负责创建异常对象 + * @param 异常类型 + * @return 返回实例,以便于继续进行链式操作 + * @throws Ex 断言失败时抛出 + */ + public RetOps assertDataNotNull(Function, ? extends Ex> func) throws Ex { + if (Objects.isNull(original.getData())) { + throw func.apply(original); + } + return this; + } + + /** + * 断言业务数据有值,并且包含元素 + * @param func 用户函数,负责创建异常对象 + * @param 异常类型 + * @return 返回实例,以便于继续进行链式操作 + * @throws Ex 断言失败时抛出 + */ + public RetOps assertDataNotEmpty(Function, ? extends Ex> func) throws Ex { + if (ObjectUtil.isEmpty(original.getData())) { + throw func.apply(original); + } + return this; + } + + /** + * 对业务数据(data)转换 + * @param mapper 业务数据转换函数 + * @param 数据类型 + * @return 返回新实例,以便于继续进行链式操作 + */ + public RetOps map(Function mapper) { + R result = R.restResult(mapper.apply(original.getData()), original.getCode(), original.getMsg()); + return of(result); + } + + /** + * 对业务数据(data)转换 + * @param predicate 断言函数 + * @param mapper 业务数据转换函数 + * @param 数据类型 + * @return 返回新实例,以便于继续进行链式操作 + * @see RetOps#CODE_SUCCESS + * @see RetOps#HAS_DATA + * @see RetOps#HAS_ELEMENT + * @see RetOps#DATA_AVAILABLE + */ + public RetOps mapIf(Predicate> predicate, Function mapper) { + R result = R.restResult(mapper.apply(original.getData()), original.getCode(), original.getMsg()); + return of(result); + } + + // ~ 数据消费 + // =================================================================================================== + + /** + * 消费数据,注意此方法保证数据可用 + * @param consumer 消费函数 + */ + public void useData(Consumer consumer) { + consumer.accept(original.getData()); + } + + /** + * 条件消费(错误代码匹配某个值) + * @param consumer 消费函数 + * @param codes 错误代码集合,匹配任意一个则调用消费函数 + */ + public void useDataOnCode(Consumer consumer, int... codes) { + useDataIf(o -> Arrays.stream(codes).filter(c -> original.getCode() == c).findFirst().isPresent(), consumer); + } + + /** + * 条件消费(错误代码表示成功) + * @param consumer 消费函数 + */ + public void useDataIfSuccess(Consumer consumer) { + useDataIf(CODE_SUCCESS, consumer); + } + + /** + * 条件消费 + * @param predicate 断言函数 + * @param consumer 消费函数,断言函数返回{@code true}时被调用 + * @see RetOps#CODE_SUCCESS + * @see RetOps#HAS_DATA + * @see RetOps#HAS_ELEMENT + * @see RetOps#DATA_AVAILABLE + */ + public void useDataIf(Predicate> predicate, Consumer consumer) { + if (predicate.test(original)) { + consumer.accept(original.getData()); + } + } + +} diff --git a/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/util/SpringContextHolder.java b/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/util/SpringContextHolder.java new file mode 100644 index 0000000..8637088 --- /dev/null +++ b/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/util/SpringContextHolder.java @@ -0,0 +1,127 @@ +/* + * + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + * + */ + +package com.pig4cloud.pigx.common.core.util; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.DisposableBean; +import org.springframework.beans.factory.ListableBeanFactory; +import org.springframework.beans.factory.config.BeanFactoryPostProcessor; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.context.ApplicationEvent; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; + +import java.util.Map; + +/** + * @author lengleng + * @date 2018/6/27 Spring 工具类 + */ +@Slf4j +@Service +@Lazy(false) +public class SpringContextHolder implements BeanFactoryPostProcessor, ApplicationContextAware, DisposableBean { + + private static ConfigurableListableBeanFactory beanFactory; + + private static ApplicationContext applicationContext = null; + + /** + * 取得存储在静态变量中的ApplicationContext. + */ + public static ApplicationContext getApplicationContext() { + return applicationContext; + } + + /** + * BeanFactoryPostProcessor, 注入Context到静态变量中. + */ + @Override + public void postProcessBeanFactory(ConfigurableListableBeanFactory factory) throws BeansException { + SpringContextHolder.beanFactory = factory; + } + + /** + * 实现ApplicationContextAware接口, 注入Context到静态变量中. + */ + @Override + public void setApplicationContext(ApplicationContext applicationContext) { + SpringContextHolder.applicationContext = applicationContext; + } + + public static ListableBeanFactory getBeanFactory() { + return null == beanFactory ? applicationContext : beanFactory; + } + + /** + * 从静态变量applicationContext中取得Bean, 自动转型为所赋值对象的类型. + */ + @SuppressWarnings("unchecked") + public static T getBean(String name) { + return (T) getBeanFactory().getBean(name); + } + + /** + * 从静态变量applicationContext中取得Bean, Map + */ + public static Map getBeansOfType(Class type) { + return getBeanFactory().getBeansOfType(type); + } + + /** + * 从静态变量applicationContext中取得Bean, 自动转型为所赋值对象的类型. + */ + public static T getBean(Class requiredType) { + return getBeanFactory().getBean(requiredType); + } + + /** + * 清除SpringContextHolder中的ApplicationContext为Null. + */ + public static void clearHolder() { + if (log.isDebugEnabled()) { + log.debug("清除SpringContextHolder中的ApplicationContext:" + applicationContext); + } + applicationContext = null; + } + + /** + * 发布事件 + * @param event + */ + public static void publishEvent(ApplicationEvent event) { + if (applicationContext == null) { + return; + } + applicationContext.publishEvent(event); + } + + /** + * 实现DisposableBean接口, 在Context关闭时清理静态变量. + */ + @Override + public void destroy() { + SpringContextHolder.clearHolder(); + } + +} diff --git a/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/util/ValidGroup.java b/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/util/ValidGroup.java new file mode 100644 index 0000000..8b4fe0a --- /dev/null +++ b/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/util/ValidGroup.java @@ -0,0 +1,31 @@ +package com.pig4cloud.pigx.common.core.util; + +/** + * 校验类型 + * + * @author lengleng + * @date 2022/4/26 + */ +public class ValidGroup { + + /** + * 插入组 + * + * @author lengleng + * @date 2022/4/26 + */ + public static interface Insert { + + } + + /** + * 编辑组 + * + * @author lengleng + * @date 2022/4/26 + */ + public static interface Update { + + } + +} diff --git a/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/util/WebUtils.java b/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/util/WebUtils.java new file mode 100644 index 0000000..c19cf23 --- /dev/null +++ b/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/util/WebUtils.java @@ -0,0 +1,239 @@ +/* + * + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + * + */ + +package com.pig4cloud.pigx.common.core.util; + +import cn.hutool.core.codec.Base64; +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; +import lombok.experimental.UtilityClass; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.MediaType; +import org.springframework.util.Assert; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.context.request.RequestAttributes; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; +import org.springframework.web.method.HandlerMethod; + +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.PrintWriter; +import java.nio.charset.StandardCharsets; +import java.util.Optional; + +/** + * Miscellaneous utilities for web applications. + * + * @author L.cm + */ +@Slf4j +@UtilityClass +public class WebUtils extends org.springframework.web.util.WebUtils { + + private final String BASIC_ = "Basic "; + + private final String UNKNOWN = "unknown"; + + /** + * 判断是否ajax请求 spring ajax 返回含有 ResponseBody 或者 RestController注解 + * @param handlerMethod HandlerMethod + * @return 是否ajax请求 + */ + public boolean isBody(HandlerMethod handlerMethod) { + ResponseBody responseBody = ClassUtils.getAnnotation(handlerMethod, ResponseBody.class); + return responseBody != null; + } + + /** + * 读取cookie + * @param name cookie name + * @return cookie value + */ + public String getCookieVal(String name) { + HttpServletRequest request = WebUtils.getRequest(); + Assert.notNull(request, "request from RequestContextHolder is null"); + return getCookieVal(request, name); + } + + /** + * 读取cookie + * @param request HttpServletRequest + * @param name cookie name + * @return cookie value + */ + public String getCookieVal(HttpServletRequest request, String name) { + Cookie cookie = getCookie(request, name); + return cookie != null ? cookie.getValue() : null; + } + + /** + * 清除 某个指定的cookie + * @param response HttpServletResponse + * @param key cookie key + */ + public void removeCookie(HttpServletResponse response, String key) { + setCookie(response, key, null, 0); + } + + /** + * 设置cookie + * @param response HttpServletResponse + * @param name cookie name + * @param value cookie value + * @param maxAgeInSeconds maxage + */ + public void setCookie(HttpServletResponse response, String name, String value, int maxAgeInSeconds) { + Cookie cookie = new Cookie(name, value); + cookie.setPath("/"); + cookie.setMaxAge(maxAgeInSeconds); + cookie.setHttpOnly(true); + response.addCookie(cookie); + } + + /** + * 获取 HttpServletRequest + * @return {HttpServletRequest} + */ + public HttpServletRequest getRequest() { + try { + RequestAttributes requestAttributes = RequestContextHolder.currentRequestAttributes(); + return ((ServletRequestAttributes) requestAttributes).getRequest(); + } + catch (Exception e) { + return null; + } + } + + /** + * 获取 HttpServletResponse + * @return {HttpServletResponse} + */ + public HttpServletResponse getResponse() { + return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse(); + } + + /** + * 返回json + * @param response HttpServletResponse + * @param result 结果对象 + */ + public void renderJson(HttpServletResponse response, Object result) { + renderJson(response, result, MediaType.APPLICATION_JSON_VALUE); + } + + /** + * 返回json + * @param response HttpServletResponse + * @param result 结果对象 + * @param contentType contentType + */ + public void renderJson(HttpServletResponse response, Object result, String contentType) { + response.setCharacterEncoding("UTF-8"); + response.setContentType(contentType); + try (PrintWriter out = response.getWriter()) { + out.append(JSONUtil.toJsonStr(result)); + } + catch (IOException e) { + log.error(e.getMessage(), e); + } + } + + /** + * 获取ip + * @return {String} + */ + public String getIP() { + return getIP(WebUtils.getRequest()); + } + + /** + * 获取ip + * @param request HttpServletRequest + * @return {String} + */ + public String getIP(HttpServletRequest request) { + Assert.notNull(request, "HttpServletRequest is null"); + String ip = request.getHeader("X-Requested-For"); + if (StrUtil.isBlank(ip) || UNKNOWN.equalsIgnoreCase(ip)) { + ip = request.getHeader("X-Forwarded-For"); + } + if (StrUtil.isBlank(ip) || UNKNOWN.equalsIgnoreCase(ip)) { + ip = request.getHeader("Proxy-Client-IP"); + } + if (StrUtil.isBlank(ip) || UNKNOWN.equalsIgnoreCase(ip)) { + ip = request.getHeader("WL-Proxy-Client-IP"); + } + if (StrUtil.isBlank(ip) || UNKNOWN.equalsIgnoreCase(ip)) { + ip = request.getHeader("HTTP_CLIENT_IP"); + } + if (StrUtil.isBlank(ip) || UNKNOWN.equalsIgnoreCase(ip)) { + ip = request.getHeader("HTTP_X_FORWARDED_FOR"); + } + if (StrUtil.isBlank(ip) || UNKNOWN.equalsIgnoreCase(ip)) { + ip = request.getRemoteAddr(); + } + return StrUtil.isBlank(ip) ? null : ip.split(",")[0]; + } + + /** + * 解析 client id + * @param header + * @param defVal + * @return 如果解析失败返回默认值 + */ + public String extractClientId(String header, final String defVal) { + + if (header == null || !header.startsWith(BASIC_)) { + log.debug("请求头中client信息为空: {}", header); + return defVal; + } + byte[] base64Token = header.substring(6).getBytes(StandardCharsets.UTF_8); + byte[] decoded; + try { + decoded = Base64.decode(base64Token); + } + catch (IllegalArgumentException e) { + log.debug("Failed to decode basic authentication token: {}", header); + return defVal; + } + + String token = new String(decoded, StandardCharsets.UTF_8); + + int delim = token.indexOf(":"); + + if (delim == -1) { + log.debug("Invalid basic authentication token: {}", header); + return defVal; + } + return token.substring(0, delim); + } + + /** + * 从请求头中解析 client id + * @param header + * @return + */ + public Optional extractClientId(String header) { + return Optional.ofNullable(extractClientId(header, null)); + } + +} diff --git a/pigx-common/pigx-common-core/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/pigx-common/pigx-common-core/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 0000000..e068d87 --- /dev/null +++ b/pigx-common/pigx-common-core/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1,4 @@ +com.pig4cloud.pigx.common.core.config.JacksonConfiguration +com.pig4cloud.pigx.common.core.config.MessageSourceConfiguration +com.pig4cloud.pigx.common.core.config.RestTemplateConfiguration +com.pig4cloud.pigx.common.core.util.SpringContextHolder diff --git a/pigx-common/pigx-common-core/src/main/resources/banner.txt b/pigx-common/pigx-common-core/src/main/resources/banner.txt new file mode 100644 index 0000000..0c88adf --- /dev/null +++ b/pigx-common/pigx-common-core/src/main/resources/banner.txt @@ -0,0 +1,16 @@ +${AnsiColor.BRIGHT_YELLOW} + + ::::::::: ::::::::::: :::::::: ::: ::: + :+: :+: :+: :+: :+: :+: :+: + +:+ +:+ +:+ +:+ +:+ +:+ + +#++:++#+ +#+ :#: +#++:+ + +#+ +#+ +#+ +#+# +#+ +#+ + #+# #+# #+# #+# #+# #+# + ### ########### ######## ### ### + + www.pig4cloud.com + + Pig Microservice Architecture +${AnsiColor.DEFAULT} + + diff --git a/pigx-common/pigx-common-core/src/main/resources/i18n/messages_zh_CN.properties b/pigx-common/pigx-common-core/src/main/resources/i18n/messages_zh_CN.properties new file mode 100644 index 0000000..21fbbd0 --- /dev/null +++ b/pigx-common/pigx-common-core/src/main/resources/i18n/messages_zh_CN.properties @@ -0,0 +1,21 @@ +sys.user.update.passwordError=\u539F\u5BC6\u7801\u9519\u8BEF\uFF0C\u4FEE\u6539\u5931\u8D25 +sys.user.query.error=\u83B7\u53D6\u5F53\u524D\u7528\u6237\u4FE1\u606F\u5931\u8D25 +sys.user.import.succeed=\u7528\u6237\u5BFC\u5165\u6210\u529F\uFF0C\u9ED8\u8BA4\u5BC6\u7801\u4E3A\u624B\u673A\u53F7 +sys.user.username.existing={0} \u7528\u6237\u540D\u5DF2\u5B58\u5728 +sys.user.phone.existing={0} \u624b\u673a\u53f7\u5df2\u5b58\u5728 +sys.user.userInfo.empty={0} \u7528\u6237\u4FE1\u606F\u4E3A\u7A7A +sys.dept.deptName.inexistence={0} \u90E8\u95E8\u540D\u79F0\u4E0D\u5B58\u5728 +sys.post.postName.inexistence={0} \u5C97\u4F4D\u540D\u79F0\u4E0D\u5B58\u5728 +sys.post.nameOrCode.existing={0} {1} \u5C97\u4F4D\u540D\u6216\u5C97\u4F4D\u7F16\u7801\u5DF2\u7ECF\u5B58\u5728 +sys.role.roleName.inexistence={0} \u89D2\u8272\u540D\u79F0\u4E0D\u5B58\u5728 +sys.role.nameOrCode.existing={0} {1} \u89D2\u8272\u540D\u6216\u89D2\u8272\u7F16\u7801\u5DF2\u7ECF\u5B58\u5728 +sys.param.delete.system=\u7CFB\u7EDF\u5185\u7F6E\u53C2\u6570\u4E0D\u80FD\u5220\u9664 +sys.param.config.error={0} \u7CFB\u7EDF\u53C2\u6570\u914D\u7F6E\u9519\u8BEF +sys.menu.delete.existing=\u83DC\u5355\u542B\u6709\u4E0B\u7EA7\u4E0D\u80FD\u5220\u9664 +sys.app.sms.often=\u9A8C\u8BC1\u7801\u53D1\u9001\u8FC7\u9891\u7E41 +sys.app.phone.unregistered={0} \u624B\u673A\u53F7\u672A\u6CE8\u518C +sys.dict.delete.system=\u7CFB\u7EDF\u5185\u7F6E\u5B57\u5178\u9879\u76EE\u4E0D\u80FD\u5220\u9664 +sys.dict.update.system=\u7CFB\u7EDF\u5185\u7F6E\u5B57\u5178\u9879\u76EE\u4E0D\u80FD\u4FEE\u6539 +sys.connect.cp.dept.sync.error=\u83B7\u53D6\u4F01\u4E1A\u5FAE\u4FE1\u90E8\u95E8\u5217\u8868\u5931\u8D25 +sys.connect.cp.user.sync.error=\u83B7\u53D6\u4F01\u4E1A\u5FAE\u4FE1\u7528\u6237\u5217\u8868\u5931\u8D25 +app.user.userInfo.empty={0} \u7528\u6237\u4FE1\u606F\u4E3A\u7A7A diff --git a/pigx-common/pigx-common-data/pom.xml b/pigx-common/pigx-common-data/pom.xml new file mode 100644 index 0000000..3506af8 --- /dev/null +++ b/pigx-common/pigx-common-data/pom.xml @@ -0,0 +1,56 @@ + + + 4.0.0 + + com.pig4cloud + pigx-common + 5.2.0 + + + pigx-common-data + jar + + pigx 数据操作相关 + + + + + + com.pig4cloud + pigx-common-core + + + + com.baomidou + mybatis-plus-extension + + + + com.github.yulichang + mybatis-plus-join-boot-starter + + + + com.alibaba + druid + true + + + + com.pig4cloud + pigx-common-security + true + + + + com.pig4cloud + as-upms-api + + + + org.springframework.boot + spring-boot-starter-data-redis + + + diff --git a/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/cache/DefaultRedisCacheWriter.java b/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/cache/DefaultRedisCacheWriter.java new file mode 100644 index 0000000..2ee9c89 --- /dev/null +++ b/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/cache/DefaultRedisCacheWriter.java @@ -0,0 +1,297 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.common.data.cache; + +import org.springframework.dao.PessimisticLockingFailureException; +import org.springframework.data.redis.cache.CacheStatistics; +import org.springframework.data.redis.cache.CacheStatisticsCollector; +import org.springframework.data.redis.cache.RedisCacheWriter; +import org.springframework.data.redis.connection.RedisConnection; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.connection.RedisStringCommands.SetOption; +import org.springframework.data.redis.core.types.Expiration; +import org.springframework.lang.Nullable; +import org.springframework.util.Assert; + +import java.nio.charset.StandardCharsets; +import java.time.Duration; +import java.util.Collections; +import java.util.Optional; +import java.util.Set; +import java.util.concurrent.TimeUnit; +import java.util.function.Consumer; +import java.util.function.Function; + +/** + * {@link RedisCacheWriter} implementation capable of reading/writing binary data from/to + * Redis in {@literal standalone} and {@literal cluster} environments. Works upon a given + * {@link RedisConnectionFactory} to obtain the actual {@link RedisConnection}.
+ * {@link DefaultRedisCacheWriter} can be used in + * {@link RedisCacheWriter#lockingRedisCacheWriter(RedisConnectionFactory) locking} or + * {@link RedisCacheWriter#nonLockingRedisCacheWriter(RedisConnectionFactory) non-locking} + * mode. While {@literal non-locking} aims for maximum performance it may result in + * overlapping, non atomic, command execution for operations spanning multiple Redis + * interactions like {@code putIfAbsent}. The {@literal locking} counterpart prevents + * command overlap by setting an explicit lock key and checking against presence of this + * key which leads to additional requests and potential command wait times. + * + * @author Christoph Strobl + * @author Mark Paluch + * @since 2.0 + */ +class DefaultRedisCacheWriter implements RedisCacheWriter { + + private final RedisConnectionFactory connectionFactory; + + private final Duration sleepTime; + + /** + * @param connectionFactory must not be {@literal null}. + */ + DefaultRedisCacheWriter(RedisConnectionFactory connectionFactory) { + this(connectionFactory, Duration.ZERO); + } + + /** + * @param connectionFactory must not be {@literal null}. + * @param sleepTime sleep time between lock request attempts. Must not be + * {@literal null}. Use {@link Duration#ZERO} to disable locking. + */ + private DefaultRedisCacheWriter(RedisConnectionFactory connectionFactory, Duration sleepTime) { + + Assert.notNull(connectionFactory, "ConnectionFactory must not be null!"); + Assert.notNull(sleepTime, "SleepTime must not be null!"); + + this.connectionFactory = connectionFactory; + this.sleepTime = sleepTime; + } + + @Override + public void put(String name, byte[] key, byte[] value, @Nullable Duration ttl) { + + Assert.notNull(name, "Name must not be null!"); + Assert.notNull(key, "Key must not be null!"); + Assert.notNull(value, "Value must not be null!"); + + execute(name, connection -> { + + if (shouldExpireWithin(ttl)) { + connection.set(key, value, Expiration.from(ttl.toMillis(), TimeUnit.MILLISECONDS), SetOption.upsert()); + } + else { + connection.set(key, value); + } + + return "OK"; + }); + } + + @Override + public byte[] get(String name, byte[] key) { + + Assert.notNull(name, "Name must not be null!"); + Assert.notNull(key, "Key must not be null!"); + + return execute(name, connection -> connection.get(key)); + } + + @Override + public byte[] putIfAbsent(String name, byte[] key, byte[] value, @Nullable Duration ttl) { + + Assert.notNull(name, "Name must not be null!"); + Assert.notNull(key, "Key must not be null!"); + Assert.notNull(value, "Value must not be null!"); + + return execute(name, connection -> { + + if (isLockingCacheWriter()) { + doLock(name, connection); + } + + try { + if (Boolean.TRUE.equals(connection.setNX(key, value))) { + + if (shouldExpireWithin(ttl)) { + connection.pExpire(key, ttl.toMillis()); + } + return null; + } + + return connection.get(key); + } + finally { + + if (isLockingCacheWriter()) { + doUnlock(name, connection); + } + } + }); + } + + /** + * 删除,原来是删除指定的键,目前修改为既可以删除指定键的数据,也是可以删除某个前缀开始的所有数据 + * @param name + * @param key + */ + @Override + public void remove(String name, byte[] key) { + + Assert.notNull(name, "Name must not be null!"); + Assert.notNull(key, "Key must not be null!"); + + execute(name, connection -> { + // 获取某个前缀所拥有的所有的键,某个前缀开头,后面肯定是* + Set keys = connection.keys(key); + int delNum = 0; + Assert.notNull(keys, "keys must not be null!"); + for (byte[] keyByte : keys) { + delNum += connection.del(keyByte); + } + return delNum; + }); + } + + @Override + public void clean(String name, byte[] pattern) { + + Assert.notNull(name, "Name must not be null!"); + Assert.notNull(pattern, "Pattern must not be null!"); + + execute(name, connection -> { + + boolean wasLocked = false; + + try { + + if (isLockingCacheWriter()) { + doLock(name, connection); + wasLocked = true; + } + + byte[][] keys = Optional.ofNullable(connection.keys(pattern)).orElse(Collections.emptySet()) + .toArray(new byte[0][]); + + if (keys.length > 0) { + connection.del(keys); + } + } + finally { + + if (wasLocked && isLockingCacheWriter()) { + doUnlock(name, connection); + } + } + + return "OK"; + }); + } + + @Override + public void clearStatistics(String s) { + + } + + @Override + public RedisCacheWriter withStatisticsCollector(CacheStatisticsCollector cacheStatisticsCollector) { + return null; + } + + /** + * Explicitly set a write lock on a cache. + * @param name the name of the cache to lock. + */ + void lock(String name) { + execute(name, connection -> doLock(name, connection)); + } + + /** + * Explicitly remove a write lock from a cache. + * @param name the name of the cache to unlock. + */ + void unlock(String name) { + executeLockFree(connection -> doUnlock(name, connection)); + } + + private Boolean doLock(String name, RedisConnection connection) { + return connection.setNX(createCacheLockKey(name), new byte[0]); + } + + private Long doUnlock(String name, RedisConnection connection) { + return connection.del(createCacheLockKey(name)); + } + + boolean doCheckLock(String name, RedisConnection connection) { + return connection.exists(createCacheLockKey(name)); + } + + /** + * @return {@literal true} if {@link RedisCacheWriter} uses locks. + */ + private boolean isLockingCacheWriter() { + return !sleepTime.isZero() && !sleepTime.isNegative(); + } + + private T execute(String name, Function callback) { + + try (RedisConnection connection = connectionFactory.getConnection()) { + checkAndPotentiallyWaitUntilUnlocked(name, connection); + return callback.apply(connection); + } + } + + private void executeLockFree(Consumer callback) { + try (RedisConnection connection = connectionFactory.getConnection()) { + callback.accept(connection); + } + } + + private void checkAndPotentiallyWaitUntilUnlocked(String name, RedisConnection connection) { + + if (!isLockingCacheWriter()) { + return; + } + + try { + while (doCheckLock(name, connection)) { + Thread.sleep(sleepTime.toMillis()); + } + } + catch (InterruptedException ex) { + + // Re-interrupt current thread, to allow other participants to react. + Thread.currentThread().interrupt(); + + throw new PessimisticLockingFailureException( + String.format("Interrupted while waiting to unlock cache %s", name), ex); + } + } + + private static boolean shouldExpireWithin(@Nullable Duration ttl) { + return ttl != null && !ttl.isZero() && !ttl.isNegative(); + } + + private static byte[] createCacheLockKey(String name) { + return (name + "~lock").getBytes(StandardCharsets.UTF_8); + } + + @Override + public CacheStatistics getCacheStatistics(String s) { + return null; + } + +} diff --git a/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/cache/RedisAutoCacheManager.java b/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/cache/RedisAutoCacheManager.java new file mode 100644 index 0000000..88ed5dd --- /dev/null +++ b/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/cache/RedisAutoCacheManager.java @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.common.data.cache; + +import cn.hutool.core.util.StrUtil; +import com.pig4cloud.pigx.common.core.constant.CacheConstants; +import com.pig4cloud.pigx.common.data.tenant.TenantContextHolder; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.convert.DurationStyle; +import org.springframework.cache.Cache; +import org.springframework.data.redis.cache.RedisCache; +import org.springframework.data.redis.cache.RedisCacheConfiguration; +import org.springframework.data.redis.cache.RedisCacheManager; +import org.springframework.data.redis.cache.RedisCacheWriter; +import org.springframework.lang.Nullable; + +import java.time.Duration; +import java.time.temporal.ChronoUnit; +import java.util.Map; + +/** + * redis cache 扩展cache name自动化配置 + * + * @author L.cm + * @author lengleng + *

+ * cachename = xx#ttl + */ +@Slf4j +public class RedisAutoCacheManager extends RedisCacheManager { + + private static final String SPLIT_FLAG = "#"; + + private static final int CACHE_LENGTH = 2; + + RedisAutoCacheManager(RedisCacheWriter cacheWriter, RedisCacheConfiguration defaultCacheConfiguration, + Map initialCacheConfigurations, boolean allowInFlightCacheCreation) { + super(cacheWriter, defaultCacheConfiguration, initialCacheConfigurations, allowInFlightCacheCreation); + } + + @Override + protected RedisCache createRedisCache(String name, @Nullable RedisCacheConfiguration cacheConfig) { + if (StrUtil.isBlank(name) || !name.contains(SPLIT_FLAG)) { + return super.createRedisCache(name, cacheConfig); + } + + String[] cacheArray = name.split(SPLIT_FLAG); + if (cacheArray.length < CACHE_LENGTH) { + return super.createRedisCache(name, cacheConfig); + } + + if (cacheConfig != null) { + Duration duration = DurationStyle.detectAndParse(cacheArray[1], ChronoUnit.SECONDS); + cacheConfig = cacheConfig.entryTtl(duration); + } + return super.createRedisCache(cacheArray[0], cacheConfig); + } + + /** + * 从上下文中获取租户ID,重写@Cacheable value 值 + * @param name + * @return + */ + @Override + public Cache getCache(String name) { + // see https://gitee.wang/pig/pigx/issues/613 + if (name.startsWith(CacheConstants.GLOBALLY)) { + return super.getCache(name); + } + return super.getCache(TenantContextHolder.getTenantId() + StrUtil.COLON + name); + } + +} diff --git a/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/cache/RedisCacheAutoConfiguration.java b/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/cache/RedisCacheAutoConfiguration.java new file mode 100644 index 0000000..9d10c0d --- /dev/null +++ b/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/cache/RedisCacheAutoConfiguration.java @@ -0,0 +1,114 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.common.data.cache; + +import org.springframework.beans.factory.ObjectProvider; +import org.springframework.boot.autoconfigure.AutoConfigureAfter; +import org.springframework.boot.autoconfigure.cache.CacheManagerCustomizers; +import org.springframework.boot.autoconfigure.cache.CacheProperties; +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; +import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import org.springframework.core.io.ResourceLoader; +import org.springframework.data.redis.cache.RedisCacheConfiguration; +import org.springframework.data.redis.cache.RedisCacheManager; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.serializer.JdkSerializationRedisSerializer; +import org.springframework.data.redis.serializer.RedisSerializationContext; +import org.springframework.lang.Nullable; + +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +/** + * 扩展redis-cache支持注解cacheName添加超时时间 + * + * @author L.cm + */ +@Configuration +@AutoConfigureAfter({ RedisAutoConfiguration.class }) +@ConditionalOnBean({ RedisConnectionFactory.class }) +@EnableConfigurationProperties(CacheProperties.class) +public class RedisCacheAutoConfiguration { + + private final CacheProperties cacheProperties; + + private final CacheManagerCustomizers customizerInvoker; + + @Nullable + private final RedisCacheConfiguration redisCacheConfiguration; + + RedisCacheAutoConfiguration(CacheProperties cacheProperties, CacheManagerCustomizers customizerInvoker, + ObjectProvider redisCacheConfiguration) { + this.cacheProperties = cacheProperties; + this.customizerInvoker = customizerInvoker; + this.redisCacheConfiguration = redisCacheConfiguration.getIfAvailable(); + } + + @Bean + @Primary + public RedisCacheManager cacheManager(RedisConnectionFactory connectionFactory, ResourceLoader resourceLoader) { + DefaultRedisCacheWriter redisCacheWriter = new DefaultRedisCacheWriter(connectionFactory); + RedisCacheConfiguration cacheConfiguration = this.determineConfiguration(resourceLoader.getClassLoader()); + List cacheNames = this.cacheProperties.getCacheNames(); + Map initialCaches = new LinkedHashMap<>(); + if (!cacheNames.isEmpty()) { + Map cacheConfigMap = new LinkedHashMap<>(cacheNames.size()); + cacheNames.forEach(it -> cacheConfigMap.put(it, cacheConfiguration)); + initialCaches.putAll(cacheConfigMap); + } + RedisAutoCacheManager cacheManager = new RedisAutoCacheManager(redisCacheWriter, cacheConfiguration, + initialCaches, true); + cacheManager.setTransactionAware(false); + return this.customizerInvoker.customize(cacheManager); + } + + private RedisCacheConfiguration determineConfiguration(ClassLoader classLoader) { + if (this.redisCacheConfiguration != null) { + return this.redisCacheConfiguration; + } + else { + CacheProperties.Redis redisProperties = this.cacheProperties.getRedis(); + RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig(); + config = config.serializeValuesWith(RedisSerializationContext.SerializationPair + .fromSerializer(new JdkSerializationRedisSerializer(classLoader))); + if (redisProperties.getTimeToLive() != null) { + config = config.entryTtl(redisProperties.getTimeToLive()); + } + + if (redisProperties.getKeyPrefix() != null) { + config = config.prefixCacheNameWith(redisProperties.getKeyPrefix()); + } + + if (!redisProperties.isCacheNullValues()) { + config = config.disableCachingNullValues(); + } + + if (!redisProperties.isUseKeyPrefix()) { + config = config.disableKeyPrefix(); + } + + return config; + } + } + +} diff --git a/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/cache/RedisCacheManagerConfiguration.java b/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/cache/RedisCacheManagerConfiguration.java new file mode 100644 index 0000000..ba1f159 --- /dev/null +++ b/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/cache/RedisCacheManagerConfiguration.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.common.data.cache; + +import org.springframework.beans.factory.ObjectProvider; +import org.springframework.boot.autoconfigure.cache.CacheManagerCustomizer; +import org.springframework.boot.autoconfigure.cache.CacheManagerCustomizers; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.util.List; + +/** + * CacheManagerCustomizers配置 + * + * @author L.cm + */ +@Configuration +@ConditionalOnMissingBean(CacheManagerCustomizers.class) +public class RedisCacheManagerConfiguration { + + @Bean + public CacheManagerCustomizers cacheManagerCustomizers( + ObjectProvider>> customizers) { + return new CacheManagerCustomizers(customizers.getIfAvailable()); + } + +} diff --git a/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/cache/RedisMessageConfiguration.java b/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/cache/RedisMessageConfiguration.java new file mode 100644 index 0000000..dc7d6bf --- /dev/null +++ b/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/cache/RedisMessageConfiguration.java @@ -0,0 +1,26 @@ +package com.pig4cloud.pigx.common.data.cache; + +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.listener.RedisMessageListenerContainer; + +/** + * @author lengleng + * @date 2022/2/4 + * + * redis message 信道相关配置 + */ +@Configuration(proxyBeanMethods = false) +public class RedisMessageConfiguration { + + @Bean + @ConditionalOnMissingBean + public RedisMessageListenerContainer redisContainer(RedisConnectionFactory redisConnectionFactory) { + RedisMessageListenerContainer container = new RedisMessageListenerContainer(); + container.setConnectionFactory(redisConnectionFactory); + return container; + } + +} diff --git a/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/cache/RedisTemplateConfiguration.java b/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/cache/RedisTemplateConfiguration.java new file mode 100644 index 0000000..736427a --- /dev/null +++ b/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/cache/RedisTemplateConfiguration.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.common.data.cache; + +import org.springframework.boot.autoconfigure.AutoConfigureBefore; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.serializer.JdkSerializationRedisSerializer; +import org.springframework.data.redis.serializer.StringRedisSerializer; + +/** + * RedisTemplate 配置 + * + * @author L.cm + */ +@EnableCaching +@Configuration +@AutoConfigureBefore(name = { "org.redisson.spring.starter.RedissonAutoConfiguration", + "org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration" }) +public class RedisTemplateConfiguration { + + @Bean + @Primary + public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) { + RedisTemplate redisTemplate = new RedisTemplate<>(); + redisTemplate.setKeySerializer(new StringRedisSerializer()); + redisTemplate.setHashKeySerializer(new StringRedisSerializer()); + redisTemplate.setValueSerializer(new JdkSerializationRedisSerializer()); + redisTemplate.setHashValueSerializer(new JdkSerializationRedisSerializer()); + redisTemplate.setConnectionFactory(redisConnectionFactory); + return redisTemplate; + } + +} diff --git a/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/datascope/DataScope.java b/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/datascope/DataScope.java new file mode 100644 index 0000000..d30724e --- /dev/null +++ b/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/datascope/DataScope.java @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.common.data.datascope; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +/** + * @author lengleng + * @date 2018/8/30 数据权限查询参数 + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class DataScope extends HashMap { + + /** + * 限制范围的字段名称 + */ + private String scopeDeptName = "dept_id"; + + /** + * 本人权限范围字段 + */ + private String scopeUserName = "create_by"; + + /** + * 具体的数据范围 + */ + private List deptList = new ArrayList<>(); + + /** + * 具体查询的用户数据权限范围 + */ + private String username; + + /** + * 是否只查询本部门 + */ + private Boolean isOnly = false; + + /** + * 函数名称,默认 SELECT * ; + * + *

    + *
  • COUNT(1)
  • + *
+ */ + private DataScopeFuncEnum func = DataScopeFuncEnum.ALL; + + /** + * of 获取实例 + */ + public static DataScope of() { + return new DataScope(); + } + + public DataScope deptIds(List deptIds) { + this.deptList = deptIds; + return this; + } + + public DataScope only(boolean isOnly) { + this.isOnly = isOnly; + return this; + } + + public DataScope func(DataScopeFuncEnum func) { + this.func = func; + return this; + } + +} diff --git a/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/datascope/DataScopeFuncEnum.java b/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/datascope/DataScopeFuncEnum.java new file mode 100644 index 0000000..db91188 --- /dev/null +++ b/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/datascope/DataScopeFuncEnum.java @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.common.data.datascope; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 数据权限函数类型 + * + * @author lengleng + * @date 2020-06-17 + */ +@Getter +@AllArgsConstructor +public enum DataScopeFuncEnum { + + /** + * 查询全部数据 SELECT * FROM (originSql) temp_data_scope WHERE temp_data_scope.dept_id IN + * (1) + */ + ALL("*", "全部"), + + /** + * 查询函数COUNT SELECT COUNT(1) FROM (originSql) temp_data_scope WHERE + * temp_data_scope.dept_id IN (1) + */ + COUNT("COUNT(1)", "自定义"); + + /** + * 类型 + */ + private final String type; + + /** + * 描述 + */ + private final String description; + +} diff --git a/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/datascope/DataScopeHandle.java b/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/datascope/DataScopeHandle.java new file mode 100644 index 0000000..20173bc --- /dev/null +++ b/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/datascope/DataScopeHandle.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.common.data.datascope; + +/** + * @author lengleng + * @date 2019-09-07 + *

+ * data scope 判断处理器,抽象服务扩展 + */ +public interface DataScopeHandle { + + /** + * 计算用户数据权限 + * @param dataScope 数据权限设置 + * @return 返回true表示无需进行数据过滤处理,返回false表示需要进行数据过滤 + */ + Boolean calcScope(DataScope dataScope); + +} diff --git a/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/datascope/DataScopeInnerInterceptor.java b/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/datascope/DataScopeInnerInterceptor.java new file mode 100644 index 0000000..680935b --- /dev/null +++ b/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/datascope/DataScopeInnerInterceptor.java @@ -0,0 +1,92 @@ +package com.pig4cloud.pigx.common.data.datascope; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.toolkit.PluginUtils; +import lombok.Setter; +import org.apache.ibatis.executor.Executor; +import org.apache.ibatis.mapping.BoundSql; +import org.apache.ibatis.mapping.MappedStatement; +import org.apache.ibatis.session.ResultHandler; +import org.apache.ibatis.session.RowBounds; + +import java.util.List; +import java.util.Map; + +/** + * @author lengleng + * @date 2020/11/29 + */ +public class DataScopeInnerInterceptor implements DataScopeInterceptor { + + @Setter + private DataScopeHandle dataScopeHandle; + + @Override + public void beforeQuery(Executor executor, MappedStatement ms, Object parameter, RowBounds rowBounds, + ResultHandler resultHandler, BoundSql boundSql) { + PluginUtils.MPBoundSql mpBs = PluginUtils.mpBoundSql(boundSql); + + String originalSql = boundSql.getSql(); + Object parameterObject = boundSql.getParameterObject(); + + // 查找参数中包含DataScope类型的参数 + DataScope dataScope = findDataScopeObject(parameterObject); + if (dataScope == null) { + return; + } + + // 返回true 不拦截直接返回原始 SQL (只针对 * 查询) + if (dataScopeHandle.calcScope(dataScope) && DataScopeFuncEnum.ALL.equals(dataScope.getFunc())) { + return; + } + + // 返回true 不拦截直接返回原始 SQL (只针对 COUNT 查询) + if (dataScopeHandle.calcScope(dataScope) && DataScopeFuncEnum.COUNT.equals(dataScope.getFunc())) { + mpBs.sql(String.format("SELECT %s FROM (%s) temp_data_scope", dataScope.getFunc().getType(), originalSql)); + return; + } + + List deptIds = dataScope.getDeptList(); + + // 1.无数据权限限制,则直接返回 0 条数据 + if (CollUtil.isEmpty(deptIds) && StrUtil.isBlank(dataScope.getUsername())) { + originalSql = String.format("SELECT %s FROM (%s) temp_data_scope WHERE 1 = 2", + dataScope.getFunc().getType(), originalSql); + } + // 2.如果为本人权限则走下面 + else if (StrUtil.isNotBlank(dataScope.getUsername())) { + originalSql = String.format("SELECT %s FROM (%s) temp_data_scope WHERE temp_data_scope.%s = '%s'", + dataScope.getFunc().getType(), originalSql, dataScope.getScopeUserName(), dataScope.getUsername()); + } + // 3.都没有,则是其他权限,走下面 + else { + String join = CollectionUtil.join(deptIds, ","); + originalSql = String.format("SELECT %s FROM (%s) temp_data_scope WHERE temp_data_scope.%s IN (%s)", + dataScope.getFunc().getType(), originalSql, dataScope.getScopeDeptName(), join); + } + + mpBs.sql(originalSql); + } + + /** + * 查找参数是否包括DataScope对象 + * @param parameterObj 参数列表 + * @return DataScope + */ + private DataScope findDataScopeObject(Object parameterObj) { + if (parameterObj instanceof DataScope) { + return (DataScope) parameterObj; + } + else if (parameterObj instanceof Map) { + for (Object val : ((Map) parameterObj).values()) { + if (val instanceof DataScope) { + return (DataScope) val; + } + } + } + return null; + } + +} diff --git a/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/datascope/DataScopeInterceptor.java b/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/datascope/DataScopeInterceptor.java new file mode 100644 index 0000000..aaac7c9 --- /dev/null +++ b/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/datascope/DataScopeInterceptor.java @@ -0,0 +1,13 @@ +package com.pig4cloud.pigx.common.data.datascope; + +import com.baomidou.mybatisplus.extension.plugins.inner.InnerInterceptor; + +/** + * 数据权限抽象 + * + * @author lengleng + * @date 2022/8/9 + */ +public interface DataScopeInterceptor extends InnerInterceptor { + +} diff --git a/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/datascope/DataScopeSqlInjector.java b/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/datascope/DataScopeSqlInjector.java new file mode 100644 index 0000000..40d63de --- /dev/null +++ b/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/datascope/DataScopeSqlInjector.java @@ -0,0 +1,26 @@ +package com.pig4cloud.pigx.common.data.datascope; + +import com.baomidou.mybatisplus.core.injector.AbstractMethod; +import com.baomidou.mybatisplus.core.metadata.TableInfo; +import com.github.yulichang.injector.MPJSqlInjector; + +import java.util.List; + +/** + * 支持自定义数据权限方法注入 + * + * @author lengleng + * @date 2020-06-17 + */ +public class DataScopeSqlInjector extends MPJSqlInjector { + + @Override + public List getMethodList(Class mapperClass, TableInfo tableInfo) { + List methodList = super.getMethodList(mapperClass, tableInfo); + methodList.add(new SelectListByScope()); + methodList.add(new SelectPageByScope()); + methodList.add(new SelectCountByScope()); + return methodList; + } + +} diff --git a/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/datascope/DataScopeTypeEnum.java b/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/datascope/DataScopeTypeEnum.java new file mode 100644 index 0000000..37eba0d --- /dev/null +++ b/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/datascope/DataScopeTypeEnum.java @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.common.data.datascope; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @author lengleng + * @date 2018/12/26 + *

+ * 数据权限类型 + */ +@Getter +@AllArgsConstructor +public enum DataScopeTypeEnum { + + /** + * 查询全部数据 + */ + ALL(0, "全部"), + + /** + * 自定义 + */ + CUSTOM(1, "自定义"), + + /** + * 本级及子级 + */ + OWN_CHILD_LEVEL(2, "本级及子级"), + + /** + * 本级 + */ + OWN_LEVEL(3, "本级"), + + /** + * 本人 + */ + SELF_LEVEL(4, "本人"); + + /** + * 类型 + */ + private final int type; + + /** + * 描述 + */ + private final String description; + +} diff --git a/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/datascope/PigxBaseMapper.java b/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/datascope/PigxBaseMapper.java new file mode 100644 index 0000000..62a4c7b --- /dev/null +++ b/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/datascope/PigxBaseMapper.java @@ -0,0 +1,45 @@ +package com.pig4cloud.pigx.common.data.datascope; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.github.yulichang.base.MPJBaseMapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 扩展通用 Mapper,支持数据权限 和批量插入 + * + * @author lengleng + * @date 2020-06-17 + */ +public interface PigxBaseMapper extends MPJBaseMapper { + + /** + * 根据 entity 条件,查询全部记录 + * @param queryWrapper 实体对象封装操作类(可以为 null) + * @param scope 数据权限范围 + * @return List + */ + List selectListByScope(@Param(Constants.WRAPPER) Wrapper queryWrapper, DataScope scope); + + /** + * 根据 entity 条件,查询全部记录(并翻页) + * @param page 分页查询条件(可以为 RowBounds.DEFAULT) + * @param queryWrapper 实体对象封装操作类(可以为 null) + * @param scope 数据权限范围 + * @return Page + */ + > E selectPageByScope(E page, @Param(Constants.WRAPPER) Wrapper queryWrapper, + DataScope scope); + + /** + * 根据 Wrapper 条件,查询总记录数 + * @param queryWrapper 实体对象封装操作类(可以为 null) + * @param scope 数据权限范围 + * @return Integer + */ + Long selectCountByScope(@Param(Constants.WRAPPER) Wrapper queryWrapper, DataScope scope); + +} diff --git a/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/datascope/PigxDefaultDatascopeHandle.java b/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/datascope/PigxDefaultDatascopeHandle.java new file mode 100644 index 0000000..d49293e --- /dev/null +++ b/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/datascope/PigxDefaultDatascopeHandle.java @@ -0,0 +1,118 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.common.data.datascope; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.StrUtil; +import com.pig4cloud.pigx.admin.api.entity.SysDept; +import com.pig4cloud.pigx.admin.api.entity.SysRole; +import com.pig4cloud.pigx.admin.api.feign.RemoteDataScopeService; +import com.pig4cloud.pigx.common.core.constant.SecurityConstants; +import com.pig4cloud.pigx.common.core.constant.enums.UserTypeEnum; +import com.pig4cloud.pigx.common.core.util.RetOps; +import com.pig4cloud.pigx.common.security.service.PigxUser; +import com.pig4cloud.pigx.common.security.util.SecurityUtils; +import lombok.RequiredArgsConstructor; +import org.springframework.security.core.GrantedAuthority; + +import java.util.Arrays; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @author lengleng + * @date 2019-09-07 + *

+ * 默认data scope 判断处理器 + */ +@RequiredArgsConstructor +public class PigxDefaultDatascopeHandle implements DataScopeHandle { + + private final RemoteDataScopeService dataScopeService; + + /** + * 计算用户数据权限 + * @param dataScope 数据权限范围 + * @return + */ + @Override + public Boolean calcScope(DataScope dataScope) { + PigxUser user = SecurityUtils.getUser(); + // toc 客户端不进行数据权限 + if (UserTypeEnum.TOC.getStatus().equals(user.getUserType())) { + return true; + } + + List roleIdList = user.getAuthorities().stream().map(GrantedAuthority::getAuthority) + .filter(authority -> authority.startsWith(SecurityConstants.ROLE)) + .map(authority -> authority.split(StrUtil.UNDERLINE)[1]).collect(Collectors.toList()); + + List deptList = dataScope.getDeptList(); + + // 当前用户的角色为空 , 返回false + if (CollectionUtil.isEmpty(roleIdList)) { + return false; + } + // @formatter:off + SysRole role = RetOps.of(dataScopeService.getRoleList(roleIdList)) + .getData() + .orElseGet(Collections::emptyList) + .stream() + .min(Comparator.comparingInt(SysRole::getDsType)).orElse(null); + // @formatter:on + // 角色有可能已经删除了 + if (role == null) { + return false; + } + Integer dsType = role.getDsType(); + // 查询全部 + if (DataScopeTypeEnum.ALL.getType() == dsType) { + return true; + } + // 自定义 + if (DataScopeTypeEnum.CUSTOM.getType() == dsType && StrUtil.isNotBlank(role.getDsScope())) { + String dsScope = role.getDsScope(); + deptList.addAll( + Arrays.stream(dsScope.split(StrUtil.COMMA)).map(Long::parseLong).collect(Collectors.toList())); + } + // 查询本级及其下级 + if (DataScopeTypeEnum.OWN_CHILD_LEVEL.getType() == dsType) { + // @formatter:off + List deptIdList = RetOps.of(dataScopeService.getDescendantList(user.getDeptId())) + .getData() + .orElseGet(Collections::emptyList) + .stream() + .map(SysDept::getDeptId).collect(Collectors.toList()); + // @formatter:on + deptList.addAll(deptIdList); + } + // 只查询本级 + if (DataScopeTypeEnum.OWN_LEVEL.getType() == dsType) { + deptList.add(user.getDeptId()); + } + + // 只查询本人 + if (DataScopeTypeEnum.SELF_LEVEL.getType() == dsType) { + dataScope.setUsername(user.getUsername()); + } + return false; + } + +} diff --git a/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/datascope/SelectCountByScope.java b/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/datascope/SelectCountByScope.java new file mode 100644 index 0000000..3015aa7 --- /dev/null +++ b/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/datascope/SelectCountByScope.java @@ -0,0 +1,33 @@ +package com.pig4cloud.pigx.common.data.datascope; + +import com.baomidou.mybatisplus.core.enums.SqlMethod; +import com.baomidou.mybatisplus.core.injector.AbstractMethod; +import com.baomidou.mybatisplus.core.metadata.TableInfo; +import org.apache.ibatis.mapping.MappedStatement; +import org.apache.ibatis.mapping.SqlSource; + +/** + * 扩展支持COUNT查询数量 + * + * @author lengleng + * @date 2020/6/17 + */ +public class SelectCountByScope extends AbstractMethod { + + public SelectCountByScope() { + super("selectCountByScope"); + } + + @Override + public MappedStatement injectMappedStatement(Class mapperClass, Class modelClass, TableInfo tableInfo) { + SqlMethod sqlMethod = SqlMethod.SELECT_LIST; + + String sql = String.format(sqlMethod.getSql(), this.sqlFirst(), this.sqlSelectColumns(tableInfo, true), + tableInfo.getTableName(), this.sqlWhereEntityWrapper(true, tableInfo), this.sqlOrderBy(tableInfo), + this.sqlComment()); + SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass); + + return this.addSelectMappedStatementForOther(mapperClass, sqlSource, Long.class); + } + +} diff --git a/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/datascope/SelectListByScope.java b/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/datascope/SelectListByScope.java new file mode 100644 index 0000000..dc39a59 --- /dev/null +++ b/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/datascope/SelectListByScope.java @@ -0,0 +1,29 @@ +package com.pig4cloud.pigx.common.data.datascope; + +import com.baomidou.mybatisplus.core.enums.SqlMethod; +import com.baomidou.mybatisplus.core.injector.AbstractMethod; +import com.baomidou.mybatisplus.core.metadata.TableInfo; +import org.apache.ibatis.mapping.MappedStatement; +import org.apache.ibatis.mapping.SqlSource; + +/** + * @author lengleng + * @date 2020/4/26 + */ +public class SelectListByScope extends AbstractMethod { + + public SelectListByScope() { + super("selectListByScope"); + } + + @Override + public MappedStatement injectMappedStatement(Class mapperClass, Class modelClass, TableInfo tableInfo) { + SqlMethod sqlMethod = SqlMethod.SELECT_LIST; + String sql = String.format(sqlMethod.getSql(), this.sqlFirst(), this.sqlSelectColumns(tableInfo, true), + tableInfo.getTableName(), this.sqlWhereEntityWrapper(true, tableInfo), this.sqlOrderBy(tableInfo), + this.sqlComment()); + SqlSource sqlSource = this.languageDriver.createSqlSource(this.configuration, sql, modelClass); + return this.addSelectMappedStatementForTable(mapperClass, sqlSource, tableInfo); + } + +} diff --git a/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/datascope/SelectPageByScope.java b/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/datascope/SelectPageByScope.java new file mode 100644 index 0000000..c0d6c38 --- /dev/null +++ b/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/datascope/SelectPageByScope.java @@ -0,0 +1,29 @@ +package com.pig4cloud.pigx.common.data.datascope; + +import com.baomidou.mybatisplus.core.enums.SqlMethod; +import com.baomidou.mybatisplus.core.injector.AbstractMethod; +import com.baomidou.mybatisplus.core.metadata.TableInfo; +import org.apache.ibatis.mapping.MappedStatement; +import org.apache.ibatis.mapping.SqlSource; + +/** + * @author lengleng + * @date 2020/4/26 + */ +public class SelectPageByScope extends AbstractMethod { + + public SelectPageByScope() { + super("selectPageByScope"); + } + + @Override + public MappedStatement injectMappedStatement(Class mapperClass, Class modelClass, TableInfo tableInfo) { + SqlMethod sqlMethod = SqlMethod.SELECT_PAGE; + String sql = String.format(sqlMethod.getSql(), this.sqlFirst(), this.sqlSelectColumns(tableInfo, true), + tableInfo.getTableName(), this.sqlWhereEntityWrapper(true, tableInfo), this.sqlOrderBy(tableInfo), + this.sqlComment()); + SqlSource sqlSource = this.languageDriver.createSqlSource(this.configuration, sql, modelClass); + return this.addSelectMappedStatementForTable(mapperClass, sqlSource, tableInfo); + } + +} diff --git a/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/handler/JsonLongArrayTypeHandler.java b/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/handler/JsonLongArrayTypeHandler.java new file mode 100644 index 0000000..c810400 --- /dev/null +++ b/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/handler/JsonLongArrayTypeHandler.java @@ -0,0 +1,56 @@ +package com.pig4cloud.pigx.common.data.handler; + +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.StrUtil; +import lombok.SneakyThrows; +import org.apache.ibatis.type.BaseTypeHandler; +import org.apache.ibatis.type.JdbcType; +import org.apache.ibatis.type.MappedJdbcTypes; +import org.apache.ibatis.type.MappedTypes; + +import java.sql.CallableStatement; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; + +/** + * Mybatis数组,符串互转 + *

+ * MappedJdbcTypes 数据库中的数据类型 MappedTypes java中的的数据类型 + * + * @author xuzihui + * @date 2019-11-20 + */ +@MappedTypes(value = { Long[].class }) +@MappedJdbcTypes(value = JdbcType.VARCHAR) +public class JsonLongArrayTypeHandler extends BaseTypeHandler { + + @Override + public void setNonNullParameter(PreparedStatement ps, int i, Long[] parameter, JdbcType jdbcType) + throws SQLException { + ps.setString(i, ArrayUtil.join(parameter, StrUtil.COMMA)); + } + + @Override + @SneakyThrows + public Long[] getNullableResult(ResultSet rs, String columnName) { + String reString = rs.getString(columnName); + return Convert.toLongArray(reString); + } + + @Override + @SneakyThrows + public Long[] getNullableResult(ResultSet rs, int columnIndex) { + String reString = rs.getString(columnIndex); + return Convert.toLongArray(reString); + } + + @Override + @SneakyThrows + public Long[] getNullableResult(CallableStatement cs, int columnIndex) { + String reString = cs.getString(columnIndex); + return Convert.toLongArray(reString); + } + +} diff --git a/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/handler/JsonStringArrayTypeHandler.java b/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/handler/JsonStringArrayTypeHandler.java new file mode 100644 index 0000000..21a17a7 --- /dev/null +++ b/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/handler/JsonStringArrayTypeHandler.java @@ -0,0 +1,56 @@ +package com.pig4cloud.pigx.common.data.handler; + +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.StrUtil; +import lombok.SneakyThrows; +import org.apache.ibatis.type.BaseTypeHandler; +import org.apache.ibatis.type.JdbcType; +import org.apache.ibatis.type.MappedJdbcTypes; +import org.apache.ibatis.type.MappedTypes; + +import java.sql.CallableStatement; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; + +/** + * Mybatis数组,符串互转 + *

+ * MappedJdbcTypes 数据库中的数据类型 MappedTypes java中的的数据类型 + * + * @author xuzihui + * @date 2019-11-20 + */ +@MappedTypes(value = { String[].class }) +@MappedJdbcTypes(value = JdbcType.VARCHAR) +public class JsonStringArrayTypeHandler extends BaseTypeHandler { + + @Override + public void setNonNullParameter(PreparedStatement ps, int i, String[] parameter, JdbcType jdbcType) + throws SQLException { + ps.setString(i, ArrayUtil.join(parameter, StrUtil.COMMA)); + } + + @Override + @SneakyThrows + public String[] getNullableResult(ResultSet rs, String columnName) { + String reString = rs.getString(columnName); + return Convert.toStrArray(reString); + } + + @Override + @SneakyThrows + public String[] getNullableResult(ResultSet rs, int columnIndex) { + String reString = rs.getString(columnIndex); + return Convert.toStrArray(reString); + } + + @Override + @SneakyThrows + public String[] getNullableResult(CallableStatement cs, int columnIndex) { + String reString = cs.getString(columnIndex); + return Convert.toStrArray(reString); + } + +} diff --git a/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/mybatis/DruidSqlLogFilter.java b/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/mybatis/DruidSqlLogFilter.java new file mode 100644 index 0000000..35cb269 --- /dev/null +++ b/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/mybatis/DruidSqlLogFilter.java @@ -0,0 +1,202 @@ +/* + * Copyright (c) 2019-2029, Dreamlu 卢春梦 (596392912@qq.com & www.dreamlu.net). + *

+ * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE 3.0; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.gnu.org/licenses/lgpl.html + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.pig4cloud.pigx.common.data.mybatis; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.druid.DbType; +import com.alibaba.druid.filter.FilterChain; +import com.alibaba.druid.filter.FilterEventAdapter; +import com.alibaba.druid.proxy.jdbc.JdbcParameter; +import com.alibaba.druid.proxy.jdbc.ResultSetProxy; +import com.alibaba.druid.proxy.jdbc.StatementProxy; +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.visitor.SchemaStatVisitor; +import com.alibaba.druid.stat.TableStat; +import com.alibaba.druid.util.StringUtils; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +import java.sql.SQLException; +import java.time.temporal.TemporalAccessor; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 打印可执行的 sql 日志 + * + *

+ * 参考:https://jfinal.com/share/2204 + *

+ * + * @author L.cm + */ +@Slf4j +@RequiredArgsConstructor +public class DruidSqlLogFilter extends FilterEventAdapter { + + private static final SQLUtils.FormatOption FORMAT_OPTION = new SQLUtils.FormatOption(false, false); + + private final PigxMybatisProperties properties; + + @Override + protected void statementExecuteBefore(StatementProxy statement, String sql) { + statement.setLastExecuteStartNano(); + } + + @Override + protected void statementExecuteBatchBefore(StatementProxy statement) { + statement.setLastExecuteStartNano(); + } + + @Override + protected void statementExecuteUpdateBefore(StatementProxy statement, String sql) { + statement.setLastExecuteStartNano(); + } + + @Override + protected void statementExecuteQueryBefore(StatementProxy statement, String sql) { + statement.setLastExecuteStartNano(); + } + + @Override + protected void statementExecuteAfter(StatementProxy statement, String sql, boolean firstResult) { + statement.setLastExecuteTimeNano(); + } + + @Override + protected void statementExecuteBatchAfter(StatementProxy statement, int[] result) { + statement.setLastExecuteTimeNano(); + } + + @Override + protected void statementExecuteQueryAfter(StatementProxy statement, String sql, ResultSetProxy resultSet) { + statement.setLastExecuteTimeNano(); + } + + @Override + protected void statementExecuteUpdateAfter(StatementProxy statement, String sql, int updateCount) { + statement.setLastExecuteTimeNano(); + } + + @Override + public void statement_close(FilterChain chain, StatementProxy statement) throws SQLException { + // 先调用父类关闭 statement + super.statement_close(chain, statement); + // 支持动态开启 + if (!properties.isShowSql()) { + return; + } + + // 是否开启调试 + if (!log.isInfoEnabled()) { + return; + } + + // 打印可执行的 sql + String sql = statement.getBatchSql(); + // sql 为空直接返回 + if (StringUtils.isEmpty(sql)) { + return; + } + + String dbType = statement.getConnectionProxy().getDirectDataSource().getDbType(); + + // 判断表名是配置了匹配过滤 + if (CollUtil.isNotEmpty(properties.getSkipTable())) { + List skipTableList = properties.getSkipTable(); + + List tableNameList = getTablesBydruid(sql, dbType); + if (tableNameList.stream().anyMatch(tableName -> StrUtil.containsAnyIgnoreCase(tableName, + ArrayUtil.toArray(skipTableList, String.class)))) { + return; + } + } + + int parametersSize = statement.getParametersSize(); + List parameters = new ArrayList<>(parametersSize); + for (int i = 0; i < parametersSize; ++i) { + // 转换参数,处理 java8 时间 + parameters.add(getJdbcParameter(statement.getParameter(i))); + } + String formattedSql = SQLUtils.format(sql, DbType.of(dbType), parameters, FORMAT_OPTION); + printSql(formattedSql, statement); + } + + private static Object getJdbcParameter(JdbcParameter jdbcParam) { + if (jdbcParam == null) { + return null; + } + Object value = jdbcParam.getValue(); + // 处理 java8 时间 + if (value instanceof TemporalAccessor) { + return value.toString(); + } + return value; + } + + private static void printSql(String sql, StatementProxy statement) { + // 打印 sql + String sqlLogger = "\n\n======= Sql Logger ======================" + "\n{}" + + "\n======= Sql Execute Time: {} =======\n"; + log.info(sqlLogger, sql.trim(), format(statement.getLastExecuteTimeNano())); + } + + /** + * 格式化执行时间,单位为 ms 和 s,保留三位小数 + * @param nanos 纳秒 + * @return 格式化后的时间 + */ + private static String format(long nanos) { + if (nanos < 1) { + return "0ms"; + } + double millis = (double) nanos / (1000 * 1000); + // 不够 1 ms,最小单位为 ms + if (millis > 1000) { + return String.format("%.3fs", millis / 1000); + } + else { + return String.format("%.3fms", millis); + } + } + + /** + * 从SQL中提取表名(sql中出现的所有表) + * @param sql sql语句 + * @param dbType dbType + * @return List + */ + public static List getTablesBydruid(String sql, String dbType) { + List result = new ArrayList(); + List stmtList = SQLUtils.parseStatements(sql, dbType); + for (SQLStatement stmt : stmtList) { + // 也可以用更精确的解析器,如MySqlSchemaStatVisitor + SchemaStatVisitor visitor = new SchemaStatVisitor(); + stmt.accept(visitor); + Map tables = visitor.getTables(); + for (TableStat.Name name : tables.keySet()) { + result.add(name.getName()); + } + } + return result; + } + +} diff --git a/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/mybatis/MybatisPlusConfiguration.java b/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/mybatis/MybatisPlusConfiguration.java new file mode 100644 index 0000000..c0c8e9f --- /dev/null +++ b/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/mybatis/MybatisPlusConfiguration.java @@ -0,0 +1,156 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.common.data.mybatis; + +import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; +import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor; +import com.pig4cloud.pigx.admin.api.feign.RemoteDataScopeService; +import com.pig4cloud.pigx.common.data.datascope.DataScopeInnerInterceptor; +import com.pig4cloud.pigx.common.data.datascope.DataScopeInterceptor; +import com.pig4cloud.pigx.common.data.datascope.DataScopeSqlInjector; +import com.pig4cloud.pigx.common.data.datascope.PigxDefaultDatascopeHandle; +import com.pig4cloud.pigx.common.data.resolver.SqlFilterArgumentResolver; +import com.pig4cloud.pigx.common.data.tenant.PigxTenantConfigProperties; +import com.pig4cloud.pigx.common.data.tenant.PigxTenantHandler; +import com.pig4cloud.pigx.common.security.service.PigxUser; +import org.apache.ibatis.mapping.DatabaseIdProvider; +import org.apache.ibatis.mapping.VendorDatabaseIdProvider; +import org.springframework.boot.autoconfigure.AutoConfigureAfter; +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import org.springframework.web.method.support.HandlerMethodArgumentResolver; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +import javax.sql.DataSource; +import java.util.List; +import java.util.Properties; + +/** + * @author lengleng + * @date 2020-02-08 + */ +@Configuration +@ConditionalOnBean(DataSource.class) +@AutoConfigureAfter(DataSourceAutoConfiguration.class) +@EnableConfigurationProperties(PigxMybatisProperties.class) +public class MybatisPlusConfiguration implements WebMvcConfigurer { + + /** + * 增加请求参数解析器,对请求中的参数注入SQL 检查 + * @param resolverList + */ + @Override + public void addArgumentResolvers(List resolverList) { + resolverList.add(new SqlFilterArgumentResolver()); + } + + /** + * mybatis plus 拦截器配置 + * @return PigxDefaultDatascopeHandle + */ + @Bean + public MybatisPlusInterceptor mybatisPlusInterceptor(TenantLineInnerInterceptor tenantLineInnerInterceptor, + DataScopeInterceptor dataScopeInterceptor) { + MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); + // 注入多租户支持 + interceptor.addInnerInterceptor(tenantLineInnerInterceptor); + // 数据权限 + interceptor.addInnerInterceptor(dataScopeInterceptor); + // 分页支持 + PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor(); + paginationInnerInterceptor.setMaxLimit(1000L); + interceptor.addInnerInterceptor(paginationInnerInterceptor); + return interceptor; + } + + /** + * 创建租户维护处理器对象 + * @return 处理后的租户维护处理器 + */ + @Bean + @ConditionalOnMissingBean + public TenantLineInnerInterceptor tenantLineInnerInterceptor(PigxTenantConfigProperties tenantConfigProperties) { + TenantLineInnerInterceptor tenantLineInnerInterceptor = new TenantLineInnerInterceptor(); + tenantLineInnerInterceptor.setTenantLineHandler(new PigxTenantHandler(tenantConfigProperties)); + return tenantLineInnerInterceptor; + } + + /** + * 数据权限拦截器 + * @return DataScopeInterceptor + */ + @Bean + @ConditionalOnMissingBean + @ConditionalOnClass(PigxUser.class) + public DataScopeInterceptor dataScopeInterceptor(RemoteDataScopeService dataScopeService) { + DataScopeInnerInterceptor dataScopeInnerInterceptor = new DataScopeInnerInterceptor(); + dataScopeInnerInterceptor.setDataScopeHandle(new PigxDefaultDatascopeHandle(dataScopeService)); + return dataScopeInnerInterceptor; + } + + /** + * 扩展 mybatis-plus baseMapper 支持数据权限 + * @return + */ + @Bean + @Primary + @ConditionalOnBean(DataScopeInterceptor.class) + public DataScopeSqlInjector dataScopeSqlInjector() { + return new DataScopeSqlInjector(); + } + + /** + * SQL 日志格式化 + * @return DruidSqlLogFilter + */ + @Bean + public DruidSqlLogFilter sqlLogFilter(PigxMybatisProperties properties) { + return new DruidSqlLogFilter(properties); + } + + /** + * 审计字段自动填充 + * @return {@link MetaObjectHandler} + */ + @Bean + public MybatisPlusMetaObjectHandler mybatisPlusMetaObjectHandler() { + return new MybatisPlusMetaObjectHandler(); + } + + /** + * 数据库方言配置 + * @return + */ + @Bean + public DatabaseIdProvider databaseIdProvider() { + VendorDatabaseIdProvider databaseIdProvider = new VendorDatabaseIdProvider(); + Properties properties = new Properties(); + properties.setProperty("SQL Server", "mssql"); + databaseIdProvider.setProperties(properties); + return databaseIdProvider; + } + +} diff --git a/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/mybatis/MybatisPlusMetaObjectHandler.java b/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/mybatis/MybatisPlusMetaObjectHandler.java new file mode 100644 index 0000000..f4fecc3 --- /dev/null +++ b/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/mybatis/MybatisPlusMetaObjectHandler.java @@ -0,0 +1,94 @@ +package com.pig4cloud.pigx.common.data.mybatis; + +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; +import com.pig4cloud.pigx.common.core.constant.CommonConstants; +import lombok.extern.slf4j.Slf4j; +import org.apache.ibatis.reflection.MetaObject; +import org.springframework.security.authentication.AnonymousAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.util.ClassUtils; + +import java.nio.charset.Charset; +import java.time.LocalDateTime; +import java.util.Optional; + +/** + * MybatisPlus 自动填充配置 + * + * @author L.cm + */ +@Slf4j +public class MybatisPlusMetaObjectHandler implements MetaObjectHandler { + + @Override + public void insertFill(MetaObject metaObject) { + log.debug("mybatis plus start insert fill ...."); + LocalDateTime now = LocalDateTime.now(); + + // 审计字段自动填充,覆盖用户输入 + fillValIfNullByName("createTime", now, metaObject, true); + fillValIfNullByName("updateTime", now, metaObject, true); + fillValIfNullByName("createBy", getUserName(), metaObject, true); + fillValIfNullByName("updateBy", getUserName(), metaObject, true); + + // 删除标记自动填充 + fillValIfNullByName("delFlag", CommonConstants.STATUS_NORMAL, metaObject, true); + } + + @Override + public void updateFill(MetaObject metaObject) { + log.debug("mybatis plus start update fill ...."); + fillValIfNullByName("updateTime", LocalDateTime.now(), metaObject, true); + fillValIfNullByName("updateBy", getUserName(), metaObject, true); + } + + /** + * 填充值,先判断是否有手动设置,优先手动设置的值,例如:job必须手动设置 + * @param fieldName 属性名 + * @param fieldVal 属性值 + * @param metaObject MetaObject + * @param isCover 是否覆盖原有值,避免更新操作手动入参 + */ + private static void fillValIfNullByName(String fieldName, Object fieldVal, MetaObject metaObject, boolean isCover) { + // 0. 如果填充值为空 + if (fieldVal == null) { + return; + } + // 1. 没有 get 方法 + if (!metaObject.hasSetter(fieldName)) { + return; + } + // 2. 如果用户有手动设置的值 + Object userSetValue = metaObject.getValue(fieldName); + String setValueStr = StrUtil.str(userSetValue, Charset.defaultCharset()); + if (StrUtil.isNotBlank(setValueStr) && !isCover) { + return; + } + // 3. field 类型相同时设置 + Class getterType = metaObject.getGetterType(fieldName); + if (ClassUtils.isAssignableValue(getterType, fieldVal)) { + metaObject.setValue(fieldName, fieldVal); + } + } + + /** + * 获取 spring security 当前的用户名 + * @return 当前用户名 + */ + private String getUserName() { + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + // 匿名接口直接返回 + if (authentication instanceof AnonymousAuthenticationToken) { + return null; + } + + if (Optional.ofNullable(authentication).isPresent()) { + return authentication.getName(); + } + + return null; + } + +} diff --git a/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/mybatis/PigxMybatisProperties.java b/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/mybatis/PigxMybatisProperties.java new file mode 100644 index 0000000..8077842 --- /dev/null +++ b/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/mybatis/PigxMybatisProperties.java @@ -0,0 +1,31 @@ +package com.pig4cloud.pigx.common.data.mybatis; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.cloud.context.config.annotation.RefreshScope; + +import java.util.ArrayList; +import java.util.List; + +/** + * Mybatis 配置 + * + * @author lengleng + * @date 2021/6/3 + */ +@Data +@RefreshScope +@ConfigurationProperties("pigx.mybatis") +public class PigxMybatisProperties { + + /** + * 是否打印可执行 sql + */ + private boolean showSql = true; + + /** + * 跳过表 + */ + private List skipTable = new ArrayList<>(); + +} diff --git a/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/resolver/DictResolver.java b/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/resolver/DictResolver.java new file mode 100644 index 0000000..9c04d55 --- /dev/null +++ b/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/resolver/DictResolver.java @@ -0,0 +1,99 @@ +package com.pig4cloud.pigx.common.data.resolver; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.baomidou.mybatisplus.core.toolkit.StringPool; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import com.pig4cloud.pigx.admin.api.entity.SysDictItem; +import com.pig4cloud.pigx.admin.api.feign.RemoteDictService; +import com.pig4cloud.pigx.common.core.util.SpringContextHolder; +import lombok.experimental.UtilityClass; + +import java.util.List; + +/** + * @author fxz + * @date 2022/3/24 字典解析器 + */ +@UtilityClass +public class DictResolver { + + /** + * 根据字典类型获取所有字典项 + * @param type 字典类型 + * @return 字典数据项集合 + */ + public List getDictItemsByType(String type) { + Assert.isTrue(StringUtils.isNotBlank(type), "参数不合法"); + + RemoteDictService remoteDictService = SpringContextHolder.getBean(RemoteDictService.class); + + return remoteDictService.getDictByType(type).getData(); + } + + /** + * 根据字典类型以及字典项字典值获取字典标签 + * @param type 字典类型 + * @param itemValue 字典项字典值 + * @return 字典项标签值 + */ + public String getDictItemLabel(String type, String itemValue) { + Assert.isTrue(StringUtils.isNotBlank(type) && StringUtils.isNotBlank(itemValue), "参数不合法"); + + SysDictItem sysDictItem = getDictItemByItemValue(type, itemValue); + + return ObjectUtils.isNotEmpty(sysDictItem) ? sysDictItem.getLabel() : StringPool.EMPTY; + } + + /** + * 根据字典类型以及字典标签获取字典值 + * @param type 字典类型 + * @param itemLabel 字典数据标签 + * @return 字典数据项值 + */ + public String getDictItemValue(String type, String itemLabel) { + Assert.isTrue(StringUtils.isNotBlank(type) && StringUtils.isNotBlank(itemLabel), "参数不合法"); + + SysDictItem sysDictItem = getDictItemByItemLabel(type, itemLabel); + + return ObjectUtils.isNotEmpty(sysDictItem) ? sysDictItem.getItemValue() : StringPool.EMPTY; + } + + /** + * 根据字典类型以及字典值获取字典项 + * @param type 字典类型 + * @param itemValue 字典数据值 + * @return 字典数据项 + */ + public SysDictItem getDictItemByItemValue(String type, String itemValue) { + Assert.isTrue(StringUtils.isNotBlank(type) && StringUtils.isNotBlank(itemValue), "参数不合法"); + + List dictItemList = getDictItemsByType(type); + + if (CollectionUtils.isNotEmpty(dictItemList)) { + return dictItemList.stream().filter(item -> itemValue.equals(item.getItemValue())).findFirst().orElse(null); + } + + return null; + } + + /** + * 根据字典类型以及字典标签获取字典项 + * @param type 字典类型 + * @param itemLabel 字典数据项标签 + * @return 字典数据项 + */ + public SysDictItem getDictItemByItemLabel(String type, String itemLabel) { + Assert.isTrue(StringUtils.isNotBlank(type) && StringUtils.isNotBlank(itemLabel), "参数不合法"); + + List dictItemList = getDictItemsByType(type); + + if (CollectionUtils.isNotEmpty(dictItemList)) { + return dictItemList.stream().filter(item -> itemLabel.equals(item.getLabel())).findFirst().orElse(null); + } + + return null; + } + +} diff --git a/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/resolver/ParamResolver.java b/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/resolver/ParamResolver.java new file mode 100644 index 0000000..a380608 --- /dev/null +++ b/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/resolver/ParamResolver.java @@ -0,0 +1,78 @@ +package com.pig4cloud.pigx.common.data.resolver; + +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.StrUtil; +import com.pig4cloud.pigx.admin.api.feign.RemoteParamService; +import com.pig4cloud.pigx.common.core.constant.SecurityConstants; +import com.pig4cloud.pigx.common.core.util.SpringContextHolder; +import lombok.experimental.UtilityClass; + +import java.util.Map; +import java.util.Objects; + +/** + * @author lengleng + * @date 2020/5/12 + *

+ * 系统参数配置解析器 + */ +@UtilityClass +public class ParamResolver { + + /** + * 根据多个key 查询value 配置 结果使用hutool 的maputil 进行包装处理 MapUtil.getBool(result,key) + * @param key key + * @return Map + */ + public Map getMap(String... key) { + // 校验入参是否合法 + if (Objects.isNull(key)) { + throw new IllegalArgumentException("参数不合法"); + } + + RemoteParamService remoteParamService = SpringContextHolder.getBean(RemoteParamService.class); + return remoteParamService.getByKeys(key, SecurityConstants.FROM_IN).getData(); + } + + /** + * 根据key 查询value 配置 + * @param key key + * @param defaultVal 默认值 + * @return value + */ + public Long getLong(String key, Long... defaultVal) { + return checkAndGet(key, Long.class, defaultVal); + } + + /** + * 根据key 查询value 配置 + * @param key key + * @param defaultVal 默认值 + * @return value + */ + public String getStr(String key, String... defaultVal) { + return checkAndGet(key, String.class, defaultVal); + } + + private T checkAndGet(String key, Class clazz, T... defaultVal) { + // 校验入参是否合法 + if (StrUtil.isBlank(key) || defaultVal.length > 1) { + throw new IllegalArgumentException("参数不合法"); + } + + RemoteParamService remoteParamService = SpringContextHolder.getBean(RemoteParamService.class); + + String result = remoteParamService.getByKey(key, SecurityConstants.FROM_IN).getData(); + + if (StrUtil.isNotBlank(result)) { + return Convert.convert(clazz, result); + } + + if (defaultVal.length == 1) { + return Convert.convert(clazz, defaultVal.clone()[0]); + + } + return null; + } + +} diff --git a/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/resolver/SqlFilterArgumentResolver.java b/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/resolver/SqlFilterArgumentResolver.java new file mode 100644 index 0000000..8453125 --- /dev/null +++ b/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/resolver/SqlFilterArgumentResolver.java @@ -0,0 +1,114 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.common.data.resolver; + +import cn.hutool.core.comparator.CompareUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.metadata.OrderItem; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.pig4cloud.pigx.common.core.exception.CheckedException; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.MethodParameter; +import org.springframework.web.bind.support.WebDataBinderFactory; +import org.springframework.web.context.request.NativeWebRequest; +import org.springframework.web.method.support.HandlerMethodArgumentResolver; +import org.springframework.web.method.support.ModelAndViewContainer; + +import javax.servlet.http.HttpServletRequest; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Optional; +import java.util.function.Predicate; +import java.util.stream.Collectors; + +/** + * @author lengleng + * @date 2019-06-24 + *

+ * 解决Mybatis Plus Order By SQL注入问题 + */ +@Slf4j +public class SqlFilterArgumentResolver implements HandlerMethodArgumentResolver { + + private final static String[] KEYWORDS = { "master", "truncate", "insert", "select", "delete", "update", "declare", + "alter", "drop", "sleep", "extractvalue", "concat" }; + + /** + * 判断Controller是否包含page 参数 + * @param parameter 参数 + * @return 是否过滤 + */ + @Override + public boolean supportsParameter(MethodParameter parameter) { + return parameter.getParameterType().equals(Page.class); + } + + /** + * @param parameter 入参集合 + * @param mavContainer model 和 view + * @param webRequest web相关 + * @param binderFactory 入参解析 + * @return 检查后新的page对象 + *

+ * page 只支持查询 GET .如需解析POST获取请求报文体处理 + */ + @Override + public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, + NativeWebRequest webRequest, WebDataBinderFactory binderFactory) { + + HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class); + + String ascs = request.getParameter("ascs"); + String descs = request.getParameter("descs"); + + String current = request.getParameter("current"); + String size = request.getParameter("size"); + + Page page = new Page(); + if (StrUtil.isNotBlank(current)) { + // 如果current page 小于零 视为不合法数据 + if (CompareUtil.compare(Long.parseLong(current), 0L) < 0) { + throw new CheckedException("current page error"); + } + page.setCurrent(Long.parseLong(current)); + } + + if (StrUtil.isNotBlank(size)) { + page.setSize(Long.parseLong(size)); + } + + List orderItemList = new ArrayList<>(); + Optional.ofNullable(ascs).ifPresent(s -> orderItemList.addAll(Arrays.stream(s.split(StrUtil.COMMA)) + .filter(sqlInjectPredicate()).map(OrderItem::asc).collect(Collectors.toList()))); + Optional.ofNullable(descs).ifPresent(s -> orderItemList.addAll(Arrays.stream(s.split(StrUtil.COMMA)) + .filter(sqlInjectPredicate()).map(OrderItem::desc).collect(Collectors.toList()))); + page.addOrder(orderItemList); + + return page; + } + + /** + * 判断用户输入里面有没有关键字 + * @return Predicate + */ + private Predicate sqlInjectPredicate() { + return sql -> Arrays.stream(KEYWORDS).noneMatch(keyword -> StrUtil.containsIgnoreCase(sql, keyword)); + } + +} diff --git a/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/resolver/TenantKeyStrResolver.java b/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/resolver/TenantKeyStrResolver.java new file mode 100644 index 0000000..3138945 --- /dev/null +++ b/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/resolver/TenantKeyStrResolver.java @@ -0,0 +1,34 @@ +package com.pig4cloud.pigx.common.data.resolver; + +import com.pig4cloud.pigx.common.core.util.KeyStrResolver; +import com.pig4cloud.pigx.common.data.tenant.TenantContextHolder; + +/** + * @author lengleng + * @date 2020/9/29 + *

+ * 租户字符串处理(方便其他模块获取) + */ +public class TenantKeyStrResolver implements KeyStrResolver { + + /** + * 传入字符串增加 租户编号:in + * @param in 输入字符串 + * @param split 分割符 + * @return + */ + @Override + public String extract(String in, String split) { + return TenantContextHolder.getTenantId() + split + in; + } + + /** + * 返回当前租户ID + * @return + */ + @Override + public String key() { + return String.valueOf(TenantContextHolder.getTenantId()); + } + +} diff --git a/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/tenant/PigxFeignTenantInterceptor.java b/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/tenant/PigxFeignTenantInterceptor.java new file mode 100644 index 0000000..87c9d13 --- /dev/null +++ b/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/tenant/PigxFeignTenantInterceptor.java @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.common.data.tenant; + +import com.pig4cloud.pigx.common.core.constant.CommonConstants; +import feign.RequestInterceptor; +import feign.RequestTemplate; +import lombok.extern.slf4j.Slf4j; + +/** + * @author lengleng + * @date 2018/9/14 + */ +@Slf4j +public class PigxFeignTenantInterceptor implements RequestInterceptor { + + @Override + public void apply(RequestTemplate requestTemplate) { + if (TenantContextHolder.getTenantId() == null) { + log.debug("TTL 中的 租户ID为空,feign拦截器 >> 跳过"); + return; + } + requestTemplate.header(CommonConstants.TENANT_ID, TenantContextHolder.getTenantId().toString()); + } + +} diff --git a/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/tenant/PigxTenantConfigProperties.java b/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/tenant/PigxTenantConfigProperties.java new file mode 100644 index 0000000..157b842 --- /dev/null +++ b/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/tenant/PigxTenantConfigProperties.java @@ -0,0 +1,32 @@ +package com.pig4cloud.pigx.common.data.tenant; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.context.annotation.Configuration; + +import java.util.ArrayList; +import java.util.List; + +/** + * 多租户配置 + * + * @author oathsign + */ +@Data +@RefreshScope +@Configuration +@ConfigurationProperties(prefix = "pigx.tenant") +public class PigxTenantConfigProperties { + + /** + * 维护租户列名称 + */ + private String column = "tenant_id"; + + /** + * 多租户的数据表集合 + */ + private List tables = new ArrayList<>(); + +} diff --git a/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/tenant/PigxTenantConfiguration.java b/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/tenant/PigxTenantConfiguration.java new file mode 100644 index 0000000..e5b3ee9 --- /dev/null +++ b/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/tenant/PigxTenantConfiguration.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.common.data.tenant; + +import feign.RequestInterceptor; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.client.ClientHttpRequestInterceptor; + +/** + * @author lengleng + * @date 2020/4/29 + *

+ * 租户信息拦截 + */ +@Configuration +public class PigxTenantConfiguration { + + @Bean + public RequestInterceptor pigxFeignTenantInterceptor() { + return new PigxFeignTenantInterceptor(); + } + + @Bean + public ClientHttpRequestInterceptor pigxTenantRequestInterceptor() { + return new TenantRequestInterceptor(); + } + +} diff --git a/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/tenant/PigxTenantHandler.java b/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/tenant/PigxTenantHandler.java new file mode 100644 index 0000000..2e2c21a --- /dev/null +++ b/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/tenant/PigxTenantHandler.java @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.common.data.tenant; + +import com.baomidou.mybatisplus.extension.plugins.handler.TenantLineHandler; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import net.sf.jsqlparser.expression.Expression; +import net.sf.jsqlparser.expression.LongValue; +import net.sf.jsqlparser.expression.NullValue; + +/** + * @author lengleng + * @date 2018-12-26 + *

+ * 租户维护处理器 + */ +@Slf4j +@RequiredArgsConstructor +public class PigxTenantHandler implements TenantLineHandler { + + private final PigxTenantConfigProperties properties; + + /** + * 获取租户 ID 值表达式,只支持单个 ID 值 + *

+ * @return 租户 ID 值表达式 + */ + @Override + public Expression getTenantId() { + Long tenantId = TenantContextHolder.getTenantId(); + log.debug("当前租户为 >> {}", tenantId); + + if (tenantId == null) { + return new NullValue(); + } + return new LongValue(tenantId); + } + + /** + * 获取租户字段名 + * @return 租户字段名 + */ + @Override + public String getTenantIdColumn() { + return properties.getColumn(); + } + + /** + * 根据表名判断是否忽略拼接多租户条件 + *

+ * 默认都要进行解析并拼接多租户条件 + * @param tableName 表名 + * @return 是否忽略, true:表示忽略,false:需要解析并拼接多租户条件 + */ + @Override + public boolean ignoreTable(String tableName) { + // 判断是否跳过当前查询的租户过滤 + if (TenantContextHolder.getTenantSkip()) { + return Boolean.TRUE; + } + + Long tenantId = TenantContextHolder.getTenantId(); + // 租户中ID 为空,查询全部,不进行过滤 + if (tenantId == null) { + return Boolean.TRUE; + } + + return !properties.getTables().contains(tableName); + } + +} diff --git a/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/tenant/TenantBroker.java b/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/tenant/TenantBroker.java new file mode 100644 index 0000000..afeef6d --- /dev/null +++ b/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/tenant/TenantBroker.java @@ -0,0 +1,147 @@ +package com.pig4cloud.pigx.common.data.tenant; + +import lombok.experimental.UtilityClass; +import lombok.extern.slf4j.Slf4j; + +import java.util.function.Supplier; + +/** + * 租户运行时代理
+ * 这是一个工具类,用于切换租户运行时,保护租户ID上下文
+ * 下面这段代码演示问题所在

+ *     void methodA(){
+ *         // 因为某些特殊原因,需要手动指定租户
+ *         TenantContextHolder.setTenantId(1);
+ *         // do something ...
+ *     }
+ *     void methodB(){
+ *         // 因为某些特殊原因,需要手动指定租户
+ *         TenantContextHolder.setTenantId(2);
+ *         methodA();
+ *         // 此时租户ID已经变成 1
+ *         // do something ...
+ *     }
+ * 
嵌套设置租户ID会导致租户上下文难以维护,并且很难察觉,容易导致数据错乱。 推荐的写法:
+ *     void methodA(){
+ *         TenantBroker.RunAs(1,() -> {
+ *             // do something ...
+ *         });
+ *     }
+ *     void methodB(){
+ *         TenantBroker.RunAs(2,() -> {
+ *              methodA();
+ *             // do something ...
+ *         });
+ *     }
+ * 
+ * + * @author CJ (jclazz@outlook.com) + * @date 2020/6/12 + * @since 3.9 + */ +@Slf4j +@UtilityClass +public class TenantBroker { + + @FunctionalInterface + public interface RunAs { + + /** + * 执行业务逻辑 + * @param tenantId + * @throws Exception + */ + void run(T tenantId) throws Exception; + + } + + @FunctionalInterface + public interface ApplyAs { + + /** + * 执行业务逻辑,返回一个值 + * @param tenantId + * @return + * @throws Exception + */ + R apply(T tenantId) throws Exception; + + } + + /** + * 以某个租户的身份运行 + * @param tenant 租户ID + * @param func + */ + public void runAs(Long tenant, RunAs func) { + final Long pre = TenantContextHolder.getTenantId(); + try { + log.trace("TenantBroker 切换租户{} -> {}", pre, tenant); + TenantContextHolder.setTenantId(tenant); + func.run(tenant); + } + catch (Exception e) { + throw new TenantBrokerExceptionWrapper(e.getMessage(), e); + } + finally { + log.trace("TenantBroker 还原租户{} <- {}", pre, tenant); + TenantContextHolder.setTenantId(pre); + } + } + + /** + * 以某个租户的身份运行 + * @param tenant 租户ID + * @param func + * @param 返回数据类型 + * @return + */ + public T applyAs(Long tenant, ApplyAs func) { + final Long pre = TenantContextHolder.getTenantId(); + try { + log.trace("TenantBroker 切换租户{} -> {}", pre, tenant); + TenantContextHolder.setTenantId(tenant); + return func.apply(tenant); + } + catch (Exception e) { + throw new TenantBrokerExceptionWrapper(e.getMessage(), e); + } + finally { + log.trace("TenantBroker 还原租户{} <- {}", pre, tenant); + TenantContextHolder.setTenantId(pre); + } + } + + /** + * 以某个租户的身份运行 + * @param supplier + * @param func + */ + public void runAs(Supplier supplier, RunAs func) { + runAs(supplier.get(), func); + } + + /** + * 以某个租户的身份运行 + * @param supplier + * @param func + * @param 返回数据类型 + * @return + */ + public T applyAs(Supplier supplier, ApplyAs func) { + return applyAs(supplier.get(), func); + } + + public static class TenantBrokerExceptionWrapper extends RuntimeException { + + public TenantBrokerExceptionWrapper(String message, Throwable cause) { + super(message, cause); + } + + public TenantBrokerExceptionWrapper(Throwable cause) { + super(cause); + } + + } + +} diff --git a/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/tenant/TenantContextHolder.java b/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/tenant/TenantContextHolder.java new file mode 100644 index 0000000..11e4cc2 --- /dev/null +++ b/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/tenant/TenantContextHolder.java @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.common.data.tenant; + +import com.alibaba.ttl.TransmittableThreadLocal; +import lombok.experimental.UtilityClass; + +/** + * @author lengleng + * @date 2018/10/4 租户工具类 + */ +@UtilityClass +public class TenantContextHolder { + + private final ThreadLocal THREAD_LOCAL_TENANT = new TransmittableThreadLocal<>(); + + private final ThreadLocal THREAD_LOCAL_TENANT_SKIP_FLAG = new TransmittableThreadLocal<>(); + + /** + * TTL 设置租户ID
+ * 谨慎使用此方法,避免嵌套调用。尽量使用 {@code TenantBroker} + * @param tenantId + * @see TenantBroker + */ + public void setTenantId(Long tenantId) { + THREAD_LOCAL_TENANT.set(tenantId); + } + + /** + * 设置是否过滤的标识 + */ + public void setTenantSkip() { + THREAD_LOCAL_TENANT_SKIP_FLAG.set(Boolean.TRUE); + } + + /** + * 获取TTL中的租户ID + * @return + */ + public Long getTenantId() { + return THREAD_LOCAL_TENANT.get(); + } + + /** + * 获取是否跳过租户过滤的标识 + * @return + */ + public Boolean getTenantSkip() { + return THREAD_LOCAL_TENANT_SKIP_FLAG.get() != null && THREAD_LOCAL_TENANT_SKIP_FLAG.get(); + } + + public void clear() { + THREAD_LOCAL_TENANT.remove(); + THREAD_LOCAL_TENANT_SKIP_FLAG.remove(); + } + +} diff --git a/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/tenant/TenantContextHolderFilter.java b/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/tenant/TenantContextHolderFilter.java new file mode 100644 index 0000000..3cda55a --- /dev/null +++ b/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/tenant/TenantContextHolderFilter.java @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.common.data.tenant; + +import cn.hutool.core.util.StrUtil; +import com.pig4cloud.pigx.common.core.constant.CommonConstants; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; +import org.springframework.web.filter.GenericFilterBean; + +import javax.servlet.FilterChain; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * @author lengleng + * @date 2018/9/13 + */ +@Slf4j +@Component +@Order(Ordered.HIGHEST_PRECEDENCE) +public class TenantContextHolderFilter extends GenericFilterBean { + + private final static String UNDEFINED_STR = "undefined"; + + @Override + @SneakyThrows + public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) { + HttpServletRequest request = (HttpServletRequest) servletRequest; + HttpServletResponse response = (HttpServletResponse) servletResponse; + + String headerTenantId = request.getHeader(CommonConstants.TENANT_ID); + String paramTenantId = request.getParameter(CommonConstants.TENANT_ID); + + log.debug("获取header中的租户ID为:{}", headerTenantId); + + if (StrUtil.isNotBlank(headerTenantId) && !StrUtil.equals(UNDEFINED_STR, headerTenantId)) { + TenantContextHolder.setTenantId(Long.parseLong(headerTenantId)); + } + else if (StrUtil.isNotBlank(paramTenantId) && !StrUtil.equals(UNDEFINED_STR, paramTenantId)) { + TenantContextHolder.setTenantId(Long.parseLong(paramTenantId)); + } + else { + TenantContextHolder.setTenantId(CommonConstants.TENANT_ID_1); + } + + filterChain.doFilter(request, response); + TenantContextHolder.clear(); + } + +} diff --git a/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/tenant/TenantRequestInterceptor.java b/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/tenant/TenantRequestInterceptor.java new file mode 100644 index 0000000..bd3ff02 --- /dev/null +++ b/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/tenant/TenantRequestInterceptor.java @@ -0,0 +1,30 @@ +package com.pig4cloud.pigx.common.data.tenant; + +import com.pig4cloud.pigx.common.core.constant.CommonConstants; +import org.springframework.http.HttpRequest; +import org.springframework.http.client.ClientHttpRequestExecution; +import org.springframework.http.client.ClientHttpRequestInterceptor; +import org.springframework.http.client.ClientHttpResponse; + +import java.io.IOException; + +/** + * @author lengleng + * @date 2020/4/29 + *

+ * 传递 RestTemplate 请求的租户ID + */ +public class TenantRequestInterceptor implements ClientHttpRequestInterceptor { + + @Override + public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) + throws IOException { + + if (TenantContextHolder.getTenantId() != null) { + request.getHeaders().set(CommonConstants.TENANT_ID, String.valueOf(TenantContextHolder.getTenantId())); + } + + return execution.execute(request, body); + } + +} diff --git a/pigx-common/pigx-common-data/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/pigx-common/pigx-common-data/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 0000000..01ac2be --- /dev/null +++ b/pigx-common/pigx-common-data/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1,9 @@ +com.pig4cloud.pigx.common.data.cache.RedisTemplateConfiguration +com.pig4cloud.pigx.common.data.cache.RedisMessageConfiguration +com.pig4cloud.pigx.common.data.cache.RedisCacheManagerConfiguration +com.pig4cloud.pigx.common.data.cache.RedisCacheAutoConfiguration +com.pig4cloud.pigx.common.data.tenant.PigxTenantConfigProperties +com.pig4cloud.pigx.common.data.tenant.TenantContextHolderFilter +com.pig4cloud.pigx.common.data.tenant.PigxTenantConfiguration +com.pig4cloud.pigx.common.data.mybatis.MybatisPlusConfiguration +com.pig4cloud.pigx.common.data.resolver.TenantKeyStrResolver diff --git a/pigx-common/pigx-common-datasource/pom.xml b/pigx-common/pigx-common-datasource/pom.xml new file mode 100644 index 0000000..27fb91d --- /dev/null +++ b/pigx-common/pigx-common-datasource/pom.xml @@ -0,0 +1,41 @@ + + + + pigx-common + com.pig4cloud + 5.2.0 + + 4.0.0 + + com.pig4cloud + pigx-common-datasource + + jar + + pigx 动态切换数据源 + + + + com.pig4cloud + pigx-common-core + + + + com.baomidou + dynamic-datasource-spring-boot-starter + + + + com.alibaba + druid-spring-boot-starter + provided + + + + org.springframework + spring-webmvc + + + diff --git a/pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource/DynamicDataSourceAutoConfiguration.java b/pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource/DynamicDataSourceAutoConfiguration.java new file mode 100644 index 0000000..0345c36 --- /dev/null +++ b/pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource/DynamicDataSourceAutoConfiguration.java @@ -0,0 +1,109 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.common.datasource; + +import com.baomidou.dynamic.datasource.creator.DataSourceCreator; +import com.baomidou.dynamic.datasource.creator.DefaultDataSourceCreator; +import com.baomidou.dynamic.datasource.creator.druid.DruidDataSourceCreator; +import com.baomidou.dynamic.datasource.processor.DsHeaderProcessor; +import com.baomidou.dynamic.datasource.processor.DsProcessor; +import com.baomidou.dynamic.datasource.processor.DsSessionProcessor; +import com.baomidou.dynamic.datasource.processor.DsSpelExpressionProcessor; +import com.baomidou.dynamic.datasource.provider.DynamicDataSourceProvider; +import com.pig4cloud.pigx.common.datasource.config.*; +import lombok.RequiredArgsConstructor; +import org.jasypt.encryption.StringEncryptor; +import org.springframework.beans.factory.BeanFactory; +import org.springframework.boot.autoconfigure.AutoConfigureAfter; +import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; +import org.springframework.context.expression.BeanFactoryResolver; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author lengleng + * @date 2020-02-06 + *

+ * 动态数据源切换配置 + */ +@Configuration +@RequiredArgsConstructor +@Import(DynamicLogConfiguration.class) +@AutoConfigureAfter(DataSourceAutoConfiguration.class) +@EnableConfigurationProperties(DruidDataSourceProperties.class) +public class DynamicDataSourceAutoConfiguration { + + /** + * 获取动态数据源提供者 + * @param defaultDataSourceCreator 默认数据源创建器 + * @param stringEncryptor 字符串加密器 + * @param properties 数据源属性 + * @return 动态数据源提供者 + */ + @Bean + public DynamicDataSourceProvider dynamicDataSourceProvider(DefaultDataSourceCreator defaultDataSourceCreator, + StringEncryptor stringEncryptor, DruidDataSourceProperties properties) { + return new JdbcDynamicDataSourceProvider(defaultDataSourceCreator, stringEncryptor, properties); + } + + /** + * 获取默认数据源创建器 + * @param druidDataSourceCreator Druid数据源创建器 + * @return 默认数据源创建器 + */ + @Bean + public DefaultDataSourceCreator defaultDataSourceCreator(DruidDataSourceCreator druidDataSourceCreator) { + DefaultDataSourceCreator defaultDataSourceCreator = new DefaultDataSourceCreator(); + List creators = new ArrayList<>(); + creators.add(druidDataSourceCreator); + defaultDataSourceCreator.setCreators(creators); + return defaultDataSourceCreator; + } + + /** + * 获取数据源处理器 + * @return 数据源处理器 + */ + @Bean + public DsProcessor dsProcessor(BeanFactory beanFactory) { + DsProcessor lastParamDsProcessor = new LastParamDsProcessor(); + DsProcessor headerProcessor = new DsHeaderProcessor(); + DsProcessor sessionProcessor = new DsSessionProcessor(); + DsSpelExpressionProcessor spelExpressionProcessor = new DsSpelExpressionProcessor(); + spelExpressionProcessor.setBeanResolver(new BeanFactoryResolver(beanFactory)); + lastParamDsProcessor.setNextProcessor(headerProcessor); + headerProcessor.setNextProcessor(sessionProcessor); + sessionProcessor.setNextProcessor(spelExpressionProcessor); + return lastParamDsProcessor; + } + + /** + * 获取清除TTL数据源过滤器 + * @return 清除TTL数据源过滤器 + */ + @Bean + public ClearTtlDataSourceFilter clearTtlDsFilter() { + return new ClearTtlDataSourceFilter(); + } + +} diff --git a/pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource/annotation/EnableDynamicDataSource.java b/pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource/annotation/EnableDynamicDataSource.java new file mode 100644 index 0000000..62accc8 --- /dev/null +++ b/pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource/annotation/EnableDynamicDataSource.java @@ -0,0 +1,24 @@ +package com.pig4cloud.pigx.common.datasource.annotation; + +import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure; +import com.pig4cloud.pigx.common.datasource.DynamicDataSourceAutoConfiguration; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.context.annotation.Import; + +import java.lang.annotation.*; + +/** + * @author Lucky + * @date 2019-05-18 + *

+ * 开启动态数据源 + */ +@Target({ ElementType.TYPE }) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@Inherited +@EnableAutoConfiguration(exclude = { DruidDataSourceAutoConfigure.class }) +@Import(DynamicDataSourceAutoConfiguration.class) +public @interface EnableDynamicDataSource { + +} diff --git a/pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource/config/ClearTtlDataSourceFilter.java b/pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource/config/ClearTtlDataSourceFilter.java new file mode 100644 index 0000000..f023ca3 --- /dev/null +++ b/pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource/config/ClearTtlDataSourceFilter.java @@ -0,0 +1,34 @@ +package com.pig4cloud.pigx.common.datasource.config; + +import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder; +import org.springframework.core.Ordered; +import org.springframework.web.filter.GenericFilterBean; + +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import java.io.IOException; + +/** + * @author lengleng + * @date 2020/12/11 + *

+ * 清空上文的DS 设置避免污染当前线程 + */ +public class ClearTtlDataSourceFilter extends GenericFilterBean implements Ordered { + + @Override + public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) + throws IOException, ServletException { + DynamicDataSourceContextHolder.clear(); + filterChain.doFilter(servletRequest, servletResponse); + DynamicDataSourceContextHolder.clear(); + } + + @Override + public int getOrder() { + return Integer.MIN_VALUE; + } + +} diff --git a/pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource/config/DruidDataSourceProperties.java b/pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource/config/DruidDataSourceProperties.java new file mode 100644 index 0000000..5b107bd --- /dev/null +++ b/pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource/config/DruidDataSourceProperties.java @@ -0,0 +1,41 @@ +package com.pig4cloud.pigx.common.datasource.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; + +/** + * @author lengleng + * @date 2019-05-14 + *

+ * 参考DruidDataSourceWrapper + */ +@Data +@ConfigurationProperties("spring.datasource.druid") +public class DruidDataSourceProperties { + + /** + * 数据源用户名 + */ + private String username; + + /** + * 数据源密码 + */ + private String password; + + /** + * jdbcurl + */ + private String url; + + /** + * 数据源驱动 + */ + private String driverClassName; + + /** + * 查询数据源的SQL + */ + private String queryDsSql = "select * from gen_datasource_conf where del_flag = '0'"; + +} diff --git a/pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource/config/DynamicLogConfiguration.java b/pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource/config/DynamicLogConfiguration.java new file mode 100644 index 0000000..05ac518 --- /dev/null +++ b/pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource/config/DynamicLogConfiguration.java @@ -0,0 +1,17 @@ +package com.pig4cloud.pigx.common.datasource.config; + +import com.pig4cloud.pigx.common.core.factory.YamlPropertySourceFactory; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.context.annotation.PropertySource; + +/** + * @author lengleng + * @date 2022/8/8 + * + * 注入SQL 格式化的插件 + */ +@ConditionalOnClass(name = "com.pig4cloud.pigx.common.data.mybatis.DruidSqlLogFilter") +@PropertySource(value = "classpath:dynamic-ds-log.yaml", factory = YamlPropertySourceFactory.class) +public class DynamicLogConfiguration { + +} diff --git a/pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource/config/JdbcDynamicDataSourceProvider.java b/pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource/config/JdbcDynamicDataSourceProvider.java new file mode 100644 index 0000000..533a586 --- /dev/null +++ b/pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource/config/JdbcDynamicDataSourceProvider.java @@ -0,0 +1,108 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.common.datasource.config; + +import com.baomidou.dynamic.datasource.creator.DataSourceProperty; +import com.baomidou.dynamic.datasource.creator.DefaultDataSourceCreator; +import com.baomidou.dynamic.datasource.creator.druid.DruidConfig; +import com.baomidou.dynamic.datasource.provider.AbstractJdbcDataSourceProvider; +import com.pig4cloud.pigx.common.datasource.support.DataSourceConstants; +import com.pig4cloud.pigx.common.datasource.util.DsConfTypeEnum; +import com.pig4cloud.pigx.common.datasource.util.DsJdbcUrlEnum; +import org.jasypt.encryption.StringEncryptor; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.HashMap; +import java.util.Map; + +/** + * @author lengleng + * @date 2020/2/6 + *

+ * 从数据源中获取 配置信息 + */ +public class JdbcDynamicDataSourceProvider extends AbstractJdbcDataSourceProvider { + + private final DruidDataSourceProperties properties; + + private final StringEncryptor stringEncryptor; + + public JdbcDynamicDataSourceProvider(DefaultDataSourceCreator defaultDataSourceCreator, + StringEncryptor stringEncryptor, DruidDataSourceProperties properties) { + super(defaultDataSourceCreator, properties.getDriverClassName(), properties.getUrl(), properties.getUsername(), + properties.getPassword()); + this.stringEncryptor = stringEncryptor; + this.properties = properties; + } + + /** + * 执行语句获得数据源参数 + * @param statement 语句 + * @return 数据源参数 + * @throws SQLException sql异常 + */ + @Override + protected Map executeStmt(Statement statement) throws SQLException { + ResultSet rs = statement.executeQuery(properties.getQueryDsSql()); + + Map map = new HashMap<>(8); + while (rs.next()) { + String name = rs.getString(DataSourceConstants.NAME); + String username = rs.getString(DataSourceConstants.DS_USER_NAME); + String password = rs.getString(DataSourceConstants.DS_USER_PWD); + Integer confType = rs.getInt(DataSourceConstants.DS_CONFIG_TYPE); + String dsType = rs.getString(DataSourceConstants.DS_TYPE); + + DataSourceProperty property = new DataSourceProperty(); + property.setUsername(username); + property.setPassword(stringEncryptor.decrypt(password)); + + String url; + // JDBC 配置形式 + DsJdbcUrlEnum urlEnum = DsJdbcUrlEnum.get(dsType); + if (DsConfTypeEnum.JDBC.getType().equals(confType)) { + url = rs.getString(DataSourceConstants.DS_JDBC_URL); + } + else { + String host = rs.getString(DataSourceConstants.DS_HOST); + String port = rs.getString(DataSourceConstants.DS_PORT); + String dsName = rs.getString(DataSourceConstants.DS_NAME); + url = String.format(urlEnum.getUrl(), host, port, dsName); + } + + // Druid Config + DruidConfig druidConfig = new DruidConfig(); + druidConfig.setValidationQuery(urlEnum.getValidationQuery()); + property.setDruid(druidConfig); + property.setUrl(url); + + map.put(name, property); + } + + // 添加默认主数据源 + DataSourceProperty property = new DataSourceProperty(); + property.setUsername(properties.getUsername()); + property.setPassword(properties.getPassword()); + property.setUrl(properties.getUrl()); + map.put(DataSourceConstants.DS_MASTER, property); + return map; + } + +} diff --git a/pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource/config/LastParamDsProcessor.java b/pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource/config/LastParamDsProcessor.java new file mode 100644 index 0000000..26e8d51 --- /dev/null +++ b/pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource/config/LastParamDsProcessor.java @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.common.datasource.config; + +import com.baomidou.dynamic.datasource.processor.DsProcessor; +import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder; +import org.aopalliance.intercept.MethodInvocation; + +/** + * @author lengleng + * @date 2020/2/6 + *

+ * 参数数据源解析 @DS("#last) + */ +public class LastParamDsProcessor extends DsProcessor { + + private static final String LAST_PREFIX = "#last"; + + /** + * 抽象匹配条件 匹配才会走当前执行器否则走下一级执行器 + * @param key DS注解里的内容 + * @return 是否匹配 + */ + @Override + public boolean matches(String key) { + if (key.startsWith(LAST_PREFIX)) { + // https://github.com/baomidou/dynamic-datasource-spring-boot-starter/issues/213 + DynamicDataSourceContextHolder.clear(); + return true; + } + return false; + } + + /** + * 抽象最终决定数据源 + * @param invocation 方法执行信息 + * @param key DS注解里的内容 + * @return 数据源名称 + */ + @Override + public String doDetermineDatasource(MethodInvocation invocation, String key) { + Object[] arguments = invocation.getArguments(); + return String.valueOf(arguments[arguments.length - 1]); + } + +} diff --git a/pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource/support/DataSourceConstants.java b/pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource/support/DataSourceConstants.java new file mode 100644 index 0000000..851f279 --- /dev/null +++ b/pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource/support/DataSourceConstants.java @@ -0,0 +1,66 @@ +package com.pig4cloud.pigx.common.datasource.support; + +/** + * @author lengleng + * @date 2019-04-01 + *

+ * 数据源相关常量 + */ +public interface DataSourceConstants { + + /** + * 数据源名称 + */ + String NAME = "name"; + + /** + * 默认数据源(master) + */ + String DS_MASTER = "master"; + + /** + * jdbcurl + */ + String DS_JDBC_URL = "url"; + + /** + * 配置类型 + */ + String DS_CONFIG_TYPE = "conf_type"; + + /** + * 用户名 + */ + String DS_USER_NAME = "username"; + + /** + * 密码 + */ + String DS_USER_PWD = "password"; + + /** + * 数据库类型 + */ + String DS_TYPE = "ds_type"; + + /** + * 数据库名称 + */ + String DS_NAME = "ds_name"; + + /** + * 主机类型 + */ + String DS_HOST = "host"; + + /** + * 端口 + */ + String DS_PORT = "port"; + + /** + * 实例名称 + */ + String DS_INSTANCE = "instance"; + +} diff --git a/pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource/util/DsConfTypeEnum.java b/pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource/util/DsConfTypeEnum.java new file mode 100644 index 0000000..9d5eb26 --- /dev/null +++ b/pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource/util/DsConfTypeEnum.java @@ -0,0 +1,30 @@ +package com.pig4cloud.pigx.common.datasource.util; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @author lengleng + * @date 2020/12/11 + *

+ * 数据源配置类型 + */ +@Getter +@AllArgsConstructor +public enum DsConfTypeEnum { + + /** + * 主机链接 + */ + HOST(0, "主机链接"), + + /** + * JDBC链接 + */ + JDBC(1, "JDBC链接"); + + private final Integer type; + + private final String description; + +} diff --git a/pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource/util/DsJdbcUrlEnum.java b/pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource/util/DsJdbcUrlEnum.java new file mode 100644 index 0000000..f480473 --- /dev/null +++ b/pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource/util/DsJdbcUrlEnum.java @@ -0,0 +1,70 @@ +package com.pig4cloud.pigx.common.datasource.util; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; + +/** + * @author lengleng + * @date 2020/12/11 + *

+ * jdbc-url + */ +@Getter +@AllArgsConstructor +public enum DsJdbcUrlEnum { + + /** + * mysql 数据库 + */ + MYSQL("mysql", + "jdbc:mysql://%s:%s/%s?characterEncoding=utf8" + + "&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true" + + "&useLegacyDatetimeCode=false&allowMultiQueries=true&allowPublicKeyRetrieval=true", + "select 1", "mysql8 链接"), + + /** + * pg 数据库 + */ + PG("pg", "jdbc:postgresql://%s:%s/%s", "select 1", "postgresql 链接"), + + /** + * SQL SERVER + */ + MSSQL("mssql", "jdbc:sqlserver://%s:%s;database=%s;characterEncoding=UTF-8", "select 1", "sqlserver 链接"), + + /** + * oracle + */ + ORACLE("oracle", "jdbc:oracle:thin:@%s:%s:%s", "select 1 from dual", "oracle 链接"), + + /** + * db2 + */ + DB2("db2", "jdbc:db2://%s:%s/%s", "select 1 from sysibm.sysdummy1", "DB2 TYPE4 连接"), + + /** + * 达梦 + */ + DM("dm", "jdbc:dm://%s:%s/%s", "select 1 from dual", "达梦连接"), + + /** + * pg 数据库 + */ + HIGHGO("highgo", "jdbc:highgo://%s:%s/%s", "select 1", "highgo 链接"); + + private final String dbName; + + private final String url; + + private final String validationQuery; + + private final String description; + + public static DsJdbcUrlEnum get(String dsType) { + return Arrays.stream(DsJdbcUrlEnum.values()).filter(dsJdbcUrlEnum -> dsType.equals(dsJdbcUrlEnum.getDbName())) + .findFirst().get(); + } + +} diff --git a/pigx-common/pigx-common-datasource/src/main/resources/dynamic-ds-log.yaml b/pigx-common/pigx-common-datasource/src/main/resources/dynamic-ds-log.yaml new file mode 100644 index 0000000..c8299c7 --- /dev/null +++ b/pigx-common/pigx-common-datasource/src/main/resources/dynamic-ds-log.yaml @@ -0,0 +1,7 @@ +# 动态数据源增加 sqlLogFilter 格式化输出 +spring: + datasource: + dynamic: + druid: + proxyFilters: + - sqlLogFilter diff --git a/pigx-common/pigx-common-encrypt-api/pom.xml b/pigx-common/pigx-common-encrypt-api/pom.xml new file mode 100644 index 0000000..1e303f7 --- /dev/null +++ b/pigx-common/pigx-common-encrypt-api/pom.xml @@ -0,0 +1,30 @@ + + + 4.0.0 + + com.pig4cloud + pigx-common + 5.2.0 + + + pigx-common-encrypt-api + jar + + pigx api 加解密 + + + + com.pig4cloud + pigx-common-core + + + cn.hutool + hutool-crypto + + + org.springframework.boot + spring-boot-starter-web + + + diff --git a/pigx-common/pigx-common-encrypt-api/src/main/java/com/pig4cloud/pigx/common/api/encrypt/ApiEncryptAutoConfiguration.java b/pigx-common/pigx-common-encrypt-api/src/main/java/com/pig4cloud/pigx/common/api/encrypt/ApiEncryptAutoConfiguration.java new file mode 100644 index 0000000..b649413 --- /dev/null +++ b/pigx-common/pigx-common-encrypt-api/src/main/java/com/pig4cloud/pigx/common/api/encrypt/ApiEncryptAutoConfiguration.java @@ -0,0 +1,39 @@ +package com.pig4cloud.pigx.common.api.encrypt; + +import com.pig4cloud.pigx.common.api.encrypt.config.ApiEncryptParamConfiguration; +import com.pig4cloud.pigx.common.api.encrypt.config.ApiEncryptProperties; +import com.pig4cloud.pigx.common.api.encrypt.core.ApiDecryptRequestBodyAdvice; +import com.pig4cloud.pigx.common.api.encrypt.core.ApiEncryptResponseBodyAdvice; +import com.pig4cloud.pigx.common.api.encrypt.core.DefaultSecretKeyResolver; +import com.pig4cloud.pigx.common.api.encrypt.core.ISecretKeyResolver; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; + +/** + * api 配置加载类 + * + * @author lengleng + * @date 2022/10/14 + */ +@Configuration(proxyBeanMethods = false) +@EnableConfigurationProperties(ApiEncryptProperties.class) +@Import({ ApiEncryptParamConfiguration.class, ApiDecryptRequestBodyAdvice.class, ApiEncryptResponseBodyAdvice.class }) +@ConditionalOnProperty(value = ApiEncryptProperties.PREFIX + ".enable", havingValue = "true", matchIfMissing = true) +public class ApiEncryptAutoConfiguration { + + /** + * 默认的 key 获取策略 + * @param apiEncryptProperties + * @return + */ + @Bean + @ConditionalOnMissingBean + public ISecretKeyResolver secretKeyResolver(ApiEncryptProperties apiEncryptProperties) { + return new DefaultSecretKeyResolver(apiEncryptProperties); + } + +} diff --git a/pigx-common/pigx-common-encrypt-api/src/main/java/com/pig4cloud/pigx/common/api/encrypt/annotation/crypto/ApiCryptoAes.java b/pigx-common/pigx-common-encrypt-api/src/main/java/com/pig4cloud/pigx/common/api/encrypt/annotation/crypto/ApiCryptoAes.java new file mode 100644 index 0000000..4806032 --- /dev/null +++ b/pigx-common/pigx-common-encrypt-api/src/main/java/com/pig4cloud/pigx/common/api/encrypt/annotation/crypto/ApiCryptoAes.java @@ -0,0 +1,22 @@ +package com.pig4cloud.pigx.common.api.encrypt.annotation.crypto; + +import com.pig4cloud.pigx.common.api.encrypt.annotation.decrypt.ApiDecrypt; +import com.pig4cloud.pigx.common.api.encrypt.annotation.encrypt.ApiEncrypt; +import com.pig4cloud.pigx.common.api.encrypt.enums.EncryptType; + +import java.lang.annotation.*; + +/** + * AES加密解密注解 + * + * @author Chill + */ +@Target({ ElementType.TYPE, ElementType.METHOD }) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@Inherited +@ApiEncrypt(EncryptType.AES) +@ApiDecrypt(EncryptType.AES) +public @interface ApiCryptoAes { + +} diff --git a/pigx-common/pigx-common-encrypt-api/src/main/java/com/pig4cloud/pigx/common/api/encrypt/annotation/crypto/ApiCryptoDes.java b/pigx-common/pigx-common-encrypt-api/src/main/java/com/pig4cloud/pigx/common/api/encrypt/annotation/crypto/ApiCryptoDes.java new file mode 100644 index 0000000..a497fb7 --- /dev/null +++ b/pigx-common/pigx-common-encrypt-api/src/main/java/com/pig4cloud/pigx/common/api/encrypt/annotation/crypto/ApiCryptoDes.java @@ -0,0 +1,22 @@ +package com.pig4cloud.pigx.common.api.encrypt.annotation.crypto; + +import com.pig4cloud.pigx.common.api.encrypt.annotation.decrypt.ApiDecrypt; +import com.pig4cloud.pigx.common.api.encrypt.annotation.encrypt.ApiEncrypt; +import com.pig4cloud.pigx.common.api.encrypt.enums.EncryptType; + +import java.lang.annotation.*; + +/** + * DES加密解密注解 + * + * @author Chill + */ +@Target({ ElementType.TYPE, ElementType.METHOD }) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@Inherited +@ApiEncrypt(EncryptType.DES) +@ApiDecrypt(EncryptType.DES) +public @interface ApiCryptoDes { + +} diff --git a/pigx-common/pigx-common-encrypt-api/src/main/java/com/pig4cloud/pigx/common/api/encrypt/annotation/crypto/ApiCryptoRsa.java b/pigx-common/pigx-common-encrypt-api/src/main/java/com/pig4cloud/pigx/common/api/encrypt/annotation/crypto/ApiCryptoRsa.java new file mode 100644 index 0000000..80c1843 --- /dev/null +++ b/pigx-common/pigx-common-encrypt-api/src/main/java/com/pig4cloud/pigx/common/api/encrypt/annotation/crypto/ApiCryptoRsa.java @@ -0,0 +1,22 @@ +package com.pig4cloud.pigx.common.api.encrypt.annotation.crypto; + +import com.pig4cloud.pigx.common.api.encrypt.annotation.decrypt.ApiDecrypt; +import com.pig4cloud.pigx.common.api.encrypt.annotation.encrypt.ApiEncrypt; +import com.pig4cloud.pigx.common.api.encrypt.enums.EncryptType; + +import java.lang.annotation.*; + +/** + * RSA加密解密注解 + * + * @author Chill + */ +@Target({ ElementType.TYPE, ElementType.METHOD }) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@Inherited +@ApiEncrypt(EncryptType.RSA) +@ApiDecrypt(EncryptType.RSA) +public @interface ApiCryptoRsa { + +} diff --git a/pigx-common/pigx-common-encrypt-api/src/main/java/com/pig4cloud/pigx/common/api/encrypt/annotation/crypto/ApiCryptoSm4.java b/pigx-common/pigx-common-encrypt-api/src/main/java/com/pig4cloud/pigx/common/api/encrypt/annotation/crypto/ApiCryptoSm4.java new file mode 100644 index 0000000..2db1790 --- /dev/null +++ b/pigx-common/pigx-common-encrypt-api/src/main/java/com/pig4cloud/pigx/common/api/encrypt/annotation/crypto/ApiCryptoSm4.java @@ -0,0 +1,22 @@ +package com.pig4cloud.pigx.common.api.encrypt.annotation.crypto; + +import com.pig4cloud.pigx.common.api.encrypt.annotation.decrypt.ApiDecrypt; +import com.pig4cloud.pigx.common.api.encrypt.annotation.encrypt.ApiEncrypt; +import com.pig4cloud.pigx.common.api.encrypt.enums.EncryptType; + +import java.lang.annotation.*; + +/** + * Sm4加密解密注解 + * + * @author lengleng + */ +@Target({ ElementType.TYPE, ElementType.METHOD }) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@Inherited +@ApiEncrypt(EncryptType.SM4) +@ApiDecrypt(EncryptType.SM4) +public @interface ApiCryptoSm4 { + +} diff --git a/pigx-common/pigx-common-encrypt-api/src/main/java/com/pig4cloud/pigx/common/api/encrypt/annotation/decrypt/ApiDecrypt.java b/pigx-common/pigx-common-encrypt-api/src/main/java/com/pig4cloud/pigx/common/api/encrypt/annotation/decrypt/ApiDecrypt.java new file mode 100644 index 0000000..181c91d --- /dev/null +++ b/pigx-common/pigx-common-encrypt-api/src/main/java/com/pig4cloud/pigx/common/api/encrypt/annotation/decrypt/ApiDecrypt.java @@ -0,0 +1,34 @@ +package com.pig4cloud.pigx.common.api.encrypt.annotation.decrypt; + +import com.pig4cloud.pigx.common.api.encrypt.enums.EncryptType; + +import java.lang.annotation.*; + +/** + *

+ * 解密含有{@link org.springframework.web.bind.annotation.RequestBody}注解的参数请求数据,可用于整个控制类或者某个控制器上 + *

+ * + * @author licoy.cn + * @author L.cm + * @version 2018/9/7 + */ +@Target({ ElementType.TYPE, ElementType.METHOD, ElementType.PARAMETER }) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@Inherited +public @interface ApiDecrypt { + + /** + * 解密类型 + * @return 类型 + */ + EncryptType value(); + + /** + * 私钥,用于某些需要单独配置私钥的方法,没有时读取全局配置的私钥 + * @return 私钥 + */ + String secretKey() default ""; + +} diff --git a/pigx-common/pigx-common-encrypt-api/src/main/java/com/pig4cloud/pigx/common/api/encrypt/annotation/decrypt/ApiDecryptAes.java b/pigx-common/pigx-common-encrypt-api/src/main/java/com/pig4cloud/pigx/common/api/encrypt/annotation/decrypt/ApiDecryptAes.java new file mode 100644 index 0000000..5e9990a --- /dev/null +++ b/pigx-common/pigx-common-encrypt-api/src/main/java/com/pig4cloud/pigx/common/api/encrypt/annotation/decrypt/ApiDecryptAes.java @@ -0,0 +1,29 @@ +package com.pig4cloud.pigx.common.api.encrypt.annotation.decrypt; + +import com.pig4cloud.pigx.common.api.encrypt.enums.EncryptType; +import org.springframework.core.annotation.AliasFor; + +import java.lang.annotation.*; + +/** + * aes 界面 + * + * @author licoy.cn + * @author L.cm + * @version 2018/9/7 + * @see ApiDecrypt + */ +@Target({ ElementType.TYPE, ElementType.METHOD, ElementType.PARAMETER }) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@ApiDecrypt(EncryptType.AES) +public @interface ApiDecryptAes { + + /** + * Alias for {@link ApiDecrypt#secretKey()}. + * @return {String} + */ + @AliasFor(annotation = ApiDecrypt.class) + String secretKey() default ""; + +} diff --git a/pigx-common/pigx-common-encrypt-api/src/main/java/com/pig4cloud/pigx/common/api/encrypt/annotation/decrypt/ApiDecryptDes.java b/pigx-common/pigx-common-encrypt-api/src/main/java/com/pig4cloud/pigx/common/api/encrypt/annotation/decrypt/ApiDecryptDes.java new file mode 100644 index 0000000..fb0e402 --- /dev/null +++ b/pigx-common/pigx-common-encrypt-api/src/main/java/com/pig4cloud/pigx/common/api/encrypt/annotation/decrypt/ApiDecryptDes.java @@ -0,0 +1,26 @@ +package com.pig4cloud.pigx.common.api.encrypt.annotation.decrypt; + +import com.pig4cloud.pigx.common.api.encrypt.enums.EncryptType; +import org.springframework.core.annotation.AliasFor; + +import java.lang.annotation.*; + +/** + * @author licoy.cn + * @version 2018/9/7 + * @see ApiDecrypt + */ +@Target({ ElementType.TYPE, ElementType.METHOD, ElementType.PARAMETER }) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@ApiDecrypt(EncryptType.DES) +public @interface ApiDecryptDes { + + /** + * Alias for {@link ApiDecrypt#secretKey()}. + * @return {String} + */ + @AliasFor(annotation = ApiDecrypt.class) + String secretKey() default ""; + +} diff --git a/pigx-common/pigx-common-encrypt-api/src/main/java/com/pig4cloud/pigx/common/api/encrypt/annotation/decrypt/ApiDecryptRsa.java b/pigx-common/pigx-common-encrypt-api/src/main/java/com/pig4cloud/pigx/common/api/encrypt/annotation/decrypt/ApiDecryptRsa.java new file mode 100644 index 0000000..9730d08 --- /dev/null +++ b/pigx-common/pigx-common-encrypt-api/src/main/java/com/pig4cloud/pigx/common/api/encrypt/annotation/decrypt/ApiDecryptRsa.java @@ -0,0 +1,18 @@ +package com.pig4cloud.pigx.common.api.encrypt.annotation.decrypt; + +import com.pig4cloud.pigx.common.api.encrypt.enums.EncryptType; + +import java.lang.annotation.*; + +/** + * @author licoy.cn + * @version 2018/9/7 + * @see ApiDecrypt + */ +@Target({ ElementType.TYPE, ElementType.METHOD, ElementType.PARAMETER }) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@ApiDecrypt(EncryptType.RSA) +public @interface ApiDecryptRsa { + +} diff --git a/pigx-common/pigx-common-encrypt-api/src/main/java/com/pig4cloud/pigx/common/api/encrypt/annotation/decrypt/ApiDecryptSm4.java b/pigx-common/pigx-common-encrypt-api/src/main/java/com/pig4cloud/pigx/common/api/encrypt/annotation/decrypt/ApiDecryptSm4.java new file mode 100644 index 0000000..a9d052f --- /dev/null +++ b/pigx-common/pigx-common-encrypt-api/src/main/java/com/pig4cloud/pigx/common/api/encrypt/annotation/decrypt/ApiDecryptSm4.java @@ -0,0 +1,28 @@ +package com.pig4cloud.pigx.common.api.encrypt.annotation.decrypt; + +import com.pig4cloud.pigx.common.api.encrypt.enums.EncryptType; +import org.springframework.core.annotation.AliasFor; + +import java.lang.annotation.*; + +/** + * sm4 解密 + * + * @author lengleng + * @version 2023/8/30 + * @see ApiDecrypt + */ +@Target({ ElementType.TYPE, ElementType.METHOD, ElementType.PARAMETER }) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@ApiDecrypt(EncryptType.SM4) +public @interface ApiDecryptSm4 { + + /** + * Alias for {@link ApiDecrypt#secretKey()}. + * @return {String} + */ + @AliasFor(annotation = ApiDecrypt.class) + String secretKey() default ""; + +} diff --git a/pigx-common/pigx-common-encrypt-api/src/main/java/com/pig4cloud/pigx/common/api/encrypt/annotation/encrypt/ApiEncrypt.java b/pigx-common/pigx-common-encrypt-api/src/main/java/com/pig4cloud/pigx/common/api/encrypt/annotation/encrypt/ApiEncrypt.java new file mode 100644 index 0000000..f1ff48d --- /dev/null +++ b/pigx-common/pigx-common-encrypt-api/src/main/java/com/pig4cloud/pigx/common/api/encrypt/annotation/encrypt/ApiEncrypt.java @@ -0,0 +1,34 @@ +package com.pig4cloud.pigx.common.api.encrypt.annotation.encrypt; + +import com.pig4cloud.pigx.common.api.encrypt.enums.EncryptType; + +import java.lang.annotation.*; + +/** + *

+ * 加密{@link org.springframework.web.bind.annotation.ResponseBody}响应数据,可用于整个控制类或者某个控制器上 + *

+ * + * @author licoy.cn + * @author L.cm + * @version 2018/9/4 + */ +@Target({ ElementType.METHOD, ElementType.TYPE }) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@Inherited +public @interface ApiEncrypt { + + /** + * 加密类型 + * @return 类型 + */ + EncryptType value(); + + /** + * 私钥,用于某些需要单独配置私钥的方法,没有时读取全局配置的私钥 + * @return 私钥 + */ + String secretKey() default ""; + +} diff --git a/pigx-common/pigx-common-encrypt-api/src/main/java/com/pig4cloud/pigx/common/api/encrypt/annotation/encrypt/ApiEncryptAes.java b/pigx-common/pigx-common-encrypt-api/src/main/java/com/pig4cloud/pigx/common/api/encrypt/annotation/encrypt/ApiEncryptAes.java new file mode 100644 index 0000000..0bc67e9 --- /dev/null +++ b/pigx-common/pigx-common-encrypt-api/src/main/java/com/pig4cloud/pigx/common/api/encrypt/annotation/encrypt/ApiEncryptAes.java @@ -0,0 +1,29 @@ +package com.pig4cloud.pigx.common.api.encrypt.annotation.encrypt; + +import com.pig4cloud.pigx.common.api.encrypt.enums.EncryptType; +import org.springframework.core.annotation.AliasFor; + +import java.lang.annotation.*; + +/** + * aes 加密 + * + * @author licoy.cn + * @author L.cm + * @version 2018/9/4 + * @see ApiEncrypt + */ +@Target({ ElementType.METHOD, ElementType.TYPE }) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@ApiEncrypt(EncryptType.AES) +public @interface ApiEncryptAes { + + /** + * Alias for {@link ApiEncrypt#secretKey()}. + * @return {String} + */ + @AliasFor(annotation = ApiEncrypt.class) + String secretKey() default ""; + +} diff --git a/pigx-common/pigx-common-encrypt-api/src/main/java/com/pig4cloud/pigx/common/api/encrypt/annotation/encrypt/ApiEncryptDes.java b/pigx-common/pigx-common-encrypt-api/src/main/java/com/pig4cloud/pigx/common/api/encrypt/annotation/encrypt/ApiEncryptDes.java new file mode 100644 index 0000000..949716c --- /dev/null +++ b/pigx-common/pigx-common-encrypt-api/src/main/java/com/pig4cloud/pigx/common/api/encrypt/annotation/encrypt/ApiEncryptDes.java @@ -0,0 +1,29 @@ +package com.pig4cloud.pigx.common.api.encrypt.annotation.encrypt; + +import com.pig4cloud.pigx.common.api.encrypt.enums.EncryptType; +import org.springframework.core.annotation.AliasFor; + +import java.lang.annotation.*; + +/** + * des 加密 + * + * @author licoy.cn + * @author L.cm + * @version 2018/9/4 + * @see ApiEncrypt + */ +@Target({ ElementType.METHOD, ElementType.TYPE }) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@ApiEncrypt(EncryptType.DES) +public @interface ApiEncryptDes { + + /** + * Alias for {@link ApiEncrypt#secretKey()}. + * @return {String} + */ + @AliasFor(annotation = ApiEncrypt.class) + String secretKey() default ""; + +} diff --git a/pigx-common/pigx-common-encrypt-api/src/main/java/com/pig4cloud/pigx/common/api/encrypt/annotation/encrypt/ApiEncryptRsa.java b/pigx-common/pigx-common-encrypt-api/src/main/java/com/pig4cloud/pigx/common/api/encrypt/annotation/encrypt/ApiEncryptRsa.java new file mode 100644 index 0000000..32d50fa --- /dev/null +++ b/pigx-common/pigx-common-encrypt-api/src/main/java/com/pig4cloud/pigx/common/api/encrypt/annotation/encrypt/ApiEncryptRsa.java @@ -0,0 +1,21 @@ +package com.pig4cloud.pigx.common.api.encrypt.annotation.encrypt; + +import com.pig4cloud.pigx.common.api.encrypt.enums.EncryptType; + +import java.lang.annotation.*; + +/** + * rsa body 加密 + * + * @author licoy.cn + * @author L.cm + * @version 2018/9/4 + * @see ApiEncrypt + */ +@Target({ ElementType.METHOD, ElementType.TYPE }) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@ApiEncrypt(EncryptType.RSA) +public @interface ApiEncryptRsa { + +} diff --git a/pigx-common/pigx-common-encrypt-api/src/main/java/com/pig4cloud/pigx/common/api/encrypt/annotation/encrypt/ApiEncryptSm4.java b/pigx-common/pigx-common-encrypt-api/src/main/java/com/pig4cloud/pigx/common/api/encrypt/annotation/encrypt/ApiEncryptSm4.java new file mode 100644 index 0000000..b639871 --- /dev/null +++ b/pigx-common/pigx-common-encrypt-api/src/main/java/com/pig4cloud/pigx/common/api/encrypt/annotation/encrypt/ApiEncryptSm4.java @@ -0,0 +1,28 @@ +package com.pig4cloud.pigx.common.api.encrypt.annotation.encrypt; + +import com.pig4cloud.pigx.common.api.encrypt.enums.EncryptType; +import org.springframework.core.annotation.AliasFor; + +import java.lang.annotation.*; + +/** + * sm4 加密 + * + * @author lengleng + * @version 2023/8/30 + * @see ApiEncrypt + */ +@Target({ ElementType.METHOD, ElementType.TYPE }) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@ApiEncrypt(EncryptType.SM4) +public @interface ApiEncryptSm4 { + + /** + * Alias for {@link ApiEncrypt#secretKey()}. + * @return {String} + */ + @AliasFor(annotation = ApiEncrypt.class) + String secretKey() default ""; + +} diff --git a/pigx-common/pigx-common-encrypt-api/src/main/java/com/pig4cloud/pigx/common/api/encrypt/bean/CryptoInfoBean.java b/pigx-common/pigx-common-encrypt-api/src/main/java/com/pig4cloud/pigx/common/api/encrypt/bean/CryptoInfoBean.java new file mode 100644 index 0000000..50d92b1 --- /dev/null +++ b/pigx-common/pigx-common-encrypt-api/src/main/java/com/pig4cloud/pigx/common/api/encrypt/bean/CryptoInfoBean.java @@ -0,0 +1,30 @@ +package com.pig4cloud.pigx.common.api.encrypt.bean; + +import com.pig4cloud.pigx.common.api.encrypt.enums.EncryptType; +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +/** + *

+ * 加密注解信息 + *

+ * + * @author licoy.cn + * @author L.cm + * @version 2018/9/6 + */ +@Getter +@RequiredArgsConstructor +public class CryptoInfoBean { + + /** + * 加密类型 + */ + private final EncryptType type; + + /** + * 私钥 + */ + private final String secretKey; + +} diff --git a/pigx-common/pigx-common-encrypt-api/src/main/java/com/pig4cloud/pigx/common/api/encrypt/bean/DecryptHttpInputMessage.java b/pigx-common/pigx-common-encrypt-api/src/main/java/com/pig4cloud/pigx/common/api/encrypt/bean/DecryptHttpInputMessage.java new file mode 100644 index 0000000..7b5d2de --- /dev/null +++ b/pigx-common/pigx-common-encrypt-api/src/main/java/com/pig4cloud/pigx/common/api/encrypt/bean/DecryptHttpInputMessage.java @@ -0,0 +1,27 @@ +package com.pig4cloud.pigx.common.api.encrypt.bean; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpInputMessage; + +import java.io.InputStream; + +/** + *

+ * 解密信息输入流 + *

+ * + * @author licoy.cn + * @author L.cm + * @version 2018/9/7 + */ +@Getter +@RequiredArgsConstructor +public class DecryptHttpInputMessage implements HttpInputMessage { + + private final InputStream body; + + private final HttpHeaders headers; + +} diff --git a/pigx-common/pigx-common-encrypt-api/src/main/java/com/pig4cloud/pigx/common/api/encrypt/config/ApiEncryptParamConfiguration.java b/pigx-common/pigx-common-encrypt-api/src/main/java/com/pig4cloud/pigx/common/api/encrypt/config/ApiEncryptParamConfiguration.java new file mode 100644 index 0000000..becafa0 --- /dev/null +++ b/pigx-common/pigx-common-encrypt-api/src/main/java/com/pig4cloud/pigx/common/api/encrypt/config/ApiEncryptParamConfiguration.java @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2019-2029, Dreamlu 卢春梦 (596392912@qq.com & www.dreamlu.net). + *

+ * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE 3.0; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.gnu.org/licenses/lgpl.html + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.pig4cloud.pigx.common.api.encrypt.config; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.pig4cloud.pigx.common.api.encrypt.core.ApiDecryptParamResolver; +import lombok.RequiredArgsConstructor; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.web.method.support.HandlerMethodArgumentResolver; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +import java.util.List; + +/** + * api 签名自动配置 + * + * @author L.cm + */ +@RequiredArgsConstructor +@ConditionalOnProperty(value = ApiEncryptProperties.PREFIX + ".enable", havingValue = "true", matchIfMissing = true) +public class ApiEncryptParamConfiguration implements WebMvcConfigurer { + + private final ApiEncryptProperties apiEncryptProperties; + + private final ObjectMapper objectMapper; + + public void addArgumentResolvers(List argumentResolvers) { + argumentResolvers.add(new ApiDecryptParamResolver(apiEncryptProperties, objectMapper)); + } + +} diff --git a/pigx-common/pigx-common-encrypt-api/src/main/java/com/pig4cloud/pigx/common/api/encrypt/config/ApiEncryptProperties.java b/pigx-common/pigx-common-encrypt-api/src/main/java/com/pig4cloud/pigx/common/api/encrypt/config/ApiEncryptProperties.java new file mode 100644 index 0000000..e9ea260 --- /dev/null +++ b/pigx-common/pigx-common-encrypt-api/src/main/java/com/pig4cloud/pigx/common/api/encrypt/config/ApiEncryptProperties.java @@ -0,0 +1,59 @@ +package com.pig4cloud.pigx.common.api.encrypt.config; + +import lombok.Getter; +import lombok.Setter; +import org.springframework.boot.context.properties.ConfigurationProperties; + +/** + * api 签名配置类 + * + * @author licoy.cn + * @author L.cm + * @version 2018/9/6 + */ +@Getter +@Setter +@ConfigurationProperties(ApiEncryptProperties.PREFIX) +public class ApiEncryptProperties { + + /** + * 前缀 + */ + public static final String PREFIX = "security.api.encrypt"; + + /** + * 是否开启 api 签名 + */ + private boolean enable = true; + + /** + * url的参数签名,传递的参数名。例如:/user?data=签名后的数据 + */ + private String paramName = "encryption"; + + /** + * body 内容 json key, 默认:encryption + */ + private String bodyJsonKey = "encryption"; + + /** + * aes 密钥 + */ + private String aesKey; + + /** + * des 密钥 + */ + private String desKey; + + /** + * sm4 密钥 + */ + private String sm4Key; + + /** + * rsa 私钥 + */ + private String rsaPrivateKey; + +} diff --git a/pigx-common/pigx-common-encrypt-api/src/main/java/com/pig4cloud/pigx/common/api/encrypt/core/ApiDecryptParamResolver.java b/pigx-common/pigx-common-encrypt-api/src/main/java/com/pig4cloud/pigx/common/api/encrypt/core/ApiDecryptParamResolver.java new file mode 100644 index 0000000..4250480 --- /dev/null +++ b/pigx-common/pigx-common-encrypt-api/src/main/java/com/pig4cloud/pigx/common/api/encrypt/core/ApiDecryptParamResolver.java @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2019-2029, Dreamlu 卢春梦 (596392912@qq.com & www.dreamlu.net). + *

+ * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE 3.0; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.gnu.org/licenses/lgpl.html + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.pig4cloud.pigx.common.api.encrypt.core; + +import cn.hutool.core.util.StrUtil; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.pig4cloud.pigx.common.api.encrypt.annotation.decrypt.ApiDecrypt; +import com.pig4cloud.pigx.common.api.encrypt.bean.CryptoInfoBean; +import com.pig4cloud.pigx.common.api.encrypt.config.ApiEncryptProperties; +import com.pig4cloud.pigx.common.api.encrypt.util.ApiCryptoUtil; +import lombok.RequiredArgsConstructor; +import org.springframework.core.MethodParameter; +import org.springframework.core.annotation.AnnotatedElementUtils; +import org.springframework.lang.Nullable; +import org.springframework.web.bind.support.WebDataBinderFactory; +import org.springframework.web.context.request.NativeWebRequest; +import org.springframework.web.method.support.HandlerMethodArgumentResolver; +import org.springframework.web.method.support.ModelAndViewContainer; + +import java.lang.reflect.Parameter; +import java.nio.charset.StandardCharsets; + +/** + * param 参数 解析 + * + * @author L.cm + */ +@RequiredArgsConstructor +public class ApiDecryptParamResolver implements HandlerMethodArgumentResolver { + + private final ApiEncryptProperties properties; + + private final ObjectMapper objectMapper; + + @Override + public boolean supportsParameter(MethodParameter parameter) { + return AnnotatedElementUtils.hasAnnotation(parameter.getParameter(), ApiDecrypt.class); + } + + @Nullable + @Override + public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer mavContainer, + NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception { + Parameter parameter = methodParameter.getParameter(); + ApiDecrypt apiDecrypt = AnnotatedElementUtils.getMergedAnnotation(parameter, ApiDecrypt.class); + String text = webRequest.getParameter(properties.getParamName()); + if (StrUtil.isBlank(text)) { + return null; + } + CryptoInfoBean infoBean = new CryptoInfoBean(apiDecrypt.value(), apiDecrypt.secretKey()); + byte[] textBytes = text.getBytes(StandardCharsets.UTF_8); + byte[] decryptData = ApiCryptoUtil.decryptData(textBytes, infoBean); + + return objectMapper.readValue(decryptData, parameter.getType()); + } + +} diff --git a/pigx-common/pigx-common-encrypt-api/src/main/java/com/pig4cloud/pigx/common/api/encrypt/core/ApiDecryptRequestBodyAdvice.java b/pigx-common/pigx-common-encrypt-api/src/main/java/com/pig4cloud/pigx/common/api/encrypt/core/ApiDecryptRequestBodyAdvice.java new file mode 100644 index 0000000..bd3f516 --- /dev/null +++ b/pigx-common/pigx-common-encrypt-api/src/main/java/com/pig4cloud/pigx/common/api/encrypt/core/ApiDecryptRequestBodyAdvice.java @@ -0,0 +1,108 @@ +package com.pig4cloud.pigx.common.api.encrypt.core; + +import cn.hutool.core.annotation.AnnotationUtil; +import cn.hutool.core.util.StrUtil; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.pig4cloud.pigx.common.api.encrypt.annotation.decrypt.ApiDecrypt; +import com.pig4cloud.pigx.common.api.encrypt.bean.CryptoInfoBean; +import com.pig4cloud.pigx.common.api.encrypt.bean.DecryptHttpInputMessage; +import com.pig4cloud.pigx.common.api.encrypt.config.ApiEncryptProperties; +import com.pig4cloud.pigx.common.api.encrypt.exception.DecryptBodyFailException; +import com.pig4cloud.pigx.common.api.encrypt.util.ApiCryptoUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.core.MethodParameter; +import org.springframework.core.annotation.Order; +import org.springframework.http.HttpInputMessage; +import org.springframework.http.converter.HttpMessageConverter; +import org.springframework.util.StreamUtils; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.servlet.mvc.method.annotation.RequestBodyAdvice; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.lang.reflect.Type; +import java.nio.charset.StandardCharsets; +import java.util.Map; + +/** + * 请求数据的加密信息解密处理
+ * 本类只对控制器参数中含有{@link org.springframework.web.bind.annotation.RequestBody} + * 以及package为cn.licoy.encryptbody.annotation.decrypt下的注解有效 + * + * @author licoy.cn + * @author L.cm + * @version 2018/9/7 + * @see RequestBodyAdvice + */ +@Slf4j +@Order(1) +@ControllerAdvice +@RequiredArgsConstructor +@ConditionalOnProperty(value = ApiEncryptProperties.PREFIX + ".enable", havingValue = "true", matchIfMissing = true) +public class ApiDecryptRequestBodyAdvice implements RequestBodyAdvice { + + private final ApiEncryptProperties properties; + + private final ObjectMapper objectMapper; + + @Override + public boolean supports(MethodParameter methodParameter, Type targetType, + Class> converterType) { + return AnnotationUtil.hasAnnotation(methodParameter.getMethod(), ApiDecrypt.class); + } + + @Override + public Object handleEmptyBody(Object body, HttpInputMessage inputMessage, MethodParameter parameter, + Type targetType, Class> converterType) { + return body; + } + + @Override + public HttpInputMessage beforeBodyRead(HttpInputMessage inputMessage, MethodParameter parameter, Type targetType, + Class> converterType) throws IOException { + // 判断 body 是否为空 + InputStream messageBody = inputMessage.getBody(); + if (messageBody.available() <= 0) { + return inputMessage; + } + + CryptoInfoBean cryptoInfoBean = ApiCryptoUtil.getDecryptInfo(parameter); + if (cryptoInfoBean == null) { + throw new DecryptBodyFailException("获取解密注解配置为空"); + } + // base64 byte array + byte[] bodyByteArray = StreamUtils.copyToByteArray(messageBody); + // body 内容 json key, 默认:data {"data":"base64加密字符串"} + String bodyJsonKey = properties.getBodyJsonKey(); + + byte[] decryptedBody = null; + if (StrUtil.isBlank(bodyJsonKey)) { + decryptedBody = ApiCryptoUtil.decryptData(bodyByteArray, cryptoInfoBean); + } + else { + + Map data = objectMapper.readValue(bodyByteArray, Map.class); + String content = (String) data.get(bodyJsonKey); + if (content != null) { + decryptedBody = ApiCryptoUtil.decryptData(content.getBytes(StandardCharsets.UTF_8), cryptoInfoBean); + } + } + if (decryptedBody == null) { + throw new DecryptBodyFailException( + "Decryption error, " + "please check if the selected source data is encrypted correctly." + + " (解密错误,请检查选择的源数据的加密方式是否正确。)"); + } + InputStream inputStream = new ByteArrayInputStream(decryptedBody); + return new DecryptHttpInputMessage(inputStream, inputMessage.getHeaders()); + } + + @Override + public Object afterBodyRead(Object body, HttpInputMessage inputMessage, MethodParameter parameter, Type targetType, + Class> converterType) { + return body; + } + +} diff --git a/pigx-common/pigx-common-encrypt-api/src/main/java/com/pig4cloud/pigx/common/api/encrypt/core/ApiEncryptResponseBodyAdvice.java b/pigx-common/pigx-common-encrypt-api/src/main/java/com/pig4cloud/pigx/common/api/encrypt/core/ApiEncryptResponseBodyAdvice.java new file mode 100644 index 0000000..abf1a9a --- /dev/null +++ b/pigx-common/pigx-common-encrypt-api/src/main/java/com/pig4cloud/pigx/common/api/encrypt/core/ApiEncryptResponseBodyAdvice.java @@ -0,0 +1,85 @@ +package com.pig4cloud.pigx.common.api.encrypt.core; + +import cn.hutool.core.annotation.AnnotationUtil; +import cn.hutool.core.util.StrUtil; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.pig4cloud.pigx.common.api.encrypt.annotation.encrypt.ApiEncrypt; +import com.pig4cloud.pigx.common.api.encrypt.bean.CryptoInfoBean; +import com.pig4cloud.pigx.common.api.encrypt.config.ApiEncryptProperties; +import com.pig4cloud.pigx.common.api.encrypt.exception.EncryptBodyFailException; +import com.pig4cloud.pigx.common.api.encrypt.util.ApiCryptoUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.core.MethodParameter; +import org.springframework.core.annotation.Order; +import org.springframework.http.MediaType; +import org.springframework.http.server.ServerHttpRequest; +import org.springframework.http.server.ServerHttpResponse; +import org.springframework.lang.Nullable; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice; + +import java.util.HashMap; +import java.util.Map; + +/** + * 响应数据的加密处理
+ * 本类只对控制器参数中含有{@link org.springframework.web.bind.annotation.ResponseBody} + * 或者控制类上含有{@link org.springframework.web.bind.annotation.RestController} + * 以及package为cn.licoy.encryptbody.annotation.encrypt下的注解有效 + * + * @author licoy.cn + * @author L.cm + * @version 2018/9/4 + * @see ResponseBodyAdvice + */ +@Slf4j +@Order(1) +@ControllerAdvice +@RequiredArgsConstructor +@ConditionalOnProperty(value = ApiEncryptProperties.PREFIX + ".enable", havingValue = "true", matchIfMissing = true) +public class ApiEncryptResponseBodyAdvice implements ResponseBodyAdvice { + + private final ApiEncryptProperties properties; + + private final ObjectMapper objectMapper; + + @Override + public boolean supports(MethodParameter returnType, Class converterType) { + return AnnotationUtil.hasAnnotation(returnType.getMethod(), ApiEncrypt.class); + } + + @Nullable + @Override + public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, + Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) { + if (body == null) { + return null; + } + + CryptoInfoBean cryptoInfoBean = ApiCryptoUtil.getEncryptInfo(returnType); + if (cryptoInfoBean == null) { + throw new EncryptBodyFailException(); + } + + byte[] bodyJsonBytes; + try { + bodyJsonBytes = objectMapper.writeValueAsBytes(body); + } + catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + + // body 内容 json key, 默认:data {"data":"base64加密字符串"} + String bodyJsonKey = properties.getBodyJsonKey(); + if (StrUtil.isBlank(bodyJsonKey)) { + return ApiCryptoUtil.encryptData(bodyJsonBytes, cryptoInfoBean); + } + Map data = new HashMap<>(2); + data.put(bodyJsonKey, ApiCryptoUtil.encryptData(bodyJsonBytes, cryptoInfoBean)); + return data; + } + +} diff --git a/pigx-common/pigx-common-encrypt-api/src/main/java/com/pig4cloud/pigx/common/api/encrypt/core/DefaultSecretKeyResolver.java b/pigx-common/pigx-common-encrypt-api/src/main/java/com/pig4cloud/pigx/common/api/encrypt/core/DefaultSecretKeyResolver.java new file mode 100644 index 0000000..cebff4b --- /dev/null +++ b/pigx-common/pigx-common-encrypt-api/src/main/java/com/pig4cloud/pigx/common/api/encrypt/core/DefaultSecretKeyResolver.java @@ -0,0 +1,31 @@ +package com.pig4cloud.pigx.common.api.encrypt.core; + +import com.pig4cloud.pigx.common.api.encrypt.config.ApiEncryptProperties; +import com.pig4cloud.pigx.common.api.encrypt.enums.EncryptType; +import lombok.RequiredArgsConstructor; + +import javax.servlet.http.HttpServletRequest; + +/** + * 默认的密钥处理器 + * + * @author L.cm + */ +@RequiredArgsConstructor +public class DefaultSecretKeyResolver implements ISecretKeyResolver { + + private final ApiEncryptProperties properties; + + @Override + public String getSecretKey(HttpServletRequest request, EncryptType encryptType) { + switch (encryptType) { + case DES: + return properties.getDesKey(); + case RSA: + return properties.getRsaPrivateKey(); + default: + return properties.getAesKey(); + } + } + +} diff --git a/pigx-common/pigx-common-encrypt-api/src/main/java/com/pig4cloud/pigx/common/api/encrypt/core/ISecretKeyResolver.java b/pigx-common/pigx-common-encrypt-api/src/main/java/com/pig4cloud/pigx/common/api/encrypt/core/ISecretKeyResolver.java new file mode 100644 index 0000000..435bd68 --- /dev/null +++ b/pigx-common/pigx-common-encrypt-api/src/main/java/com/pig4cloud/pigx/common/api/encrypt/core/ISecretKeyResolver.java @@ -0,0 +1,22 @@ +package com.pig4cloud.pigx.common.api.encrypt.core; + +import com.pig4cloud.pigx.common.api.encrypt.enums.EncryptType; + +import javax.servlet.http.HttpServletRequest; + +/** + * 解析加密密钥 + * + * @author L.cm + */ +public interface ISecretKeyResolver { + + /** + * 获取租户对应的加、解密密钥 + * @param request HttpServletRequest + * @param encryptType 加解密类型 + * @return 密钥 + */ + String getSecretKey(HttpServletRequest request, EncryptType encryptType); + +} diff --git a/pigx-common/pigx-common-encrypt-api/src/main/java/com/pig4cloud/pigx/common/api/encrypt/core/package-info.java b/pigx-common/pigx-common-encrypt-api/src/main/java/com/pig4cloud/pigx/common/api/encrypt/core/package-info.java new file mode 100644 index 0000000..f3c633a --- /dev/null +++ b/pigx-common/pigx-common-encrypt-api/src/main/java/com/pig4cloud/pigx/common/api/encrypt/core/package-info.java @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2019-2029, Dreamlu 卢春梦 (596392912@qq.com & www.dreamlu.net). + *

+ * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE 3.0; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.gnu.org/licenses/lgpl.html + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@NonNullApi +@NonNullFields +package com.pig4cloud.pigx.common.api.encrypt.core; + +import org.springframework.lang.NonNullApi; +import org.springframework.lang.NonNullFields; diff --git a/pigx-common/pigx-common-encrypt-api/src/main/java/com/pig4cloud/pigx/common/api/encrypt/enums/EncryptType.java b/pigx-common/pigx-common-encrypt-api/src/main/java/com/pig4cloud/pigx/common/api/encrypt/enums/EncryptType.java new file mode 100644 index 0000000..5050014 --- /dev/null +++ b/pigx-common/pigx-common-encrypt-api/src/main/java/com/pig4cloud/pigx/common/api/encrypt/enums/EncryptType.java @@ -0,0 +1,19 @@ +package com.pig4cloud.pigx.common.api.encrypt.enums; + +/** + *

+ * 加密方式 + *

+ * + * @author licoy.cn + * @author L.cm + * @version 2018/9/4 + */ +public enum EncryptType { + + /** + * 加密方式 + */ + DES, AES, RSA, SM4 + +} diff --git a/pigx-common/pigx-common-encrypt-api/src/main/java/com/pig4cloud/pigx/common/api/encrypt/exception/DecryptBodyFailException.java b/pigx-common/pigx-common-encrypt-api/src/main/java/com/pig4cloud/pigx/common/api/encrypt/exception/DecryptBodyFailException.java new file mode 100644 index 0000000..365d07c --- /dev/null +++ b/pigx-common/pigx-common-encrypt-api/src/main/java/com/pig4cloud/pigx/common/api/encrypt/exception/DecryptBodyFailException.java @@ -0,0 +1,17 @@ +package com.pig4cloud.pigx.common.api.encrypt.exception; + +/** + *

+ * 解密数据失败异常 + *

+ * + * @author licoy.cn + * @version 2018/9/6 + */ +public class DecryptBodyFailException extends RuntimeException { + + public DecryptBodyFailException(String message) { + super(message); + } + +} diff --git a/pigx-common/pigx-common-encrypt-api/src/main/java/com/pig4cloud/pigx/common/api/encrypt/exception/EncryptBodyFailException.java b/pigx-common/pigx-common-encrypt-api/src/main/java/com/pig4cloud/pigx/common/api/encrypt/exception/EncryptBodyFailException.java new file mode 100644 index 0000000..99bed8d --- /dev/null +++ b/pigx-common/pigx-common-encrypt-api/src/main/java/com/pig4cloud/pigx/common/api/encrypt/exception/EncryptBodyFailException.java @@ -0,0 +1,21 @@ +package com.pig4cloud.pigx.common.api.encrypt.exception; + +/** + *

+ * 加密数据失败异常 + *

+ * + * @author licoy.cn + * @version 2018/9/6 + */ +public class EncryptBodyFailException extends RuntimeException { + + public EncryptBodyFailException() { + super("Encrypted data failed. (加密数据失败)"); + } + + public EncryptBodyFailException(String message) { + super(message); + } + +} diff --git a/pigx-common/pigx-common-encrypt-api/src/main/java/com/pig4cloud/pigx/common/api/encrypt/exception/EncryptMethodNotFoundException.java b/pigx-common/pigx-common-encrypt-api/src/main/java/com/pig4cloud/pigx/common/api/encrypt/exception/EncryptMethodNotFoundException.java new file mode 100644 index 0000000..16440c3 --- /dev/null +++ b/pigx-common/pigx-common-encrypt-api/src/main/java/com/pig4cloud/pigx/common/api/encrypt/exception/EncryptMethodNotFoundException.java @@ -0,0 +1,17 @@ +package com.pig4cloud.pigx.common.api.encrypt.exception; + +/** + *

+ * 加密方式未找到或未定义异常 + *

+ * + * @author licoy.cn + * @version 2018/9/6 + */ +public class EncryptMethodNotFoundException extends RuntimeException { + + public EncryptMethodNotFoundException() { + super("Encryption method is not defined. (加密方式未定义)"); + } + +} diff --git a/pigx-common/pigx-common-encrypt-api/src/main/java/com/pig4cloud/pigx/common/api/encrypt/exception/KeyNotConfiguredException.java b/pigx-common/pigx-common-encrypt-api/src/main/java/com/pig4cloud/pigx/common/api/encrypt/exception/KeyNotConfiguredException.java new file mode 100644 index 0000000..cf6e1c9 --- /dev/null +++ b/pigx-common/pigx-common-encrypt-api/src/main/java/com/pig4cloud/pigx/common/api/encrypt/exception/KeyNotConfiguredException.java @@ -0,0 +1,18 @@ +package com.pig4cloud.pigx.common.api.encrypt.exception; + +/** + *

+ * 未配置KEY运行时异常 + *

+ * + * @author licoy.cn + * @author L.cm + * @version 2018/9/6 + */ +public class KeyNotConfiguredException extends RuntimeException { + + public KeyNotConfiguredException(String message) { + super(message); + } + +} diff --git a/pigx-common/pigx-common-encrypt-api/src/main/java/com/pig4cloud/pigx/common/api/encrypt/util/ApiCryptoUtil.java b/pigx-common/pigx-common-encrypt-api/src/main/java/com/pig4cloud/pigx/common/api/encrypt/util/ApiCryptoUtil.java new file mode 100644 index 0000000..f2f7c57 --- /dev/null +++ b/pigx-common/pigx-common-encrypt-api/src/main/java/com/pig4cloud/pigx/common/api/encrypt/util/ApiCryptoUtil.java @@ -0,0 +1,155 @@ +package com.pig4cloud.pigx.common.api.encrypt.util; + +import cn.hutool.core.util.HexUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.crypto.Mode; +import cn.hutool.crypto.Padding; +import cn.hutool.crypto.SecureUtil; +import cn.hutool.crypto.SmUtil; +import cn.hutool.crypto.asymmetric.KeyType; +import cn.hutool.crypto.symmetric.AES; +import com.pig4cloud.pigx.common.api.encrypt.annotation.decrypt.ApiDecrypt; +import com.pig4cloud.pigx.common.api.encrypt.annotation.encrypt.ApiEncrypt; +import com.pig4cloud.pigx.common.api.encrypt.bean.CryptoInfoBean; +import com.pig4cloud.pigx.common.api.encrypt.core.ISecretKeyResolver; +import com.pig4cloud.pigx.common.api.encrypt.enums.EncryptType; +import com.pig4cloud.pigx.common.api.encrypt.exception.EncryptBodyFailException; +import com.pig4cloud.pigx.common.api.encrypt.exception.EncryptMethodNotFoundException; +import com.pig4cloud.pigx.common.core.util.SpringContextHolder; +import com.pig4cloud.pigx.common.core.util.WebUtils; +import lombok.experimental.UtilityClass; +import org.springframework.core.MethodParameter; +import org.springframework.core.annotation.AnnotatedElementUtils; +import org.springframework.lang.Nullable; +import org.springframework.util.Assert; + +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; + +/** + *

+ * 辅助检测工具类 + *

+ * + * @author licoy.cn + * @author L.cm + * @version 2018/9/7 + */ +@UtilityClass +public class ApiCryptoUtil { + + /** + * 获取方法控制器上的加密注解信息 + * @param methodParameter 控制器方法 + * @return 加密注解信息 + */ + @Nullable + public static CryptoInfoBean getEncryptInfo(MethodParameter methodParameter) { + ApiEncrypt encryptBody = AnnotatedElementUtils.findMergedAnnotation(methodParameter.getMethod(), + ApiEncrypt.class); + if (encryptBody == null) { + return null; + } + return new CryptoInfoBean(encryptBody.value(), encryptBody.secretKey()); + } + + /** + * 获取方法控制器上的解密注解信息 + * @param methodParameter 控制器方法 + * @return 加密注解信息 + */ + @Nullable + public static CryptoInfoBean getDecryptInfo(MethodParameter methodParameter) { + ApiDecrypt decryptBody = AnnotatedElementUtils.findMergedAnnotation(methodParameter.getMethod(), + ApiDecrypt.class); + if (decryptBody == null) { + return null; + } + return new CryptoInfoBean(decryptBody.value(), decryptBody.secretKey()); + } + + /** + * 选择加密方式并进行加密 + * @param jsonData json 数据 + * @param infoBean 加密信息 + * @return 加密结果 + */ + public static String encryptData(byte[] jsonData, CryptoInfoBean infoBean) { + EncryptType type = infoBean.getType(); + if (type == null) { + throw new EncryptMethodNotFoundException(); + } + + String secretKey = infoBean.getSecretKey(); + if (StrUtil.isBlank(secretKey)) { + secretKey = SpringContextHolder.getBean(ISecretKeyResolver.class).getSecretKey(WebUtils.getRequest(), type); + } + Assert.hasText(secretKey, type + " key is not configured (未配置" + type + ")"); + + if (type == EncryptType.DES) { + + return SecureUtil.des(secretKey.getBytes(StandardCharsets.UTF_8)).encryptBase64(jsonData); + } + if (type == EncryptType.AES) { + // 构建前端对应解密AES 因子 + AES aes = new AES(Mode.CFB, Padding.NoPadding, new SecretKeySpec(secretKey.getBytes(), "AES"), + new IvParameterSpec(secretKey.getBytes())); + + return aes.encryptBase64(jsonData); + } + if (type == EncryptType.RSA) { + return SecureUtil.rsa(secretKey.getBytes(StandardCharsets.UTF_8), null).encryptBase64(jsonData, + KeyType.PrivateKey); + } + + if (type == EncryptType.SM4) { + return SmUtil.sm4(HexUtil.decodeHex(secretKey)).encryptHex(jsonData); + } + throw new EncryptBodyFailException(); + } + + /** + * 选择加密方式并进行解密 + * @param bodyData byte array + * @param infoBean 加密信息 + * @return 解密结果 + */ + public static byte[] decryptData(byte[] bodyData, CryptoInfoBean infoBean) { + EncryptType type = infoBean.getType(); + if (type == null) { + throw new EncryptMethodNotFoundException(); + } + + String secretKey = infoBean.getSecretKey(); + if (StrUtil.isBlank(secretKey)) { + secretKey = SpringContextHolder.getBean(ISecretKeyResolver.class).getSecretKey(WebUtils.getRequest(), type); + } + Assert.hasText(secretKey, type + " key is not configured (未配置" + type + ")"); + + if (type == EncryptType.AES) { + + AES aes = new AES(Mode.CFB, Padding.NoPadding, + new SecretKeySpec(secretKey.getBytes(StandardCharsets.UTF_8), "AES"), + new IvParameterSpec(secretKey.getBytes(StandardCharsets.UTF_8))); + return aes.decrypt(StrUtil.str(bodyData, StandardCharsets.UTF_8)); + + } + if (type == EncryptType.DES) { + return SecureUtil.des(secretKey.getBytes(StandardCharsets.UTF_8)).decrypt(bodyData); + } + if (type == EncryptType.RSA) { + return SecureUtil.rsa(secretKey.getBytes(StandardCharsets.UTF_8), null).decrypt(bodyData, + KeyType.PrivateKey); + } + + if (type == EncryptType.SM4) { + return SmUtil.sm4(HexUtil.decodeHex(secretKey)).decryptStr(StrUtil.str(bodyData, Charset.defaultCharset())) + .getBytes(); + } + + throw new EncryptMethodNotFoundException(); + } + +} diff --git a/pigx-common/pigx-common-encrypt-api/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/pigx-common/pigx-common-encrypt-api/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 0000000..98fdedd --- /dev/null +++ b/pigx-common/pigx-common-encrypt-api/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1 @@ +com.pig4cloud.pigx.common.api.encrypt.ApiEncryptAutoConfiguration diff --git a/pigx-common/pigx-common-excel/pom.xml b/pigx-common/pigx-common-excel/pom.xml new file mode 100644 index 0000000..b4c5b55 --- /dev/null +++ b/pigx-common/pigx-common-excel/pom.xml @@ -0,0 +1,57 @@ + + + 4.0.0 + + com.pig4cloud + pigx-common + 5.2.0 + + + pigx-common-excel + jar + + pigx excel 操作 + + + 1.21 + 3.1.1 + + + + + org.springframework.boot + spring-boot-starter-web + provided + + + org.springframework.boot + spring-boot-starter-validation + + + + org.springframework.boot + spring-boot-starter-aop + + + com.alibaba + easyexcel + ${easyexcel.version} + + + org.apache.commons + commons-compress + + + + + org.apache.commons + commons-compress + ${commons-compress} + + + jakarta.servlet + jakarta.servlet-api + + + diff --git a/pigx-common/pigx-common-excel/src/main/java/com/pig4cloud/pigx/common/excel/ExcelHandlerConfiguration.java b/pigx-common/pigx-common-excel/src/main/java/com/pig4cloud/pigx/common/excel/ExcelHandlerConfiguration.java new file mode 100644 index 0000000..9e14e7b --- /dev/null +++ b/pigx-common/pigx-common-excel/src/main/java/com/pig4cloud/pigx/common/excel/ExcelHandlerConfiguration.java @@ -0,0 +1,83 @@ +package com.pig4cloud.pigx.common.excel; + +import com.alibaba.excel.converters.Converter; +import com.pig4cloud.pigx.common.excel.aop.ResponseExcelReturnValueHandler; +import com.pig4cloud.pigx.common.excel.config.ExcelConfigProperties; +import com.pig4cloud.pigx.common.excel.enhance.DefaultWriterBuilderEnhancer; +import com.pig4cloud.pigx.common.excel.enhance.WriterBuilderEnhancer; +import com.pig4cloud.pigx.common.excel.handler.ManySheetWriteHandler; +import com.pig4cloud.pigx.common.excel.handler.SheetWriteHandler; +import com.pig4cloud.pigx.common.excel.handler.SingleSheetWriteHandler; +import com.pig4cloud.pigx.common.excel.head.I18nHeaderCellWriteHandler; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.ObjectProvider; +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.context.MessageSource; +import org.springframework.context.annotation.Bean; + +import java.util.List; + +/** + * @author Hccake 2020/10/28 + * @version 1.0 + */ +@RequiredArgsConstructor +public class ExcelHandlerConfiguration { + + private final ExcelConfigProperties configProperties; + + private final ObjectProvider>> converterProvider; + + /** + * ExcelBuild增强 + * @return DefaultWriterBuilderEnhancer 默认什么也不做的增强器 + */ + @Bean + @ConditionalOnMissingBean + public WriterBuilderEnhancer writerBuilderEnhancer() { + return new DefaultWriterBuilderEnhancer(); + } + + /** + * 单sheet 写入处理器 + */ + @Bean + @ConditionalOnMissingBean + public SingleSheetWriteHandler singleSheetWriteHandler() { + return new SingleSheetWriteHandler(configProperties, converterProvider, writerBuilderEnhancer()); + } + + /** + * 多sheet 写入处理器 + */ + @Bean + @ConditionalOnMissingBean + public ManySheetWriteHandler manySheetWriteHandler() { + return new ManySheetWriteHandler(configProperties, converterProvider, writerBuilderEnhancer()); + } + + /** + * 返回Excel文件的 response 处理器 + * @param sheetWriteHandlerList 页签写入处理器集合 + * @return ResponseExcelReturnValueHandler + */ + @Bean + @ConditionalOnMissingBean + public ResponseExcelReturnValueHandler responseExcelReturnValueHandler( + List sheetWriteHandlerList) { + return new ResponseExcelReturnValueHandler(sheetWriteHandlerList); + } + + /** + * excel 头的国际化处理器 + * @param messageSource 国际化源 + */ + @Bean + @ConditionalOnBean(MessageSource.class) + @ConditionalOnMissingBean + public I18nHeaderCellWriteHandler i18nHeaderCellWriteHandler(MessageSource messageSource) { + return new I18nHeaderCellWriteHandler(messageSource); + } + +} diff --git a/pigx-common/pigx-common-excel/src/main/java/com/pig4cloud/pigx/common/excel/ResponseExcelAutoConfiguration.java b/pigx-common/pigx-common-excel/src/main/java/com/pig4cloud/pigx/common/excel/ResponseExcelAutoConfiguration.java new file mode 100644 index 0000000..4f2e084 --- /dev/null +++ b/pigx-common/pigx-common-excel/src/main/java/com/pig4cloud/pigx/common/excel/ResponseExcelAutoConfiguration.java @@ -0,0 +1,87 @@ +package com.pig4cloud.pigx.common.excel; + +import com.pig4cloud.pigx.common.excel.aop.DynamicNameAspect; +import com.pig4cloud.pigx.common.excel.aop.RequestExcelArgumentResolver; +import com.pig4cloud.pigx.common.excel.aop.ResponseExcelReturnValueHandler; +import com.pig4cloud.pigx.common.excel.config.ExcelConfigProperties; +import com.pig4cloud.pigx.common.excel.processor.NameProcessor; +import com.pig4cloud.pigx.common.excel.processor.NameSpelExpressionProcessor; +import lombok.RequiredArgsConstructor; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Import; +import org.springframework.web.method.support.HandlerMethodArgumentResolver; +import org.springframework.web.method.support.HandlerMethodReturnValueHandler; +import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter; + +import javax.annotation.PostConstruct; +import java.util.ArrayList; +import java.util.List; + +/** + * @author lengleng + * @date 2020/3/29 + *

+ * 配置初始化 + */ +@AutoConfiguration +@RequiredArgsConstructor +@Import(ExcelHandlerConfiguration.class) +@EnableConfigurationProperties(ExcelConfigProperties.class) +public class ResponseExcelAutoConfiguration { + + private final RequestMappingHandlerAdapter requestMappingHandlerAdapter; + + private final ResponseExcelReturnValueHandler responseExcelReturnValueHandler; + + /** + * SPEL 解析处理器 + * @return NameProcessor excel名称解析器 + */ + @Bean + @ConditionalOnMissingBean + public NameProcessor nameProcessor() { + return new NameSpelExpressionProcessor(); + } + + /** + * Excel名称解析处理切面 + * @param nameProcessor SPEL 解析处理器 + * @return DynamicNameAspect + */ + @Bean + @ConditionalOnMissingBean + public DynamicNameAspect dynamicNameAspect(NameProcessor nameProcessor) { + return new DynamicNameAspect(nameProcessor); + } + + /** + * 追加 Excel返回值处理器 到 springmvc 中 + */ + @PostConstruct + public void setReturnValueHandlers() { + List returnValueHandlers = requestMappingHandlerAdapter + .getReturnValueHandlers(); + + List newHandlers = new ArrayList<>(); + newHandlers.add(responseExcelReturnValueHandler); + assert returnValueHandlers != null; + newHandlers.addAll(returnValueHandlers); + requestMappingHandlerAdapter.setReturnValueHandlers(newHandlers); + } + + /** + * 追加 Excel 请求处理器 到 springmvc 中 + */ + @PostConstruct + public void setRequestExcelArgumentResolver() { + List argumentResolvers = requestMappingHandlerAdapter.getArgumentResolvers(); + List resolverList = new ArrayList<>(); + resolverList.add(new RequestExcelArgumentResolver()); + resolverList.addAll(argumentResolvers); + requestMappingHandlerAdapter.setArgumentResolvers(resolverList); + } + +} diff --git a/pigx-common/pigx-common-excel/src/main/java/com/pig4cloud/pigx/common/excel/annotation/ExcelLine.java b/pigx-common/pigx-common-excel/src/main/java/com/pig4cloud/pigx/common/excel/annotation/ExcelLine.java new file mode 100644 index 0000000..ebd2785 --- /dev/null +++ b/pigx-common/pigx-common-excel/src/main/java/com/pig4cloud/pigx/common/excel/annotation/ExcelLine.java @@ -0,0 +1,10 @@ +package com.pig4cloud.pigx.common.excel.annotation; + +import java.lang.annotation.*; + +@Documented +@Target({ ElementType.FIELD }) +@Retention(RetentionPolicy.RUNTIME) +public @interface ExcelLine { + +} diff --git a/pigx-common/pigx-common-excel/src/main/java/com/pig4cloud/pigx/common/excel/annotation/RequestExcel.java b/pigx-common/pigx-common-excel/src/main/java/com/pig4cloud/pigx/common/excel/annotation/RequestExcel.java new file mode 100644 index 0000000..6372a56 --- /dev/null +++ b/pigx-common/pigx-common-excel/src/main/java/com/pig4cloud/pigx/common/excel/annotation/RequestExcel.java @@ -0,0 +1,43 @@ +package com.pig4cloud.pigx.common.excel.annotation; + +import com.pig4cloud.pigx.common.excel.handler.DefaultAnalysisEventListener; +import com.pig4cloud.pigx.common.excel.handler.ListAnalysisEventListener; + +import java.lang.annotation.*; + +/** + * 导入excel + * + * @author lengleng + * @author L.cm + * @date 2021/4/16 + */ +@Documented +@Target({ ElementType.PARAMETER }) +@Retention(RetentionPolicy.RUNTIME) +public @interface RequestExcel { + + /** + * 前端上传字段名称 file + */ + String fileName() default "file"; + + /** + * 读取的监听器类 + * @return readListener + */ + Class> readListener() default DefaultAnalysisEventListener.class; + + /** + * 是否跳过空行 + * @return 默认跳过 + */ + boolean ignoreEmptyRow() default false; + + /** + * 指定读取的标题行 + * @return + */ + int headRowNumber() default 1; + +} diff --git a/pigx-common/pigx-common-excel/src/main/java/com/pig4cloud/pigx/common/excel/annotation/ResponseExcel.java b/pigx-common/pigx-common-excel/src/main/java/com/pig4cloud/pigx/common/excel/annotation/ResponseExcel.java new file mode 100644 index 0000000..3be3686 --- /dev/null +++ b/pigx-common/pigx-common-excel/src/main/java/com/pig4cloud/pigx/common/excel/annotation/ResponseExcel.java @@ -0,0 +1,98 @@ +package com.pig4cloud.pigx.common.excel.annotation; + +import com.alibaba.excel.converters.Converter; +import com.alibaba.excel.support.ExcelTypeEnum; +import com.alibaba.excel.write.handler.WriteHandler; +import com.pig4cloud.pigx.common.excel.head.HeadGenerator; + +import java.lang.annotation.*; + +/** + * `@ResponseExcel 注解` + * + * @author lengleng + */ +@Documented +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +public @interface ResponseExcel { + + /** + * 文件名称 + * @return string + */ + String name() default ""; + + /** + * 文件类型 (xlsx xls) + * @return string + */ + ExcelTypeEnum suffix() default ExcelTypeEnum.XLSX; + + /** + * 文件密码 + * @return password + */ + String password() default ""; + + /** + * sheet 名称,支持多个 + * @return String[] + */ + Sheet[] sheets() default @Sheet(sheetName = "sheet1"); + + /** + * 内存操作 + * @return + */ + boolean inMemory() default false; + + /** + * excel 模板 + * @return String + */ + String template() default ""; + + /** + * + 包含字段 + * @return String[] + */ + String[] include() default {}; + + /** + * 排除字段 + * @return String[] + */ + String[] exclude() default {}; + + /** + * 拦截器,自定义样式等处理器 + * @return WriteHandler[] + */ + Class[] writeHandler() default {}; + + /** + * 转换器 + * @return Converter[] + */ + Class[] converter() default {}; + + /** + * 自定义Excel头生成器 + * @return HeadGenerator + */ + Class headGenerator() default HeadGenerator.class; + + /** + * excel 头信息国际化 + * @return boolean + */ + boolean i18nHeader() default false; + + /** + * 填充模式 + * @return + */ + boolean fill() default false; + +} diff --git a/pigx-common/pigx-common-excel/src/main/java/com/pig4cloud/pigx/common/excel/annotation/Sheet.java b/pigx-common/pigx-common-excel/src/main/java/com/pig4cloud/pigx/common/excel/annotation/Sheet.java new file mode 100644 index 0000000..29a4037 --- /dev/null +++ b/pigx-common/pigx-common-excel/src/main/java/com/pig4cloud/pigx/common/excel/annotation/Sheet.java @@ -0,0 +1,41 @@ +package com.pig4cloud.pigx.common.excel.annotation; + +import com.pig4cloud.pigx.common.excel.head.HeadGenerator; + +import java.lang.annotation.*; + +/** + * @author Yakir + * @Topic Sheet + * @Description + * @date 2021/4/29 15:03 + * @Version 1.0 + */ +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface Sheet { + + int sheetNo() default -1; + + /** + * sheet name + */ + String sheetName(); + + /** + * 包含字段 + */ + String[] includes() default {}; + + /** + * 排除字段 + */ + String[] excludes() default {}; + + /** + * 头生成器 + */ + Class headGenerateClass() default HeadGenerator.class; + +} diff --git a/pigx-common/pigx-common-excel/src/main/java/com/pig4cloud/pigx/common/excel/aop/DynamicNameAspect.java b/pigx-common/pigx-common-excel/src/main/java/com/pig4cloud/pigx/common/excel/aop/DynamicNameAspect.java new file mode 100644 index 0000000..20ae79d --- /dev/null +++ b/pigx-common/pigx-common-excel/src/main/java/com/pig4cloud/pigx/common/excel/aop/DynamicNameAspect.java @@ -0,0 +1,46 @@ +package com.pig4cloud.pigx.common.excel.aop; + +import com.pig4cloud.pigx.common.excel.annotation.ResponseExcel; +import com.pig4cloud.pigx.common.excel.processor.NameProcessor; +import lombok.RequiredArgsConstructor; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Before; +import org.aspectj.lang.reflect.MethodSignature; +import org.springframework.util.StringUtils; +import org.springframework.web.context.request.RequestAttributes; +import org.springframework.web.context.request.RequestContextHolder; + +import java.time.LocalDateTime; +import java.util.Objects; + +/** + * @author lengleng + * @date 2020/3/29 + */ +@Aspect +@RequiredArgsConstructor +public class DynamicNameAspect { + + public static final String EXCEL_NAME_KEY = "__EXCEL_NAME_KEY__"; + + private final NameProcessor processor; + + @Before("@annotation(excel)") + public void around(JoinPoint point, ResponseExcel excel) { + MethodSignature ms = (MethodSignature) point.getSignature(); + + String name = excel.name(); + // 当配置的 excel 名称为空时,取当前时间 + if (!StringUtils.hasText(name)) { + name = LocalDateTime.now().toString(); + } + else { + name = processor.doDetermineName(point.getArgs(), ms.getMethod(), excel.name()); + } + + RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); + Objects.requireNonNull(requestAttributes).setAttribute(EXCEL_NAME_KEY, name, RequestAttributes.SCOPE_REQUEST); + } + +} diff --git a/pigx-common/pigx-common-excel/src/main/java/com/pig4cloud/pigx/common/excel/aop/RequestExcelArgumentResolver.java b/pigx-common/pigx-common-excel/src/main/java/com/pig4cloud/pigx/common/excel/aop/RequestExcelArgumentResolver.java new file mode 100644 index 0000000..c572a54 --- /dev/null +++ b/pigx-common/pigx-common-excel/src/main/java/com/pig4cloud/pigx/common/excel/aop/RequestExcelArgumentResolver.java @@ -0,0 +1,89 @@ +package com.pig4cloud.pigx.common.excel.aop; + +import com.alibaba.excel.EasyExcel; +import com.pig4cloud.pigx.common.excel.annotation.RequestExcel; +import com.pig4cloud.pigx.common.excel.converters.*; +import com.pig4cloud.pigx.common.excel.handler.ListAnalysisEventListener; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; +import org.springframework.core.MethodParameter; +import org.springframework.core.ResolvableType; +import org.springframework.ui.ModelMap; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.WebDataBinder; +import org.springframework.web.bind.support.WebDataBinderFactory; +import org.springframework.web.context.request.NativeWebRequest; +import org.springframework.web.method.support.HandlerMethodArgumentResolver; +import org.springframework.web.method.support.ModelAndViewContainer; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.MultipartRequest; + +import javax.servlet.http.HttpServletRequest; +import java.io.InputStream; +import java.util.List; + +/** + * 上传excel 解析注解 + * + * @author lengleng + * @author L.cm + * @date 2021/4/16 + */ +@Slf4j +public class RequestExcelArgumentResolver implements HandlerMethodArgumentResolver { + + @Override + public boolean supportsParameter(MethodParameter parameter) { + return parameter.hasParameterAnnotation(RequestExcel.class); + } + + @Override + @SneakyThrows(Exception.class) + public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer modelAndViewContainer, + NativeWebRequest webRequest, WebDataBinderFactory webDataBinderFactory) { + Class parameterType = parameter.getParameterType(); + if (!parameterType.isAssignableFrom(List.class)) { + throw new IllegalArgumentException( + "Excel upload request resolver error, @RequestExcel parameter is not List " + parameterType); + } + + // 处理自定义 readListener + RequestExcel requestExcel = parameter.getParameterAnnotation(RequestExcel.class); + assert requestExcel != null; + Class> readListenerClass = requestExcel.readListener(); + ListAnalysisEventListener readListener = BeanUtils.instantiateClass(readListenerClass); + + // 获取请求文件流 + HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class); + assert request != null; + InputStream inputStream; + if (request instanceof MultipartRequest) { + MultipartFile file = ((MultipartRequest) request).getFile(requestExcel.fileName()); + assert file != null; + inputStream = file.getInputStream(); + } + else { + inputStream = request.getInputStream(); + } + + // 获取目标类型 + Class excelModelClass = ResolvableType.forMethodParameter(parameter).getGeneric(0).resolve(); + + // 这里需要指定读用哪个 class 去读,然后读取第一个 sheet 文件流会自动关闭 + EasyExcel.read(inputStream, excelModelClass, readListener).registerConverter(LocalDateStringConverter.INSTANCE) + .registerConverter(LocalTimeStringConverter.INSTANCE) + .registerConverter(LocalDateTimeStringConverter.INSTANCE) + .registerConverter(LongStringConverter.INSTANCE).registerConverter(StringArrayConverter.INSTANCE) + .ignoreEmptyRow(requestExcel.ignoreEmptyRow()).sheet().headRowNumber(requestExcel.headRowNumber()) + .doRead(); + + // 校验失败的数据处理 交给 BindResult + WebDataBinder dataBinder = webDataBinderFactory.createBinder(webRequest, readListener.getErrors(), "excel"); + ModelMap model = modelAndViewContainer.getModel(); + model.put(BindingResult.MODEL_KEY_PREFIX + "excel", dataBinder.getBindingResult()); + + return readListener.getList(); + } + +} diff --git a/pigx-common/pigx-common-excel/src/main/java/com/pig4cloud/pigx/common/excel/aop/ResponseExcelReturnValueHandler.java b/pigx-common/pigx-common-excel/src/main/java/com/pig4cloud/pigx/common/excel/aop/ResponseExcelReturnValueHandler.java new file mode 100644 index 0000000..6691738 --- /dev/null +++ b/pigx-common/pigx-common-excel/src/main/java/com/pig4cloud/pigx/common/excel/aop/ResponseExcelReturnValueHandler.java @@ -0,0 +1,58 @@ +package com.pig4cloud.pigx.common.excel.aop; + +import com.pig4cloud.pigx.common.excel.annotation.ResponseExcel; +import com.pig4cloud.pigx.common.excel.handler.SheetWriteHandler; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.MethodParameter; +import org.springframework.util.Assert; +import org.springframework.web.context.request.NativeWebRequest; +import org.springframework.web.method.support.HandlerMethodReturnValueHandler; +import org.springframework.web.method.support.ModelAndViewContainer; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * 处理@ResponseExcel 返回值 + * + * @author lengleng + */ +@Slf4j +@RequiredArgsConstructor +public class ResponseExcelReturnValueHandler implements HandlerMethodReturnValueHandler { + + private final List sheetWriteHandlerList; + + /** + * 只处理@ResponseExcel 声明的方法 + * @param parameter 方法签名 + * @return 是否处理 + */ + @Override + public boolean supportsReturnType(MethodParameter parameter) { + return parameter.getMethodAnnotation(ResponseExcel.class) != null; + } + + /** + * 处理逻辑 + * @param o 返回参数 + * @param parameter 方法签名 + * @param mavContainer 上下文容器 + * @param nativeWebRequest 上下文 + */ + @Override + public void handleReturnValue(Object o, MethodParameter parameter, ModelAndViewContainer mavContainer, + NativeWebRequest nativeWebRequest) { + /* check */ + HttpServletResponse response = nativeWebRequest.getNativeResponse(HttpServletResponse.class); + Assert.state(response != null, "No HttpServletResponse"); + ResponseExcel responseExcel = parameter.getMethodAnnotation(ResponseExcel.class); + Assert.state(responseExcel != null, "No @ResponseExcel"); + mavContainer.setRequestHandled(true); + + sheetWriteHandlerList.stream().filter(handler -> handler.support(o)).findFirst() + .ifPresent(handler -> handler.export(o, response, responseExcel)); + } + +} diff --git a/pigx-common/pigx-common-excel/src/main/java/com/pig4cloud/pigx/common/excel/config/ExcelConfigProperties.java b/pigx-common/pigx-common-excel/src/main/java/com/pig4cloud/pigx/common/excel/config/ExcelConfigProperties.java new file mode 100644 index 0000000..44aba3f --- /dev/null +++ b/pigx-common/pigx-common-excel/src/main/java/com/pig4cloud/pigx/common/excel/config/ExcelConfigProperties.java @@ -0,0 +1,21 @@ +package com.pig4cloud.pigx.common.excel.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; + +/** + * @author lengleng + * @date 2020/3/29 + */ +@Data +@ConfigurationProperties(prefix = ExcelConfigProperties.PREFIX) +public class ExcelConfigProperties { + + static final String PREFIX = "excel"; + + /** + * 模板路径 + */ + private String templatePath = "excel"; + +} diff --git a/pigx-common/pigx-common-excel/src/main/java/com/pig4cloud/pigx/common/excel/converters/LocalDateStringConverter.java b/pigx-common/pigx-common-excel/src/main/java/com/pig4cloud/pigx/common/excel/converters/LocalDateStringConverter.java new file mode 100644 index 0000000..2def4dc --- /dev/null +++ b/pigx-common/pigx-common-excel/src/main/java/com/pig4cloud/pigx/common/excel/converters/LocalDateStringConverter.java @@ -0,0 +1,62 @@ +package com.pig4cloud.pigx.common.excel.converters; + +import com.alibaba.excel.converters.Converter; +import com.alibaba.excel.enums.CellDataTypeEnum; +import com.alibaba.excel.metadata.GlobalConfiguration; +import com.alibaba.excel.metadata.data.ReadCellData; +import com.alibaba.excel.metadata.data.WriteCellData; +import com.alibaba.excel.metadata.property.ExcelContentProperty; + +import java.text.ParseException; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; + +/** + * LocalDate and string converter + * + * @author L.cm + */ +public enum LocalDateStringConverter implements Converter { + + /** + * 实例 + */ + INSTANCE; + + @Override + public Class supportJavaTypeKey() { + return LocalDate.class; + } + + @Override + public CellDataTypeEnum supportExcelTypeKey() { + return CellDataTypeEnum.STRING; + } + + @Override + public LocalDate convertToJavaData(ReadCellData cellData, ExcelContentProperty contentProperty, + GlobalConfiguration globalConfiguration) throws ParseException { + if (contentProperty == null || contentProperty.getDateTimeFormatProperty() == null) { + return LocalDate.parse(cellData.getStringValue()); + } + else { + DateTimeFormatter formatter = DateTimeFormatter + .ofPattern(contentProperty.getDateTimeFormatProperty().getFormat()); + return LocalDate.parse(cellData.getStringValue(), formatter); + } + } + + @Override + public WriteCellData convertToExcelData(LocalDate value, ExcelContentProperty contentProperty, + GlobalConfiguration globalConfiguration) { + DateTimeFormatter formatter; + if (contentProperty == null || contentProperty.getDateTimeFormatProperty() == null) { + formatter = DateTimeFormatter.ISO_LOCAL_DATE; + } + else { + formatter = DateTimeFormatter.ofPattern(contentProperty.getDateTimeFormatProperty().getFormat()); + } + return new WriteCellData<>(value.format(formatter)); + } + +} diff --git a/pigx-common/pigx-common-excel/src/main/java/com/pig4cloud/pigx/common/excel/converters/LocalDateTimeStringConverter.java b/pigx-common/pigx-common-excel/src/main/java/com/pig4cloud/pigx/common/excel/converters/LocalDateTimeStringConverter.java new file mode 100644 index 0000000..3dcaeb3 --- /dev/null +++ b/pigx-common/pigx-common-excel/src/main/java/com/pig4cloud/pigx/common/excel/converters/LocalDateTimeStringConverter.java @@ -0,0 +1,94 @@ +package com.pig4cloud.pigx.common.excel.converters; + +import com.alibaba.excel.converters.Converter; +import com.alibaba.excel.enums.CellDataTypeEnum; +import com.alibaba.excel.metadata.GlobalConfiguration; +import com.alibaba.excel.metadata.data.ReadCellData; +import com.alibaba.excel.metadata.data.WriteCellData; +import com.alibaba.excel.metadata.property.ExcelContentProperty; +import com.alibaba.excel.util.DateUtils; + +import java.text.ParseException; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +/** + * LocalDateTime and string converter + * + * @author L.cm + */ +public enum LocalDateTimeStringConverter implements Converter { + + /** + * 实例 + */ + INSTANCE; + + private static final String MINUS = "-"; + + @Override + public Class supportJavaTypeKey() { + return LocalDateTime.class; + } + + @Override + public CellDataTypeEnum supportExcelTypeKey() { + return CellDataTypeEnum.STRING; + } + + @Override + public LocalDateTime convertToJavaData(ReadCellData cellData, ExcelContentProperty contentProperty, + GlobalConfiguration globalConfiguration) throws ParseException { + String stringValue = cellData.getStringValue(); + String pattern; + if (contentProperty == null || contentProperty.getDateTimeFormatProperty() == null) { + pattern = switchDateFormat(stringValue); + } + else { + pattern = contentProperty.getDateTimeFormatProperty().getFormat(); + } + DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern); + return LocalDateTime.parse(cellData.getStringValue(), formatter); + } + + @Override + public WriteCellData convertToExcelData(LocalDateTime value, ExcelContentProperty contentProperty, + GlobalConfiguration globalConfiguration) { + String pattern; + if (contentProperty == null || contentProperty.getDateTimeFormatProperty() == null) { + pattern = DateUtils.DATE_FORMAT_19; + } + else { + pattern = contentProperty.getDateTimeFormatProperty().getFormat(); + } + DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern); + return new WriteCellData<>(value.format(formatter)); + } + + /** + * switch date format + * @param dateString dateString + * @return pattern + */ + private static String switchDateFormat(String dateString) { + int length = dateString.length(); + switch (length) { + case 19: + if (dateString.contains(MINUS)) { + return DateUtils.DATE_FORMAT_19; + } + else { + return DateUtils.DATE_FORMAT_19_FORWARD_SLASH; + } + case 17: + return DateUtils.DATE_FORMAT_17; + case 14: + return DateUtils.DATE_FORMAT_14; + case 10: + return DateUtils.DATE_FORMAT_10; + default: + throw new IllegalArgumentException("can not find date format for:" + dateString); + } + } + +} diff --git a/pigx-common/pigx-common-excel/src/main/java/com/pig4cloud/pigx/common/excel/converters/LocalTimeStringConverter.java b/pigx-common/pigx-common-excel/src/main/java/com/pig4cloud/pigx/common/excel/converters/LocalTimeStringConverter.java new file mode 100644 index 0000000..7d8239e --- /dev/null +++ b/pigx-common/pigx-common-excel/src/main/java/com/pig4cloud/pigx/common/excel/converters/LocalTimeStringConverter.java @@ -0,0 +1,62 @@ +package com.pig4cloud.pigx.common.excel.converters; + +import com.alibaba.excel.converters.Converter; +import com.alibaba.excel.enums.CellDataTypeEnum; +import com.alibaba.excel.metadata.GlobalConfiguration; +import com.alibaba.excel.metadata.data.ReadCellData; +import com.alibaba.excel.metadata.data.WriteCellData; +import com.alibaba.excel.metadata.property.ExcelContentProperty; + +import java.text.ParseException; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; + +/** + * LocalDate and string converter + * + * @author L.cm + */ +public enum LocalTimeStringConverter implements Converter { + + /** + * 实例 + */ + INSTANCE; + + @Override + public Class supportJavaTypeKey() { + return LocalTime.class; + } + + @Override + public CellDataTypeEnum supportExcelTypeKey() { + return CellDataTypeEnum.STRING; + } + + @Override + public LocalTime convertToJavaData(ReadCellData cellData, ExcelContentProperty contentProperty, + GlobalConfiguration globalConfiguration) throws ParseException { + if (contentProperty == null || contentProperty.getDateTimeFormatProperty() == null) { + return LocalTime.parse(cellData.getStringValue()); + } + else { + DateTimeFormatter formatter = DateTimeFormatter + .ofPattern(contentProperty.getDateTimeFormatProperty().getFormat()); + return LocalTime.parse(cellData.getStringValue(), formatter); + } + } + + @Override + public WriteCellData convertToExcelData(LocalTime value, ExcelContentProperty contentProperty, + GlobalConfiguration globalConfiguration) { + DateTimeFormatter formatter; + if (contentProperty == null || contentProperty.getDateTimeFormatProperty() == null) { + formatter = DateTimeFormatter.ISO_LOCAL_TIME; + } + else { + formatter = DateTimeFormatter.ofPattern(contentProperty.getDateTimeFormatProperty().getFormat()); + } + return new WriteCellData<>(value.format(formatter)); + } + +} diff --git a/pigx-common/pigx-common-excel/src/main/java/com/pig4cloud/pigx/common/excel/converters/LongStringConverter.java b/pigx-common/pigx-common-excel/src/main/java/com/pig4cloud/pigx/common/excel/converters/LongStringConverter.java new file mode 100644 index 0000000..442dad0 --- /dev/null +++ b/pigx-common/pigx-common-excel/src/main/java/com/pig4cloud/pigx/common/excel/converters/LongStringConverter.java @@ -0,0 +1,46 @@ +package com.pig4cloud.pigx.common.excel.converters; + +import com.alibaba.excel.converters.Converter; +import com.alibaba.excel.enums.CellDataTypeEnum; +import com.alibaba.excel.metadata.GlobalConfiguration; +import com.alibaba.excel.metadata.data.ReadCellData; +import com.alibaba.excel.metadata.data.WriteCellData; +import com.alibaba.excel.metadata.property.ExcelContentProperty; + +import java.text.ParseException; + +/** + * Long and string converter + * + * @author L.cm + */ +public enum LongStringConverter implements Converter { + + /** + * 实例 + */ + INSTANCE; + + @Override + public Class supportJavaTypeKey() { + return Long.class; + } + + @Override + public CellDataTypeEnum supportExcelTypeKey() { + return CellDataTypeEnum.STRING; + } + + @Override + public Long convertToJavaData(ReadCellData cellData, ExcelContentProperty contentProperty, + GlobalConfiguration globalConfiguration) throws ParseException { + return Long.parseLong(cellData.getStringValue()); + } + + @Override + public WriteCellData convertToExcelData(Long value, ExcelContentProperty contentProperty, + GlobalConfiguration globalConfiguration) { + return new WriteCellData<>(String.valueOf(value)); + } + +} diff --git a/pigx-common/pigx-common-excel/src/main/java/com/pig4cloud/pigx/common/excel/converters/StringArrayConverter.java b/pigx-common/pigx-common-excel/src/main/java/com/pig4cloud/pigx/common/excel/converters/StringArrayConverter.java new file mode 100644 index 0000000..7987a4d --- /dev/null +++ b/pigx-common/pigx-common-excel/src/main/java/com/pig4cloud/pigx/common/excel/converters/StringArrayConverter.java @@ -0,0 +1,48 @@ +package com.pig4cloud.pigx.common.excel.converters; + +import com.alibaba.excel.converters.Converter; +import com.alibaba.excel.enums.CellDataTypeEnum; +import com.alibaba.excel.metadata.GlobalConfiguration; +import com.alibaba.excel.metadata.data.ReadCellData; +import com.alibaba.excel.metadata.data.WriteCellData; +import com.alibaba.excel.metadata.property.ExcelContentProperty; + +import java.text.ParseException; +import java.util.Arrays; +import java.util.stream.Collectors; + +/** + * LocalDate and string converter + * + * @author L.cm + */ +public enum StringArrayConverter implements Converter { + + /** + * 实例 + */ + INSTANCE; + + @Override + public Class supportJavaTypeKey() { + return String[].class; + } + + @Override + public CellDataTypeEnum supportExcelTypeKey() { + return CellDataTypeEnum.STRING; + } + + @Override + public String[] convertToJavaData(ReadCellData cellData, ExcelContentProperty contentProperty, + GlobalConfiguration globalConfiguration) throws ParseException { + return cellData.getStringValue().split(","); + } + + @Override + public WriteCellData convertToExcelData(String[] value, ExcelContentProperty contentProperty, + GlobalConfiguration globalConfiguration) { + return new WriteCellData<>(Arrays.stream(value).collect(Collectors.joining())); + } + +} diff --git a/pigx-common/pigx-common-excel/src/main/java/com/pig4cloud/pigx/common/excel/enhance/DefaultWriterBuilderEnhancer.java b/pigx-common/pigx-common-excel/src/main/java/com/pig4cloud/pigx/common/excel/enhance/DefaultWriterBuilderEnhancer.java new file mode 100644 index 0000000..6087187 --- /dev/null +++ b/pigx-common/pigx-common-excel/src/main/java/com/pig4cloud/pigx/common/excel/enhance/DefaultWriterBuilderEnhancer.java @@ -0,0 +1,48 @@ +package com.pig4cloud.pigx.common.excel.enhance; + +import com.alibaba.excel.write.builder.ExcelWriterBuilder; +import com.alibaba.excel.write.builder.ExcelWriterSheetBuilder; +import com.pig4cloud.pigx.common.excel.annotation.ResponseExcel; +import com.pig4cloud.pigx.common.excel.head.HeadGenerator; + +import javax.servlet.http.HttpServletResponse; + +/** + * @author Hccake 2020/12/18 + * @version 1.0 + */ +public class DefaultWriterBuilderEnhancer implements WriterBuilderEnhancer { + + /** + * ExcelWriterBuilder 增强 + * @param writerBuilder ExcelWriterBuilder + * @param response HttpServletResponse + * @param responseExcel ResponseExcel + * @param templatePath 模板地址 + * @return ExcelWriterBuilder + */ + @Override + public ExcelWriterBuilder enhanceExcel(ExcelWriterBuilder writerBuilder, HttpServletResponse response, + ResponseExcel responseExcel, String templatePath) { + // doNothing + return writerBuilder; + } + + /** + * ExcelWriterSheetBuilder 增强 + * @param writerSheetBuilder ExcelWriterSheetBuilder + * @param sheetNo sheet角标 + * @param sheetName sheet名,有模板时为空 + * @param dataClass 当前写入的数据所属类 + * @param template 模板文件 + * @param headEnhancerClass 当前指定的自定义头处理器 + * @return ExcelWriterSheetBuilder + */ + @Override + public ExcelWriterSheetBuilder enhanceSheet(ExcelWriterSheetBuilder writerSheetBuilder, Integer sheetNo, + String sheetName, Class dataClass, String template, Class headEnhancerClass) { + // doNothing + return writerSheetBuilder; + } + +} diff --git a/pigx-common/pigx-common-excel/src/main/java/com/pig4cloud/pigx/common/excel/enhance/WriterBuilderEnhancer.java b/pigx-common/pigx-common-excel/src/main/java/com/pig4cloud/pigx/common/excel/enhance/WriterBuilderEnhancer.java new file mode 100644 index 0000000..dbb7109 --- /dev/null +++ b/pigx-common/pigx-common-excel/src/main/java/com/pig4cloud/pigx/common/excel/enhance/WriterBuilderEnhancer.java @@ -0,0 +1,42 @@ +package com.pig4cloud.pigx.common.excel.enhance; + +import com.alibaba.excel.write.builder.ExcelWriterBuilder; +import com.alibaba.excel.write.builder.ExcelWriterSheetBuilder; +import com.pig4cloud.pigx.common.excel.annotation.ResponseExcel; +import com.pig4cloud.pigx.common.excel.head.HeadGenerator; + +import javax.servlet.http.HttpServletResponse; + +/** + * ExcelWriterBuilder 增强 + * + * @author Hccake 2020/12/18 + * @version 1.0 + */ +public interface WriterBuilderEnhancer { + + /** + * ExcelWriterBuilder 增强 + * @param writerBuilder ExcelWriterBuilder + * @param response HttpServletResponse + * @param responseExcel ResponseExcel + * @param templatePath 模板地址 + * @return ExcelWriterBuilder + */ + ExcelWriterBuilder enhanceExcel(ExcelWriterBuilder writerBuilder, HttpServletResponse response, + ResponseExcel responseExcel, String templatePath); + + /** + * ExcelWriterSheetBuilder 增强 + * @param writerSheetBuilder ExcelWriterSheetBuilder + * @param sheetNo sheet角标 + * @param sheetName sheet名,有模板时为空 + * @param dataClass 当前写入的数据所属类 + * @param template 模板文件 + * @param headEnhancerClass 当前指定的自定义头处理器 + * @return ExcelWriterSheetBuilder + */ + ExcelWriterSheetBuilder enhanceSheet(ExcelWriterSheetBuilder writerSheetBuilder, Integer sheetNo, String sheetName, + Class dataClass, String template, Class headEnhancerClass); + +} diff --git a/pigx-common/pigx-common-excel/src/main/java/com/pig4cloud/pigx/common/excel/handler/AbstractSheetWriteHandler.java b/pigx-common/pigx-common-excel/src/main/java/com/pig4cloud/pigx/common/excel/handler/AbstractSheetWriteHandler.java new file mode 100644 index 0000000..923b795 --- /dev/null +++ b/pigx-common/pigx-common-excel/src/main/java/com/pig4cloud/pigx/common/excel/handler/AbstractSheetWriteHandler.java @@ -0,0 +1,234 @@ +package com.pig4cloud.pigx.common.excel.handler; + +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.ExcelWriter; +import com.alibaba.excel.converters.Converter; +import com.alibaba.excel.write.builder.ExcelWriterBuilder; +import com.alibaba.excel.write.builder.ExcelWriterSheetBuilder; +import com.alibaba.excel.write.handler.WriteHandler; +import com.alibaba.excel.write.metadata.WriteSheet; +import com.pig4cloud.pigx.common.excel.annotation.ResponseExcel; +import com.pig4cloud.pigx.common.excel.annotation.Sheet; +import com.pig4cloud.pigx.common.excel.aop.DynamicNameAspect; +import com.pig4cloud.pigx.common.excel.config.ExcelConfigProperties; +import com.pig4cloud.pigx.common.excel.converters.*; +import com.pig4cloud.pigx.common.excel.enhance.WriterBuilderEnhancer; +import com.pig4cloud.pigx.common.excel.head.HeadGenerator; +import com.pig4cloud.pigx.common.excel.head.HeadMeta; +import com.pig4cloud.pigx.common.excel.head.I18nHeaderCellWriteHandler; +import com.pig4cloud.pigx.common.excel.kit.ExcelException; +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import lombok.Setter; +import lombok.SneakyThrows; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.ObjectProvider; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.core.io.ClassPathResource; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.http.MediaTypeFactory; +import org.springframework.util.Assert; +import org.springframework.util.StringUtils; +import org.springframework.web.context.request.RequestAttributes; +import org.springframework.web.context.request.RequestContextHolder; + +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.UnsupportedEncodingException; +import java.lang.reflect.Modifier; +import java.net.URLEncoder; +import java.util.Arrays; +import java.util.List; +import java.util.Objects; +import java.util.UUID; + +/** + * @author lengleng + * @author L.cm + * @date 2020/3/31 + */ +@RequiredArgsConstructor +public abstract class AbstractSheetWriteHandler implements SheetWriteHandler, ApplicationContextAware { + + private final ExcelConfigProperties configProperties; + + private final ObjectProvider>> converterProvider; + + private final WriterBuilderEnhancer excelWriterBuilderEnhance; + + private ApplicationContext applicationContext; + + @Getter + @Setter + @Autowired(required = false) + private I18nHeaderCellWriteHandler i18nHeaderCellWriteHandler; + + @Override + public void check(ResponseExcel responseExcel) { + if (responseExcel.sheets().length == 0) { + throw new ExcelException("@ResponseExcel sheet 配置不合法"); + } + } + + @Override + @SneakyThrows(UnsupportedEncodingException.class) + public void export(Object o, HttpServletResponse response, ResponseExcel responseExcel) { + check(responseExcel); + RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); + String name = (String) Objects.requireNonNull(requestAttributes).getAttribute(DynamicNameAspect.EXCEL_NAME_KEY, + RequestAttributes.SCOPE_REQUEST); + if (name == null) { + name = UUID.randomUUID().toString(); + } + String fileName = String.format("%s%s", URLEncoder.encode(name, "UTF-8"), responseExcel.suffix().getValue()); + // 根据实际的文件类型找到对应的 contentType + String contentType = MediaTypeFactory.getMediaType(fileName).map(MediaType::toString) + .orElse("application/vnd.ms-excel"); + response.setContentType(contentType); + response.setCharacterEncoding("utf-8"); + response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename*=utf-8''" + fileName); + write(o, response, responseExcel); + } + + /** + * 通用的获取ExcelWriter方法 + * @param response HttpServletResponse + * @param responseExcel ResponseExcel注解 + * @return ExcelWriter + */ + @SneakyThrows(IOException.class) + public ExcelWriter getExcelWriter(HttpServletResponse response, ResponseExcel responseExcel) { + ExcelWriterBuilder writerBuilder = EasyExcel.write(response.getOutputStream()) + .registerConverter(LocalTimeStringConverter.INSTANCE) + .registerConverter(LocalDateStringConverter.INSTANCE) + .registerConverter(LocalDateTimeStringConverter.INSTANCE) + .registerConverter(LongStringConverter.INSTANCE).registerConverter(StringArrayConverter.INSTANCE) + .autoCloseStream(true).excelType(responseExcel.suffix()).inMemory(responseExcel.inMemory()); + + if (StringUtils.hasText(responseExcel.password())) { + writerBuilder.password(responseExcel.password()); + } + + if (responseExcel.include().length != 0) { + writerBuilder.includeColumnFieldNames(Arrays.asList(responseExcel.include())); + } + + if (responseExcel.exclude().length != 0) { + writerBuilder.excludeColumnFieldNames(Arrays.asList(responseExcel.exclude())); + } + + for (Class clazz : responseExcel.writeHandler()) { + writerBuilder.registerWriteHandler(BeanUtils.instantiateClass(clazz)); + } + + // 开启国际化头信息处理 + if (responseExcel.i18nHeader() && i18nHeaderCellWriteHandler != null) { + writerBuilder.registerWriteHandler(i18nHeaderCellWriteHandler); + } + + // 自定义注入的转换器 + registerCustomConverter(writerBuilder); + + for (Class clazz : responseExcel.converter()) { + writerBuilder.registerConverter(BeanUtils.instantiateClass(clazz)); + } + + String templatePath = configProperties.getTemplatePath(); + if (StringUtils.hasText(responseExcel.template())) { + ClassPathResource classPathResource = new ClassPathResource( + templatePath + File.separator + responseExcel.template()); + InputStream inputStream = classPathResource.getInputStream(); + writerBuilder.withTemplate(inputStream); + } + + writerBuilder = excelWriterBuilderEnhance.enhanceExcel(writerBuilder, response, responseExcel, templatePath); + + return writerBuilder.build(); + } + + /** + * 自定义注入转换器 如果有需要,子类自己重写 + * @param builder ExcelWriterBuilder + */ + public void registerCustomConverter(ExcelWriterBuilder builder) { + converterProvider.ifAvailable(converters -> converters.forEach(builder::registerConverter)); + } + + /** + * 获取 WriteSheet 对象 + * @param sheet sheet annotation info + * @param dataClass 数据类型 + * @param template 模板 + * @param bookHeadEnhancerClass 自定义头处理器 + * @return WriteSheet + */ + public WriteSheet sheet(Sheet sheet, Class dataClass, String template, + Class bookHeadEnhancerClass) { + + // Sheet 编号和名称 + Integer sheetNo = sheet.sheetNo() >= 0 ? sheet.sheetNo() : null; + String sheetName = sheet.sheetName(); + + // 是否模板写入 + ExcelWriterSheetBuilder writerSheetBuilder = StringUtils.hasText(template) ? EasyExcel.writerSheet(sheetNo) + : EasyExcel.writerSheet(sheetNo, sheetName); + + // 头信息增强 1. 优先使用 sheet 指定的头信息增强 2. 其次使用 @ResponseExcel 中定义的全局头信息增强 + Class headGenerateClass = null; + if (isNotInterface(sheet.headGenerateClass())) { + headGenerateClass = sheet.headGenerateClass(); + } + else if (isNotInterface(bookHeadEnhancerClass)) { + headGenerateClass = bookHeadEnhancerClass; + } + // 定义头信息增强则使用其生成头信息,否则使用 dataClass 来自动获取 + if (headGenerateClass != null) { + fillCustomHeadInfo(dataClass, bookHeadEnhancerClass, writerSheetBuilder); + } + else if (dataClass != null) { + writerSheetBuilder.head(dataClass); + if (sheet.excludes().length > 0) { + writerSheetBuilder.excludeColumnFieldNames(Arrays.asList(sheet.excludes())); + } + if (sheet.includes().length > 0) { + writerSheetBuilder.excludeColumnFieldNames(Arrays.asList(sheet.includes())); + } + } + + // sheetBuilder 增强 + writerSheetBuilder = excelWriterBuilderEnhance.enhanceSheet(writerSheetBuilder, sheetNo, sheetName, dataClass, + template, headGenerateClass); + + return writerSheetBuilder.build(); + } + + private void fillCustomHeadInfo(Class dataClass, Class headEnhancerClass, + ExcelWriterSheetBuilder writerSheetBuilder) { + HeadGenerator headGenerator = this.applicationContext.getBean(headEnhancerClass); + Assert.notNull(headGenerator, "The header generated bean does not exist."); + HeadMeta head = headGenerator.head(dataClass); + writerSheetBuilder.head(head.getHead()); + writerSheetBuilder.excludeColumnFieldNames(head.getIgnoreHeadFields()); + } + + /** + * 是否为Null Head Generator + * @param headGeneratorClass 头生成器类型 + * @return true 已指定 false 未指定(默认值) + */ + private boolean isNotInterface(Class headGeneratorClass) { + return !Modifier.isInterface(headGeneratorClass.getModifiers()); + } + + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + this.applicationContext = applicationContext; + } + +} diff --git a/pigx-common/pigx-common-excel/src/main/java/com/pig4cloud/pigx/common/excel/handler/DefaultAnalysisEventListener.java b/pigx-common/pigx-common-excel/src/main/java/com/pig4cloud/pigx/common/excel/handler/DefaultAnalysisEventListener.java new file mode 100644 index 0000000..112c5dc --- /dev/null +++ b/pigx-common/pigx-common-excel/src/main/java/com/pig4cloud/pigx/common/excel/handler/DefaultAnalysisEventListener.java @@ -0,0 +1,74 @@ +package com.pig4cloud.pigx.common.excel.handler; + +import com.alibaba.excel.context.AnalysisContext; +import com.pig4cloud.pigx.common.excel.annotation.ExcelLine; +import com.pig4cloud.pigx.common.excel.kit.Validators; +import com.pig4cloud.pigx.common.excel.vo.ErrorMessage; +import lombok.extern.slf4j.Slf4j; + +import javax.validation.ConstraintViolation; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * 默认的 AnalysisEventListener + * + * @author lengleng + * @author L.cm + * @date 2021/4/16 + */ +@Slf4j +public class DefaultAnalysisEventListener extends ListAnalysisEventListener { + + private final List list = new ArrayList<>(); + + private final List errorMessageList = new ArrayList<>(); + + private Long lineNum = 1L; + + @Override + public void invoke(Object o, AnalysisContext analysisContext) { + lineNum++; + + Set> violations = Validators.validate(o); + if (!violations.isEmpty()) { + Set messageSet = violations.stream().map(ConstraintViolation::getMessage) + .collect(Collectors.toSet()); + errorMessageList.add(new ErrorMessage(lineNum, messageSet)); + } + else { + Field[] fields = o.getClass().getDeclaredFields(); + for (Field field : fields) { + if (field.isAnnotationPresent(ExcelLine.class) && field.getType() == Long.class) { + try { + field.setAccessible(true); + field.set(o, lineNum); + } + catch (IllegalAccessException e) { + e.printStackTrace(); + } + } + } + list.add(o); + } + } + + @Override + public void doAfterAllAnalysed(AnalysisContext analysisContext) { + log.debug("Excel read analysed"); + } + + @Override + public List getList() { + return list; + } + + @Override + public List getErrors() { + return errorMessageList; + } + +} diff --git a/pigx-common/pigx-common-excel/src/main/java/com/pig4cloud/pigx/common/excel/handler/ListAnalysisEventListener.java b/pigx-common/pigx-common-excel/src/main/java/com/pig4cloud/pigx/common/excel/handler/ListAnalysisEventListener.java new file mode 100644 index 0000000..6df549f --- /dev/null +++ b/pigx-common/pigx-common-excel/src/main/java/com/pig4cloud/pigx/common/excel/handler/ListAnalysisEventListener.java @@ -0,0 +1,27 @@ +package com.pig4cloud.pigx.common.excel.handler; + +import com.alibaba.excel.event.AnalysisEventListener; +import com.pig4cloud.pigx.common.excel.vo.ErrorMessage; + +import java.util.List; + +/** + * list analysis EventListener + * + * @author L.cm + */ +public abstract class ListAnalysisEventListener extends AnalysisEventListener { + + /** + * 获取 excel 解析的对象列表 + * @return 集合 + */ + public abstract List getList(); + + /** + * 获取异常校验结果 + * @return 集合 + */ + public abstract List getErrors(); + +} diff --git a/pigx-common/pigx-common-excel/src/main/java/com/pig4cloud/pigx/common/excel/handler/ManySheetWriteHandler.java b/pigx-common/pigx-common-excel/src/main/java/com/pig4cloud/pigx/common/excel/handler/ManySheetWriteHandler.java new file mode 100644 index 0000000..f7c4cc8 --- /dev/null +++ b/pigx-common/pigx-common-excel/src/main/java/com/pig4cloud/pigx/common/excel/handler/ManySheetWriteHandler.java @@ -0,0 +1,78 @@ +package com.pig4cloud.pigx.common.excel.handler; + +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.ExcelWriter; +import com.alibaba.excel.converters.Converter; +import com.alibaba.excel.write.metadata.WriteSheet; +import com.pig4cloud.pigx.common.excel.annotation.ResponseExcel; +import com.pig4cloud.pigx.common.excel.annotation.Sheet; +import com.pig4cloud.pigx.common.excel.config.ExcelConfigProperties; +import com.pig4cloud.pigx.common.excel.enhance.WriterBuilderEnhancer; +import com.pig4cloud.pigx.common.excel.kit.ExcelException; +import org.springframework.beans.factory.ObjectProvider; +import org.springframework.util.CollectionUtils; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * @author lengleng + * @author L.cm + * @date 2020/3/29 + */ +public class ManySheetWriteHandler extends AbstractSheetWriteHandler { + + public ManySheetWriteHandler(ExcelConfigProperties configProperties, + ObjectProvider>> converterProvider, WriterBuilderEnhancer excelWriterBuilderEnhance) { + super(configProperties, converterProvider, excelWriterBuilderEnhance); + } + + /** + * 当且仅当List不为空且List中的元素也是List 才返回true + * @param obj 返回对象 + * @return boolean + */ + @Override + public boolean support(Object obj) { + if (obj instanceof List) { + List objList = (List) obj; + return !objList.isEmpty() && objList.get(0) instanceof List; + } + else { + throw new ExcelException("@ResponseExcel 返回值必须为List类型"); + } + } + + @Override + public void write(Object obj, HttpServletResponse response, ResponseExcel responseExcel) { + List objList = (List) obj; + ExcelWriter excelWriter = getExcelWriter(response, responseExcel); + + Sheet[] sheets = responseExcel.sheets(); + WriteSheet sheet; + for (int i = 0; i < sheets.length; i++) { + List eleList = (List) objList.get(i); + + if (CollectionUtils.isEmpty(eleList)) { + sheet = EasyExcel.writerSheet(responseExcel.sheets()[i].sheetName()).build(); + } + else { + // 有模板则不指定sheet名 + Class dataClass = eleList.get(0).getClass(); + sheet = this.sheet(responseExcel.sheets()[i], dataClass, responseExcel.template(), + responseExcel.headGenerator()); + } + + // 填充 sheet + if (responseExcel.fill()) { + excelWriter.fill(eleList, sheet); + } + else { + // 写入sheet + excelWriter.write(eleList, sheet); + } + } + excelWriter.finish(); + } + +} diff --git a/pigx-common/pigx-common-excel/src/main/java/com/pig4cloud/pigx/common/excel/handler/SheetWriteHandler.java b/pigx-common/pigx-common-excel/src/main/java/com/pig4cloud/pigx/common/excel/handler/SheetWriteHandler.java new file mode 100644 index 0000000..d5d1e06 --- /dev/null +++ b/pigx-common/pigx-common-excel/src/main/java/com/pig4cloud/pigx/common/excel/handler/SheetWriteHandler.java @@ -0,0 +1,44 @@ +package com.pig4cloud.pigx.common.excel.handler; + +import com.pig4cloud.pigx.common.excel.annotation.ResponseExcel; + +import javax.servlet.http.HttpServletResponse; + +/** + * @author lengleng + * @date 2020/3/29 + *

+ * sheet 写出处理器 + */ +public interface SheetWriteHandler { + + /** + * 是否支持 + * @param obj + * @return + */ + boolean support(Object obj); + + /** + * 校验 + * @param responseExcel 注解 + */ + void check(ResponseExcel responseExcel); + + /** + * 返回的对象 + * @param o obj + * @param response 输出对象 + * @param responseExcel 注解 + */ + void export(Object o, HttpServletResponse response, ResponseExcel responseExcel); + + /** + * 写成对象 + * @param o obj + * @param response 输出对象 + * @param responseExcel 注解 + */ + void write(Object o, HttpServletResponse response, ResponseExcel responseExcel); + +} diff --git a/pigx-common/pigx-common-excel/src/main/java/com/pig4cloud/pigx/common/excel/handler/SingleSheetWriteHandler.java b/pigx-common/pigx-common-excel/src/main/java/com/pig4cloud/pigx/common/excel/handler/SingleSheetWriteHandler.java new file mode 100644 index 0000000..0ba6980 --- /dev/null +++ b/pigx-common/pigx-common-excel/src/main/java/com/pig4cloud/pigx/common/excel/handler/SingleSheetWriteHandler.java @@ -0,0 +1,74 @@ +package com.pig4cloud.pigx.common.excel.handler; + +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.ExcelWriter; +import com.alibaba.excel.converters.Converter; +import com.alibaba.excel.write.metadata.WriteSheet; +import com.pig4cloud.pigx.common.excel.annotation.ResponseExcel; +import com.pig4cloud.pigx.common.excel.config.ExcelConfigProperties; +import com.pig4cloud.pigx.common.excel.enhance.WriterBuilderEnhancer; +import com.pig4cloud.pigx.common.excel.kit.ExcelException; +import org.springframework.beans.factory.ObjectProvider; +import org.springframework.util.CollectionUtils; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * @author lengleng + * @author L.cm + * @date 2020/3/29 + *

+ * 处理单sheet 页面 + */ +public class SingleSheetWriteHandler extends AbstractSheetWriteHandler { + + public SingleSheetWriteHandler(ExcelConfigProperties configProperties, + ObjectProvider>> converterProvider, WriterBuilderEnhancer excelWriterBuilderEnhance) { + super(configProperties, converterProvider, excelWriterBuilderEnhance); + } + + /** + * obj 是List 且list不为空同时list中的元素不是是List 才返回true + * @param obj 返回对象 + * @return boolean + */ + @Override + public boolean support(Object obj) { + if (obj instanceof List) { + List objList = (List) obj; + return !objList.isEmpty() && !(objList.get(0) instanceof List); + } + else { + throw new ExcelException("@ResponseExcel 返回值必须为List类型"); + } + } + + @Override + public void write(Object obj, HttpServletResponse response, ResponseExcel responseExcel) { + List eleList = (List) obj; + ExcelWriter excelWriter = getExcelWriter(response, responseExcel); + + WriteSheet sheet; + if (CollectionUtils.isEmpty(eleList)) { + sheet = EasyExcel.writerSheet(responseExcel.sheets()[0].sheetName()).build(); + } + else { + // 有模板则不指定sheet名 + Class dataClass = eleList.get(0).getClass(); + sheet = this.sheet(responseExcel.sheets()[0], dataClass, responseExcel.template(), + responseExcel.headGenerator()); + } + + // 填充 sheet + if (responseExcel.fill()) { + excelWriter.fill(eleList, sheet); + } + else { + // 写入sheet + excelWriter.write(eleList, sheet); + } + excelWriter.finish(); + } + +} diff --git a/pigx-common/pigx-common-excel/src/main/java/com/pig4cloud/pigx/common/excel/head/HeadGenerator.java b/pigx-common/pigx-common-excel/src/main/java/com/pig4cloud/pigx/common/excel/head/HeadGenerator.java new file mode 100644 index 0000000..6cd277b --- /dev/null +++ b/pigx-common/pigx-common-excel/src/main/java/com/pig4cloud/pigx/common/excel/head/HeadGenerator.java @@ -0,0 +1,22 @@ +package com.pig4cloud.pigx.common.excel.head; + +/** + * Excel头生成器,用于自定义生成头部信息 + * + * @author Hccake 2020/10/27 + * @version 1.0 + */ +public interface HeadGenerator { + + /** + *

+ * 自定义头部信息 + *

+ * 实现类根据数据的class信息,定制Excel头
+ * 具体方法使用参考:https://www.yuque.com/easyexcel/doc/write#b4b9de00 + * @param clazz 当前sheet的数据类型 + * @return List> Head头信息 + */ + HeadMeta head(Class clazz); + +} diff --git a/pigx-common/pigx-common-excel/src/main/java/com/pig4cloud/pigx/common/excel/head/HeadMeta.java b/pigx-common/pigx-common-excel/src/main/java/com/pig4cloud/pigx/common/excel/head/HeadMeta.java new file mode 100644 index 0000000..0515ae7 --- /dev/null +++ b/pigx-common/pigx-common-excel/src/main/java/com/pig4cloud/pigx/common/excel/head/HeadMeta.java @@ -0,0 +1,29 @@ +package com.pig4cloud.pigx.common.excel.head; + +import lombok.Data; + +import java.util.List; +import java.util.Set; + +/** + * @author Yakir + * @date 2021/4/26 10:58 + */ +@Data +public class HeadMeta { + + /** + *

+ * 自定义头部信息 + *

+ * 实现类根据数据的class信息,定制Excel头
+ * 具体方法使用参考:https://www.yuque.com/easyexcel/doc/write#b4b9de00 + */ + private List> head; + + /** + * 忽略头对应字段名称 + */ + private Set ignoreHeadFields; + +} diff --git a/pigx-common/pigx-common-excel/src/main/java/com/pig4cloud/pigx/common/excel/head/I18nHeaderCellWriteHandler.java b/pigx-common/pigx-common-excel/src/main/java/com/pig4cloud/pigx/common/excel/head/I18nHeaderCellWriteHandler.java new file mode 100644 index 0000000..34a5ddb --- /dev/null +++ b/pigx-common/pigx-common-excel/src/main/java/com/pig4cloud/pigx/common/excel/head/I18nHeaderCellWriteHandler.java @@ -0,0 +1,61 @@ +package com.pig4cloud.pigx.common.excel.head; + +import com.alibaba.excel.metadata.Head; +import com.alibaba.excel.write.handler.CellWriteHandler; +import com.alibaba.excel.write.metadata.holder.WriteSheetHolder; +import com.alibaba.excel.write.metadata.holder.WriteTableHolder; +import lombok.RequiredArgsConstructor; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.poi.ss.usermodel.Row; +import org.springframework.context.MessageSource; +import org.springframework.context.i18n.LocaleContextHolder; +import org.springframework.util.PropertyPlaceholderHelper; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * 对表头进行国际化处理 + * + * @author hccake + */ +@RequiredArgsConstructor +public class I18nHeaderCellWriteHandler implements CellWriteHandler { + + /** + * 国际化消息源 + */ + private final MessageSource messageSource; + + /** + * 国际化翻译 + */ + private final PropertyPlaceholderHelper.PlaceholderResolver placeholderResolver; + + public I18nHeaderCellWriteHandler(MessageSource messageSource) { + this.messageSource = messageSource; + this.placeholderResolver = placeholderName -> this.messageSource.getMessage(placeholderName, null, + LocaleContextHolder.getLocale()); + } + + /** + * 占位符处理 + */ + private final PropertyPlaceholderHelper propertyPlaceholderHelper = new PropertyPlaceholderHelper("{", "}"); + + @Override + public void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, + Head head, Integer columnIndex, Integer relativeRowIndex, Boolean isHead) { + if (isHead != null && isHead) { + List originHeadNameList = head.getHeadNameList(); + if (CollectionUtils.isNotEmpty(originHeadNameList)) { + // 国际化处理 + List i18nHeadNames = originHeadNameList.stream() + .map(headName -> propertyPlaceholderHelper.replacePlaceholders(headName, placeholderResolver)) + .collect(Collectors.toList()); + head.setHeadNameList(i18nHeadNames); + } + } + } + +} diff --git a/pigx-common/pigx-common-excel/src/main/java/com/pig4cloud/pigx/common/excel/kit/ExcelException.java b/pigx-common/pigx-common-excel/src/main/java/com/pig4cloud/pigx/common/excel/kit/ExcelException.java new file mode 100644 index 0000000..c1f22fe --- /dev/null +++ b/pigx-common/pigx-common-excel/src/main/java/com/pig4cloud/pigx/common/excel/kit/ExcelException.java @@ -0,0 +1,15 @@ +package com.pig4cloud.pigx.common.excel.kit; + +/** + * @author lengleng + * @date 2020/3/31 + */ +public class ExcelException extends RuntimeException { + + private static final long serialVersionUID = 1L; + + public ExcelException(String message) { + super(message); + } + +} diff --git a/pigx-common/pigx-common-excel/src/main/java/com/pig4cloud/pigx/common/excel/kit/Validators.java b/pigx-common/pigx-common-excel/src/main/java/com/pig4cloud/pigx/common/excel/kit/Validators.java new file mode 100644 index 0000000..357c0ec --- /dev/null +++ b/pigx-common/pigx-common-excel/src/main/java/com/pig4cloud/pigx/common/excel/kit/Validators.java @@ -0,0 +1,37 @@ +package com.pig4cloud.pigx.common.excel.kit; + +import javax.validation.*; +import java.util.Set; + +/** + * 校验工具 + * + * @author L.cm + */ +public final class Validators { + + private Validators() { + } + + private static final Validator VALIDATOR; + + static { + ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); + VALIDATOR = factory.getValidator(); + } + + /** + * Validates all constraints on {@code object}. + * @param object object to validate + * @param the type of the object to validate + * @return constraint violations or an empty set if none + * @throws IllegalArgumentException if object is {@code null} or if {@code null} is + * passed to the varargs groups + * @throws ValidationException if a non recoverable error happens during the + * validation process + */ + public static Set> validate(T object) { + return VALIDATOR.validate(object); + } + +} diff --git a/pigx-common/pigx-common-excel/src/main/java/com/pig4cloud/pigx/common/excel/processor/NameProcessor.java b/pigx-common/pigx-common-excel/src/main/java/com/pig4cloud/pigx/common/excel/processor/NameProcessor.java new file mode 100644 index 0000000..b658443 --- /dev/null +++ b/pigx-common/pigx-common-excel/src/main/java/com/pig4cloud/pigx/common/excel/processor/NameProcessor.java @@ -0,0 +1,20 @@ +package com.pig4cloud.pigx.common.excel.processor; + +import java.lang.reflect.Method; + +/** + * @author lengleng + * @date 2020/3/29 + */ +public interface NameProcessor { + + /** + * 解析名称 + * @param args 拦截器对象 + * @param method + * @param key 表达式 + * @return + */ + String doDetermineName(Object[] args, Method method, String key); + +} diff --git a/pigx-common/pigx-common-excel/src/main/java/com/pig4cloud/pigx/common/excel/processor/NameSpelExpressionProcessor.java b/pigx-common/pigx-common-excel/src/main/java/com/pig4cloud/pigx/common/excel/processor/NameSpelExpressionProcessor.java new file mode 100644 index 0000000..2ceaaf6 --- /dev/null +++ b/pigx-common/pigx-common-excel/src/main/java/com/pig4cloud/pigx/common/excel/processor/NameSpelExpressionProcessor.java @@ -0,0 +1,40 @@ +package com.pig4cloud.pigx.common.excel.processor; + +import org.springframework.context.expression.MethodBasedEvaluationContext; +import org.springframework.core.DefaultParameterNameDiscoverer; +import org.springframework.core.ParameterNameDiscoverer; +import org.springframework.expression.EvaluationContext; +import org.springframework.expression.ExpressionParser; +import org.springframework.expression.spel.standard.SpelExpressionParser; + +import java.lang.reflect.Method; + +/** + * @author lengleng + * @date 2020/3/29 + */ +public class NameSpelExpressionProcessor implements NameProcessor { + + /** + * 参数发现器 + */ + private static final ParameterNameDiscoverer NAME_DISCOVERER = new DefaultParameterNameDiscoverer(); + + /** + * Express语法解析器 + */ + private static final ExpressionParser PARSER = new SpelExpressionParser(); + + @Override + public String doDetermineName(Object[] args, Method method, String key) { + + if (!key.contains("#")) { + return key; + } + + EvaluationContext context = new MethodBasedEvaluationContext(null, method, args, NAME_DISCOVERER); + final Object value = PARSER.parseExpression(key).getValue(context); + return value == null ? null : value.toString(); + } + +} diff --git a/pigx-common/pigx-common-excel/src/main/java/com/pig4cloud/pigx/common/excel/vo/ErrorMessage.java b/pigx-common/pigx-common-excel/src/main/java/com/pig4cloud/pigx/common/excel/vo/ErrorMessage.java new file mode 100644 index 0000000..9a38109 --- /dev/null +++ b/pigx-common/pigx-common-excel/src/main/java/com/pig4cloud/pigx/common/excel/vo/ErrorMessage.java @@ -0,0 +1,41 @@ +package com.pig4cloud.pigx.common.excel.vo; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.HashSet; +import java.util.Set; + +/** + * 校验错误信息 + * + * @author lengleng + * @date 2021/8/4 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class ErrorMessage { + + /** + * 行号 + */ + private Long lineNum; + + /** + * 错误信息 + */ + private Set errors = new HashSet<>(); + + public ErrorMessage(Set errors) { + this.errors = errors; + } + + public ErrorMessage(String error) { + HashSet objects = new HashSet<>(); + objects.add(error); + this.errors = objects; + } + +} diff --git a/pigx-common/pigx-common-excel/src/main/resources/META-INF/spring-configuration-metadata.json b/pigx-common/pigx-common-excel/src/main/resources/META-INF/spring-configuration-metadata.json new file mode 100644 index 0000000..2c4bb57 --- /dev/null +++ b/pigx-common/pigx-common-excel/src/main/resources/META-INF/spring-configuration-metadata.json @@ -0,0 +1,19 @@ +{ + "groups": [ + { + "name": "excel", + "type": "com.pig4cloud.pigx.common.excel.config.ExcelConfigProperties", + "sourceType": "com.pig4cloud.pigx.common.excel.config.ExcelConfigProperties" + } + ], + "properties": [ + { + "name": "excel.template-path", + "type": "java.lang.String", + "description": "模板路径", + "defaultValue": "excel", + "sourceType": "com.pig4cloud.pigx.common.excel.config.ExcelConfigProperties" + } + ], + "hints": [] +} diff --git a/pigx-common/pigx-common-excel/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/pigx-common/pigx-common-excel/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 0000000..880ccf2 --- /dev/null +++ b/pigx-common/pigx-common-excel/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1 @@ +com.pig4cloud.pigx.common.excel.ResponseExcelAutoConfiguration diff --git a/pigx-common/pigx-common-feign/pom.xml b/pigx-common/pigx-common-feign/pom.xml new file mode 100644 index 0000000..d3d74d4 --- /dev/null +++ b/pigx-common/pigx-common-feign/pom.xml @@ -0,0 +1,32 @@ + + + + com.pig4cloud + pigx-common + 5.2.0 + + + 4.0.0 + jar + pigx-common-feign + feign 通用组件 + + + + org.springframework.cloud + spring-cloud-starter-openfeign + + + + io.github.openfeign + feign-okhttp + + + + org.springframework.cloud + spring-cloud-starter-loadbalancer + + + diff --git a/pigx-common/pigx-common-feign/src/main/java/com/pig4cloud/pigx/common/feign/PigxFeignAutoConfiguration.java b/pigx-common/pigx-common-feign/src/main/java/com/pig4cloud/pigx/common/feign/PigxFeignAutoConfiguration.java new file mode 100644 index 0000000..6c2c2dd --- /dev/null +++ b/pigx-common/pigx-common-feign/src/main/java/com/pig4cloud/pigx/common/feign/PigxFeignAutoConfiguration.java @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.common.feign; + +import com.pig4cloud.pigx.common.feign.endpoint.FeignClientEndpoint; +import feign.Feign; +import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint; +import org.springframework.boot.autoconfigure.AutoConfigureAfter; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.cloud.openfeign.EnableFeignClients; +import org.springframework.cloud.openfeign.PigxFeignClientsRegistrar; +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; + +/** + * @author lengleng + * @date 2020/2/8 + *

+ * feign 自动化配置 + */ +@Configuration +@ConditionalOnClass(Feign.class) +@Import(PigxFeignClientsRegistrar.class) +@AutoConfigureAfter(EnableFeignClients.class) +public class PigxFeignAutoConfiguration { + + @Bean + @ConditionalOnMissingBean + @ConditionalOnAvailableEndpoint + public FeignClientEndpoint feignClientEndpoint(ApplicationContext context) { + return new FeignClientEndpoint(context); + } + +} diff --git a/pigx-common/pigx-common-feign/src/main/java/com/pig4cloud/pigx/common/feign/annotation/EnablePigxFeignClients.java b/pigx-common/pigx-common-feign/src/main/java/com/pig4cloud/pigx/common/feign/annotation/EnablePigxFeignClients.java new file mode 100644 index 0000000..f052a48 --- /dev/null +++ b/pigx-common/pigx-common-feign/src/main/java/com/pig4cloud/pigx/common/feign/annotation/EnablePigxFeignClients.java @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.common.feign.annotation; + +import org.springframework.cloud.openfeign.EnableFeignClients; +import org.springframework.cloud.openfeign.FeignClientsConfiguration; + +import java.lang.annotation.*; + +/** + * @author lengleng + * @date 2020-02-08 + */ +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@EnableFeignClients +public @interface EnablePigxFeignClients { + + /** + * Alias for the {@link #basePackages()} attribute. Allows for more concise annotation + * declarations e.g.: {@code @ComponentScan("org.my.pkg")} instead of + * {@code @ComponentScan(basePackages="org.my.pkg")}. + * @return the array of 'basePackages'. + */ + String[] value() default {}; + + /** + * Base packages to scan for annotated components. + *

+ * {@link #value()} is an alias for (and mutually exclusive with) this attribute. + *

+ * Use {@link #basePackageClasses()} for a type-safe alternative to String-based + * package names. + * @return the array of 'basePackages'. + */ + String[] basePackages() default { "com.pig4cloud.pigx" }; + + /** + * Type-safe alternative to {@link #basePackages()} for specifying the packages to + * scan for annotated components. The package of each class specified will be scanned. + *

+ * Consider creating a special no-op marker class or interface in each package that + * serves no purpose other than being referenced by this attribute. + * @return the array of 'basePackageClasses'. + */ + Class[] basePackageClasses() default {}; + + /** + * A custom @Configuration for all feign clients. Can contain override + * @Bean definition for the pieces that make up the client, for instance + * {@link feign.codec.Decoder}, {@link feign.codec.Encoder}, {@link feign.Contract}. + * + * @see FeignClientsConfiguration for the defaults + */ + Class[] defaultConfiguration() default {}; + + /** + * List of classes annotated with @FeignClient. If not empty, disables classpath + * scanning. + * @return + */ + Class[] clients() default {}; + +} diff --git a/pigx-common/pigx-common-feign/src/main/java/com/pig4cloud/pigx/common/feign/endpoint/FeignClientEndpoint.java b/pigx-common/pigx-common-feign/src/main/java/com/pig4cloud/pigx/common/feign/endpoint/FeignClientEndpoint.java new file mode 100644 index 0000000..9a47dbe --- /dev/null +++ b/pigx-common/pigx-common-feign/src/main/java/com/pig4cloud/pigx/common/feign/endpoint/FeignClientEndpoint.java @@ -0,0 +1,127 @@ +package com.pig4cloud.pigx.common.feign.endpoint; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.Setter; +import org.springframework.beans.factory.SmartInitializingSingleton; +import org.springframework.boot.actuate.endpoint.annotation.Endpoint; +import org.springframework.boot.actuate.endpoint.annotation.ReadOperation; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.context.ApplicationContext; +import org.springframework.core.annotation.AnnotatedElementUtils; +import org.springframework.core.annotation.AnnotationUtils; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; + +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * Feign client 端点 + * + * @author L.cm + */ +@Endpoint(id = "feign") +public class FeignClientEndpoint implements SmartInitializingSingleton { + + private final ApplicationContext context; + + private final List clientList; + + public FeignClientEndpoint(ApplicationContext context) { + this.context = context; + this.clientList = new ArrayList<>(); + } + + @ReadOperation + public List invoke() { + return clientList; + } + + @Override + public void afterSingletonsInstantiated() { + clientList.addAll(getClientList(context)); + } + + private static List getClientList(ApplicationContext context) { + Map feignClientMap = context.getBeansWithAnnotation(FeignClient.class); + // 1. 解析注解 + List feignClientInfoList = new ArrayList<>(); + Set> feignClientEntrySet = feignClientMap.entrySet(); + for (Map.Entry feignClientEntry : feignClientEntrySet) { + String beanName = feignClientEntry.getKey(); + Object feignClientBean = feignClientEntry.getValue(); + if (feignClientBean == null) { + continue; + } + // 解析注解 + Class feignClientClass = feignClientBean.getClass(); + FeignClient feignClientAnn = AnnotationUtils.findAnnotation(feignClientClass, FeignClient.class); + if (feignClientAnn == null) { + continue; + } + FeignClientInfo feignClientInfo = new FeignClientInfo(); + feignClientInfo.setBeanName(beanName); + String serviceId = feignClientAnn.value(); + String contextId = feignClientAnn.contextId(); + String url = feignClientAnn.url(); + String path = feignClientAnn.path(); + feignClientInfo.setServiceId(serviceId); + feignClientInfo.setContextId(contextId); + feignClientInfo.setUrl(url); + feignClientInfo.setPath(path); + // 组装客户端信息 + List clientInfoList = new ArrayList<>(); + Class[] interfaces = feignClientClass.getInterfaces(); + for (Class clientInterface : interfaces) { + Method[] methods = clientInterface.getDeclaredMethods(); + for (Method method : methods) { + if (method.isDefault()) { + continue; + } + RequestMapping requestMapping = AnnotatedElementUtils.getMergedAnnotation(method, + RequestMapping.class); + if (requestMapping == null) { + continue; + } + clientInfoList.add(new ClientInfo(requestMapping.method(), requestMapping.value())); + } + } + feignClientInfo.setClientList(clientInfoList); + feignClientInfoList.add(feignClientInfo); + } + return feignClientInfoList; + } + + @Getter + @Setter + public static class FeignClientInfo { + + private String beanName; + + private String serviceId; + + private String contextId; + + private String url; + + private String path; + + private List clientList; + + } + + @Getter + @AllArgsConstructor + public static class ClientInfo { + + private final RequestMethod[] methods; + + private final String[] mappings; + + } + +} \ No newline at end of file diff --git a/pigx-common/pigx-common-feign/src/main/java/org/springframework/cloud/openfeign/PigxFeignClientsRegistrar.java b/pigx-common/pigx-common-feign/src/main/java/org/springframework/cloud/openfeign/PigxFeignClientsRegistrar.java new file mode 100644 index 0000000..e4e90c1 --- /dev/null +++ b/pigx-common/pigx-common-feign/src/main/java/org/springframework/cloud/openfeign/PigxFeignClientsRegistrar.java @@ -0,0 +1,256 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package org.springframework.cloud.openfeign; + +import com.pig4cloud.pigx.common.feign.PigxFeignAutoConfiguration; +import lombok.Getter; +import org.springframework.beans.factory.BeanClassLoaderAware; +import org.springframework.beans.factory.config.BeanDefinitionHolder; +import org.springframework.beans.factory.support.AbstractBeanDefinition; +import org.springframework.beans.factory.support.BeanDefinitionBuilder; +import org.springframework.beans.factory.support.BeanDefinitionReaderUtils; +import org.springframework.beans.factory.support.BeanDefinitionRegistry; +import org.springframework.boot.context.annotation.ImportCandidates; +import org.springframework.context.EnvironmentAware; +import org.springframework.context.annotation.ImportBeanDefinitionRegistrar; +import org.springframework.core.annotation.AnnotatedElementUtils; +import org.springframework.core.annotation.AnnotationAttributes; +import org.springframework.core.env.Environment; +import org.springframework.core.io.support.SpringFactoriesLoader; +import org.springframework.core.type.AnnotationMetadata; +import org.springframework.lang.Nullable; +import org.springframework.util.ClassUtils; +import org.springframework.util.StringUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * @author L.cm + * @date 2020/2/8 + *

+ * feign 自动配置功能 from mica + */ +public class PigxFeignClientsRegistrar + implements ImportBeanDefinitionRegistrar, BeanClassLoaderAware, EnvironmentAware { + + private final static String BASE_URL = "http://127.0.0.1:${server.port}${server.servlet.context-path}"; + + @Getter + private ClassLoader beanClassLoader; + + @Getter + private Environment environment; + + @Override + public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) { + registerFeignClients(registry); + } + + @Override + public void setBeanClassLoader(ClassLoader classLoader) { + this.beanClassLoader = classLoader; + } + + private void registerFeignClients(BeanDefinitionRegistry registry) { + List feignClients = new ArrayList<>(); + + // 支持 springboot 2.7 + 最新版本的配置方式 + ImportCandidates.load(FeignClient.class, getBeanClassLoader()).forEach(feignClients::add); + + // 如果 spring.factories 里为空 + if (feignClients.isEmpty()) { + return; + } + for (String className : feignClients) { + try { + Class clazz = beanClassLoader.loadClass(className); + AnnotationAttributes attributes = AnnotatedElementUtils.getMergedAnnotationAttributes(clazz, + FeignClient.class); + if (attributes == null) { + continue; + } + // 如果已经存在该 bean,支持原生的 Feign + if (registry.containsBeanDefinition(className)) { + continue; + } + registerClientConfiguration(registry, getClientName(attributes), attributes.get("configuration")); + + validate(attributes); + BeanDefinitionBuilder definition = BeanDefinitionBuilder + .genericBeanDefinition(FeignClientFactoryBean.class); + definition.addPropertyValue("url", getUrl(attributes)); + definition.addPropertyValue("path", getPath(attributes)); + String name = getName(attributes); + definition.addPropertyValue("name", name); + + // 兼容最新版本的 spring-cloud-openfeign,尚未发布 + StringBuilder aliasBuilder = new StringBuilder(18); + if (attributes.containsKey("contextId")) { + String contextId = getContextId(attributes); + aliasBuilder.append(contextId); + definition.addPropertyValue("contextId", contextId); + } + else { + aliasBuilder.append(name); + } + + definition.addPropertyValue("type", className); + definition.addPropertyValue("decode404", attributes.get("decode404")); + definition.addPropertyValue("fallback", attributes.get("fallback")); + definition.addPropertyValue("fallbackFactory", attributes.get("fallbackFactory")); + definition.setAutowireMode(AbstractBeanDefinition.AUTOWIRE_BY_TYPE); + + AbstractBeanDefinition beanDefinition = definition.getBeanDefinition(); + + // alias + String alias = aliasBuilder.append("FeignClient").toString(); + + // has a default, won't be null + boolean primary = (Boolean) attributes.get("primary"); + + beanDefinition.setPrimary(primary); + + String qualifier = getQualifier(attributes); + if (StringUtils.hasText(qualifier)) { + alias = qualifier; + } + + BeanDefinitionHolder holder = new BeanDefinitionHolder(beanDefinition, className, + new String[] { alias }); + BeanDefinitionReaderUtils.registerBeanDefinition(holder, registry); + + } + catch (ClassNotFoundException e) { + e.printStackTrace(); + } + } + } + + /** + * Return the class used by {@link SpringFactoriesLoader} to load configuration + * candidates. + * @return the factory class + */ + private Class getSpringFactoriesLoaderFactoryClass() { + return PigxFeignAutoConfiguration.class; + } + + private void validate(Map attributes) { + AnnotationAttributes annotation = AnnotationAttributes.fromMap(attributes); + // This blows up if an aliased property is overspecified + FeignClientsRegistrar.validateFallback(annotation.getClass("fallback")); + FeignClientsRegistrar.validateFallbackFactory(annotation.getClass("fallbackFactory")); + } + + private String getName(Map attributes) { + String name = (String) attributes.get("serviceId"); + if (!StringUtils.hasText(name)) { + name = (String) attributes.get("name"); + } + if (!StringUtils.hasText(name)) { + name = (String) attributes.get("value"); + } + name = resolve(name); + return FeignClientsRegistrar.getName(name); + } + + private String getContextId(Map attributes) { + String contextId = (String) attributes.get("contextId"); + if (!StringUtils.hasText(contextId)) { + return getName(attributes); + } + + contextId = resolve(contextId); + return FeignClientsRegistrar.getName(contextId); + } + + private String resolve(String value) { + if (StringUtils.hasText(value)) { + return this.environment.resolvePlaceholders(value); + } + return value; + } + + private String getUrl(Map attributes) { + // 如果是单体项目自动注入 & url 为空 + String url = (String) attributes.get("url"); + boolean present = ClassUtils.isPresent("com.alibaba.cloud.nacos.discovery.NacosDiscoveryClient", + this.getClass().getClassLoader()); + if (!StringUtils.hasText(url) && !present) { + url = resolve(BASE_URL); + } + + return FeignClientsRegistrar.getUrl(url); + } + + private String getPath(Map attributes) { + String path = resolve((String) attributes.get("path")); + return FeignClientsRegistrar.getPath(path); + } + + @Nullable + private String getQualifier(@Nullable Map client) { + if (client == null) { + return null; + } + String qualifier = (String) client.get("qualifier"); + if (StringUtils.hasText(qualifier)) { + return qualifier; + } + return null; + } + + @Nullable + private String getClientName(@Nullable Map client) { + if (client == null) { + return null; + } + String value = (String) client.get("contextId"); + if (!StringUtils.hasText(value)) { + value = (String) client.get("value"); + } + if (!StringUtils.hasText(value)) { + value = (String) client.get("name"); + } + if (!StringUtils.hasText(value)) { + value = (String) client.get("serviceId"); + } + if (StringUtils.hasText(value)) { + return value; + } + + throw new IllegalStateException( + "Either 'name' or 'value' must be provided in @" + FeignClient.class.getSimpleName()); + } + + private void registerClientConfiguration(BeanDefinitionRegistry registry, Object name, Object configuration) { + BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(FeignClientSpecification.class); + builder.addConstructorArgValue(name); + builder.addConstructorArgValue(configuration); + registry.registerBeanDefinition(name + "." + FeignClientSpecification.class.getSimpleName(), + builder.getBeanDefinition()); + } + + @Override + public void setEnvironment(Environment environment) { + this.environment = environment; + } + +} diff --git a/pigx-common/pigx-common-feign/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/pigx-common/pigx-common-feign/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 0000000..0d6acf4 --- /dev/null +++ b/pigx-common/pigx-common-feign/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1 @@ +com.pig4cloud.pigx.common.feign.PigxFeignAutoConfiguration diff --git a/pigx-common/pigx-common-gateway/pom.xml b/pigx-common/pigx-common-gateway/pom.xml new file mode 100644 index 0000000..e7c7aa1 --- /dev/null +++ b/pigx-common/pigx-common-gateway/pom.xml @@ -0,0 +1,44 @@ + + + 4.0.0 + + com.pig4cloud + pigx-common + 5.2.0 + + + pigx-common-gateway + jar + + pigx gateway + + + + com.pig4cloud + pigx-common-core + + + cn.hutool + hutool-cache + + + + org.springframework.cloud + spring-cloud-gateway-server + + + org.springframework.boot + spring-boot-starter-data-redis-reactive + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + compile + + + org.springframework.cloud + spring-cloud-starter-loadbalancer + + + diff --git a/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/annotation/EnablePigxDynamicRoute.java b/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/annotation/EnablePigxDynamicRoute.java new file mode 100644 index 0000000..528a9b2 --- /dev/null +++ b/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/annotation/EnablePigxDynamicRoute.java @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.common.gateway.annotation; + +import com.pig4cloud.pigx.common.gateway.configuration.DynamicRouteAutoConfiguration; +import org.springframework.context.annotation.Import; + +import java.lang.annotation.*; + +/** + * @author lengleng + * @date 2018/11/5 + *

+ * 开启pigx 动态路由 + */ +@Target({ ElementType.TYPE }) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@Inherited +@Import(DynamicRouteAutoConfiguration.class) +public @interface EnablePigxDynamicRoute { + +} diff --git a/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/configuration/DynamicRouteAutoConfiguration.java b/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/configuration/DynamicRouteAutoConfiguration.java new file mode 100644 index 0000000..d6af6a1 --- /dev/null +++ b/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/configuration/DynamicRouteAutoConfiguration.java @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.common.gateway.configuration; + +import com.pig4cloud.pigx.common.core.constant.CacheConstants; +import com.pig4cloud.pigx.common.core.util.SpringContextHolder; +import com.pig4cloud.pigx.common.gateway.support.DynamicRouteHealthIndicator; +import com.pig4cloud.pigx.common.gateway.support.RouteCacheHolder; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication; +import org.springframework.cloud.gateway.event.RefreshRoutesEvent; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.listener.ChannelTopic; +import org.springframework.data.redis.listener.RedisMessageListenerContainer; +import org.springframework.data.redis.serializer.StringRedisSerializer; + +/** + * @author lengleng + * @date 2018/11/5 + *

+ * 动态路由配置类 + */ +@Slf4j +@Configuration +@ComponentScan("com.pig4cloud.pigx.common.gateway") +@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.REACTIVE) +public class DynamicRouteAutoConfiguration { + + /** + * redis 监听配置 + * @param redisConnectionFactory redis 配置 + * @return + */ + @Bean + public RedisMessageListenerContainer redisContainer(RedisConnectionFactory redisConnectionFactory) { + RedisMessageListenerContainer container = new RedisMessageListenerContainer(); + container.setConnectionFactory(redisConnectionFactory); + container.addMessageListener((message, bytes) -> { + log.warn("接收到重新JVM 重新加载路由事件"); + RouteCacheHolder.removeRouteList(); + // 发送刷新路由事件 + SpringContextHolder.publishEvent(new RefreshRoutesEvent(this)); + }, new ChannelTopic(CacheConstants.ROUTE_JVM_RELOAD_TOPIC)); + return container; + } + + /** + * 动态路由监控检查 + * @param redisTemplate redis + * @return + */ + @Bean + public DynamicRouteHealthIndicator healthIndicator(RedisTemplate redisTemplate) { + + redisTemplate.setKeySerializer(new StringRedisSerializer()); + if (!redisTemplate.hasKey(CacheConstants.ROUTE_KEY)) { + log.info("路由信息未初始化,网关路由失败"); + } + + return new DynamicRouteHealthIndicator(redisTemplate); + } + +} diff --git a/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/configuration/GlobalExceptionConfiguration.java b/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/configuration/GlobalExceptionConfiguration.java new file mode 100644 index 0000000..937bffd --- /dev/null +++ b/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/configuration/GlobalExceptionConfiguration.java @@ -0,0 +1,61 @@ +package com.pig4cloud.pigx.common.gateway.configuration; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.pig4cloud.pigx.common.core.util.R; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.web.reactive.error.ErrorWebExceptionHandler; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.annotation.Order; +import org.springframework.core.io.buffer.DataBufferFactory; +import org.springframework.http.MediaType; +import org.springframework.http.server.reactive.ServerHttpResponse; +import org.springframework.web.server.ResponseStatusException; +import org.springframework.web.server.ServerWebExchange; +import org.springframework.web.server.handler.ResponseStatusExceptionHandler; +import reactor.core.publisher.Mono; + +/** + * @author lengleng + * @date 2020/5/23 + *

+ * 网关异常通用处理器,只作用在webflux 环境下 , 优先级低于 {@link ResponseStatusExceptionHandler} 执行 + */ +@Slf4j +@Order(-1) +@Configuration +@RequiredArgsConstructor +public class GlobalExceptionConfiguration implements ErrorWebExceptionHandler { + + private final ObjectMapper objectMapper; + + @Override + public Mono handle(ServerWebExchange exchange, Throwable ex) { + ServerHttpResponse response = exchange.getResponse(); + + if (response.isCommitted()) { + return Mono.error(ex); + } + + // header set + response.getHeaders().setContentType(MediaType.APPLICATION_JSON); + if (ex instanceof ResponseStatusException) { + response.setStatusCode(((ResponseStatusException) ex).getStatus()); + } + + return response.writeWith(Mono.fromSupplier(() -> { + DataBufferFactory bufferFactory = response.bufferFactory(); + try { + log.error("Error rquest :{} Error Spring Cloud Gateway : {}", exchange.getRequest().getPath(), + ex.getMessage()); + return bufferFactory.wrap(objectMapper.writeValueAsBytes(R.failed(ex.getMessage()))); + } + catch (JsonProcessingException e) { + log.warn("Error writing response", ex); + return bufferFactory.wrap(new byte[0]); + } + })); + } + +} diff --git a/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/configuration/GrayLoadBalancerClientConfiguration.java b/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/configuration/GrayLoadBalancerClientConfiguration.java new file mode 100644 index 0000000..d319f92 --- /dev/null +++ b/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/configuration/GrayLoadBalancerClientConfiguration.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.common.gateway.configuration; + +import com.pig4cloud.pigx.common.gateway.filter.GrayReactiveLoadBalancerClientFilter; +import com.pig4cloud.pigx.common.gateway.rule.GrayLoadBalancer; +import com.pig4cloud.pigx.common.gateway.rule.VersionGrayLoadBalancer; +import org.springframework.boot.autoconfigure.AutoConfigureBefore; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication; +import org.springframework.cloud.client.discovery.DiscoveryClient; +import org.springframework.cloud.client.loadbalancer.LoadBalancerProperties; +import org.springframework.cloud.gateway.config.GatewayLoadBalancerProperties; +import org.springframework.cloud.gateway.config.GatewayReactiveLoadBalancerClientAutoConfiguration; +import org.springframework.cloud.gateway.filter.ReactiveLoadBalancerClientFilter; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * Mica ribbon rule auto configuration. + * + * @author L.cm + * @link https://github.com/lets-mica/mica + */ +@Configuration +@ConditionalOnProperty(value = "gray.rule.enabled", havingValue = "true") +@AutoConfigureBefore(GatewayReactiveLoadBalancerClientAutoConfiguration.class) +@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.REACTIVE) +public class GrayLoadBalancerClientConfiguration { + + @Bean + public ReactiveLoadBalancerClientFilter gatewayLoadBalancerClientFilter(GrayLoadBalancer grayLoadBalancer, + LoadBalancerProperties properties, GatewayLoadBalancerProperties loadBalancerProperties) { + return new GrayReactiveLoadBalancerClientFilter(loadBalancerProperties, properties, grayLoadBalancer); + } + + @Bean + public GrayLoadBalancer grayLoadBalancer(DiscoveryClient discoveryClient) { + return new VersionGrayLoadBalancer(discoveryClient); + } + +} diff --git a/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/filter/GrayReactiveLoadBalancerClientFilter.java b/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/filter/GrayReactiveLoadBalancerClientFilter.java new file mode 100644 index 0000000..d93b054 --- /dev/null +++ b/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/filter/GrayReactiveLoadBalancerClientFilter.java @@ -0,0 +1,111 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.common.gateway.filter; + +import com.pig4cloud.pigx.common.gateway.rule.GrayLoadBalancer; +import lombok.extern.slf4j.Slf4j; +import org.springframework.cloud.client.ServiceInstance; +import org.springframework.cloud.client.loadbalancer.DefaultResponse; +import org.springframework.cloud.client.loadbalancer.LoadBalancerProperties; +import org.springframework.cloud.client.loadbalancer.LoadBalancerUriTools; +import org.springframework.cloud.client.loadbalancer.Response; +import org.springframework.cloud.gateway.config.GatewayLoadBalancerProperties; +import org.springframework.cloud.gateway.filter.GatewayFilterChain; +import org.springframework.cloud.gateway.filter.ReactiveLoadBalancerClientFilter; +import org.springframework.cloud.gateway.support.DelegatingServiceInstance; +import org.springframework.cloud.gateway.support.NotFoundException; +import org.springframework.cloud.gateway.support.ServerWebExchangeUtils; +import org.springframework.web.server.ServerWebExchange; +import reactor.core.publisher.Mono; + +import java.net.URI; + +/** + * @author lengleng + * @date 2020/1/11 + */ +@Slf4j +public class GrayReactiveLoadBalancerClientFilter extends ReactiveLoadBalancerClientFilter { + + private static final int LOAD_BALANCER_CLIENT_FILTER_ORDER = 10150; + + private GatewayLoadBalancerProperties loadBalancerProperties; + + private GrayLoadBalancer grayLoadBalancer; + + public GrayReactiveLoadBalancerClientFilter(GatewayLoadBalancerProperties loadBalancerProperties, + LoadBalancerProperties properties, GrayLoadBalancer grayLoadBalancer) { + super(null, loadBalancerProperties); + this.grayLoadBalancer = grayLoadBalancer; + this.loadBalancerProperties = loadBalancerProperties; + } + + @Override + public int getOrder() { + return LOAD_BALANCER_CLIENT_FILTER_ORDER; + } + + @Override + public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) { + URI url = exchange.getAttribute(ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR); + String schemePrefix = exchange.getAttribute(ServerWebExchangeUtils.GATEWAY_SCHEME_PREFIX_ATTR); + if (url == null || (!"lb".equals(url.getScheme()) && !"lb".equals(schemePrefix))) { + return chain.filter(exchange); + } + // preserve the original url + ServerWebExchangeUtils.addOriginalRequestUrl(exchange, url); + + if (log.isTraceEnabled()) { + log.trace(ReactiveLoadBalancerClientFilter.class.getSimpleName() + " url before: " + url); + } + + return choose(exchange).doOnNext(response -> { + + if (!response.hasServer()) { + throw NotFoundException.create(loadBalancerProperties.isUse404(), + "Unable to find instance for " + url.getHost()); + } + + URI uri = exchange.getRequest().getURI(); + + // if the `lb:` mechanism was used, use `` as the default, + // if the loadbalancer doesn't provide one. + String overrideScheme = null; + if (schemePrefix != null) { + overrideScheme = url.getScheme(); + } + + DelegatingServiceInstance serviceInstance = new DelegatingServiceInstance(response.getServer(), + overrideScheme); + + URI requestUrl = LoadBalancerUriTools.reconstructURI(serviceInstance, uri); + + if (log.isTraceEnabled()) { + log.trace("LoadBalancerClientFilter url chosen: " + requestUrl); + } + exchange.getAttributes().put(ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR, requestUrl); + }).then(chain.filter(exchange)); + } + + private Mono> choose(ServerWebExchange exchange) { + URI uri = exchange.getAttribute(ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR); + ServiceInstance serviceInstance = grayLoadBalancer.choose(uri.getHost(), exchange.getRequest()); + return Mono.just(new DefaultResponse(serviceInstance)); + } + +} diff --git a/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/rule/GrayLoadBalancer.java b/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/rule/GrayLoadBalancer.java new file mode 100644 index 0000000..430cff7 --- /dev/null +++ b/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/rule/GrayLoadBalancer.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.common.gateway.rule; + +import org.springframework.cloud.client.ServiceInstance; +import org.springframework.http.server.reactive.ServerHttpRequest; + +/** + * @author lengleng + * @date 2020/1/12 + *

+ * 灰度路由 + */ +public interface GrayLoadBalancer { + + /** + * 根据serviceId 筛选可用服务 + * @param serviceId 服务ID + * @param request 当前请求 + * @return + */ + ServiceInstance choose(String serviceId, ServerHttpRequest request); + +} diff --git a/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/rule/VersionGrayLoadBalancer.java b/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/rule/VersionGrayLoadBalancer.java new file mode 100644 index 0000000..0101fec --- /dev/null +++ b/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/rule/VersionGrayLoadBalancer.java @@ -0,0 +1,112 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.common.gateway.rule; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.nacos.client.naming.utils.Chooser; +import com.alibaba.nacos.client.naming.utils.Pair; +import com.pig4cloud.pigx.common.core.constant.CommonConstants; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.cloud.client.ServiceInstance; +import org.springframework.cloud.client.discovery.DiscoveryClient; +import org.springframework.cloud.gateway.support.NotFoundException; +import org.springframework.http.server.reactive.ServerHttpRequest; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @author lengleng + * @date 2020/1/12 + *

+ * 基于客户端版本号灰度路由,增加基于nacos权重获取服务 + */ +@Slf4j +@RequiredArgsConstructor +public class VersionGrayLoadBalancer implements GrayLoadBalancer { + + private final DiscoveryClient discoveryClient; + + /** + * 根据serviceId 筛选可用服务 + * @param serviceId 服务ID + * @param request 当前请求 + * @return 服务实例:ServiceInstance + */ + @Override + public ServiceInstance choose(String serviceId, ServerHttpRequest request) { + List instances = discoveryClient.getInstances(serviceId); + // 注册中心无实例 抛出异常 + if (CollUtil.isEmpty(instances)) { + log.warn("No instance available for {}", serviceId); + throw new NotFoundException("No instance available for " + serviceId); + } + // 获取请求version,无则随机返回可用实例 + String reqVersion = request.getHeaders().getFirst(CommonConstants.VERSION); + if (StrUtil.isBlank(reqVersion)) { + // 过滤出不含VERSION实例 + List versionInstanceList = instances.stream() + .filter(instance -> !instance.getMetadata().containsKey(CommonConstants.VERSION)) + .collect(Collectors.toList()); + if (CollUtil.isEmpty(versionInstanceList)) { + // 根据权重获取实例 + return randomByWeight(instances); + } + // 根据权重获取实例 + return randomByWeight(versionInstanceList); + } + // 遍历可以实例元数据,若匹配则返回此实例 + List availableList = instances.stream() + .filter(instance -> reqVersion + .equalsIgnoreCase(MapUtil.getStr(instance.getMetadata(), CommonConstants.VERSION))) + .collect(Collectors.toList()); + if (CollUtil.isEmpty(availableList)) { + // 根据权重获取实例 + return randomByWeight(instances); + } + // 根据权重获取实例 + return randomByWeight(availableList); + } + + /** + * 根据nacos设置的权重返回实例 + * @param serviceInstances 服务实例集合 + * @return 服务实例:ServiceInstance + */ + protected ServiceInstance randomByWeight(final List serviceInstances) { + if (serviceInstances.size() == 1) { + return serviceInstances.get(0); + } + else { + List> hostsWithWeight = new ArrayList<>(); + for (ServiceInstance serviceInstance : serviceInstances) { + if ("true".equals(serviceInstance.getMetadata().getOrDefault("nacos.healthy", "true"))) { + hostsWithWeight.add(new Pair<>(serviceInstance, + Double.parseDouble(serviceInstance.getMetadata().getOrDefault("nacos.weight", "1")))); + } + } + Chooser vipChooser = new Chooser<>("www.taobao.com", hostsWithWeight); + return vipChooser.randomWithWeight(); + } + } + +} diff --git a/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/support/DynamicRouteHealthIndicator.java b/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/support/DynamicRouteHealthIndicator.java new file mode 100644 index 0000000..8b23aef --- /dev/null +++ b/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/support/DynamicRouteHealthIndicator.java @@ -0,0 +1,35 @@ +package com.pig4cloud.pigx.common.gateway.support; + +import com.pig4cloud.pigx.common.core.constant.CacheConstants; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.actuate.health.AbstractHealthIndicator; +import org.springframework.boot.actuate.health.Health; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.serializer.StringRedisSerializer; + +/** + * @author lengleng + * @date 2020/11/19 + *

+ * 动态路由检查检查 + */ +@Slf4j +@RequiredArgsConstructor +public class DynamicRouteHealthIndicator extends AbstractHealthIndicator { + + private final RedisTemplate redisTemplate; + + @Override + protected void doHealthCheck(Health.Builder builder) { + redisTemplate.setKeySerializer(new StringRedisSerializer()); + if (redisTemplate.hasKey(CacheConstants.ROUTE_KEY)) { + builder.up(); + } + else { + log.warn("动态路由监控检查失败,当前无路由配置"); + builder.down(); + } + } + +} diff --git a/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/support/DynamicRouteInitEvent.java b/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/support/DynamicRouteInitEvent.java new file mode 100644 index 0000000..af50552 --- /dev/null +++ b/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/support/DynamicRouteInitEvent.java @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.common.gateway.support; + +import org.springframework.context.ApplicationEvent; + +/** + * @author lengleng + * @date 2018/11/5 + *

+ * 路由初始化事件 + */ +public class DynamicRouteInitEvent extends ApplicationEvent { + + public DynamicRouteInitEvent(Object source) { + super(source); + } + +} diff --git a/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/support/RedisRouteDefinitionWriter.java b/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/support/RedisRouteDefinitionWriter.java new file mode 100644 index 0000000..ba2da56 --- /dev/null +++ b/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/support/RedisRouteDefinitionWriter.java @@ -0,0 +1,97 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.common.gateway.support; + +import cn.hutool.core.collection.CollUtil; +import com.pig4cloud.pigx.common.core.constant.CacheConstants; +import com.pig4cloud.pigx.common.gateway.vo.RouteDefinitionVo; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; +import org.springframework.cloud.gateway.route.RouteDefinition; +import org.springframework.cloud.gateway.route.RouteDefinitionRepository; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; +import org.springframework.data.redis.serializer.StringRedisSerializer; +import org.springframework.stereotype.Component; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +import java.util.List; + +/** + * @author lengleng + * @date 2018/10/31 + *

+ * redis 保存路由信息,优先级比配置文件高 + */ +@Slf4j +@Component +@RequiredArgsConstructor +public class RedisRouteDefinitionWriter implements RouteDefinitionRepository { + + private final RedisTemplate redisTemplate; + + @Override + public Mono save(Mono route) { + return route.flatMap(r -> { + RouteDefinitionVo vo = new RouteDefinitionVo(); + BeanUtils.copyProperties(r, vo); + log.info("保存路由信息{}", vo); + redisTemplate.setKeySerializer(new StringRedisSerializer()); + redisTemplate.opsForHash().put(CacheConstants.ROUTE_KEY, r.getId(), vo); + redisTemplate.convertAndSend(CacheConstants.ROUTE_JVM_RELOAD_TOPIC, "新增路由信息,网关缓存更新"); + return Mono.empty(); + }); + } + + @Override + public Mono delete(Mono routeId) { + routeId.subscribe(id -> { + log.info("删除路由信息{}", id); + redisTemplate.setKeySerializer(new StringRedisSerializer()); + redisTemplate.opsForHash().delete(CacheConstants.ROUTE_KEY, id); + }); + redisTemplate.convertAndSend(CacheConstants.ROUTE_JVM_RELOAD_TOPIC, "删除路由信息,网关缓存更新"); + return Mono.empty(); + } + + /** + * 动态路由入口 + *

+ * 1. 先从内存中获取 2. 为空加载Redis中数据 3. 更新内存 + * @return + */ + @Override + public Flux getRouteDefinitions() { + List routeList = RouteCacheHolder.getRouteList(); + if (CollUtil.isNotEmpty(routeList)) { + log.debug("内存 中路由定义条数: {}, {}", routeList.size(), routeList); + return Flux.fromIterable(routeList); + } + + redisTemplate.setKeySerializer(new StringRedisSerializer()); + redisTemplate.setHashValueSerializer(new Jackson2JsonRedisSerializer<>(RouteDefinitionVo.class)); + List values = redisTemplate.opsForHash().values(CacheConstants.ROUTE_KEY); + log.info("redis 中路由定义条数: {}, {}", values.size(), values); + + RouteCacheHolder.setRouteList(values); + return Flux.fromIterable(values); + } + +} diff --git a/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/support/RouteCacheHolder.java b/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/support/RouteCacheHolder.java new file mode 100644 index 0000000..75d525e --- /dev/null +++ b/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/support/RouteCacheHolder.java @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.common.gateway.support; + +import cn.hutool.cache.Cache; +import cn.hutool.cache.CacheUtil; +import com.pig4cloud.pigx.common.gateway.vo.RouteDefinitionVo; +import lombok.experimental.UtilityClass; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author lengleng + * @date 2019-08-16 + *

+ * 路由缓存工具类 + */ +@UtilityClass +public class RouteCacheHolder { + + private Cache cache = CacheUtil.newLFUCache(200); + + /** + * 获取缓存的全部对象 + * @return routeList + */ + public List getRouteList() { + List routeList = new ArrayList<>(); + cache.forEach(route -> routeList.add(route)); + return routeList; + } + + /** + * 更新缓存 + * @param routeList 缓存列表 + */ + public void setRouteList(List routeList) { + routeList.forEach(route -> cache.put(route.getId(), route)); + } + + /** + * 清空缓存 + */ + public void removeRouteList() { + cache.clear(); + } + +} diff --git a/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/vo/RouteDefinitionVo.java b/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/vo/RouteDefinitionVo.java new file mode 100644 index 0000000..7e5c9fd --- /dev/null +++ b/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/vo/RouteDefinitionVo.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.common.gateway.vo; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.cloud.gateway.route.RouteDefinition; + +import java.io.Serializable; + +/** + * @author lengleng + * @date 2018/10/31 + *

+ * 扩展此类支持序列化a See RouteDefinition.class + */ +@Data +@ToString(callSuper = true) +@EqualsAndHashCode(callSuper = false) +public class RouteDefinitionVo extends RouteDefinition implements Serializable { + + /** + * 路由名称 + */ + private String routeName; + +} diff --git a/pigx-common/pigx-common-gray/pom.xml b/pigx-common/pigx-common-gray/pom.xml new file mode 100644 index 0000000..7be5a21 --- /dev/null +++ b/pigx-common/pigx-common-gray/pom.xml @@ -0,0 +1,35 @@ + + + 4.0.0 + + com.pig4cloud + pigx-common + 5.2.0 + + + pigx-common-gray + jar + + pigx 灰度路由 + + + + com.pig4cloud + pigx-common-core + + + + org.springframework.cloud + spring-cloud-starter-loadbalancer + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + io.github.openfeign + feign-core + + + diff --git a/pigx-common/pigx-common-gray/src/main/java/com/pig4cloud/pigx/common/gray/GrayLoadBalancerAutoConfiguration.java b/pigx-common/pigx-common-gray/src/main/java/com/pig4cloud/pigx/common/gray/GrayLoadBalancerAutoConfiguration.java new file mode 100644 index 0000000..5897b80 --- /dev/null +++ b/pigx-common/pigx-common-gray/src/main/java/com/pig4cloud/pigx/common/gray/GrayLoadBalancerAutoConfiguration.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.common.gray; + +import com.pig4cloud.pigx.common.gray.feign.GrayFeignRequestInterceptor; +import com.pig4cloud.pigx.common.gray.rule.GrayLoadBalancerClientConfiguration; +import feign.RequestInterceptor; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.cloud.loadbalancer.annotation.LoadBalancerClients; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * @author lengleng + * @date 2020/1/12 + */ +@Configuration +@ConditionalOnProperty(value = "gray.rule.enabled", matchIfMissing = true) +@LoadBalancerClients(defaultConfiguration = GrayLoadBalancerClientConfiguration.class) +public class GrayLoadBalancerAutoConfiguration { + + @Bean + public RequestInterceptor grayFeignRequestInterceptor() { + return new GrayFeignRequestInterceptor(); + } + +} diff --git a/pigx-common/pigx-common-gray/src/main/java/com/pig4cloud/pigx/common/gray/feign/GrayFeignRequestInterceptor.java b/pigx-common/pigx-common-gray/src/main/java/com/pig4cloud/pigx/common/gray/feign/GrayFeignRequestInterceptor.java new file mode 100644 index 0000000..009bf09 --- /dev/null +++ b/pigx-common/pigx-common-gray/src/main/java/com/pig4cloud/pigx/common/gray/feign/GrayFeignRequestInterceptor.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.common.gray.feign; + +import cn.hutool.core.util.StrUtil; +import com.pig4cloud.pigx.common.core.constant.CommonConstants; +import com.pig4cloud.pigx.common.core.util.WebUtils; +import com.pig4cloud.pigx.common.gray.support.NonWebVersionContextHolder; +import feign.RequestInterceptor; +import feign.RequestTemplate; +import lombok.extern.slf4j.Slf4j; + +/** + * @author lengleng + * @date 2020/1/12 + *

+ * feign 请求VERSION 传递 + */ +@Slf4j +public class GrayFeignRequestInterceptor implements RequestInterceptor { + + /** + * Called for every request. Add data using methods on the supplied + * {@link RequestTemplate}. + * @param template + */ + @Override + public void apply(RequestTemplate template) { + String reqVersion = WebUtils.getRequest() != null ? WebUtils.getRequest().getHeader(CommonConstants.VERSION) + : NonWebVersionContextHolder.getVersion(); + + if (StrUtil.isNotBlank(reqVersion)) { + log.debug("feign gray add header version :{}", reqVersion); + template.header(CommonConstants.VERSION, reqVersion); + } + } + +} diff --git a/pigx-common/pigx-common-gray/src/main/java/com/pig4cloud/pigx/common/gray/rule/GrayLoadBalancerClientConfiguration.java b/pigx-common/pigx-common-gray/src/main/java/com/pig4cloud/pigx/common/gray/rule/GrayLoadBalancerClientConfiguration.java new file mode 100644 index 0000000..563cd92 --- /dev/null +++ b/pigx-common/pigx-common-gray/src/main/java/com/pig4cloud/pigx/common/gray/rule/GrayLoadBalancerClientConfiguration.java @@ -0,0 +1,27 @@ +package com.pig4cloud.pigx.common.gray.rule; + +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.cloud.client.ServiceInstance; +import org.springframework.cloud.loadbalancer.annotation.LoadBalancerClientConfiguration; +import org.springframework.cloud.loadbalancer.core.ReactorLoadBalancer; +import org.springframework.cloud.loadbalancer.core.ServiceInstanceListSupplier; +import org.springframework.cloud.loadbalancer.support.LoadBalancerClientFactory; +import org.springframework.context.annotation.Bean; +import org.springframework.core.env.Environment; + +/** + * @author lengleng + * @date 2020/12/29 + */ +public class GrayLoadBalancerClientConfiguration extends LoadBalancerClientConfiguration { + + @Bean + @ConditionalOnMissingBean + public ReactorLoadBalancer reactorServiceInstanceLoadBalancer(Environment environment, + LoadBalancerClientFactory loadBalancerClientFactory) { + String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME); + return new GrayRoundRobinLoadBalancer( + loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name); + } + +} diff --git a/pigx-common/pigx-common-gray/src/main/java/com/pig4cloud/pigx/common/gray/rule/GrayRoundRobinLoadBalancer.java b/pigx-common/pigx-common-gray/src/main/java/com/pig4cloud/pigx/common/gray/rule/GrayRoundRobinLoadBalancer.java new file mode 100644 index 0000000..4be7636 --- /dev/null +++ b/pigx-common/pigx-common-gray/src/main/java/com/pig4cloud/pigx/common/gray/rule/GrayRoundRobinLoadBalancer.java @@ -0,0 +1,133 @@ +package com.pig4cloud.pigx.common.gray.rule; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.cloud.nacos.NacosServiceInstance; +import com.alibaba.nacos.client.naming.utils.Chooser; +import com.alibaba.nacos.client.naming.utils.Pair; +import com.pig4cloud.pigx.common.core.constant.CommonConstants; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.ObjectProvider; +import org.springframework.cloud.client.ServiceInstance; +import org.springframework.cloud.client.loadbalancer.*; +import org.springframework.cloud.loadbalancer.core.NoopServiceInstanceListSupplier; +import org.springframework.cloud.loadbalancer.core.RoundRobinLoadBalancer; +import org.springframework.cloud.loadbalancer.core.ServiceInstanceListSupplier; +import org.springframework.http.HttpHeaders; +import reactor.core.publisher.Mono; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author lengleng + * @date 2020/11/20 + */ +@Slf4j +public class GrayRoundRobinLoadBalancer extends RoundRobinLoadBalancer { + + private ObjectProvider serviceInstanceListSupplierProvider; + + private String serviceId; + + /** + * @param serviceInstanceListSupplierProvider a provider of + * {@link ServiceInstanceListSupplier} that will be used to get available instances + * @param serviceId id of the service for which to choose an instance + */ + public GrayRoundRobinLoadBalancer(ObjectProvider serviceInstanceListSupplierProvider, + String serviceId) { + super(serviceInstanceListSupplierProvider, serviceId); + this.serviceInstanceListSupplierProvider = serviceInstanceListSupplierProvider; + this.serviceId = serviceId; + } + + @Override + public Mono> choose(Request request) { + ServiceInstanceListSupplier supplier = serviceInstanceListSupplierProvider + .getIfAvailable(NoopServiceInstanceListSupplier::new); + return supplier.get(request).next().map(serviceInstances -> getInstanceResponse(serviceInstances, request)); + + } + + Response getInstanceResponse(List instances, Request request) { + + // 注册中心无可用实例 抛出异常 + if (CollUtil.isEmpty(instances)) { + log.warn("No instance available serviceId: {}", serviceId); + return new EmptyResponse(); + } + + if (request == null || request.getContext() == null) { + return super.choose(request).block(); + } + + DefaultRequestContext requestContext = (DefaultRequestContext) request.getContext(); + if (!(requestContext.getClientRequest() instanceof RequestData)) { + return super.choose(request).block(); + } + + RequestData clientRequest = (RequestData) requestContext.getClientRequest(); + HttpHeaders headers = clientRequest.getHeaders(); + + String reqVersion = headers.getFirst(CommonConstants.VERSION); + if (StrUtil.isBlank(reqVersion)) { + // 过滤出不含VERSION实例 + List versionInstanceList = instances.stream() + .filter(instance -> !instance.getMetadata().containsKey(CommonConstants.VERSION)) + .collect(Collectors.toList()); + if (CollUtil.isEmpty(versionInstanceList)) { + // 根据权重获取实例 + return new DefaultResponse(randomByWeight(instances)); + } + // 根据权重获取实例 + return new DefaultResponse(randomByWeight(versionInstanceList)); + } + + // 遍历可以实例元数据,若匹配则返回此实例 + List serviceInstanceList = instances.stream().filter(instance -> { + NacosServiceInstance nacosInstance = (NacosServiceInstance) instance; + Map metadata = nacosInstance.getMetadata(); + String targetVersion = MapUtil.getStr(metadata, CommonConstants.VERSION); + return reqVersion.equalsIgnoreCase(targetVersion); + }).collect(Collectors.toList()); + + // 存在 随机返回 + if (CollUtil.isNotEmpty(serviceInstanceList)) { + ServiceInstance instance = randomByWeight(serviceInstanceList); + + log.debug("gray instance available serviceId: {} , instanceId: {}", serviceId, instance.getInstanceId()); + return new DefaultResponse(instance); + } + else { + // 不存在,降级策略,使用轮询策略 + return super.choose(request).block(); + } + } + + /** + * 根据nacos设置的权重返回实例 + * @param serviceInstances 服务实例集合 + * @return 服务实例:ServiceInstance + */ + protected ServiceInstance randomByWeight(final List serviceInstances) { + if (serviceInstances.size() == 1) { + return serviceInstances.get(0); + } + else { + List> hostsWithWeight = new ArrayList<>(); + for (ServiceInstance serviceInstance : serviceInstances) { + if ("true".equals(serviceInstance.getMetadata().getOrDefault("nacos.healthy", "true"))) { + hostsWithWeight.add(new Pair<>(serviceInstance, + Double.parseDouble(serviceInstance.getMetadata().getOrDefault("nacos.weight", "1")))); + } + } + Chooser vipChooser = new Chooser<>("www.taobao.com", hostsWithWeight); + return vipChooser.randomWithWeight(); + } + } + +} diff --git a/pigx-common/pigx-common-gray/src/main/java/com/pig4cloud/pigx/common/gray/support/NonWebVersionContextHolder.java b/pigx-common/pigx-common-gray/src/main/java/com/pig4cloud/pigx/common/gray/support/NonWebVersionContextHolder.java new file mode 100644 index 0000000..021ab33 --- /dev/null +++ b/pigx-common/pigx-common-gray/src/main/java/com/pig4cloud/pigx/common/gray/support/NonWebVersionContextHolder.java @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.common.gray.support; + +import com.alibaba.ttl.TransmittableThreadLocal; +import lombok.experimental.UtilityClass; + +/** + * @author lengleng + * @date 2020-10-16 + *

+ * 灰度版本号传递工具 ,在非web 调用feign 传递之前手动setVersion + */ +@UtilityClass +public class NonWebVersionContextHolder { + + private final ThreadLocal THREAD_LOCAL_VERSION = new TransmittableThreadLocal<>(); + + /** + * TTL 设置版本号
+ * @param version 版本号 + */ + public void setVersion(String version) { + THREAD_LOCAL_VERSION.set(version); + } + + /** + * 获取TTL中的版本号 + * @return 版本 || null + */ + public String getVersion() { + return THREAD_LOCAL_VERSION.get(); + } + + public void clear() { + THREAD_LOCAL_VERSION.remove(); + } + +} diff --git a/pigx-common/pigx-common-gray/src/main/resources/META-INF/spring-configuration-metadata.json b/pigx-common/pigx-common-gray/src/main/resources/META-INF/spring-configuration-metadata.json new file mode 100644 index 0000000..7f64b70 --- /dev/null +++ b/pigx-common/pigx-common-gray/src/main/resources/META-INF/spring-configuration-metadata.json @@ -0,0 +1,12 @@ +{ + "properties": [ + { + "name": "gray.rule.enabled", + "type": "java.lang.Boolean", + "defaultValue": false, + "sourceType": "com.pig4cloud.pigx.common.gray.GrayLoadBalancerAutoConfiguration", + "description": "是否开启灰度路由功能" + } + ], + "hints": [] +} diff --git a/pigx-common/pigx-common-gray/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/pigx-common/pigx-common-gray/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 0000000..82240c2 --- /dev/null +++ b/pigx-common/pigx-common-gray/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1 @@ +com.pig4cloud.pigx.common.gray.GrayLoadBalancerAutoConfiguration diff --git a/pigx-common/pigx-common-idempotent/pom.xml b/pigx-common/pigx-common-idempotent/pom.xml new file mode 100644 index 0000000..b70de06 --- /dev/null +++ b/pigx-common/pigx-common-idempotent/pom.xml @@ -0,0 +1,45 @@ + + + 4.0.0 + + com.pig4cloud + pigx-common + 5.2.0 + + + pigx-common-idempotent + jar + + pigx 幂等插件 + + + 3.17.3 + + + + + com.pig4cloud + pigx-common-core + + + + org.springframework.boot + spring-boot-starter-aop + provided + + + + + org.redisson + redisson-spring-boot-starter + ${redisson.version} + + + + + jakarta.servlet + jakarta.servlet-api + + + diff --git a/pigx-common/pigx-common-idempotent/src/main/java/com/pig4cloud/pigx/common/idempotent/IdempotentAutoConfiguration.java b/pigx-common/pigx-common-idempotent/src/main/java/com/pig4cloud/pigx/common/idempotent/IdempotentAutoConfiguration.java new file mode 100644 index 0000000..5c9a22a --- /dev/null +++ b/pigx-common/pigx-common-idempotent/src/main/java/com/pig4cloud/pigx/common/idempotent/IdempotentAutoConfiguration.java @@ -0,0 +1,41 @@ +package com.pig4cloud.pigx.common.idempotent; + +import com.pig4cloud.pigx.common.idempotent.aspect.IdempotentAspect; +import com.pig4cloud.pigx.common.idempotent.expression.ExpressionResolver; +import com.pig4cloud.pigx.common.idempotent.expression.KeyResolver; +import org.springframework.boot.autoconfigure.AutoConfigureAfter; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * @author lengleng + * @date 2020/9/25 + *

+ * 幂等插件初始化 + */ +@Configuration(proxyBeanMethods = false) +@AutoConfigureAfter(RedisAutoConfiguration.class) +public class IdempotentAutoConfiguration { + + /** + * 切面 拦截处理所有 @Idempotent + * @return Aspect + */ + @Bean + public IdempotentAspect idempotentAspect() { + return new IdempotentAspect(); + } + + /** + * key 解析器 + * @return KeyResolver + */ + @Bean + @ConditionalOnMissingBean(KeyResolver.class) + public KeyResolver keyResolver() { + return new ExpressionResolver(); + } + +} diff --git a/pigx-common/pigx-common-idempotent/src/main/java/com/pig4cloud/pigx/common/idempotent/annotation/Idempotent.java b/pigx-common/pigx-common-idempotent/src/main/java/com/pig4cloud/pigx/common/idempotent/annotation/Idempotent.java new file mode 100644 index 0000000..2e7a1c2 --- /dev/null +++ b/pigx-common/pigx-common-idempotent/src/main/java/com/pig4cloud/pigx/common/idempotent/annotation/Idempotent.java @@ -0,0 +1,44 @@ +package com.pig4cloud.pigx.common.idempotent.annotation; + +import java.lang.annotation.*; +import java.util.concurrent.TimeUnit; + +/** + * @author ITyunqing + */ +@Inherited +@Target(ElementType.METHOD) +@Retention(value = RetentionPolicy.RUNTIME) +public @interface Idempotent { + + /** + * 幂等操作的唯一标识,使用spring el表达式 用#来引用方法参数 + * @return Spring-EL expression + */ + String key() default ""; + + /** + * 有效期 默认:1 有效期要大于程序执行时间,否则请求还是可能会进来 + * @return expireTime + */ + int expireTime() default 1; + + /** + * 时间单位 默认:s + * @return TimeUnit + */ + TimeUnit timeUnit() default TimeUnit.SECONDS; + + /** + * 提示信息,可自定义 + * @return String + */ + String info() default "重复请求,请稍后重试"; + + /** + * 是否在业务完成后删除key true:删除 false:不删除 + * @return boolean + */ + boolean delKey() default false; + +} diff --git a/pigx-common/pigx-common-idempotent/src/main/java/com/pig4cloud/pigx/common/idempotent/aspect/IdempotentAspect.java b/pigx-common/pigx-common-idempotent/src/main/java/com/pig4cloud/pigx/common/idempotent/aspect/IdempotentAspect.java new file mode 100644 index 0000000..7c258ac --- /dev/null +++ b/pigx-common/pigx-common-idempotent/src/main/java/com/pig4cloud/pigx/common/idempotent/aspect/IdempotentAspect.java @@ -0,0 +1,145 @@ +package com.pig4cloud.pigx.common.idempotent.aspect; + +import cn.hutool.core.util.StrUtil; +import com.pig4cloud.pigx.common.core.util.KeyStrResolver; +import com.pig4cloud.pigx.common.idempotent.annotation.Idempotent; +import com.pig4cloud.pigx.common.idempotent.exception.IdempotentException; +import com.pig4cloud.pigx.common.idempotent.expression.KeyResolver; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.annotation.After; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Before; +import org.aspectj.lang.annotation.Pointcut; +import org.aspectj.lang.reflect.MethodSignature; +import org.redisson.Redisson; +import org.redisson.api.RMapCache; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import javax.servlet.http.HttpServletRequest; +import java.lang.reflect.Method; +import java.time.LocalDateTime; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; +import java.util.concurrent.TimeUnit; + +/** + * The Idempotent Aspect + * + * @author ITyunqing + */ +@Aspect +public class IdempotentAspect { + + private static final Logger LOGGER = LoggerFactory.getLogger(IdempotentAspect.class); + + private static final ThreadLocal> THREAD_CACHE = ThreadLocal.withInitial(HashMap::new); + + private static final String RMAPCACHE_KEY = "idempotent"; + + private static final String KEY = "key"; + + private static final String DELKEY = "delKey"; + + @Autowired + private Redisson redisson; + + @Autowired + private KeyResolver keyResolver; + + @Autowired + private Optional keyStrResolverOptional; + + @Pointcut("@annotation(com.pig4cloud.pigx.common.idempotent.annotation.Idempotent)") + public void pointCut() { + } + + @Before("pointCut()") + public void beforePointCut(JoinPoint joinPoint) { + ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder + .getRequestAttributes(); + HttpServletRequest request = requestAttributes.getRequest(); + + MethodSignature signature = (MethodSignature) joinPoint.getSignature(); + Method method = signature.getMethod(); + if (!method.isAnnotationPresent(Idempotent.class)) { + return; + } + Idempotent idempotent = method.getAnnotation(Idempotent.class); + + String key; + + // 若没有配置 幂等 标识编号,则使用 url + 参数列表作为区分 + if (!StringUtils.hasLength(idempotent.key())) { + String url = request.getRequestURL().toString(); + String argString = Arrays.asList(joinPoint.getArgs()).toString(); + key = url + argString; + } + else { + // 使用jstl 规则区分 + key = keyResolver.resolver(idempotent, joinPoint); + } + + if (keyStrResolverOptional.isPresent()) { + key = keyStrResolverOptional.get().extract(key, StrUtil.COLON); + } + + long expireTime = idempotent.expireTime(); + String info = idempotent.info(); + TimeUnit timeUnit = idempotent.timeUnit(); + boolean delKey = idempotent.delKey(); + + // do not need check null + RMapCache rMapCache = redisson.getMapCache(RMAPCACHE_KEY); + String value = LocalDateTime.now().toString().replace("T", " "); + Object v1; + if (null != rMapCache.get(key)) { + // had stored + throw new IdempotentException("[idempotent]:" + info); + } + synchronized (this) { + v1 = rMapCache.putIfAbsent(key, value, expireTime, timeUnit); + if (null != v1) { + throw new IdempotentException("[idempotent]:" + info); + } + else { + LOGGER.info("[idempotent]:has stored key={},value={},expireTime={}{},now={}", key, value, expireTime, + timeUnit, LocalDateTime.now().toString()); + } + } + + Map map = THREAD_CACHE.get(); + map.put(KEY, key); + map.put(DELKEY, delKey); + } + + @After("pointCut()") + public void afterPointCut(JoinPoint joinPoint) { + Map map = THREAD_CACHE.get(); + if (CollectionUtils.isEmpty(map)) { + return; + } + + RMapCache mapCache = redisson.getMapCache(RMAPCACHE_KEY); + if (mapCache.size() == 0) { + return; + } + + String key = map.get(KEY).toString(); + boolean delKey = (boolean) map.get(DELKEY); + + if (delKey) { + mapCache.fastRemove(key); + LOGGER.info("[idempotent]:has removed key={}", key); + } + THREAD_CACHE.remove(); + } + +} diff --git a/pigx-common/pigx-common-idempotent/src/main/java/com/pig4cloud/pigx/common/idempotent/exception/IdempotentException.java b/pigx-common/pigx-common-idempotent/src/main/java/com/pig4cloud/pigx/common/idempotent/exception/IdempotentException.java new file mode 100644 index 0000000..e45c068 --- /dev/null +++ b/pigx-common/pigx-common-idempotent/src/main/java/com/pig4cloud/pigx/common/idempotent/exception/IdempotentException.java @@ -0,0 +1,32 @@ +package com.pig4cloud.pigx.common.idempotent.exception; + +/** + * Idempotent Exception If there is a custom global exception, you need to inherit the + * custom global exception. + * + * @author ITyunqing + */ +public class IdempotentException extends RuntimeException { + + public IdempotentException() { + super(); + } + + public IdempotentException(String message) { + super(message); + } + + public IdempotentException(String message, Throwable cause) { + super(message, cause); + } + + public IdempotentException(Throwable cause) { + super(cause); + } + + protected IdempotentException(String message, Throwable cause, boolean enableSuppression, + boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } + +} diff --git a/pigx-common/pigx-common-idempotent/src/main/java/com/pig4cloud/pigx/common/idempotent/expression/ExpressionResolver.java b/pigx-common/pigx-common-idempotent/src/main/java/com/pig4cloud/pigx/common/idempotent/expression/ExpressionResolver.java new file mode 100644 index 0000000..a281574 --- /dev/null +++ b/pigx-common/pigx-common-idempotent/src/main/java/com/pig4cloud/pigx/common/idempotent/expression/ExpressionResolver.java @@ -0,0 +1,66 @@ +package com.pig4cloud.pigx.common.idempotent.expression; + +/** + * @author lengleng + * @date 2020/9/25 + */ + +import com.pig4cloud.pigx.common.idempotent.annotation.Idempotent; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.reflect.MethodSignature; +import org.springframework.core.LocalVariableTableParameterNameDiscoverer; +import org.springframework.expression.Expression; +import org.springframework.expression.spel.standard.SpelExpressionParser; +import org.springframework.expression.spel.support.StandardEvaluationContext; + +import java.lang.reflect.Method; + +/** + * @author lengleng + *

+ * 默认key 抽取, 优先根据 spel 处理 + * @date 2020-09-25 + */ +public class ExpressionResolver implements KeyResolver { + + private static final SpelExpressionParser PARSER = new SpelExpressionParser(); + + private static final LocalVariableTableParameterNameDiscoverer DISCOVERER = new LocalVariableTableParameterNameDiscoverer(); + + @Override + public String resolver(Idempotent idempotent, JoinPoint point) { + Object[] arguments = point.getArgs(); + String[] params = DISCOVERER.getParameterNames(getMethod(point)); + StandardEvaluationContext context = new StandardEvaluationContext(); + + if (params != null && params.length > 0) { + for (int len = 0; len < params.length; len++) { + context.setVariable(params[len], arguments[len]); + } + } + + Expression expression = PARSER.parseExpression(idempotent.key()); + return expression.getValue(context, String.class); + } + + /** + * 根据切点解析方法信息 + * @param joinPoint 切点信息 + * @return Method 原信息 + */ + private Method getMethod(JoinPoint joinPoint) { + MethodSignature signature = (MethodSignature) joinPoint.getSignature(); + Method method = signature.getMethod(); + if (method.getDeclaringClass().isInterface()) { + try { + method = joinPoint.getTarget().getClass().getDeclaredMethod(joinPoint.getSignature().getName(), + method.getParameterTypes()); + } + catch (SecurityException | NoSuchMethodException e) { + throw new RuntimeException(e); + } + } + return method; + } + +} diff --git a/pigx-common/pigx-common-idempotent/src/main/java/com/pig4cloud/pigx/common/idempotent/expression/KeyResolver.java b/pigx-common/pigx-common-idempotent/src/main/java/com/pig4cloud/pigx/common/idempotent/expression/KeyResolver.java new file mode 100644 index 0000000..e061b46 --- /dev/null +++ b/pigx-common/pigx-common-idempotent/src/main/java/com/pig4cloud/pigx/common/idempotent/expression/KeyResolver.java @@ -0,0 +1,22 @@ +package com.pig4cloud.pigx.common.idempotent.expression; + +import com.pig4cloud.pigx.common.idempotent.annotation.Idempotent; +import org.aspectj.lang.JoinPoint; + +/** + * @author lengleng + * @date 2020/9/25 + *

+ * 唯一标志处理器 + */ +public interface KeyResolver { + + /** + * 解析处理 key + * @param idempotent 接口注解标识 + * @param point 接口切点信息 + * @return 处理结果 + */ + String resolver(Idempotent idempotent, JoinPoint point); + +} diff --git a/pigx-common/pigx-common-idempotent/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/pigx-common/pigx-common-idempotent/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 0000000..8e8d19d --- /dev/null +++ b/pigx-common/pigx-common-idempotent/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1 @@ +com.pig4cloud.pigx.common.idempotent.IdempotentAutoConfiguration diff --git a/pigx-common/pigx-common-job/pom.xml b/pigx-common/pigx-common-job/pom.xml new file mode 100644 index 0000000..00af29a --- /dev/null +++ b/pigx-common/pigx-common-job/pom.xml @@ -0,0 +1,29 @@ + + + 4.0.0 + + com.pig4cloud + pigx-common + 5.2.0 + + + pigx-common-job + jar + + pigx 定时任务 + + + + + com.xuxueli + xxl-job-core + ${xxl.job.version} + + + + org.springframework.cloud + spring-cloud-commons + + + diff --git a/pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/job/XxlJobAutoConfiguration.java b/pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/job/XxlJobAutoConfiguration.java new file mode 100644 index 0000000..57ca198 --- /dev/null +++ b/pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/job/XxlJobAutoConfiguration.java @@ -0,0 +1,71 @@ +package com.pig4cloud.pigx.common.job; + +import com.pig4cloud.pigx.common.job.properties.XxlExecutorProperties; +import com.pig4cloud.pigx.common.job.properties.XxlJobProperties; +import com.xxl.job.core.executor.impl.XxlJobSpringExecutor; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.cloud.client.discovery.DiscoveryClient; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.env.Environment; +import org.springframework.util.StringUtils; + +import java.util.stream.Collectors; + +/** + * xxl-job自动装配 + * + * @author lishangbu + * @date 2020/9/14 + */ +@Configuration(proxyBeanMethods = false) +@EnableAutoConfiguration +@EnableConfigurationProperties(XxlJobProperties.class) +public class XxlJobAutoConfiguration { + + /** + * 服务名称 包含 XXL_JOB_ADMIN 则说明是 Admin + */ + private static final String XXL_JOB_ADMIN = "xxl-job-admin"; + + /** + * 配置xxl-job 执行器,提供自动发现 xxl-job-admin 能力 + * @param xxlJobProperties xxl 配置 + * @param discoveryClient 注册发现客户端 + * @return + */ + @Bean + public XxlJobSpringExecutor xxlJobSpringExecutor(XxlJobProperties xxlJobProperties, Environment environment, + DiscoveryClient discoveryClient) { + XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor(); + XxlExecutorProperties executor = xxlJobProperties.getExecutor(); + // 应用名默认为服务名 + String appName = executor.getAppname(); + if (!StringUtils.hasText(appName)) { + appName = environment.getProperty("spring.application.name"); + } + xxlJobSpringExecutor.setAppname(appName); + xxlJobSpringExecutor.setAddress(executor.getAddress()); + xxlJobSpringExecutor.setIp(executor.getIp()); + xxlJobSpringExecutor.setPort(executor.getPort()); + xxlJobSpringExecutor.setAccessToken(executor.getAccessToken()); + xxlJobSpringExecutor.setLogPath(executor.getLogPath()); + xxlJobSpringExecutor.setLogRetentionDays(executor.getLogRetentionDays()); + + // 如果配置为空则获取注册中心的服务列表 "http://pigx-xxl:9080/xxl-job-admin" + if (!StringUtils.hasText(xxlJobProperties.getAdmin().getAddresses())) { + String serverList = discoveryClient.getServices().stream().filter(s -> s.contains(XXL_JOB_ADMIN)) + .flatMap(s -> discoveryClient.getInstances(s).stream()).map(instance -> String + .format("http://%s:%s/%s", instance.getHost(), instance.getPort(), XXL_JOB_ADMIN)) + .collect(Collectors.joining(",")); + xxlJobSpringExecutor.setAdminAddresses(serverList); + } + else { + xxlJobSpringExecutor.setAdminAddresses(xxlJobProperties.getAdmin().getAddresses()); + } + + return xxlJobSpringExecutor; + } + +} diff --git a/pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/job/annotation/EnablePigxXxlJob.java b/pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/job/annotation/EnablePigxXxlJob.java new file mode 100644 index 0000000..439843b --- /dev/null +++ b/pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/job/annotation/EnablePigxXxlJob.java @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.common.job.annotation; + +import com.pig4cloud.pigx.common.job.XxlJobAutoConfiguration; +import org.springframework.context.annotation.Import; + +import java.lang.annotation.*; + +/** + * @author lengleng + * @date 2019-09-18 + *

+ * 开启支持XXL + */ +@Target({ ElementType.TYPE }) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@Inherited +@Import({ XxlJobAutoConfiguration.class }) +public @interface EnablePigxXxlJob { + +} diff --git a/pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/job/properties/XxlAdminProperties.java b/pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/job/properties/XxlAdminProperties.java new file mode 100644 index 0000000..0f7d054 --- /dev/null +++ b/pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/job/properties/XxlAdminProperties.java @@ -0,0 +1,19 @@ +package com.pig4cloud.pigx.common.job.properties; + +import lombok.Data; + +/** + * xxl-job管理平台配置 + * + * @author lishangbu + * @date 2020/9/14 + */ +@Data +public class XxlAdminProperties { + + /** + * 调度中心部署跟地址 [选填]:如调度中心集群部署存在多个地址则用逗号分隔。 执行器将会使用该地址进行"执行器心跳注册"和"任务结果回调";为空则关闭自动注册; + */ + private String addresses; + +} diff --git a/pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/job/properties/XxlExecutorProperties.java b/pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/job/properties/XxlExecutorProperties.java new file mode 100644 index 0000000..d331b5a --- /dev/null +++ b/pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/job/properties/XxlExecutorProperties.java @@ -0,0 +1,50 @@ +package com.pig4cloud.pigx.common.job.properties; + +import lombok.Data; + +/** + * xxl-job执行器配置 + * + * @author lishangbu + * @date 2020/9/14 + */ +@Data +public class XxlExecutorProperties { + + /** + * 执行器AppName [选填]:执行器心跳注册分组依据;为空则关闭自动注册 + */ + private String appname; + + /** + * 服务注册地址,优先使用该配置作为注册地址 为空时使用内嵌服务 ”IP:PORT“ 作为注册地址 从而更灵活的支持容器类型执行器动态IP和动态映射端口问题 + */ + private String address; + + /** + * 执行器IP [选填]:默认为空表示自动获取IP,多网卡时可手动设置指定IP ,该IP不会绑定Host仅作为通讯实用;地址信息用于 "执行器注册" 和 + * "调度中心请求并触发任务" + */ + private String ip; + + /** + * 执行器端口号 [选填]:小于等于0则自动获取;默认端口为9099,单机部署多个执行器时,注意要配置不同执行器端口; + */ + private Integer port = 9099; + + /** + * 执行器通讯TOKEN [选填]:非空时启用; + */ + private String accessToken; + + /** + * 执行器运行日志文件存储磁盘路径 [选填] :需要对该路径拥有读写权限;为空则使用默认路径; + */ + private String logPath = "logs/applogs/xxl-job/jobhandler"; + + /** + * 执行器日志保存天数 [选填] :值大于3时生效,启用执行器Log文件定期清理功能,否则不生效; + */ + private Integer logRetentionDays = 30; + +} diff --git a/pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/job/properties/XxlJobProperties.java b/pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/job/properties/XxlJobProperties.java new file mode 100644 index 0000000..896c7aa --- /dev/null +++ b/pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/job/properties/XxlJobProperties.java @@ -0,0 +1,23 @@ +package com.pig4cloud.pigx.common.job.properties; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.boot.context.properties.NestedConfigurationProperty; + +/** + * xxl-job配置 + * + * @author lishangbu + * @date 2020/9/14 + */ +@Data +@ConfigurationProperties(prefix = "xxl.job") +public class XxlJobProperties { + + @NestedConfigurationProperty + private XxlAdminProperties admin = new XxlAdminProperties(); + + @NestedConfigurationProperty + private XxlExecutorProperties executor = new XxlExecutorProperties(); + +} diff --git a/pigx-common/pigx-common-log/pom.xml b/pigx-common/pigx-common-log/pom.xml new file mode 100644 index 0000000..441bbf4 --- /dev/null +++ b/pigx-common/pigx-common-log/pom.xml @@ -0,0 +1,47 @@ + + + 4.0.0 + + com.pig4cloud + pigx-common + 5.2.0 + + + pigx-common-log + jar + + pigx 日志服务 + + + + + + com.pig4cloud + pigx-common-core + + + + cn.hutool + hutool-http + + + cn.hutool + hutool-extra + + + + com.pig4cloud + as-upms-api + + + + org.springframework.security + spring-security-core + + + org.springframework.security + spring-security-oauth2-core + + + diff --git a/pigx-common/pigx-common-log/src/main/java/com/pig4cloud/pigx/common/log/LogAutoConfiguration.java b/pigx-common/pigx-common-log/src/main/java/com/pig4cloud/pigx/common/log/LogAutoConfiguration.java new file mode 100644 index 0000000..eef80f3 --- /dev/null +++ b/pigx-common/pigx-common-log/src/main/java/com/pig4cloud/pigx/common/log/LogAutoConfiguration.java @@ -0,0 +1,55 @@ +/* + * + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + * + */ + +package com.pig4cloud.pigx.common.log; + +import com.pig4cloud.pigx.admin.api.feign.RemoteLogService; +import com.pig4cloud.pigx.common.core.util.KeyStrResolver; +import com.pig4cloud.pigx.common.log.aspect.SysLogAspect; +import com.pig4cloud.pigx.common.log.config.PigxLogProperties; +import com.pig4cloud.pigx.common.log.event.SysLogListener; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.EnableAsync; + +/** + * @author lengleng + * @date 2018/6/28 + *

+ * 日志自动配置 + */ +@EnableAsync +@Configuration(proxyBeanMethods = false) +@EnableConfigurationProperties(PigxLogProperties.class) +@ConditionalOnProperty(value = "pigx.log.enabled", matchIfMissing = true) +public class LogAutoConfiguration { + + @Bean + public SysLogListener sysLogListener(PigxLogProperties logProperties, RemoteLogService remoteLogService) { + return new SysLogListener(remoteLogService, logProperties); + } + + @Bean + public SysLogAspect sysLogAspect(KeyStrResolver resolver) { + return new SysLogAspect(resolver); + } + +} diff --git a/pigx-common/pigx-common-log/src/main/java/com/pig4cloud/pigx/common/log/annotation/SysLog.java b/pigx-common/pigx-common-log/src/main/java/com/pig4cloud/pigx/common/log/annotation/SysLog.java new file mode 100644 index 0000000..6ff5c2a --- /dev/null +++ b/pigx-common/pigx-common-log/src/main/java/com/pig4cloud/pigx/common/log/annotation/SysLog.java @@ -0,0 +1,45 @@ +/* + * + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + * + */ + +package com.pig4cloud.pigx.common.log.annotation; + +import java.lang.annotation.*; + +/** + * @author lengleng + * @date 2018/6/28 操作日志注解 + */ +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface SysLog { + + /** + * 描述 + * @return {String} + */ + String value() default ""; + + /** + * spel 表达式 + * @return 日志描述 + */ + String expression() default ""; + +} diff --git a/pigx-common/pigx-common-log/src/main/java/com/pig4cloud/pigx/common/log/aspect/SysLogAspect.java b/pigx-common/pigx-common-log/src/main/java/com/pig4cloud/pigx/common/log/aspect/SysLogAspect.java new file mode 100644 index 0000000..4e204e1 --- /dev/null +++ b/pigx-common/pigx-common-log/src/main/java/com/pig4cloud/pigx/common/log/aspect/SysLogAspect.java @@ -0,0 +1,99 @@ +/* + * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.pig4cloud.pigx.common.log.aspect; + +import cn.hutool.core.util.StrUtil; +import com.pig4cloud.pigx.admin.api.dto.SysLogDTO; +import com.pig4cloud.pigx.common.core.util.KeyStrResolver; +import com.pig4cloud.pigx.common.core.util.SpringContextHolder; +import com.pig4cloud.pigx.common.log.annotation.SysLog; +import com.pig4cloud.pigx.common.log.event.SysLogEvent; +import com.pig4cloud.pigx.common.log.util.LogTypeEnum; +import com.pig4cloud.pigx.common.log.util.SysLogUtils; +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.reflect.MethodSignature; +import org.springframework.expression.EvaluationContext; + +/** + * 操作日志使用spring event异步入库 + * + * @author L.cm + */ +@Aspect +@Slf4j +@RequiredArgsConstructor +public class SysLogAspect { + + private final KeyStrResolver tenantKeyStrResolver; + + @Around("@annotation(sysLog)") + @SneakyThrows + public Object around(ProceedingJoinPoint point, SysLog sysLog) { + String strClassName = point.getTarget().getClass().getName(); + String strMethodName = point.getSignature().getName(); + log.debug("[类名]:{},[方法]:{}", strClassName, strMethodName); + + String value = sysLog.value(); + String expression = sysLog.expression(); + // 当前表达式存在 SPEL,会覆盖 value 的值 + if (StrUtil.isNotBlank(expression)) { + // 解析SPEL + MethodSignature signature = (MethodSignature) point.getSignature(); + EvaluationContext context = SysLogUtils.getContext(point.getArgs(), signature.getMethod()); + try { + value = SysLogUtils.getValue(context, expression, String.class); + } + catch (Exception e) { + // SPEL 表达式异常,获取 value 的值 + log.error("@SysLog 解析SPEL {} 异常", expression); + } + } + + SysLogDTO logVo = SysLogUtils.getSysLog(); + logVo.setTitle(value); + // 获取请求body参数 + if (StrUtil.isBlank(logVo.getParams())) { + logVo.setBody(point.getArgs()); + } + // 发送异步日志事件 + Long startTime = System.currentTimeMillis(); + Object obj; + + try { + obj = point.proceed(); + } + catch (Exception e) { + logVo.setLogType(LogTypeEnum.ERROR.getType()); + logVo.setException(e.getMessage()); + throw e; + } + finally { + Long endTime = System.currentTimeMillis(); + logVo.setTime(endTime - startTime); + logVo.setTenantId(Long.parseLong(tenantKeyStrResolver.key())); + SpringContextHolder.publishEvent(new SysLogEvent(logVo)); + } + + return obj; + } + +} diff --git a/pigx-common/pigx-common-log/src/main/java/com/pig4cloud/pigx/common/log/config/PigxLogProperties.java b/pigx-common/pigx-common-log/src/main/java/com/pig4cloud/pigx/common/log/config/PigxLogProperties.java new file mode 100644 index 0000000..8b62567 --- /dev/null +++ b/pigx-common/pigx-common-log/src/main/java/com/pig4cloud/pigx/common/log/config/PigxLogProperties.java @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2019-2029, Dreamlu 卢春梦 (596392912@qq.com & www.dreamlu.net). + *

+ * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE 3.0; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.gnu.org/licenses/lgpl.html + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.pig4cloud.pigx.common.log.config; + +import lombok.Getter; +import lombok.Setter; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.context.properties.ConfigurationProperties; + +import java.util.List; + +/** + * 日志配置类 + * + * @author L.cm + */ +@Getter +@Setter +@ConfigurationProperties(PigxLogProperties.PREFIX) +public class PigxLogProperties { + + public static final String PREFIX = "pigx.log"; + + /** + * 开启日志记录 + */ + private boolean enabled = true; + + /** + * 记录请求报文体 + */ + private boolean requestEnabled = true; + + /** + * 放行字段,password,mobile,idcard,phone + */ + @Value("${pigx.log.exclude-fields:password,mobile,idcard,phone}") + private List excludeFields; + + /** + * 请求报文最大存储长度 + */ + private Integer maxLength = 2000; + +} diff --git a/pigx-common/pigx-common-log/src/main/java/com/pig4cloud/pigx/common/log/event/SysLogEvent.java b/pigx-common/pigx-common-log/src/main/java/com/pig4cloud/pigx/common/log/event/SysLogEvent.java new file mode 100644 index 0000000..a164060 --- /dev/null +++ b/pigx-common/pigx-common-log/src/main/java/com/pig4cloud/pigx/common/log/event/SysLogEvent.java @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.pig4cloud.pigx.common.log.event; + +import com.pig4cloud.pigx.admin.api.dto.SysLogDTO; +import org.springframework.context.ApplicationEvent; + +/** + * @author lengleng 系统日志事件 + */ +public class SysLogEvent extends ApplicationEvent { + + public SysLogEvent(SysLogDTO source) { + super(source); + } + +} diff --git a/pigx-common/pigx-common-log/src/main/java/com/pig4cloud/pigx/common/log/event/SysLogListener.java b/pigx-common/pigx-common-log/src/main/java/com/pig4cloud/pigx/common/log/event/SysLogListener.java new file mode 100644 index 0000000..411a8f3 --- /dev/null +++ b/pigx-common/pigx-common-log/src/main/java/com/pig4cloud/pigx/common/log/event/SysLogListener.java @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.pig4cloud.pigx.common.log.event; + +import cn.hutool.core.util.StrUtil; +import com.fasterxml.jackson.annotation.JsonFilter; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.ser.FilterProvider; +import com.fasterxml.jackson.databind.ser.impl.SimpleBeanPropertyFilter; +import com.fasterxml.jackson.databind.ser.impl.SimpleFilterProvider; +import com.pig4cloud.pigx.admin.api.dto.SysLogDTO; +import com.pig4cloud.pigx.admin.api.feign.RemoteLogService; +import com.pig4cloud.pigx.common.core.constant.SecurityConstants; +import com.pig4cloud.pigx.common.core.jackson.PigxJavaTimeModule; +import com.pig4cloud.pigx.common.log.config.PigxLogProperties; +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.context.event.EventListener; +import org.springframework.core.annotation.Order; +import org.springframework.scheduling.annotation.Async; + +import java.util.Objects; + +/** + * @author lengleng 异步监听日志事件 + */ +@Slf4j +@RequiredArgsConstructor +public class SysLogListener implements InitializingBean { + + // new 一个 避免日志脱敏策略影响全局ObjectMapper + private final static ObjectMapper objectMapper = new ObjectMapper(); + + private final RemoteLogService remoteLogService; + + private final PigxLogProperties logProperties; + + @SneakyThrows + @Async + @Order + @EventListener(SysLogEvent.class) + public void saveSysLog(SysLogEvent event) { + SysLogDTO source = (SysLogDTO) event.getSource(); + + // json 格式刷参数放在异步中处理,提升性能 + if (Objects.nonNull(source.getBody()) && logProperties.isRequestEnabled()) { + String params = objectMapper.writeValueAsString(source.getBody()); + source.setParams(StrUtil.subPre(params, logProperties.getMaxLength())); + } + + source.setBody(null); + remoteLogService.saveLog(source, SecurityConstants.FROM_IN); + } + + @Override + public void afterPropertiesSet() { + objectMapper.addMixIn(Object.class, PropertyFilterMixIn.class); + String[] ignorableFieldNames = logProperties.getExcludeFields().toArray(new String[0]); + + FilterProvider filters = new SimpleFilterProvider().addFilter("filter properties by name", + SimpleBeanPropertyFilter.serializeAllExcept(ignorableFieldNames)); + objectMapper.setFilterProvider(filters); + objectMapper.registerModule(new PigxJavaTimeModule()); + } + + @JsonFilter("filter properties by name") + class PropertyFilterMixIn { + + } + +} diff --git a/pigx-common/pigx-common-log/src/main/java/com/pig4cloud/pigx/common/log/init/ApplicationLoggerInitializer.java b/pigx-common/pigx-common-log/src/main/java/com/pig4cloud/pigx/common/log/init/ApplicationLoggerInitializer.java new file mode 100644 index 0000000..b8979c5 --- /dev/null +++ b/pigx-common/pigx-common-log/src/main/java/com/pig4cloud/pigx/common/log/init/ApplicationLoggerInitializer.java @@ -0,0 +1,32 @@ +package com.pig4cloud.pigx.common.log.init; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.env.EnvironmentPostProcessor; +import org.springframework.core.Ordered; +import org.springframework.core.env.ConfigurableEnvironment; + +/** + * @author lengleng + * @date 2019-05-22 + *

+ * 通过环境变量的形式注入 logging.file 自动维护 Spring Boot Admin Logger Viewer + */ +public class ApplicationLoggerInitializer implements EnvironmentPostProcessor, Ordered { + + @Override + public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) { + String appName = environment.getProperty("spring.application.name"); + String logBase = environment.getProperty("LOGGING_PATH", "logs"); + + // spring boot admin 直接加载日志 + System.setProperty("logging.file.name", String.format("%s/%s/debug.log", logBase, appName)); + // 避免 sentinel 1.8.4+ 心跳日志过大 + System.setProperty("csp.sentinel.log.level", "OFF"); + } + + @Override + public int getOrder() { + return Ordered.LOWEST_PRECEDENCE; + } + +} diff --git a/pigx-common/pigx-common-log/src/main/java/com/pig4cloud/pigx/common/log/util/LogTypeEnum.java b/pigx-common/pigx-common-log/src/main/java/com/pig4cloud/pigx/common/log/util/LogTypeEnum.java new file mode 100644 index 0000000..4c6df34 --- /dev/null +++ b/pigx-common/pigx-common-log/src/main/java/com/pig4cloud/pigx/common/log/util/LogTypeEnum.java @@ -0,0 +1,42 @@ +package com.pig4cloud.pigx.common.log.util; + +/** + * + * @author lengleng + * @date 2021/1/13 + */ + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +/** + * @author lengleng + * @date 2020/7/30 + *

+ * 日志类型 + */ +@Getter +@RequiredArgsConstructor +public enum LogTypeEnum { + + /** + * 正常日志类型 + */ + NORMAL("0", "正常日志"), + + /** + * 错误日志类型 + */ + ERROR("9", "错误日志"); + + /** + * 类型 + */ + private final String type; + + /** + * 描述 + */ + private final String description; + +} \ No newline at end of file diff --git a/pigx-common/pigx-common-log/src/main/java/com/pig4cloud/pigx/common/log/util/SysLogUtils.java b/pigx-common/pigx-common-log/src/main/java/com/pig4cloud/pigx/common/log/util/SysLogUtils.java new file mode 100644 index 0000000..a093e66 --- /dev/null +++ b/pigx-common/pigx-common-log/src/main/java/com/pig4cloud/pigx/common/log/util/SysLogUtils.java @@ -0,0 +1,136 @@ +/* + * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.pig4cloud.pigx.common.log.util; + +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.URLUtil; +import cn.hutool.extra.servlet.ServletUtil; +import cn.hutool.extra.spring.SpringUtil; +import cn.hutool.http.HttpUtil; +import com.pig4cloud.pigx.admin.api.dto.SysLogDTO; +import com.pig4cloud.pigx.common.core.constant.SecurityConstants; +import com.pig4cloud.pigx.common.log.config.PigxLogProperties; +import lombok.experimental.UtilityClass; +import org.springframework.core.StandardReflectionParameterNameDiscoverer; +import org.springframework.expression.EvaluationContext; +import org.springframework.expression.Expression; +import org.springframework.expression.spel.standard.SpelExpressionParser; +import org.springframework.expression.spel.support.StandardEvaluationContext; +import org.springframework.http.HttpHeaders; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.oauth2.core.OAuth2AuthenticatedPrincipal; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import javax.servlet.http.HttpServletRequest; +import java.lang.reflect.Method; +import java.util.Map; +import java.util.Objects; + +/** + * 系统日志工具类 + * + * @author L.cm + */ +@UtilityClass +public class SysLogUtils { + + public SysLogDTO getSysLog() { + HttpServletRequest request = ((ServletRequestAttributes) Objects + .requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest(); + SysLogDTO sysLog = new SysLogDTO(); + sysLog.setLogType(LogTypeEnum.NORMAL.getType()); + sysLog.setRequestUri(URLUtil.getPath(request.getRequestURI())); + sysLog.setMethod(request.getMethod()); + sysLog.setRemoteAddr(ServletUtil.getClientIP(request)); + sysLog.setUserAgent(request.getHeader(HttpHeaders.USER_AGENT)); + sysLog.setCreateBy(getUsername()); + sysLog.setServiceId(getClientId()); + + // get 参数脱敏 + PigxLogProperties logProperties = SpringUtil.getBean(PigxLogProperties.class); + Map paramsMap = MapUtil.removeAny(request.getParameterMap(), + ArrayUtil.toArray(logProperties.getExcludeFields(), String.class)); + sysLog.setParams(HttpUtil.toParams(paramsMap)); + return sysLog; + } + + /** + * 获取用户名称 + * @return username + */ + private String getUsername() { + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + if (authentication == null) { + return null; + } + return authentication.getName(); + } + + /** + * 获取spel 定义的参数值 + * @param context 参数容器 + * @param key key + * @param clazz 需要返回的类型 + * @param 返回泛型 + * @return 参数值 + */ + public T getValue(EvaluationContext context, String key, Class clazz) { + SpelExpressionParser spelExpressionParser = new SpelExpressionParser(); + Expression expression = spelExpressionParser.parseExpression(key); + return expression.getValue(context, clazz); + } + + /** + * 获取参数容器 + * @param arguments 方法的参数列表 + * @param signatureMethod 被执行的方法体 + * @return 装载参数的容器 + */ + public EvaluationContext getContext(Object[] arguments, Method signatureMethod) { + String[] parameterNames = new StandardReflectionParameterNameDiscoverer().getParameterNames(signatureMethod); + EvaluationContext context = new StandardEvaluationContext(); + if (parameterNames == null) { + return context; + } + for (int i = 0; i < arguments.length; i++) { + context.setVariable(parameterNames[i], arguments[i]); + } + return context; + } + + /** + * 获取客户端 + * @return clientId + */ + private String getClientId() { + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + if (authentication == null) { + return null; + } + + Object principal = authentication.getPrincipal(); + if (principal instanceof OAuth2AuthenticatedPrincipal) { + OAuth2AuthenticatedPrincipal auth2Authentication = (OAuth2AuthenticatedPrincipal) principal; + return MapUtil.getStr(auth2Authentication.getAttributes(), SecurityConstants.CLIENT_ID); + } + return null; + } + +} diff --git a/pigx-common/pigx-common-log/src/main/resources/META-INF/spring.factories b/pigx-common/pigx-common-log/src/main/resources/META-INF/spring.factories new file mode 100644 index 0000000..4fcb7d7 --- /dev/null +++ b/pigx-common/pigx-common-log/src/main/resources/META-INF/spring.factories @@ -0,0 +1,2 @@ +org.springframework.boot.env.EnvironmentPostProcessor=\ + com.pig4cloud.pigx.common.log.init.ApplicationLoggerInitializer diff --git a/pigx-common/pigx-common-log/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/pigx-common/pigx-common-log/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 0000000..2d1301d --- /dev/null +++ b/pigx-common/pigx-common-log/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1 @@ +com.pig4cloud.pigx.common.log.LogAutoConfiguration diff --git a/pigx-common/pigx-common-oss/pom.xml b/pigx-common/pigx-common-oss/pom.xml new file mode 100644 index 0000000..d4ace6a --- /dev/null +++ b/pigx-common/pigx-common-oss/pom.xml @@ -0,0 +1,28 @@ + + + 4.0.0 + + com.pig4cloud + pigx-common + 5.2.0 + + + pigx-common-oss + jar + + pigx 文件系统依赖 + + + + com.amazonaws + aws-java-sdk-s3 + ${aws.version} + + + cn.hutool + hutool-core + + + diff --git a/pigx-common/pigx-common-oss/src/main/java/com/pig4cloud/pigx/common/file/FileAutoConfiguration.java b/pigx-common/pigx-common-oss/src/main/java/com/pig4cloud/pigx/common/file/FileAutoConfiguration.java new file mode 100644 index 0000000..516765c --- /dev/null +++ b/pigx-common/pigx-common-oss/src/main/java/com/pig4cloud/pigx/common/file/FileAutoConfiguration.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.common.file; + +import com.pig4cloud.pigx.common.file.core.FileProperties; +import com.pig4cloud.pigx.common.file.local.LocalFileAutoConfiguration; +import com.pig4cloud.pigx.common.file.oss.OssAutoConfiguration; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Import; + +/** + * aws 自动配置类 + * + * @author lengleng + * @author 858695266 + */ +@Import({ LocalFileAutoConfiguration.class, OssAutoConfiguration.class }) +@EnableConfigurationProperties({ FileProperties.class }) +public class FileAutoConfiguration { + +} diff --git a/pigx-common/pigx-common-oss/src/main/java/com/pig4cloud/pigx/common/file/core/FileProperties.java b/pigx-common/pigx-common-oss/src/main/java/com/pig4cloud/pigx/common/file/core/FileProperties.java new file mode 100644 index 0000000..d64926c --- /dev/null +++ b/pigx-common/pigx-common-oss/src/main/java/com/pig4cloud/pigx/common/file/core/FileProperties.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.common.file.core; + +import com.pig4cloud.pigx.common.file.local.LocalFileProperties; +import com.pig4cloud.pigx.common.file.oss.OssProperties; +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; + +/** + * 文件 配置信息 + * + * @author lengleng + *

+ * bucket 设置公共读权限 + */ +@Data +@ConfigurationProperties(prefix = "file") +public class FileProperties { + + /** + * 默认的存储桶名称 + */ + private String bucketName = "local"; + + /** + * 本地文件配置信息 + */ + private LocalFileProperties local; + + /** + * oss 文件配置信息 + */ + private OssProperties oss; + +} diff --git a/pigx-common/pigx-common-oss/src/main/java/com/pig4cloud/pigx/common/file/core/FileTemplate.java b/pigx-common/pigx-common-oss/src/main/java/com/pig4cloud/pigx/common/file/core/FileTemplate.java new file mode 100644 index 0000000..75d8cb2 --- /dev/null +++ b/pigx-common/pigx-common-oss/src/main/java/com/pig4cloud/pigx/common/file/core/FileTemplate.java @@ -0,0 +1,87 @@ +package com.pig4cloud.pigx.common.file.core; + +import com.amazonaws.services.s3.model.Bucket; +import com.amazonaws.services.s3.model.S3Object; +import com.amazonaws.services.s3.model.S3ObjectSummary; +import org.springframework.beans.factory.InitializingBean; + +import java.io.InputStream; +import java.util.List; + +/** + * 文件操作模板 + * + * @author lengleng + * @date 2022/4/19 + */ +public interface FileTemplate extends InitializingBean { + + /** + * 创建bucket + * @param bucketName bucket名称 + */ + void createBucket(String bucketName); + + /** + * 获取全部bucket + *

+ * + * API Documentation + */ + List getAllBuckets(); + + /** + * @param bucketName bucket名称 + * @see + */ + void removeBucket(String bucketName); + + /** + * 上传文件 + * @param bucketName bucket名称 + * @param objectName 文件名称 + * @param stream 文件流 + * @param contextType 文件类型 + * @throws Exception + */ + void putObject(String bucketName, String objectName, InputStream stream, String contextType) throws Exception; + + /** + * 上传文件 + * @param bucketName bucket名称 + * @param objectName 文件名称 + * @param stream 文件流 + * @param contextType 文件类型 + * @throws Exception + */ + void putObject(String bucketName, String objectName, InputStream stream) throws Exception; + + /** + * 获取文件 + * @param bucketName bucket名称 + * @param objectName 文件名称 + * @return 二进制流 API Documentation + */ + S3Object getObject(String bucketName, String objectName); + + void removeObject(String bucketName, String objectName) throws Exception; + + /** + * @throws Exception + */ + @Override + default void afterPropertiesSet() throws Exception { + } + + /** + * 根据文件前置查询文件 + * @param bucketName bucket名称 + * @param prefix 前缀 + * @param recursive 是否递归查询 + * @return S3ObjectSummary 列表 + * @see AWS + * API Documentation + */ + List getAllObjectsByPrefix(String bucketName, String prefix, boolean recursive); + +} diff --git a/pigx-common/pigx-common-oss/src/main/java/com/pig4cloud/pigx/common/file/local/LocalFileAutoConfiguration.java b/pigx-common/pigx-common-oss/src/main/java/com/pig4cloud/pigx/common/file/local/LocalFileAutoConfiguration.java new file mode 100644 index 0000000..9d646c7 --- /dev/null +++ b/pigx-common/pigx-common-oss/src/main/java/com/pig4cloud/pigx/common/file/local/LocalFileAutoConfiguration.java @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.common.file.local; + +import com.pig4cloud.pigx.common.file.core.FileProperties; +import com.pig4cloud.pigx.common.file.core.FileTemplate; +import lombok.AllArgsConstructor; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.context.annotation.Bean; + +/** + * aws 自动配置类 + * + * @author lengleng + * @author 858695266 + */ +@AllArgsConstructor +public class LocalFileAutoConfiguration { + + private final FileProperties properties; + + @Bean + @ConditionalOnMissingBean(LocalFileTemplate.class) + @ConditionalOnProperty(name = "file.local.enable", havingValue = "true", matchIfMissing = true) + public FileTemplate localFileTemplate() { + return new LocalFileTemplate(properties); + } + +} diff --git a/pigx-common/pigx-common-oss/src/main/java/com/pig4cloud/pigx/common/file/local/LocalFileProperties.java b/pigx-common/pigx-common-oss/src/main/java/com/pig4cloud/pigx/common/file/local/LocalFileProperties.java new file mode 100644 index 0000000..13f6894 --- /dev/null +++ b/pigx-common/pigx-common-oss/src/main/java/com/pig4cloud/pigx/common/file/local/LocalFileProperties.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.common.file.local; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; + +/** + * 本地文件 配置信息 + * + * @author lengleng + *

+ * bucket 设置公共读权限 + */ +@Data +@ConfigurationProperties(prefix = "local") +public class LocalFileProperties { + + /** + * 是否开启 + */ + private boolean enable; + + /** + * 默认路径 + */ + private String basePath; + +} diff --git a/pigx-common/pigx-common-oss/src/main/java/com/pig4cloud/pigx/common/file/local/LocalFileTemplate.java b/pigx-common/pigx-common-oss/src/main/java/com/pig4cloud/pigx/common/file/local/LocalFileTemplate.java new file mode 100644 index 0000000..b78bd17 --- /dev/null +++ b/pigx-common/pigx-common-oss/src/main/java/com/pig4cloud/pigx/common/file/local/LocalFileTemplate.java @@ -0,0 +1,137 @@ +package com.pig4cloud.pigx.common.file.local; + +import cn.hutool.core.io.FileUtil; +import com.amazonaws.services.s3.model.Bucket; +import com.amazonaws.services.s3.model.S3Object; +import com.amazonaws.services.s3.model.S3ObjectSummary; +import com.pig4cloud.pigx.common.file.core.FileProperties; +import com.pig4cloud.pigx.common.file.core.FileTemplate; +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; + +import java.io.File; +import java.io.InputStream; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 本地文件读取模式 + * + * @author lengleng + * @date 2022/4/19 + */ +@RequiredArgsConstructor +public class LocalFileTemplate implements FileTemplate { + + private final FileProperties properties; + + /** + * 创建bucket + * @param bucketName bucket名称 + */ + @Override + public void createBucket(String bucketName) { + FileUtil.mkdir(properties.getLocal().getBasePath() + FileUtil.FILE_SEPARATOR + bucketName); + } + + /** + * 获取全部bucket + *

+ *

+ * API Documentation + */ + @Override + public List getAllBuckets() { + return Arrays.stream(FileUtil.ls(properties.getLocal().getBasePath())).filter(FileUtil::isDirectory) + .map(dir -> new Bucket(dir.getName())).collect(Collectors.toList()); + } + + /** + * @param bucketName bucket名称 + * @see + */ + @Override + public void removeBucket(String bucketName) { + FileUtil.del(properties.getLocal().getBasePath() + FileUtil.FILE_SEPARATOR + bucketName); + } + + /** + * 上传文件 + * @param bucketName bucket名称 + * @param objectName 文件名称 + * @param stream 文件流 + * @param contextType 文件类型 + */ + @Override + public void putObject(String bucketName, String objectName, InputStream stream, String contextType) { + // 当 Bucket 不存在时创建 + String dir = properties.getLocal().getBasePath() + FileUtil.FILE_SEPARATOR + bucketName; + if (!FileUtil.isDirectory(properties.getLocal().getBasePath() + FileUtil.FILE_SEPARATOR + bucketName)) { + createBucket(bucketName); + } + + // 写入文件 + File file = FileUtil.file(dir + FileUtil.FILE_SEPARATOR + objectName); + FileUtil.writeFromStream(stream, file); + } + + /** + * 获取文件 + * @param bucketName bucket名称 + * @param objectName 文件名称 + * @return 二进制流 API Documentation + */ + @Override + @SneakyThrows + public S3Object getObject(String bucketName, String objectName) { + String dir = properties.getLocal().getBasePath() + FileUtil.FILE_SEPARATOR + bucketName; + S3Object s3Object = new S3Object(); + s3Object.setObjectContent(FileUtil.getInputStream(dir + FileUtil.FILE_SEPARATOR + objectName)); + return s3Object; + } + + /** + * @param bucketName + * @param objectName + * @throws Exception + */ + @Override + public void removeObject(String bucketName, String objectName) throws Exception { + String dir = properties.getLocal().getBasePath() + FileUtil.FILE_SEPARATOR + bucketName; + FileUtil.del(dir + FileUtil.FILE_SEPARATOR + objectName); + } + + /** + * 上传文件 + * @param bucketName bucket名称 + * @param objectName 文件名称 + * @param stream 文件流 + * @throws Exception + */ + @Override + public void putObject(String bucketName, String objectName, InputStream stream) throws Exception { + putObject(bucketName, objectName, stream, null); + } + + /** + * 根据文件前置查询文件 + * @param bucketName bucket名称 + * @param prefix 前缀 + * @param recursive 是否递归查询 + * @return S3ObjectSummary 列表 + * @see AWS + * API Documentation + */ + @Override + public List getAllObjectsByPrefix(String bucketName, String prefix, boolean recursive) { + String dir = properties.getLocal().getBasePath() + FileUtil.FILE_SEPARATOR + bucketName; + + return Arrays.stream(FileUtil.ls(dir)).filter(file -> file.getName().startsWith(prefix)).map(file -> { + S3ObjectSummary summary = new S3ObjectSummary(); + summary.setKey(file.getName()); + return new S3ObjectSummary(); + }).collect(Collectors.toList()); + } + +} diff --git a/pigx-common/pigx-common-oss/src/main/java/com/pig4cloud/pigx/common/file/oss/OssAutoConfiguration.java b/pigx-common/pigx-common-oss/src/main/java/com/pig4cloud/pigx/common/file/oss/OssAutoConfiguration.java new file mode 100644 index 0000000..2c0e5f7 --- /dev/null +++ b/pigx-common/pigx-common-oss/src/main/java/com/pig4cloud/pigx/common/file/oss/OssAutoConfiguration.java @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.common.file.oss; + +import com.pig4cloud.pigx.common.file.core.FileProperties; +import com.pig4cloud.pigx.common.file.core.FileTemplate; +import com.pig4cloud.pigx.common.file.oss.http.OssEndpoint; +import com.pig4cloud.pigx.common.file.oss.service.OssTemplate; +import lombok.AllArgsConstructor; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Primary; + +/** + * aws 自动配置类 + * + * @author lengleng + * @author 858695266 + */ +@AllArgsConstructor +public class OssAutoConfiguration { + + private final FileProperties properties; + + @Bean + @Primary + @ConditionalOnMissingBean(OssTemplate.class) + @ConditionalOnProperty(name = "file.oss.enable", havingValue = "true") + public FileTemplate ossTemplate() { + return new OssTemplate(properties); + } + + @Bean + @ConditionalOnMissingBean + @ConditionalOnProperty(name = "file.oss.info", havingValue = "true") + public OssEndpoint ossEndpoint(OssTemplate template) { + return new OssEndpoint(template); + } + +} diff --git a/pigx-common/pigx-common-oss/src/main/java/com/pig4cloud/pigx/common/file/oss/OssProperties.java b/pigx-common/pigx-common-oss/src/main/java/com/pig4cloud/pigx/common/file/oss/OssProperties.java new file mode 100644 index 0000000..488a97e --- /dev/null +++ b/pigx-common/pigx-common-oss/src/main/java/com/pig4cloud/pigx/common/file/oss/OssProperties.java @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.common.file.oss; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; + +/** + * aws 配置信息 + * + * @author lengleng + * @author 858695266 配置文件添加: oss: enable: true endpoint: http://127.0.0.1:9000 # + * pathStyleAccess 采用nginx反向代理或者AWS S3 配置成true,支持第三方云存储配置成false pathStyleAccess: false + * access-key: lengleng secret-key: lengleng bucket-name: lengleng region: custom-domain: + * https://oss.xxx.com/lengleng + *

+ * bucket 设置公共读权限 + */ +@Data +@ConfigurationProperties(prefix = "oss") +public class OssProperties { + + /** + * 对象存储服务的URL + */ + private String endpoint; + + /** + * 自定义域名 + */ + private String customDomain; + + /** + * true path-style nginx 反向代理和S3默认支持 pathStyle {http://endpoint/bucketname} false + * supports virtual-hosted-style 阿里云等需要配置为 virtual-hosted-style + * 模式{http://bucketname.endpoint} + */ + private Boolean pathStyleAccess = true; + + /** + * 应用ID + */ + private String appId; + + /** + * 区域 + */ + private String region; + + /** + * Access key就像用户ID,可以唯一标识你的账户 + */ + private String accessKey; + + /** + * Secret key是你账户的密码 + */ + private String secretKey; + + /** + * 最大线程数,默认: 100 + */ + private Integer maxConnections = 100; + +} diff --git a/pigx-common/pigx-common-oss/src/main/java/com/pig4cloud/pigx/common/file/oss/http/OssEndpoint.java b/pigx-common/pigx-common-oss/src/main/java/com/pig4cloud/pigx/common/file/oss/http/OssEndpoint.java new file mode 100644 index 0000000..e84a15a --- /dev/null +++ b/pigx-common/pigx-common-oss/src/main/java/com/pig4cloud/pigx/common/file/oss/http/OssEndpoint.java @@ -0,0 +1,138 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.common.file.oss.http; + +import com.amazonaws.services.s3.model.Bucket; +import com.amazonaws.services.s3.model.S3Object; +import com.amazonaws.services.s3.model.S3ObjectSummary; +import com.pig4cloud.pigx.common.file.oss.service.OssTemplate; +import lombok.AllArgsConstructor; +import lombok.Cleanup; +import lombok.SneakyThrows; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.InputStream; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * aws 对外提供服务端点 + * + * @author lengleng + * @author 858695266 + *

+ * oss.info + */ +@RestController +@AllArgsConstructor +@RequestMapping("/oss") +@ConditionalOnProperty(name = "file.oss.info", havingValue = "true") +public class OssEndpoint { + + private final OssTemplate template; + + /** + * Bucket Endpoints + */ + @SneakyThrows + @PostMapping("/bucket/{bucketName}") + public Bucket createBucker(@PathVariable String bucketName) { + + template.createBucket(bucketName); + return template.getBucket(bucketName).get(); + + } + + @SneakyThrows + @GetMapping("/bucket") + public List getBuckets() { + return template.getAllBuckets(); + } + + @SneakyThrows + @GetMapping("/bucket/{bucketName}") + public Bucket getBucket(@PathVariable String bucketName) { + return template.getBucket(bucketName).orElseThrow(() -> new IllegalArgumentException("Bucket Name not found!")); + } + + @SneakyThrows + @DeleteMapping("/bucket/{bucketName}") + @ResponseStatus(HttpStatus.ACCEPTED) + public void deleteBucket(@PathVariable String bucketName) { + template.removeBucket(bucketName); + } + + /** + * Object Endpoints + */ + @SneakyThrows + @PostMapping("/object/{bucketName}") + public S3Object createObject(@RequestBody MultipartFile object, @PathVariable String bucketName) { + String name = object.getOriginalFilename(); + @Cleanup + InputStream inputStream = object.getInputStream(); + template.putObject(bucketName, name, inputStream, object.getSize(), object.getContentType()); + return template.getObjectInfo(bucketName, name); + + } + + @SneakyThrows + @PostMapping("/object/{bucketName}/{objectName}") + public S3Object createObject(@RequestBody MultipartFile object, @PathVariable String bucketName, + @PathVariable String objectName) { + @Cleanup + InputStream inputStream = object.getInputStream(); + template.putObject(bucketName, objectName, inputStream, object.getSize(), object.getContentType()); + return template.getObjectInfo(bucketName, objectName); + + } + + @SneakyThrows + @GetMapping("/object/{bucketName}/{objectName}") + public List filterObject(@PathVariable String bucketName, @PathVariable String objectName) { + + return template.getAllObjectsByPrefix(bucketName, objectName, true); + + } + + @SneakyThrows + @GetMapping("/object/{bucketName}/{objectName}/{expires}") + public Map getObject(@PathVariable String bucketName, @PathVariable String objectName, + @PathVariable Integer expires) { + Map responseBody = new HashMap<>(8); + // Put Object info + responseBody.put("bucket", bucketName); + responseBody.put("object", objectName); + responseBody.put("url", template.getObjectURL(bucketName, objectName, expires)); + responseBody.put("expires", expires); + return responseBody; + } + + @SneakyThrows + @ResponseStatus(HttpStatus.ACCEPTED) + @DeleteMapping("/object/{bucketName}/{objectName}/") + public void deleteObject(@PathVariable String bucketName, @PathVariable String objectName) { + + template.removeObject(bucketName, objectName); + } + +} diff --git a/pigx-common/pigx-common-oss/src/main/java/com/pig4cloud/pigx/common/file/oss/service/OssTemplate.java b/pigx-common/pigx-common-oss/src/main/java/com/pig4cloud/pigx/common/file/oss/service/OssTemplate.java new file mode 100644 index 0000000..8a47964 --- /dev/null +++ b/pigx-common/pigx-common-oss/src/main/java/com/pig4cloud/pigx/common/file/oss/service/OssTemplate.java @@ -0,0 +1,236 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.common.file.oss.service; + +import com.amazonaws.ClientConfiguration; +import com.amazonaws.auth.AWSCredentials; +import com.amazonaws.auth.AWSCredentialsProvider; +import com.amazonaws.auth.AWSStaticCredentialsProvider; +import com.amazonaws.auth.BasicAWSCredentials; +import com.amazonaws.client.builder.AwsClientBuilder; +import com.amazonaws.services.s3.AmazonS3; +import com.amazonaws.services.s3.AmazonS3Client; +import com.amazonaws.services.s3.model.*; +import com.amazonaws.util.IOUtils; +import com.pig4cloud.pigx.common.file.core.FileProperties; +import com.pig4cloud.pigx.common.file.core.FileTemplate; +import lombok.Cleanup; +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; +import org.springframework.beans.factory.InitializingBean; + +import java.io.ByteArrayInputStream; +import java.io.InputStream; +import java.net.URL; +import java.util.*; + +/** + * aws-s3 通用存储操作 支持所有兼容s3协议的云存储: {阿里云OSS,腾讯云COS,七牛云,京东云,minio 等} + * + * @author lengleng + * @author 858695266 + * @date 2020/5/23 6:36 上午 + * @since 1.0 + */ +@RequiredArgsConstructor +public class OssTemplate implements InitializingBean, FileTemplate { + + private final FileProperties properties; + + private AmazonS3 amazonS3; + + /** + * 创建bucket + * @param bucketName bucket名称 + */ + @SneakyThrows + public void createBucket(String bucketName) { + if (!amazonS3.doesBucketExistV2(bucketName)) { + amazonS3.createBucket((bucketName)); + } + } + + /** + * 获取全部bucket + *

+ * + * @see AWS + * API Documentation + */ + @SneakyThrows + public List getAllBuckets() { + return amazonS3.listBuckets(); + } + + /** + * @param bucketName bucket名称 + * @see AWS + * API Documentation + */ + @SneakyThrows + public Optional getBucket(String bucketName) { + return amazonS3.listBuckets().stream().filter(b -> b.getName().equals(bucketName)).findFirst(); + } + + /** + * @param bucketName bucket名称 + * @see AWS API + * Documentation + */ + @SneakyThrows + public void removeBucket(String bucketName) { + amazonS3.deleteBucket(bucketName); + } + + /** + * 根据文件前置查询文件 + * @param bucketName bucket名称 + * @param prefix 前缀 + * @param recursive 是否递归查询 + * @return S3ObjectSummary 列表 + * @see AWS + * API Documentation + */ + @SneakyThrows + public List getAllObjectsByPrefix(String bucketName, String prefix, boolean recursive) { + ObjectListing objectListing = amazonS3.listObjects(bucketName, prefix); + return new ArrayList<>(objectListing.getObjectSummaries()); + } + + /** + * 获取文件外链 + * @param bucketName bucket名称 + * @param objectName 文件名称 + * @param expires 过期时间 <=7 + * @return url + * @see AmazonS3#generatePresignedUrl(String bucketName, String key, Date expiration) + */ + @SneakyThrows + public String getObjectURL(String bucketName, String objectName, Integer expires) { + Date date = new Date(); + Calendar calendar = new GregorianCalendar(); + calendar.setTime(date); + calendar.add(Calendar.DAY_OF_MONTH, expires); + URL url = amazonS3.generatePresignedUrl(bucketName, objectName, calendar.getTime()); + return url.toString(); + } + + /** + * 获取文件 + * @param bucketName bucket名称 + * @param objectName 文件名称 + * @return 二进制流 + * @see AWS + * API Documentation + */ + @SneakyThrows + public S3Object getObject(String bucketName, String objectName) { + return amazonS3.getObject(bucketName, objectName); + } + + /** + * 上传文件 + * @param bucketName bucket名称 + * @param objectName 文件名称 + * @param stream 文件流 + * @throws Exception + */ + public void putObject(String bucketName, String objectName, InputStream stream) throws Exception { + putObject(bucketName, objectName, stream, stream.available(), "application/octet-stream"); + } + + /** + * 上传文件 + * @param bucketName bucket名称 + * @param objectName 文件名称 + * @param stream 文件流 + * @param contextType 文件类型 + * @throws Exception + */ + public void putObject(String bucketName, String objectName, InputStream stream, String contextType) + throws Exception { + putObject(bucketName, objectName, stream, stream.available(), contextType); + } + + /** + * 上传文件 + * @param bucketName bucket名称 + * @param objectName 文件名称 + * @param stream 文件流 + * @param size 大小 + * @param contextType 类型 + * @throws Exception + * @see AWS + * API Documentation + */ + public PutObjectResult putObject(String bucketName, String objectName, InputStream stream, long size, + String contextType) throws Exception { + // String fileName = getFileName(objectName); + byte[] bytes = IOUtils.toByteArray(stream); + ObjectMetadata objectMetadata = new ObjectMetadata(); + objectMetadata.setContentLength(size); + objectMetadata.setContentType(contextType); + ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes); + // 上传 + return amazonS3.putObject(bucketName, objectName, byteArrayInputStream, objectMetadata); + + } + + /** + * 获取文件信息 + * @param bucketName bucket名称 + * @param objectName 文件名称 + * @see AWS + * API Documentation + */ + public S3Object getObjectInfo(String bucketName, String objectName) throws Exception { + @Cleanup + S3Object object = amazonS3.getObject(bucketName, objectName); + return object; + } + + /** + * 删除文件 + * @param bucketName bucket名称 + * @param objectName 文件名称 + * @throws Exception + * @see AWS API + * Documentation + */ + public void removeObject(String bucketName, String objectName) throws Exception { + amazonS3.deleteObject(bucketName, objectName); + } + + @Override + public void afterPropertiesSet() { + ClientConfiguration clientConfiguration = new ClientConfiguration(); + clientConfiguration.setMaxConnections(properties.getOss().getMaxConnections()); + + AwsClientBuilder.EndpointConfiguration endpointConfiguration = new AwsClientBuilder.EndpointConfiguration( + properties.getOss().getEndpoint(), properties.getOss().getRegion()); + AWSCredentials awsCredentials = new BasicAWSCredentials(properties.getOss().getAccessKey(), + properties.getOss().getSecretKey()); + AWSCredentialsProvider awsCredentialsProvider = new AWSStaticCredentialsProvider(awsCredentials); + this.amazonS3 = AmazonS3Client.builder().withEndpointConfiguration(endpointConfiguration) + .withClientConfiguration(clientConfiguration).withCredentials(awsCredentialsProvider) + .disableChunkedEncoding().withPathStyleAccessEnabled(properties.getOss().getPathStyleAccess()).build(); + } + +} diff --git a/pigx-common/pigx-common-oss/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/pigx-common/pigx-common-oss/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 0000000..e2b30ae --- /dev/null +++ b/pigx-common/pigx-common-oss/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1 @@ +com.pig4cloud.pigx.common.file.FileAutoConfiguration diff --git a/pigx-common/pigx-common-seata/pom.xml b/pigx-common/pigx-common-seata/pom.xml new file mode 100644 index 0000000..32b06a8 --- /dev/null +++ b/pigx-common/pigx-common-seata/pom.xml @@ -0,0 +1,33 @@ + + + 4.0.0 + + com.pig4cloud + pigx-common + 5.2.0 + + + pigx-common-seata + jar + pigx 分布式事务处理模块 + + + + + com.pig4cloud + pigx-common-core + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-seata + + + + io.seata + seata-serializer-kryo + + + + diff --git a/pigx-common/pigx-common-seata/src/main/java/com/pig4cloud/pigx/common/seata/config/SeataAutoConfiguration.java b/pigx-common/pigx-common-seata/src/main/java/com/pig4cloud/pigx/common/seata/config/SeataAutoConfiguration.java new file mode 100644 index 0000000..e950e1d --- /dev/null +++ b/pigx-common/pigx-common-seata/src/main/java/com/pig4cloud/pigx/common/seata/config/SeataAutoConfiguration.java @@ -0,0 +1,19 @@ +package com.pig4cloud.pigx.common.seata.config; + +import com.pig4cloud.pigx.common.core.factory.YamlPropertySourceFactory; +import io.seata.spring.annotation.datasource.EnableAutoDataSourceProxy; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.PropertySource; + +/** + * Seata 配置类 + * + * @author lengleng + * @date 2022/3/29 + */ +@PropertySource(value = "classpath:seata-config.yml", factory = YamlPropertySourceFactory.class) +@EnableAutoDataSourceProxy(useJdkProxy = true) +@Configuration(proxyBeanMethods = false) +public class SeataAutoConfiguration { + +} diff --git a/pigx-common/pigx-common-seata/src/main/java/io/seata/spring/util/SpringProxyUtils.java b/pigx-common/pigx-common-seata/src/main/java/io/seata/spring/util/SpringProxyUtils.java new file mode 100644 index 0000000..95858ce --- /dev/null +++ b/pigx-common/pigx-common-seata/src/main/java/io/seata/spring/util/SpringProxyUtils.java @@ -0,0 +1,177 @@ +/** + * @author lengleng + * @date 2022/3/29 + */ +package io.seata.spring.util; + +import io.seata.common.util.CollectionUtils; +import io.seata.rm.tcc.remoting.parser.DubboUtil; +import org.springframework.aop.TargetSource; +import org.springframework.aop.framework.Advised; +import org.springframework.aop.framework.AdvisedSupport; +import org.springframework.aop.support.AopUtils; + +import java.lang.reflect.Field; +import java.lang.reflect.Proxy; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; + +/** + * Proxy tools base on spring 主要解决 v1.4.2 兼容性问题 https://github.com/seata/seata/issues/3709 + * + * @author zhangsen + */ +public class SpringProxyUtils { + + private SpringProxyUtils() { + } + + /** + * Find target class class. + * @param proxy the proxy + * @return the class + * @throws Exception the exception + */ + public static Class findTargetClass(Object proxy) throws Exception { + if (proxy == null) { + return null; + } + if (AopUtils.isAopProxy(proxy) && proxy instanceof Advised) { + // #issue 3709 + final TargetSource targetSource = ((Advised) proxy).getTargetSource(); + if (!targetSource.isStatic()) { + return targetSource.getTargetClass(); + } + return findTargetClass(targetSource.getTarget()); + } + return proxy.getClass(); + } + + public static Class[] findInterfaces(Object proxy) throws Exception { + if (AopUtils.isJdkDynamicProxy(proxy)) { + AdvisedSupport advised = getAdvisedSupport(proxy); + return getInterfacesByAdvised(advised); + } + else { + return new Class[] {}; + } + } + + private static Class[] getInterfacesByAdvised(AdvisedSupport advised) { + Class[] interfaces = advised.getProxiedInterfaces(); + if (interfaces.length > 0) { + return interfaces; + } + else { + throw new IllegalStateException("Find the jdk dynamic proxy class that does not implement the interface"); + } + } + + /** + * Gets advised support. + * @param proxy the proxy + * @return the advised support + * @throws Exception the exception + */ + public static AdvisedSupport getAdvisedSupport(Object proxy) throws Exception { + Field h; + if (AopUtils.isJdkDynamicProxy(proxy)) { + h = proxy.getClass().getSuperclass().getDeclaredField("h"); + } + else { + h = proxy.getClass().getDeclaredField("CGLIB$CALLBACK_0"); + } + h.setAccessible(true); + Object dynamicAdvisedInterceptor = h.get(proxy); + Field advised = dynamicAdvisedInterceptor.getClass().getDeclaredField("advised"); + advised.setAccessible(true); + return (AdvisedSupport) advised.get(dynamicAdvisedInterceptor); + } + + /** + * Is proxy boolean. + * @param bean the bean + * @return the boolean + */ + public static boolean isProxy(Object bean) { + if (bean == null) { + return false; + } + // check dubbo proxy ? + return DubboUtil.isDubboProxyName(bean.getClass().getName()) + || (Proxy.class.isAssignableFrom(bean.getClass()) || AopUtils.isAopProxy(bean)); + } + + /** + * Get the target class , get the interface of its agent if it is a Proxy + * @param proxy the proxy + * @return target interface + * @throws Exception the exception + */ + public static Class getTargetInterface(Object proxy) throws Exception { + if (proxy == null) { + throw new IllegalArgumentException("proxy can not be null"); + } + + // jdk proxy + if (Proxy.class.isAssignableFrom(proxy.getClass())) { + Proxy p = (Proxy) proxy; + return p.getClass().getInterfaces()[0]; + } + + return getTargetClass(proxy); + } + + /** + * Get the class type of the proxy target object, if hadn't a target object, return + * the interface of the proxy + * @param proxy the proxy + * @return target interface + * @throws Exception the exception + */ + protected static Class getTargetClass(Object proxy) throws Exception { + if (proxy == null) { + throw new IllegalArgumentException("proxy can not be null"); + } + // not proxy + if (!AopUtils.isAopProxy(proxy)) { + return proxy.getClass(); + } + AdvisedSupport advisedSupport = getAdvisedSupport(proxy); + Object target = advisedSupport.getTargetSource().getTarget(); + /* + * the Proxy of sofa:reference has no target + */ + if (target == null) { + if (CollectionUtils.isNotEmpty(advisedSupport.getProxiedInterfaces())) { + return advisedSupport.getProxiedInterfaces()[0]; + } + else { + return proxy.getClass(); + } + } + else { + return getTargetClass(target); + } + } + + /** + * get the all interfaces of bean, if the bean is null, then return empty array + * @param bean the bean + * @return target interface + */ + public static Class[] getAllInterfaces(Object bean) { + Set> interfaces = new HashSet<>(); + if (bean != null) { + Class clazz = bean.getClass(); + while (!Object.class.getName().equalsIgnoreCase(clazz.getName())) { + Class[] clazzInterfaces = clazz.getInterfaces(); + interfaces.addAll(Arrays.asList(clazzInterfaces)); + clazz = clazz.getSuperclass(); + } + } + return interfaces.toArray(new Class[0]); + } + +} diff --git a/pigx-common/pigx-common-seata/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/pigx-common/pigx-common-seata/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 0000000..1870f8c --- /dev/null +++ b/pigx-common/pigx-common-seata/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1 @@ +com.pig4cloud.pigx.common.seata.config.SeataAutoConfiguration diff --git a/pigx-common/pigx-common-seata/src/main/resources/seata-config.yml b/pigx-common/pigx-common-seata/src/main/resources/seata-config.yml new file mode 100644 index 0000000..dab5d1a --- /dev/null +++ b/pigx-common/pigx-common-seata/src/main/resources/seata-config.yml @@ -0,0 +1,56 @@ +seata: + enabled: true + tx-service-group: pigx_tx_group # 事务群组(可以每个应用独立取名,也可以使用相同的名字) + client: + rm-report-success-enable: true + rm-table-meta-check-enable: false # 自动刷新缓存中的表结构(默认false) + rm-report-retry-count: 5 # 一阶段结果上报TC重试次数(默认5) + rm-async-commit-buffer-limit: 10000 # 异步提交缓存队列长度(默认10000) + rm: + lock: + lock-retry-internal: 10 # 校验或占用全局锁重试间隔(默认10ms) + lock-retry-times: 30 # 校验或占用全局锁重试次数(默认30) + lock-retry-policy-branch-rollback-on-conflict: true # 分支事务与其它全局回滚事务冲突时锁策略(优先释放本地锁让回滚成功) + tm-commit-retry-count: 3 # 一阶段全局提交结果上报TC重试次数(默认1次,建议大于1) + tm-rollback-retry-count: 3 # 一阶段全局回滚结果上报TC重试次数(默认1次,建议大于1) + undo: + data-validation: true # 二阶段回滚镜像校验(默认true开启) + log-serialization: kryo # undo序列化方式(默认jackson 不支持 LocalDateTime) + log-table: undo_log # 自定义undo表名(默认undo_log) + log: + exceptionRate: 100 # 日志异常输出概率(默认100) + support: + spring: + datasource-autoproxy: true + service: + vgroup-mapping: + pigx_tx_group: default # TC 集群(必须与seata-server保持一致) + enable-degrade: false # 降级开关 + disable-global-transaction: false # 禁用全局事务(默认false) + grouplist: + default: pigx-seata:8091 + transport: + shutdown: + wait: 3 + thread-factory: + boss-thread-prefix: NettyBoss + worker-thread-prefix: NettyServerNIOWorker + server-executor-thread-prefix: NettyServerBizHandler + share-boss-worker: false + client-selector-thread-prefix: NettyClientSelector + client-selector-thread-size: 1 + client-worker-thread-prefix: NettyClientWorkerThread + type: TCP + server: NIO + heartbeat: true + serialization: seata + compressor: none + enable-client-batch-send-request: true # 客户端事务消息请求是否批量合并发送(默认true) + registry: + file: + name: file.conf + type: file + config: + file: + name: file.conf + type: file diff --git a/pigx-common/pigx-common-security/pom.xml b/pigx-common/pigx-common-security/pom.xml new file mode 100644 index 0000000..0c9232c --- /dev/null +++ b/pigx-common/pigx-common-security/pom.xml @@ -0,0 +1,68 @@ + + + 4.0.0 + + com.pig4cloud + pigx-common + 5.2.0 + + + pigx-common-security + jar + + pigx 安全工具类 + + + + + + com.pig4cloud + pigx-common-core + + + + cn.hutool + hutool-http + + + + org.springframework.security + spring-security-oauth2-jose + + + org.springframework.security + spring-security-oauth2-authorization-server + ${spring.authorization.version} + + + + io.github.openfeign + feign-core + + + + org.aspectj + aspectjrt + + + + org.springframework.data + spring-data-redis + + + + com.pig4cloud + as-upms-api + + + + com.pig4cloud + as-app-server-api + + + org.springframework + spring-webmvc + + + diff --git a/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/annotation/EnablePigxResourceServer.java b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/annotation/EnablePigxResourceServer.java new file mode 100644 index 0000000..3e915c3 --- /dev/null +++ b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/annotation/EnablePigxResourceServer.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.pig4cloud.pigx.common.security.annotation; + +import com.pig4cloud.pigx.common.security.component.PigxResourceServerAutoConfiguration; +import com.pig4cloud.pigx.common.security.component.PigxResourceServerConfiguration; +import com.pig4cloud.pigx.common.security.feign.PigxFeignClientConfiguration; +import org.springframework.context.annotation.Import; + +import java.lang.annotation.*; + +/** + * @author lengleng + * @date 2022-06-04 + *

+ * 资源服务注解 + */ +@Documented +@Inherited +@Target({ ElementType.TYPE }) +@Retention(RetentionPolicy.RUNTIME) +@Import({ PigxResourceServerAutoConfiguration.class, PigxResourceServerConfiguration.class, + PigxFeignClientConfiguration.class }) +public @interface EnablePigxResourceServer { + +} diff --git a/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/annotation/Inner.java b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/annotation/Inner.java new file mode 100644 index 0000000..6183e71 --- /dev/null +++ b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/annotation/Inner.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.pig4cloud.pigx.common.security.annotation; + +import java.lang.annotation.*; + +/** + * 服务调用不鉴权注解 + * + * @author lengleng + * @date 2020-06-14 + */ +@Target({ ElementType.METHOD, ElementType.TYPE }) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface Inner { + + /** + * 是否AOP统一处理 + * @return false, true + */ + boolean value() default true; + + /** + * 需要特殊判空的字段(预留) + * @return {} + */ + String[] field() default {}; + +} diff --git a/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/component/PermissionService.java b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/component/PermissionService.java new file mode 100644 index 0000000..7e1cbad --- /dev/null +++ b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/component/PermissionService.java @@ -0,0 +1,53 @@ + +/* + * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.pig4cloud.pigx.common.security.component; + +import cn.hutool.core.util.ArrayUtil; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.util.PatternMatchUtils; +import org.springframework.util.StringUtils; + +import java.util.Collection; + +/** + * @author lengleng + * @date 2019/2/1 接口权限判断工具 + */ +public class PermissionService { + + /** + * 判断接口是否有任意xxx,xxx权限 + * @param permissions 权限 + * @return {boolean} + */ + public boolean hasPermission(String... permissions) { + if (ArrayUtil.isEmpty(permissions)) { + return false; + } + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + if (authentication == null) { + return false; + } + Collection authorities = authentication.getAuthorities(); + return authorities.stream().map(GrantedAuthority::getAuthority).filter(StringUtils::hasText) + .anyMatch(x -> PatternMatchUtils.simpleMatch(permissions, x)); + } + +} diff --git a/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/component/PermitAllUrlProperties.java b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/component/PermitAllUrlProperties.java new file mode 100644 index 0000000..4f09b43 --- /dev/null +++ b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/component/PermitAllUrlProperties.java @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.pig4cloud.pigx.common.security.component; + +import cn.hutool.core.util.ReUtil; +import com.pig4cloud.pigx.common.core.util.SpringContextHolder; +import com.pig4cloud.pigx.common.security.annotation.Inner; +import lombok.Getter; +import lombok.Setter; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.core.annotation.AnnotationUtils; +import org.springframework.web.method.HandlerMethod; +import org.springframework.web.servlet.mvc.method.RequestMappingInfo; +import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; + +import java.util.*; +import java.util.regex.Pattern; + +/** + * @author lengleng + * @date 2020-03-11 + *

+ * 资源服务器对外直接暴露URL,如果设置contex-path 要特殊处理 + */ +@Slf4j +@ConfigurationProperties(prefix = "security.oauth2.client") +public class PermitAllUrlProperties implements InitializingBean { + + private static final Pattern PATTERN = Pattern.compile("\\{(.*?)\\}"); + + private static final String[] DEFAULT_IGNORE_URLS = new String[] { "/actuator/**", "/error", "/v3/api-docs" }; + + @Getter + @Setter + private List ignoreUrls = new ArrayList<>(); + + @Override + public void afterPropertiesSet() { + ignoreUrls.addAll(Arrays.asList(DEFAULT_IGNORE_URLS)); + RequestMappingHandlerMapping mapping = SpringContextHolder.getBean("requestMappingHandlerMapping"); + Map map = mapping.getHandlerMethods(); + + map.keySet().forEach(info -> { + HandlerMethod handlerMethod = map.get(info); + + // 获取方法上边的注解 替代path variable 为 * + Inner method = AnnotationUtils.findAnnotation(handlerMethod.getMethod(), Inner.class); + Optional.ofNullable(method).ifPresent(inner -> Objects.requireNonNull(info.getPathPatternsCondition()) + .getPatternValues().forEach(url -> ignoreUrls.add(ReUtil.replaceAll(url, PATTERN, "*")))); + + // 获取类上边的注解, 替代path variable 为 * + Inner controller = AnnotationUtils.findAnnotation(handlerMethod.getBeanType(), Inner.class); + Optional.ofNullable(controller).ifPresent(inner -> Objects.requireNonNull(info.getPathPatternsCondition()) + .getPatternValues().forEach(url -> ignoreUrls.add(ReUtil.replaceAll(url, PATTERN, "*")))); + }); + } + +} diff --git a/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/component/PigxBearerTokenExtractor.java b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/component/PigxBearerTokenExtractor.java new file mode 100644 index 0000000..8fe1c40 --- /dev/null +++ b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/component/PigxBearerTokenExtractor.java @@ -0,0 +1,121 @@ +/* + * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.pig4cloud.pigx.common.security.component; + +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.security.oauth2.core.OAuth2AuthenticationException; +import org.springframework.security.oauth2.server.resource.BearerTokenError; +import org.springframework.security.oauth2.server.resource.BearerTokenErrors; +import org.springframework.security.oauth2.server.resource.web.BearerTokenResolver; +import org.springframework.util.AntPathMatcher; +import org.springframework.util.PathMatcher; +import org.springframework.util.StringUtils; + +import javax.servlet.http.HttpServletRequest; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * @author caiqy + * @date 2020.05.15 + */ +public class PigxBearerTokenExtractor implements BearerTokenResolver { + + private static final Pattern authorizationPattern = Pattern.compile("^Bearer (?[a-zA-Z0-9-:._~+/]+=*)$", + Pattern.CASE_INSENSITIVE); + + private boolean allowFormEncodedBodyParameter = false; + + private boolean allowUriQueryParameter = true; + + private String bearerTokenHeaderName = HttpHeaders.AUTHORIZATION; + + private final PathMatcher pathMatcher = new AntPathMatcher(); + + private final PermitAllUrlProperties urlProperties; + + public PigxBearerTokenExtractor(PermitAllUrlProperties urlProperties) { + this.urlProperties = urlProperties; + } + + @Override + public String resolve(HttpServletRequest request) { + String requestUri = request.getRequestURI(); + String relativePath = requestUri.substring(request.getContextPath().length()); + + boolean match = urlProperties.getIgnoreUrls().stream().anyMatch(url -> pathMatcher.match(url, relativePath)); + + if (match) { + return null; + } + + final String authorizationHeaderToken = resolveFromAuthorizationHeader(request); + final String parameterToken = isParameterTokenSupportedForRequest(request) + ? resolveFromRequestParameters(request) : null; + if (authorizationHeaderToken != null) { + if (parameterToken != null) { + final BearerTokenError error = BearerTokenErrors + .invalidRequest("Found multiple bearer tokens in the request"); + throw new OAuth2AuthenticationException(error); + } + return authorizationHeaderToken; + } + if (parameterToken != null && isParameterTokenEnabledForRequest(request)) { + return parameterToken; + } + return null; + } + + private String resolveFromAuthorizationHeader(HttpServletRequest request) { + String authorization = request.getHeader(this.bearerTokenHeaderName); + if (!StringUtils.startsWithIgnoreCase(authorization, "bearer")) { + return null; + } + Matcher matcher = authorizationPattern.matcher(authorization); + if (!matcher.matches()) { + BearerTokenError error = BearerTokenErrors.invalidToken("Bearer token is malformed"); + throw new OAuth2AuthenticationException(error); + } + return matcher.group("token"); + } + + private static String resolveFromRequestParameters(HttpServletRequest request) { + String[] values = request.getParameterValues("access_token"); + if (values == null || values.length == 0) { + return null; + } + if (values.length == 1) { + return values[0]; + } + BearerTokenError error = BearerTokenErrors.invalidRequest("Found multiple bearer tokens in the request"); + throw new OAuth2AuthenticationException(error); + } + + private boolean isParameterTokenSupportedForRequest(final HttpServletRequest request) { + return (("POST".equals(request.getMethod()) + && MediaType.APPLICATION_FORM_URLENCODED_VALUE.equals(request.getContentType())) + || "GET".equals(request.getMethod())); + } + + private boolean isParameterTokenEnabledForRequest(final HttpServletRequest request) { + return ((this.allowFormEncodedBodyParameter && "POST".equals(request.getMethod()) + && MediaType.APPLICATION_FORM_URLENCODED_VALUE.equals(request.getContentType())) + || (this.allowUriQueryParameter && "GET".equals(request.getMethod()))); + } + +} diff --git a/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/component/PigxClientCredentialsOAuth2AuthenticatedPrincipal.java b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/component/PigxClientCredentialsOAuth2AuthenticatedPrincipal.java new file mode 100644 index 0000000..4d17bc2 --- /dev/null +++ b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/component/PigxClientCredentialsOAuth2AuthenticatedPrincipal.java @@ -0,0 +1,40 @@ +package com.pig4cloud.pigx.common.security.component; + +import lombok.RequiredArgsConstructor; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.oauth2.core.OAuth2AuthenticatedPrincipal; + +import java.util.Collection; +import java.util.Map; + +/** + * @author lengleng + * @date 2022/7/6 + * + * credential 支持客户端模式的用户存储 + */ +@RequiredArgsConstructor +public class PigxClientCredentialsOAuth2AuthenticatedPrincipal implements OAuth2AuthenticatedPrincipal { + + private final Map attributes; + + private final Collection authorities; + + private final String name; + + @Override + public Map getAttributes() { + return this.attributes; + } + + @Override + public Collection getAuthorities() { + return this.authorities; + } + + @Override + public String getName() { + return this.name; + } + +} diff --git a/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/component/PigxCustomOpaqueTokenIntrospector.java b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/component/PigxCustomOpaqueTokenIntrospector.java new file mode 100644 index 0000000..a6386b1 --- /dev/null +++ b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/component/PigxCustomOpaqueTokenIntrospector.java @@ -0,0 +1,81 @@ +package com.pig4cloud.pigx.common.security.component; + +import com.pig4cloud.pigx.common.core.constant.SecurityConstants; +import com.pig4cloud.pigx.common.core.util.SpringContextHolder; +import com.pig4cloud.pigx.common.security.service.PigxUser; +import com.pig4cloud.pigx.common.security.service.PigxUserDetailsService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.Ordered; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.authority.AuthorityUtils; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.security.oauth2.core.AuthorizationGrantType; +import org.springframework.security.oauth2.core.OAuth2AuthenticatedPrincipal; +import org.springframework.security.oauth2.server.authorization.OAuth2Authorization; +import org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationService; +import org.springframework.security.oauth2.server.authorization.OAuth2TokenType; +import org.springframework.security.oauth2.server.resource.InvalidBearerTokenException; +import org.springframework.security.oauth2.server.resource.introspection.OpaqueTokenIntrospector; + +import java.security.Principal; +import java.util.Comparator; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; + +/** + * @author lengleng + * @date 2022/5/28 + */ +@Slf4j +@RequiredArgsConstructor +public class PigxCustomOpaqueTokenIntrospector implements OpaqueTokenIntrospector { + + private final OAuth2AuthorizationService authorizationService; + + @Override + public OAuth2AuthenticatedPrincipal introspect(String token) { + OAuth2Authorization oldAuthorization = authorizationService.findByToken(token, OAuth2TokenType.ACCESS_TOKEN); + if (Objects.isNull(oldAuthorization)) { + throw new InvalidBearerTokenException(token); + } + + // 客户端模式默认返回 + if (AuthorizationGrantType.CLIENT_CREDENTIALS.equals(oldAuthorization.getAuthorizationGrantType())) { + return new PigxClientCredentialsOAuth2AuthenticatedPrincipal(oldAuthorization.getAttributes(), + AuthorityUtils.NO_AUTHORITIES, oldAuthorization.getPrincipalName()); + } + + Map userDetailsServiceMap = SpringContextHolder + .getBeansOfType(PigxUserDetailsService.class); + + Optional optional = userDetailsServiceMap.values().stream() + .filter(service -> service.support(Objects.requireNonNull(oldAuthorization).getRegisteredClientId(), + oldAuthorization.getAuthorizationGrantType().getValue())) + .max(Comparator.comparingInt(Ordered::getOrder)); + + UserDetails userDetails = null; + try { + Object principal = Objects.requireNonNull(oldAuthorization).getAttributes().get(Principal.class.getName()); + UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken = (UsernamePasswordAuthenticationToken) principal; + Object tokenPrincipal = usernamePasswordAuthenticationToken.getPrincipal(); + userDetails = optional.get().loadUserByUser((PigxUser) tokenPrincipal); + } + catch (UsernameNotFoundException notFoundException) { + log.warn("用户不不存在 {}", notFoundException.getLocalizedMessage()); + throw notFoundException; + } + catch (Exception ex) { + log.error("资源服务器 introspect Token error {}", ex.getLocalizedMessage()); + } + + // 注入客户端信息,方便上下文中获取 + PigxUser pigxUser = (PigxUser) userDetails; + Objects.requireNonNull(pigxUser).getAttributes().put(SecurityConstants.CLIENT_ID, + oldAuthorization.getRegisteredClientId()); + return pigxUser; + } + +} diff --git a/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/component/PigxResourceServerAutoConfiguration.java b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/component/PigxResourceServerAutoConfiguration.java new file mode 100644 index 0000000..5f4e47a --- /dev/null +++ b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/component/PigxResourceServerAutoConfiguration.java @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.pig4cloud.pigx.common.security.component; + +import com.fasterxml.jackson.databind.ObjectMapper; +import lombok.RequiredArgsConstructor; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.MessageSource; +import org.springframework.context.annotation.Bean; +import org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationService; +import org.springframework.security.oauth2.server.resource.introspection.OpaqueTokenIntrospector; + +/** + * @author lengleng + * @date 2022-06-02 + */ +@RequiredArgsConstructor +@EnableConfigurationProperties(PermitAllUrlProperties.class) +public class PigxResourceServerAutoConfiguration { + + /** + * 鉴权具体的实现逻辑 + * @return (#pms.xxx) + */ + @Bean("pms") + public PermissionService permissionService() { + return new PermissionService(); + } + + /** + * 请求令牌的抽取逻辑 + * @param urlProperties 对外暴露的接口列表 + * @return BearerTokenExtractor + */ + @Bean + public PigxBearerTokenExtractor pigBearerTokenExtractor(PermitAllUrlProperties urlProperties) { + return new PigxBearerTokenExtractor(urlProperties); + } + + /** + * 资源服务器异常处理 + * @param objectMapper jackson 输出对象 + * @param securityMessageSource 自定义国际化处理器 + * @return ResourceAuthExceptionEntryPoint + */ + @Bean + public ResourceAuthExceptionEntryPoint resourceAuthExceptionEntryPoint(ObjectMapper objectMapper, + MessageSource securityMessageSource) { + return new ResourceAuthExceptionEntryPoint(objectMapper, securityMessageSource); + } + + /** + * 资源服务器toke内省处理器 + * @param authorizationService token 存储实现 + * @return TokenIntrospector + */ + @Bean + public OpaqueTokenIntrospector opaqueTokenIntrospector(OAuth2AuthorizationService authorizationService) { + return new PigxCustomOpaqueTokenIntrospector(authorizationService); + } + +} diff --git a/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/component/PigxResourceServerConfiguration.java b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/component/PigxResourceServerConfiguration.java new file mode 100644 index 0000000..117d376 --- /dev/null +++ b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/component/PigxResourceServerConfiguration.java @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.pig4cloud.pigx.common.security.component; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Bean; +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer; +import org.springframework.security.config.annotation.web.configurers.HeadersConfigurer; +import org.springframework.security.oauth2.server.resource.introspection.OpaqueTokenIntrospector; +import org.springframework.security.web.SecurityFilterChain; +import org.springframework.security.web.util.matcher.AntPathRequestMatcher; + +import java.util.stream.Collectors; + +/** + * @author lengleng + * @date 2022-06-04 + * + * 资源服务器认证授权配置 + */ +@Slf4j +@EnableWebSecurity +@EnableMethodSecurity +@RequiredArgsConstructor +public class PigxResourceServerConfiguration { + + protected final ResourceAuthExceptionEntryPoint resourceAuthExceptionEntryPoint; + + private final PermitAllUrlProperties permitAllUrl; + + private final PigxBearerTokenExtractor pigxBearerTokenExtractor; + + private final OpaqueTokenIntrospector customOpaqueTokenIntrospector; + + @Bean + @Order(Ordered.HIGHEST_PRECEDENCE) + SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { + AntPathRequestMatcher[] requestMatchers = permitAllUrl.getIgnoreUrls().stream().map(AntPathRequestMatcher::new) + .collect(Collectors.toList()).toArray(new AntPathRequestMatcher[] {}); + + http.authorizeHttpRequests(authorizeRequests -> authorizeRequests.requestMatchers(requestMatchers).permitAll() + .anyRequest().authenticated()) + .oauth2ResourceServer( + oauth2 -> oauth2.opaqueToken(token -> token.introspector(customOpaqueTokenIntrospector)) + .authenticationEntryPoint(resourceAuthExceptionEntryPoint) + .bearerTokenResolver(pigxBearerTokenExtractor)) + .headers(headers -> headers.frameOptions(HeadersConfigurer.FrameOptionsConfig::disable)) + .csrf(AbstractHttpConfigurer::disable); + + return http.build(); + } + +} diff --git a/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/component/PigxSecurityInnerAspect.java b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/component/PigxSecurityInnerAspect.java new file mode 100644 index 0000000..9f93561 --- /dev/null +++ b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/component/PigxSecurityInnerAspect.java @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.pig4cloud.pigx.common.security.component; + +import cn.hutool.core.util.StrUtil; +import com.pig4cloud.pigx.common.core.constant.SecurityConstants; +import com.pig4cloud.pigx.common.security.annotation.Inner; +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Before; +import org.springframework.core.Ordered; +import org.springframework.core.annotation.AnnotationUtils; +import org.springframework.security.access.AccessDeniedException; + +import javax.servlet.http.HttpServletRequest; + +/** + * @author lengleng + * @date 2022-06-04 + * + * 服务间接口不鉴权处理逻辑 + */ +@Slf4j +@Aspect +@RequiredArgsConstructor +public class PigxSecurityInnerAspect implements Ordered { + + private final HttpServletRequest request; + + @SneakyThrows + @Before("@within(inner) || @annotation(inner)") + public void around(JoinPoint point, Inner inner) { + String header = request.getHeader(SecurityConstants.FROM); + if (inner == null) { + Class clazz = point.getTarget().getClass(); + inner = AnnotationUtils.findAnnotation(clazz, Inner.class); + } + + if (inner.value() && !StrUtil.equals(SecurityConstants.FROM_IN, header)) { + log.warn("访问接口 {} 没有权限", point.getSignature().getName()); + throw new AccessDeniedException("Access is denied"); + } + } + + @Override + public int getOrder() { + return Ordered.HIGHEST_PRECEDENCE + 1; + } + +} diff --git a/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/component/PigxSecurityMessageSourceConfiguration.java b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/component/PigxSecurityMessageSourceConfiguration.java new file mode 100644 index 0000000..68e9246 --- /dev/null +++ b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/component/PigxSecurityMessageSourceConfiguration.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.pig4cloud.pigx.common.security.component; + +import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication; +import org.springframework.context.MessageSource; +import org.springframework.context.annotation.Bean; +import org.springframework.context.support.ReloadableResourceBundleMessageSource; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +import java.util.Locale; + +import static org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication.Type.SERVLET; + +/** + * @author lengleng + * @date 2022-06-04 + *

+ * 注入自定义错误处理,覆盖 org/springframework/security/messages 内置异常 + */ +@ConditionalOnWebApplication(type = SERVLET) +public class PigxSecurityMessageSourceConfiguration implements WebMvcConfigurer { + + @Bean + public MessageSource securityMessageSource() { + ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource(); + messageSource.addBasenames("classpath:errors/messages"); + messageSource.setDefaultLocale(Locale.CHINA); + return messageSource; + } + +} diff --git a/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/component/ResourceAuthExceptionEntryPoint.java b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/component/ResourceAuthExceptionEntryPoint.java new file mode 100644 index 0000000..1ed9d1f --- /dev/null +++ b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/component/ResourceAuthExceptionEntryPoint.java @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.pig4cloud.pigx.common.security.component; + +import cn.hutool.http.ContentType; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.pig4cloud.pigx.common.core.constant.CommonConstants; +import com.pig4cloud.pigx.common.core.util.R; +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; +import org.springframework.context.MessageSource; +import org.springframework.context.i18n.LocaleContextHolder; +import org.springframework.http.HttpStatus; +import org.springframework.security.authentication.InsufficientAuthenticationException; +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.oauth2.server.resource.InvalidBearerTokenException; +import org.springframework.security.web.AuthenticationEntryPoint; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.PrintWriter; + +/** + * @author lengleng + * @date 2019/2/1 + * + * 客户端异常处理 AuthenticationException 不同细化异常处理 + */ +@RequiredArgsConstructor +public class ResourceAuthExceptionEntryPoint implements AuthenticationEntryPoint { + + private final ObjectMapper objectMapper; + + private final MessageSource messageSource; + + @Override + @SneakyThrows + public void commence(HttpServletRequest request, HttpServletResponse response, + AuthenticationException authException) { + response.setCharacterEncoding(CommonConstants.UTF8); + response.setContentType(ContentType.JSON.getValue()); + R result = new R<>(); + result.setCode(CommonConstants.FAIL); + response.setStatus(HttpStatus.UNAUTHORIZED.value()); + if (authException != null) { + result.setMsg("error"); + result.setData(authException.getMessage()); + } + + // 针对令牌过期返回特殊的 424 + if (authException instanceof InvalidBearerTokenException + || authException instanceof InsufficientAuthenticationException) { + response.setStatus(HttpStatus.FAILED_DEPENDENCY.value()); + result.setMsg(this.messageSource.getMessage("OAuth2ResourceOwnerBaseAuthenticationProvider.tokenExpired", + null, LocaleContextHolder.getLocale())); + } + PrintWriter printWriter = response.getWriter(); + printWriter.append(objectMapper.writeValueAsString(result)); + } + +} diff --git a/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/feign/PigxClientToCRequestInterceptor.java b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/feign/PigxClientToCRequestInterceptor.java new file mode 100644 index 0000000..a3e04a0 --- /dev/null +++ b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/feign/PigxClientToCRequestInterceptor.java @@ -0,0 +1,34 @@ +package com.pig4cloud.pigx.common.security.feign; + +import cn.hutool.core.util.StrUtil; +import com.pig4cloud.pigx.common.core.constant.SecurityConstants; +import com.pig4cloud.pigx.common.core.util.WebUtils; +import feign.RequestInterceptor; +import feign.RequestTemplate; +import lombok.extern.slf4j.Slf4j; + +/** + * TOC 客户标识传递 + * + * @author lengleng + * @date 2023/3/17 + */ +@Slf4j +public class PigxClientToCRequestInterceptor implements RequestInterceptor { + + /** + * Called for every request. Add data using methods on the supplied + * {@link RequestTemplate}. + * @param template + */ + public void apply(RequestTemplate template) { + String reqVersion = WebUtils.getRequest() != null + ? WebUtils.getRequest().getHeader(SecurityConstants.HEADER_TOC) : null; + + if (StrUtil.isNotBlank(reqVersion)) { + log.debug("feign add header toc :{}", reqVersion); + template.header(SecurityConstants.HEADER_TOC, reqVersion); + } + } + +} diff --git a/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/feign/PigxFeignClientConfiguration.java b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/feign/PigxFeignClientConfiguration.java new file mode 100644 index 0000000..04b6d89 --- /dev/null +++ b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/feign/PigxFeignClientConfiguration.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.pig4cloud.pigx.common.security.feign; + +import feign.RequestInterceptor; +import org.springframework.context.annotation.Bean; +import org.springframework.security.oauth2.server.resource.web.BearerTokenResolver; + +public class PigxFeignClientConfiguration { + + /** + * 注入 oauth2 feign token 增强 + * @param tokenResolver token获取处理器 + * @return 拦截器 + */ + @Bean + public RequestInterceptor oauthRequestInterceptor(BearerTokenResolver tokenResolver) { + return new PigxOAuthRequestInterceptor(tokenResolver); + } + + @Bean + public RequestInterceptor clientToCRequestInterceptor() { + return new PigxClientToCRequestInterceptor(); + } + +} diff --git a/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/feign/PigxOAuthRequestInterceptor.java b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/feign/PigxOAuthRequestInterceptor.java new file mode 100644 index 0000000..6d7f76c --- /dev/null +++ b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/feign/PigxOAuthRequestInterceptor.java @@ -0,0 +1,63 @@ +package com.pig4cloud.pigx.common.security.feign; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.pig4cloud.pigx.common.core.constant.SecurityConstants; +import com.pig4cloud.pigx.common.core.util.WebUtils; +import feign.RequestInterceptor; +import feign.RequestTemplate; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.HttpHeaders; +import org.springframework.security.oauth2.core.OAuth2AccessToken; +import org.springframework.security.oauth2.server.resource.web.BearerTokenResolver; + +import javax.servlet.http.HttpServletRequest; +import java.util.Collection; + +/** + * oauth2 feign token传递 + * + * 重新 OAuth2FeignRequestInterceptor ,官方实现部分常见不适用 + * + * @author lengleng + * @date 2022/5/29 + */ +@Slf4j +@RequiredArgsConstructor +public class PigxOAuthRequestInterceptor implements RequestInterceptor { + + private final BearerTokenResolver tokenResolver; + + /** + * Create a template with the header of provided name and extracted extract
+ * + * 1. 如果使用 非web 请求,header 区别
+ * + * 2. 根据authentication 还原请求token + * @param template + */ + @Override + public void apply(RequestTemplate template) { + Collection fromHeader = template.headers().get(SecurityConstants.FROM); + // 带from 请求直接跳过 + if (CollUtil.isNotEmpty(fromHeader) && fromHeader.contains(SecurityConstants.FROM_IN)) { + return; + } + + // 非web 请求直接跳过 + if (WebUtils.getRequest() == null) { + return; + } + HttpServletRequest request = WebUtils.getRequest(); + // 避免请求参数的 query token 无法传递 + String token = tokenResolver.resolve(request); + if (StrUtil.isBlank(token)) { + return; + } + template.header(HttpHeaders.AUTHORIZATION, + String.format("%s %s", OAuth2AccessToken.TokenType.BEARER.getValue(), token)); + + } + +} diff --git a/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/handler/AuthenticationFailureHandler.java b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/handler/AuthenticationFailureHandler.java new file mode 100644 index 0000000..ae1ed84 --- /dev/null +++ b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/handler/AuthenticationFailureHandler.java @@ -0,0 +1,25 @@ +package com.pig4cloud.pigx.common.security.handler; + +import org.springframework.security.core.Authentication; +import org.springframework.security.core.AuthenticationException; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * @author lengleng + * @date 2020/03/25 token 发放失败处理 + */ +public interface AuthenticationFailureHandler { + + /** + * 业务处理 + * @param authenticationException 错误信息 + * @param authentication 认证信息 + * @param request 请求信息 + * @param response 响应信息 + */ + void handle(AuthenticationException authenticationException, Authentication authentication, + HttpServletRequest request, HttpServletResponse response); + +} diff --git a/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/handler/AuthenticationLogoutHandler.java b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/handler/AuthenticationLogoutHandler.java new file mode 100644 index 0000000..2ebecaf --- /dev/null +++ b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/handler/AuthenticationLogoutHandler.java @@ -0,0 +1,22 @@ +package com.pig4cloud.pigx.common.security.handler; + +import org.springframework.security.core.Authentication; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * @author lengleng + * @date 2021/06/22 退出后置处理 + */ +public interface AuthenticationLogoutHandler { + + /** + * 业务处理 + * @param authentication 认证信息 + * @param request 请求信息 + * @param response 响应信息 + */ + void handle(Authentication authentication, HttpServletRequest request, HttpServletResponse response); + +} diff --git a/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/handler/AuthenticationSuccessHandler.java b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/handler/AuthenticationSuccessHandler.java new file mode 100644 index 0000000..e4d62d7 --- /dev/null +++ b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/handler/AuthenticationSuccessHandler.java @@ -0,0 +1,22 @@ +package com.pig4cloud.pigx.common.security.handler; + +import org.springframework.security.core.Authentication; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * @author lengleng + * @date 2020/03/25 token 发放成功处理 + */ +public interface AuthenticationSuccessHandler { + + /** + * 业务处理 + * @param authentication 认证信息 + * @param request 请求信息 + * @param response 响应信息 + */ + void handle(Authentication authentication, HttpServletRequest request, HttpServletResponse response); + +} diff --git a/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/handler/FormAuthenticationFailureHandler.java b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/handler/FormAuthenticationFailureHandler.java new file mode 100644 index 0000000..385defb --- /dev/null +++ b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/handler/FormAuthenticationFailureHandler.java @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.common.security.handler; + +import cn.hutool.core.util.CharsetUtil; +import cn.hutool.http.HttpUtil; +import com.pig4cloud.pigx.common.core.util.WebUtils; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.web.authentication.AuthenticationFailureHandler; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * @author lengleng + * @date 2019-08-20 + *

+ * 表单登录失败处理逻辑 + */ +@Slf4j +public class FormAuthenticationFailureHandler implements AuthenticationFailureHandler { + + /** + * Called when an authentication attempt fails. + * @param request the request during which the authentication attempt occurred. + * @param response the response. + * @param exception the exception which was thrown to reject the authentication + */ + @Override + @SneakyThrows + public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, + AuthenticationException exception) { + log.debug("表单登录失败:{}", exception.getLocalizedMessage()); + String url = HttpUtil.encodeParams(String.format("/token/login?error=%s", exception.getMessage()), + CharsetUtil.CHARSET_UTF_8); + WebUtils.getResponse().sendRedirect(url); + } + +} \ No newline at end of file diff --git a/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/handler/SsoLogoutSuccessHandler.java b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/handler/SsoLogoutSuccessHandler.java new file mode 100644 index 0000000..d2042b0 --- /dev/null +++ b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/handler/SsoLogoutSuccessHandler.java @@ -0,0 +1,39 @@ +package com.pig4cloud.pigx.common.security.handler; + +import cn.hutool.core.util.StrUtil; +import org.springframework.http.HttpHeaders; +import org.springframework.security.core.Authentication; +import org.springframework.security.web.authentication.logout.LogoutSuccessHandler; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * @author lengleng + * @date 2020/10/6 + *

+ * sso 退出功能 ,根据客户端传入跳转 + */ +public class SsoLogoutSuccessHandler implements LogoutSuccessHandler { + + private static final String REDIRECT_URL = "redirect_url"; + + @Override + public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) + throws IOException { + + // 获取请求参数中是否包含 回调地址 + String redirectUrl = request.getParameter(REDIRECT_URL); + String referer = request.getHeader(HttpHeaders.REFERER); + + if (StrUtil.isNotBlank(redirectUrl)) { + response.sendRedirect(redirectUrl); + } + else if (StrUtil.isNotBlank(referer)) { + // 默认跳转referer 地址 + response.sendRedirect(referer); + } + } + +} diff --git a/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/service/PigxDefaultUserDetailsServiceImpl.java b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/service/PigxDefaultUserDetailsServiceImpl.java new file mode 100644 index 0000000..076d281 --- /dev/null +++ b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/service/PigxDefaultUserDetailsServiceImpl.java @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.common.security.service; + +import com.pig4cloud.pigx.admin.api.dto.UserInfo; +import com.pig4cloud.pigx.admin.api.feign.RemoteUserService; +import com.pig4cloud.pigx.common.core.constant.CacheConstants; +import com.pig4cloud.pigx.common.core.constant.SecurityConstants; +import com.pig4cloud.pigx.common.core.util.R; +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.springframework.cache.Cache; +import org.springframework.cache.CacheManager; +import org.springframework.context.annotation.Primary; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UsernameNotFoundException; + +/** + * 用户详细信息 default + * + * @author lengleng + */ +@Slf4j +@Primary +@RequiredArgsConstructor +public class PigxDefaultUserDetailsServiceImpl implements PigxUserDetailsService { + + private final RemoteUserService remoteUserService; + + private final CacheManager cacheManager; + + /** + * 用户密码登录 + * @param username 用户名 + * @return + * @throws UsernameNotFoundException + */ + @Override + @SneakyThrows + public UserDetails loadUserByUsername(String username) { + Cache cache = cacheManager.getCache(CacheConstants.USER_DETAILS); + if (cache != null && cache.get(username) != null) { + return cache.get(username, PigxUser.class); + } + + R result = remoteUserService.info(username, SecurityConstants.FROM_IN); + UserDetails userDetails = getUserDetails(result); + cache.put(username, userDetails); + return userDetails; + } + + @Override + public int getOrder() { + return Integer.MIN_VALUE; + } + +} diff --git a/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/service/PigxMobileUserDetailServiceImpl.java b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/service/PigxMobileUserDetailServiceImpl.java new file mode 100644 index 0000000..2280612 --- /dev/null +++ b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/service/PigxMobileUserDetailServiceImpl.java @@ -0,0 +1,47 @@ +package com.pig4cloud.pigx.common.security.service; + +import com.pig4cloud.pigx.admin.api.dto.UserInfo; +import com.pig4cloud.pigx.admin.api.feign.RemoteUserService; +import com.pig4cloud.pigx.common.core.constant.SecurityConstants; +import com.pig4cloud.pigx.common.core.util.R; +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; + +/** + * @author aeizzz + */ +@Slf4j +@RequiredArgsConstructor +public class PigxMobileUserDetailServiceImpl implements PigxUserDetailsService { + + private final UserDetailsService pigxDefaultUserDetailsServiceImpl; + + private final RemoteUserService remoteUserService; + + @Override + @SneakyThrows + public UserDetails loadUserByUsername(String phone) { + R result = remoteUserService.social(phone, SecurityConstants.FROM_IN); + return getUserDetails(result); + } + + @Override + public UserDetails loadUserByUser(PigxUser pigxUser) { + return pigxDefaultUserDetailsServiceImpl.loadUserByUsername(pigxUser.getUsername()); + } + + /** + * 支持所有的 mobile 类型 + * @param clientId 目标客户端 + * @param grantType 授权类型 + * @return true/false + */ + @Override + public boolean support(String clientId, String grantType) { + return SecurityConstants.GRANT_MOBILE.equals(grantType); + } + +} diff --git a/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/service/PigxRedisOAuth2AuthorizationConsentService.java b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/service/PigxRedisOAuth2AuthorizationConsentService.java new file mode 100644 index 0000000..fd4baac --- /dev/null +++ b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/service/PigxRedisOAuth2AuthorizationConsentService.java @@ -0,0 +1,49 @@ +package com.pig4cloud.pigx.common.security.service; + +import lombok.RequiredArgsConstructor; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationConsent; +import org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationConsentService; +import org.springframework.util.Assert; + +import java.util.concurrent.TimeUnit; + +@RequiredArgsConstructor +public class PigxRedisOAuth2AuthorizationConsentService implements OAuth2AuthorizationConsentService { + + private final RedisTemplate redisTemplate; + + private final static Long TIMEOUT = 10L; + + @Override + public void save(OAuth2AuthorizationConsent authorizationConsent) { + Assert.notNull(authorizationConsent, "authorizationConsent cannot be null"); + + redisTemplate.opsForValue().set(buildKey(authorizationConsent), authorizationConsent, TIMEOUT, + TimeUnit.MINUTES); + + } + + @Override + public void remove(OAuth2AuthorizationConsent authorizationConsent) { + Assert.notNull(authorizationConsent, "authorizationConsent cannot be null"); + redisTemplate.delete(buildKey(authorizationConsent)); + } + + @Override + public OAuth2AuthorizationConsent findById(String registeredClientId, String principalName) { + Assert.hasText(registeredClientId, "registeredClientId cannot be empty"); + Assert.hasText(principalName, "principalName cannot be empty"); + return (OAuth2AuthorizationConsent) redisTemplate.opsForValue() + .get(buildKey(registeredClientId, principalName)); + } + + private static String buildKey(String registeredClientId, String principalName) { + return "token:consent:" + registeredClientId + ":" + principalName; + } + + private static String buildKey(OAuth2AuthorizationConsent authorizationConsent) { + return buildKey(authorizationConsent.getRegisteredClientId(), authorizationConsent.getPrincipalName()); + } + +} diff --git a/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/service/PigxRedisOAuth2AuthorizationService.java b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/service/PigxRedisOAuth2AuthorizationService.java new file mode 100644 index 0000000..4b87524 --- /dev/null +++ b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/service/PigxRedisOAuth2AuthorizationService.java @@ -0,0 +1,186 @@ +package com.pig4cloud.pigx.common.security.service; + +import cn.hutool.core.collection.CollUtil; +import com.pig4cloud.pigx.common.core.constant.SecurityConstants; +import com.pig4cloud.pigx.common.core.util.KeyStrResolver; +import lombok.RequiredArgsConstructor; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.serializer.RedisSerializer; +import org.springframework.lang.Nullable; +import org.springframework.security.core.Authentication; +import org.springframework.security.oauth2.core.OAuth2AccessToken; +import org.springframework.security.oauth2.core.OAuth2RefreshToken; +import org.springframework.security.oauth2.core.endpoint.OAuth2ParameterNames; +import org.springframework.security.oauth2.server.authorization.OAuth2Authorization; +import org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationCode; +import org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationService; +import org.springframework.security.oauth2.server.authorization.OAuth2TokenType; +import org.springframework.util.Assert; + +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.Set; +import java.util.concurrent.TimeUnit; + +/** + * @author lengleng + * @date 2022/5/27 + */ +@RequiredArgsConstructor +public class PigxRedisOAuth2AuthorizationService implements OAuth2AuthorizationService { + + private final static Long TIMEOUT = 10L; + + private static final String AUTHORIZATION = "token"; + + private final RedisTemplate redisTemplate; + + private final KeyStrResolver tenantKeyStrResolver; + + @Override + public void save(OAuth2Authorization authorization) { + Assert.notNull(authorization, "authorization cannot be null"); + + if (isState(authorization)) { + String token = authorization.getAttribute("state"); + redisTemplate.setValueSerializer(RedisSerializer.java()); + redisTemplate.opsForValue().set(buildKey(OAuth2ParameterNames.STATE, token), authorization, TIMEOUT, + TimeUnit.MINUTES); + } + + if (isCode(authorization)) { + OAuth2Authorization.Token authorizationCode = authorization + .getToken(OAuth2AuthorizationCode.class); + OAuth2AuthorizationCode authorizationCodeToken = authorizationCode.getToken(); + long between = ChronoUnit.MINUTES.between(authorizationCodeToken.getIssuedAt(), + authorizationCodeToken.getExpiresAt()); + redisTemplate.setValueSerializer(RedisSerializer.java()); + redisTemplate.opsForValue().set(buildKey(OAuth2ParameterNames.CODE, authorizationCodeToken.getTokenValue()), + authorization, between, TimeUnit.MINUTES); + } + + if (isRefreshToken(authorization)) { + OAuth2RefreshToken refreshToken = authorization.getRefreshToken().getToken(); + long between = ChronoUnit.SECONDS.between(refreshToken.getIssuedAt(), refreshToken.getExpiresAt()); + redisTemplate.setValueSerializer(RedisSerializer.java()); + redisTemplate.opsForValue().set(buildKey(OAuth2ParameterNames.REFRESH_TOKEN, refreshToken.getTokenValue()), + authorization, between, TimeUnit.SECONDS); + } + + if (isAccessToken(authorization)) { + OAuth2AccessToken accessToken = authorization.getAccessToken().getToken(); + long between = ChronoUnit.SECONDS.between(accessToken.getIssuedAt(), accessToken.getExpiresAt()); + redisTemplate.setValueSerializer(RedisSerializer.java()); + redisTemplate.opsForValue().set(buildKey(OAuth2ParameterNames.ACCESS_TOKEN, accessToken.getTokenValue()), + authorization, between, TimeUnit.SECONDS); + + // 扩展记录 access-token 、username 的关系 1::token::username::admin::xxx + String tokenUsername = String.format("%s::%s::%s::%s::%s", tenantKeyStrResolver.key(), AUTHORIZATION, + SecurityConstants.DETAILS_USERNAME, authorization.getPrincipalName(), accessToken.getTokenValue()); + redisTemplate.opsForValue().set(tokenUsername, accessToken.getTokenValue(), between, TimeUnit.SECONDS); + } + } + + @Override + public void remove(OAuth2Authorization authorization) { + Assert.notNull(authorization, "authorization cannot be null"); + + List keys = new ArrayList<>(); + if (isState(authorization)) { + String token = authorization.getAttribute("state"); + keys.add(buildKey(OAuth2ParameterNames.STATE, token)); + } + + if (isCode(authorization)) { + OAuth2Authorization.Token authorizationCode = authorization + .getToken(OAuth2AuthorizationCode.class); + OAuth2AuthorizationCode authorizationCodeToken = authorizationCode.getToken(); + keys.add(buildKey(OAuth2ParameterNames.CODE, authorizationCodeToken.getTokenValue())); + } + + if (isRefreshToken(authorization)) { + OAuth2RefreshToken refreshToken = authorization.getRefreshToken().getToken(); + keys.add(buildKey(OAuth2ParameterNames.REFRESH_TOKEN, refreshToken.getTokenValue())); + } + + if (isAccessToken(authorization)) { + OAuth2AccessToken accessToken = authorization.getAccessToken().getToken(); + keys.add(buildKey(OAuth2ParameterNames.ACCESS_TOKEN, accessToken.getTokenValue())); + + // 扩展记录 access-token 、username 的关系 1::token::username::admin::xxx + String key = String.format("%s::%s::%s::%s::%s", tenantKeyStrResolver.key(), AUTHORIZATION, + SecurityConstants.DETAILS_USERNAME, authorization.getPrincipalName(), accessToken.getTokenValue()); + keys.add(key); + } + + redisTemplate.delete(keys); + } + + @Override + @Nullable + public OAuth2Authorization findById(String id) { + throw new UnsupportedOperationException(); + } + + @Override + @Nullable + public OAuth2Authorization findByToken(String token, @Nullable OAuth2TokenType tokenType) { + Assert.hasText(token, "token cannot be empty"); + Assert.notNull(tokenType, "tokenType cannot be empty"); + redisTemplate.setValueSerializer(RedisSerializer.java()); + return (OAuth2Authorization) redisTemplate.opsForValue().get(buildKey(tokenType.getValue(), token)); + } + + private String buildKey(String type, String id) { + return String.format("%s::%s::%s::%s", tenantKeyStrResolver.key(), AUTHORIZATION, type, id); + } + + private static boolean isState(OAuth2Authorization authorization) { + return Objects.nonNull(authorization.getAttribute("state")); + } + + private static boolean isCode(OAuth2Authorization authorization) { + OAuth2Authorization.Token authorizationCode = authorization + .getToken(OAuth2AuthorizationCode.class); + return Objects.nonNull(authorizationCode); + } + + private static boolean isRefreshToken(OAuth2Authorization authorization) { + return Objects.nonNull(authorization.getRefreshToken()); + } + + private static boolean isAccessToken(OAuth2Authorization authorization) { + return Objects.nonNull(authorization.getAccessToken()); + } + + /** + * 扩展方法根据 username 查询是否存在存储的 + * @param authentication + * @return + */ + public void removeByUsername(Authentication authentication) { + // 根据 username查询对应access-token + String authenticationName = authentication.getName(); + + // 扩展记录 access-token 、username 的关系 1::token::username::admin::xxx + String tokenUsernameKey = String.format("%s::%s::%s::%s::*", tenantKeyStrResolver.key(), AUTHORIZATION, + SecurityConstants.DETAILS_USERNAME, authenticationName); + Set keys = redisTemplate.keys(tokenUsernameKey); + if (CollUtil.isEmpty(keys)) { + return; + } + + List tokenList = redisTemplate.opsForValue().multiGet(keys); + + for (Object token : tokenList) { + // 根据token 查询存储的 OAuth2Authorization + OAuth2Authorization authorization = this.findByToken((String) token, OAuth2TokenType.ACCESS_TOKEN); + // 根据 OAuth2Authorization 删除相关令牌 + this.remove(authorization); + } + + } + +} diff --git a/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/service/PigxRemoteRegisteredClientRepository.java b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/service/PigxRemoteRegisteredClientRepository.java new file mode 100644 index 0000000..1eff045 --- /dev/null +++ b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/service/PigxRemoteRegisteredClientRepository.java @@ -0,0 +1,134 @@ +package com.pig4cloud.pigx.common.security.service; + +import cn.hutool.core.util.BooleanUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; +import com.pig4cloud.pigx.admin.api.entity.SysOauthClientDetails; +import com.pig4cloud.pigx.admin.api.feign.RemoteClientDetailsService; +import com.pig4cloud.pigx.common.core.constant.CacheConstants; +import com.pig4cloud.pigx.common.core.constant.SecurityConstants; +import com.pig4cloud.pigx.common.core.util.RetOps; +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.security.oauth2.core.AuthorizationGrantType; +import org.springframework.security.oauth2.core.ClientAuthenticationMethod; +import org.springframework.security.oauth2.core.OAuth2Error; +import org.springframework.security.oauth2.server.authorization.authentication.OAuth2AuthorizationCodeRequestAuthenticationException; +import org.springframework.security.oauth2.server.authorization.client.RegisteredClient; +import org.springframework.security.oauth2.server.authorization.client.RegisteredClientRepository; +import org.springframework.security.oauth2.server.authorization.settings.ClientSettings; +import org.springframework.security.oauth2.server.authorization.settings.OAuth2TokenFormat; +import org.springframework.security.oauth2.server.authorization.settings.TokenSettings; + +import java.time.Duration; +import java.util.Arrays; +import java.util.Map; +import java.util.Optional; + +/** + * 查询客户端相关信息实现 + * + * @author lengleng + * @date 2022/5/29 + */ +@RequiredArgsConstructor +public class PigxRemoteRegisteredClientRepository implements RegisteredClientRepository { + + /** + * 刷新令牌有效期默认 30 天 + */ + private final static int refreshTokenValiditySeconds = 60 * 60 * 24 * 30; + + /** + * 请求令牌有效期默认 12 小时 + */ + private final static int accessTokenValiditySeconds = 60 * 60 * 12; + + private final RemoteClientDetailsService clientDetailsService; + + /** + * Saves the registered client. + * + *

+ * IMPORTANT: Sensitive information should be encoded externally from the + * implementation, e.g. {@link RegisteredClient#getClientSecret()} + * @param registeredClient the {@link RegisteredClient} + */ + @Override + public void save(RegisteredClient registeredClient) { + } + + /** + * Returns the registered client identified by the provided {@code id}, or + * {@code null} if not found. + * @param id the registration identifier + * @return the {@link RegisteredClient} if found, otherwise {@code null} + */ + @Override + public RegisteredClient findById(String id) { + throw new UnsupportedOperationException(); + } + + /** + * Returns the registered client identified by the provided {@code clientId}, or + * {@code null} if not found. + * @param clientId the client identifier + * @return the {@link RegisteredClient} if found, otherwise {@code null} + */ + + /** + * 重写原生方法支持redis缓存 + * @param clientId + * @return + */ + @Override + @SneakyThrows + @Cacheable(value = CacheConstants.CLIENT_DETAILS_KEY, key = "#clientId", unless = "#result == null") + public RegisteredClient findByClientId(String clientId) { + + SysOauthClientDetails clientDetails = RetOps + .of(clientDetailsService.getClientDetailsById(clientId, SecurityConstants.FROM_IN)).getData() + .orElseThrow(() -> new OAuth2AuthorizationCodeRequestAuthenticationException( + new OAuth2Error("客户端查询异常,请检查数据库链接"), null)); + + RegisteredClient.Builder builder = RegisteredClient.withId(clientDetails.getClientId()) + .clientId(clientDetails.getClientId()) + .clientSecret(SecurityConstants.NOOP + clientDetails.getClientSecret()) + .clientAuthenticationMethods(clientAuthenticationMethods -> { + clientAuthenticationMethods.add(ClientAuthenticationMethod.CLIENT_SECRET_BASIC); + clientAuthenticationMethods.add(ClientAuthenticationMethod.CLIENT_SECRET_POST); + }); + // 授权模式 + Arrays.stream(clientDetails.getAuthorizedGrantTypes()) + .forEach(grant -> builder.authorizationGrantType(new AuthorizationGrantType(grant))); + + // 回调地址 + Optional.ofNullable(clientDetails.getWebServerRedirectUri()).ifPresent(redirectUri -> Arrays + .stream(redirectUri.split(StrUtil.COMMA)).filter(StrUtil::isNotBlank).forEach(builder::redirectUri)); + + // scope + Optional.ofNullable(clientDetails.getScope()).ifPresent( + scope -> Arrays.stream(scope.split(StrUtil.COMMA)).filter(StrUtil::isNotBlank).forEach(builder::scope)); + + // 注入扩展配置 + Optional.ofNullable(clientDetails.getAdditionalInformation()).ifPresent(ext -> { + Map map = JSONUtil.parseObj(ext).toBean(Map.class); + builder.clientSettings(ClientSettings.withSettings(map).requireProofKey(false) + .requireAuthorizationConsent(!BooleanUtil.toBoolean(clientDetails.getAutoapprove())).build()); + }); + + return builder + .tokenSettings(TokenSettings.builder().accessTokenFormat(OAuth2TokenFormat.REFERENCE) + .accessTokenTimeToLive(Duration.ofSeconds(Optional + .ofNullable(clientDetails.getAccessTokenValidity()).orElse(accessTokenValiditySeconds))) + .refreshTokenTimeToLive( + Duration.ofSeconds(Optional.ofNullable(clientDetails.getRefreshTokenValidity()) + .orElse(refreshTokenValiditySeconds))) + .build()) + + .build(); + + } + +} diff --git a/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/service/PigxTocDefaultUserDetailsServiceImpl.java b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/service/PigxTocDefaultUserDetailsServiceImpl.java new file mode 100644 index 0000000..d5fb959 --- /dev/null +++ b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/service/PigxTocDefaultUserDetailsServiceImpl.java @@ -0,0 +1,134 @@ +/* + * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.pig4cloud.pigx.common.security.service; + +import cn.hutool.core.util.ArrayUtil; +import com.pig4cloud.pigx.app.api.dto.AppUserInfo; +import com.pig4cloud.pigx.app.api.entity.AppUser; +import com.pig4cloud.pigx.app.api.feign.RemoteAppUserService; +import com.pig4cloud.pigx.common.core.constant.CacheConstants; +import com.pig4cloud.pigx.common.core.constant.CommonConstants; +import com.pig4cloud.pigx.common.core.constant.SecurityConstants; +import com.pig4cloud.pigx.common.core.constant.enums.UserTypeEnum; +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.common.core.util.RetOps; +import com.pig4cloud.pigx.common.core.util.WebUtils; +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.springframework.cache.Cache; +import org.springframework.cache.CacheManager; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.AuthorityUtils; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UsernameNotFoundException; + +import java.util.Arrays; +import java.util.Collection; +import java.util.HashSet; +import java.util.Set; + +/** + * 用户详细信息 + * + * @author lengleng hccake + */ +@Slf4j +@RequiredArgsConstructor +public class PigxTocDefaultUserDetailsServiceImpl implements PigxUserDetailsService { + + private final CacheManager cacheManager; + + private final RemoteAppUserService remoteAppUserService; + + /** + * 用户密码登录 + * @param username 用户密码登录 + * @return + */ + @Override + @SneakyThrows + public UserDetails loadUserByUsername(String username) { + Cache cache = cacheManager.getCache(CacheConstants.USER_DETAILS_MINI); + if (cache != null && cache.get(username) != null) { + return cache.get(username, PigxUser.class); + } + R info = remoteAppUserService.info(username, SecurityConstants.FROM_IN); + UserDetails userDetailsAppUser = this.getUserDetailsAppUser(info); + if (cache != null) { + cache.put(username, userDetailsAppUser); + } + return userDetailsAppUser; + } + + @Override + public UserDetails loadUserByUser(PigxUser pigxUser) { + return pigxUser; + } + + UserDetails getUserDetailsAppUser(R result) { + // @formatter:off + return RetOps.of(result) + .getData() + .map(this::convertUserDetailsAppUser) + .orElseThrow(() -> new UsernameNotFoundException("用户不存在")); + // @formatter:on + } + + /** + * UserInfo 转 UserDetails + * @param info + * @return 返回UserDetails对象 + */ + UserDetails convertUserDetailsAppUser(AppUserInfo info) { + Set dbAuthsSet = new HashSet<>(); + if (ArrayUtil.isNotEmpty(info.getRoles())) { + // 获取角色 + Arrays.stream(info.getRoles()).forEach(roleId -> dbAuthsSet.add(SecurityConstants.ROLE + roleId)); + // 获取资源 + dbAuthsSet.addAll(Arrays.asList(info.getPermissions())); + + } + Collection authorities = AuthorityUtils + .createAuthorityList(dbAuthsSet.toArray(new String[0])); + AppUser user = info.getAppUser(); + // 构造security用户 + + return new PigxUser(user.getUserId(), user.getUsername(), null, user.getPhone(), user.getAvatar(), + user.getNickname(), user.getName(), user.getEmail(), user.getTenantId(), + SecurityConstants.BCRYPT + user.getPassword(), true, true, UserTypeEnum.TOC.getStatus(), true, + !CommonConstants.STATUS_LOCK.equals(user.getLockFlag()), authorities); + } + + @Override + public int getOrder() { + return 10; + } + + /** + * 支持所有的 mobile 类型 + * @param clientId 目标客户端 + * @param grantType 授权类型 + * @return true/false + */ + @Override + public boolean support(String clientId, String grantType) { + String header = WebUtils.getRequest().getHeader(SecurityConstants.HEADER_TOC); + return SecurityConstants.HEADER_TOC_YES.equals(header); + } + +} diff --git a/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/service/PigxTocMobileUserDetailsServiceImpl.java b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/service/PigxTocMobileUserDetailsServiceImpl.java new file mode 100644 index 0000000..e5068f9 --- /dev/null +++ b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/service/PigxTocMobileUserDetailsServiceImpl.java @@ -0,0 +1,118 @@ +/* + * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.pig4cloud.pigx.common.security.service; + +import cn.hutool.core.util.ArrayUtil; +import com.pig4cloud.pigx.app.api.dto.AppUserInfo; +import com.pig4cloud.pigx.app.api.entity.AppUser; +import com.pig4cloud.pigx.app.api.feign.RemoteAppUserService; +import com.pig4cloud.pigx.common.core.constant.CommonConstants; +import com.pig4cloud.pigx.common.core.constant.SecurityConstants; +import com.pig4cloud.pigx.common.core.constant.enums.UserTypeEnum; +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.common.core.util.RetOps; +import com.pig4cloud.pigx.common.core.util.WebUtils; +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.AuthorityUtils; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UsernameNotFoundException; + +import java.util.Arrays; +import java.util.Collection; +import java.util.HashSet; +import java.util.Set; + +/** + * 用户详细信息 + * + * @author lengleng hccake + */ +@Slf4j +@RequiredArgsConstructor +public class PigxTocMobileUserDetailsServiceImpl implements PigxUserDetailsService { + + private final RemoteAppUserService remoteAppUserService; + + /** + * 用户密码登录 + * @param phone 用户密码登录 + * @return + */ + @Override + @SneakyThrows + public UserDetails loadUserByUsername(String phone) { + R info = remoteAppUserService.social(phone, SecurityConstants.FROM_IN); + return this.getUserDetailsAppUser(info); + } + + @Override + public UserDetails loadUserByUser(PigxUser pigxUser) { + return pigxUser; + } + + UserDetails getUserDetailsAppUser(R result) { + // @formatter:off + return RetOps.of(result).getData().map(this::convertUserDetailsAppUser).orElseThrow(() -> new UsernameNotFoundException("用户不存在")); + // @formatter:on + } + + /** + * UserInfo 转 UserDetails + * @param info + * @return 返回UserDetails对象 + */ + UserDetails convertUserDetailsAppUser(AppUserInfo info) { + Set dbAuthsSet = new HashSet<>(); + if (ArrayUtil.isNotEmpty(info.getRoles())) { + // 获取角色 + Arrays.stream(info.getRoles()).forEach(roleId -> dbAuthsSet.add(SecurityConstants.ROLE + roleId)); + // 获取资源 + dbAuthsSet.addAll(Arrays.asList(info.getPermissions())); + + } + Collection authorities = AuthorityUtils + .createAuthorityList(dbAuthsSet.toArray(new String[0])); + AppUser user = info.getAppUser(); + // 构造security用户 + + return new PigxUser(user.getUserId(), user.getUsername(), null, user.getPhone(), user.getAvatar(), + user.getNickname(), user.getName(), user.getEmail(), user.getTenantId(), + SecurityConstants.BCRYPT + user.getPassword(), true, true, UserTypeEnum.TOC.getStatus(), true, + !CommonConstants.STATUS_LOCK.equals(user.getLockFlag()), authorities); + } + + @Override + public int getOrder() { + return 15; + } + + /** + * 支持所有的 mobile 类型 + * @param clientId 目标客户端 + * @param grantType 授权类型 + * @return true/false + */ + @Override + public boolean support(String clientId, String grantType) { + String header = WebUtils.getRequest().getHeader(SecurityConstants.HEADER_TOC); + return SecurityConstants.HEADER_TOC_YES.equals(header) && SecurityConstants.GRANT_MOBILE.equals(grantType); + } + +} diff --git a/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/service/PigxUser.java b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/service/PigxUser.java new file mode 100644 index 0000000..e4a8fc3 --- /dev/null +++ b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/service/PigxUser.java @@ -0,0 +1,147 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.common.security.service; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Getter; +import org.springframework.security.authentication.dao.DaoAuthenticationProvider; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.SpringSecurityCoreVersion; +import org.springframework.security.core.userdetails.User; +import org.springframework.security.oauth2.core.OAuth2AuthenticatedPrincipal; + +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; + +/** + * @author lengleng + * @date 2020/4/16 扩展用户信息 + */ +public class PigxUser extends User implements OAuth2AuthenticatedPrincipal { + + private static final long serialVersionUID = SpringSecurityCoreVersion.SERIAL_VERSION_UID; + + /** + * 扩展属性,方便存放oauth 上下文相关信息 + */ + private final Map attributes = new HashMap<>(); + + /** + * 用户ID + */ + @Getter + private Long id; + + /** + * 部门ID + */ + @Getter + private Long deptId; + + /** + * 手机号 + */ + @Getter + private String phone; + + /** + * 头像 + */ + @Getter + private String avatar; + + /** + * 租户ID + */ + @Getter + private Long tenantId; + + /** + * 拓展字段:昵称 + */ + @Getter + private String nickname; + + /** + * 拓展字段:姓名 + */ + @Getter + private String name; + + /** + * 拓展字段:邮箱 + */ + @Getter + private String email; + + @Getter + private String userType; + + /** + * Construct the User with the details required by + * {@link DaoAuthenticationProvider}. + * @param id 用户ID + * @param deptId 部门ID + * @param tenantId 租户ID + * @param nickname 昵称 + * @param name 姓名 + * @param email 邮箱 the username presented to the + * DaoAuthenticationProvider + * @param password the password that should be presented to the + * DaoAuthenticationProvider + * @param enabled set to true if the user is enabled + * @param accountNonExpired set to true if the account has not expired + * @param credentialsNonExpired set to true if the credentials have not + * expired + * @param accountNonLocked set to true if the account is not locked + * @param authorities the authorities that should be granted to the caller if they + * presented the correct username and password and the user is enabled. Not null. + * @throws IllegalArgumentException if a null value was passed either as + * a parameter or as an element in the GrantedAuthority collection + */ + @JsonCreator + public PigxUser(@JsonProperty("id") Long id, @JsonProperty("username") String username, + @JsonProperty("deptId") Long deptId, @JsonProperty("phone") String phone, + @JsonProperty("avatar") String avatar, @JsonProperty("nickname") String nickname, + @JsonProperty("name") String name, @JsonProperty("email") String email, + @JsonProperty("tenantId") Long tenantId, @JsonProperty("password") String password, + @JsonProperty("enabled") boolean enabled, @JsonProperty("accountNonExpired") boolean accountNonExpired, + @JsonProperty("userType") String userType, + @JsonProperty("credentialsNonExpired") boolean credentialsNonExpired, + @JsonProperty("accountNonLocked") boolean accountNonLocked, + @JsonProperty("authorities") Collection authorities) { + super(username, password, enabled, accountNonExpired, credentialsNonExpired, accountNonLocked, authorities); + this.id = id; + this.deptId = deptId; + this.phone = phone; + this.avatar = avatar; + this.tenantId = tenantId; + this.nickname = nickname; + this.name = name; + this.email = email; + this.userType = userType; + } + + @Override + public Map getAttributes() { + return this.attributes; + } + +} diff --git a/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/service/PigxUserDetailsService.java b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/service/PigxUserDetailsService.java new file mode 100644 index 0000000..4f0c23f --- /dev/null +++ b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/service/PigxUserDetailsService.java @@ -0,0 +1,112 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ +package com.pig4cloud.pigx.common.security.service; + +import cn.hutool.core.util.ArrayUtil; +import com.pig4cloud.pigx.admin.api.dto.UserInfo; +import com.pig4cloud.pigx.admin.api.entity.SysUser; +import com.pig4cloud.pigx.common.core.constant.CommonConstants; +import com.pig4cloud.pigx.common.core.constant.SecurityConstants; +import com.pig4cloud.pigx.common.core.constant.enums.UserTypeEnum; +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.common.core.util.RetOps; +import org.springframework.core.Ordered; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.AuthorityUtils; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.core.userdetails.UsernameNotFoundException; + +import java.util.Arrays; +import java.util.Collection; +import java.util.HashSet; +import java.util.Set; + +/** + * @author lengleng + * @date 2018/8/15 + */ +public interface PigxUserDetailsService extends UserDetailsService, Ordered { + + /** + * 是否支持此客户端校验 + * @param clientId 请求客户端 + * @param grantType 授权类型 + * @return true/false + */ + default boolean support(String clientId, String grantType) { + return true; + } + + /** + * 排序值 默认取最大的 + * @return 排序值 + */ + default int getOrder() { + return 0; + } + + /** + * 构建userdetails + * @param result 用户信息 + * @return UserDetails + * @throws UsernameNotFoundException + */ + default UserDetails getUserDetails(R result) { + // @formatter:off + return RetOps.of(result) + .getData() + .map(this::convertUserDetails) + .orElseThrow(() -> new UsernameNotFoundException("用户不存在")); + // @formatter:on + } + + /** + * UserInfo 转 UserDetails + * @param info + * @return 返回UserDetails对象 + */ + default UserDetails convertUserDetails(UserInfo info) { + Set dbAuthsSet = new HashSet<>(); + if (ArrayUtil.isNotEmpty(info.getRoles())) { + // 获取角色 + Arrays.stream(info.getRoles()).forEach(roleId -> dbAuthsSet.add(SecurityConstants.ROLE + roleId)); + // 获取资源 + dbAuthsSet.addAll(Arrays.asList(info.getPermissions())); + + } + Collection authorities = AuthorityUtils + .createAuthorityList(dbAuthsSet.toArray(new String[0])); + SysUser user = info.getSysUser(); + // 构造security用户 + + return new PigxUser(user.getUserId(), user.getUsername(), user.getDeptId(), user.getPhone(), user.getAvatar(), + user.getNickname(), user.getName(), user.getEmail(), user.getTenantId(), + SecurityConstants.BCRYPT + user.getPassword(), true, true, UserTypeEnum.TOB.getStatus(), true, + !CommonConstants.STATUS_LOCK.equals(user.getLockFlag()), authorities); + } + + /** + * 通过用户实体查询 + * @param pigxUser user + * @return + */ + default UserDetails loadUserByUser(PigxUser pigxUser) { + return this.loadUserByUsername(pigxUser.getUsername()); + } + +} diff --git a/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/util/AuthUtils.java b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/util/AuthUtils.java new file mode 100644 index 0000000..c2e45b5 --- /dev/null +++ b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/util/AuthUtils.java @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.common.security.util; + +import cn.hutool.core.codec.Base64; +import lombok.SneakyThrows; +import lombok.experimental.UtilityClass; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.HttpHeaders; + +import javax.servlet.http.HttpServletRequest; +import java.nio.charset.StandardCharsets; + +/** + * @author lengleng + * @date 2018/5/13 认证授权相关工具类 + */ +@Slf4j +@UtilityClass +public class AuthUtils { + + private final String BASIC_ = "Basic "; + + /** + * 从header 请求中的clientId/clientsecect + * @param header header中的参数 + * @throws RuntimeException if the Basic header is not present or is not valid Base64 + */ + @SneakyThrows + public String[] extractAndDecodeHeader(String header) { + + byte[] base64Token = header.substring(6).getBytes("UTF-8"); + byte[] decoded; + try { + decoded = Base64.decode(base64Token); + } + catch (IllegalArgumentException e) { + throw new RuntimeException("Failed to decode basic authentication token"); + } + + String token = new String(decoded, StandardCharsets.UTF_8); + + int delim = token.indexOf(":"); + + if (delim == -1) { + throw new RuntimeException("Invalid basic authentication token"); + } + return new String[] { token.substring(0, delim), token.substring(delim + 1) }; + } + + /** + * *从header 请求中的clientId/clientsecect + * @param request + * @return + */ + @SneakyThrows + public String[] extractAndDecodeHeader(HttpServletRequest request) { + String header = request.getHeader(HttpHeaders.AUTHORIZATION); + + if (header == null || !header.startsWith(BASIC_)) { + throw new RuntimeException("请求头中client信息为空"); + } + + return extractAndDecodeHeader(header); + } + +} diff --git a/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/util/OAuth2EndpointUtils.java b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/util/OAuth2EndpointUtils.java new file mode 100644 index 0000000..ed84013 --- /dev/null +++ b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/util/OAuth2EndpointUtils.java @@ -0,0 +1,78 @@ +package com.pig4cloud.pigx.common.security.util; + +import cn.hutool.core.map.MapUtil; +import lombok.experimental.UtilityClass; +import org.springframework.security.oauth2.core.*; +import org.springframework.security.oauth2.core.endpoint.OAuth2AccessTokenResponse; +import org.springframework.security.oauth2.core.endpoint.OAuth2ParameterNames; +import org.springframework.security.oauth2.core.endpoint.PkceParameterNames; +import org.springframework.security.oauth2.server.authorization.OAuth2Authorization; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; + +import javax.servlet.http.HttpServletRequest; +import java.io.IOException; +import java.time.temporal.ChronoUnit; +import java.util.Map; + +/** + * @author jumuning + * @description OAuth2 端点工具 + */ +@UtilityClass +public class OAuth2EndpointUtils { + + public final String ACCESS_TOKEN_REQUEST_ERROR_URI = "https://datatracker.ietf.org/doc/html/rfc6749#section-5.2"; + + public MultiValueMap getParameters(HttpServletRequest request) { + Map parameterMap = request.getParameterMap(); + MultiValueMap parameters = new LinkedMultiValueMap<>(parameterMap.size()); + parameterMap.forEach((key, values) -> { + for (String value : values) { + parameters.add(key, value); + } + }); + return parameters; + } + + public boolean matchesPkceTokenRequest(HttpServletRequest request) { + return AuthorizationGrantType.AUTHORIZATION_CODE.getValue() + .equals(request.getParameter(OAuth2ParameterNames.GRANT_TYPE)) + && request.getParameter(OAuth2ParameterNames.CODE) != null + && request.getParameter(PkceParameterNames.CODE_VERIFIER) != null; + } + + public void throwError(String errorCode, String parameterName, String errorUri) { + OAuth2Error error = new OAuth2Error(errorCode, "OAuth 2.0 Parameter: " + parameterName, errorUri); + throw new OAuth2AuthenticationException(error); + } + + /** + * 格式化输出token 信息 + * @param authentication 用户认证信息 + * @param claims 扩展信息 + * @return + * @throws IOException + */ + public OAuth2AccessTokenResponse sendAccessTokenResponse(OAuth2Authorization authentication, + Map claims) { + + OAuth2AccessToken accessToken = authentication.getAccessToken().getToken(); + OAuth2RefreshToken refreshToken = authentication.getRefreshToken().getToken(); + + OAuth2AccessTokenResponse.Builder builder = OAuth2AccessTokenResponse.withToken(accessToken.getTokenValue()) + .tokenType(accessToken.getTokenType()).scopes(accessToken.getScopes()); + if (accessToken.getIssuedAt() != null && accessToken.getExpiresAt() != null) { + builder.expiresIn(ChronoUnit.SECONDS.between(accessToken.getIssuedAt(), accessToken.getExpiresAt())); + } + if (refreshToken != null) { + builder.refreshToken(refreshToken.getTokenValue()); + } + + if (MapUtil.isNotEmpty(claims)) { + builder.additionalParameters(claims); + } + return builder.build(); + } + +} diff --git a/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/util/OAuth2ErrorCodesExpand.java b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/util/OAuth2ErrorCodesExpand.java new file mode 100644 index 0000000..5403ddf --- /dev/null +++ b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/util/OAuth2ErrorCodesExpand.java @@ -0,0 +1,43 @@ +package com.pig4cloud.pigx.common.security.util; + +/** + * @author jumuning + * @description OAuth2 异常信息 + */ +public interface OAuth2ErrorCodesExpand { + + /** 用户名未找到 */ + String USERNAME_NOT_FOUND = "username_not_found"; + + /** 错误凭证 */ + String BAD_CREDENTIALS = "bad_credentials"; + + /** 用户被锁 */ + String USER_LOCKED = "user_locked"; + + /** 用户禁用 */ + String USER_DISABLE = "user_disable"; + + /** 用户过期 */ + String USER_EXPIRED = "user_expired"; + + /** 证书过期 */ + String CREDENTIALS_EXPIRED = "credentials_expired"; + + /** scope 为空异常 */ + String SCOPE_IS_EMPTY = "scope_is_empty"; + + /** + * 令牌不存在 + */ + String TOKEN_MISSING = "token_missing"; + + /** 未知的登录异常 */ + String UN_KNOW_LOGIN_ERROR = "un_know_login_error"; + + /** + * 不合法的Token + */ + String INVALID_BEARER_TOKEN = "invalid_bearer_token"; + +} diff --git a/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/util/OAuthClientException.java b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/util/OAuthClientException.java new file mode 100644 index 0000000..5e60573 --- /dev/null +++ b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/util/OAuthClientException.java @@ -0,0 +1,29 @@ +package com.pig4cloud.pigx.common.security.util; + +import org.springframework.security.oauth2.core.OAuth2AuthenticationException; +import org.springframework.security.oauth2.core.OAuth2Error; + +/** + * @author lengleng + * @description OAuthClientException 异常信息 + */ +public class OAuthClientException extends OAuth2AuthenticationException { + + /** + * Constructs a ScopeException with the specified message. + * @param msg the detail message. + */ + public OAuthClientException(String msg) { + super(new OAuth2Error(msg), msg); + } + + /** + * Constructs a {@code ScopeException} with the specified message and root cause. + * @param msg the detail message. + * @param cause root cause + */ + public OAuthClientException(String msg, Throwable cause) { + super(new OAuth2Error(msg), cause); + } + +} diff --git a/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/util/PigxSecurityMessageSourceUtil.java b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/util/PigxSecurityMessageSourceUtil.java new file mode 100644 index 0000000..11a403b --- /dev/null +++ b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/util/PigxSecurityMessageSourceUtil.java @@ -0,0 +1,32 @@ +package com.pig4cloud.pigx.common.security.util; + +import org.springframework.context.support.MessageSourceAccessor; +import org.springframework.context.support.ReloadableResourceBundleMessageSource; + +import java.util.Locale; + +/** + * @author lengleng + * @date 2020/9/4 + *

+ * @see org.springframework.security.core.SpringSecurityMessageSource pigx 框架自身异常处理, + * 建议所有异常都使用此工具类型 避免无法复写 SpringSecurityMessageSource + */ +public class PigxSecurityMessageSourceUtil extends ReloadableResourceBundleMessageSource { + + // ~ Constructors + // =================================================================================================== + + public PigxSecurityMessageSourceUtil() { + setBasename("classpath:messages/messages"); + setDefaultLocale(Locale.CHINA); + } + + // ~ Methods + // ======================================================================================================== + + public static MessageSourceAccessor getAccessor() { + return new MessageSourceAccessor(new PigxSecurityMessageSourceUtil()); + } + +} \ No newline at end of file diff --git a/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/util/ScopeException.java b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/util/ScopeException.java new file mode 100644 index 0000000..13109eb --- /dev/null +++ b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/util/ScopeException.java @@ -0,0 +1,29 @@ +package com.pig4cloud.pigx.common.security.util; + +import org.springframework.security.oauth2.core.OAuth2AuthenticationException; +import org.springframework.security.oauth2.core.OAuth2Error; + +/** + * @author jumuning + * @description ScopeException 异常信息 + */ +public class ScopeException extends OAuth2AuthenticationException { + + /** + * Constructs a ScopeException with the specified message. + * @param msg the detail message. + */ + public ScopeException(String msg) { + super(new OAuth2Error(msg), msg); + } + + /** + * Constructs a {@code ScopeException} with the specified message and root cause. + * @param msg the detail message. + * @param cause root cause + */ + public ScopeException(String msg, Throwable cause) { + super(new OAuth2Error(msg), cause); + } + +} diff --git a/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/util/SecurityUtils.java b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/util/SecurityUtils.java new file mode 100644 index 0000000..a49b717 --- /dev/null +++ b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/util/SecurityUtils.java @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.common.security.util; + +import cn.hutool.core.util.StrUtil; +import com.pig4cloud.pigx.common.core.constant.SecurityConstants; +import com.pig4cloud.pigx.common.security.service.PigxUser; +import lombok.experimental.UtilityClass; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.context.SecurityContextHolder; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +/** + * 安全工具类 + * + * @author L.cm + */ +@UtilityClass +public class SecurityUtils { + + /** + * 获取Authentication + */ + public Authentication getAuthentication() { + return SecurityContextHolder.getContext().getAuthentication(); + } + + /** + * 获取用户 + * @param authentication + * @return PigxUser + *

+ */ + public PigxUser getUser(Authentication authentication) { + Object principal = authentication.getPrincipal(); + if (principal instanceof PigxUser) { + return (PigxUser) principal; + } + return null; + } + + /** + * 获取用户 + */ + public PigxUser getUser() { + Authentication authentication = getAuthentication(); + return getUser(authentication); + } + + /** + * 获取用户角色信息 + * @return 角色集合 + */ + public List getRoles() { + Authentication authentication = getAuthentication(); + Collection authorities = authentication.getAuthorities(); + + List roleIds = new ArrayList<>(); + authorities.stream().filter(granted -> StrUtil.startWith(granted.getAuthority(), SecurityConstants.ROLE)) + .forEach(granted -> { + String id = StrUtil.removePrefix(granted.getAuthority(), SecurityConstants.ROLE); + roleIds.add(Long.parseLong(id)); + }); + return roleIds; + } + +} diff --git a/pigx-common/pigx-common-security/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/pigx-common/pigx-common-security/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 0000000..d376727 --- /dev/null +++ b/pigx-common/pigx-common-security/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1,9 @@ +com.pig4cloud.pigx.common.security.service.PigxDefaultUserDetailsServiceImpl +com.pig4cloud.pigx.common.security.service.PigxTocDefaultUserDetailsServiceImpl +com.pig4cloud.pigx.common.security.service.PigxMobileUserDetailServiceImpl +com.pig4cloud.pigx.common.security.service.PigxTocMobileUserDetailsServiceImpl +com.pig4cloud.pigx.common.security.service.PigxRedisOAuth2AuthorizationService +com.pig4cloud.pigx.common.security.service.PigxRedisOAuth2AuthorizationConsentService +com.pig4cloud.pigx.common.security.component.PigxSecurityInnerAspect +com.pig4cloud.pigx.common.security.component.PigxSecurityMessageSourceConfiguration +com.pig4cloud.pigx.common.security.service.PigxRemoteRegisteredClientRepository diff --git a/pigx-common/pigx-common-security/src/main/resources/errors/messages_zh_CN.properties b/pigx-common/pigx-common-security/src/main/resources/errors/messages_zh_CN.properties new file mode 100644 index 0000000..e7a556b --- /dev/null +++ b/pigx-common/pigx-common-security/src/main/resources/errors/messages_zh_CN.properties @@ -0,0 +1,70 @@ +# +# Copyright (c) 2018-2025, lengleng All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# Neither the name of the pig4cloud.com developer nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# Author: lengleng (wangiegie@gmail.com) +# -------------------------------------- +# PIGX \u4E2D\u7684\u5F02\u5E38\u4FE1\u606F\u4F7F\u7528\u6B64\u6587\u4EF6\u5B9A\u4E49 +# +AbstractAccessDecisionManager.accessDenied=\u6743\u9650\u4E0D\u8DB3,\u4E0D\u5141\u8BB8\u8BBF\u95EE{0} +AbstractAccessDecisionManager.expireToken=token \u8FC7\u671F +AbstractLdapAuthenticationProvider.emptyPassword=\u5BC6\u7801\u4E0D\u80FD\u4E3A\u7A7A +AbstractSecurityInterceptor.authenticationNotFound=\u672A\u5728SecurityContext\u4E2D\u67E5\u627E\u5230\u8BA4\u8BC1\u5BF9\u8C61 +AbstractUserDetailsAuthenticationProvider.badCredentials=\u7528\u6237\u540D\u4E0D\u5B58\u5728\u6216\u8005\u5BC6\u7801\u9519\u8BEF +AbstractUserDetailsAuthenticationProvider.badClientCredentials=\u5BA2\u6237\u7AEF\u4FE1\u606F\u9519\u8BEF\uFF0CBasic\u8BA4\u8BC1\u5931\u8D25 +AbstractUserDetailsAuthenticationProvider.smsBadCredentials=\u7528\u6237\u4E0D\u5B58\u5728\uFF0C\u767B\u5F55\u5931\u8D25 +AbstractUserDetailsAuthenticationProvider.noopBindAccount=\u672A\u7ED1\u5B9A\u767B\u5F55\u8D26\u53F7 +AbstractUserDetailsAuthenticationProvider.credentialsExpired=\u7528\u6237\u51ED\u8BC1\u5DF2\u8FC7\u671F +OAuth2ResourceOwnerBaseAuthenticationProvider.tokenExpired=\u7528\u6237\u51ED\u8BC1\u5DF2\u8FC7\u671F +AbstractUserDetailsAuthenticationProvider.disabled=\u7528\u6237\u672A\u6FC0\u6D3B +AbstractUserDetailsAuthenticationProvider.expired=\u7528\u6237\u5E10\u53F7\u5DF2\u8FC7\u671F +AbstractUserDetailsAuthenticationProvider.locked=\u7528\u6237\u5E10\u53F7\u5DF2\u88AB\u9501\u5B9A +AbstractUserDetailsAuthenticationProvider.onlySupports=\u4EC5\u4EC5\u652F\u6301UsernamePasswordAuthenticationToken +AbstractUserDetailsAuthenticationProvider.badTenantId=\u65E0\u6548\u7684\u79DF\u6237\u7F16\u53F7:{0} +AccountStatusUserDetailsChecker.credentialsExpired=\u7528\u6237\u51ED\u8BC1\u5DF2\u8FC7\u671F +AccountStatusUserDetailsChecker.disabled=\u7528\u6237\u672A\u6FC0\u6D3B +AccountStatusUserDetailsChecker.expired=\u7528\u6237\u5E10\u53F7\u5DF2\u8FC7\u671F +AccountStatusUserDetailsChecker.locked=\u7528\u6237\u5E10\u53F7\u5DF2\u88AB\u9501\u5B9A +AclEntryAfterInvocationProvider.noPermission=\u7ED9\u5B9A\u7684Authentication\u5BF9\u8C61({0})\u6839\u672C\u65E0\u6743\u64CD\u63A7\u9886\u57DF\u5BF9\u8C61({1}) +AnonymousAuthenticationProvider.incorrectKey=\u5C55\u793A\u7684AnonymousAuthenticationToken\u4E0D\u542B\u6709\u9884\u671F\u7684key +BindAuthenticator.badCredentials=\u5BC6\u7801\u9519\u8BEF +BindAuthenticator.emptyPassword=\u5BC6\u7801\u4E0D\u80FD\u4E3A\u7A7A +CasAuthenticationProvider.incorrectKey=\u5C55\u793A\u7684CasAuthenticationToken\u4E0D\u542B\u6709\u9884\u671F\u7684key +CasAuthenticationProvider.noServiceTicket=\u672A\u80FD\u591F\u6B63\u786E\u63D0\u4F9B\u5F85\u9A8C\u8BC1\u7684CAS\u670D\u52A1\u7968\u6839 +ConcurrentSessionControlAuthenticationStrategy.exceededAllowed=\u5DF2\u7ECF\u8D85\u8FC7\u4E86\u5F53\u524D\u4E3B\u4F53({0})\u88AB\u5141\u8BB8\u7684\u6700\u5927\u4F1A\u8BDD\u6570\u91CF +DigestAuthenticationFilter.incorrectRealm=\u54CD\u5E94\u7ED3\u679C\u4E2D\u7684Realm\u540D\u5B57({0})\u540C\u7CFB\u7EDF\u6307\u5B9A\u7684Realm\u540D\u5B57({1})\u4E0D\u543B\u5408 +DigestAuthenticationFilter.incorrectResponse=\u9519\u8BEF\u7684\u54CD\u5E94\u7ED3\u679C +DigestAuthenticationFilter.missingAuth=\u9057\u6F0F\u4E86\u9488\u5BF9'auth' QOP\u7684\u3001\u5FC5\u987B\u7ED9\u5B9A\u7684\u6458\u8981\u53D6\u503C; \u63A5\u6536\u5230\u7684\u5934\u4FE1\u606F\u4E3A{0} +DigestAuthenticationFilter.missingMandatory=\u9057\u6F0F\u4E86\u5FC5\u987B\u7ED9\u5B9A\u7684\u6458\u8981\u53D6\u503C; \u63A5\u6536\u5230\u7684\u5934\u4FE1\u606F\u4E3A{0} +DigestAuthenticationFilter.nonceCompromised=Nonce\u4EE4\u724C\u5DF2\u7ECF\u5B58\u5728\u95EE\u9898\u4E86\uFF0C{0} +DigestAuthenticationFilter.nonceEncoding=Nonce\u672A\u7ECF\u8FC7Base64\u7F16\u7801; \u76F8\u5E94\u7684nonce\u53D6\u503C\u4E3A {0} +DigestAuthenticationFilter.nonceExpired=Nonce\u5DF2\u7ECF\u8FC7\u671F/\u8D85\u65F6 +DigestAuthenticationFilter.nonceNotNumeric=Nonce\u4EE4\u724C\u7684\u7B2C1\u90E8\u5206\u5E94\u8BE5\u662F\u6570\u5B57\uFF0C\u4F46\u7ED3\u679C\u5374\u662F{0} +DigestAuthenticationFilter.nonceNotTwoTokens=Nonce\u5E94\u8BE5\u7531\u4E24\u90E8\u5206\u53D6\u503C\u6784\u6210\uFF0C\u4F46\u7ED3\u679C\u5374\u662F{0} +DigestAuthenticationFilter.usernameNotFound=\u7528\u6237\u540D{0}\u672A\u627E\u5230 +JdbcDaoImpl.noAuthority=\u6CA1\u6709\u4E3A\u7528\u6237{0}\u6307\u5B9A\u89D2\u8272 +JdbcDaoImpl.notFound=\u672A\u627E\u5230\u7528\u6237{0} +LdapAuthenticationProvider.badCredentials=\u574F\u7684\u51ED\u8BC1 +LdapAuthenticationProvider.credentialsExpired=\u7528\u6237\u51ED\u8BC1\u5DF2\u8FC7\u671F +LdapAuthenticationProvider.disabled=\u7528\u6237\u672A\u6FC0\u6D3B +LdapAuthenticationProvider.expired=\u7528\u6237\u5E10\u53F7\u5DF2\u8FC7\u671F +LdapAuthenticationProvider.locked=\u7528\u6237\u5E10\u53F7\u5DF2\u88AB\u9501\u5B9A +LdapAuthenticationProvider.emptyUsername=\u7528\u6237\u540D\u4E0D\u5141\u8BB8\u4E3A\u7A7A +LdapAuthenticationProvider.onlySupports=\u4EC5\u4EC5\u652F\u6301UsernamePasswordAuthenticationToken +PasswordComparisonAuthenticator.badCredentials=\u574F\u7684\u51ED\u8BC1 +ProviderManager.providerNotFound=\u672A\u67E5\u627E\u5230\u9488\u5BF9{0}\u7684AuthenticationProvider +RememberMeAuthenticationProvider.incorrectKey=\u5C55\u793ARememberMeAuthenticationToken\u4E0D\u542B\u6709\u9884\u671F\u7684key +RunAsImplAuthenticationProvider.incorrectKey=\u5C55\u793A\u7684RunAsUserToken\u4E0D\u542B\u6709\u9884\u671F\u7684key +SubjectDnX509PrincipalExtractor.noMatching=\u672A\u5728subjectDN\: {0}\u4E2D\u627E\u5230\u5339\u914D\u7684\u6A21\u5F0F +SwitchUserFilter.noCurrentUser=\u4E0D\u5B58\u5728\u5F53\u524D\u7528\u6237 +SwitchUserFilter.noOriginalAuthentication=\u4E0D\u80FD\u591F\u67E5\u627E\u5230\u539F\u5148\u7684\u5DF2\u8BA4\u8BC1\u5BF9\u8C61 diff --git a/pigx-common/pigx-common-sentinel/pom.xml b/pigx-common/pigx-common-sentinel/pom.xml new file mode 100644 index 0000000..df3068d --- /dev/null +++ b/pigx-common/pigx-common-sentinel/pom.xml @@ -0,0 +1,40 @@ + + + + com.pig4cloud + pigx-common + 5.2.0 + + + 4.0.0 + jar + pigx-common-sentinel + sentinel服务降级熔断、限流组件 + + + com.pig4cloud + pigx-common-core + + + com.alibaba.cloud + spring-cloud-starter-alibaba-sentinel + + + + org.springframework.cloud + spring-cloud-starter-openfeign + + + + io.github.openfeign + feign-okhttp + + + + org.springframework.security + spring-security-core + + + diff --git a/pigx-common/pigx-common-sentinel/src/main/java/com/pig4cloud/pigx/common/sentinel/SentinelAutoConfiguration.java b/pigx-common/pigx-common-sentinel/src/main/java/com/pig4cloud/pigx/common/sentinel/SentinelAutoConfiguration.java new file mode 100644 index 0000000..002fbcb --- /dev/null +++ b/pigx-common/pigx-common-sentinel/src/main/java/com/pig4cloud/pigx/common/sentinel/SentinelAutoConfiguration.java @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.common.sentinel; + +import com.alibaba.cloud.sentinel.feign.SentinelFeignAutoConfiguration; +import com.alibaba.csp.sentinel.adapter.spring.webmvc.callback.BlockExceptionHandler; +import com.alibaba.csp.sentinel.adapter.spring.webmvc.callback.RequestOriginParser; +import com.pig4cloud.pigx.common.sentinel.feign.PigxSentinelFeign; +import com.pig4cloud.pigx.common.sentinel.handle.PigxUrlBlockHandler; +import com.pig4cloud.pigx.common.sentinel.parser.PigxHeaderRequestOriginParser; +import feign.Feign; +import org.springframework.boot.autoconfigure.AutoConfigureBefore; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Scope; + +/** + * @author lengleng + * @date 2020-02-12 + *

+ * sentinel 配置 + */ +@Configuration(proxyBeanMethods = false) +@AutoConfigureBefore(SentinelFeignAutoConfiguration.class) +public class SentinelAutoConfiguration { + + @Bean + @Scope("prototype") + @ConditionalOnMissingBean + @ConditionalOnProperty(name = "feign.sentinel.enabled") + public Feign.Builder feignSentinelBuilder() { + return PigxSentinelFeign.builder(); + } + + @Bean + @ConditionalOnMissingBean + public BlockExceptionHandler blockExceptionHandler() { + return new PigxUrlBlockHandler(); + } + + @Bean + @ConditionalOnMissingBean + public RequestOriginParser requestOriginParser() { + return new PigxHeaderRequestOriginParser(); + } + +} diff --git a/pigx-common/pigx-common-sentinel/src/main/java/com/pig4cloud/pigx/common/sentinel/feign/PigxSentinelFeign.java b/pigx-common/pigx-common-sentinel/src/main/java/com/pig4cloud/pigx/common/sentinel/feign/PigxSentinelFeign.java new file mode 100644 index 0000000..dfbaf03 --- /dev/null +++ b/pigx-common/pigx-common-sentinel/src/main/java/com/pig4cloud/pigx/common/sentinel/feign/PigxSentinelFeign.java @@ -0,0 +1,115 @@ +package com.pig4cloud.pigx.common.sentinel.feign; + +import com.alibaba.cloud.sentinel.feign.SentinelContractHolder; +import feign.Contract; +import feign.Feign; +import feign.InvocationHandlerFactory; +import feign.Target; +import org.springframework.beans.BeansException; +import org.springframework.cloud.openfeign.FallbackFactory; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.cloud.openfeign.FeignContext; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.core.annotation.AnnotationUtils; +import org.springframework.util.StringUtils; + +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; +import java.util.Map; + +/** + * 重写 {@link com.alibaba.cloud.sentinel.feign.SentinelFeign} 支持自动降级注入 + * + * @author lengleng + * @date 2020/6/9 + */ +public final class PigxSentinelFeign { + + private PigxSentinelFeign() { + + } + + public static PigxSentinelFeign.Builder builder() { + return new PigxSentinelFeign.Builder(); + } + + public static final class Builder extends Feign.Builder implements ApplicationContextAware { + + private Contract contract = new Contract.Default(); + + private ApplicationContext applicationContext; + + private FeignContext feignContext; + + @Override + public Feign.Builder invocationHandlerFactory(InvocationHandlerFactory invocationHandlerFactory) { + throw new UnsupportedOperationException(); + } + + @Override + public PigxSentinelFeign.Builder contract(Contract contract) { + this.contract = contract; + return this; + } + + @Override + public Feign build() { + super.invocationHandlerFactory(new InvocationHandlerFactory() { + @Override + public InvocationHandler create(Target target, Map dispatch) { + // 查找 FeignClient 上的 降级策略 + FeignClient feignClient = AnnotationUtils.findAnnotation(target.type(), FeignClient.class); + Class fallback = feignClient.fallback(); + Class fallbackFactory = feignClient.fallbackFactory(); + + String beanName = feignClient.contextId(); + if (!StringUtils.hasText(beanName)) { + beanName = feignClient.name(); + } + + Object fallbackInstance; + FallbackFactory fallbackFactoryInstance; + // check fallback and fallbackFactory properties + if (void.class != fallback) { + fallbackInstance = getFromContext(beanName, "fallback", fallback, target.type()); + return new PigxSentinelInvocationHandler(target, dispatch, + new FallbackFactory.Default(fallbackInstance)); + } + if (void.class != fallbackFactory) { + fallbackFactoryInstance = (FallbackFactory) getFromContext(beanName, "fallbackFactory", + fallbackFactory, FallbackFactory.class); + return new PigxSentinelInvocationHandler(target, dispatch, fallbackFactoryInstance); + } + return new PigxSentinelInvocationHandler(target, dispatch); + } + + private Object getFromContext(String name, String type, Class fallbackType, Class targetType) { + Object fallbackInstance = feignContext.getInstance(name, fallbackType); + if (fallbackInstance == null) { + throw new IllegalStateException(String.format( + "No %s instance of type %s found for feign client %s", type, fallbackType, name)); + } + + if (!targetType.isAssignableFrom(fallbackType)) { + throw new IllegalStateException(String.format( + "Incompatible %s instance. Fallback/fallbackFactory of type %s is not assignable to %s for feign client %s", + type, fallbackType, targetType, name)); + } + return fallbackInstance; + } + }); + + super.contract(new SentinelContractHolder(contract)); + return super.build(); + } + + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + this.applicationContext = applicationContext; + feignContext = this.applicationContext.getBean(FeignContext.class); + } + + } + +} diff --git a/pigx-common/pigx-common-sentinel/src/main/java/com/pig4cloud/pigx/common/sentinel/feign/PigxSentinelInvocationHandler.java b/pigx-common/pigx-common-sentinel/src/main/java/com/pig4cloud/pigx/common/sentinel/feign/PigxSentinelInvocationHandler.java new file mode 100644 index 0000000..0672781 --- /dev/null +++ b/pigx-common/pigx-common-sentinel/src/main/java/com/pig4cloud/pigx/common/sentinel/feign/PigxSentinelInvocationHandler.java @@ -0,0 +1,169 @@ +package com.pig4cloud.pigx.common.sentinel.feign; + +import com.alibaba.cloud.sentinel.feign.SentinelContractHolder; +import com.alibaba.cloud.sentinel.feign.SentinelInvocationHandler; +import com.alibaba.csp.sentinel.Entry; +import com.alibaba.csp.sentinel.EntryType; +import com.alibaba.csp.sentinel.SphU; +import com.alibaba.csp.sentinel.Tracer; +import com.alibaba.csp.sentinel.context.ContextUtil; +import com.alibaba.csp.sentinel.slots.block.BlockException; +import feign.Feign; +import feign.InvocationHandlerFactory; +import feign.MethodMetadata; +import feign.Target; +import lombok.extern.slf4j.Slf4j; +import org.springframework.cloud.openfeign.FallbackFactory; + +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; +import java.util.LinkedHashMap; +import java.util.Map; + +import static feign.Util.checkNotNull; + +/** + * 重写 {@link com.alibaba.cloud.sentinel.feign.SentinelInvocationHandler} 支持自动降级注入 + * + * @author lengleng + * @date 2020/6/9 + */ +@Slf4j +public class PigxSentinelInvocationHandler implements InvocationHandler { + + public static final String EQUALS = "equals"; + + public static final String HASH_CODE = "hashCode"; + + public static final String TO_STRING = "toString"; + + private final Target target; + + private final Map dispatch; + + private FallbackFactory fallbackFactory; + + private Map fallbackMethodMap; + + PigxSentinelInvocationHandler(Target target, Map dispatch, + FallbackFactory fallbackFactory) { + this.target = checkNotNull(target, "target"); + this.dispatch = checkNotNull(dispatch, "dispatch"); + this.fallbackFactory = fallbackFactory; + this.fallbackMethodMap = toFallbackMethod(dispatch); + } + + PigxSentinelInvocationHandler(Target target, Map dispatch) { + this.target = checkNotNull(target, "target"); + this.dispatch = checkNotNull(dispatch, "dispatch"); + } + + @Override + public Object invoke(final Object proxy, final Method method, final Object[] args) throws Throwable { + if (EQUALS.equals(method.getName())) { + try { + Object otherHandler = args.length > 0 && args[0] != null ? Proxy.getInvocationHandler(args[0]) : null; + return equals(otherHandler); + } + catch (IllegalArgumentException e) { + return false; + } + } + else if (HASH_CODE.equals(method.getName())) { + return hashCode(); + } + else if (TO_STRING.equals(method.getName())) { + return toString(); + } + + Object result; + InvocationHandlerFactory.MethodHandler methodHandler = this.dispatch.get(method); + // only handle by HardCodedTarget + if (target instanceof Target.HardCodedTarget) { + Target.HardCodedTarget hardCodedTarget = (Target.HardCodedTarget) target; + MethodMetadata methodMetadata = SentinelContractHolder.METADATA_MAP + .get(hardCodedTarget.type().getName() + Feign.configKey(hardCodedTarget.type(), method)); + // resource default is HttpMethod:protocol://url + if (methodMetadata == null) { + result = methodHandler.invoke(args); + } + else { + String resourceName = methodMetadata.template().method().toUpperCase() + ":" + hardCodedTarget.url() + + methodMetadata.template().path(); + Entry entry = null; + try { + ContextUtil.enter(resourceName); + entry = SphU.entry(resourceName, EntryType.OUT, 1, args); + result = methodHandler.invoke(args); + } + catch (Throwable ex) { + // fallback handle + if (!BlockException.isBlockException(ex)) { + Tracer.trace(ex); + } + if (fallbackFactory != null) { + try { + Object fallbackResult = fallbackMethodMap.get(method).invoke(fallbackFactory.create(ex), + args); + return fallbackResult; + } + catch (IllegalAccessException e) { + // shouldn't happen as method is public due to being an + // interface + throw new AssertionError(e); + } + catch (InvocationTargetException e) { + throw new AssertionError(e.getCause()); + } + } + else { + throw ex; + } + } + finally { + if (entry != null) { + entry.exit(1, args); + } + ContextUtil.exit(); + } + } + } + else { + // other target type using default strategy + result = methodHandler.invoke(args); + } + + return result; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof SentinelInvocationHandler) { + PigxSentinelInvocationHandler other = (PigxSentinelInvocationHandler) obj; + return target.equals(other.target); + } + return false; + } + + @Override + public int hashCode() { + return target.hashCode(); + } + + @Override + public String toString() { + return target.toString(); + } + + static Map toFallbackMethod(Map dispatch) { + Map result = new LinkedHashMap<>(); + for (Method method : dispatch.keySet()) { + method.setAccessible(true); + result.put(method, method); + } + return result; + } + +} diff --git a/pigx-common/pigx-common-sentinel/src/main/java/com/pig4cloud/pigx/common/sentinel/handle/GlobalBizExceptionHandler.java b/pigx-common/pigx-common-sentinel/src/main/java/com/pig4cloud/pigx/common/sentinel/handle/GlobalBizExceptionHandler.java new file mode 100644 index 0000000..a4fd3df --- /dev/null +++ b/pigx-common/pigx-common-sentinel/src/main/java/com/pig4cloud/pigx/common/sentinel/handle/GlobalBizExceptionHandler.java @@ -0,0 +1,112 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.common.sentinel.handle; + +import com.alibaba.csp.sentinel.Tracer; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.pig4cloud.pigx.common.core.util.R; +import feign.FeignException; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.HttpStatus; +import org.springframework.security.access.AccessDeniedException; +import org.springframework.validation.BindException; +import org.springframework.validation.FieldError; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * @author lengleng + * @date 2020-06-29 + */ +@Slf4j +@RestController +@RestControllerAdvice +public class GlobalBizExceptionHandler { + + private final ObjectMapper objectMapper = new ObjectMapper(); + + /** + * 全局异常. + * @param e the e + * @return R + */ + @ExceptionHandler(Exception.class) + @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) + public R handleGlobalException(Exception e) { + + log.error("全局异常信息 ex={}", e.getMessage(), e); + + // 业务异常交由 sentinel 记录 + Tracer.trace(e); + return R.failed(e.getLocalizedMessage()); + } + + @SneakyThrows + @ExceptionHandler(FeignException.class) + @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) + public R handleGlobalException(FeignException e) { + log.error("全局异常信息 ex={}", e.getMessage(), e); + + // 业务异常交由 sentinel 记录 + Tracer.trace(e); + + if (e.responseBody().isPresent()) { + return objectMapper.readValue(e.responseBody().get().array(), R.class); + } + + return R.failed(e.getLocalizedMessage()); + } + + /** + * AccessDeniedException + * @param e the e + * @return R + */ + @ExceptionHandler(AccessDeniedException.class) + @ResponseStatus(HttpStatus.FORBIDDEN) + public R handleAccessDeniedException(AccessDeniedException e) { + log.error("拒绝授权异常信息 ex={}", e.getMessage()); + return R.failed("权限不足,不允许访问"); + } + + /** + * validation Exception + * @param exception + * @return R + */ + @ExceptionHandler({ BindException.class }) + @ResponseStatus(HttpStatus.BAD_REQUEST) + public R handleBodyValidException(BindException exception) { + List fieldErrors = exception.getBindingResult().getFieldErrors(); + // 插入log 的逻辑 + return R.failed(String.format("%s %s", fieldErrors.get(0).getField(), fieldErrors.get(0).getDefaultMessage())); + } + + /** + * 避免 404 重定向到 /error 导致NPE ,ignore-url 需要配置对应端点 + * @return R + */ + @DeleteMapping("/error") + @ResponseStatus(HttpStatus.NOT_FOUND) + public R noHandlerFoundException() { + return R.failed(HttpStatus.NOT_FOUND.getReasonPhrase()); + } + +} diff --git a/pigx-common/pigx-common-sentinel/src/main/java/com/pig4cloud/pigx/common/sentinel/handle/PigxUrlBlockHandler.java b/pigx-common/pigx-common-sentinel/src/main/java/com/pig4cloud/pigx/common/sentinel/handle/PigxUrlBlockHandler.java new file mode 100644 index 0000000..e80b2e2 --- /dev/null +++ b/pigx-common/pigx-common-sentinel/src/main/java/com/pig4cloud/pigx/common/sentinel/handle/PigxUrlBlockHandler.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.common.sentinel.handle; + +import cn.hutool.json.JSONUtil; +import com.alibaba.csp.sentinel.adapter.spring.webmvc.callback.BlockExceptionHandler; +import com.alibaba.csp.sentinel.slots.block.BlockException; +import com.pig4cloud.pigx.common.core.util.R; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.HttpStatus; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * @author lengleng + * @date 2019-10-11 + *

+ * 降级 限流策略 + */ +@Slf4j +public class PigxUrlBlockHandler implements BlockExceptionHandler { + + @Override + public void handle(HttpServletRequest request, HttpServletResponse response, BlockException e) throws Exception { + log.error("sentinel 降级 资源名称{}", e.getRule().getResource(), e); + response.setContentType("application/json"); + response.setStatus(HttpStatus.TOO_MANY_REQUESTS.value()); + response.getWriter().print(JSONUtil.toJsonStr(R.failed(e.getMessage()))); + } + +} diff --git a/pigx-common/pigx-common-sentinel/src/main/java/com/pig4cloud/pigx/common/sentinel/parser/PigxHeaderRequestOriginParser.java b/pigx-common/pigx-common-sentinel/src/main/java/com/pig4cloud/pigx/common/sentinel/parser/PigxHeaderRequestOriginParser.java new file mode 100644 index 0000000..2ed3ca5 --- /dev/null +++ b/pigx-common/pigx-common-sentinel/src/main/java/com/pig4cloud/pigx/common/sentinel/parser/PigxHeaderRequestOriginParser.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.common.sentinel.parser; + +import com.alibaba.csp.sentinel.adapter.spring.webmvc.callback.RequestOriginParser; + +import javax.servlet.http.HttpServletRequest; + +/** + * @author lengleng + * @date 2019-10-11 + *

+ * sentinel 请求头解析判断 + */ +public class PigxHeaderRequestOriginParser implements RequestOriginParser { + + /** + * 请求头获取allow + */ + private static final String ALLOW = "Allow"; + + /** + * Parse the origin from given HTTP request. + * @param request HTTP request + * @return parsed origin + */ + @Override + public String parseOrigin(HttpServletRequest request) { + return request.getHeader(ALLOW); + } + +} diff --git a/pigx-common/pigx-common-sentinel/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/pigx-common/pigx-common-sentinel/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 0000000..43dcb88 --- /dev/null +++ b/pigx-common/pigx-common-sentinel/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1,2 @@ +com.pig4cloud.pigx.common.sentinel.SentinelAutoConfiguration +com.pig4cloud.pigx.common.sentinel.handle.GlobalBizExceptionHandler diff --git a/pigx-common/pigx-common-sequence/pom.xml b/pigx-common/pigx-common-sequence/pom.xml new file mode 100644 index 0000000..8e8f59f --- /dev/null +++ b/pigx-common/pigx-common-sequence/pom.xml @@ -0,0 +1,32 @@ + + + 4.0.0 + + com.pig4cloud + pigx-common + 5.2.0 + + + pigx-common-sequence + jar + + pigx 分布式发号器 + + + + redis.clients + jedis + + + com.pig4cloud + pigx-common-core + + + + com.baomidou + mybatis-plus-extension + + + diff --git a/pigx-common/pigx-common-sequence/src/main/java/com/pig4cloud/pigx/common/sequence/SequenceAutoConfiguration.java b/pigx-common/pigx-common-sequence/src/main/java/com/pig4cloud/pigx/common/sequence/SequenceAutoConfiguration.java new file mode 100644 index 0000000..739634c --- /dev/null +++ b/pigx-common/pigx-common-sequence/src/main/java/com/pig4cloud/pigx/common/sequence/SequenceAutoConfiguration.java @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.common.sequence; + +import com.pig4cloud.pigx.common.sequence.builder.SnowflakeSeqBuilder; +import com.pig4cloud.pigx.common.sequence.properties.SequenceSnowflakeProperties; +import com.pig4cloud.pigx.common.sequence.sequence.Sequence; +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; + +/** + * @author lengleng + * @date 2019-05-26 + */ +@Configuration +@ComponentScan("com.pig4cloud.pigx.common.sequence") +@ConditionalOnMissingBean(Sequence.class) +public class SequenceAutoConfiguration { + + /** + * snowflak 算法作为发号器实现 + * @param properties + * @return + */ + @Bean + @ConditionalOnBean(SequenceSnowflakeProperties.class) + public Sequence snowflakeSequence(SequenceSnowflakeProperties properties) { + return SnowflakeSeqBuilder.create().datacenterId(properties.getDatacenterId()) + .workerId(properties.getWorkerId()).build(); + } + +} \ No newline at end of file diff --git a/pigx-common/pigx-common-sequence/src/main/java/com/pig4cloud/pigx/common/sequence/builder/DbSeqBuilder.java b/pigx-common/pigx-common-sequence/src/main/java/com/pig4cloud/pigx/common/sequence/builder/DbSeqBuilder.java new file mode 100644 index 0000000..594504d --- /dev/null +++ b/pigx-common/pigx-common-sequence/src/main/java/com/pig4cloud/pigx/common/sequence/builder/DbSeqBuilder.java @@ -0,0 +1,99 @@ +package com.pig4cloud.pigx.common.sequence.builder; + +import com.pig4cloud.pigx.common.sequence.range.BizName; +import com.pig4cloud.pigx.common.sequence.range.impl.db.DbSeqRangeMgr; +import com.pig4cloud.pigx.common.sequence.sequence.Sequence; +import com.pig4cloud.pigx.common.sequence.sequence.impl.DefaultRangeSequence; + +import javax.sql.DataSource; + +/** + * 基于DB取步长,序列号生成器构建者 + * + * @author xuan + */ +public class DbSeqBuilder implements SeqBuilder { + + /** + * 数据库数据源[必选] + */ + private DataSource dataSource; + + /** + * 业务名称[必选] + */ + private BizName bizName; + + /** + * 存放序列号步长的表[可选:默认:sequence] + */ + private String tableName = "sequence"; + + /** + * 并发是数据使用了乐观策略,这个是失败重试的次数[可选:默认:100] + */ + private int retryTimes = 100; + + /** + * 获取range步长[可选:默认:1000] + */ + private int step = 1000; + + /** + * 序列号分配起始值[可选:默认:0] + */ + private long stepStart = 0; + + public static DbSeqBuilder create() { + DbSeqBuilder builder = new DbSeqBuilder(); + return builder; + } + + @Override + public Sequence build() { + // 利用DB获取区间管理器 + DbSeqRangeMgr dbSeqRangeMgr = new DbSeqRangeMgr(); + dbSeqRangeMgr.setDataSource(this.dataSource); + dbSeqRangeMgr.setTableName(this.tableName); + dbSeqRangeMgr.setRetryTimes(this.retryTimes); + dbSeqRangeMgr.setStep(this.step); + dbSeqRangeMgr.setStepStart(stepStart); + dbSeqRangeMgr.init(); + // 构建序列号生成器 + DefaultRangeSequence sequence = new DefaultRangeSequence(); + sequence.setName(this.bizName); + sequence.setSeqRangeMgr(dbSeqRangeMgr); + return sequence; + } + + public DbSeqBuilder dataSource(DataSource dataSource) { + this.dataSource = dataSource; + return this; + } + + public DbSeqBuilder tableName(String tableName) { + this.tableName = tableName; + return this; + } + + public DbSeqBuilder retryTimes(int retryTimes) { + this.retryTimes = retryTimes; + return this; + } + + public DbSeqBuilder step(int step) { + this.step = step; + return this; + } + + public DbSeqBuilder bizName(BizName bizName) { + this.bizName = bizName; + return this; + } + + public DbSeqBuilder stepStart(long stepStart) { + this.stepStart = stepStart; + return this; + } + +} diff --git a/pigx-common/pigx-common-sequence/src/main/java/com/pig4cloud/pigx/common/sequence/builder/RedisSeqBuilder.java b/pigx-common/pigx-common-sequence/src/main/java/com/pig4cloud/pigx/common/sequence/builder/RedisSeqBuilder.java new file mode 100644 index 0000000..d8a54af --- /dev/null +++ b/pigx-common/pigx-common-sequence/src/main/java/com/pig4cloud/pigx/common/sequence/builder/RedisSeqBuilder.java @@ -0,0 +1,97 @@ +package com.pig4cloud.pigx.common.sequence.builder; + +import com.pig4cloud.pigx.common.sequence.range.BizName; +import com.pig4cloud.pigx.common.sequence.range.impl.redis.RedisSeqRangeMgr; +import com.pig4cloud.pigx.common.sequence.sequence.Sequence; +import com.pig4cloud.pigx.common.sequence.sequence.impl.DefaultRangeSequence; + +/** + * 基于redis取步长,序列号生成器构建者 + * + * @author xuan on 2018/5/30. + */ +public class RedisSeqBuilder implements SeqBuilder { + + /** + * 连接redis的IP[必选] + */ + private String ip; + + /** + * 连接redis的port[必选] + */ + private int port; + + /** + * 业务名称[必选] + */ + private BizName bizName; + + /** + * 认证权限,看redis是否配置了需要密码auth[可选] + */ + private String auth; + + /** + * 获取range步长[可选,默认:1000] + */ + private int step = 1000; + + /** + * 序列号分配起始值[可选:默认:0] + */ + private long stepStart = 0; + + public static RedisSeqBuilder create() { + RedisSeqBuilder builder = new RedisSeqBuilder(); + return builder; + } + + @Override + public Sequence build() { + // 利用Redis获取区间管理器 + RedisSeqRangeMgr redisSeqRangeMgr = new RedisSeqRangeMgr(); + redisSeqRangeMgr.setIp(this.ip); + redisSeqRangeMgr.setPort(this.port); + redisSeqRangeMgr.setAuth(this.auth); + redisSeqRangeMgr.setStep(this.step); + redisSeqRangeMgr.setStepStart(stepStart); + redisSeqRangeMgr.init(); + // 构建序列号生成器 + DefaultRangeSequence sequence = new DefaultRangeSequence(); + sequence.setName(this.bizName); + sequence.setSeqRangeMgr(redisSeqRangeMgr); + return sequence; + } + + public RedisSeqBuilder ip(String ip) { + this.ip = ip; + return this; + } + + public RedisSeqBuilder port(int port) { + this.port = port; + return this; + } + + public RedisSeqBuilder auth(String auth) { + this.auth = auth; + return this; + } + + public RedisSeqBuilder step(int step) { + this.step = step; + return this; + } + + public RedisSeqBuilder bizName(BizName bizName) { + this.bizName = bizName; + return this; + } + + public RedisSeqBuilder stepStart(long stepStart) { + this.stepStart = stepStart; + return this; + } + +} diff --git a/pigx-common/pigx-common-sequence/src/main/java/com/pig4cloud/pigx/common/sequence/builder/SeqBuilder.java b/pigx-common/pigx-common-sequence/src/main/java/com/pig4cloud/pigx/common/sequence/builder/SeqBuilder.java new file mode 100644 index 0000000..a952eda --- /dev/null +++ b/pigx-common/pigx-common-sequence/src/main/java/com/pig4cloud/pigx/common/sequence/builder/SeqBuilder.java @@ -0,0 +1,18 @@ +package com.pig4cloud.pigx.common.sequence.builder; + +import com.pig4cloud.pigx.common.sequence.sequence.Sequence; + +/** + * 序列号生成器构建者 + * + * @author xuan on 2018/5/30. + */ +public interface SeqBuilder { + + /** + * 构建一个序列号生成器 + * @return 序列号生成器 + */ + Sequence build(); + +} diff --git a/pigx-common/pigx-common-sequence/src/main/java/com/pig4cloud/pigx/common/sequence/builder/SnowflakeSeqBuilder.java b/pigx-common/pigx-common-sequence/src/main/java/com/pig4cloud/pigx/common/sequence/builder/SnowflakeSeqBuilder.java new file mode 100644 index 0000000..becedff --- /dev/null +++ b/pigx-common/pigx-common-sequence/src/main/java/com/pig4cloud/pigx/common/sequence/builder/SnowflakeSeqBuilder.java @@ -0,0 +1,46 @@ +package com.pig4cloud.pigx.common.sequence.builder; + +import com.pig4cloud.pigx.common.sequence.sequence.Sequence; +import com.pig4cloud.pigx.common.sequence.sequence.impl.SnowflakeSequence; + +/** + * 基于雪花算法,序列号生成器构建者 + * + * @author xuan on 2018/5/30. + */ +public class SnowflakeSeqBuilder implements SeqBuilder { + + /** + * 数据中心ID,值的范围在[0,31]之间,一般可以设置机房的IDC[必选] + */ + private long datacenterId; + + /** + * 工作机器ID,值的范围在[0,31]之间,一般可以设置机器编号[必选] + */ + private long workerId; + + public static SnowflakeSeqBuilder create() { + SnowflakeSeqBuilder builder = new SnowflakeSeqBuilder(); + return builder; + } + + @Override + public Sequence build() { + SnowflakeSequence sequence = new SnowflakeSequence(); + sequence.setDatacenterId(this.datacenterId); + sequence.setWorkerId(this.workerId); + return sequence; + } + + public SnowflakeSeqBuilder datacenterId(long datacenterId) { + this.datacenterId = datacenterId; + return this; + } + + public SnowflakeSeqBuilder workerId(long workerId) { + this.workerId = workerId; + return this; + } + +} diff --git a/pigx-common/pigx-common-sequence/src/main/java/com/pig4cloud/pigx/common/sequence/exception/SeqException.java b/pigx-common/pigx-common-sequence/src/main/java/com/pig4cloud/pigx/common/sequence/exception/SeqException.java new file mode 100644 index 0000000..53b7dfe --- /dev/null +++ b/pigx-common/pigx-common-sequence/src/main/java/com/pig4cloud/pigx/common/sequence/exception/SeqException.java @@ -0,0 +1,20 @@ +package com.pig4cloud.pigx.common.sequence.exception; + +/** + * 序列号生成异常 + * + * @author xuan on 2018/1/10. + */ +public class SeqException extends RuntimeException { + + private static final long serialVersionUID = 1L; + + public SeqException(String message) { + super(message); + } + + public SeqException(Throwable cause) { + super(cause); + } + +} diff --git a/pigx-common/pigx-common-sequence/src/main/java/com/pig4cloud/pigx/common/sequence/properties/BaseSequenceProperties.java b/pigx-common/pigx-common-sequence/src/main/java/com/pig4cloud/pigx/common/sequence/properties/BaseSequenceProperties.java new file mode 100644 index 0000000..bab4314 --- /dev/null +++ b/pigx-common/pigx-common-sequence/src/main/java/com/pig4cloud/pigx/common/sequence/properties/BaseSequenceProperties.java @@ -0,0 +1,29 @@ +package com.pig4cloud.pigx.common.sequence.properties; + +import lombok.Data; + +/** + * @author lengleng + * @date 2019-05-26 + *

+ * 发号器通用属性 + */ +@Data +class BaseSequenceProperties { + + /** + * 获取range步长[可选,默认:1000] + */ + private int step = 1000; + + /** + * 序列号分配起始值[可选:默认:0] + */ + private long stepStart = 0; + + /** + * 业务名称 + */ + private String bizName = "pigx"; + +} diff --git a/pigx-common/pigx-common-sequence/src/main/java/com/pig4cloud/pigx/common/sequence/properties/SequenceDbProperties.java b/pigx-common/pigx-common-sequence/src/main/java/com/pig4cloud/pigx/common/sequence/properties/SequenceDbProperties.java new file mode 100644 index 0000000..9b78f36 --- /dev/null +++ b/pigx-common/pigx-common-sequence/src/main/java/com/pig4cloud/pigx/common/sequence/properties/SequenceDbProperties.java @@ -0,0 +1,33 @@ +package com.pig4cloud.pigx.common.sequence.properties; + +/** + * @author lengleng + * @date 2019-05-26 + */ + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +/** + * @author lengleng + * @date 2019/5/26 + *

+ * 发号器DB配置属性 + */ +@Data +@Component +@ConfigurationProperties(prefix = "pigx.xsequence.db") +public class SequenceDbProperties extends BaseSequenceProperties { + + /** + * 表名称 + */ + private String tableName = "pigx_sequence"; + + /** + * 重试次数 + */ + private int retryTimes = 1; + +} \ No newline at end of file diff --git a/pigx-common/pigx-common-sequence/src/main/java/com/pig4cloud/pigx/common/sequence/properties/SequenceRedisProperties.java b/pigx-common/pigx-common-sequence/src/main/java/com/pig4cloud/pigx/common/sequence/properties/SequenceRedisProperties.java new file mode 100644 index 0000000..9d347a1 --- /dev/null +++ b/pigx-common/pigx-common-sequence/src/main/java/com/pig4cloud/pigx/common/sequence/properties/SequenceRedisProperties.java @@ -0,0 +1,23 @@ +package com.pig4cloud.pigx.common.sequence.properties; + +/** + * @author lengleng + * @date 2019-05-26 + */ + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +/** + * @author lengleng + * @date 2019/5/26 + *

+ * 发号器Redis配置属性 + */ +@Data +@Component +@ConfigurationProperties(prefix = "pigx.xsequence.redis") +public class SequenceRedisProperties extends BaseSequenceProperties { + +} \ No newline at end of file diff --git a/pigx-common/pigx-common-sequence/src/main/java/com/pig4cloud/pigx/common/sequence/properties/SequenceSnowflakeProperties.java b/pigx-common/pigx-common-sequence/src/main/java/com/pig4cloud/pigx/common/sequence/properties/SequenceSnowflakeProperties.java new file mode 100644 index 0000000..8e496be --- /dev/null +++ b/pigx-common/pigx-common-sequence/src/main/java/com/pig4cloud/pigx/common/sequence/properties/SequenceSnowflakeProperties.java @@ -0,0 +1,28 @@ +package com.pig4cloud.pigx.common.sequence.properties; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +/** + * @author lengleng + * @date 2019-05-26 + *

+ * Snowflake 发号器属性 + */ +@Data +@Component +@ConfigurationProperties(prefix = "pigx.xsequence.snowflake") +public class SequenceSnowflakeProperties extends BaseSequenceProperties { + + /** + * 数据中心ID,值的范围在[0,31]之间,一般可以设置机房的IDC[必选] + */ + private long datacenterId; + + /** + * 工作机器ID,值的范围在[0,31]之间,一般可以设置机器编号[必选] + */ + private long workerId; + +} diff --git a/pigx-common/pigx-common-sequence/src/main/java/com/pig4cloud/pigx/common/sequence/range/BizName.java b/pigx-common/pigx-common-sequence/src/main/java/com/pig4cloud/pigx/common/sequence/range/BizName.java new file mode 100644 index 0000000..24ddb44 --- /dev/null +++ b/pigx-common/pigx-common-sequence/src/main/java/com/pig4cloud/pigx/common/sequence/range/BizName.java @@ -0,0 +1,17 @@ +package com.pig4cloud.pigx.common.sequence.range; + +/** + * @author lengleng + * @date 2019-05-26 + *

+ * 名称生成器 + */ +public interface BizName { + + /** + * 生成名称 + * @return 返回文本序号 + */ + String create(); + +} diff --git a/pigx-common/pigx-common-sequence/src/main/java/com/pig4cloud/pigx/common/sequence/range/SeqRange.java b/pigx-common/pigx-common-sequence/src/main/java/com/pig4cloud/pigx/common/sequence/range/SeqRange.java new file mode 100644 index 0000000..45896a8 --- /dev/null +++ b/pigx-common/pigx-common-sequence/src/main/java/com/pig4cloud/pigx/common/sequence/range/SeqRange.java @@ -0,0 +1,73 @@ +package com.pig4cloud.pigx.common.sequence.range; + +import java.util.concurrent.atomic.AtomicLong; + +/** + * 序列号区间对象模型 + * + * @author xuan on 2018/1/10. + */ +public class SeqRange { + + /** + * 区间的序列号开始值 + */ + private final long min; + + /** + * 区间的序列号结束值 + */ + private final long max; + + /** + * 区间的序列号当前值 + */ + private final AtomicLong value; + + /** + * 区间的序列号是否分配完毕,每次分配完毕就会去重新获取一个新的区间 + */ + private volatile boolean over = false; + + public SeqRange(long min, long max) { + this.min = min; + this.max = max; + this.value = new AtomicLong(min); + } + + /** + * 返回并递增下一个序列号 + * @return 下一个序列号,如果返回-1表示序列号分配完毕 + */ + public long getAndIncrement() { + long currentValue = value.getAndIncrement(); + if (currentValue > max) { + over = true; + return -1; + } + + return currentValue; + } + + public long getMin() { + return min; + } + + public long getMax() { + return max; + } + + public boolean isOver() { + return over; + } + + public void setOver(boolean over) { + this.over = over; + } + + @Override + public String toString() { + return "max: " + max + ", min: " + min + ", value: " + value; + } + +} diff --git a/pigx-common/pigx-common-sequence/src/main/java/com/pig4cloud/pigx/common/sequence/range/SeqRangeMgr.java b/pigx-common/pigx-common-sequence/src/main/java/com/pig4cloud/pigx/common/sequence/range/SeqRangeMgr.java new file mode 100644 index 0000000..33df7aa --- /dev/null +++ b/pigx-common/pigx-common-sequence/src/main/java/com/pig4cloud/pigx/common/sequence/range/SeqRangeMgr.java @@ -0,0 +1,25 @@ +package com.pig4cloud.pigx.common.sequence.range; + +import com.pig4cloud.pigx.common.sequence.exception.SeqException; + +/** + * 区间管理器 + * + * @author xuan on 2018/1/10. + */ +public interface SeqRangeMgr { + + /** + * 获取指定区间名的下一个区间 + * @param name 区间名 + * @return 返回区间 + * @throws SeqException 异常 + */ + SeqRange nextRange(String name) throws SeqException; + + /** + * 初始化 + */ + void init(); + +} diff --git a/pigx-common/pigx-common-sequence/src/main/java/com/pig4cloud/pigx/common/sequence/range/impl/db/BaseDbHelper.java b/pigx-common/pigx-common-sequence/src/main/java/com/pig4cloud/pigx/common/sequence/range/impl/db/BaseDbHelper.java new file mode 100644 index 0000000..80f2d9a --- /dev/null +++ b/pigx-common/pigx-common-sequence/src/main/java/com/pig4cloud/pigx/common/sequence/range/impl/db/BaseDbHelper.java @@ -0,0 +1,212 @@ +package com.pig4cloud.pigx.common.sequence.range.impl.db; + +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.incrementer.DefaultIdentifierGenerator; +import com.pig4cloud.pigx.common.core.util.SpringContextHolder; +import com.pig4cloud.pigx.common.sequence.exception.SeqException; +import com.pig4cloud.pigx.common.sequence.range.impl.db.provider.SqlProviderFactory; + +import javax.sql.DataSource; +import java.sql.*; + +/** + * 操作DB帮助类 + * + * @author xuan on 2018/4/29. + */ +abstract class BaseDbHelper { + + private static final SqlProviderFactory SQL_PROVIDER_FACTORY = SpringContextHolder + .getBean(SqlProviderFactory.class); + + private static final long DELTA = 100000000L; + + private final static DefaultIdentifierGenerator identifierGenerator = new DefaultIdentifierGenerator(); + + /** + * 创建表 + * @param dataSource DB来源 + * @param tableName 表名 + */ + static void createTable(DataSource dataSource, String tableName) { + + Connection conn = null; + Statement stmt = null; + + try { + conn = dataSource.getConnection(); + stmt = conn.createStatement(); + stmt.executeUpdate(SQL_PROVIDER_FACTORY.getCreateTableSql().replace("#tableName", tableName)); + } + catch (SQLException e) { + throw new SeqException(e); + } + finally { + closeQuietly(stmt); + closeQuietly(conn); + } + } + + /** + * 插入数据区间 + * @param dataSource DB来源 + * @param tableName 表名 + * @param name 区间名称 + * @param stepStart 初始位置 + */ + private static void insertRange(DataSource dataSource, String tableName, String name, long stepStart) { + + Connection conn = null; + PreparedStatement stmt = null; + + try { + conn = dataSource.getConnection(); + stmt = conn.prepareStatement(SQL_PROVIDER_FACTORY.getInsertRangeSql().replace("#tableName", tableName)); + stmt.setLong(1, identifierGenerator.nextId(null)); + stmt.setString(2, name); + stmt.setLong(3, stepStart); + stmt.setTimestamp(4, new Timestamp(System.currentTimeMillis())); + stmt.setTimestamp(5, new Timestamp(System.currentTimeMillis())); + stmt.executeUpdate(); + } + catch (SQLException e) { + throw new SeqException(e); + } + finally { + closeQuietly(stmt); + closeQuietly(conn); + } + } + + /** + * 更新区间,乐观策略 + * @param dataSource DB来源 + * @param tableName 表名 + * @param newValue 更新新数据 + * @param oldValue 更新旧数据 + * @param name 区间名称 + * @return 成功/失败 + */ + static boolean updateRange(DataSource dataSource, String tableName, Long newValue, Long oldValue, String name) { + + Connection conn = null; + PreparedStatement stmt = null; + + try { + conn = dataSource.getConnection(); + stmt = conn.prepareStatement(SQL_PROVIDER_FACTORY.getUpdateRangeSql().replace("#tableName", tableName)); + stmt.setLong(1, newValue); + stmt.setTimestamp(2, new Timestamp(System.currentTimeMillis())); + stmt.setString(3, name); + stmt.setLong(4, oldValue); + int affectedRows = stmt.executeUpdate(); + return affectedRows > 0; + } + catch (SQLException e) { + throw new SeqException(e); + } + finally { + closeQuietly(stmt); + closeQuietly(conn); + } + } + + /** + * 查询区间,如果区间不存在,会新增一个区间,并返回null,由上层重新执行 + * @param dataSource DB来源 + * @param tableName 来源 + * @param name 区间名称 + * @param stepStart 初始位置 + * @return 区间值 + */ + static Long selectRange(DataSource dataSource, String tableName, String name, long stepStart) { + Connection conn = null; + PreparedStatement stmt = null; + ResultSet rs = null; + long oldValue; + + try { + conn = dataSource.getConnection(); + stmt = conn.prepareStatement(SQL_PROVIDER_FACTORY.getSelectRangeSql().replace("#tableName", tableName)); + stmt.setString(1, name); + + rs = stmt.executeQuery(); + if (!rs.next()) { + // 没有此类型数据,需要初始化 + insertRange(dataSource, tableName, name, stepStart); + return null; + } + oldValue = rs.getLong(1); + + if (oldValue < 0) { + String msg = "Sequence value cannot be less than zero, value = " + oldValue + + ", please check table sequence" + tableName; + throw new SeqException(msg); + } + + if (oldValue > Long.MAX_VALUE - DELTA) { + String msg = "Sequence value overflow, value = " + oldValue + ", please check table sequence" + + tableName; + throw new SeqException(msg); + } + + return oldValue; + } + catch (SQLException e) { + throw new SeqException(e); + } + finally { + closeQuietly(rs); + closeQuietly(stmt); + closeQuietly(conn); + } + } + + private static void closeQuietly(AutoCloseable closeable) { + if (null != closeable) { + try { + closeable.close(); + } + catch (Throwable e) { + // Ignore + } + } + } + + public static Boolean existTable(DataSource dataSource, String tableName) { + + String existTableSql = SQL_PROVIDER_FACTORY.getExistTableSql(); + if (StrUtil.isBlank(existTableSql)) { + return true; + } + Connection conn = null; + Statement stmt = null; + + try { + conn = dataSource.getConnection(); + stmt = conn.createStatement(); + ResultSet resultSet = stmt + .executeQuery(SQL_PROVIDER_FACTORY.getExistTableSql().replace("#tableName", tableName)); + + if (!resultSet.next()) { + return false; + } + + int count = resultSet.getInt(1); + + if (0 == count) { + return true; + } + } + catch (SQLException e) { + throw new SeqException(e); + } + finally { + closeQuietly(stmt); + closeQuietly(conn); + } + + return false; + } + +} diff --git a/pigx-common/pigx-common-sequence/src/main/java/com/pig4cloud/pigx/common/sequence/range/impl/db/DbSeqRangeMgr.java b/pigx-common/pigx-common-sequence/src/main/java/com/pig4cloud/pigx/common/sequence/range/impl/db/DbSeqRangeMgr.java new file mode 100644 index 0000000..1a2fd4b --- /dev/null +++ b/pigx-common/pigx-common-sequence/src/main/java/com/pig4cloud/pigx/common/sequence/range/impl/db/DbSeqRangeMgr.java @@ -0,0 +1,147 @@ +package com.pig4cloud.pigx.common.sequence.range.impl.db; + +import com.pig4cloud.pigx.common.sequence.exception.SeqException; +import com.pig4cloud.pigx.common.sequence.range.SeqRange; +import com.pig4cloud.pigx.common.sequence.range.SeqRangeMgr; + +import javax.sql.DataSource; + +/** + * DB区间管理器 + * + * @author xuan on 2018/4/29. + */ +public class DbSeqRangeMgr implements SeqRangeMgr { + + /** + * 区间步长 + */ + private int step = 1000; + + /** + * 区间起始位置,真实从stepStart+1开始 + */ + private long stepStart = 0; + + /** + * 获取区间失败重试次数 + */ + private int retryTimes = 100; + + /** + * DB来源 + */ + private DataSource dataSource; + + /** + * 表名,默认range + */ + private String tableName = "range"; + + @Override + public SeqRange nextRange(String name) throws SeqException { + if (isEmpty(name)) { + throw new SecurityException("[DbSeqRangeMgr-nextRange] name is empty."); + } + + Long oldValue; + Long newValue; + + for (int i = 0; i < getRetryTimes(); i++) { + oldValue = BaseDbHelper.selectRange(getDataSource(), getRealTableName(), name, getStepStart()); + + if (null == oldValue) { + // 区间不存在,重试 + continue; + } + + newValue = oldValue + getStep(); + + if (BaseDbHelper.updateRange(getDataSource(), getRealTableName(), newValue, oldValue, name)) { + return new SeqRange(oldValue + 1, newValue); + } + // else 失败重试 + } + + throw new SeqException("Retried too many times, retryTimes = " + getRetryTimes()); + } + + @Override + public void init() { + checkParam(); + + // 判断是否需要创建表 + if (BaseDbHelper.existTable(getDataSource(), getRealTableName())) { + BaseDbHelper.createTable(getDataSource(), getRealTableName()); + } + } + + private boolean isEmpty(String str) { + return null == str || str.trim().length() == 0; + } + + private String getRealTableName() { + return getTableName(); + } + + private void checkParam() { + if (step <= 0) { + throw new SecurityException("[DbSeqRangeMgr-checkParam] step must greater than 0."); + } + if (stepStart < 0) { + throw new SecurityException("[DbSeqRangeMgr-setStepStart] stepStart < 0."); + } + if (retryTimes <= 0) { + throw new SecurityException("[DbSeqRangeMgr-setRetryTimes] retryTimes must greater than 0."); + } + if (null == dataSource) { + throw new SecurityException("[DbSeqRangeMgr-setDataSource] dataSource is null."); + } + if (isEmpty(tableName)) { + throw new SecurityException("[DbSeqRangeMgr-setTableName] tableName is empty."); + } + } + + //////// getter and setter + + public int getStep() { + return step; + } + + public void setStep(int step) { + this.step = step; + } + + public long getStepStart() { + return stepStart; + } + + public void setStepStart(long stepStart) { + this.stepStart = stepStart; + } + + public int getRetryTimes() { + return retryTimes; + } + + public void setRetryTimes(int retryTimes) { + this.retryTimes = retryTimes; + } + + public DataSource getDataSource() { + return dataSource; + } + + public void setDataSource(DataSource dataSource) { + this.dataSource = dataSource; + } + + public String getTableName() { + return tableName; + } + + public void setTableName(String tableName) { + this.tableName = tableName; + } + +} diff --git a/pigx-common/pigx-common-sequence/src/main/java/com/pig4cloud/pigx/common/sequence/range/impl/db/provider/DmSqlProvider.java b/pigx-common/pigx-common-sequence/src/main/java/com/pig4cloud/pigx/common/sequence/range/impl/db/provider/DmSqlProvider.java new file mode 100644 index 0000000..65cca3d --- /dev/null +++ b/pigx-common/pigx-common-sequence/src/main/java/com/pig4cloud/pigx/common/sequence/range/impl/db/provider/DmSqlProvider.java @@ -0,0 +1,42 @@ +package com.pig4cloud.pigx.common.sequence.range.impl.db.provider; + +import com.baomidou.mybatisplus.annotation.DbType; +import org.springframework.stereotype.Component; + +/** + * 数据源提供者 + * + * @author 达梦数据库支持 + * @date 2022-04-27 + * + * sql server + */ +@Component +public class DmSqlProvider implements SqlProvider { + + /** + * 获取表是否存在 + * @return + */ + @Override + public String getExistTableSql() { + return "select count(*) from user_tables where table_name =upper('#tableName')"; + } + + /** + * 获取建表语句 + * @return + */ + @Override + public String getCreateTableSql() { + return "CREATE TABLE #tableName (ID BIGINT NOT NULL,VALUE BIGINT NOT NULL" + + ",NAME VARCHAR (64) NOT NULL,GMT_CREATE TIMESTAMP (0) NOT NULL,GMT_MODIFIED TIMESTAMP (0) NOT NULL" + + ",NOT CLUSTER PRIMARY KEY (ID),CONSTRAINT UK_NAME UNIQUE (NAME)) STORAGE (ON MAIN,CLUSTERBTR);"; + } + + @Override + public Boolean support(DbType dbType) { + return DbType.DM.equals(dbType); + } + +} diff --git a/pigx-common/pigx-common-sequence/src/main/java/com/pig4cloud/pigx/common/sequence/range/impl/db/provider/HighGoSqlProvider.java b/pigx-common/pigx-common-sequence/src/main/java/com/pig4cloud/pigx/common/sequence/range/impl/db/provider/HighGoSqlProvider.java new file mode 100644 index 0000000..837f4b6 --- /dev/null +++ b/pigx-common/pigx-common-sequence/src/main/java/com/pig4cloud/pigx/common/sequence/range/impl/db/provider/HighGoSqlProvider.java @@ -0,0 +1,31 @@ +package com.pig4cloud.pigx.common.sequence.range.impl.db.provider; + +import com.baomidou.mybatisplus.annotation.DbType; +import org.springframework.stereotype.Component; + +/** + * 瀚高数据源 + * + * @author lengleng + * @date 2023-04-26 + */ +@Component +public class HighGoSqlProvider implements SqlProvider { + + /** + * 获取建表语句 + * @return + */ + @Override + public String getCreateTableSql() { + return "CREATE TABLE IF NOT EXISTS #tableName (ID int8 PRIMARY KEY NOT NULL" + + ",VALUE int8 NOT NULL,NAME VARCHAR (266) NOT NULL,gmt_create TIMESTAMP (6) NOT NULL" + + ",gmt_modified TIMESTAMP (6) NOT NULL)"; + } + + @Override + public Boolean support(DbType dbType) { + return DbType.HIGH_GO.equals(dbType); + } + +} diff --git a/pigx-common/pigx-common-sequence/src/main/java/com/pig4cloud/pigx/common/sequence/range/impl/db/provider/KingbaseSqlProvider.java b/pigx-common/pigx-common-sequence/src/main/java/com/pig4cloud/pigx/common/sequence/range/impl/db/provider/KingbaseSqlProvider.java new file mode 100644 index 0000000..f14d048 --- /dev/null +++ b/pigx-common/pigx-common-sequence/src/main/java/com/pig4cloud/pigx/common/sequence/range/impl/db/provider/KingbaseSqlProvider.java @@ -0,0 +1,27 @@ +package com.pig4cloud.pigx.common.sequence.range.impl.db.provider; + +import com.baomidou.mybatisplus.annotation.DbType; +import org.springframework.stereotype.Component; + +/** + * @author lengleng + * @date 2023/4/23 kingbase数据库支持 + */ +@Component +public class KingbaseSqlProvider implements SqlProvider { + + /** + * 获取建表语句 + * @return SQL + */ + @Override + public String getCreateTableSql() { + return "CREATE TABLE IF NOT EXISTS #tableName (ID INT8 PRIMARY KEY NOT NULL,VALUE INT8 NOT NULL,NAME VARCHAR (266) NOT NULL,gmt_create TIMESTAMP (6) NOT NULL,gmt_modified TIMESTAMP (6) NOT NULL)"; + } + + @Override + public Boolean support(DbType dbType) { + return DbType.KINGBASE_ES.equals(dbType); + } + +} diff --git a/pigx-common/pigx-common-sequence/src/main/java/com/pig4cloud/pigx/common/sequence/range/impl/db/provider/MssqlSqlProvider.java b/pigx-common/pigx-common-sequence/src/main/java/com/pig4cloud/pigx/common/sequence/range/impl/db/provider/MssqlSqlProvider.java new file mode 100644 index 0000000..08f5da5 --- /dev/null +++ b/pigx-common/pigx-common-sequence/src/main/java/com/pig4cloud/pigx/common/sequence/range/impl/db/provider/MssqlSqlProvider.java @@ -0,0 +1,34 @@ +package com.pig4cloud.pigx.common.sequence.range.impl.db.provider; + +import com.baomidou.mybatisplus.annotation.DbType; +import org.springframework.stereotype.Component; + +/** + * 数据源提供者 + * + * @author hanyichao + * @date 2022-04-27 + * + * sql server + */ +@Component +public class MssqlSqlProvider implements SqlProvider { + + /** + * 获取建表语句 + * @return + */ + @Override + public String getCreateTableSql() { + return "IF NOT EXISTS (\n" + + "SELECT*FROM sys.all_objects WHERE object_id=OBJECT_ID(N'#tableName') AND type IN ('U')) \n" + + "CREATE TABLE #tableName (id bigint NOT NULL,VALUE bigint NOT NULL,name nvarchar (64) COLLATE " + + "Chinese_PRC_CI_AS NOT NULL,gmt_create datetime2 (7) NOT NULL,gmt_modified datetime2 (7) NOT NULL) GO"; + } + + @Override + public Boolean support(DbType dbType) { + return DbType.SQL_SERVER2005.equals(dbType); + } + +} diff --git a/pigx-common/pigx-common-sequence/src/main/java/com/pig4cloud/pigx/common/sequence/range/impl/db/provider/MysqlSqlProvider.java b/pigx-common/pigx-common-sequence/src/main/java/com/pig4cloud/pigx/common/sequence/range/impl/db/provider/MysqlSqlProvider.java new file mode 100644 index 0000000..273d5f8 --- /dev/null +++ b/pigx-common/pigx-common-sequence/src/main/java/com/pig4cloud/pigx/common/sequence/range/impl/db/provider/MysqlSqlProvider.java @@ -0,0 +1,31 @@ +package com.pig4cloud.pigx.common.sequence.range.impl.db.provider; + +import com.baomidou.mybatisplus.annotation.DbType; +import org.springframework.stereotype.Component; + +/** + * 数据源提供者 + * + * @author lishangbu + * @date 2021/12/29 + */ +@Component +public class MysqlSqlProvider implements SqlProvider { + + /** + * 获取建表语句 + * @return + */ + @Override + public String getCreateTableSql() { + return "CREATE TABLE IF NOT EXISTS #tableName(" + "id bigint(20) NOT NULL AUTO_INCREMENT," + + "value bigint(20) NOT NULL," + "name varchar(64) NOT NULL," + "gmt_create DATETIME NOT NULL," + + "gmt_modified DATETIME NOT NULL," + "PRIMARY KEY (`id`),UNIQUE uk_name (`name`)" + ")"; + } + + @Override + public Boolean support(DbType dbType) { + return DbType.MYSQL.equals(dbType); + } + +} diff --git a/pigx-common/pigx-common-sequence/src/main/java/com/pig4cloud/pigx/common/sequence/range/impl/db/provider/OracleSqlProvider.java b/pigx-common/pigx-common-sequence/src/main/java/com/pig4cloud/pigx/common/sequence/range/impl/db/provider/OracleSqlProvider.java new file mode 100644 index 0000000..e7c9f0b --- /dev/null +++ b/pigx-common/pigx-common-sequence/src/main/java/com/pig4cloud/pigx/common/sequence/range/impl/db/provider/OracleSqlProvider.java @@ -0,0 +1,56 @@ +package com.pig4cloud.pigx.common.sequence.range.impl.db.provider; + +import com.baomidou.mybatisplus.annotation.DbType; +import org.springframework.stereotype.Component; + +/** + * oracle数据源 + * + * @author lishangbu + * @date 2021/12/29 + */ +@Component +public class OracleSqlProvider implements SqlProvider { + + /** + * 获取表是否存在 + * @return + */ + @Override + public String getExistTableSql() { + return "select count(*) from user_tables where table_name =upper('#tableName')"; + } + + /** + * 获取建表语句 + * @return SQL + */ + @Override + public String getCreateTableSql() { + return "CREATE TABLE #tableName " + "(id NUMBER (20,0) VISIBLE NOT NULL,value NUMBER (20,0) VISIBLE NOT NULL" + + ",name VARCHAR2 (96 BYTE) VISIBLE,gmt_create DATE VISIBLE NOT NULL" + + ",gmt_modified DATE VISIBLE NOT NULL)"; + } + + /** + * 获取更新范围语句 + * @return + */ + public String getUpdateRangeSql() { + return "UPDATE #tableName SET value=?,gmt_modified=? WHERE name=? AND value=?"; + } + + /** + * 获取查询范围语句 + * @return + */ + public String getSelectRangeSql() { + return "SELECT value FROM #tableName WHERE name=?"; + } + + @Override + public Boolean support(DbType dbType) { + return DbType.ORACLE.equals(dbType); + } + +} diff --git a/pigx-common/pigx-common-sequence/src/main/java/com/pig4cloud/pigx/common/sequence/range/impl/db/provider/PostgreSqlProvider.java b/pigx-common/pigx-common-sequence/src/main/java/com/pig4cloud/pigx/common/sequence/range/impl/db/provider/PostgreSqlProvider.java new file mode 100644 index 0000000..8fab548 --- /dev/null +++ b/pigx-common/pigx-common-sequence/src/main/java/com/pig4cloud/pigx/common/sequence/range/impl/db/provider/PostgreSqlProvider.java @@ -0,0 +1,31 @@ +package com.pig4cloud.pigx.common.sequence.range.impl.db.provider; + +import com.baomidou.mybatisplus.annotation.DbType; +import org.springframework.stereotype.Component; + +/** + * 数据源提供者 + * + * @author lengleng + * @date 2022-01-13 + */ +@Component +public class PostgreSqlProvider implements SqlProvider { + + /** + * 获取建表语句 + * @return + */ + @Override + public String getCreateTableSql() { + return "CREATE TABLE IF NOT EXISTS #tableName (ID int8 PRIMARY KEY NOT NULL" + + ",VALUE int8 NOT NULL,NAME VARCHAR (266) NOT NULL,gmt_create TIMESTAMP (6) NOT NULL" + + ",gmt_modified TIMESTAMP (6) NOT NULL)"; + } + + @Override + public Boolean support(DbType dbType) { + return DbType.POSTGRE_SQL.equals(dbType); + } + +} diff --git a/pigx-common/pigx-common-sequence/src/main/java/com/pig4cloud/pigx/common/sequence/range/impl/db/provider/SqlProvider.java b/pigx-common/pigx-common-sequence/src/main/java/com/pig4cloud/pigx/common/sequence/range/impl/db/provider/SqlProvider.java new file mode 100644 index 0000000..d6cd9c8 --- /dev/null +++ b/pigx-common/pigx-common-sequence/src/main/java/com/pig4cloud/pigx/common/sequence/range/impl/db/provider/SqlProvider.java @@ -0,0 +1,53 @@ +package com.pig4cloud.pigx.common.sequence.range.impl.db.provider; + +import com.baomidou.mybatisplus.annotation.DbType; + +/** + * 数据源提供者 + * + * @author lishangbu + * @date 2021/12/29 + */ +public interface SqlProvider { + + /** + * 获取表是否存在 + * @return + */ + default String getExistTableSql() { + return null; + } + + /** + * 获取建表语句 + * @return + */ + String getCreateTableSql(); + + /** + * 获取插入范围语句 + * @return + */ + default String getInsertRangeSql() { + return "INSERT INTO #tableName (id,name,value,gmt_create,gmt_modified)" + " VALUES(?,?,?,?,?)"; + } + + /** + * 获取更新范围语句 + * @return + */ + default String getUpdateRangeSql() { + return "UPDATE #tableName SET value=?,gmt_modified=? WHERE name=? AND value=?"; + } + + /** + * 获取查询范围语句 + * @return + */ + default String getSelectRangeSql() { + return "SELECT value FROM #tableName WHERE name=?"; + } + + Boolean support(DbType dbType); + +} diff --git a/pigx-common/pigx-common-sequence/src/main/java/com/pig4cloud/pigx/common/sequence/range/impl/db/provider/SqlProviderFactory.java b/pigx-common/pigx-common-sequence/src/main/java/com/pig4cloud/pigx/common/sequence/range/impl/db/provider/SqlProviderFactory.java new file mode 100644 index 0000000..5b8394f --- /dev/null +++ b/pigx-common/pigx-common-sequence/src/main/java/com/pig4cloud/pigx/common/sequence/range/impl/db/provider/SqlProviderFactory.java @@ -0,0 +1,92 @@ +package com.pig4cloud.pigx.common.sequence.range.impl.db.provider; + +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.annotation.DbType; +import com.baomidou.mybatisplus.extension.toolkit.JdbcUtils; +import lombok.RequiredArgsConstructor; +import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties; +import org.springframework.context.annotation.Lazy; +import org.springframework.core.env.Environment; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * sql语句提供工厂 + * + * @author lishangbu + * @date 2021/12/29 + */ +@Lazy(value = false) +@Component +@RequiredArgsConstructor +public class SqlProviderFactory { + + private final DataSourceProperties dataSourceProperties; + + private final List sqlProviders; + + private final Environment environment; + + public SqlProvider getSqlProvider() { + String url = dataSourceProperties.getUrl(); + // druid 形式 进行降级获取 + if (StrUtil.isBlank(url)) { + url = environment.getProperty("spring.datasource.druid.url"); + } + + DbType dbType = JdbcUtils.getDbType(url); + for (SqlProvider sqlProvider : sqlProviders) { + if (sqlProvider.support(dbType)) { + return sqlProvider; + } + } + throw new UnsupportedOperationException("不支持的数据源"); + } + + /** + * 获取插入范围语句 + * @return 插入范围语句 + */ + public String getCreateTableSql() { + SqlProvider sqlProvider = getSqlProvider(); + return sqlProvider.getCreateTableSql(); + } + + /** + * 获取插入范围语句 + * @return 插入范围语句 + */ + public String getInsertRangeSql() { + SqlProvider sqlProvider = getSqlProvider(); + return sqlProvider.getInsertRangeSql(); + } + + /** + * 获取查询范围语句 + * @return + */ + public String getSelectRangeSql() { + SqlProvider sqlProvider = getSqlProvider(); + return sqlProvider.getSelectRangeSql(); + } + + /** + * 获取更新范围语句 + * @return 更新范围语句 + */ + public String getUpdateRangeSql() { + SqlProvider sqlProvider = getSqlProvider(); + return sqlProvider.getUpdateRangeSql(); + } + + /** + * 获取是否创建表语句 + * @return SQL语句 + */ + public String getExistTableSql() { + SqlProvider sqlProvider = getSqlProvider(); + return sqlProvider.getExistTableSql(); + } + +} diff --git a/pigx-common/pigx-common-sequence/src/main/java/com/pig4cloud/pigx/common/sequence/range/impl/name/DateBizName.java b/pigx-common/pigx-common-sequence/src/main/java/com/pig4cloud/pigx/common/sequence/range/impl/name/DateBizName.java new file mode 100644 index 0000000..c1e8c50 --- /dev/null +++ b/pigx-common/pigx-common-sequence/src/main/java/com/pig4cloud/pigx/common/sequence/range/impl/name/DateBizName.java @@ -0,0 +1,28 @@ +package com.pig4cloud.pigx.common.sequence.range.impl.name; + +import cn.hutool.core.date.DateUtil; +import com.pig4cloud.pigx.common.sequence.range.BizName; +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; + +/** + * @author lengleng + * @date 2019-05-26 + *

+ * 根据时间重置bizname + */ +@NoArgsConstructor +@AllArgsConstructor +public class DateBizName implements BizName { + + private String bizName; + + /** + * 生成空间名称 + */ + @Override + public String create() { + return bizName + DateUtil.today(); + } + +} \ No newline at end of file diff --git a/pigx-common/pigx-common-sequence/src/main/java/com/pig4cloud/pigx/common/sequence/range/impl/name/DefaultBizName.java b/pigx-common/pigx-common-sequence/src/main/java/com/pig4cloud/pigx/common/sequence/range/impl/name/DefaultBizName.java new file mode 100644 index 0000000..d04dc90 --- /dev/null +++ b/pigx-common/pigx-common-sequence/src/main/java/com/pig4cloud/pigx/common/sequence/range/impl/name/DefaultBizName.java @@ -0,0 +1,23 @@ +package com.pig4cloud.pigx.common.sequence.range.impl.name; + +import com.pig4cloud.pigx.common.sequence.range.BizName; +import lombok.AllArgsConstructor; + +/** + * @author lengleng + * @date 2019-05-26 根据传入返回bizname + */ +@AllArgsConstructor +public class DefaultBizName implements BizName { + + private String bizName; + + /** + * 生成空间名称 + */ + @Override + public String create() { + return bizName; + } + +} diff --git a/pigx-common/pigx-common-sequence/src/main/java/com/pig4cloud/pigx/common/sequence/range/impl/redis/RedisSeqRangeMgr.java b/pigx-common/pigx-common-sequence/src/main/java/com/pig4cloud/pigx/common/sequence/range/impl/redis/RedisSeqRangeMgr.java new file mode 100644 index 0000000..ea74ae1 --- /dev/null +++ b/pigx-common/pigx-common-sequence/src/main/java/com/pig4cloud/pigx/common/sequence/range/impl/redis/RedisSeqRangeMgr.java @@ -0,0 +1,138 @@ +package com.pig4cloud.pigx.common.sequence.range.impl.redis; + +import cn.hutool.core.util.StrUtil; +import com.pig4cloud.pigx.common.sequence.exception.SeqException; +import com.pig4cloud.pigx.common.sequence.range.SeqRange; +import com.pig4cloud.pigx.common.sequence.range.SeqRangeMgr; +import redis.clients.jedis.Jedis; + +/** + * Redis区间管理器 + * + * @author xuan on 2018/5/8. + */ +public class RedisSeqRangeMgr implements SeqRangeMgr { + + /** + * 前缀防止key重复 + */ + private final static String KEY_PREFIX = "x_sequence_"; + + /** + * redis客户端 + */ + private Jedis jedis; + + /** + * IP + */ + private String ip; + + /** + * PORT + */ + private Integer port; + + /** + * 验证权限 + */ + private String auth; + + /** + * 区间步长 + */ + private int step = 1000; + + /** + * 区间起始位置,真实从stepStart+1开始 + */ + private long stepStart = 0; + + /** + * 标记业务key是否存在,如果false,在取nextRange时,会取check一把 这个boolean只为提高性能,不用每次都取redis check + */ + private volatile boolean keyAlreadyExist; + + @Override + public SeqRange nextRange(String name) throws SeqException { + if (!keyAlreadyExist) { + Boolean isExists = jedis.exists(getRealKey(name)); + if (!isExists) { + // 第一次不存在,进行初始化,setnx不存在就set,存在就忽略 + jedis.setnx(getRealKey(name), String.valueOf(stepStart)); + } + keyAlreadyExist = true; + } + + Long max = jedis.incrBy(getRealKey(name), step); + Long min = max - step + 1; + return new SeqRange(min, max); + } + + @Override + public void init() { + checkParam(); + jedis = new Jedis(ip, port); + if (StrUtil.isNotBlank(auth)) { + jedis.auth(auth); + } + } + + private void checkParam() { + if (isEmpty(ip)) { + throw new SecurityException("[RedisSeqRangeMgr-checkParam] ip is empty."); + } + if (null == port) { + throw new SecurityException("[RedisSeqRangeMgr-checkParam] port is null."); + } + } + + private String getRealKey(String name) { + return KEY_PREFIX + name; + } + + private boolean isEmpty(String str) { + return null == str || str.trim().length() == 0; + } + + public String getIp() { + return ip; + } + + public void setIp(String ip) { + this.ip = ip; + } + + public int getPort() { + return port; + } + + public void setPort(int port) { + this.port = port; + } + + public int getStep() { + return step; + } + + public void setStep(int step) { + this.step = step; + } + + public String getAuth() { + return auth; + } + + public void setAuth(String auth) { + this.auth = auth; + } + + public long getStepStart() { + return stepStart; + } + + public void setStepStart(long stepStart) { + this.stepStart = stepStart; + } + +} diff --git a/pigx-common/pigx-common-sequence/src/main/java/com/pig4cloud/pigx/common/sequence/sequence/RangeSequence.java b/pigx-common/pigx-common-sequence/src/main/java/com/pig4cloud/pigx/common/sequence/sequence/RangeSequence.java new file mode 100644 index 0000000..bcefda7 --- /dev/null +++ b/pigx-common/pigx-common-sequence/src/main/java/com/pig4cloud/pigx/common/sequence/sequence/RangeSequence.java @@ -0,0 +1,25 @@ +package com.pig4cloud.pigx.common.sequence.sequence; + +import com.pig4cloud.pigx.common.sequence.range.BizName; +import com.pig4cloud.pigx.common.sequence.range.SeqRangeMgr; + +/** + * 序列号区间生成器接口 + * + * @author xuan on 2018/5/6. + */ +public interface RangeSequence extends Sequence { + + /** + * 设置区间管理器 + * @param seqRangeMgr 区间管理器 + */ + void setSeqRangeMgr(SeqRangeMgr seqRangeMgr); + + /** + * 设置获取序列号名称 + * @param name 名称 + */ + void setName(BizName name); + +} diff --git a/pigx-common/pigx-common-sequence/src/main/java/com/pig4cloud/pigx/common/sequence/sequence/Sequence.java b/pigx-common/pigx-common-sequence/src/main/java/com/pig4cloud/pigx/common/sequence/sequence/Sequence.java new file mode 100644 index 0000000..57a0d27 --- /dev/null +++ b/pigx-common/pigx-common-sequence/src/main/java/com/pig4cloud/pigx/common/sequence/sequence/Sequence.java @@ -0,0 +1,26 @@ +package com.pig4cloud.pigx.common.sequence.sequence; + +import com.pig4cloud.pigx.common.sequence.exception.SeqException; + +/** + * 序列号生成器接口 + * + * @author xuan on 2018/1/10. + */ +public interface Sequence { + + /** + * 生成下一个序列号 + * @return 序列号 + * @throws SeqException 序列号异常 + */ + long nextValue() throws SeqException; + + /** + * 下一个生成序号(带格式) + * @return + * @throws SeqException + */ + String nextNo() throws SeqException; + +} diff --git a/pigx-common/pigx-common-sequence/src/main/java/com/pig4cloud/pigx/common/sequence/sequence/impl/DefaultRangeSequence.java b/pigx-common/pigx-common-sequence/src/main/java/com/pig4cloud/pigx/common/sequence/sequence/impl/DefaultRangeSequence.java new file mode 100644 index 0000000..ed9ad86 --- /dev/null +++ b/pigx-common/pigx-common-sequence/src/main/java/com/pig4cloud/pigx/common/sequence/sequence/impl/DefaultRangeSequence.java @@ -0,0 +1,118 @@ +package com.pig4cloud.pigx.common.sequence.sequence.impl; + +import cn.hutool.core.date.DatePattern; +import cn.hutool.core.date.DateUtil; +import com.pig4cloud.pigx.common.sequence.exception.SeqException; +import com.pig4cloud.pigx.common.sequence.range.BizName; +import com.pig4cloud.pigx.common.sequence.range.SeqRange; +import com.pig4cloud.pigx.common.sequence.range.SeqRangeMgr; +import com.pig4cloud.pigx.common.sequence.sequence.RangeSequence; + +import java.util.Date; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; + +/** + * 序列号区间生成器接口默认实现 + * + * @author xuan on 2018/1/10. + *

+ * 根据biz name 自增 + */ +public class DefaultRangeSequence implements RangeSequence { + + /** + * 获取区间是加一把独占锁防止资源冲突 + */ + private final Lock lock = new ReentrantLock(); + + /** + * 序列号区间管理器 + */ + private SeqRangeMgr seqRangeMgr; + + /** + * 当前序列号区间 + */ + private volatile SeqRange currentRange; + + private static Map seqRangeMap = new ConcurrentHashMap<>(8); + + /** + * 需要获取区间的业务名称 + */ + private BizName bizName; + + @Override + public long nextValue() throws SeqException { + String name = bizName.create(); + + currentRange = seqRangeMap.get(name); + // 当前区间不存在,重新获取一个区间 + if (null == currentRange) { + lock.lock(); + try { + if (null == currentRange) { + currentRange = seqRangeMgr.nextRange(name); + seqRangeMap.put(name, currentRange); + } + } + finally { + lock.unlock(); + } + } + + // 当value值为-1时,表明区间的序列号已经分配完,需要重新获取区间 + long value = currentRange.getAndIncrement(); + if (value == -1) { + lock.lock(); + try { + for (;;) { + if (currentRange.isOver()) { + currentRange = seqRangeMgr.nextRange(name); + seqRangeMap.put(name, currentRange); + } + + value = currentRange.getAndIncrement(); + if (value == -1) { + continue; + } + + break; + } + } + finally { + lock.unlock(); + } + } + + if (value < 0) { + throw new SeqException("Sequence value overflow, value = " + value); + } + + return value; + } + + /** + * 下一个生成序号(带格式) + * @return + * @throws SeqException + */ + @Override + public String nextNo() throws SeqException { + return String.format("%s%05d", DateUtil.format(new Date(), DatePattern.PURE_DATE_FORMAT), nextValue()); + } + + @Override + public void setSeqRangeMgr(SeqRangeMgr seqRangeMgr) { + this.seqRangeMgr = seqRangeMgr; + } + + @Override + public void setName(BizName name) { + this.bizName = name; + } + +} diff --git a/pigx-common/pigx-common-sequence/src/main/java/com/pig4cloud/pigx/common/sequence/sequence/impl/SnowflakeSequence.java b/pigx-common/pigx-common-sequence/src/main/java/com/pig4cloud/pigx/common/sequence/sequence/impl/SnowflakeSequence.java new file mode 100644 index 0000000..5b9cc4c --- /dev/null +++ b/pigx-common/pigx-common-sequence/src/main/java/com/pig4cloud/pigx/common/sequence/sequence/impl/SnowflakeSequence.java @@ -0,0 +1,166 @@ +package com.pig4cloud.pigx.common.sequence.sequence.impl; + +import com.pig4cloud.pigx.common.sequence.exception.SeqException; +import com.pig4cloud.pigx.common.sequence.sequence.Sequence; + +/** + * 使用雪花算法 一个long类型的数据,64位。以下是每位的具体含义。
+ * snowflake的结构如下(每部分用-分开):
+ * 0 - 0000000000 0000000000 0000000000 0000000000 0 - 00000 - 00000 - 000000000000
+ * (1)第一位为未使用 (2)接下来的41位为毫秒级时间(41位的长度可以使用69年) (3)然后是5位datacenterId (4)5位workerId + * (5)最后12位是毫秒内的计数(12位的计数顺序号支持每个节点每毫秒产生4096个ID序号)
+ * 一共加起来刚好64位,为一个Long型。(转换成字符串长度为18) + * + * @author xuan on 2018/5/9. + */ +public class SnowflakeSequence implements Sequence { + + /** + * 开始时间截 (2018-01-01) + */ + private final long twepoch = 1514736000000L; + + /** + * 机器id所占的位数 + */ + private final long workerIdBits = 5L; + + /** + * 数据标识id所占的位数 + */ + private final long datacenterIdBits = 5L; + + /** + * 支持的最大机器id,结果是31 (这个移位算法可以很快的计算出几位二进制数所能表示的最大十进制数) + */ + private final long maxWorkerId = -1L ^ (-1L << workerIdBits); + + /** + * 支持的最大数据标识id,结果是31 + */ + private final long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + + /** + * 序列在id中占的位数 + */ + private final long sequenceBits = 12L; + + /** + * 机器ID向左移12位 + */ + private final long workerIdShift = sequenceBits; + + /** + * 数据标识id向左移17位(12+5) + */ + private final long datacenterIdShift = sequenceBits + workerIdBits; + + /** + * 时间截向左移22位(5+5+12) + */ + private final long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + /** + * 生成序列的掩码,这里为4095 (0b111111111111=0xfff=4095) + */ + private final long sequenceMask = -1L ^ (-1L << sequenceBits); + + /** + * 工作机器ID(0~31) + */ + private long workerId; + + /** + * 数据中心ID(0~31) + */ + private long datacenterId; + + /** + * 毫秒内序列(0~4095) + */ + private long sequence = 0L; + + /** + * 上次生成ID的时间截 + */ + private long lastTimestamp = -1L; + + @Override + public synchronized long nextValue() throws SeqException { + long timestamp = timeGen(); + + // 如果当前时间小于上一次ID生成的时间戳,说明系统时钟回退过这个时候应当抛出异常 + if (timestamp < lastTimestamp) { + throw new SeqException("[SnowflakeSequence-nextValue] 当前时间小于上次生成序列号的时间,时间被回退了,请确认服务器时间的设置."); + } + + // 如果是同一时间生成的,则进行毫秒内序列 + if (lastTimestamp == timestamp) { + sequence = (sequence + 1) & sequenceMask; + // 毫秒内序列溢出 + if (sequence == 0) { + // 阻塞到下一个毫秒,获得新的时间戳 + timestamp = tilNextMillis(lastTimestamp); + } + } + else { + // 时间戳改变,毫秒内序列重置 + sequence = 0L; + } + + // 上次生成ID的时间截 + lastTimestamp = timestamp; + + // 移位并通过或运算拼到一起组成64位的ID + return ((timestamp - twepoch) << timestampLeftShift) | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + } + + /** + * 阻塞到下一个毫秒,直到获得新的时间戳 + * @param lastTimestamp 上次生成ID的时间截 + * @return 当前时间戳 + */ + private long tilNextMillis(long lastTimestamp) { + long timestamp = timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = timeGen(); + } + return timestamp; + } + + /** + * 返回以毫秒为单位的当前时间 + * @return 当前时间(毫秒) + */ + private long timeGen() { + return System.currentTimeMillis(); + } + + public void setWorkerId(long workerId) { + if (workerId > maxWorkerId) { + throw new SeqException("[SnowflakeSequence-setWorkerId] workerId 不能大于31."); + } + + this.workerId = workerId; + } + + public void setDatacenterId(long datacenterId) { + if (datacenterId > maxDatacenterId) { + throw new SeqException("[SnowflakeSequence-setDatacenterId] datacenterId 不能大于31."); + } + + this.datacenterId = datacenterId; + } + + /** + * 下一个生成序号(带格式) + * @return + * @throws SeqException + */ + @Override + public String nextNo() throws SeqException { + return String.valueOf(nextValue()); + } + +} diff --git a/pigx-common/pigx-common-sequence/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/pigx-common/pigx-common-sequence/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 0000000..2e5c27f --- /dev/null +++ b/pigx-common/pigx-common-sequence/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1 @@ +com.pig4cloud.pigx.common.sequence.SequenceAutoConfiguration diff --git a/pigx-common/pigx-common-swagger/pom.xml b/pigx-common/pigx-common-swagger/pom.xml new file mode 100644 index 0000000..a8eaaeb --- /dev/null +++ b/pigx-common/pigx-common-swagger/pom.xml @@ -0,0 +1,58 @@ + + + 4.0.0 + + com.pig4cloud + pigx-common + 5.2.0 + + + pigx-common-swagger + jar + + pigx 接口文档 + + + + + + org.springdoc + springdoc-openapi-webmvc-core + + + org.springdoc + springdoc-openapi-security + + + io.swagger.core.v3 + swagger-annotations + + + + org.springframework + spring-webflux + provided + + + + org.springframework.cloud + spring-cloud-gateway-server + provided + + + org.springframework.cloud + spring-cloud-commons + provided + + + org.springframework + spring-webmvc + provided + + + com.pig4cloud + pigx-common-core + + + diff --git a/pigx-common/pigx-common-swagger/src/main/java/com/pig4cloud/pigx/common/swagger/annotation/EnableOpenApi.java b/pigx-common/pigx-common-swagger/src/main/java/com/pig4cloud/pigx/common/swagger/annotation/EnableOpenApi.java new file mode 100644 index 0000000..c15241f --- /dev/null +++ b/pigx-common/pigx-common-swagger/src/main/java/com/pig4cloud/pigx/common/swagger/annotation/EnableOpenApi.java @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2020 pig4cloud Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.pig4cloud.pigx.common.swagger.annotation; + +import com.pig4cloud.pigx.common.core.factory.YamlPropertySourceFactory; +import com.pig4cloud.pigx.common.swagger.config.OpenAPIDefinitionImportSelector; +import com.pig4cloud.pigx.common.swagger.support.SwaggerProperties; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Import; +import org.springframework.context.annotation.PropertySource; + +import java.lang.annotation.*; + +/** + * 开启 pig spring doc + * + * @author lengleng + * @date 2022-03-26 + */ +@Target({ ElementType.TYPE }) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@Inherited +@EnableConfigurationProperties(SwaggerProperties.class) +@Import({ OpenAPIDefinitionImportSelector.class }) +@PropertySource(value = "classpath:openapi-config.yaml", factory = YamlPropertySourceFactory.class) +public @interface EnableOpenApi { + + /** + * 网关路由前缀 + * @return String + */ + String value() default ""; + + /** + * 是否是微服务架构 + * @return true + */ + boolean isMicro() default true; + +} diff --git a/pigx-common/pigx-common-swagger/src/main/java/com/pig4cloud/pigx/common/swagger/config/OpenAPIDefinition.java b/pigx-common/pigx-common-swagger/src/main/java/com/pig4cloud/pigx/common/swagger/config/OpenAPIDefinition.java new file mode 100644 index 0000000..f2d6ed0 --- /dev/null +++ b/pigx-common/pigx-common-swagger/src/main/java/com/pig4cloud/pigx/common/swagger/config/OpenAPIDefinition.java @@ -0,0 +1,93 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ +package com.pig4cloud.pigx.common.swagger.config; + +import com.pig4cloud.pigx.common.swagger.support.SwaggerProperties; +import io.swagger.v3.oas.models.OpenAPI; +import io.swagger.v3.oas.models.info.Info; +import io.swagger.v3.oas.models.security.OAuthFlow; +import io.swagger.v3.oas.models.security.OAuthFlows; +import io.swagger.v3.oas.models.security.Scopes; +import io.swagger.v3.oas.models.security.SecurityScheme; +import io.swagger.v3.oas.models.servers.Server; +import lombok.RequiredArgsConstructor; +import lombok.Setter; +import org.springdoc.core.SpringDocUtils; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.http.HttpHeaders; + +import java.util.ArrayList; +import java.util.List; + +/** + * swagger配置 + * + *

+ * 禁用方法1:使用注解@Profile({"dev","test"}) + *

+ * 表示在开发或测试环境开启,而在生产关闭。(推荐使用) 禁用方法2:使用注解@ConditionalOnProperty(name = "swagger.enable", + *

+ * havingValue = "true") 然后在测试配置或者开发配置中添加swagger.enable=true即可开启,生产环境不填则默认关闭Swagger. + *

+ * + * @author lengleng + */ +@RequiredArgsConstructor +@ConditionalOnProperty(name = "swagger.enabled", matchIfMissing = true) +public class OpenAPIDefinition extends OpenAPI implements InitializingBean, ApplicationContextAware { + + @Setter + private String path; + + private ApplicationContext applicationContext; + + private SecurityScheme securityScheme(SwaggerProperties swaggerProperties) { + OAuthFlow clientCredential = new OAuthFlow(); + clientCredential.setTokenUrl(swaggerProperties.getTokenUrl()); + clientCredential.setScopes(new Scopes().addString(swaggerProperties.getScope(), swaggerProperties.getScope())); + OAuthFlows oauthFlows = new OAuthFlows(); + oauthFlows.password(clientCredential); + SecurityScheme securityScheme = new SecurityScheme(); + securityScheme.setType(SecurityScheme.Type.OAUTH2); + securityScheme.setFlows(oauthFlows); + return securityScheme; + } + + @Override + public void afterPropertiesSet() throws Exception { + SwaggerProperties swaggerProperties = applicationContext.getBean(SwaggerProperties.class); + this.info(new Info().title(swaggerProperties.getTitle())); + // oauth2.0 password + this.schemaRequirement(HttpHeaders.AUTHORIZATION, this.securityScheme(swaggerProperties)); + // servers + List serverList = new ArrayList<>(); + serverList.add(new Server().url(swaggerProperties.getGateway() + "/" + path)); + this.servers(serverList); + // 支持参数平铺 + SpringDocUtils.getConfig().addSimpleTypesForParameterObject(Class.class); + } + + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + this.applicationContext = applicationContext; + } + +} diff --git a/pigx-common/pigx-common-swagger/src/main/java/com/pig4cloud/pigx/common/swagger/config/OpenAPIDefinitionImportSelector.java b/pigx-common/pigx-common-swagger/src/main/java/com/pig4cloud/pigx/common/swagger/config/OpenAPIDefinitionImportSelector.java new file mode 100644 index 0000000..78f8f75 --- /dev/null +++ b/pigx-common/pigx-common-swagger/src/main/java/com/pig4cloud/pigx/common/swagger/config/OpenAPIDefinitionImportSelector.java @@ -0,0 +1,47 @@ +package com.pig4cloud.pigx.common.swagger.config; + +import com.pig4cloud.pigx.common.swagger.annotation.EnableOpenApi; +import org.springframework.beans.factory.support.BeanDefinitionBuilder; +import org.springframework.beans.factory.support.BeanDefinitionRegistry; +import org.springframework.context.annotation.ImportBeanDefinitionRegistrar; +import org.springframework.core.type.AnnotationMetadata; + +import java.util.Map; +import java.util.Objects; + +/** + * openapi 配置类 + * + * @author lengleng + * @date 2023/1/1 + */ +public class OpenAPIDefinitionImportSelector implements ImportBeanDefinitionRegistrar { + + @Override + public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) { + + Map annotationAttributes = metadata.getAnnotationAttributes(EnableOpenApi.class.getName(), + true); + Object value = annotationAttributes.get("value"); + if (Objects.isNull(value)) { + return; + } + + BeanDefinitionBuilder definition = BeanDefinitionBuilder.genericBeanDefinition(OpenAPIDefinition.class); + definition.addPropertyValue("path", value); + + registry.registerBeanDefinition("openAPIDefinition", definition.getBeanDefinition()); + + // 如果是微服务架构则,引入了服务发现声明相关的元数据配置 + Object isMicro = annotationAttributes.getOrDefault("isMicro", true); + if (isMicro.equals(false)) { + return; + } + + BeanDefinitionBuilder openAPIMetadata = BeanDefinitionBuilder + .genericBeanDefinition(OpenAPIMetadataConfiguration.class); + openAPIMetadata.addPropertyValue("path", value); + registry.registerBeanDefinition("openAPIMetadata", openAPIMetadata.getBeanDefinition()); + } + +} diff --git a/pigx-common/pigx-common-swagger/src/main/java/com/pig4cloud/pigx/common/swagger/config/OpenAPIMetadataConfiguration.java b/pigx-common/pigx-common-swagger/src/main/java/com/pig4cloud/pigx/common/swagger/config/OpenAPIMetadataConfiguration.java new file mode 100644 index 0000000..5e6f5f4 --- /dev/null +++ b/pigx-common/pigx-common-swagger/src/main/java/com/pig4cloud/pigx/common/swagger/config/OpenAPIMetadataConfiguration.java @@ -0,0 +1,32 @@ +package com.pig4cloud.pigx.common.swagger.config; + +import lombok.Setter; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.cloud.client.ServiceInstance; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; + +/** + * @author lengleng + * @date 2023/1/4 + */ +public class OpenAPIMetadataConfiguration implements InitializingBean, ApplicationContextAware { + + private ApplicationContext applicationContext; + + @Setter + private String path; + + @Override + public void afterPropertiesSet() throws Exception { + ServiceInstance serviceInstance = applicationContext.getBean(ServiceInstance.class); + serviceInstance.getMetadata().put("spring-doc", path); + } + + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + this.applicationContext = applicationContext; + } + +} diff --git a/pigx-common/pigx-common-swagger/src/main/java/com/pig4cloud/pigx/common/swagger/support/SwaggerProperties.java b/pigx-common/pigx-common-swagger/src/main/java/com/pig4cloud/pigx/common/swagger/support/SwaggerProperties.java new file mode 100644 index 0000000..189c8e2 --- /dev/null +++ b/pigx-common/pigx-common-swagger/src/main/java/com/pig4cloud/pigx/common/swagger/support/SwaggerProperties.java @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ +package com.pig4cloud.pigx.common.swagger.support; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * SwaggerProperties + * + * @author lengleng + * @date 2018/7/25 14:00 + */ +@Data +@ConfigurationProperties("swagger") +public class SwaggerProperties { + + /** + * 是否开启swagger + */ + private Boolean enabled = true; + + /** + * swagger会解析的包路径 + **/ + private String basePackage = ""; + + /** + * swagger会解析的url规则 + **/ + private List basePath = new ArrayList<>(); + + /** + * 在basePath基础上需要排除的url规则 + **/ + private List excludePath = new ArrayList<>(); + + /** + * 需要排除的服务 + */ + private List ignoreProviders = new ArrayList<>(); + + /** + * 标题 + **/ + private String title = ""; + + /** + * 网关 + */ + private String gateway; + + /** + * 获取token + */ + private String tokenUrl; + + /** + * 作用域 + */ + private String scope; + + /** + * 服务转发配置 + */ + private Map services; + +} diff --git a/pigx-common/pigx-common-swagger/src/main/resources/openapi-config.yaml b/pigx-common/pigx-common-swagger/src/main/resources/openapi-config.yaml new file mode 100644 index 0000000..d66404b --- /dev/null +++ b/pigx-common/pigx-common-swagger/src/main/resources/openapi-config.yaml @@ -0,0 +1,7 @@ +# swagger 配置 +swagger: + enabled: true + title: PigX Swagger API + gateway: http://${GATEWAY-HOST:pigx-gateway}:${GATEWAY-PORT:9999} + token-url: ${swagger.gateway}/auth/oauth2/token + scope: server diff --git a/pigx-common/pigx-common-websocket/pom.xml b/pigx-common/pigx-common-websocket/pom.xml new file mode 100644 index 0000000..be19e24 --- /dev/null +++ b/pigx-common/pigx-common-websocket/pom.xml @@ -0,0 +1,38 @@ + + + 4.0.0 + + com.pig4cloud + pigx-common + 5.2.0 + + + pigx-common-websocket + jar + + pigx websocket + + + + org.springframework.boot + spring-boot-starter-websocket + + + + org.springframework.data + spring-data-redis + + + + cn.hutool + hutool-json + + + + com.pig4cloud + pigx-common-security + + + diff --git a/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/config/LocalMessageDistributorConfiguration.java b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/config/LocalMessageDistributorConfiguration.java new file mode 100644 index 0000000..91bfafa --- /dev/null +++ b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/config/LocalMessageDistributorConfiguration.java @@ -0,0 +1,30 @@ +package com.pig4cloud.pigx.common.websocket.config; + +import com.pig4cloud.pigx.common.websocket.distribute.LocalMessageDistributor; +import com.pig4cloud.pigx.common.websocket.distribute.MessageDistributor; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * 本地的消息分发器配置 + * + * @author hccake + */ +@ConditionalOnProperty(prefix = WebSocketProperties.PREFIX, name = "message-distributor", + havingValue = MessageDistributorTypeConstants.LOCAL) +@Configuration(proxyBeanMethods = false) +public class LocalMessageDistributorConfiguration { + + /** + * 本地基于内存的消息分发,不支持集群 + * @return LocalMessageDistributor + */ + @Bean + @ConditionalOnMissingBean(MessageDistributor.class) + public LocalMessageDistributor messageDistributor() { + return new LocalMessageDistributor(); + } + +} diff --git a/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/config/MessageDistributorTypeConstants.java b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/config/MessageDistributorTypeConstants.java new file mode 100644 index 0000000..4fec3d6 --- /dev/null +++ b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/config/MessageDistributorTypeConstants.java @@ -0,0 +1,26 @@ +package com.pig4cloud.pigx.common.websocket.config; + +/** + * @author hccake + */ +public final class MessageDistributorTypeConstants { + + private MessageDistributorTypeConstants() { + } + + /** + * 本地 + */ + public static final String LOCAL = "local"; + + /** + * 基于 Redis PUB/SUB + */ + public static final String REDIS = "redis"; + + /** + * 自定义 + */ + public static final String CUSTOM = "custom"; + +} diff --git a/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/config/RedisMessageDistributorConfiguration.java b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/config/RedisMessageDistributorConfiguration.java new file mode 100644 index 0000000..5f934b1 --- /dev/null +++ b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/config/RedisMessageDistributorConfiguration.java @@ -0,0 +1,70 @@ +package com.pig4cloud.pigx.common.websocket.config; + +import com.pig4cloud.pigx.common.websocket.distribute.MessageDistributor; +import com.pig4cloud.pigx.common.websocket.distribute.RedisMessageDistributor; +import com.pig4cloud.pigx.common.websocket.distribute.RedisWebsocketMessageListener; +import lombok.RequiredArgsConstructor; +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.data.redis.listener.PatternTopic; +import org.springframework.data.redis.listener.RedisMessageListenerContainer; + +import javax.annotation.PostConstruct; + +/** + * 基于 Redis Pub/Sub 的消息分发器 + * + * @author hccake + */ +@ConditionalOnClass(StringRedisTemplate.class) +@ConditionalOnProperty(prefix = WebSocketProperties.PREFIX, name = "message-distributor", + havingValue = MessageDistributorTypeConstants.REDIS, matchIfMissing = true) +@Configuration(proxyBeanMethods = false) +public class RedisMessageDistributorConfiguration { + + @Bean + @ConditionalOnMissingBean(MessageDistributor.class) + public RedisMessageDistributor messageDistributor(StringRedisTemplate stringRedisTemplate) { + return new RedisMessageDistributor(stringRedisTemplate); + } + + @Bean + @ConditionalOnBean(RedisMessageDistributor.class) + @ConditionalOnMissingBean + public RedisWebsocketMessageListener redisWebsocketMessageListener(StringRedisTemplate stringRedisTemplate) { + return new RedisWebsocketMessageListener(stringRedisTemplate); + } + + @Bean + @ConditionalOnBean(RedisMessageDistributor.class) + @ConditionalOnMissingBean + public RedisMessageListenerContainer redisMessageListenerContainer(RedisConnectionFactory connectionFactory) { + RedisMessageListenerContainer container = new RedisMessageListenerContainer(); + container.setConnectionFactory(connectionFactory); + return container; + } + + @Configuration(proxyBeanMethods = false) + @ConditionalOnMissingBean(MessageDistributor.class) + @RequiredArgsConstructor + static class RedisMessageListenerRegisterConfiguration { + + private final RedisMessageListenerContainer redisMessageListenerContainer; + + private final RedisWebsocketMessageListener redisWebsocketMessageListener; + + @PostConstruct + public void addMessageListener() { + redisMessageListenerContainer.addMessageListener(redisWebsocketMessageListener, + new PatternTopic(RedisWebsocketMessageListener.CHANNEL)); + } + + } + +} diff --git a/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/config/WebSocketAutoConfiguration.java b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/config/WebSocketAutoConfiguration.java new file mode 100644 index 0000000..d72248d --- /dev/null +++ b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/config/WebSocketAutoConfiguration.java @@ -0,0 +1,50 @@ +package com.pig4cloud.pigx.common.websocket.config; + +import com.pig4cloud.pigx.common.websocket.handler.JsonMessageHandler; +import com.pig4cloud.pigx.common.websocket.holder.JsonMessageHandlerHolder; +import lombok.RequiredArgsConstructor; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Import; +import org.springframework.web.socket.WebSocketHandler; +import org.springframework.web.socket.config.annotation.EnableWebSocket; +import org.springframework.web.socket.config.annotation.WebSocketConfigurer; +import org.springframework.web.socket.server.HandshakeInterceptor; + +import javax.annotation.PostConstruct; +import java.util.List; + +/** + * websocket自动配置 + * + * @author Yakir + */ +@Import(WebSocketHandlerConfig.class) +@EnableWebSocket +@RequiredArgsConstructor +public class WebSocketAutoConfiguration { + + private final WebSocketProperties webSocketProperties; + + private final List jsonMessageHandlerList; + + @Bean + @ConditionalOnMissingBean + public WebSocketConfigurer webSocketConfigurer(List handshakeInterceptor, + WebSocketHandler webSocketHandler) { + return registry -> registry.addHandler(webSocketHandler, webSocketProperties.getPath()) + .setAllowedOrigins(webSocketProperties.getAllowOrigins()) + .addInterceptors(handshakeInterceptor.toArray(new HandshakeInterceptor[0])); + } + + /** + * 初始化时将所有的jsonMessageHandler注册到JsonMessageHandlerHolder中 + */ + @PostConstruct + public void initJsonMessageHandlerHolder() { + for (JsonMessageHandler jsonMessageHandler : jsonMessageHandlerList) { + JsonMessageHandlerHolder.addHandler(jsonMessageHandler); + } + } + +} diff --git a/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/config/WebSocketHandlerConfig.java b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/config/WebSocketHandlerConfig.java new file mode 100644 index 0000000..73b2693 --- /dev/null +++ b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/config/WebSocketHandlerConfig.java @@ -0,0 +1,78 @@ +package com.pig4cloud.pigx.common.websocket.config; + +import com.pig4cloud.pigx.common.websocket.custom.PigxSessionKeyGenerator; +import com.pig4cloud.pigx.common.websocket.custom.UserAttributeHandshakeInterceptor; +import com.pig4cloud.pigx.common.websocket.handler.CustomPlanTextMessageHandler; +import com.pig4cloud.pigx.common.websocket.handler.CustomWebSocketHandler; +import com.pig4cloud.pigx.common.websocket.handler.PingJsonMessageHandler; +import com.pig4cloud.pigx.common.websocket.handler.PlanTextMessageHandler; +import com.pig4cloud.pigx.common.websocket.holder.MapSessionWebSocketHandlerDecorator; +import com.pig4cloud.pigx.common.websocket.holder.SessionKeyGenerator; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.web.socket.WebSocketHandler; +import org.springframework.web.socket.handler.TextWebSocketHandler; +import org.springframework.web.socket.server.HandshakeInterceptor; + +/** + * @author Hccake 2021/1/5 + * @version 1.0 + */ +@RequiredArgsConstructor +@EnableConfigurationProperties(WebSocketProperties.class) +public class WebSocketHandlerConfig { + + private final WebSocketProperties webSocketProperties; + + @Bean + @ConditionalOnMissingBean(SessionKeyGenerator.class) + public SessionKeyGenerator sessionKeyGenerator() { + return new PigxSessionKeyGenerator(); + } + + @Bean + public HandshakeInterceptor handshakeInterceptor() { + return new UserAttributeHandshakeInterceptor(); + } + + @Bean + @ConditionalOnMissingBean(PlanTextMessageHandler.class) + public PlanTextMessageHandler planTextMessageHandler() { + return new CustomPlanTextMessageHandler(); + } + + @Bean + @ConditionalOnMissingBean({ TextWebSocketHandler.class, PlanTextMessageHandler.class }) + public WebSocketHandler webSocketHandler1(@Autowired(required = false) SessionKeyGenerator sessionKeyGenerator) { + CustomWebSocketHandler customWebSocketHandler = new CustomWebSocketHandler(); + if (webSocketProperties.isMapSession()) { + return new MapSessionWebSocketHandlerDecorator(customWebSocketHandler, sessionKeyGenerator); + } + return customWebSocketHandler; + } + + @Bean + @ConditionalOnBean(PlanTextMessageHandler.class) + @ConditionalOnMissingBean(TextWebSocketHandler.class) + public WebSocketHandler webSocketHandler2(@Autowired(required = false) SessionKeyGenerator sessionKeyGenerator, + PlanTextMessageHandler planTextMessageHandler) { + CustomWebSocketHandler customWebSocketHandler = new CustomWebSocketHandler(planTextMessageHandler); + if (webSocketProperties.isMapSession()) { + return new MapSessionWebSocketHandlerDecorator(customWebSocketHandler, sessionKeyGenerator); + } + return customWebSocketHandler; + } + + @Bean + @ConditionalOnProperty(prefix = WebSocketProperties.PREFIX, name = "heartbeat", havingValue = "true", + matchIfMissing = true) + public PingJsonMessageHandler pingJsonMessageHandler() { + return new PingJsonMessageHandler(); + } + +} diff --git a/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/config/WebSocketMessageSender.java b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/config/WebSocketMessageSender.java new file mode 100644 index 0000000..8c4455a --- /dev/null +++ b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/config/WebSocketMessageSender.java @@ -0,0 +1,61 @@ +package com.pig4cloud.pigx.common.websocket.config; + +import cn.hutool.json.JSONUtil; +import com.pig4cloud.pigx.common.websocket.holder.WebSocketSessionHolder; +import com.pig4cloud.pigx.common.websocket.message.JsonWebSocketMessage; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.socket.TextMessage; +import org.springframework.web.socket.WebSocketSession; + +import java.io.IOException; +import java.util.Collection; + +/** + * @author Hccake 2021/1/4 + * @version 1.0 + */ +@Slf4j +public class WebSocketMessageSender { + + public static void broadcast(String message) { + Collection sessions = WebSocketSessionHolder.getSessions(); + for (WebSocketSession session : sessions) { + send(session, message); + } + } + + public static boolean send(Object sessionKey, String message) { + WebSocketSession session = WebSocketSessionHolder.getSession(sessionKey); + if (session == null) { + log.info("[send] 当前 sessionKey:{} 对应 session 不在本服务中", sessionKey); + return false; + } + else { + return send(session, message); + } + } + + public static void send(WebSocketSession session, JsonWebSocketMessage message) { + send(session, JSONUtil.toJsonStr(message)); + } + + public static boolean send(WebSocketSession session, String message) { + if (session == null) { + log.error("[send] session 为 null"); + return false; + } + if (!session.isOpen()) { + log.error("[send] session 已经关闭"); + return false; + } + try { + session.sendMessage(new TextMessage(message)); + } + catch (IOException e) { + log.error("[send] session({}) 发送消息({}) 异常", session, message, e); + return false; + } + return true; + } + +} diff --git a/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/config/WebSocketProperties.java b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/config/WebSocketProperties.java new file mode 100644 index 0000000..ed3e9e2 --- /dev/null +++ b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/config/WebSocketProperties.java @@ -0,0 +1,49 @@ +package com.pig4cloud.pigx.common.websocket.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; + +/** + * websocket props + * + * @author Yakir + */ +@Data +@ConfigurationProperties(WebSocketProperties.PREFIX) +public class WebSocketProperties { + + public static final String PREFIX = "pigx.websocket"; + + /** + * 路径: 无参: /ws 有参: PathVariable: 单参: /ws/{test} 多参: /ws/{test1}/{test2} query: + * /ws?uid=1&name=test + * + */ + private String path = "/ws/info"; + + /** + * 允许访问源 + */ + private String allowOrigins = "*"; + + /** + * 是否支持部分消息 + */ + private boolean supportPartialMessages = false; + + /** + * 心跳处理 + */ + private boolean heartbeat = true; + + /** + * 是否开启对session的映射记录 + */ + private boolean mapSession = true; + + /** + * 消息分发器:local | redis,默认 local, 如果自定义的话,可以配置为其他任意值 + */ + private String messageDistributor = MessageDistributorTypeConstants.LOCAL; + +} diff --git a/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/custom/PigxSessionKeyGenerator.java b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/custom/PigxSessionKeyGenerator.java new file mode 100644 index 0000000..cdb447b --- /dev/null +++ b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/custom/PigxSessionKeyGenerator.java @@ -0,0 +1,36 @@ +package com.pig4cloud.pigx.common.websocket.custom; + +import com.pig4cloud.pigx.common.security.service.PigxUser; +import com.pig4cloud.pigx.common.websocket.holder.SessionKeyGenerator; +import lombok.RequiredArgsConstructor; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.socket.WebSocketSession; + +/** + * @author lengleng + * @date 2021/10/4 websocket session 标识生成规则 + */ +@Configuration +@RequiredArgsConstructor +public class PigxSessionKeyGenerator implements SessionKeyGenerator { + + /** + * 获取当前session的唯一标识 + * @param webSocketSession 当前session + * @return session唯一标识 + */ + @Override + public Object sessionKey(WebSocketSession webSocketSession) { + + Object obj = webSocketSession.getAttributes().get("USER_KEY_ATTR_NAME"); + + if (obj instanceof PigxUser) { + PigxUser user = (PigxUser) obj; + // userId 作为唯一区分 + return String.valueOf(user.getId()); + } + + return null; + } + +} diff --git a/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/custom/UserAttributeHandshakeInterceptor.java b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/custom/UserAttributeHandshakeInterceptor.java new file mode 100644 index 0000000..d2d58ef --- /dev/null +++ b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/custom/UserAttributeHandshakeInterceptor.java @@ -0,0 +1,52 @@ +package com.pig4cloud.pigx.common.websocket.custom; + +import com.pig4cloud.pigx.common.security.service.PigxUser; +import com.pig4cloud.pigx.common.security.util.SecurityUtils; +import org.springframework.http.server.ServerHttpRequest; +import org.springframework.http.server.ServerHttpResponse; +import org.springframework.web.socket.WebSocketHandler; +import org.springframework.web.socket.server.HandshakeInterceptor; + +import java.util.Map; + +/** + * @author lengleng + * @date 2021/10/4 + */ +public class UserAttributeHandshakeInterceptor implements HandshakeInterceptor { + + /** + * Invoked before the handshake is processed. + * @param request the current request + * @param response the current response + * @param wsHandler the target WebSocket handler + * @param attributes the attributes from the HTTP handshake to associate with the + * WebSocket session; the provided attributes are copied, the original map is not + * used. + * @return whether to proceed with the handshake ({@code true}) or abort + * ({@code false}) + */ + @Override + public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, + Map attributes) throws Exception { + // 由于 WebSocket 握手是由 http 升级的,携带 token 已经被 Security 拦截验证了,所以可以直接获取到用户 + PigxUser user = SecurityUtils.getUser(); + attributes.put("USER_KEY_ATTR_NAME", user); + return true; + } + + /** + * Invoked after the handshake is done. The response status and headers indicate the + * results of the handshake, i.e. whether it was successful or not. + * @param request the current request + * @param response the current response + * @param wsHandler the target WebSocket handler + * @param exception an exception raised during the handshake, or {@code null} if none + */ + @Override + public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, + Exception exception) { + + } + +} diff --git a/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/distribute/LocalMessageDistributor.java b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/distribute/LocalMessageDistributor.java new file mode 100644 index 0000000..d50da90 --- /dev/null +++ b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/distribute/LocalMessageDistributor.java @@ -0,0 +1,20 @@ +package com.pig4cloud.pigx.common.websocket.distribute; + +/** + * 本地消息分发,直接进行发送 + * + * @author Hccake 2021/1/12 + * @version 1.0 + */ +public class LocalMessageDistributor implements MessageDistributor, MessageSender { + + /** + * 消息分发 + * @param messageDO 发送的消息 + */ + @Override + public void distribute(MessageDO messageDO) { + doSend(messageDO); + } + +} diff --git a/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/distribute/MessageDO.java b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/distribute/MessageDO.java new file mode 100644 index 0000000..9b19336 --- /dev/null +++ b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/distribute/MessageDO.java @@ -0,0 +1,39 @@ +package com.pig4cloud.pigx.common.websocket.distribute; + +import lombok.Data; +import lombok.experimental.Accessors; + +import java.util.List; + +/** + * @author Hccake 2021/1/12 + * @version 1.0 + */ +@Data +@Accessors(chain = true) +public class MessageDO { + + /** + * 是否广播 + */ + private Boolean needBroadcast; + + /** + * sessionKeys + */ + private List sessionKeys; + + /** + * 需要发送的消息文本 + */ + private String messageText; + + /** + * 构建需要广播的message + * @author lingting 2021-03-25 17:28 + */ + public static MessageDO broadcastMessage(String text) { + return new MessageDO().setMessageText(text).setNeedBroadcast(true); + } + +} diff --git a/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/distribute/MessageDistributor.java b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/distribute/MessageDistributor.java new file mode 100644 index 0000000..d067b35 --- /dev/null +++ b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/distribute/MessageDistributor.java @@ -0,0 +1,17 @@ +package com.pig4cloud.pigx.common.websocket.distribute; + +/** + * 消息分发器 + * + * @author Hccake 2021/1/12 + * @version 1.0 + */ +public interface MessageDistributor { + + /** + * 消息分发 + * @param messageDO 发送的消息 + */ + void distribute(MessageDO messageDO); + +} diff --git a/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/distribute/MessageSender.java b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/distribute/MessageSender.java new file mode 100644 index 0000000..82f759c --- /dev/null +++ b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/distribute/MessageSender.java @@ -0,0 +1,34 @@ +package com.pig4cloud.pigx.common.websocket.distribute; + +import cn.hutool.core.collection.CollectionUtil; +import com.pig4cloud.pigx.common.websocket.config.WebSocketMessageSender; + +import java.util.List; + +/** + * @author Hccake 2021/1/12 + * @version 1.0 + */ +public interface MessageSender { + + /** + * 发送消息 + * @param messageDO 发送的消息 + */ + default void doSend(MessageDO messageDO) { + Boolean needBroadcast = messageDO.getNeedBroadcast(); + String messageText = messageDO.getMessageText(); + List sessionKeys = messageDO.getSessionKeys(); + if (needBroadcast != null && needBroadcast) { + // 广播信息 + WebSocketMessageSender.broadcast(messageText); + } + else if (CollectionUtil.isNotEmpty(sessionKeys)) { + // 指定用户发送 + for (Object sessionKey : sessionKeys) { + WebSocketMessageSender.send(sessionKey, messageText); + } + } + } + +} diff --git a/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/distribute/RedisMessageDistributor.java b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/distribute/RedisMessageDistributor.java new file mode 100644 index 0000000..6bc4603 --- /dev/null +++ b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/distribute/RedisMessageDistributor.java @@ -0,0 +1,35 @@ +package com.pig4cloud.pigx.common.websocket.distribute; + +import cn.hutool.json.JSONUtil; +import lombok.RequiredArgsConstructor; +import org.springframework.data.redis.core.StringRedisTemplate; + +import java.util.ArrayList; +import java.util.List; + +/** + * 消息分发器 + * + * @author Hccake 2021/1/12 + * @version 1.0 + */ +@RequiredArgsConstructor +public class RedisMessageDistributor implements MessageDistributor { + + private final StringRedisTemplate stringRedisTemplate; + + /** + * 消息分发 + * @param messageDO 发送的消息 + */ + @Override + public void distribute(MessageDO messageDO) { + // 包装 sessionKey 适配分布式多环境 + List sessionKeyList = new ArrayList<>(messageDO.getSessionKeys()); + messageDO.setSessionKeys(sessionKeyList); + + String str = JSONUtil.toJsonStr(messageDO); + stringRedisTemplate.convertAndSend(RedisWebsocketMessageListener.CHANNEL, str); + } + +} diff --git a/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/distribute/RedisWebsocketMessageListener.java b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/distribute/RedisWebsocketMessageListener.java new file mode 100644 index 0000000..c2faa43 --- /dev/null +++ b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/distribute/RedisWebsocketMessageListener.java @@ -0,0 +1,41 @@ +package com.pig4cloud.pigx.common.websocket.distribute; + +import cn.hutool.json.JSONUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.data.redis.connection.Message; +import org.springframework.data.redis.connection.MessageListener; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.data.redis.serializer.RedisSerializer; + +/** + * redis订阅 websocket 发送消息,接收到消息时进行推送 + * + * @author Hccake 2021/1/12 + * @version 1.0 + */ +@Slf4j +@RequiredArgsConstructor +public class RedisWebsocketMessageListener implements MessageListener, MessageSender { + + public static final String CHANNEL = "websocket-send"; + + private final StringRedisTemplate stringRedisTemplate; + + @Override + public void onMessage(Message message, byte[] bytes) { + log.info("redis channel Listener message send {}", message); + byte[] channelBytes = message.getChannel(); + RedisSerializer stringSerializer = stringRedisTemplate.getStringSerializer(); + String channel = stringSerializer.deserialize(channelBytes); + + // 这里没有使用通配符,所以一定是true + if (CHANNEL.equals(channel)) { + byte[] bodyBytes = message.getBody(); + String body = stringSerializer.deserialize(bodyBytes); + MessageDO messageDO = JSONUtil.toBean(body, MessageDO.class); + doSend(messageDO); + } + } + +} diff --git a/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/handler/CustomPlanTextMessageHandler.java b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/handler/CustomPlanTextMessageHandler.java new file mode 100644 index 0000000..117ca3d --- /dev/null +++ b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/handler/CustomPlanTextMessageHandler.java @@ -0,0 +1,25 @@ +package com.pig4cloud.pigx.common.websocket.handler; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.socket.WebSocketSession; + +/** + * @author lengleng + * @date 2021/11/4 + * + * 默认消息处理 + */ +@Slf4j +public class CustomPlanTextMessageHandler implements PlanTextMessageHandler { + + /** + * 普通文本消息处理 + * @param session 当前接收消息的session + * @param message 文本消息 + */ + @Override + public void handle(WebSocketSession session, String message) { + log.info("sessionId {} ,msg {}", session.getId(), message); + } + +} diff --git a/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/handler/CustomWebSocketHandler.java b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/handler/CustomWebSocketHandler.java new file mode 100644 index 0000000..2b76a46 --- /dev/null +++ b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/handler/CustomWebSocketHandler.java @@ -0,0 +1,73 @@ +package com.pig4cloud.pigx.common.websocket.handler; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.json.JsonReadFeature; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.pig4cloud.pigx.common.websocket.holder.JsonMessageHandlerHolder; +import com.pig4cloud.pigx.common.websocket.message.AbstractJsonWebSocketMessage; +import com.pig4cloud.pigx.common.websocket.message.JsonWebSocketMessage; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.socket.TextMessage; +import org.springframework.web.socket.WebSocketSession; +import org.springframework.web.socket.handler.TextWebSocketHandler; + +/** + * @author Hccake 2020/12/31 + * @version 1.0 + */ +@Slf4j +public class CustomWebSocketHandler extends TextWebSocketHandler { + + private static final ObjectMapper MAPPER = new ObjectMapper(); + + static { + // 有特殊需要转义字符, 不报错 + MAPPER.enable(JsonReadFeature.ALLOW_UNESCAPED_CONTROL_CHARS.mappedFeature()); + } + + private PlanTextMessageHandler planTextMessageHandler; + + public CustomWebSocketHandler() { + } + + public CustomWebSocketHandler(PlanTextMessageHandler planTextMessageHandler) { + this.planTextMessageHandler = planTextMessageHandler; + } + + @Override + public void handleTextMessage(WebSocketSession session, TextMessage message) throws JsonProcessingException { + // 空消息不处理 + if (message.getPayloadLength() == 0) { + return; + } + + // 消息类型必有一属性type,先解析,获取该属性 + String payload = message.getPayload(); + JsonNode jsonNode = MAPPER.readTree(payload); + JsonNode typeNode = jsonNode.get(AbstractJsonWebSocketMessage.TYPE_FIELD); + + if (typeNode == null) { + if (planTextMessageHandler != null) { + planTextMessageHandler.handle(session, payload); + } + else { + log.error("[handleTextMessage] 普通文本消息({})没有对应的消息处理器", payload); + } + } + else { + String messageType = typeNode.asText(); + // 获得对应的消息处理器 + JsonMessageHandler jsonMessageHandler = JsonMessageHandlerHolder.getHandler(messageType); + if (jsonMessageHandler == null) { + log.error("[handleTextMessage] 消息类型({})不存在对应的消息处理器", messageType); + return; + } + // 消息处理 + Class messageClass = jsonMessageHandler.getMessageClass(); + JsonWebSocketMessage websocketMessageJson = MAPPER.treeToValue(jsonNode, messageClass); + jsonMessageHandler.handle(session, websocketMessageJson); + } + } + +} diff --git a/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/handler/JsonMessageHandler.java b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/handler/JsonMessageHandler.java new file mode 100644 index 0000000..bc61850 --- /dev/null +++ b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/handler/JsonMessageHandler.java @@ -0,0 +1,31 @@ +package com.pig4cloud.pigx.common.websocket.handler; + +import com.pig4cloud.pigx.common.websocket.message.JsonWebSocketMessage; +import org.springframework.web.socket.WebSocketSession; + +/** + * @author Hccake 2021/1/4 + * @version 1.0 + */ +public interface JsonMessageHandler { + + /** + * JsonWebSocketMessage 类型消息处理 + * @param session 当前接收 session + * @param message 当前接收到的 message + */ + void handle(WebSocketSession session, T message); + + /** + * 当前处理器处理的消息类型 + * @return messageType + */ + String type(); + + /** + * 当前处理器对应的消息Class + * @return Class + */ + Class getMessageClass(); + +} diff --git a/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/handler/PingJsonMessageHandler.java b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/handler/PingJsonMessageHandler.java new file mode 100644 index 0000000..52283a5 --- /dev/null +++ b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/handler/PingJsonMessageHandler.java @@ -0,0 +1,34 @@ +package com.pig4cloud.pigx.common.websocket.handler; + +import com.pig4cloud.pigx.common.websocket.config.WebSocketMessageSender; +import com.pig4cloud.pigx.common.websocket.message.JsonWebSocketMessage; +import com.pig4cloud.pigx.common.websocket.message.PingJsonWebSocketMessage; +import com.pig4cloud.pigx.common.websocket.message.PongJsonWebSocketMessage; +import com.pig4cloud.pigx.common.websocket.message.WebSocketMessageTypeEnum; +import org.springframework.web.socket.WebSocketSession; + +/** + * 心跳处理,接收到客户端的ping时,立刻回复一个pong + * + * @author Hccake 2021/1/4 + * @version 1.0 + */ +public class PingJsonMessageHandler implements JsonMessageHandler { + + @Override + public void handle(WebSocketSession session, PingJsonWebSocketMessage message) { + JsonWebSocketMessage pongJsonWebSocketMessage = new PongJsonWebSocketMessage(); + WebSocketMessageSender.send(session, pongJsonWebSocketMessage); + } + + @Override + public String type() { + return WebSocketMessageTypeEnum.PING.getValue(); + } + + @Override + public Class getMessageClass() { + return PingJsonWebSocketMessage.class; + } + +} diff --git a/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/handler/PlanTextMessageHandler.java b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/handler/PlanTextMessageHandler.java new file mode 100644 index 0000000..478bd9a --- /dev/null +++ b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/handler/PlanTextMessageHandler.java @@ -0,0 +1,21 @@ +package com.pig4cloud.pigx.common.websocket.handler; + +import org.springframework.web.socket.WebSocketSession; + +/** + * 普通文本类型(非指定json类型)的消息处理器 即消息不满足于我们定义的Json类型消息时,所使用的处理器 + * + * @see com.pig4cloud.pigx.common.websocket.message.JsonWebSocketMessage + * @author Hccake 2021/1/5 + * @version 1.0 + */ +public interface PlanTextMessageHandler { + + /** + * 普通文本消息处理 + * @param session 当前接收消息的session + * @param message 文本消息 + */ + void handle(WebSocketSession session, String message); + +} diff --git a/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/holder/JsonMessageHandlerHolder.java b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/holder/JsonMessageHandlerHolder.java new file mode 100644 index 0000000..411addd --- /dev/null +++ b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/holder/JsonMessageHandlerHolder.java @@ -0,0 +1,27 @@ +package com.pig4cloud.pigx.common.websocket.holder; + +import com.pig4cloud.pigx.common.websocket.handler.JsonMessageHandler; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * @author Hccake 2021/1/4 + * @version 1.0 + */ +public final class JsonMessageHandlerHolder { + + private JsonMessageHandlerHolder() { + } + + private static final Map MESSAGE_HANDLER_MAP = new ConcurrentHashMap<>(); + + public static JsonMessageHandler getHandler(String type) { + return MESSAGE_HANDLER_MAP.get(type); + } + + public static void addHandler(JsonMessageHandler jsonMessageHandler) { + MESSAGE_HANDLER_MAP.put(jsonMessageHandler.type(), jsonMessageHandler); + } + +} diff --git a/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/holder/MapSessionWebSocketHandlerDecorator.java b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/holder/MapSessionWebSocketHandlerDecorator.java new file mode 100644 index 0000000..7c82554 --- /dev/null +++ b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/holder/MapSessionWebSocketHandlerDecorator.java @@ -0,0 +1,46 @@ +package com.pig4cloud.pigx.common.websocket.holder; + +import org.springframework.web.socket.CloseStatus; +import org.springframework.web.socket.WebSocketHandler; +import org.springframework.web.socket.WebSocketSession; +import org.springframework.web.socket.handler.WebSocketHandlerDecorator; + +/** + * WebSocketHandler 装饰器,该装饰器主要用于在开启和关闭连接时,进行session的映射存储与释放 + * + * @author Hccake 2020/12/31 + * @version 1.0 + */ +public class MapSessionWebSocketHandlerDecorator extends WebSocketHandlerDecorator { + + private final SessionKeyGenerator sessionKeyGenerator; + + public MapSessionWebSocketHandlerDecorator(WebSocketHandler delegate, SessionKeyGenerator sessionKeyGenerator) { + super(delegate); + this.sessionKeyGenerator = sessionKeyGenerator; + } + + /** + * websocket 连接时执行的动作 + * @param session websocket session 对象 + * @throws Exception 异常对象 + */ + @Override + public void afterConnectionEstablished(final WebSocketSession session) throws Exception { + Object sessionKey = sessionKeyGenerator.sessionKey(session); + WebSocketSessionHolder.addSession(sessionKey, session); + } + + /** + * websocket 关闭连接时执行的动作 + * @param session websocket session 对象 + * @param closeStatus 关闭状态对象 + * @throws Exception 异常对象 + */ + @Override + public void afterConnectionClosed(final WebSocketSession session, CloseStatus closeStatus) throws Exception { + Object sessionKey = sessionKeyGenerator.sessionKey(session); + WebSocketSessionHolder.removeSession(sessionKey); + } + +} diff --git a/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/holder/SessionKeyGenerator.java b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/holder/SessionKeyGenerator.java new file mode 100644 index 0000000..b7f16b8 --- /dev/null +++ b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/holder/SessionKeyGenerator.java @@ -0,0 +1,20 @@ +package com.pig4cloud.pigx.common.websocket.holder; + +import org.springframework.web.socket.WebSocketSession; + +/** + * WebSocketSession 唯一标识生成器 + * + * @author Hccake 2021/1/5 + * @version 1.0 + */ +public interface SessionKeyGenerator { + + /** + * 获取当前session的唯一标识 + * @param webSocketSession 当前session + * @return session唯一标识 + */ + Object sessionKey(WebSocketSession webSocketSession); + +} diff --git a/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/holder/WebSocketSessionHolder.java b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/holder/WebSocketSessionHolder.java new file mode 100644 index 0000000..35cac61 --- /dev/null +++ b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/holder/WebSocketSessionHolder.java @@ -0,0 +1,65 @@ +package com.pig4cloud.pigx.common.websocket.holder; + +import org.springframework.web.socket.WebSocketSession; + +import java.util.Collection; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; + +/** + * WebSocketSession 持有者 主要用于保存当前所有在线的会话信息 + * + * @author Hccake 2021/1/4 + * @version 1.0 + */ +public final class WebSocketSessionHolder { + + private WebSocketSessionHolder() { + } + + private static final Map USER_SESSION_MAP = new ConcurrentHashMap<>(); + + /** + * 添加一个 session + * @param sessionKey session 唯一标识 + * @param session 待添加的 WebSocketSession + */ + public static void addSession(Object sessionKey, WebSocketSession session) { + USER_SESSION_MAP.put(sessionKey.toString(), session); + } + + /** + * 删除一个 session + * @param sessionKey session唯一标识 + */ + public static void removeSession(Object sessionKey) { + USER_SESSION_MAP.remove(sessionKey.toString()); + } + + /** + * 获取指定标识的 session + * @param sessionKey session唯一标识 + * @return WebSocketSession 该标识对应的 session + */ + public static WebSocketSession getSession(Object sessionKey) { + return USER_SESSION_MAP.get(sessionKey.toString()); + } + + /** + * 获取当前所有在线的 session + * @return Collection session集合 + */ + public static Collection getSessions() { + return USER_SESSION_MAP.values(); + } + + /** + * 获取所有在线的用户标识 + * @return Set session唯一标识集合 + */ + public static Set getSessionKeys() { + return USER_SESSION_MAP.keySet(); + } + +} diff --git a/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/message/AbstractJsonWebSocketMessage.java b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/message/AbstractJsonWebSocketMessage.java new file mode 100644 index 0000000..9a14e9b --- /dev/null +++ b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/message/AbstractJsonWebSocketMessage.java @@ -0,0 +1,22 @@ +package com.pig4cloud.pigx.common.websocket.message; + +/** + * @author Hccake 2021/1/4 + * @version 1.0 + */ +public abstract class AbstractJsonWebSocketMessage implements JsonWebSocketMessage { + + public static final String TYPE_FIELD = "type"; + + private final String type; + + protected AbstractJsonWebSocketMessage(String type) { + this.type = type; + } + + @Override + public String getType() { + return type; + } + +} diff --git a/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/message/JsonWebSocketMessage.java b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/message/JsonWebSocketMessage.java new file mode 100644 index 0000000..12d8a5f --- /dev/null +++ b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/message/JsonWebSocketMessage.java @@ -0,0 +1,15 @@ +package com.pig4cloud.pigx.common.websocket.message; + +/** + * @author Hccake 2021/1/4 + * @version 1.0 + */ +public interface JsonWebSocketMessage { + + /** + * 消息类型,主要用于匹配对应的消息处理器 + * @return 当前消息类型 + */ + String getType(); + +} diff --git a/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/message/PingJsonWebSocketMessage.java b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/message/PingJsonWebSocketMessage.java new file mode 100644 index 0000000..a61f4fa --- /dev/null +++ b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/message/PingJsonWebSocketMessage.java @@ -0,0 +1,13 @@ +package com.pig4cloud.pigx.common.websocket.message; + +/** + * @author Hccake 2021/1/4 + * @version 1.0 + */ +public class PingJsonWebSocketMessage extends AbstractJsonWebSocketMessage { + + public PingJsonWebSocketMessage() { + super(WebSocketMessageTypeEnum.PING.getValue()); + } + +} diff --git a/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/message/PongJsonWebSocketMessage.java b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/message/PongJsonWebSocketMessage.java new file mode 100644 index 0000000..9d73f55 --- /dev/null +++ b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/message/PongJsonWebSocketMessage.java @@ -0,0 +1,13 @@ +package com.pig4cloud.pigx.common.websocket.message; + +/** + * @author Hccake 2021/1/4 + * @version 1.0 + */ +public class PongJsonWebSocketMessage extends AbstractJsonWebSocketMessage { + + public PongJsonWebSocketMessage() { + super(WebSocketMessageTypeEnum.PONG.getValue()); + } + +} diff --git a/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/message/WebSocketMessageTypeEnum.java b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/message/WebSocketMessageTypeEnum.java new file mode 100644 index 0000000..951cbab --- /dev/null +++ b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/message/WebSocketMessageTypeEnum.java @@ -0,0 +1,18 @@ +package com.pig4cloud.pigx.common.websocket.message; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +/** + * @author Hccake 2021/1/4 + * @version 1.0 + */ +@Getter +@RequiredArgsConstructor +public enum WebSocketMessageTypeEnum { + + PING("ping"), PONG("pong"); + + private final String value; + +} diff --git a/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/package-info.java b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/package-info.java new file mode 100644 index 0000000..723b808 --- /dev/null +++ b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/package-info.java @@ -0,0 +1,5 @@ +/** + * 此包内代码 来源至 BallCat 关于BallCat: 组织旨在为项目快速开发提供一系列的基础能力,方便使用者根据项目需求快速进行功能拓展。 + * https://github.com/ballcat-projects/ballcat + */ +package com.pig4cloud.pigx.common.websocket; diff --git a/pigx-common/pigx-common-websocket/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/pigx-common/pigx-common-websocket/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 0000000..4e14257 --- /dev/null +++ b/pigx-common/pigx-common-websocket/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1,3 @@ +com.pig4cloud.pigx.common.websocket.config.WebSocketAutoConfiguration +com.pig4cloud.pigx.common.websocket.config.RedisMessageDistributorConfiguration +com.pig4cloud.pigx.common.websocket.config.LocalMessageDistributorConfiguration diff --git a/pigx-common/pigx-common-xss/pom.xml b/pigx-common/pigx-common-xss/pom.xml new file mode 100644 index 0000000..84d7f20 --- /dev/null +++ b/pigx-common/pigx-common-xss/pom.xml @@ -0,0 +1,44 @@ + + + 4.0.0 + + com.pig4cloud + pigx-common + 5.2.0 + + + pigx-common-xss + jar + + pigx xss 安全过滤插件 基于 JSOUP + + + + cn.hutool + hutool-core + + + + org.jsoup + jsoup + + + + org.springframework + spring-webmvc + + + + com.fasterxml.jackson.core + jackson-databind + + + + javax.servlet + javax.servlet-api + provided + + + diff --git a/pigx-common/pigx-common-xss/src/main/java/com/pig4cloud/pigx/common/xss/PigxXssAutoConfiguration.java b/pigx-common/pigx-common-xss/src/main/java/com/pig4cloud/pigx/common/xss/PigxXssAutoConfiguration.java new file mode 100644 index 0000000..64a3745 --- /dev/null +++ b/pigx-common/pigx-common-xss/src/main/java/com/pig4cloud/pigx/common/xss/PigxXssAutoConfiguration.java @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2019-2029, Dreamlu 卢春梦 (596392912@qq.com & www.dreamlu.net). + *

+ * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE 3.0; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.gnu.org/licenses/lgpl.html + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.pig4cloud.pigx.common.xss; + +import com.pig4cloud.pigx.common.xss.config.PigxXssProperties; +import com.pig4cloud.pigx.common.xss.core.*; +import lombok.RequiredArgsConstructor; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.Ordered; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +import java.util.List; + +/** + * jackson xss 配置 + * + * @author L.cm + */ +@RequiredArgsConstructor +@Configuration(proxyBeanMethods = false) +@EnableConfigurationProperties(PigxXssProperties.class) +@ConditionalOnProperty(prefix = PigxXssProperties.PREFIX, name = "enabled", havingValue = "true", matchIfMissing = true) +public class PigxXssAutoConfiguration implements WebMvcConfigurer { + + private final PigxXssProperties xssProperties; + + @Bean + @ConditionalOnMissingBean + public XssCleaner xssCleaner(PigxXssProperties properties) { + return new DefaultXssCleaner(properties); + } + + @Bean + @ConditionalOnMissingBean + public FormXssClean formXssClean(PigxXssProperties properties, XssCleaner xssCleaner) { + return new FormXssClean(properties, xssCleaner); + } + + @Bean + public Jackson2ObjectMapperBuilderCustomizer xssJacksonCustomizer(PigxXssProperties properties, + XssCleaner xssCleaner) { + JacksonXssClean xssClean = new JacksonXssClean(properties, xssCleaner); + return builder -> builder.deserializerByType(String.class, xssClean); + } + + @Override + public void addInterceptors(InterceptorRegistry registry) { + List patterns = xssProperties.getPathPatterns(); + if (patterns.isEmpty()) { + patterns.add("/**"); + } + XssCleanInterceptor interceptor = new XssCleanInterceptor(xssProperties); + registry.addInterceptor(interceptor).addPathPatterns(patterns) + .excludePathPatterns(xssProperties.getPathExcludePatterns()).order(Ordered.LOWEST_PRECEDENCE); + } + +} diff --git a/pigx-common/pigx-common-xss/src/main/java/com/pig4cloud/pigx/common/xss/config/PigxXssProperties.java b/pigx-common/pigx-common-xss/src/main/java/com/pig4cloud/pigx/common/xss/config/PigxXssProperties.java new file mode 100644 index 0000000..f22cfd5 --- /dev/null +++ b/pigx-common/pigx-common-xss/src/main/java/com/pig4cloud/pigx/common/xss/config/PigxXssProperties.java @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2019-2029, Dreamlu 卢春梦 (596392912@qq.com & www.dreamlu.net). + *

+ * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE 3.0; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.gnu.org/licenses/lgpl.html + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.pig4cloud.pigx.common.xss.config; + +import lombok.Getter; +import lombok.Setter; +import org.springframework.boot.context.properties.ConfigurationProperties; + +import java.util.ArrayList; +import java.util.List; + +/** + * Xss配置类 + * + * @author L.cm + */ +@Getter +@Setter +@ConfigurationProperties(PigxXssProperties.PREFIX) +public class PigxXssProperties { + + public static final String PREFIX = "security.xss"; + + /** + * 开启xss,默认关闭: 建议生产环境开启 + */ + private boolean enabled = false; + + /** + * 全局:对文件进行首尾 trim + */ + private boolean trimText = true; + + /** + * 模式:clear 清理(默认),escape 转义 + */ + private Mode mode = Mode.clear; + + /** + * [clear 专用] prettyPrint,默认关闭: 保留换行 + */ + private boolean prettyPrint = false; + + /** + * [clear 专用] 使用转义,默认关闭 + */ + private boolean enableEscape = false; + + /** + * 拦截的路由,默认为空 + */ + private List pathPatterns = new ArrayList<>(); + + /** + * 放行的路由,默认为空 + */ + private List pathExcludePatterns = new ArrayList<>(); + + public enum Mode { + + /** + * 清理 + */ + clear, + /** + * 转义 + */ + escape; + + } + +} diff --git a/pigx-common/pigx-common-xss/src/main/java/com/pig4cloud/pigx/common/xss/core/DefaultXssCleaner.java b/pigx-common/pigx-common-xss/src/main/java/com/pig4cloud/pigx/common/xss/core/DefaultXssCleaner.java new file mode 100644 index 0000000..447b584 --- /dev/null +++ b/pigx-common/pigx-common-xss/src/main/java/com/pig4cloud/pigx/common/xss/core/DefaultXssCleaner.java @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2019-2029, Dreamlu 卢春梦 (596392912@qq.com & www.dreamlu.net). + *

+ * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE 3.0; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.gnu.org/licenses/lgpl.html + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.pig4cloud.pigx.common.xss.core; + +import cn.hutool.core.util.CharsetUtil; +import com.pig4cloud.pigx.common.xss.config.PigxXssProperties; +import com.pig4cloud.pigx.common.xss.utils.XssUtil; +import lombok.RequiredArgsConstructor; +import org.jsoup.Jsoup; +import org.jsoup.internal.StringUtil; +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Entities; +import org.jsoup.safety.Cleaner; +import org.springframework.web.util.HtmlUtils; + +/** + * 默认的 xss 清理器 + * + * @author L.cm + */ +@RequiredArgsConstructor +public class DefaultXssCleaner implements XssCleaner { + + private final PigxXssProperties properties; + + @Override + public String clean(String bodyHtml) { + // 1. 为空直接返回 + if (StringUtil.isBlank(bodyHtml)) { + return bodyHtml; + } + PigxXssProperties.Mode mode = properties.getMode(); + if (PigxXssProperties.Mode.escape == mode) { + // html 转义 + return HtmlUtils.htmlEscape(bodyHtml, CharsetUtil.UTF_8); + } + else { + // jsoup html 清理 + Document.OutputSettings outputSettings = new Document.OutputSettings() + // 2. 转义,没找到关闭的方法,目前这个规则最少 + .escapeMode(Entities.EscapeMode.xhtml) + // 3. 保留换行 + .prettyPrint(properties.isPrettyPrint()); + Document dirty = Jsoup.parseBodyFragment(bodyHtml, ""); + Cleaner cleaner = new Cleaner(XssUtil.WHITE_LIST); + Document clean = cleaner.clean(dirty); + clean.outputSettings(outputSettings); + // 4. 清理后的 html + String escapedHtml = clean.body().html(); + if (properties.isEnableEscape()) { + return escapedHtml; + } + // 5. 反转义 + return Entities.unescape(escapedHtml); + } + } + +} diff --git a/pigx-common/pigx-common-xss/src/main/java/com/pig4cloud/pigx/common/xss/core/FormXssClean.java b/pigx-common/pigx-common-xss/src/main/java/com/pig4cloud/pigx/common/xss/core/FormXssClean.java new file mode 100644 index 0000000..a1cadce --- /dev/null +++ b/pigx-common/pigx-common-xss/src/main/java/com/pig4cloud/pigx/common/xss/core/FormXssClean.java @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2019-2029, Dreamlu 卢春梦 (596392912@qq.com & www.dreamlu.net). + *

+ * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE 3.0; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.gnu.org/licenses/lgpl.html + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.pig4cloud.pigx.common.xss.core; + +import cn.hutool.core.util.StrUtil; +import com.pig4cloud.pigx.common.xss.config.PigxXssProperties; +import com.pig4cloud.pigx.common.xss.utils.XssUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.WebDataBinder; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.InitBinder; + +import java.beans.PropertyEditorSupport; + +/** + * 表单 xss 处理 + * + * @author L.cm + */ +@ControllerAdvice +@RequiredArgsConstructor +public class FormXssClean { + + private final PigxXssProperties properties; + + private final XssCleaner xssCleaner; + + @InitBinder + public void initBinder(WebDataBinder binder) { + // 处理前端传来的表单字符串 + binder.registerCustomEditor(String.class, new StringPropertiesEditor(xssCleaner, properties)); + } + + @Slf4j + @RequiredArgsConstructor + public static class StringPropertiesEditor extends PropertyEditorSupport { + + private final XssCleaner xssCleaner; + + private final PigxXssProperties properties; + + @Override + public String getAsText() { + Object value = getValue(); + return value != null ? value.toString() : StrUtil.EMPTY; + } + + @Override + public void setAsText(String text) throws IllegalArgumentException { + if (text == null) { + setValue(null); + } + else if (XssHolder.isEnabled()) { + String value = xssCleaner.clean(XssUtil.trim(text, properties.isTrimText())); + setValue(value); + log.debug("Request parameter value:{} cleaned up by mica-xss, current value is:{}.", text, value); + } + else { + setValue(XssUtil.trim(text, properties.isTrimText())); + } + } + + } + +} diff --git a/pigx-common/pigx-common-xss/src/main/java/com/pig4cloud/pigx/common/xss/core/JacksonXssClean.java b/pigx-common/pigx-common-xss/src/main/java/com/pig4cloud/pigx/common/xss/core/JacksonXssClean.java new file mode 100644 index 0000000..e187f6b --- /dev/null +++ b/pigx-common/pigx-common-xss/src/main/java/com/pig4cloud/pigx/common/xss/core/JacksonXssClean.java @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2019-2029, Dreamlu 卢春梦 (596392912@qq.com & www.dreamlu.net). + *

+ * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE 3.0; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.gnu.org/licenses/lgpl.html + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.pig4cloud.pigx.common.xss.core; + +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonDeserializer; +import com.pig4cloud.pigx.common.xss.config.PigxXssProperties; +import com.pig4cloud.pigx.common.xss.utils.XssUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +import java.io.IOException; + +/** + * jackson xss 处理 + * + * @author L.cm + */ +@Slf4j +@RequiredArgsConstructor +public class JacksonXssClean extends JsonDeserializer { + + private final PigxXssProperties properties; + + private final XssCleaner xssCleaner; + + @Override + public String deserialize(JsonParser p, DeserializationContext ctx) throws IOException { + // XSS filter + String text = p.getValueAsString(); + if (text == null) { + return null; + } + if (XssHolder.isEnabled()) { + String value = xssCleaner.clean(XssUtil.trim(text, properties.isTrimText())); + log.debug("Json property value:{} cleaned up by mica-xss, current value is:{}.", text, value); + return value; + } + else { + return XssUtil.trim(text, properties.isTrimText()); + } + } + +} diff --git a/pigx-common/pigx-common-xss/src/main/java/com/pig4cloud/pigx/common/xss/core/XssCleanIgnore.java b/pigx-common/pigx-common-xss/src/main/java/com/pig4cloud/pigx/common/xss/core/XssCleanIgnore.java new file mode 100644 index 0000000..7b91e4a --- /dev/null +++ b/pigx-common/pigx-common-xss/src/main/java/com/pig4cloud/pigx/common/xss/core/XssCleanIgnore.java @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2019-2029, Dreamlu 卢春梦 (596392912@qq.com & www.dreamlu.net). + *

+ * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE 3.0; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.gnu.org/licenses/lgpl.html + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.pig4cloud.pigx.common.xss.core; + +import java.lang.annotation.*; + +/** + * 忽略 xss + * + * @author L.cm + */ +@Target({ ElementType.TYPE, ElementType.METHOD }) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface XssCleanIgnore { + +} diff --git a/pigx-common/pigx-common-xss/src/main/java/com/pig4cloud/pigx/common/xss/core/XssCleanInterceptor.java b/pigx-common/pigx-common-xss/src/main/java/com/pig4cloud/pigx/common/xss/core/XssCleanInterceptor.java new file mode 100644 index 0000000..5665f3e --- /dev/null +++ b/pigx-common/pigx-common-xss/src/main/java/com/pig4cloud/pigx/common/xss/core/XssCleanInterceptor.java @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2019-2029, Dreamlu 卢春梦 (596392912@qq.com & www.dreamlu.net). + *

+ * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE 3.0; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.gnu.org/licenses/lgpl.html + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.pig4cloud.pigx.common.xss.core; + +import com.pig4cloud.pigx.common.xss.config.PigxXssProperties; +import lombok.RequiredArgsConstructor; +import org.springframework.core.annotation.AnnotationUtils; +import org.springframework.web.method.HandlerMethod; +import org.springframework.web.servlet.AsyncHandlerInterceptor; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * xss 处理拦截器 + * + * @author L.cm + */ +@RequiredArgsConstructor +public class XssCleanInterceptor implements AsyncHandlerInterceptor { + + private final PigxXssProperties xssProperties; + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) + throws Exception { + // 1. 非控制器请求直接跳出 + if (!(handler instanceof HandlerMethod)) { + return true; + } + // 2. 没有开启 + if (!xssProperties.isEnabled()) { + return true; + } + // 3. 处理 XssIgnore 注解 + HandlerMethod handlerMethod = (HandlerMethod) handler; + XssCleanIgnore xssCleanIgnore = AnnotationUtils.getAnnotation(handlerMethod.getMethod(), XssCleanIgnore.class); + if (xssCleanIgnore == null) { + XssHolder.setEnable(); + } + return true; + } + + @Override + public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) + throws Exception { + XssHolder.remove(); + } + + @Override + public void afterConcurrentHandlingStarted(HttpServletRequest request, HttpServletResponse response, Object handler) + throws Exception { + XssHolder.remove(); + } + +} diff --git a/pigx-common/pigx-common-xss/src/main/java/com/pig4cloud/pigx/common/xss/core/XssCleaner.java b/pigx-common/pigx-common-xss/src/main/java/com/pig4cloud/pigx/common/xss/core/XssCleaner.java new file mode 100644 index 0000000..dc75036 --- /dev/null +++ b/pigx-common/pigx-common-xss/src/main/java/com/pig4cloud/pigx/common/xss/core/XssCleaner.java @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2019-2029, Dreamlu 卢春梦 (596392912@qq.com & www.dreamlu.net). + *

+ * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE 3.0; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.gnu.org/licenses/lgpl.html + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.pig4cloud.pigx.common.xss.core; + +/** + * xss 清理器 + * + * @author L.cm + */ +public interface XssCleaner { + + /** + * 清理 html + * @param html html + * @return 清理后的数据 + */ + String clean(String html); + +} diff --git a/pigx-common/pigx-common-xss/src/main/java/com/pig4cloud/pigx/common/xss/core/XssHolder.java b/pigx-common/pigx-common-xss/src/main/java/com/pig4cloud/pigx/common/xss/core/XssHolder.java new file mode 100644 index 0000000..fddc97b --- /dev/null +++ b/pigx-common/pigx-common-xss/src/main/java/com/pig4cloud/pigx/common/xss/core/XssHolder.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2019-2029, Dreamlu 卢春梦 (596392912@qq.com & www.dreamlu.net). + *

+ * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE 3.0; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.gnu.org/licenses/lgpl.html + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.pig4cloud.pigx.common.xss.core; + +/** + * 利用 ThreadLocal 缓存线程间的数据 + * + * @author L.cm + */ +class XssHolder { + + private static final ThreadLocal TL = new ThreadLocal<>(); + + public static boolean isEnabled() { + return Boolean.TRUE.equals(TL.get()); + } + + public static void setEnable() { + TL.set(Boolean.TRUE); + } + + public static void remove() { + TL.remove(); + } + +} diff --git a/pigx-common/pigx-common-xss/src/main/java/com/pig4cloud/pigx/common/xss/package-info.java b/pigx-common/pigx-common-xss/src/main/java/com/pig4cloud/pigx/common/xss/package-info.java new file mode 100644 index 0000000..ec60a7e --- /dev/null +++ b/pigx-common/pigx-common-xss/src/main/java/com/pig4cloud/pigx/common/xss/package-info.java @@ -0,0 +1,4 @@ +/** + * 此包代码来源至: https://gitee.com/596392912/mica/tree/master/mica-xss + */ +package com.pig4cloud.pigx.common.xss; diff --git a/pigx-common/pigx-common-xss/src/main/java/com/pig4cloud/pigx/common/xss/utils/XssUtil.java b/pigx-common/pigx-common-xss/src/main/java/com/pig4cloud/pigx/common/xss/utils/XssUtil.java new file mode 100644 index 0000000..4c838ad --- /dev/null +++ b/pigx-common/pigx-common-xss/src/main/java/com/pig4cloud/pigx/common/xss/utils/XssUtil.java @@ -0,0 +1,120 @@ +/* + * Copyright (c) 2016-2020, Michael Yang 杨福海 (fuhai999@gmail.com). + *

+ * Licensed under the GNU Lesser General Public License (LGPL) ,Version 3.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.gnu.org/licenses/lgpl-3.0.txt + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.pig4cloud.pigx.common.xss.utils; + +import org.jsoup.Jsoup; +import org.jsoup.nodes.Attribute; +import org.jsoup.nodes.Element; +import org.springframework.util.StringUtils; + +/** + * xss clean + * + *

+ * 参考自 jpress:https://gitee.com/fuhai/jpress + *

+ * + * @author L.cm + * @author michael + */ +public class XssUtil { + + public static final HtmlWhitelist WHITE_LIST = new HtmlWhitelist(); + + /** + * trim 字符串 + * @param text text + * @return 清理后的 text + */ + public static String trim(String text, boolean trim) { + return trim ? StringUtils.trimWhitespace(text) : text; + } + + /** + * xss 清理 + * @param html html + * @return 清理后的 html + */ + public static String clean(String html) { + if (StringUtils.hasText(html)) { + return Jsoup.clean(html, WHITE_LIST); + } + return html; + } + + /** + * 做自己的白名单,允许base64的图片通过等 + * + * @author michael + */ + public static class HtmlWhitelist extends org.jsoup.safety.Whitelist { + + public HtmlWhitelist() { + addTags("a", "b", "blockquote", "br", "caption", "cite", "code", "col", "colgroup", "dd", "div", "span", + "embed", "object", "dl", "dt", "em", "h1", "h2", "h3", "h4", "h5", "h6", "i", "img", "li", "ol", + "p", "pre", "q", "small", "strike", "strong", "sub", "sup", "table", "tbody", "td", "tfoot", "th", + "thead", "tr", "u", "ul"); + + addAttributes("a", "href", "title", "target"); + addAttributes("blockquote", "cite"); + addAttributes("col", "span"); + addAttributes("colgroup", "span"); + addAttributes("img", "align", "alt", "src", "title"); + addAttributes("ol", "start"); + addAttributes("q", "cite"); + addAttributes("table", "summary"); + addAttributes("td", "abbr", "axis", "colspan", "rowspan", "width"); + addAttributes("th", "abbr", "axis", "colspan", "rowspan", "scope", "width"); + addAttributes("video", "src", "autoplay", "controls", "loop", "muted", "poster", "preload"); + addAttributes("object", "width", "height", "classid", "codebase"); + addAttributes("param", "name", "value"); + addAttributes("embed", "src", "quality", "width", "height", "allowFullScreen", "allowScriptAccess", + "flashvars", "name", "type", "pluginspage"); + + addAttributes(":all", "class", "style", "height", "width", "type", "id", "name"); + + addProtocols("blockquote", "cite", "http", "https"); + addProtocols("cite", "cite", "http", "https"); + addProtocols("q", "cite", "http", "https"); + + // 如果添加以下的协议,那么href 必须是http、 https 等开头,相对路径则被过滤掉了 + // addProtocols("a", "href", "ftp", "http", "https", "mailto", "tel"); + + // 如果添加以下的协议,那么src必须是http 或者 https 开头,相对路径则被过滤掉了, + // 所以必须注释掉,允许相对路径的图片资源 + // addProtocols("img", "src", "http", "https"); + } + + @Override + protected boolean isSafeAttribute(String tagName, Element el, Attribute attr) { + // 不允许 javascript 开头的 src 和 href + if ("src".equalsIgnoreCase(attr.getKey()) || "href".equalsIgnoreCase(attr.getKey())) { + String value = attr.getValue(); + if (StringUtils.hasText(value) && value.toLowerCase().startsWith("javascript")) { + return false; + } + } + // 允许 base64 的图片内容 + if ("img".equals(tagName) && "src".equals(attr.getKey()) && attr.getValue().startsWith("data:;base64")) { + return true; + } + return super.isSafeAttribute(tagName, el, attr); + } + + } + +} diff --git a/pigx-common/pigx-common-xss/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/pigx-common/pigx-common-xss/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 0000000..3134248 --- /dev/null +++ b/pigx-common/pigx-common-xss/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1 @@ +com.pig4cloud.pigx.common.xss.PigxXssAutoConfiguration diff --git a/pigx-common/pom.xml b/pigx-common/pom.xml new file mode 100644 index 0000000..fca8b05 --- /dev/null +++ b/pigx-common/pom.xml @@ -0,0 +1,39 @@ + + + 4.0.0 + + com.pig4cloud + pigx + 5.2.0 + + + pigx-common + pom + + pigx 公共聚合模块 + + + pigx-common-audit + pigx-common-bom + pigx-common-core + pigx-common-data + pigx-common-datasource + pigx-common-excel + pigx-common-encrypt-api + pigx-common-feign + pigx-common-gateway + pigx-common-gray + pigx-common-idempotent + pigx-common-job + pigx-common-log + pigx-common-oss + pigx-common-seata + pigx-common-security + pigx-common-sentinel + pigx-common-sequence + pigx-common-swagger + pigx-common-websocket + pigx-common-xss + + diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-api/pom.xml b/pigx-flow/pigx-flow-engine/pigx-flow-engine-api/pom.xml new file mode 100644 index 0000000..ee978d4 --- /dev/null +++ b/pigx-flow/pigx-flow-engine/pigx-flow-engine-api/pom.xml @@ -0,0 +1,37 @@ + + + 4.0.0 + + com.pig4cloud + pigx-flow-engine + 5.2.0 + + + pigx-flow-engine-api + + + + + com.pig4cloud + pigx-common-core + + + + com.baomidou + mybatis-plus-extension + + + + com.pig4cloud + pigx-common-feign + + + + com.pig4cloud + pigx-common-excel + + + diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-api/src/main/java/com/pig4cloud/pigx/flow/engine/api/feign/packge-info.java b/pigx-flow/pigx-flow-engine/pigx-flow-engine-api/src/main/java/com/pig4cloud/pigx/flow/engine/api/feign/packge-info.java new file mode 100644 index 0000000..cd55ef2 --- /dev/null +++ b/pigx-flow/pigx-flow-engine/pigx-flow-engine-api/src/main/java/com/pig4cloud/pigx/flow/engine/api/feign/packge-info.java @@ -0,0 +1,6 @@ +/* + @author pigx archetype + *

+ * feign client 存放目录,注意 @EnablePigxFeignClients 的扫描范围 + */ +package com.pig4cloud.pigx.flow.engine.api.feign; \ No newline at end of file diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-api/src/main/java/com/pig4cloud/pigx/flow/engine/constant/packge-info.java b/pigx-flow/pigx-flow-engine/pigx-flow-engine-api/src/main/java/com/pig4cloud/pigx/flow/engine/constant/packge-info.java new file mode 100644 index 0000000..1d2218b --- /dev/null +++ b/pigx-flow/pigx-flow-engine/pigx-flow-engine-api/src/main/java/com/pig4cloud/pigx/flow/engine/constant/packge-info.java @@ -0,0 +1,6 @@ +/* + * @author pigx archetype + *

+ * 常量和枚举定义 + */ +package com.pig4cloud.pigx.flow.engine.constant; \ No newline at end of file diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-api/src/main/java/com/pig4cloud/pigx/flow/engine/dto/packge-info.java b/pigx-flow/pigx-flow-engine/pigx-flow-engine-api/src/main/java/com/pig4cloud/pigx/flow/engine/dto/packge-info.java new file mode 100644 index 0000000..1a3f6aa --- /dev/null +++ b/pigx-flow/pigx-flow-engine/pigx-flow-engine-api/src/main/java/com/pig4cloud/pigx/flow/engine/dto/packge-info.java @@ -0,0 +1,6 @@ +/* + * @author pigx archetype + *

+ * DTO 存放目录 + */ +package com.pig4cloud.pigx.flow.engine.dto; \ No newline at end of file diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-api/src/main/java/com/pig4cloud/pigx/flow/engine/entity/packge-info.java b/pigx-flow/pigx-flow-engine/pigx-flow-engine-api/src/main/java/com/pig4cloud/pigx/flow/engine/entity/packge-info.java new file mode 100644 index 0000000..b120fd6 --- /dev/null +++ b/pigx-flow/pigx-flow-engine/pigx-flow-engine-api/src/main/java/com/pig4cloud/pigx/flow/engine/entity/packge-info.java @@ -0,0 +1,6 @@ +/* + * @author pigx archetype + *

+ * 实体 存放目录 + */ +package com.pig4cloud.pigx.flow.engine.entity; \ No newline at end of file diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/Dockerfile b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/Dockerfile new file mode 100644 index 0000000..c89bb65 --- /dev/null +++ b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/Dockerfile @@ -0,0 +1,18 @@ +FROM pig4cloud/java:8-jre + +MAINTAINER wangiegie@gmail.com + +ENV TZ=Asia/Shanghai +ENV JAVA_OPTS="-Xms512m -Xmx1024m -Djava.security.egd=file:/dev/./urandom" + +RUN ln -sf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone + +RUN mkdir -p /pigx-flow-engine + +WORKDIR /pigx-flow-engine + +EXPOSE 9020 + +ADD ./target/pigx-flow-engine-biz.jar ./ + +CMD sleep 60;java $JAVA_OPTS -jar pigx-flow-engine-biz.jar diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/pom.xml b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/pom.xml new file mode 100644 index 0000000..5b1cece --- /dev/null +++ b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/pom.xml @@ -0,0 +1,138 @@ + + + 4.0.0 + + com.pig4cloud + pigx-flow-engine + 5.2.0 + + + pigx-flow-engine-biz + + + + + org.flowable + flowable-bpmn-layout + ${flowable.version} + + + org.flowable + flowable-spring-boot-starter-process + ${flowable.version} + + + + com.pig4cloud + pigx-flow-task-api + + + + com.googlecode.aviator + aviator + + + + org.springframework.boot + spring-boot-starter-undertow + + + + org.springframework.boot + spring-boot-starter-web + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-config + + + + com.pig4cloud + pigx-common-data + + + + com.pig4cloud + pigx-common-security + + + + com.pig4cloud + pigx-common-xss + + + + com.pig4cloud + pigx-common-sentinel + + + + com.pig4cloud + pigx-common-feign + + + + com.pig4cloud + pigx-flow-engine-api + + + + com.pig4cloud + pigx-common-log + + + + com.baomidou + mybatis-plus-boot-starter + + + + com.alibaba + druid-spring-boot-starter + + + + com.mysql + mysql-connector-j + + + + com.pig4cloud + pigx-common-swagger + + + cn.hutool + hutool-cache + + + + org.springframework.boot + spring-boot-starter-test + + + com.dameng + DmJdbcDriver18 + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + io.fabric8 + docker-maven-plugin + + + + diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/PigxFlowEngineApplication.java b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/PigxFlowEngineApplication.java new file mode 100644 index 0000000..a757f7a --- /dev/null +++ b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/PigxFlowEngineApplication.java @@ -0,0 +1,26 @@ +package com.pig4cloud.pigx.flow.engine; + +import com.pig4cloud.pigx.common.feign.annotation.EnablePigxFeignClients; +import com.pig4cloud.pigx.common.security.annotation.EnablePigxResourceServer; +import com.pig4cloud.pigx.common.swagger.annotation.EnableOpenApi; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.client.discovery.EnableDiscoveryClient; + +/** + * @author pigx archetype + *

+ * 项目启动类 + */ +@EnableOpenApi("engine") +@EnablePigxFeignClients +@EnableDiscoveryClient +@EnablePigxResourceServer +@SpringBootApplication +public class PigxFlowEngineApplication { + + public static void main(String[] args) { + SpringApplication.run(PigxFlowEngineApplication.class, args); + } + +} diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/controller/EngineFlowController.java b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/controller/EngineFlowController.java new file mode 100644 index 0000000..dd6c858 --- /dev/null +++ b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/controller/EngineFlowController.java @@ -0,0 +1,285 @@ +package com.pig4cloud.pigx.flow.engine.controller; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DatePattern; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.RandomUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.flow.engine.utils.ModelUtil; +import com.pig4cloud.pigx.flow.task.dto.*; +import com.pig4cloud.pigx.flow.task.entity.Process; +import com.pig4cloud.pigx.flow.task.utils.NodeUtil; +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.flowable.bpmn.converter.BpmnXMLConverter; +import org.flowable.bpmn.model.BpmnModel; +import org.flowable.common.engine.impl.identity.Authentication; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.history.HistoricActivityInstance; +import org.flowable.engine.history.HistoricActivityInstanceQuery; +import org.flowable.engine.runtime.Execution; +import org.flowable.engine.runtime.ProcessInstance; +import org.flowable.task.api.TaskQuery; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.time.ZoneId; +import java.time.ZonedDateTime; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 工作流控制器 负责流程模型的创建、启动、审批等功能 + */ +@Slf4j +@RestController +@RequiredArgsConstructor +@RequestMapping("/flow") +public class EngineFlowController { + + private final TaskService taskService; + + private final HistoryService historyService; + + private final RepositoryService repositoryService; + + private final RuntimeService runtimeService; + + private final ObjectMapper objectMapper; + + /** + * 创建流程定义 + * @param map 创建参数 + * @return 流程定义ID + */ + @PostMapping("create") + @SneakyThrows + public R create(@RequestBody Map map) { + + Long userId = MapUtil.getLong(map, "userId"); + + Process process = MapUtil.get(map, "process", Process.class); + + String flowId = "P" + DateUtil.format(new Date(), DatePattern.PURE_DATETIME_MS_PATTERN) + + RandomUtil.randomString(5).toUpperCase(); + log.info("flowId={}", flowId); + BpmnModel bpmnModel = ModelUtil.buildBpmnModel(objectMapper.readValue(process.getProcess(), Node.class), + process.getName(), flowId); + { + byte[] bpmnBytess = new BpmnXMLConverter().convertToXML(bpmnModel); + String filename = "/tmp/flowable-deployment/" + flowId + ".bpmn20.xml"; + log.debug("部署时的模型文件:{}", filename); + FileUtil.writeBytes(bpmnBytess, filename); + } + repositoryService.createDeployment().addBpmnModel(StrUtil.format("{}.bpmn20.xml", "pig"), bpmnModel).deploy(); + + return R.ok(flowId); + } + + /** + * 启动流程实例 + * @param processInstanceParamDto 启动参数 + * @return 流程实例ID + */ + @PostMapping("/start") + public R start(@RequestBody ProcessInstanceParamDto processInstanceParamDto) { + Authentication.setAuthenticatedUserId(processInstanceParamDto.getStartUserId()); + ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processInstanceParamDto.getFlowId(), + processInstanceParamDto.getParamMap()); + + String processInstanceId = processInstance.getProcessInstanceId(); + return R.ok(processInstanceId); + + } + + /** + * 审批任务 + * @param taskId 任务ID + * @param approved 是否通过 + */ + @PostMapping("/approve") + public void approve(String taskId, boolean approved) { + Map variables = new HashMap<>(); + variables.put("approved", approved); + variables.put("ko", 10); + variables.put("assigneeListSub", CollUtil.newArrayList("aa", "bb")); + taskService.complete(taskId, variables); + + } + + /** + * 停止流程实例 + * @param taskParamDto 参数 + * @return 操作结果 + */ + @PostMapping("stopProcessInstance") + public R stopProcessInstance(@RequestBody TaskParamDto taskParamDto) { + List processInstanceIdList = taskParamDto.getProcessInstanceIdList(); + processInstanceIdList.forEach(processInstanceId -> { + // 查询流程实例 + ProcessInstance processInstance = runtimeService.createProcessInstanceQuery() + .processInstanceId(processInstanceId).singleResult(); + if (Optional.ofNullable(processInstance).isPresent()) { + // 查询执行实例 + List executionIds = runtimeService.createExecutionQuery().parentId(processInstanceId).list() + .stream().map(Execution::getId).collect(Collectors.toList()); + // 更改活动状态为结束 + runtimeService.createChangeActivityStateBuilder().moveExecutionsToSingleActivityId(executionIds, "end") + .changeState(); + } + }); + return R.ok(); + } + + /** + * 查询用户已办任务 + * @param taskQueryParamDto 查询参数 + * @return 分页任务信息 + */ + @PostMapping("/queryCompletedTask") + public R queryCompletedTask(@RequestBody TaskQueryParamDto taskQueryParamDto) { + HistoricActivityInstanceQuery historicActivityInstanceQuery = historyService + .createHistoricActivityInstanceQuery(); + HistoricActivityInstanceQuery activityInstanceQuery = historicActivityInstanceQuery + .taskAssignee(taskQueryParamDto.getAssign()).finished().orderByHistoricActivityInstanceEndTime().desc(); + + if (ArrayUtil.isNotEmpty(taskQueryParamDto.getTaskTime())) { + ZoneId zoneId = ZoneId.systemDefault(); + ZonedDateTime zonedBeforeDateTime = taskQueryParamDto.getTaskTime()[0].atZone(zoneId); + ZonedDateTime zonedAfterDateTime = taskQueryParamDto.getTaskTime()[1].atZone(zoneId); + Date beforeDate = Date.from(zonedBeforeDateTime.toInstant()); + Date afterDate = Date.from(zonedAfterDateTime.toInstant()); + activityInstanceQuery.finishedBefore(afterDate).finishedAfter(beforeDate); + } + + List list = activityInstanceQuery.listPage( + (taskQueryParamDto.getPageNum() - 1) * taskQueryParamDto.getPageSize(), + taskQueryParamDto.getPageSize()); + + long count = activityInstanceQuery.count(); + List taskDtoList = new ArrayList<>(); + + for (HistoricActivityInstance historicActivityInstance : list) { + String activityId = historicActivityInstance.getActivityId(); + String activityName = historicActivityInstance.getActivityName(); + String executionId = historicActivityInstance.getExecutionId(); + String taskId = historicActivityInstance.getTaskId(); + Date startTime = historicActivityInstance.getStartTime(); + Date endTime = historicActivityInstance.getEndTime(); + Long durationInMillis = historicActivityInstance.getDurationInMillis(); + String processInstanceId = historicActivityInstance.getProcessInstanceId(); + + String processDefinitionId = historicActivityInstance.getProcessDefinitionId(); + // 流程id + String flowId = NodeUtil.getFlowId(processDefinitionId); + + TaskDto taskDto = new TaskDto(); + taskDto.setFlowId(flowId); + taskDto.setTaskCreateTime(startTime); + taskDto.setTaskEndTime(endTime); + taskDto.setNodeId(activityId); + taskDto.setExecutionId(executionId); + taskDto.setProcessInstanceId(processInstanceId); + taskDto.setDurationInMillis(durationInMillis); + taskDto.setTaskId(taskId); + taskDto.setAssign(historicActivityInstance.getAssignee()); + taskDto.setTaskName(activityName); + + taskDtoList.add(taskDto); + } + + Page pageResultDto = new Page<>(); + pageResultDto.setTotal(count); + pageResultDto.setRecords(taskDtoList); + return R.ok(pageResultDto); + } + + /** + * 查询用户待办任务 + * @param taskQueryParamDto 查询参数 + * @return 分页任务信息 + */ + @PostMapping("/queryAssignTask") + public R queryAssignTask(@RequestBody TaskQueryParamDto taskQueryParamDto) { + + String assign = taskQueryParamDto.getAssign(); + + List taskDtoList = new ArrayList<>(); + + int pageIndex = taskQueryParamDto.getPageNum() - 1; + int pageSize = taskQueryParamDto.getPageSize(); + + Page pageResultDto = new Page<>(); + TaskQuery taskQuery = taskService.createTaskQuery().taskAssignee(assign).orderByTaskCreateTime().desc(); + if (StrUtil.isNotBlank(taskQueryParamDto.getProcessName())) { + List processInstanceList = runtimeService.createProcessInstanceQuery() + .processInstanceNameLikeIgnoreCase(taskQueryParamDto.getProcessName()).list(); + if (CollUtil.isNotEmpty(processInstanceList)) { + taskQuery.processInstanceIdIn(processInstanceList.stream().map(ProcessInstance::getProcessDefinitionId) + .collect(Collectors.toList())); + } + } + + if (ArrayUtil.isNotEmpty(taskQueryParamDto.getTaskTime())) { + ZoneId zoneId = ZoneId.systemDefault(); + ZonedDateTime zonedBeforeDateTime = taskQueryParamDto.getTaskTime()[0].atZone(zoneId); + ZonedDateTime zonedAfterDateTime = taskQueryParamDto.getTaskTime()[1].atZone(zoneId); + Date beforeDate = Date.from(zonedBeforeDateTime.toInstant()); + Date afterDate = Date.from(zonedAfterDateTime.toInstant()); + taskQuery.taskCreatedBefore(afterDate).taskCreatedAfter(beforeDate); + } + + taskQuery.listPage(pageIndex * pageSize, pageSize).forEach(task -> { + String taskId = task.getId(); + String processInstanceId = task.getProcessInstanceId(); + log.debug("(taskId) " + task.getName() + " processInstanceId={} executrionId={}", processInstanceId, + task.getExecutionId()); + + Map taskServiceVariables = taskService.getVariables(taskId); + Map runtimeServiceVariables = runtimeService.getVariables(processInstanceId); + Map variables = runtimeService.getVariables(task.getExecutionId()); + log.debug("任务变量:{}", JSONUtil.toJsonStr(taskServiceVariables)); + log.debug("流程节点:{}", JSONUtil.toJsonStr(runtimeServiceVariables)); + log.debug("执行节点变量:{}", JSONUtil.toJsonStr(variables)); + + String taskDefinitionKey = task.getTaskDefinitionKey(); + String processDefinitionId = task.getProcessDefinitionId(); + String flowId = NodeUtil.getFlowId(processDefinitionId); + + TaskDto taskDto = new TaskDto(); + taskDto.setFlowId(flowId); + taskDto.setTaskCreateTime(task.getCreateTime()); + taskDto.setNodeId(taskDefinitionKey); + taskDto.setParamMap(taskServiceVariables); + taskDto.setProcessInstanceId(processInstanceId); + taskDto.setTaskId(taskId); + taskDto.setAssign(task.getAssignee()); + taskDto.setTaskName(task.getName()); + + taskDtoList.add(taskDto); + }); + + long count = taskQuery.count(); + + log.debug("当前有" + count + " 个任务:"); + + pageResultDto.setTotal(count); + pageResultDto.setRecords(taskDtoList); + + return R.ok(pageResultDto); + } + +} diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/controller/EngineProcessInstanceController.java b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/controller/EngineProcessInstanceController.java new file mode 100644 index 0000000..b1025c9 --- /dev/null +++ b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/controller/EngineProcessInstanceController.java @@ -0,0 +1,69 @@ +package com.pig4cloud.pigx.flow.engine.controller; + +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.flow.task.dto.IndexPageStatistics; +import com.pig4cloud.pigx.flow.task.dto.VariableQueryParamDto; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.history.HistoricActivityInstanceQuery; +import org.flowable.task.api.TaskQuery; +import org.springframework.web.bind.annotation.*; + +import java.util.Map; + +/** + * 任务控制器 + */ +@RestController +@Slf4j +@RequiredArgsConstructor +@RequestMapping("/process-instance") +public class EngineProcessInstanceController { + + private final TaskService taskService; + + private final HistoryService historyService; + + private final RuntimeService runtimeService; + + /** + * 查询首页统计数量 + * @param userId 用户ID + * @return 统计结果 + */ + @GetMapping("querySimpleData") + public R querySimpleData(long userId) { + TaskQuery taskQuery = taskService.createTaskQuery(); + + // 待办数量 + long pendingNum = taskQuery.taskAssignee(String.valueOf(userId)).count(); + // 已完成任务 + HistoricActivityInstanceQuery historicActivityInstanceQuery = historyService + .createHistoricActivityInstanceQuery(); + + long completedNum = historicActivityInstanceQuery.taskAssignee(String.valueOf(userId)).finished().count(); + + IndexPageStatistics indexPageStatistics = IndexPageStatistics.builder().pendingNum(pendingNum) + .completedNum(completedNum).build(); + + return R.ok(indexPageStatistics); + } + + /** + * 查询流程变量 + * @param paramDto 查询参数 + * @return 流程变量 + */ + @PostMapping("queryVariables") + public R queryVariables(@RequestBody VariableQueryParamDto paramDto) { + + Map variables = runtimeService.getVariables(paramDto.getExecutionId()); + + return R.ok(variables); + + } + +} diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/controller/EngineTaskController.java b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/controller/EngineTaskController.java new file mode 100644 index 0000000..837454d --- /dev/null +++ b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/controller/EngineTaskController.java @@ -0,0 +1,146 @@ +package com.pig4cloud.pigx.flow.engine.controller; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.convert.Convert; +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.flow.task.dto.TaskParamDto; +import com.pig4cloud.pigx.flow.task.dto.TaskResultDto; +import com.pig4cloud.pigx.flow.task.dto.VariableQueryParamDto; +import com.pig4cloud.pigx.flow.task.utils.NodeUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.task.api.DelegationState; +import org.flowable.task.api.Task; +import org.flowable.task.api.TaskQuery; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.springframework.web.bind.annotation.*; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +/** + * 任务控制器 + */ +@RestController +@Slf4j +@RequiredArgsConstructor +@RequestMapping("/task") +public class EngineTaskController { + + private final TaskService taskService; + + private final HistoryService historyService; + + private final RuntimeService runtimeService; + + /** + * 查询任务变量 + * @param paramDto 参数DTO + * @return 变量Map + */ + @PostMapping("queryTaskVariables") + public R queryTaskVariables(@RequestBody VariableQueryParamDto paramDto) { + + List keyList = paramDto.getKeyList(); + if (CollUtil.isEmpty(keyList)) { + TaskQuery taskQuery = taskService.createTaskQuery(); + + Task task = taskQuery.taskId(paramDto.getTaskId()).singleResult(); + if (task == null) { + return R.failed("任务不存在"); + } + + Map variables = runtimeService.getVariables(task.getExecutionId()); + + return R.ok(variables); + } + + Map variables = taskService.getVariables(paramDto.getTaskId(), keyList); + return R.ok(variables); + + } + + /** + * 查询任务详情 + * @param taskId 任务ID + * @param userId 用户ID + * @return 任务结果DTO + */ + @GetMapping("/engine/queryTask") + public R queryTask(String taskId, String userId) { + Optional task = Optional + .ofNullable(taskService.createTaskQuery().taskId(taskId).taskAssignee(userId).singleResult()); + + if (task.isPresent()) { + String processDefinitionId = task.get().getProcessDefinitionId(); + String taskDefinitionKey = task.get().getTaskDefinitionKey(); + DelegationState delegationState = task.get().getDelegationState(); + String processInstanceId = task.get().getProcessInstanceId(); + Object delegateVariable = taskService.getVariableLocal(taskId, "delegate"); + + String flowId = NodeUtil.getFlowId(processDefinitionId); + Map variables = taskService.getVariables(taskId); + Map variableAll = new HashMap<>(variables); + + TaskResultDto taskResultDto = new TaskResultDto(); + taskResultDto.setFlowId(flowId); + taskResultDto.setProcessInstanceId(processDefinitionId); + taskResultDto.setNodeId(taskDefinitionKey); + taskResultDto.setCurrentTask(true); + taskResultDto.setDelegate(Convert.toBool(delegateVariable, false)); + taskResultDto.setVariableAll(variableAll); + taskResultDto.setProcessInstanceId(processInstanceId); + taskResultDto.setDelegationState(delegationState == null ? null : delegationState.toString()); + + return R.ok(taskResultDto); + } + else { + Optional historicTaskInstance = Optional.ofNullable(historyService + .createHistoricTaskInstanceQuery().taskId(taskId).taskAssignee(userId).singleResult()); + + if (historicTaskInstance.isPresent()) { + String processDefinitionId = historicTaskInstance.get().getProcessDefinitionId(); + String taskDefinitionKey = historicTaskInstance.get().getTaskDefinitionKey(); + String processInstanceId = historicTaskInstance.get().getProcessInstanceId(); + + String flowId = NodeUtil.getFlowId(processDefinitionId); + Map variableAll = new HashMap<>(); + + TaskResultDto taskResultDto = new TaskResultDto(); + taskResultDto.setFlowId(flowId); + taskResultDto.setNodeId(taskDefinitionKey); + taskResultDto.setCurrentTask(false); + taskResultDto.setVariableAll(variableAll); + taskResultDto.setProcessInstanceId(processInstanceId); + + return R.ok(taskResultDto); + } + else { + return R.failed("任务不存在"); + } + } + } + + /** + * 完成任务 + * @param taskParamDto 任务参数DTO + * @return 操作结果 + */ + @PostMapping("/complete") + public R complete(@RequestBody TaskParamDto taskParamDto) { + Map taskLocalParamMap = taskParamDto.getTaskLocalParamMap(); + if (CollUtil.isNotEmpty(taskLocalParamMap)) { + taskService.setVariablesLocal(taskParamDto.getTaskId(), taskLocalParamMap); + } + + taskService.complete(taskParamDto.getTaskId(), taskParamDto.getParamMap()); + + return R.ok(); + } + +} diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/ExpressionHandler.java b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/ExpressionHandler.java new file mode 100644 index 0000000..a1bcdcc --- /dev/null +++ b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/ExpressionHandler.java @@ -0,0 +1,308 @@ +package com.pig4cloud.pigx.flow.engine.expression; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.lang.Dict; +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.EscapeUtil; +import cn.hutool.core.util.StrUtil; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.googlecode.aviator.AviatorEvaluator; +import com.pig4cloud.pigx.admin.api.entity.SysUser; +import com.pig4cloud.pigx.admin.api.feign.RemoteUserService; +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.flow.task.constant.NodeUserTypeEnum; +import com.pig4cloud.pigx.flow.task.dto.NodeUser; +import com.pig4cloud.pigx.flow.task.dto.SelectValue; +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.delegate.DelegateExecution; +import org.springframework.stereotype.Component; + +import java.math.BigDecimal; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 表达式解析 + */ +@Slf4j +@Component("expressionHandler") +@RequiredArgsConstructor +public class ExpressionHandler { + + private final RemoteUserService remoteUserService; + + private final ObjectMapper objectMapper; + + @SneakyThrows + public Long getUserId(String key, DelegateExecution execution) { + Object variable = execution.getVariable(key); + NodeUser nodeUserDto = objectMapper + .readValue(objectMapper.writeValueAsString(variable), new TypeReference>() { + }).get(0); + return nodeUserDto.getId(); + } + + /** + * 日期时间比较 + * @param key + * @param symbol + * @param param + * @param execution + * @param format 时间格式化模式 + * @return + */ + public boolean dateTimeCompare(String key, String symbol, Object param, DelegateExecution execution, + String format) { + + Object value = execution.getVariable(key); + + // 表单值为空 + if (value == null) { + return false; + } + + long valueTime = DateUtil.parse(value.toString(), format).getTime(); + long paramTime = DateUtil.parse(param.toString(), format).getTime(); + + return compare(StrUtil.format("key{}{}", symbol, paramTime), Dict.create().set("key", valueTime)); + } + + /** + * 数字类型比较 + * @param key 表单key + * @param symbol 比较符号 + * @param param 表单参数 + * @param execution + * @return + */ + public boolean numberCompare(String key, String symbol, Object param, DelegateExecution execution) { + + Object value = execution.getVariable(key); + + // 表单值为空 + if (value == null) { + return false; + } + + return compare(StrUtil.format("key{}{}", symbol, param), Dict.create().set("key", Convert.toNumber(value))); + + } + + private Boolean compare(String symbol, Dict value) { + Object result = AviatorEvaluator.getInstance().execute(symbol, value); + // 渲染结果 + log.debug("验证结果:{}", result); + return Convert.toBool(result, false); + } + + /** + * 日期类型对比 + * @param key 表单key + * @param symbol 比较符号 + * @param param 比较参数值 + * @param execution 上下午执行前 + * @param format 日期格式化字符串 + * @return + */ + public boolean dateCompare(String key, String symbol, Object param, DelegateExecution execution, String format) { + + Object value = execution.getVariable(key); + + // 表单值为空 + if (value == null) { + return false; + } + + // 处理表单值 + DateTime valueDateTime = DateUtil.parse(value.toString(), format); + log.debug("表单值:{} 格式化显示:{}", valueDateTime.getTime(), DateUtil.formatDateTime(valueDateTime)); + // 处理参数值 + DateTime paramDateTime = DateUtil.parse(param.toString(), format); + log.debug("参数值:{} 格式化显示:{}", paramDateTime.getTime(), DateUtil.formatDateTime(paramDateTime)); + + // 获取模板 + return compare(StrUtil.format("key{}{}", symbol, paramDateTime.getTime()), + Dict.create().set("key", valueDateTime.getTime())); + + } + + /** + * 判断数字数组包含 + * @param key 表单key + * @param array 条件值 + * @return + */ + public boolean numberContain(String key, DelegateExecution execution, Object... array) { + + Object value = execution.getVariable(key); + + if (value == null) { + return false; + } + + return numberContain(value, array); + } + + private static boolean numberContain(Object value, Object[] array) { + BigDecimal valueBigDecimal = Convert.toBigDecimal(value); + + for (Object aLong : array) { + if (valueBigDecimal.compareTo(Convert.toBigDecimal(aLong)) == 0) { + return true; + } + } + return false; + } + + /** + * 单选处理 + * @param key 表单key + * @param array 条件值 + * @return + */ + public boolean singleSelectHandler(String key, DelegateExecution execution, String... array) { + Object value = execution.getVariable(key); + + if (value == null) { + return false; + } + List list = Convert.toList(SelectValue.class, value); + if (CollUtil.isEmpty(list)) { + return false; + } + return ArrayUtil.contains(array, list.get(0).getKey()); + } + + /** + * 字符串判断包含 + * @param key 表单key + * @param param 参数 + * @return + */ + public boolean stringContain(String key, String param, DelegateExecution execution) { + Object value = execution.getVariable(key); + + if (value == null) { + return false; + } + return StrUtil.contains(value.toString(), param); + } + + /** + * 字符串判断相等 + * @param key 表单key + * @param param 参数 + * @return + */ + public boolean stringEqual(String key, String param, DelegateExecution execution) { + Object value = execution.getVariable(key); + + if (value == null) { + return false; + } + return StrUtil.equals(value.toString(), param); + } + + @SneakyThrows + public boolean deptCompare(String key, String param, String symbol, DelegateExecution execution) { + param = EscapeUtil.unescape(param); + + Object value = execution.getVariable(key); + + String jsonString = objectMapper.writeValueAsString(value); + log.debug("表单值:key={} value={} symbol={}", key, jsonString, symbol); + log.debug("条件 参数:{}", param); + if (value == null) { + return false; + } + + // 表单值 + List nodeUserDtoList = objectMapper.readValue(jsonString, new TypeReference>() { + }); + if (CollUtil.isEmpty(nodeUserDtoList) || nodeUserDtoList.size() != 1) { + return false; + } + NodeUser nodeUserDto = nodeUserDtoList.get(0); + + // 参数 + + List paramDeptList = objectMapper.readValue(param, new TypeReference>() { + }); + Long deptId = nodeUserDto.getId(); + List deptIdList = paramDeptList.stream().map(NodeUser::getId).collect(Collectors.toList()); + + return inCompare(symbol, deptId, deptIdList); + + } + + private static boolean inCompare(String symbol, Long deptId, List deptIdList) { + if (StrUtil.equalsAny(symbol, "in", "==")) { + // 属于 + return deptIdList.contains(deptId); + } + if (StrUtil.equalsAny(symbol, "notin", "!=")) { + // 属于 + return !deptIdList.contains(deptId); + } + + return false; + } + + /** + * user判断 + * @param key 表单key + * @param param 参数 + * @return + */ + @SneakyThrows + public boolean userCompare(String key, String param, String symbol, DelegateExecution execution) { + param = EscapeUtil.unescape(param); + + Object value = execution.getVariable(key); + + String jsonString = objectMapper.writeValueAsString(value); + log.debug("表单值:key={} value={} symbol={} ", key, jsonString, symbol); + log.debug("条件 参数:{}", param); + + if (value == null) { + return false; + } + + // 表单值 + List nodeUserDtoList = objectMapper.readValue(jsonString, new TypeReference>() { + }); + + if (CollUtil.isEmpty(nodeUserDtoList) || nodeUserDtoList.size() != 1) { + return false; + } + + NodeUser nodeUserDto = nodeUserDtoList.get(0); + + // 参数 + List paramDeptList = objectMapper.readValue(param, new TypeReference>() { + }); + + List deptIdList = paramDeptList.stream() + .filter(w -> StrUtil.equals(w.getType(), NodeUserTypeEnum.DEPT.getKey())).map(NodeUser::getId) + .collect(Collectors.toList()); + + List userIdList = paramDeptList.stream() + .filter(w -> StrUtil.equals(w.getType(), NodeUserTypeEnum.USER.getKey())).map(NodeUser::getId) + .collect(Collectors.toList()); + + if (CollUtil.isNotEmpty(deptIdList)) { + R> r = remoteUserService.getUserIdListByDeptIdList(deptIdList); + List data = r.getData().stream().map(SysUser::getUserId).collect(Collectors.toList()); + userIdList.addAll(data); + } + + return inCompare(symbol, Convert.toLong(nodeUserDto.getId()), userIdList); + } + +} diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/condition/NodeConditionStrategy.java b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/condition/NodeConditionStrategy.java new file mode 100644 index 0000000..e8df727 --- /dev/null +++ b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/condition/NodeConditionStrategy.java @@ -0,0 +1,15 @@ +package com.pig4cloud.pigx.flow.engine.expression.condition; + +import com.pig4cloud.pigx.flow.task.dto.Condition; + +/** + * 节点单个条件处理器 + */ +public interface NodeConditionStrategy { + + /** + * 抽象方法 处理表达式 + */ + String handle(Condition condition); + +} diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/condition/NodeExpressionStrategyFactory.java b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/condition/NodeExpressionStrategyFactory.java new file mode 100644 index 0000000..af4e8e1 --- /dev/null +++ b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/condition/NodeExpressionStrategyFactory.java @@ -0,0 +1,99 @@ +package com.pig4cloud.pigx.flow.engine.expression.condition; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.extra.spring.SpringUtil; +import com.pig4cloud.pigx.flow.task.dto.Condition; +import com.pig4cloud.pigx.flow.task.dto.GroupCondition; +import com.pig4cloud.pigx.flow.task.dto.Node; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class NodeExpressionStrategyFactory { + + public static String handleSingleCondition(Condition nodeConditionDto) { + Map nodeConditionStrategyMap = SpringUtil + .getBeansOfType(NodeConditionStrategy.class); + NodeConditionStrategy nodeConditionHandler = nodeConditionStrategyMap + .get(nodeConditionDto.getKeyType() + "NodeConditionStrategy"); + if (nodeConditionHandler == null) { + return "(1==1)"; + } + return nodeConditionHandler.handle(nodeConditionDto); + } + + /** + * 组内处理表达式 + * @param groupDto + * @return + */ + public static String handleGroupCondition(GroupCondition groupDto) { + + List exps = new ArrayList<>(); + + for (Condition condition : groupDto.getConditionList()) { + String singleExpression = handleSingleCondition(condition); + exps.add(singleExpression); + } + Boolean mode = groupDto.getMode(); + + if (!mode) { + String join = CollUtil.join(exps, "||"); + + return "(" + join + ")"; + } + + String join = CollUtil.join(exps, "&&"); + return "(" + join + ")"; + } + + /** + * 处理单个分支表达式 + * @return + */ + public static String handle(Node node) { + + List exps = new ArrayList<>(); + + List groups = node.getConditionList(); + if (CollUtil.isEmpty(groups)) { + return "${1==1}"; + } + for (GroupCondition group : groups) { + String s = handleGroupCondition(group); + exps.add(s); + } + + if (!node.getGroupMode()) { + String join = CollUtil.join(exps, "||"); + return "${(" + join + ")}"; + } + + String join = CollUtil.join(exps, "&&"); + return "${(" + join + ")}"; + } + + public static String handleDefaultBranch(List branchs, int currentIndex) { + + List expList = new ArrayList<>(); + + int index = 1; + for (Node branch : branchs) { + + if (index == currentIndex + 1) { + continue; + } + + String exp = handle(branch); + String s = StrUtil.subBetween(exp, "${", "}"); + expList.add(StrUtil.format("({})", s)); + + index++; + } + String join = StrUtil.format("!({})", CollUtil.join(expList, "||")); + return "${" + join + "}"; + } + +} diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/condition/impl/DateNodeConditionStrategy.java b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/condition/impl/DateNodeConditionStrategy.java new file mode 100644 index 0000000..ac0cc17 --- /dev/null +++ b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/condition/impl/DateNodeConditionStrategy.java @@ -0,0 +1,29 @@ +package com.pig4cloud.pigx.flow.engine.expression.condition.impl; + +import cn.hutool.core.util.StrUtil; +import com.pig4cloud.pigx.flow.engine.expression.condition.NodeConditionStrategy; +import com.pig4cloud.pigx.flow.task.dto.Condition; +import org.springframework.stereotype.Component; + +/** + * 字符类型处理器 + */ +@Component("DateNodeConditionStrategy") +public class DateNodeConditionStrategy implements NodeConditionStrategy { + + /** + * 抽象方法 处理表达式 + */ + @Override + public String handle(Condition condition) { + + String compare = condition.getExpression(); + String id = condition.getKey(); + Object value = condition.getValue(); + + return StrUtil.format("(expressionHandler.dateTimeCompare(\"{}\",\"{}\",\"{}\",execution,\"yyyy-MM-dd\"))", id, + compare, value); + + } + +} diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/condition/impl/DateTimeNodeConditionStrategy.java b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/condition/impl/DateTimeNodeConditionStrategy.java new file mode 100644 index 0000000..c2a8645 --- /dev/null +++ b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/condition/impl/DateTimeNodeConditionStrategy.java @@ -0,0 +1,30 @@ +package com.pig4cloud.pigx.flow.engine.expression.condition.impl; + +import cn.hutool.core.util.StrUtil; +import com.pig4cloud.pigx.flow.engine.expression.condition.NodeConditionStrategy; +import com.pig4cloud.pigx.flow.task.dto.Condition; +import org.springframework.stereotype.Component; + +/** + * 字符类型处理器 + */ +@Component("DateTimeNodeConditionStrategy") +public class DateTimeNodeConditionStrategy implements NodeConditionStrategy { + + /** + * 抽象方法 处理表达式 + */ + @Override + public String handle(Condition condition) { + + String compare = condition.getExpression(); + String id = condition.getKey(); + Object value = condition.getValue(); + + return StrUtil.format( + "(expressionHandler.dateTimeCompare(\"{}\",\"{}\",\"{}\",execution,\"yyyy-MM-dd " + "HH:mm:ss\"))", id, + compare, value); + + } + +} diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/condition/impl/InputNodeConditionStrategy.java b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/condition/impl/InputNodeConditionStrategy.java new file mode 100644 index 0000000..19510c3 --- /dev/null +++ b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/condition/impl/InputNodeConditionStrategy.java @@ -0,0 +1,39 @@ +package com.pig4cloud.pigx.flow.engine.expression.condition.impl; + +import cn.hutool.core.util.StrUtil; +import com.pig4cloud.pigx.flow.engine.expression.condition.NodeConditionStrategy; +import com.pig4cloud.pigx.flow.task.dto.Condition; +import org.springframework.stereotype.Component; + +/** + * 字符类型处理器 + */ +@Component("InputNodeConditionStrategy") +public class InputNodeConditionStrategy implements NodeConditionStrategy { + + /** + * 抽象方法 处理表达式 + * + */ + @Override + public String handle(Condition condition) { + + String compare = condition.getExpression(); + String id = condition.getKey(); + Object value = condition.getValue(); + if (StrUtil.equals(compare, "==")) { + return StrUtil.format("(expressionHandler.stringEqual(\"{}\",\"{}\",execution))", id, value); + } + if (StrUtil.equals(compare, "contain")) { + return StrUtil.format("(expressionHandler.stringContain(\"{}\",\"{}\",execution))", id, value); + } + if (StrUtil.equals(compare, "notcontain")) { + return StrUtil.format("(!expressionHandler.stringContain(\"{}\",\"{}\",execution))", id, value); + } + if (StrUtil.equals(compare, "!=")) { + return StrUtil.format("(!expressionHandler.stringEqual(\"{}\",\"{}\",execution))", id, value); + } + return "(2==2)"; + } + +} diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/condition/impl/MoneyNodeConditionStrategy.java b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/condition/impl/MoneyNodeConditionStrategy.java new file mode 100644 index 0000000..16c35c7 --- /dev/null +++ b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/condition/impl/MoneyNodeConditionStrategy.java @@ -0,0 +1,28 @@ +package com.pig4cloud.pigx.flow.engine.expression.condition.impl; + +import cn.hutool.core.util.StrUtil; +import com.pig4cloud.pigx.flow.engine.expression.condition.NodeConditionStrategy; +import com.pig4cloud.pigx.flow.task.dto.Condition; +import org.springframework.stereotype.Component; + +/** + * 字符类型处理器 + */ +@Component("MoneyNodeConditionStrategy") +public class MoneyNodeConditionStrategy implements NodeConditionStrategy { + + /** + * 抽象方法 处理表达式 + */ + @Override + public String handle(Condition condition) { + + String compare = condition.getExpression(); + String id = condition.getKey(); + Object value = condition.getValue(); + + return StrUtil.format("(expressionHandler.numberCompare(\"{}\",\"{}\",{},execution))", id, compare, value); + + } + +} diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/condition/impl/NumberNodeConditionStrategy.java b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/condition/impl/NumberNodeConditionStrategy.java new file mode 100644 index 0000000..0e3d511 --- /dev/null +++ b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/condition/impl/NumberNodeConditionStrategy.java @@ -0,0 +1,28 @@ +package com.pig4cloud.pigx.flow.engine.expression.condition.impl; + +import cn.hutool.core.util.StrUtil; +import com.pig4cloud.pigx.flow.engine.expression.condition.NodeConditionStrategy; +import com.pig4cloud.pigx.flow.task.dto.Condition; +import org.springframework.stereotype.Component; + +/** + * 字符类型处理器 + */ +@Component("NumberNodeConditionStrategy") +public class NumberNodeConditionStrategy implements NodeConditionStrategy { + + /** + * 抽象方法 处理表达式 + */ + @Override + public String handle(Condition condition) { + + String compare = condition.getExpression(); + String id = condition.getKey(); + Object value = condition.getValue(); + + return StrUtil.format("(expressionHandler.numberCompare(\"{}\",\"{}\",{},execution))", id, compare, value); + + } + +} diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/condition/impl/SelectDeptNodeConditionStrategy.java b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/condition/impl/SelectDeptNodeConditionStrategy.java new file mode 100644 index 0000000..6c4d7f7 --- /dev/null +++ b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/condition/impl/SelectDeptNodeConditionStrategy.java @@ -0,0 +1,37 @@ +package com.pig4cloud.pigx.flow.engine.expression.condition.impl; + +import cn.hutool.core.util.EscapeUtil; +import cn.hutool.core.util.StrUtil; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.pig4cloud.pigx.flow.engine.expression.condition.NodeConditionStrategy; +import com.pig4cloud.pigx.flow.task.dto.Condition; +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; +import org.springframework.stereotype.Component; + +/** + * 字符类型处理器 + */ +@RequiredArgsConstructor +@Component("SelectDeptNodeConditionStrategy") +public class SelectDeptNodeConditionStrategy implements NodeConditionStrategy { + + private final ObjectMapper objectMapper; + + /** + * 抽象方法 处理表达式 + */ + @Override + @SneakyThrows + public String handle(Condition condition) { + + String compare = condition.getExpression(); + String id = condition.getKey(); + Object value = condition.getValue(); + + return StrUtil.format("(expressionHandler.deptCompare(\"{}\",\"{}\",\"{}\", execution))", id, + EscapeUtil.escape(objectMapper.writeValueAsString(value)), compare); + + } + +} diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/condition/impl/SelectUserNodeConditionStrategy.java b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/condition/impl/SelectUserNodeConditionStrategy.java new file mode 100644 index 0000000..e6ce810 --- /dev/null +++ b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/condition/impl/SelectUserNodeConditionStrategy.java @@ -0,0 +1,37 @@ +package com.pig4cloud.pigx.flow.engine.expression.condition.impl; + +import cn.hutool.core.util.EscapeUtil; +import cn.hutool.core.util.StrUtil; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.pig4cloud.pigx.flow.engine.expression.condition.NodeConditionStrategy; +import com.pig4cloud.pigx.flow.task.dto.Condition; +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; +import org.springframework.stereotype.Component; + +/** + * 字符类型处理器 + */ +@RequiredArgsConstructor +@Component("SelectUserNodeConditionStrategy") +public class SelectUserNodeConditionStrategy implements NodeConditionStrategy { + + private final ObjectMapper objectMapper; + + /** + * 抽象方法 处理表达式 + */ + @Override + @SneakyThrows + public String handle(Condition condition) { + + String compare = condition.getExpression(); + String id = condition.getKey(); + Object value = condition.getValue(); + + return StrUtil.format("(expressionHandler.userCompare(\"{}\",\"{}\",\"{}\", execution))", id, + EscapeUtil.escape(objectMapper.writeValueAsString(value)), compare); + + } + +} diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/condition/impl/SingleSelectNodeConditionStrategy.java b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/condition/impl/SingleSelectNodeConditionStrategy.java new file mode 100644 index 0000000..f8b96c1 --- /dev/null +++ b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/condition/impl/SingleSelectNodeConditionStrategy.java @@ -0,0 +1,48 @@ +package com.pig4cloud.pigx.flow.engine.expression.condition.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.StrUtil; +import com.pig4cloud.pigx.flow.engine.expression.condition.NodeConditionStrategy; +import com.pig4cloud.pigx.flow.task.dto.Condition; +import com.pig4cloud.pigx.flow.task.dto.SelectValue; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * 字符类型处理器 + */ +@Component("SingleSelectNodeConditionStrategy") +public class SingleSelectNodeConditionStrategy implements NodeConditionStrategy { + + /** + * 抽象方法 处理表达式 + */ + @Override + public String handle(Condition condition) { + + String compare = condition.getExpression(); + String id = condition.getKey(); + Object value = condition.getValue(); + + List list = Convert.toList(SelectValue.class, value); + + StringBuilder sb = new StringBuilder(); + + for (SelectValue o : list) { + sb.append(",\"").append(o.getKey()).append("\""); + } + String string = sb.toString(); + if (CollUtil.isNotEmpty(list)) { + string = string.substring(1); + } + if (compare.equals("in")) { + return StrUtil.format("(expressionHandler.singleSelectHandler(\"{}\", execution,{}))", id, string); + } + + return StrUtil.format("(!expressionHandler.singleSelectHandler(\"{}\", execution,{}))", id, string); + + } + +} diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/condition/impl/TextareaNodeConditionStrategy.java b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/condition/impl/TextareaNodeConditionStrategy.java new file mode 100644 index 0000000..4b25d32 --- /dev/null +++ b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/condition/impl/TextareaNodeConditionStrategy.java @@ -0,0 +1,33 @@ +package com.pig4cloud.pigx.flow.engine.expression.condition.impl; + +import cn.hutool.core.util.StrUtil; +import com.pig4cloud.pigx.flow.engine.expression.condition.NodeConditionStrategy; +import com.pig4cloud.pigx.flow.task.dto.Condition; +import org.springframework.stereotype.Component; + +/** + * 字符类型处理器 + */ +@Component("TextareaNodeConditionStrategy") +public class TextareaNodeConditionStrategy implements NodeConditionStrategy { + + /** + * 抽象方法 处理表达式 + * + */ + @Override + public String handle(Condition condition) { + + String compare = condition.getExpression(); + String id = condition.getKey(); + Object value = condition.getValue(); + if (StrUtil.equals(compare, "==")) { + return StrUtil.format("(expressionHandler.stringEqual(\"{}\",\"{}\",execution))", id, value); + } + if (StrUtil.equals(compare, "!=")) { + return StrUtil.format("(!expressionHandler.stringEqual(\"{}\",\"{}\",execution))", id, value); + } + return "(2==2)"; + } + +} diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/condition/impl/TimeNodeConditionStrategy.java b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/condition/impl/TimeNodeConditionStrategy.java new file mode 100644 index 0000000..d0f4d17 --- /dev/null +++ b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/condition/impl/TimeNodeConditionStrategy.java @@ -0,0 +1,29 @@ +package com.pig4cloud.pigx.flow.engine.expression.condition.impl; + +import cn.hutool.core.util.StrUtil; +import com.pig4cloud.pigx.flow.engine.expression.condition.NodeConditionStrategy; +import com.pig4cloud.pigx.flow.task.dto.Condition; +import org.springframework.stereotype.Component; + +/** + * 字符类型处理器 + */ +@Component("TimeNodeConditionStrategy") +public class TimeNodeConditionStrategy implements NodeConditionStrategy { + + /** + * 抽象方法 处理表达式 + */ + @Override + public String handle(Condition condition) { + + String compare = condition.getExpression(); + String id = condition.getKey(); + Object value = condition.getValue(); + + return StrUtil.format("(expressionHandler.dateTimeCompare(\"{}\",\"{}\",\"{}\",execution,\"HH:mm:ss\"))", id, + compare, value); + + } + +} diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/listeners/ApprovalCreateListener.java b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/listeners/ApprovalCreateListener.java new file mode 100644 index 0000000..e48b20d --- /dev/null +++ b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/listeners/ApprovalCreateListener.java @@ -0,0 +1,91 @@ +package com.pig4cloud.pigx.flow.engine.listeners; + +import cn.hutool.core.lang.Dict; +import cn.hutool.core.util.StrUtil; +import cn.hutool.extra.spring.SpringUtil; +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.flow.task.api.feign.RemoteFlowTaskService; +import com.pig4cloud.pigx.flow.task.constant.ProcessInstanceConstant; +import com.pig4cloud.pigx.flow.task.dto.Nobody; +import com.pig4cloud.pigx.flow.task.dto.Node; +import com.pig4cloud.pigx.flow.task.dto.NodeUser; +import com.pig4cloud.pigx.flow.task.utils.NodeUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.TaskService; +import org.flowable.task.service.delegate.DelegateTask; +import org.flowable.task.service.delegate.TaskListener; +import org.flowable.task.service.impl.persistence.entity.TaskEntityImpl; + +/** + * 审批创建监听器 + */ +@Slf4j +public class ApprovalCreateListener implements TaskListener { + + /** + * 当任务被触发时,执行该方法 + * @param delegateTask 委派的任务对象 + */ + @Override + public void notify(DelegateTask delegateTask) { + log.debug(delegateTask.getClass().getCanonicalName()); + TaskService taskService = SpringUtil.getBean(TaskService.class); + + String assignee = delegateTask.getAssignee(); + String name = delegateTask.getName(); + log.debug("任务{}-执行人:{}", name, assignee); + TaskEntityImpl taskEntity = (TaskEntityImpl) delegateTask; + String nodeId = taskEntity.getTaskDefinitionKey(); + String processDefinitionId = taskEntity.getProcessDefinitionId(); + + // 获取流程id + String flowId = NodeUtil.getFlowId(processDefinitionId); + + if (StrUtil.isBlank(assignee) + || StrUtil.equals(ProcessInstanceConstant.DEFAULT_EMPTY_ASSIGN.toString(), assignee)) { + + RemoteFlowTaskService remoteFlowTaskService = SpringUtil.getBean(RemoteFlowTaskService.class); + + // 查询节点原始数据 + Node node = remoteFlowTaskService.queryNodeOriData(flowId, nodeId).getData(); + + Nobody nobody = node.getNobody(); + + String handler = nobody.getHandler(); + + if (StrUtil.equals(handler, ProcessInstanceConstant.USER_TASK_NOBODY_HANDLER_TO_PASS)) { + // 直接通过 + Dict param = Dict.create().set(StrUtil.format("{}_approve_condition", nodeId), true); + taskService.complete(taskEntity.getId(), param); + } + + if (StrUtil.equals(handler, ProcessInstanceConstant.USER_TASK_NOBODY_HANDLER_TO_ADMIN)) { + // 指派给管理员 + + R longR = remoteFlowTaskService.queryProcessAdmin(flowId); + + Long adminId = longR.getData(); + + taskService.setAssignee(taskEntity.getId(), String.valueOf(adminId)); + } + + if (StrUtil.equals(handler, ProcessInstanceConstant.USER_TASK_NOBODY_HANDLER_TO_USER)) { + // 指定用户 + + NodeUser nodeUser = nobody.getAssignedUser().get(0); + + taskService.setAssignee(taskEntity.getId(), nodeUser.getId().toString()); + } + + if (StrUtil.equals(handler, ProcessInstanceConstant.USER_TASK_NOBODY_HANDLER_TO_REFUSE)) { + // 结束 + Dict param = Dict.create().set(StrUtil.format("{}_approve_condition", nodeId), false); + taskService.complete(taskEntity.getId(), param); + + } + + } + + } + +} diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/listeners/FlowProcessEventListener.java b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/listeners/FlowProcessEventListener.java new file mode 100644 index 0000000..5c01f05 --- /dev/null +++ b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/listeners/FlowProcessEventListener.java @@ -0,0 +1,293 @@ +package com.pig4cloud.pigx.flow.engine.listeners; + +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.StrUtil; +import cn.hutool.extra.spring.SpringUtil; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.pig4cloud.pigx.flow.task.api.feign.RemoteFlowTaskService; +import com.pig4cloud.pigx.flow.task.dto.*; +import com.pig4cloud.pigx.flow.task.utils.NodeUtil; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.flowable.common.engine.api.delegate.event.FlowableEngineEventType; +import org.flowable.common.engine.api.delegate.event.FlowableEntityEvent; +import org.flowable.common.engine.api.delegate.event.FlowableEvent; +import org.flowable.common.engine.api.delegate.event.FlowableEventListener; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.event.impl.FlowableActivityEventImpl; +import org.flowable.engine.delegate.event.impl.FlowableMultiInstanceActivityCompletedEventImpl; +import org.flowable.engine.delegate.event.impl.FlowableProcessStartedEventImpl; +import org.flowable.engine.delegate.event.impl.FlowableProcessTerminatedEventImpl; +import org.flowable.engine.impl.persistence.entity.ExecutionEntityImpl; +import org.flowable.task.api.DelegationState; +import org.flowable.task.service.impl.persistence.entity.TaskEntityImpl; +import org.flowable.variable.api.event.FlowableVariableEvent; + +import java.util.List; +import java.util.Map; + +/** + * 流程监听器 + */ +@Slf4j +public class FlowProcessEventListener implements FlowableEventListener { + + /** + * 当事件被触发时调用 + * @param event 事件对象 + */ + @SneakyThrows + @Override + public void onEvent(FlowableEvent event) { + RemoteFlowTaskService remoteFlowTaskService = SpringUtil.getBean(RemoteFlowTaskService.class); + + log.info("分支监听器 类型={} class={}", event.getType(), event.getClass().getCanonicalName()); + if (event.getType().toString().equals(FlowableEngineEventType.ACTIVITY_STARTED.toString())) { + // 节点开始执行 + FlowableActivityEventImpl flowableActivityEvent = (FlowableActivityEventImpl) event; + String activityId = flowableActivityEvent.getActivityId(); + String activityName = flowableActivityEvent.getActivityName(); + log.info("节点id:{} 名字:{}", activityId, activityName); + + String processInstanceId = flowableActivityEvent.getProcessInstanceId(); + + String processDefinitionId = flowableActivityEvent.getProcessDefinitionId(); + String flowId = NodeUtil.getFlowId(processDefinitionId); + + Node node = remoteFlowTaskService.queryNodeOriData(flowId, activityId).getData(); + + ProcessNodeRecordParamDto processNodeRecordParamDto = new ProcessNodeRecordParamDto(); + processNodeRecordParamDto.setFlowId(flowId); + processNodeRecordParamDto.setProcessInstanceId(processInstanceId); + processNodeRecordParamDto.setNodeId(activityId); + if (node != null) { + processNodeRecordParamDto.setNodeType(String.valueOf(node.getType())); + } + processNodeRecordParamDto.setNodeName(activityName); + processNodeRecordParamDto.setExecutionId(flowableActivityEvent.getExecutionId()); + remoteFlowTaskService.startNodeEvent(processNodeRecordParamDto); + } + + if (event.getType().toString() + .equals(FlowableEngineEventType.MULTI_INSTANCE_ACTIVITY_COMPLETED_WITH_CONDITION.toString()) + || event.getType().toString() + .equals(FlowableEngineEventType.MULTI_INSTANCE_ACTIVITY_COMPLETED.toString())) { + // 多实例任务 + FlowableMultiInstanceActivityCompletedEventImpl flowableActivityEvent = (FlowableMultiInstanceActivityCompletedEventImpl) event; + String activityId = flowableActivityEvent.getActivityId(); + String activityName = flowableActivityEvent.getActivityName(); + log.info("节点id:{} 名字:{}", activityId, activityName); + + String processInstanceId = flowableActivityEvent.getProcessInstanceId(); + + String processDefinitionId = flowableActivityEvent.getProcessDefinitionId(); + String flowId = NodeUtil.getFlowId(processDefinitionId); + + ProcessNodeRecordParamDto processNodeRecordParamDto = new ProcessNodeRecordParamDto(); + processNodeRecordParamDto.setFlowId(flowId); + processNodeRecordParamDto.setExecutionId(flowableActivityEvent.getExecutionId()); + processNodeRecordParamDto.setProcessInstanceId(processInstanceId); + // processNodeRecordParamDto.setData(JSON.toJSONString(processVariables)); + processNodeRecordParamDto.setNodeId(activityId); + // processNodeRecordParamDto.setNodeType(nodeDto.getType()); + processNodeRecordParamDto.setNodeName(activityName); + + remoteFlowTaskService.endNodeEvent(processNodeRecordParamDto); + } + if (event.getType().toString().equals(FlowableEngineEventType.ACTIVITY_COMPLETED.toString())) { + // 节点完成执行 + + FlowableActivityEventImpl flowableActivityEvent = (FlowableActivityEventImpl) event; + String activityId = flowableActivityEvent.getActivityId(); + String activityName = flowableActivityEvent.getActivityName(); + log.info("节点id:{} 名字:{}", activityId, activityName); + + String processInstanceId = flowableActivityEvent.getProcessInstanceId(); + + String processDefinitionId = flowableActivityEvent.getProcessDefinitionId(); + String flowId = NodeUtil.getFlowId(processDefinitionId); + + ProcessNodeRecordParamDto processNodeRecordParamDto = new ProcessNodeRecordParamDto(); + processNodeRecordParamDto.setFlowId(flowId); + processNodeRecordParamDto.setExecutionId(flowableActivityEvent.getExecutionId()); + processNodeRecordParamDto.setProcessInstanceId(processInstanceId); + processNodeRecordParamDto.setNodeId(activityId); + processNodeRecordParamDto.setNodeName(activityName); + + remoteFlowTaskService.endNodeEvent(processNodeRecordParamDto); + + } + + if (event.getType().toString().equals(FlowableEngineEventType.VARIABLE_UPDATED.toString())) { + // 变量变化了 + FlowableVariableEvent flowableVariableEvent = (FlowableVariableEvent) event; + log.debug("变量[{}]变化了:{} ", flowableVariableEvent.getVariableName(), + flowableVariableEvent.getVariableValue()); + } + + if (event.getType().toString().equals(FlowableEngineEventType.VARIABLE_CREATED.toString())) { + // 变量创建了 + FlowableVariableEvent flowableVariableEvent = (FlowableVariableEvent) event; + log.debug("变量[{}]创建了:{} ", flowableVariableEvent.getVariableName(), + flowableVariableEvent.getVariableValue()); + } + if (event.getType().toString().equals(FlowableEngineEventType.VARIABLE_DELETED.toString())) { + // 变量删除了 + FlowableVariableEvent flowableVariableEvent = (FlowableVariableEvent) event; + log.debug("变量[{}]删除了:{} ", flowableVariableEvent.getVariableName(), + flowableVariableEvent.getVariableValue()); + } + if (event.getType().toString() + .equals(FlowableEngineEventType.PROCESS_COMPLETED_WITH_TERMINATE_END_EVENT.toString())) { + // 流程开完成 + FlowableProcessTerminatedEventImpl e = (FlowableProcessTerminatedEventImpl) event; + DelegateExecution execution = e.getExecution(); + String processInstanceId = e.getProcessInstanceId(); + ExecutionEntityImpl entity = (ExecutionEntityImpl) e.getEntity(); + + ProcessInstanceParamDto processInstanceParamDto = new ProcessInstanceParamDto(); + processInstanceParamDto.setProcessInstanceId(processInstanceId); + remoteFlowTaskService.endProcessEvent(processInstanceParamDto); + + } + + ObjectMapper objectMapper = SpringUtil.getBean(ObjectMapper.class); + if (event.getType().toString().equals(FlowableEngineEventType.TASK_COMPLETED.toString())) { + + TaskService taskService = SpringUtil.getBean(TaskService.class); + + // 任务完成 + FlowableEntityEvent flowableEntityEvent = (FlowableEntityEvent) event; + TaskEntityImpl task = (TaskEntityImpl) flowableEntityEvent.getEntity(); + // 执行人id + String assignee = task.getAssignee(); + + // nodeid + String taskDefinitionKey = task.getTaskDefinitionKey(); + + // 实例id + String processInstanceId = task.getProcessInstanceId(); + + String processDefinitionId = task.getProcessDefinitionId(); + // 流程id + String flowId = NodeUtil.getFlowId(processDefinitionId); + ProcessNodeRecordAssignUserParamDto processNodeRecordAssignUserParamDto = new ProcessNodeRecordAssignUserParamDto(); + processNodeRecordAssignUserParamDto.setFlowId(flowId); + processNodeRecordAssignUserParamDto.setProcessInstanceId(processInstanceId); + processNodeRecordAssignUserParamDto + .setData(objectMapper.writeValueAsString(taskService.getVariables(task.getId()))); + processNodeRecordAssignUserParamDto + .setLocalData(objectMapper.writeValueAsString(taskService.getVariablesLocal(task.getId()))); + processNodeRecordAssignUserParamDto.setNodeId(taskDefinitionKey); + processNodeRecordAssignUserParamDto.setUserId(Long.parseLong(assignee)); + processNodeRecordAssignUserParamDto.setTaskId(task.getId()); + processNodeRecordAssignUserParamDto.setNodeName(task.getName()); + processNodeRecordAssignUserParamDto.setTaskType("COMPLETE"); + processNodeRecordAssignUserParamDto.setApproveDesc(Convert.toStr(task.getVariableLocal("approveDesc"))); + processNodeRecordAssignUserParamDto.setExecutionId(task.getExecutionId()); + + remoteFlowTaskService.taskEndEvent(processNodeRecordAssignUserParamDto); + + } + if (event.getType().toString().equals(FlowableEngineEventType.TASK_ASSIGNED.toString())) { + // 任务被指派了人员 + FlowableEntityEvent flowableEntityEvent = (FlowableEntityEvent) event; + TaskEntityImpl task = (TaskEntityImpl) flowableEntityEvent.getEntity(); + // 执行人id + String assignee = task.getAssignee(); + // 任务拥有者 + String owner = task.getOwner(); + // + String delegationStateString = task.getDelegationStateString(); + + // nodeid + String taskDefinitionKey = task.getTaskDefinitionKey(); + + // 实例id + String processInstanceId = task.getProcessInstanceId(); + + String processDefinitionId = task.getProcessDefinitionId(); + // 流程id + String flowId = NodeUtil.getFlowId(processDefinitionId); + ProcessNodeRecordAssignUserParamDto processNodeRecordAssignUserParamDto = new ProcessNodeRecordAssignUserParamDto(); + processNodeRecordAssignUserParamDto.setFlowId(flowId); + processNodeRecordAssignUserParamDto.setProcessInstanceId(processInstanceId); + // processNodeRecordAssignUserParamDto.setData(); + processNodeRecordAssignUserParamDto.setNodeId(taskDefinitionKey); + processNodeRecordAssignUserParamDto.setUserId(Long.parseLong(assignee)); + processNodeRecordAssignUserParamDto.setTaskId(task.getId()); + processNodeRecordAssignUserParamDto.setNodeName(task.getName()); + processNodeRecordAssignUserParamDto + .setTaskType(StrUtil.equals(DelegationState.PENDING.toString(), delegationStateString) + ? "DELEGATION" : (StrUtil.equals(DelegationState.RESOLVED.toString(), delegationStateString) + ? "RESOLVED" : "")); + processNodeRecordAssignUserParamDto.setApproveDesc(Convert.toStr(task.getVariableLocal("approveDesc"))); + processNodeRecordAssignUserParamDto.setExecutionId(task.getExecutionId()); + + remoteFlowTaskService.startAssignUser(processNodeRecordAssignUserParamDto); + + } + + if (event.getType().toString().equals(FlowableEngineEventType.PROCESS_STARTED.toString())) { + // 流程开始了 + FlowableProcessStartedEventImpl flowableProcessStartedEvent = (FlowableProcessStartedEventImpl) event; + + ExecutionEntityImpl entity = (ExecutionEntityImpl) flowableProcessStartedEvent.getEntity(); + DelegateExecution execution = flowableProcessStartedEvent.getExecution(); + String processInstanceId = flowableProcessStartedEvent.getProcessInstanceId(); + { + // 上级实例id + String nestedProcessInstanceId = flowableProcessStartedEvent.getNestedProcessInstanceId(); + + String flowId = entity.getProcessDefinitionKey(); + + Object variable = execution.getVariable("root"); + + List nodeUsers = objectMapper.readValue(objectMapper.writeValueAsString(variable), + new TypeReference>() { + }); + Long startUserId = nodeUsers.get(0).getId(); + Map variables = execution.getVariables(); + + ProcessInstanceRecordParamDto processInstanceRecordParamDto = new ProcessInstanceRecordParamDto(); + processInstanceRecordParamDto.setUserId(startUserId); + processInstanceRecordParamDto.setParentProcessInstanceId(nestedProcessInstanceId); + processInstanceRecordParamDto.setFlowId(flowId); + processInstanceRecordParamDto.setProcessInstanceId(processInstanceId); + processInstanceRecordParamDto.setFormData(objectMapper.writeValueAsString(variables)); + remoteFlowTaskService.createProcessEvent(processInstanceRecordParamDto); + } + + } + } + + /** + * 如果监听器抛出异常是否终止当前操作 + * @return 是否终止当前操作 + */ + @Override + public boolean isFailOnException() { + return false; + } + + /** + * 返回监听器是否在事务生命周期事件发生时立即触发 + * @return 是否在事务生命周期事件上触发 + */ + @Override + public boolean isFireOnTransactionLifecycleEvent() { + return false; + } + + /** + * 如果非空,表示在当前事务的生命周期中的触发点 + * @return 事务生命周期中的触发点 + */ + @Override + public String getOnTransaction() { + return null; + } + +} diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/node/AssignUserStrategy.java b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/node/AssignUserStrategy.java new file mode 100644 index 0000000..7ae9a9d --- /dev/null +++ b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/node/AssignUserStrategy.java @@ -0,0 +1,22 @@ +package com.pig4cloud.pigx.flow.engine.node; + +import com.pig4cloud.pigx.flow.task.dto.Node; +import com.pig4cloud.pigx.flow.task.dto.NodeUser; + +import java.util.List; +import java.util.Map; + +/** + * 指定用户策略处理器 + */ +public interface AssignUserStrategy { + + /** + * 抽象方法 处理表达式 + * @param node + * @param rootUser + * @param variables + */ + List handle(Node node, NodeUser rootUser, Map variables); + +} diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/node/MultiInstanceHandler.java b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/node/MultiInstanceHandler.java new file mode 100644 index 0000000..2824d22 --- /dev/null +++ b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/node/MultiInstanceHandler.java @@ -0,0 +1,137 @@ +package com.pig4cloud.pigx.flow.engine.node; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.StrUtil; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.pig4cloud.pigx.flow.task.api.feign.RemoteFlowTaskService; +import com.pig4cloud.pigx.flow.task.constant.ProcessInstanceConstant; +import com.pig4cloud.pigx.flow.task.dto.Node; +import com.pig4cloud.pigx.flow.task.dto.NodeUser; +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.impl.persistence.entity.ExecutionEntityImpl; +import org.springframework.stereotype.Component; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.stream.Collectors; + +@Slf4j +@RequiredArgsConstructor +@Component("multiInstanceHandler") +public class MultiInstanceHandler { + + private final RemoteFlowTaskService remoteFlowTaskService; + + private final Map assignUserStrategyMap; + + private final ObjectMapper objectMapper; + + /** + * 解析执行人 + * @param execution 流程执行对象 + * @return 执行人集合 + */ + @SneakyThrows + public List resolveAssignee(DelegateExecution execution) { + // 执行人集合 + List assignList = new ArrayList<>(); + + ExecutionEntityImpl entity = (ExecutionEntityImpl) execution; + + String flowId = entity.getProcessDefinitionKey(); + String nodeId = entity.getActivityId(); + + log.debug("nodeId={} nodeName={}", nodeId, entity.getActivityName()); + + // 发起人 + Object rootUserObj = execution.getVariable("root"); + String rootUserJson = objectMapper.writeValueAsString(rootUserObj); + NodeUser rootUser = objectMapper.readValue(rootUserJson, new TypeReference>() { + }).get(0); + + // 节点数据 + Node node = remoteFlowTaskService.queryNodeOriData(flowId, nodeId).getData(); + if (node != null) { + Map variables = execution.getVariables(); + Integer assignedType = node.getAssignedType(); + List userIdList = assignUserStrategyMap.get(assignedType + "AssignUserStrategy").handle(node, + rootUser, variables); + assignList.addAll(userIdList); + } + else { + // 默认值 + String format = StrUtil.format("{}_assignee_default_list", nodeId); + Object variable = execution.getVariable(format); + String variableJson = objectMapper.writeValueAsString(variable); + + List nodeUserDtos = objectMapper.readValue(variableJson, new TypeReference>() { + }); + if (CollUtil.isNotEmpty(nodeUserDtos)) { + List collect = nodeUserDtos.stream().map(NodeUser::getId).collect(Collectors.toList()); + assignList.addAll(collect); + } + } + + Optional.of(assignList).orElseGet(() -> { + List defaultList = new ArrayList<>(); + defaultList.add(ProcessInstanceConstant.DEFAULT_EMPTY_ASSIGN); + return defaultList; + }); + + return assignList; + } + + /** + * 会签或者或签完成条件检查 检查节点是否满足会签或者或签的完成条件 + * @param execution 执行实例对象 + * @return boolean 如果节点满足条件则返回true,否则返回false + */ + public boolean completionCondition(DelegateExecution execution) { + ExecutionEntityImpl entity = (ExecutionEntityImpl) execution; + String processDefinitionKey = entity.getProcessDefinitionKey(); + String nodeId = execution.getCurrentActivityId(); + + Node node = remoteFlowTaskService.queryNodeOriData(processDefinitionKey, nodeId).getData(); + Integer multipleMode = node.getMultipleMode(); + BigDecimal modePercentage = BigDecimal.valueOf(100); + + Object variable = execution.getVariable(StrUtil.format("{}_approve_condition", nodeId)); + log.debug("当前节点审批结果:{}", variable); + Boolean approve = Convert.toBool(variable); + + if (multipleMode == ProcessInstanceConstant.MULTIPLE_MODE_AL_SAME + || multipleMode == ProcessInstanceConstant.MULTIPLE_MODE_ALL_SORT) { + // 如果是会签或者顺序签署 + if (!approve) { + return true; + } + } + + if (multipleMode == ProcessInstanceConstant.MULTIPLE_MODE_ONE) { + // 如果是或签 + if (approve) { + return true; + } + } + + int nrOfInstances = (int) execution.getVariable("nrOfInstances"); + int nrOfCompletedInstances = (int) execution.getVariable("nrOfCompletedInstances"); + log.debug("当前节点完成实例数:{} 总实例数:{} 需要完成比例:{}", nrOfCompletedInstances, nrOfInstances, modePercentage); + + if (multipleMode == ProcessInstanceConstant.MULTIPLE_MODE_AL_SAME) { + return BigDecimal.valueOf(nrOfCompletedInstances * 100L) + .compareTo(BigDecimal.valueOf(nrOfCompletedInstances).multiply(modePercentage)) > 0; + } + + return nrOfCompletedInstances == nrOfInstances; + } + +} diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/node/impl/AssignUserFixedStrategyImpl.java b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/node/impl/AssignUserFixedStrategyImpl.java new file mode 100644 index 0000000..7ccab10 --- /dev/null +++ b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/node/impl/AssignUserFixedStrategyImpl.java @@ -0,0 +1,68 @@ +package com.pig4cloud.pigx.flow.engine.node.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.pig4cloud.pigx.admin.api.entity.SysUser; +import com.pig4cloud.pigx.admin.api.feign.RemoteUserService; +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.flow.engine.node.AssignUserStrategy; +import com.pig4cloud.pigx.flow.task.constant.NodeUserTypeEnum; +import com.pig4cloud.pigx.flow.task.constant.ProcessInstanceConstant; +import com.pig4cloud.pigx.flow.task.dto.Node; +import com.pig4cloud.pigx.flow.task.dto.NodeUser; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 指定具体用户 + * + * @author Huijun Zhao + * @description + * @date 2023-07-07 13:42 + */ +@RequiredArgsConstructor +@Component(ProcessInstanceConstant.AssignedTypeClass.USER + "AssignUserStrategy") +public class AssignUserFixedStrategyImpl implements AssignUserStrategy { + + private final RemoteUserService remoteUserService; + + /** + * 处理节点并返回用户ID列表。 + * @param node 节点 + * @param rootUser 根用户 + * @param variables 变量 + * @return 用户ID列表 + */ + @Override + public List handle(Node node, NodeUser rootUser, Map variables) { + + // 指定人员 + List userDtoList = node.getNodeUserList(); + // 用户ID列表 + List userIdList = userDtoList.stream() + .filter(w -> StrUtil.equals(w.getType(), NodeUserTypeEnum.USER.getKey())).map(NodeUser::getId) + .collect(Collectors.toList()); + // 部门ID列表 + List deptIdList = userDtoList.stream() + .filter(w -> StrUtil.equals(w.getType(), NodeUserTypeEnum.DEPT.getKey())).map(NodeUser::getId) + .collect(Collectors.toList()); + + if (CollUtil.isNotEmpty(deptIdList)) { + R> r = remoteUserService.getUserIdListByDeptIdList(deptIdList); + if (CollUtil.isNotEmpty(r.getData())) { + for (SysUser user : r.getData()) { + if (!userIdList.contains(user.getUserId())) { + userIdList.add(user.getUserId()); + } + } + } + } + + return userIdList; + } + +} diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/node/impl/AssignUserFormStrategyImpl.java b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/node/impl/AssignUserFormStrategyImpl.java new file mode 100644 index 0000000..d0ca251 --- /dev/null +++ b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/node/impl/AssignUserFormStrategyImpl.java @@ -0,0 +1,47 @@ +package com.pig4cloud.pigx.flow.engine.node.impl; + +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.pig4cloud.pigx.flow.engine.node.AssignUserStrategy; +import com.pig4cloud.pigx.flow.task.constant.ProcessInstanceConstant; +import com.pig4cloud.pigx.flow.task.dto.Node; +import com.pig4cloud.pigx.flow.task.dto.NodeUser; +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 来自表单 + * + * @author Huijun Zhao + * @description + * @date 2023-07-07 13:42 + */ +@RequiredArgsConstructor +@Component(ProcessInstanceConstant.AssignedTypeClass.FORM_USER + "AssignUserStrategy") +public class AssignUserFormStrategyImpl implements AssignUserStrategy { + + private final ObjectMapper objectMapper; + + @SneakyThrows + @Override + public List handle(Node node, NodeUser rootUser, Map variables) { + List assignList = new ArrayList<>(); + + Object variable = variables.get(node.getFormUserId()); + if (variable != null && !StrUtil.isBlankIfStr(variable)) { + String jsonString = objectMapper.writeValueAsString(variable); + List nodeUserDtoList = JSONUtil.toList(jsonString, NodeUser.class); + assignList.addAll(nodeUserDtoList.stream().map(NodeUser::getId).collect(Collectors.toList())); + } + + return assignList; + } + +} diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/node/impl/AssignUserLeaderStrategyImpl.java b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/node/impl/AssignUserLeaderStrategyImpl.java new file mode 100644 index 0000000..cf71808 --- /dev/null +++ b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/node/impl/AssignUserLeaderStrategyImpl.java @@ -0,0 +1,40 @@ +package com.pig4cloud.pigx.flow.engine.node.impl; + +import com.pig4cloud.pigx.admin.api.feign.RemoteDeptService; +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.flow.engine.node.AssignUserStrategy; +import com.pig4cloud.pigx.flow.task.constant.ProcessInstanceConstant; +import com.pig4cloud.pigx.flow.task.dto.Node; +import com.pig4cloud.pigx.flow.task.dto.NodeUser; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + * 指定主管 + * + * @author Huijun Zhao + * @description + * @date 2023-07-07 13:42 + */ +@RequiredArgsConstructor +@Component(ProcessInstanceConstant.AssignedTypeClass.LEADER + "AssignUserStrategy") +public class AssignUserLeaderStrategyImpl implements AssignUserStrategy { + + private final RemoteDeptService deptService; + + @Override + public List handle(Node node, NodeUser rootUser, Map variables) { + // 获取部门ID + return node.getNodeUserList().stream().map(nodeUser -> deptService.getAllDeptLeader(nodeUser.getId())) + .flatMap((Function>, Stream>) listR -> listR.getData() == null ? null + : listR.getData().stream()) + .collect(Collectors.toList()); + } + +} diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/node/impl/AssignUserRoleStrategyImpl.java b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/node/impl/AssignUserRoleStrategyImpl.java new file mode 100644 index 0000000..7140475 --- /dev/null +++ b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/node/impl/AssignUserRoleStrategyImpl.java @@ -0,0 +1,50 @@ +package com.pig4cloud.pigx.flow.engine.node.impl; + +import com.pig4cloud.pigx.admin.api.feign.RemoteUserService; +import com.pig4cloud.pigx.common.core.util.RetOps; +import com.pig4cloud.pigx.flow.engine.node.AssignUserStrategy; +import com.pig4cloud.pigx.flow.task.constant.ProcessInstanceConstant; +import com.pig4cloud.pigx.flow.task.dto.Node; +import com.pig4cloud.pigx.flow.task.dto.NodeUser; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 来自角色 + * + * @author Huijun Zhao + * @description + * @date 2023-07-07 13:42 + */ +@RequiredArgsConstructor +@Component(ProcessInstanceConstant.AssignedTypeClass.ROLE + "AssignUserStrategy") +public class AssignUserRoleStrategyImpl implements AssignUserStrategy { + + private final RemoteUserService remoteUserService; + + /** + * 处理节点并返回用户ID列表。 + * @param node 节点 + * @param rootUser 根用户 + * @param variables 变量 + * @return 用户ID列表 + */ + @Override + public List handle(Node node, NodeUser rootUser, Map variables) { + // 使用 lambda 表达式和方法引用从 NodeUser 列表中提取角色 ID + List roleIds = node.getNodeUserList().stream().map(NodeUser::getId).collect(Collectors.toList()); + // 提取 Optional 结果中的数据 + List data = RetOps.of(remoteUserService.getUserIdListByRoleIdList(roleIds)).getData() + .orElseGet(Collections::emptyList); + + // 返回用户 ID 列表 + return new ArrayList<>(data); + } + +} diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/node/impl/AssignUserSelfSelectStrategyImpl.java b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/node/impl/AssignUserSelfSelectStrategyImpl.java new file mode 100644 index 0000000..533eb7e --- /dev/null +++ b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/node/impl/AssignUserSelfSelectStrategyImpl.java @@ -0,0 +1,56 @@ +package com.pig4cloud.pigx.flow.engine.node.impl; + +import cn.hutool.core.util.StrUtil; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.pig4cloud.pigx.flow.engine.node.AssignUserStrategy; +import com.pig4cloud.pigx.flow.task.constant.ProcessInstanceConstant; +import com.pig4cloud.pigx.flow.task.dto.Node; +import com.pig4cloud.pigx.flow.task.dto.NodeUser; +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 发起人自选 + * + * @author Huijun Zhao + * @description + * @date 2023-07-07 13:42 + */ +@Slf4j +@RequiredArgsConstructor +@Component(ProcessInstanceConstant.AssignedTypeClass.SELF_SELECT + "AssignUserStrategy") +public class AssignUserSelfSelectStrategyImpl implements AssignUserStrategy { + + private final ObjectMapper objectMapper; + + @SneakyThrows + @Override + public List handle(Node node, NodeUser rootUser, Map variables) { + + List assignList = new ArrayList<>(); + + Object variable = variables.get(StrUtil.format("{}_assignee_select", node.getId())); + log.info("{}-发起人自选参数:{}", node.getName(), variable); + if (variable == null) { + return assignList; + } + + List nodeUserDtos = objectMapper.readValue(objectMapper.writeValueAsString(variable), + new TypeReference>() { + }); + + List collect = nodeUserDtos.stream().map(NodeUser::getId).collect(Collectors.toList()); + + assignList.addAll(collect); + return assignList; + } + +} diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/node/impl/AssignUserSelfStrategyImpl.java b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/node/impl/AssignUserSelfStrategyImpl.java new file mode 100644 index 0000000..250a0d9 --- /dev/null +++ b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/node/impl/AssignUserSelfStrategyImpl.java @@ -0,0 +1,28 @@ +package com.pig4cloud.pigx.flow.engine.node.impl; + +import cn.hutool.core.collection.CollUtil; +import com.pig4cloud.pigx.flow.engine.node.AssignUserStrategy; +import com.pig4cloud.pigx.flow.task.constant.ProcessInstanceConstant; +import com.pig4cloud.pigx.flow.task.dto.Node; +import com.pig4cloud.pigx.flow.task.dto.NodeUser; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.Map; + +/** + * 发起人自己 + * + * @author Huijun Zhao + * @description + * @date 2023-07-07 13:42 + */ +@Component(ProcessInstanceConstant.AssignedTypeClass.SELF + "AssignUserStrategy") +public class AssignUserSelfStrategyImpl implements AssignUserStrategy { + + @Override + public List handle(Node node, NodeUser rootUser, Map variables) { + return CollUtil.newArrayList(rootUser.getId()); + } + +} diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/service/ApproveServiceTask.java b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/service/ApproveServiceTask.java new file mode 100644 index 0000000..a5eec86 --- /dev/null +++ b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/service/ApproveServiceTask.java @@ -0,0 +1,59 @@ +package com.pig4cloud.pigx.flow.engine.service; + +import cn.hutool.core.util.StrUtil; +import cn.hutool.extra.spring.SpringUtil; +import com.pig4cloud.pigx.flow.task.api.feign.RemoteFlowTaskService; +import com.pig4cloud.pigx.flow.task.dto.Node; +import com.pig4cloud.pigx.flow.task.dto.Refuse; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.JavaDelegate; +import org.flowable.engine.impl.persistence.entity.ExecutionEntityImpl; + +/** + * 审批任务处理器--java服务任务 + */ +@Slf4j +public class ApproveServiceTask implements JavaDelegate { + + @Override + public void execute(DelegateExecution execution) { + + ExecutionEntityImpl entity = (ExecutionEntityImpl) execution; + String nodeIdO = entity.getActivityId(); + String flowId = entity.getProcessDefinitionKey(); + String processInstanceId = entity.getProcessInstanceId(); + + String nodeId = StrUtil.subAfter(nodeIdO, "approve_service_task_", true); + + Boolean approve = execution.getVariable(StrUtil.format("{}_approve_condition", nodeId), Boolean.class); + + if (approve != null) { + + RuntimeService runtimeService = SpringUtil.getBean(RuntimeService.class); + + if (!approve) { + // 跳转 + RemoteFlowTaskService remoteFlowTaskService = SpringUtil.getBean(RemoteFlowTaskService.class); + Node node = remoteFlowTaskService.queryNodeOriData(flowId, nodeId).getData(); + Refuse refuse = node.getRefuse(); + if (refuse != null) { + String handler = refuse.getHandler(); + if (StrUtil.equals(handler, "TO_NODE")) { + runtimeService.createChangeActivityStateBuilder().processInstanceId(processInstanceId) + .moveActivityIdTo(nodeIdO, refuse.getNodeId()).changeState(); + } + else { + runtimeService.createChangeActivityStateBuilder().processInstanceId(processInstanceId) + .moveActivityIdTo(nodeIdO, "end").changeState(); + } + } + + } + + } + + } + +} diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/service/CopyServiceTask.java b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/service/CopyServiceTask.java new file mode 100644 index 0000000..c8e941c --- /dev/null +++ b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/service/CopyServiceTask.java @@ -0,0 +1,95 @@ +package com.pig4cloud.pigx.flow.engine.service; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.StrUtil; +import cn.hutool.extra.spring.SpringUtil; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.flow.task.api.feign.RemoteFlowTaskService; +import com.pig4cloud.pigx.flow.task.constant.NodeUserTypeEnum; +import com.pig4cloud.pigx.flow.task.dto.Node; +import com.pig4cloud.pigx.flow.task.dto.NodeUser; +import com.pig4cloud.pigx.flow.task.dto.ProcessCopyDto; +import lombok.SneakyThrows; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.JavaDelegate; +import org.flowable.engine.impl.persistence.entity.ExecutionEntityImpl; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 抄送任务处理器--java服务任务 + */ +public class CopyServiceTask implements JavaDelegate { + + /** + * 执行给定执行的任务。 + * @param execution 要处理的执行 + */ + @SneakyThrows + @Override + public void execute(DelegateExecution execution) { + + ExecutionEntityImpl entity = (ExecutionEntityImpl) execution; + String nodeId = entity.getActivityId(); + String flowId = entity.getProcessDefinitionKey(); + + RemoteFlowTaskService remoteFlowTaskService = SpringUtil.getBean(RemoteFlowTaskService.class); + Node node = remoteFlowTaskService.queryNodeOriData(flowId, nodeId).getData(); + + // 获取指定人员 + List userDtoList = node.getNodeUserList(); + // 用户ID列表 + List userIdList = userDtoList.stream() + .filter(w -> StrUtil.equals(w.getType(), NodeUserTypeEnum.USER.getKey())) + .map(w -> Convert.toStr(w.getId())).collect(Collectors.toList()); + // 部门ID列表 + List deptIdList = userDtoList.stream() + .filter(w -> StrUtil.equals(w.getType(), NodeUserTypeEnum.DEPT.getKey())) + .map(w -> Convert.toStr(w.getId())).collect(Collectors.toList()); + + if (CollUtil.isNotEmpty(deptIdList)) { + + R> r = remoteFlowTaskService.queryUserIdListByDepIdList(deptIdList); + + List data = r.getData(); + if (CollUtil.isNotEmpty(data)) { + for (String datum : data) { + if (!userIdList.contains(datum)) { + userIdList.add(datum); + } + } + } + } + + ObjectMapper objectMapper = SpringUtil.getBean(ObjectMapper.class); + // 获取发起人 + Object rootUserObj = execution.getVariable("root"); + NodeUser rootUser = objectMapper + .readValue(objectMapper.writeValueAsString(rootUserObj), new TypeReference>() { + }).get(0); + + Map variables = execution.getVariables(); + + for (String userIds : userIdList) { + // 发送抄送任务 + ProcessCopyDto processCopyDto = new ProcessCopyDto(); + processCopyDto.setNodeTime(LocalDateTime.now()); + processCopyDto.setStartUserId(rootUser.getId()); + processCopyDto.setFlowId(flowId); + processCopyDto.setProcessInstanceId(execution.getProcessInstanceId()); + processCopyDto.setNodeId(nodeId); + processCopyDto.setNodeName(node.getName()); + processCopyDto.setFormData(objectMapper.writeValueAsString(variables)); + processCopyDto.setUserId(Long.parseLong(userIds)); + remoteFlowTaskService.saveCC(processCopyDto); + } + + } + +} diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/service/packge-info.java b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/service/packge-info.java new file mode 100644 index 0000000..d82d6d3 --- /dev/null +++ b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/service/packge-info.java @@ -0,0 +1,4 @@ +/* + * @author pigx archetype + */ +package com.pig4cloud.pigx.flow.engine.service; \ No newline at end of file diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/utils/FlowableUtils.java b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/utils/FlowableUtils.java new file mode 100644 index 0000000..d7914ee --- /dev/null +++ b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/utils/FlowableUtils.java @@ -0,0 +1,664 @@ +package com.pig4cloud.pigx.flow.engine.utils; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.flowable.bpmn.model.*; +import org.flowable.engine.history.HistoricActivityInstance; +import org.flowable.engine.impl.bpmn.behavior.ParallelMultiInstanceBehavior; +import org.flowable.engine.impl.bpmn.behavior.SequentialMultiInstanceBehavior; + +import java.util.*; + +/** + * 流程引擎工具类封装 + * + * @author: linjinp + * @create: 2019-12-24 13:51 + **/ +public class FlowableUtils { + + public static final Logger logger = LogManager.getLogger(FlowableUtils.class); + + /** + * 根据节点获取入口连线集合 + * @param source 流程元素节点 + * @return 入口连线集合 + */ + public static List getElementIncomingFlows(FlowElement source) { + List sequenceFlows = null; + if (source instanceof Task) { + sequenceFlows = ((Task) source).getIncomingFlows(); + } + else if (source instanceof Gateway) { + sequenceFlows = ((Gateway) source).getIncomingFlows(); + } + else if (source instanceof SubProcess) { + sequenceFlows = ((SubProcess) source).getIncomingFlows(); + } + else if (source instanceof StartEvent) { + sequenceFlows = ((StartEvent) source).getIncomingFlows(); + } + else if (source instanceof EndEvent) { + sequenceFlows = ((EndEvent) source).getIncomingFlows(); + } + return sequenceFlows; + } + + /** + * 根据节点获取出口连线集合 + * @param source 流程元素节点 + * @return 出口连线集合 + */ + public static List getElementOutgoingFlows(FlowElement source) { + List sequenceFlows = null; + if (source instanceof Task) { + sequenceFlows = ((Task) source).getOutgoingFlows(); + } + else if (source instanceof Gateway) { + sequenceFlows = ((Gateway) source).getOutgoingFlows(); + } + else if (source instanceof SubProcess) { + sequenceFlows = ((SubProcess) source).getOutgoingFlows(); + } + else if (source instanceof StartEvent) { + sequenceFlows = ((StartEvent) source).getOutgoingFlows(); + } + else if (source instanceof EndEvent) { + sequenceFlows = ((EndEvent) source).getOutgoingFlows(); + } + return sequenceFlows; + } + + /** + * 递归获取流程定义所有的流程元素 + * @param flowElements 当前级别流程元素集合 + * @param allElements 用于存储的全部流程元素集合 + * @return 全部流程元素集合 + */ + public static Collection getAllElements(Collection flowElements, + Collection allElements) { + allElements = allElements == null ? new ArrayList<>() : allElements; + + for (FlowElement flowElement : flowElements) { + allElements.add(flowElement); + if (flowElement instanceof SubProcess) { + // 继续深入子流程,进一步获取子流程 + allElements = FlowableUtils.getAllElements(((SubProcess) flowElement).getFlowElements(), allElements); + } + } + return allElements; + } + + /** + * 从后向前递归获取父级用户任务节点 + * @param source 当前节点 + * @param hasSequenceFlow 已处理过的顺序流集合,避免循环 + * @param userTaskList 递归获取的用户任务节点集合 + * @return 用户任务节点集合 + */ + public static List iteratorFindParentUserTasks(FlowElement source, Set hasSequenceFlow, + List userTaskList) { + userTaskList = userTaskList == null ? new ArrayList<>() : userTaskList; + hasSequenceFlow = hasSequenceFlow == null ? new HashSet<>() : hasSequenceFlow; + + // 如果该节点为开始节点,且存在上级子节点,则顺着上级子节点继续迭代 + if (source instanceof StartEvent && source.getSubProcess() != null) { + userTaskList = iteratorFindParentUserTasks(source.getSubProcess(), hasSequenceFlow, userTaskList); + } + + // 根据类型,获取入口连线 + List sequenceFlows = getElementIncomingFlows(source); + + if (sequenceFlows != null) { + // 循环找到目标元素 + for (SequenceFlow sequenceFlow : sequenceFlows) { + // 如果发现连线重复,说明循环了,跳过这个循环 + if (hasSequenceFlow.contains(sequenceFlow.getId())) { + continue; + } + // 添加已经走过的连线 + hasSequenceFlow.add(sequenceFlow.getId()); + // 类型为用户节点,则新增父级节点 + if (sequenceFlow.getSourceFlowElement() instanceof UserTask) { + userTaskList.add((UserTask) sequenceFlow.getSourceFlowElement()); + continue; + } + // 类型为子流程,则添加子流程开始节点出口处相连的节点 + if (sequenceFlow.getSourceFlowElement() instanceof SubProcess) { + // 获取子流程用户任务节点 + List childUserTaskList = findChildProcessUserTasks( + (StartEvent) ((SubProcess) sequenceFlow.getSourceFlowElement()).getFlowElements() + .toArray()[0], + null, null); + // 如果找到节点,则说明该线路找到节点,不继续向下找,反之继续 + if (childUserTaskList != null && childUserTaskList.size() > 0) { + userTaskList.addAll(childUserTaskList); + continue; + } + } + // 继续迭代 + // 注意:已经经过的节点与连线都应该用浅拷贝出来的对象 + // 比如分支:a->b->c与a->d->c,走完a->b->c后走另一个路线是,已经经过的节点应该不包含a->b->c路线的数据 + userTaskList = iteratorFindParentUserTasks(sequenceFlow.getSourceFlowElement(), + new HashSet<>(hasSequenceFlow), userTaskList); + } + } + return userTaskList; + } + + /** + * 根据正在运行的任务节点,迭代获取子级任务节点列表,向后找 + * @param source 起始节点 + * @param runActiveIdList 正在运行的任务 Key,用于校验任务节点是否是正在运行的节点 + * @param hasSequenceFlow 已经经过的连线的 ID,用于判断线路是否重复 + * @param flowElementList 需要撤回的用户任务列表 + * @return + */ + public static List iteratorFindChildUserTasks(FlowElement source, List runActiveIdList, + Set hasSequenceFlow, List flowElementList) { + hasSequenceFlow = hasSequenceFlow == null ? new HashSet<>() : hasSequenceFlow; + flowElementList = flowElementList == null ? new ArrayList<>() : flowElementList; + + // 如果该节点为开始节点,且存在上级子节点,则顺着上级子节点继续迭代 + if (source instanceof EndEvent && source.getSubProcess() != null) { + flowElementList = iteratorFindChildUserTasks(source.getSubProcess(), runActiveIdList, hasSequenceFlow, + flowElementList); + } + + // 根据类型,获取出口连线 + List sequenceFlows = getElementOutgoingFlows(source); + + if (sequenceFlows != null) { + // 循环找到目标元素 + for (SequenceFlow sequenceFlow : sequenceFlows) { + // 如果发现连线重复,说明循环了,跳过这个循环 + if (hasSequenceFlow.contains(sequenceFlow.getId())) { + continue; + } + // 添加已经走过的连线 + hasSequenceFlow.add(sequenceFlow.getId()); + // 如果为用户任务类型,或者为网关 + // 活动节点ID 在运行的任务中存在,添加 + if ((sequenceFlow.getTargetFlowElement() instanceof UserTask + || sequenceFlow.getTargetFlowElement() instanceof Gateway) + && runActiveIdList.contains((sequenceFlow.getTargetFlowElement()).getId())) { + flowElementList.add(sequenceFlow.getTargetFlowElement()); + continue; + } + // 如果节点为子流程节点情况,则从节点中的第一个节点开始获取 + if (sequenceFlow.getTargetFlowElement() instanceof SubProcess) { + List childUserTaskList = iteratorFindChildUserTasks( + (FlowElement) (((SubProcess) sequenceFlow.getTargetFlowElement()).getFlowElements() + .toArray()[0]), + runActiveIdList, hasSequenceFlow, null); + // 如果找到节点,则说明该线路找到节点,不继续向下找,反之继续 + if (childUserTaskList != null && childUserTaskList.size() > 0) { + flowElementList.addAll(childUserTaskList); + continue; + } + } + // 继续迭代 + // 注意:已经经过的节点与连线都应该用浅拷贝出来的对象 + // 比如分支:a->b->c与a->d->c,走完a->b->c后走另一个路线是,已经经过的节点应该不包含a->b->c路线的数据 + flowElementList = iteratorFindChildUserTasks(sequenceFlow.getTargetFlowElement(), runActiveIdList, + new HashSet<>(hasSequenceFlow), flowElementList); + } + } + return flowElementList; + } + + /** + * 迭代获取子流程用户任务节点 + * @param source 起始节点 + * @param hasSequenceFlow 已经经过的连线的 ID,用于判断线路是否重复 + * @param userTaskList 需要撤回的用户任务列表 + * @return + */ + public static List findChildProcessUserTasks(FlowElement source, Set hasSequenceFlow, + List userTaskList) { + hasSequenceFlow = hasSequenceFlow == null ? new HashSet<>() : hasSequenceFlow; + userTaskList = userTaskList == null ? new ArrayList<>() : userTaskList; + + // 根据类型,获取出口连线 + List sequenceFlows = getElementOutgoingFlows(source); + + if (sequenceFlows != null) { + // 循环找到目标元素 + for (SequenceFlow sequenceFlow : sequenceFlows) { + // 如果发现连线重复,说明循环了,跳过这个循环 + if (hasSequenceFlow.contains(sequenceFlow.getId())) { + continue; + } + // 添加已经走过的连线 + hasSequenceFlow.add(sequenceFlow.getId()); + // 如果为用户任务类型,且任务节点的 Key 正在运行的任务中存在,添加 + if (sequenceFlow.getTargetFlowElement() instanceof UserTask) { + userTaskList.add((UserTask) sequenceFlow.getTargetFlowElement()); + continue; + } + // 如果节点为子流程节点情况,则从节点中的第一个节点开始获取 + if (sequenceFlow.getTargetFlowElement() instanceof SubProcess) { + List childUserTaskList = findChildProcessUserTasks( + (FlowElement) (((SubProcess) sequenceFlow.getTargetFlowElement()).getFlowElements() + .toArray()[0]), + hasSequenceFlow, null); + // 如果找到节点,则说明该线路找到节点,不继续向下找,反之继续 + if (childUserTaskList != null && childUserTaskList.size() > 0) { + userTaskList.addAll(childUserTaskList); + continue; + } + } + // 继续迭代 + // 注意:已经经过的节点与连线都应该用浅拷贝出来的对象 + // 比如分支:a->b->c与a->d->c,走完a->b->c后走另一个路线是,已经经过的节点应该不包含a->b->c路线的数据 + userTaskList = findChildProcessUserTasks(sequenceFlow.getTargetFlowElement(), + new HashSet<>(hasSequenceFlow), userTaskList); + } + } + return userTaskList; + } + + /** + * 从后向前寻路,获取所有脏线路上的点 + * @param source 起始节点 + * @param passRoads 已经经过的点集合 + * @param hasSequenceFlow 已经经过的连线的 ID,用于判断线路是否重复 + * @param targets 目标脏线路终点 + * @param dirtyRoads 确定为脏数据的点,因为不需要重复,因此使用 set 存储 + * @return + */ + public static Set iteratorFindDirtyRoads(FlowElement source, List passRoads, + Set hasSequenceFlow, List targets, Set dirtyRoads) { + passRoads = passRoads == null ? new ArrayList<>() : passRoads; + dirtyRoads = dirtyRoads == null ? new HashSet<>() : dirtyRoads; + hasSequenceFlow = hasSequenceFlow == null ? new HashSet<>() : hasSequenceFlow; + + // 如果该节点为开始节点,且存在上级子节点,则顺着上级子节点继续迭代 + if (source instanceof StartEvent && source.getSubProcess() != null) { + dirtyRoads = iteratorFindDirtyRoads(source.getSubProcess(), passRoads, hasSequenceFlow, targets, + dirtyRoads); + } + + // 根据类型,获取入口连线 + List sequenceFlows = getElementIncomingFlows(source); + + if (sequenceFlows != null) { + // 循环找到目标元素 + for (SequenceFlow sequenceFlow : sequenceFlows) { + // 如果发现连线重复,说明循环了,跳过这个循环 + if (hasSequenceFlow.contains(sequenceFlow.getId())) { + continue; + } + // 添加已经走过的连线 + hasSequenceFlow.add(sequenceFlow.getId()); + // 新增经过的路线 + passRoads.add(sequenceFlow.getSourceFlowElement().getId()); + // 如果此点为目标点,确定经过的路线为脏线路,添加点到脏线路中,然后找下个连线 + if (targets.contains(sequenceFlow.getSourceFlowElement().getId())) { + dirtyRoads.addAll(passRoads); + continue; + } + // 如果该节点为开始节点,且存在上级子节点,则顺着上级子节点继续迭代 + if (sequenceFlow.getSourceFlowElement() instanceof SubProcess) { + dirtyRoads = findChildProcessAllDirtyRoad( + (StartEvent) ((SubProcess) sequenceFlow.getSourceFlowElement()).getFlowElements() + .toArray()[0], + null, dirtyRoads); + // 是否存在子流程上,true 是,false 否 + Boolean isInChildProcess = dirtyTargetInChildProcess( + (StartEvent) ((SubProcess) sequenceFlow.getSourceFlowElement()).getFlowElements() + .toArray()[0], + null, targets, null); + if (isInChildProcess) { + // 已在子流程上找到,该路线结束 + continue; + } + } + // 继续迭代 + // 注意:已经经过的节点与连线都应该用浅拷贝出来的对象 + // 比如分支:a->b->c与a->d->c,走完a->b->c后走另一个路线是,已经经过的节点应该不包含a->b->c路线的数据 + dirtyRoads = iteratorFindDirtyRoads(sequenceFlow.getSourceFlowElement(), new ArrayList<>(passRoads), + new HashSet<>(hasSequenceFlow), targets, dirtyRoads); + } + } + return dirtyRoads; + } + + /** + * 迭代获取子流程脏路线 说明,假如回退的点就是子流程,那么也肯定会回退到子流程最初的用户任务节点,因此子流程中的节点全是脏路线 + * @param source 起始节点 + * @param hasSequenceFlow 已经经过的连线的 ID,用于判断线路是否重复 + * @param dirtyRoads 确定为脏数据的点,因为不需要重复,因此使用 set 存储 + * @return + */ + public static Set findChildProcessAllDirtyRoad(FlowElement source, Set hasSequenceFlow, + Set dirtyRoads) { + hasSequenceFlow = hasSequenceFlow == null ? new HashSet<>() : hasSequenceFlow; + dirtyRoads = dirtyRoads == null ? new HashSet<>() : dirtyRoads; + + // 根据类型,获取出口连线 + List sequenceFlows = getElementOutgoingFlows(source); + + if (sequenceFlows != null) { + // 循环找到目标元素 + for (SequenceFlow sequenceFlow : sequenceFlows) { + // 如果发现连线重复,说明循环了,跳过这个循环 + if (hasSequenceFlow.contains(sequenceFlow.getId())) { + continue; + } + // 添加已经走过的连线 + hasSequenceFlow.add(sequenceFlow.getId()); + // 添加脏路线 + dirtyRoads.add(sequenceFlow.getTargetFlowElement().getId()); + // 如果节点为子流程节点情况,则从节点中的第一个节点开始获取 + if (sequenceFlow.getTargetFlowElement() instanceof SubProcess) { + dirtyRoads = findChildProcessAllDirtyRoad( + (FlowElement) (((SubProcess) sequenceFlow.getTargetFlowElement()).getFlowElements() + .toArray()[0]), + hasSequenceFlow, dirtyRoads); + } + // 继续迭代 + // 注意:已经经过的节点与连线都应该用浅拷贝出来的对象 + // 比如分支:a->b->c与a->d->c,走完a->b->c后走另一个路线是,已经经过的节点应该不包含a->b->c路线的数据 + dirtyRoads = findChildProcessAllDirtyRoad(sequenceFlow.getTargetFlowElement(), + new HashSet<>(hasSequenceFlow), dirtyRoads); + } + } + return dirtyRoads; + } + + /** + * 判断脏路线结束节点是否在子流程上 + * @param source 起始节点 + * @param hasSequenceFlow 已经经过的连线的 ID,用于判断线路是否重复 + * @param targets 判断脏路线节点是否存在子流程上,只要存在一个,说明脏路线只到子流程为止 + * @param inChildProcess 是否存在子流程上,true 是,false 否 + * @return + */ + public static Boolean dirtyTargetInChildProcess(FlowElement source, Set hasSequenceFlow, + List targets, Boolean inChildProcess) { + hasSequenceFlow = hasSequenceFlow == null ? new HashSet<>() : hasSequenceFlow; + inChildProcess = inChildProcess == null ? false : inChildProcess; + + // 根据类型,获取出口连线 + List sequenceFlows = getElementOutgoingFlows(source); + + if (sequenceFlows != null && !inChildProcess) { + // 循环找到目标元素 + for (SequenceFlow sequenceFlow : sequenceFlows) { + // 如果发现连线重复,说明循环了,跳过这个循环 + if (hasSequenceFlow.contains(sequenceFlow.getId())) { + continue; + } + // 添加已经走过的连线 + hasSequenceFlow.add(sequenceFlow.getId()); + // 如果发现目标点在子流程上存在,说明只到子流程为止 + if (targets.contains(sequenceFlow.getTargetFlowElement().getId())) { + inChildProcess = true; + break; + } + // 如果节点为子流程节点情况,则从节点中的第一个节点开始获取 + if (sequenceFlow.getTargetFlowElement() instanceof SubProcess) { + inChildProcess = dirtyTargetInChildProcess( + (FlowElement) (((SubProcess) sequenceFlow.getTargetFlowElement()).getFlowElements() + .toArray()[0]), + hasSequenceFlow, targets, inChildProcess); + } + // 继续迭代 + // 注意:已经经过的节点与连线都应该用浅拷贝出来的对象 + // 比如分支:a->b->c与a->d->c,走完a->b->c后走另一个路线是,已经经过的节点应该不包含a->b->c路线的数据 + inChildProcess = dirtyTargetInChildProcess(sequenceFlow.getTargetFlowElement(), + new HashSet<>(hasSequenceFlow), targets, inChildProcess); + } + } + return inChildProcess; + } + + /** + * 迭代从后向前扫描,判断目标节点相对于当前节点是否是串行 不存在直接回退到子流程中的情况,但存在从子流程出去到父流程情况 + * @param source 起始节点 + * @param isSequential 是否串行 + * @param hasSequenceFlow 已经经过的连线的 ID,用于判断线路是否重复 + * @param targetKsy 目标节点 + * @return + */ + public static Boolean iteratorCheckSequentialReferTarget(FlowElement source, String targetKsy, + Set hasSequenceFlow, Boolean isSequential) { + isSequential = isSequential == null ? true : isSequential; + hasSequenceFlow = hasSequenceFlow == null ? new HashSet<>() : hasSequenceFlow; + + // 如果该节点为开始节点,且存在上级子节点,则顺着上级子节点继续迭代 + if (source instanceof StartEvent && source.getSubProcess() != null) { + isSequential = iteratorCheckSequentialReferTarget(source.getSubProcess(), targetKsy, hasSequenceFlow, + isSequential); + } + + // 根据类型,获取入口连线 + List sequenceFlows = getElementIncomingFlows(source); + + if (sequenceFlows != null) { + // 循环找到目标元素 + for (SequenceFlow sequenceFlow : sequenceFlows) { + // 如果发现连线重复,说明循环了,跳过这个循环 + if (hasSequenceFlow.contains(sequenceFlow.getId())) { + continue; + } + // 添加已经走过的连线 + hasSequenceFlow.add(sequenceFlow.getId()); + // 如果目标节点已被判断为并行,后面都不需要执行,直接返回 + if (isSequential == false) { + break; + } + // 这条线路存在目标节点,这条线路完成,进入下个线路 + if (targetKsy.equals(sequenceFlow.getSourceFlowElement().getId())) { + continue; + } + if (sequenceFlow.getSourceFlowElement() instanceof StartEvent) { + isSequential = false; + break; + } + // 否则就继续迭代 + // 注意:已经经过的节点与连线都应该用浅拷贝出来的对象 + // 比如分支:a->b->c与a->d->c,走完a->b->c后走另一个路线是,已经经过的节点应该不包含a->b->c路线的数据 + isSequential = iteratorCheckSequentialReferTarget(sequenceFlow.getSourceFlowElement(), targetKsy, + new HashSet<>(hasSequenceFlow), isSequential); + } + } + return isSequential; + } + + /** + * 从后向前寻路,获取到达节点的所有路线 不存在直接回退到子流程,但是存在回退到父级流程的情况 + * @param source 起始节点 + * @param passRoads 已经经过的点集合 + * @param roads 路线 + * @return + */ + public static List> findRoad(FlowElement source, List passRoads, + Set hasSequenceFlow, List> roads) { + passRoads = passRoads == null ? new ArrayList<>() : passRoads; + roads = roads == null ? new ArrayList<>() : roads; + hasSequenceFlow = hasSequenceFlow == null ? new HashSet<>() : hasSequenceFlow; + + // 如果该节点为开始节点,且存在上级子节点,则顺着上级子节点继续迭代 + if (source instanceof StartEvent && source.getSubProcess() != null) { + roads = findRoad(source.getSubProcess(), passRoads, hasSequenceFlow, roads); + } + + // 根据类型,获取入口连线 + List sequenceFlows = getElementIncomingFlows(source); + + if (sequenceFlows != null && sequenceFlows.size() != 0) { + for (SequenceFlow sequenceFlow : sequenceFlows) { + // 如果发现连线重复,说明循环了,跳过这个循环 + if (hasSequenceFlow.contains(sequenceFlow.getId())) { + continue; + } + // 添加已经走过的连线 + hasSequenceFlow.add(sequenceFlow.getId()); + // 添加经过路线 + if (sequenceFlow.getSourceFlowElement() instanceof UserTask) { + passRoads.add((UserTask) sequenceFlow.getSourceFlowElement()); + } + // 继续迭代 + // 注意:已经经过的节点与连线都应该用浅拷贝出来的对象 + // 比如分支:a->b->c与a->d->c,走完a->b->c后走另一个路线是,已经经过的节点应该不包含a->b->c路线的数据 + roads = findRoad(sequenceFlow.getSourceFlowElement(), new ArrayList<>(passRoads), + new HashSet<>(hasSequenceFlow), roads); + } + } + else { + // 添加路线 + roads.add(passRoads); + } + return roads; + } + + /** + * 历史节点数据清洗,清洗掉又回滚导致的脏数据 + * @param allElements 全部节点信息 + * @param historicActivityIdList 历史任务实例信息,数据采用开始时间升序 + * @return + */ + public static List historicTaskInstanceClean(Collection allElements, + List historicActivityIdList) { + // 会签节点收集 + List multiTask = new ArrayList<>(); + allElements.forEach(flowElement -> { + if (flowElement instanceof UserTask) { + // 如果该节点的行为为会签行为,说明该节点为会签节点 + if (((UserTask) flowElement).getBehavior() instanceof ParallelMultiInstanceBehavior + || ((UserTask) flowElement).getBehavior() instanceof SequentialMultiInstanceBehavior) { + multiTask.add(flowElement.getId()); + } + } + }); + // 循环放入栈,栈 LIFO:后进先出 + Stack stack = new Stack<>(); + historicActivityIdList.forEach(item -> stack.push(item)); + // 清洗后的历史任务实例 + List lastHistoricTaskInstanceList = new ArrayList<>(); + // 网关存在可能只走了部分分支情况,且还存在跳转废弃数据以及其他分支数据的干扰,因此需要对历史节点数据进行清洗 + // 临时用户任务 key + StringBuilder userTaskKey = null; + // 临时被删掉的任务 key,存在并行情况 + List deleteKeyList = new ArrayList<>(); + // 临时脏数据线路 + List> dirtyDataLineList = new ArrayList<>(); + // 由某个点跳到会签点,此时出现多个会签实例对应 1 个跳转情况,需要把这些连续脏数据都找到 + // 会签特殊处理下标 + int multiIndex = -1; + // 会签特殊处理 key + StringBuilder multiKey = null; + // 会签特殊处理操作标识 + boolean multiOpera = false; + while (!stack.empty()) { + // 从这里开始 userTaskKey 都还是上个栈的 key + // 是否是脏数据线路上的点 + final boolean[] isDirtyData = { false }; + for (Set oldDirtyDataLine : dirtyDataLineList) { + if (oldDirtyDataLine.contains(stack.peek().getActivityId())) { + isDirtyData[0] = true; + } + } + // 删除原因不为空,说明从这条数据开始回跳或者回退的 + // MI_END:会签完成后,其他未签到节点的删除原因,不在处理范围内 + if (stack.peek().getDeleteReason() != null && !stack.peek().getDeleteReason().equals("MI_END")) { + // 可以理解为脏线路起点 + String dirtyPoint = ""; + if (stack.peek().getDeleteReason().indexOf("Change activity to ") >= 0) { + dirtyPoint = stack.peek().getDeleteReason().replace("Change activity to ", ""); + } + // 会签回退删除原因有点不同 + if (stack.peek().getDeleteReason().indexOf("Change parent activity to ") >= 0) { + dirtyPoint = stack.peek().getDeleteReason().replace("Change parent activity to ", ""); + } + FlowElement dirtyTask = null; + // 获取变更节点的对应的入口处连线 + // 如果是网关并行回退情况,会变成两条脏数据路线,效果一样 + for (FlowElement flowElement : allElements) { + if (flowElement.getId().equals(stack.peek().getActivityId())) { + dirtyTask = flowElement; + } + } + // 获取脏数据线路 + Set dirtyDataLine = FlowableUtils.iteratorFindDirtyRoads(dirtyTask, null, null, + Arrays.asList(dirtyPoint.split(",")), null); + // 自己本身也是脏线路上的点,加进去 + dirtyDataLine.add(stack.peek().getActivityId()); + logger.info(stack.peek().getActivityId() + "点脏路线集合:" + dirtyDataLine); + // 是全新的需要添加的脏线路 + boolean isNewDirtyData = true; + for (int i = 0; i < dirtyDataLineList.size(); i++) { + // 如果发现他的上个节点在脏线路内,说明这个点可能是并行的节点,或者连续驳回 + // 这时,都以之前的脏线路节点为标准,只需合并脏线路即可,也就是路线补全 + if (dirtyDataLineList.get(i).contains(userTaskKey.toString())) { + isNewDirtyData = false; + dirtyDataLineList.get(i).addAll(dirtyDataLine); + } + } + // 已确定时全新的脏线路 + if (isNewDirtyData) { + // deleteKey 单一路线驳回到并行,这种同时生成多个新实例记录情况,这时 deleteKey 其实是由多个值组成 + // 按照逻辑,回退后立刻生成的实例记录就是回退的记录 + // 至于驳回所生成的 Key,直接从删除原因中获取,因为存在驳回到并行的情况 + deleteKeyList.add(dirtyPoint + ","); + dirtyDataLineList.add(dirtyDataLine); + } + // 添加后,现在这个点变成脏线路上的点了 + isDirtyData[0] = true; + } + // 如果不是脏线路上的点,说明是有效数据,添加历史实例 Key + if (!isDirtyData[0]) { + lastHistoricTaskInstanceList.add(stack.peek().getActivityId()); + } + // 校验脏线路是否结束 + for (int i = 0; i < deleteKeyList.size(); i++) { + // 如果发现脏数据属于会签,记录下下标与对应 Key,以备后续比对,会签脏数据范畴开始 + if (multiKey == null && multiTask.contains(stack.peek().getActivityId()) + && deleteKeyList.get(i).contains(stack.peek().getActivityId())) { + multiIndex = i; + multiKey = new StringBuilder(stack.peek().getActivityId()); + } + // 会签脏数据处理,节点退回会签清空 + // 如果在会签脏数据范畴中发现 Key改变,说明会签脏数据在上个节点就结束了,可以把会签脏数据删掉 + if (multiKey != null && !multiKey.toString().equals(stack.peek().getActivityId())) { + deleteKeyList.set(multiIndex, + deleteKeyList.get(multiIndex).replace(stack.peek().getActivityId() + ",", "")); + multiKey = null; + // 结束进行下校验删除 + multiOpera = true; + } + // 其他脏数据处理 + // 发现该路线最后一条脏数据,说明这条脏数据线路处理完了,删除脏数据信息 + // 脏数据产生的新实例中是否包含这条数据 + if (multiKey == null && deleteKeyList.get(i).contains(stack.peek().getActivityId())) { + // 删除匹配到的部分 + deleteKeyList.set(i, deleteKeyList.get(i).replace(stack.peek().getActivityId() + ",", "")); + } + // 如果每组中的元素都以匹配过,说明脏数据结束 + if ("".equals(deleteKeyList.get(i))) { + // 同时删除脏数据 + deleteKeyList.remove(i); + dirtyDataLineList.remove(i); + break; + } + } + // 会签数据处理需要在循环外处理,否则可能导致溢出 + // 会签的数据肯定是之前放进去的所以理论上不会溢出,但还是校验下 + if (multiOpera && deleteKeyList.size() > multiIndex && "".equals(deleteKeyList.get(multiIndex))) { + // 同时删除脏数据 + deleteKeyList.remove(multiIndex); + dirtyDataLineList.remove(multiIndex); + multiIndex = -1; + multiOpera = false; + } + // pop() 方法与 peek() 方法不同,在返回值的同时,会把值从栈中移除 + // 保存新的 userTaskKey 在下个循环中使用 + userTaskKey = new StringBuilder(stack.pop().getActivityId()); + } + logger.info("清洗后的历史节点数据:" + lastHistoricTaskInstanceList); + return lastHistoricTaskInstanceList; + } + +} diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/utils/ModelUtil.java b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/utils/ModelUtil.java new file mode 100644 index 0000000..4d42a2c --- /dev/null +++ b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/utils/ModelUtil.java @@ -0,0 +1,627 @@ +package com.pig4cloud.pigx.flow.engine.utils; + +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.RandomUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.extra.spring.SpringUtil; +import cn.hutool.json.JSONUtil; +import com.pig4cloud.pigx.flow.engine.expression.condition.NodeExpressionStrategyFactory; +import com.pig4cloud.pigx.flow.engine.listeners.ApprovalCreateListener; +import com.pig4cloud.pigx.flow.engine.listeners.FlowProcessEventListener; +import com.pig4cloud.pigx.flow.engine.service.ApproveServiceTask; +import com.pig4cloud.pigx.flow.engine.service.CopyServiceTask; +import com.pig4cloud.pigx.flow.task.api.feign.RemoteFlowTaskService; +import com.pig4cloud.pigx.flow.task.constant.NodeTypeEnum; +import com.pig4cloud.pigx.flow.task.constant.ProcessInstanceConstant; +import com.pig4cloud.pigx.flow.task.dto.Node; +import com.pig4cloud.pigx.flow.task.dto.ProcessNodeDataDto; +import com.pig4cloud.pigx.flow.task.utils.NodeUtil; +import lombok.extern.slf4j.Slf4j; +import org.flowable.bpmn.model.Process; +import org.flowable.bpmn.model.*; + +import java.util.ArrayList; +import java.util.List; + +/** + * 模型工具类 处理模型构建相关的 + */ +@Slf4j +public class ModelUtil { + + /** + * 构建模型 + * @param nodeDto 前端传输节点 + * @return + */ + public static BpmnModel buildBpmnModel(Node nodeDto, String processName, String flowId) { + BpmnModel bpmnModel = new BpmnModel(); + bpmnModel.setTargetNamespace("pig"); + + Process process = new Process(); + process.setId(flowId); + process.setName(processName); + + // 流程监听器 + ArrayList eventListeners = new ArrayList<>(); + + { + // 流程实例监听器 + EventListener eventListener = new EventListener(); + + eventListener.setImplementationType("class"); + eventListener.setImplementation(FlowProcessEventListener.class.getCanonicalName()); + + eventListeners.add(eventListener); + + } + process.setEventListeners(eventListeners); + + NodeUtil.addEndNode(nodeDto); + + // 创建所有的节点 + buildAllNode(process, nodeDto, flowId); + // 创建所有的内部节点连接线 + buildAllNodeInnerSequence(process, nodeDto, flowId); + // 创建节点间连线 + buildAllNodeOuterSequence(process, nodeDto, null); + // 处理分支和下级连线 + + bpmnModel.addProcess(process); + return bpmnModel; + } + + /** + * 先创建所有的节点 + * @param process + * @param nodeDto + * @param flowId + */ + public static void buildAllNode(Process process, Node nodeDto, String flowId) { + if (!NodeUtil.isNode(nodeDto)) { + return; + } + + List flowElementList = buildNode(nodeDto, flowId); + for (FlowElement flowElement : flowElementList) { + if (process.getFlowElement(flowElement.getId()) == null) { + process.addFlowElement(flowElement); + } + } + + // 子节点 + Node children = nodeDto.getChildren(); + + if (NodeTypeEnum.getByValue(nodeDto.getType()).getBranch()) { + + // 条件分支 + List branchs = nodeDto.getConditionNodes(); + for (Node branch : branchs) { + buildAllNode(process, branch.getChildren(), flowId); + + } + if (NodeUtil.isNode(children)) { + buildAllNode(process, children, flowId); + } + + } + else { + + if (NodeUtil.isNode(children)) { + buildAllNode(process, children, flowId); + } + } + + } + + /** + * 先创建所有的内部节点连接线 + * @param process + * @param nodeDto + * @param flowId + */ + public static void buildAllNodeInnerSequence(Process process, Node nodeDto, String flowId) { + if (!NodeUtil.isNode(nodeDto)) { + return; + } + + // 画内部线 + List flowList = buildInnerSequenceFlow(nodeDto, flowId); + for (SequenceFlow sequenceFlow : flowList) { + process.addFlowElement(sequenceFlow); + } + + // 子节点 + Node children = nodeDto.getChildren(); + if (NodeTypeEnum.getByValue(nodeDto.getType()).getBranch()) { + // 条件分支 + List branchs = nodeDto.getConditionNodes(); + for (Node branch : branchs) { + buildAllNodeInnerSequence(process, branch.getChildren(), flowId); + + } + if (NodeUtil.isNode(children)) { + buildAllNodeInnerSequence(process, children, flowId); + } + + } + else { + + if (NodeUtil.isNode(children)) { + buildAllNodeInnerSequence(process, children, flowId); + } + } + + } + + /** + * 递归创建节点间连线 + * @param process 流程 + * @param nodeDto 节点对象 + * @param nextId + */ + public static void buildAllNodeOuterSequence(Process process, Node nodeDto, String nextId) { + + if (!NodeUtil.isNode(nodeDto)) { + return; + } + + // 子节点 + Node children = nodeDto.getChildren(); + if (NodeTypeEnum.getByValue(nodeDto.getType()).getBranch()) { + // children = children.getChildren(); + // 条件分支 + List branchs = nodeDto.getConditionNodes(); + int ord = 1; + int size = branchs.size(); + for (Node branch : branchs) { + + buildAllNodeOuterSequence(process, branch.getChildren(), nodeDto.getTailId()); + + String expression = null; + + if (nodeDto.getType() == NodeTypeEnum.EXCLUSIVE_GATEWAY.getValue().intValue()) { + if (ord == size) { + expression = NodeExpressionStrategyFactory.handleDefaultBranch(branchs, ord - 1); + } + else if (nodeDto.getType() == NodeTypeEnum.EXCLUSIVE_GATEWAY.getValue().intValue() && ord > 1) { + expression = NodeExpressionStrategyFactory.handleDefaultBranch(branchs, ord - 1); + } + else { + expression = NodeExpressionStrategyFactory.handle(branch); + } + + } + + // 添加连线 + if (!NodeUtil.isNode(branch.getChildren())) { + // 当前分支 没有其他节点了 所有就是网关和网关后面节点直接连线 + + SequenceFlow sequenceFlow = buildSingleSequenceFlow(nodeDto.getId(), nodeDto.getTailId(), + expression, StrUtil.format("{}->{}", nodeDto.getName(), nodeDto.getName())); + process.addFlowElement(sequenceFlow); + } + else { + + SequenceFlow sequenceFlow = buildSingleSequenceFlow(nodeDto.getId(), + branch.getChildren().getHeadId(), expression, + StrUtil.format("{}->{}", nodeDto.getName(), branch.getChildren().getName())); + process.addFlowElement(sequenceFlow); + } + ord++; + + } + // 分支结尾的合并分支节点-》下一个节点 + if (children != null && StrUtil.isNotBlank(children.getHeadId()) + && StrUtil.isNotBlank(nodeDto.getTailId())) { + + SequenceFlow sequenceFlow = buildSingleSequenceFlow(nodeDto.getTailId(), children.getHeadId(), "", + StrUtil.format("{}->{}", nodeDto.getName(), children.getName())); + process.addFlowElement(sequenceFlow); + + } + else if (StrUtil.isAllNotBlank(nodeDto.getTailId(), nextId)) { + SequenceFlow sequenceFlow = buildSingleSequenceFlow(nodeDto.getTailId(), nextId, "", + StrUtil.format("{}->{}", nodeDto.getName(), nextId)); + process.addFlowElement(sequenceFlow); + } + + buildAllNodeOuterSequence(process, children, nextId); + + } + else { + // 添加连线 + if (NodeUtil.isNode(children)) { + List sequenceFlowList = buildSequenceFlow(children, nodeDto, ""); + for (SequenceFlow sequenceFlow : sequenceFlowList) { + process.addFlowElement(sequenceFlow); + } + buildAllNodeOuterSequence(process, children, nextId); + } + else if (nodeDto.getType() != NodeTypeEnum.END.getValue().intValue()) { + SequenceFlow seq = buildSingleSequenceFlow(nodeDto.getTailId(), nextId, "", + StrUtil.format("{}->{}", nodeDto.getName(), nextId)); + + process.addFlowElement(seq); + + } + } + + } + + /** + * 构建节点 + * @param node 前端传输节点 + * @param flowId + * @return + */ + private static List buildNode(Node node, String flowId) { + List flowElementList = new ArrayList<>(); + if (!NodeUtil.isNode(node)) { + return flowElementList; + } + + // 设置节点的连线头节点 + node.setHeadId(node.getId()); + // 设置节点的连线尾节点 + node.setTailId(node.getId()); + node.setName(StrUtil.format("{}[{}]", node.getName(), RandomUtil.randomNumbers(5))); + + // 存储节点数据 + RemoteFlowTaskService remoteFlowTaskService = SpringUtil.getBean(RemoteFlowTaskService.class); + ProcessNodeDataDto processNodeDataDto = new ProcessNodeDataDto(); + processNodeDataDto.setFlowId(flowId); + processNodeDataDto.setNodeId(node.getId()); + processNodeDataDto.setData(JSONUtil.toJsonStr(node)); + remoteFlowTaskService.saveNodeOriData(processNodeDataDto); + + // 开始 + if (node.getType() == NodeTypeEnum.ROOT.getValue().intValue()) { + flowElementList.addAll(buildStartNode(node)); + } + + // 结束 + if (node.getType() == NodeTypeEnum.END.getValue().intValue()) { + flowElementList.add(buildEndNode(node, false)); + } + + // 审批 + if (node.getType() == NodeTypeEnum.APPROVAL.getValue().intValue()) { + + flowElementList.addAll(buildApproveNode(node)); + } + + // 抄送 + if (node.getType() == NodeTypeEnum.CC.getValue().intValue()) { + flowElementList.add(buildCCNode(node)); + } + // 条件分支 + if (node.getType() == NodeTypeEnum.EXCLUSIVE_GATEWAY.getValue().intValue()) { + flowElementList.addAll(buildInclusiveGatewayNode(node)); + } + // 并行分支 + if (node.getType() == NodeTypeEnum.PARALLEL_GATEWAY.getValue().intValue()) { + flowElementList.addAll(buildParallelGatewayNode(node)); + } + + return flowElementList; + } + + /** + * 构建开始节点 添加一个自动完成任务的用户任务节点 + * @param node 前端传输节点 + * @return + */ + private static List buildStartNode(Node node) { + + List flowElementList = new ArrayList<>(); + + StartEvent startEvent = new StartEvent(); + startEvent.setId(node.getId()); + startEvent.setName(node.getName()); + + flowElementList.add(startEvent); + + return flowElementList; + } + + /** + * 构建审批节点 + * @param node + * @return + */ + private static List buildApproveNode(Node node) { + List flowElementList = new ArrayList<>(); + node.setTailId(StrUtil.format("approve_service_task_{}", node.getId())); + + // 创建了任务执行监听器 + // 先执行指派人 后创建 + // https://tkjohn.github.io/flowable-userguide/#eventDispatcher + FlowableListener createListener = new FlowableListener(); + createListener.setImplementation(ApprovalCreateListener.class.getCanonicalName()); + createListener.setImplementationType("class"); + createListener.setEvent("create"); + + UserTask userTask = buildUserTask(node, createListener); + flowElementList.add(userTask); + + ServiceTask serviceTask = new ServiceTask(); + serviceTask.setId(StrUtil.format("approve_service_task_{}", node.getId())); + serviceTask.setName(StrUtil.format("{}_服务任务", node.getName())); + serviceTask.setImplementationType("class"); + serviceTask.setImplementation(ApproveServiceTask.class.getCanonicalName()); + serviceTask.setAsynchronous(false); + + flowElementList.add(serviceTask); + + { + + // 执行人处理 + + String inputDataItem = "${multiInstanceHandler.resolveAssignee(execution)}"; + + // 串行 + + boolean isSequential = true; + + Integer multipleMode = node.getMultipleMode(); + // 多人 + if ((multipleMode == ProcessInstanceConstant.MULTIPLE_MODE_AL_SAME)) { + // 并行会签 + isSequential = false; + } + if ((multipleMode == ProcessInstanceConstant.MULTIPLE_MODE_ALL_SORT)) { + + // 串行会签 + } + if ((multipleMode == ProcessInstanceConstant.MULTIPLE_MODE_ONE)) { + + // 或签 + isSequential = false; + } + + MultiInstanceLoopCharacteristics loopCharacteristics = new MultiInstanceLoopCharacteristics(); + loopCharacteristics.setSequential(isSequential); + loopCharacteristics.setInputDataItem(inputDataItem); + loopCharacteristics.setElementVariable(StrUtil.format("{}_assignee_temp", node.getId())); + + loopCharacteristics.setCompletionCondition("${multiInstanceHandler.completionCondition(execution)}"); + + userTask.setLoopCharacteristics(loopCharacteristics); + String format = StrUtil.format("${{}_assignee_temp}", node.getId()); + userTask.setAssignee(format); + + } + return flowElementList; + } + + /** + * 创建用户任务 + * @param node 前端传输节点 + * @return + */ + private static UserTask buildUserTask(Node node, FlowableListener... flowableListeners) { + UserTask userTask = new UserTask(); + userTask.setId(node.getId()); + userTask.setName(node.getName()); + + if (flowableListeners != null) { + List taskListeners = new ArrayList<>(); + + for (FlowableListener flowableListener : flowableListeners) { + taskListeners.add(flowableListener); + + } + userTask.setTaskListeners(taskListeners); + } + + return userTask; + } + + /** + * 构建简单的包容网关 + * @param node + * @return + */ + private static FlowElement buildSimpleExclusiveGatewayNode(Node node) { + + ExclusiveGateway exclusiveGateway = new ExclusiveGateway(); + exclusiveGateway.setId(node.getId()); + exclusiveGateway.setName(node.getName()); + + return exclusiveGateway; + + } + + /** + * 构建并行网关 + * @param node + * @return + */ + private static List buildParallelGatewayNode(Node node) { + node.setTailId(StrUtil.format("{}_merge_gateway", node.getId())); + List flowElementList = new ArrayList<>(); + + ParallelGateway inclusiveGateway = new ParallelGateway(); + inclusiveGateway.setId(node.getId()); + inclusiveGateway.setName(node.getName()); + flowElementList.add(inclusiveGateway); + + // 合并网关 + ParallelGateway parallelGateway = new ParallelGateway(); + parallelGateway.setId(StrUtil.format("{}_merge_gateway", node.getId())); + parallelGateway.setName(StrUtil.format("{}_合并网关", node.getName())); + flowElementList.add(parallelGateway); + + return flowElementList; + } + + /** + * 构建包容网关 + * @param node + * @return + */ + private static List buildInclusiveGatewayNode(Node node) { + + node.setTailId(StrUtil.format("{}_merge_gateway", node.getId())); + + List flowElementList = new ArrayList<>(); + + InclusiveGateway inclusiveGateway = new InclusiveGateway(); + inclusiveGateway.setId(node.getId()); + inclusiveGateway.setName(node.getName()); + flowElementList.add(inclusiveGateway); + + // 合并网关 + InclusiveGateway gateway = new InclusiveGateway(); + gateway.setId(StrUtil.format("{}_merge_gateway", node.getId())); + gateway.setName(StrUtil.format("{}_合并网关", node.getName())); + flowElementList.add(gateway); + + return flowElementList; + } + + /** + * 构建结束节点 + * @param node 前端传输节点 + * @param terminateAll + * @return + */ + private static EndEvent buildEndNode(Node node, boolean terminateAll) { + EndEvent endEvent = new EndEvent(); + endEvent.setId(node.getId()); + endEvent.setName(node.getName()); + + List definitionList = new ArrayList<>(); + TerminateEventDefinition definition = new TerminateEventDefinition(); + definition.setTerminateAll(terminateAll); + definitionList.add(definition); + endEvent.setEventDefinitions(definitionList); + + return endEvent; + } + + /** + * 创建连接线 + * @param node 子级节点 + * @param parentNode 父级节点 + * @param expression + * @return 所有连接线 + */ + private static List buildSequenceFlow(Node node, Node parentNode, String expression) { + List sequenceFlowList = new ArrayList<>(); + // 没有子级了 + if (!NodeUtil.isNode(node)) { + return sequenceFlowList; + } + + String pid = parentNode.getId(); + + if (StrUtil.hasBlank(pid, node.getId())) { + return sequenceFlowList; + } + + SequenceFlow sequenceFlow = buildSingleSequenceFlow(parentNode.getTailId(), node.getHeadId(), expression, + StrUtil.format("{}->{}", parentNode.getName(), node.getName())); + sequenceFlowList.add(sequenceFlow); + + return sequenceFlowList; + } + + /** + * 生成扩展数据 + * @param key + * @param val + * @return + */ + public static ExtensionAttribute generateExtensionAttribute(String key, String val) { + ExtensionAttribute ea = new ExtensionAttribute(); + + ea.setName(key); + ea.setValue(val); + return ea; + } + + /** + * 创建抄送节点 + * @param node + * @return + */ + private static FlowElement buildCCNode(Node node) { + + ServiceTask serviceTask = new ServiceTask(); + serviceTask.setId(node.getId()); + serviceTask.setName(node.getName()); + serviceTask.setAsynchronous(false); + serviceTask.setImplementationType("class"); + serviceTask.setImplementation(CopyServiceTask.class.getCanonicalName()); + + ExtensionElement e = new ExtensionElement(); + { + + e.setName("flowable:failedJobRetryTimeCycle"); + // 上面的例子会让作业执行器重试5次,并在每次重试前等待1分钟。 + e.setElementText("R5/PT1M"); + + } + + serviceTask.addExtensionElement(e); + return serviceTask; + } + + /** + * 创建连接线 + * @param node 父级节点 + * @param flowId + * @return 所有连接线 + */ + private static List buildInnerSequenceFlow(Node node, String flowId) { + + List sequenceFlowList = new ArrayList<>(); + if (!NodeUtil.isNode(node)) { + return sequenceFlowList; + } + + String nodeId = node.getId(); + if (StrUtil.hasBlank(nodeId)) { + return sequenceFlowList; + } + + if (node.getType() == NodeTypeEnum.APPROVAL.getValue().intValue()) { + + String gatewayId = StrUtil.format("approve_service_task_{}", nodeId); + + { + SequenceFlow sequenceFlow = buildSingleSequenceFlow(nodeId, gatewayId, "${12==12}", null); + sequenceFlowList.add(sequenceFlow); + } + + } + + return sequenceFlowList; + } + + /** + * 创建单个连接线 + * @param pId 父级id + * @param childId 子级id + * @param expression 表达式 + * @param name + * @return + */ + private static SequenceFlow buildSingleSequenceFlow(String pId, String childId, String expression, String name) { + if (StrUtil.hasBlank(pId, childId)) { + return null; + } + SequenceFlow sequenceFlow = new SequenceFlow(pId, childId); + sequenceFlow.setConditionExpression(expression); + sequenceFlow.setName(StrUtil.format("{}|{}", pId, childId)); + sequenceFlow.setName(StrUtil.format("连线[{}]", RandomUtil.randomString(5))); + if (StrUtil.isNotBlank(name)) { + sequenceFlow.setName(name); + } + sequenceFlow.setId(StrUtil.format("sq-id-{}-{}", IdUtil.fastSimpleUUID(), RandomUtil.randomInt(1, 10000000))); + return sequenceFlow; + } + +} diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/org/flowable/common/engine/impl/AbstractEngineConfiguration.java b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/org/flowable/common/engine/impl/AbstractEngineConfiguration.java new file mode 100644 index 0000000..b35db50 --- /dev/null +++ b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/org/flowable/common/engine/impl/AbstractEngineConfiguration.java @@ -0,0 +1,2163 @@ +/* Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.flowable.common.engine.impl; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import org.apache.commons.lang3.StringUtils; +import org.apache.ibatis.builder.xml.XMLConfigBuilder; +import org.apache.ibatis.builder.xml.XMLMapperBuilder; +import org.apache.ibatis.datasource.pooled.PooledDataSource; +import org.apache.ibatis.mapping.Environment; +import org.apache.ibatis.plugin.Interceptor; +import org.apache.ibatis.session.Configuration; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.defaults.DefaultSqlSessionFactory; +import org.apache.ibatis.transaction.TransactionFactory; +import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory; +import org.apache.ibatis.transaction.managed.ManagedTransactionFactory; +import org.apache.ibatis.type.*; +import org.flowable.common.engine.api.FlowableException; +import org.flowable.common.engine.api.delegate.event.FlowableEngineEventType; +import org.flowable.common.engine.api.delegate.event.FlowableEventDispatcher; +import org.flowable.common.engine.api.delegate.event.FlowableEventListener; +import org.flowable.common.engine.api.engine.EngineLifecycleListener; +import org.flowable.common.engine.impl.agenda.AgendaOperationRunner; +import org.flowable.common.engine.impl.cfg.CommandExecutorImpl; +import org.flowable.common.engine.impl.cfg.IdGenerator; +import org.flowable.common.engine.impl.cfg.TransactionContextFactory; +import org.flowable.common.engine.impl.cfg.standalone.StandaloneMybatisTransactionContextFactory; +import org.flowable.common.engine.impl.db.*; +import org.flowable.common.engine.impl.event.EventDispatchAction; +import org.flowable.common.engine.impl.event.FlowableEventDispatcherImpl; +import org.flowable.common.engine.impl.interceptor.*; +import org.flowable.common.engine.impl.lock.LockManager; +import org.flowable.common.engine.impl.lock.LockManagerImpl; +import org.flowable.common.engine.impl.logging.LoggingListener; +import org.flowable.common.engine.impl.logging.LoggingSession; +import org.flowable.common.engine.impl.logging.LoggingSessionFactory; +import org.flowable.common.engine.impl.persistence.GenericManagerFactory; +import org.flowable.common.engine.impl.persistence.StrongUuidGenerator; +import org.flowable.common.engine.impl.persistence.cache.EntityCache; +import org.flowable.common.engine.impl.persistence.cache.EntityCacheImpl; +import org.flowable.common.engine.impl.persistence.entity.*; +import org.flowable.common.engine.impl.persistence.entity.data.ByteArrayDataManager; +import org.flowable.common.engine.impl.persistence.entity.data.PropertyDataManager; +import org.flowable.common.engine.impl.persistence.entity.data.impl.MybatisByteArrayDataManager; +import org.flowable.common.engine.impl.persistence.entity.data.impl.MybatisPropertyDataManager; +import org.flowable.common.engine.impl.runtime.Clock; +import org.flowable.common.engine.impl.service.CommonEngineServiceImpl; +import org.flowable.common.engine.impl.util.DefaultClockImpl; +import org.flowable.common.engine.impl.util.IoUtil; +import org.flowable.common.engine.impl.util.ReflectUtil; +import org.flowable.eventregistry.api.EventRegistryEventConsumer; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.naming.InitialContext; +import javax.sql.DataSource; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.Reader; +import java.sql.*; +import java.time.Duration; +import java.util.*; + +/** + * 覆盖原有配置支持国产化数据库 + */ +public abstract class AbstractEngineConfiguration { + + protected final Logger logger = LoggerFactory.getLogger(getClass()); + + /** The tenant id indicating 'no tenant' */ + public static final String NO_TENANT_ID = ""; + + /** + * Checks the version of the DB schema against the library when the form engine is + * being created and throws an exception if the versions don't match. + */ + public static final String DB_SCHEMA_UPDATE_FALSE = "false"; + + public static final String DB_SCHEMA_UPDATE_CREATE = "create"; + + public static final String DB_SCHEMA_UPDATE_CREATE_DROP = "create-drop"; + + /** + * Creates the schema when the form engine is being created and drops the schema when + * the form engine is being closed. + */ + public static final String DB_SCHEMA_UPDATE_DROP_CREATE = "drop-create"; + + /** + * Upon building of the process engine, a check is performed and an update of the + * schema is performed if it is necessary. + */ + public static final String DB_SCHEMA_UPDATE_TRUE = "true"; + + protected boolean forceCloseMybatisConnectionPool = true; + + protected String databaseType; + + protected String jdbcDriver = "org.h2.Driver"; + + protected String jdbcUrl = "jdbc:h2:tcp://localhost/~/flowable"; + + protected String jdbcUsername = "sa"; + + protected String jdbcPassword = ""; + + protected String dataSourceJndiName; + + protected int jdbcMaxActiveConnections = 16; + + protected int jdbcMaxIdleConnections = 8; + + protected int jdbcMaxCheckoutTime; + + protected int jdbcMaxWaitTime; + + protected boolean jdbcPingEnabled; + + protected String jdbcPingQuery; + + protected int jdbcPingConnectionNotUsedFor; + + protected int jdbcDefaultTransactionIsolationLevel; + + protected DataSource dataSource; + + protected SchemaManager commonSchemaManager; + + protected SchemaManager schemaManager; + + protected Command schemaManagementCmd; + + protected String databaseSchemaUpdate = DB_SCHEMA_UPDATE_FALSE; + + /** + * Whether to use a lock when performing the database schema create or update + * operations. + */ + protected boolean useLockForDatabaseSchemaUpdate = false; + + protected String xmlEncoding = "UTF-8"; + + // COMMAND EXECUTORS /////////////////////////////////////////////// + + protected CommandExecutor commandExecutor; + + protected Collection defaultCommandInterceptors; + + protected CommandConfig defaultCommandConfig; + + protected CommandConfig schemaCommandConfig; + + protected CommandContextFactory commandContextFactory; + + protected CommandInterceptor commandInvoker; + + protected AgendaOperationRunner agendaOperationRunner = (commandContext, runnable) -> runnable.run(); + + protected List customPreCommandInterceptors; + + protected List customPostCommandInterceptors; + + protected List commandInterceptors; + + protected Map engineConfigurations = new HashMap<>(); + + protected Map serviceConfigurations = new HashMap<>(); + + protected ClassLoader classLoader; + + /** + * Either use Class.forName or ClassLoader.loadClass for class loading. See + * http://forums.activiti.org/content/reflectutilloadclass-and-custom- classloader + */ + protected boolean useClassForNameClassLoading = true; + + protected List engineLifecycleListeners; + + // Event Registry ////////////////////////////////////////////////// + protected Map eventRegistryEventConsumers = new HashMap<>(); + + // MYBATIS SQL SESSION FACTORY ///////////////////////////////////// + + protected boolean isDbHistoryUsed = true; + + protected DbSqlSessionFactory dbSqlSessionFactory; + + protected SqlSessionFactory sqlSessionFactory; + + protected TransactionFactory transactionFactory; + + protected TransactionContextFactory transactionContextFactory; + + /** + * If set to true, enables bulk insert (grouping sql inserts together). Default true. + * For some databases (eg DB2+z/OS) needs to be set to false. + */ + protected boolean isBulkInsertEnabled = true; + + /** + * Some databases have a limit of how many parameters one sql insert can have (eg SQL + * Server, 2000 params (!= insert statements) ). Tweak this parameter in case of + * exceptions indicating too much is being put into one bulk insert, or make it higher + * if your database can cope with it and there are inserts with a huge amount of data. + *

+ * By default: 100 (55 for mssql server as it has a hard limit of 2000 parameters in a + * statement) + */ + protected int maxNrOfStatementsInBulkInsert = 100; + + public int DEFAULT_MAX_NR_OF_STATEMENTS_BULK_INSERT_SQL_SERVER = 55; // currently + // Execution + // has most + // params + // (35). 2000 + // / 35 = 57. + + protected String mybatisMappingFile; + + protected Set> customMybatisMappers; + + protected Set customMybatisXMLMappers; + + protected List customMybatisInterceptors; + + protected Set dependentEngineMyBatisXmlMappers; + + protected List dependentEngineMybatisTypeAliasConfigs; + + protected List dependentEngineMybatisTypeHandlerConfigs; + + // SESSION FACTORIES /////////////////////////////////////////////// + protected List customSessionFactories; + + protected Map, SessionFactory> sessionFactories; + + protected boolean enableEventDispatcher = true; + + protected FlowableEventDispatcher eventDispatcher; + + protected List eventListeners; + + protected Map> typedEventListeners; + + protected List additionalEventDispatchActions; + + protected LoggingListener loggingListener; + + protected boolean transactionsExternallyManaged; + + /** + * Flag that can be set to configure or not a relational database is used. This is + * useful for custom implementations that do not use relational databases at all. + * + * If true (default), the + * {@link AbstractEngineConfiguration#getDatabaseSchemaUpdate()} value will be used to + * determine what needs to happen wrt the database schema. + * + * If false, no validation or schema creation will be done. That means that the + * database schema must have been created 'manually' before but the engine does not + * validate whether the schema is correct. The + * {@link AbstractEngineConfiguration#getDatabaseSchemaUpdate()} value will not be + * used. + */ + protected boolean usingRelationalDatabase = true; + + /** + * Flag that can be set to configure whether or not a schema is used. This is useful + * for custom implementations that do not use relational databases at all. Setting + * {@link #usingRelationalDatabase} to true will automatically imply using a schema. + */ + protected boolean usingSchemaMgmt = true; + + /** + * Allows configuring a database table prefix which is used for all runtime operations + * of the process engine. For example, if you specify a prefix named 'PRE1.', Flowable + * will query for executions in a table named 'PRE1.ACT_RU_EXECUTION_'. + * + *

+ * NOTE: the prefix is not respected by automatic database schema management. + * If you use {@link AbstractEngineConfiguration#DB_SCHEMA_UPDATE_CREATE_DROP} or + * {@link AbstractEngineConfiguration#DB_SCHEMA_UPDATE_TRUE}, Flowable will create the + * database tables using the default names, regardless of the prefix configured + * here. + */ + protected String databaseTablePrefix = ""; + + /** + * Escape character for doing wildcard searches. + * + * This will be added at then end of queries that include for example a LIKE clause. + * For example: SELECT * FROM table WHERE column LIKE '%\%%' ESCAPE '\'; + */ + protected String databaseWildcardEscapeCharacter; + + /** + * database catalog to use + */ + protected String databaseCatalog = ""; + + /** + * In some situations you want to set the schema to use for table checks / generation + * if the database metadata doesn't return that correctly, see + * https://jira.codehaus.org/browse/ACT-1220, + * https://jira.codehaus.org/browse/ACT-1062 + */ + protected String databaseSchema; + + /** + * Set to true in case the defined databaseTablePrefix is a schema-name, instead of an + * actual table name prefix. This is relevant for checking if Flowable-tables exist, + * the databaseTablePrefix will not be used here - since the schema is taken into + * account already, adding a prefix for the table-check will result in wrong + * table-names. + */ + protected boolean tablePrefixIsSchema; + + /** + * Set to true if the latest version of a definition should be retrieved, ignoring a + * possible parent deployment id value + */ + protected boolean alwaysLookupLatestDefinitionVersion; + + /** + * Set to true if by default lookups should fallback to the default tenant (an empty + * string by default or a defined tenant value) + */ + protected boolean fallbackToDefaultTenant; + + /** + * Default tenant provider that is executed when looking up definitions, in case the + * global or local fallback to default tenant value is true + */ + protected DefaultTenantProvider defaultTenantProvider = (tenantId, scope, scopeKey) -> NO_TENANT_ID; + + /** + * Enables the MyBatis plugin that logs the execution time of sql statements. + */ + protected boolean enableLogSqlExecutionTime; + + protected Properties databaseTypeMappings = getDefaultDatabaseTypeMappings(); + + /** + * Duration between the checks when acquiring a lock. + */ + protected Duration lockPollRate = Duration.ofSeconds(10); + + /** + * Duration to wait for the DB Schema lock before giving up. + */ + protected Duration schemaLockWaitTime = Duration.ofMinutes(5); + + // DATA MANAGERS ////////////////////////////////////////////////////////////////// + + protected PropertyDataManager propertyDataManager; + + protected ByteArrayDataManager byteArrayDataManager; + + protected TableDataManager tableDataManager; + + // ENTITY MANAGERS //////////////////////////////////////////////////////////////// + + protected PropertyEntityManager propertyEntityManager; + + protected ByteArrayEntityManager byteArrayEntityManager; + + protected List customPreDeployers; + + protected List customPostDeployers; + + protected List deployers; + + // CONFIGURATORS //////////////////////////////////////////////////////////// + + protected boolean enableConfiguratorServiceLoader = true; // Enabled by default. In + // certain environments + // this should be set to + // false (eg osgi) + + protected List configurators; // The injected configurators + + protected List allConfigurators; // Including auto-discovered + // configurators + + protected EngineConfigurator idmEngineConfigurator; + + protected EngineConfigurator eventRegistryConfigurator; + + public static final String PRODUCT_NAME_POSTGRES = "PostgreSQL"; + + public static final String PRODUCT_NAME_CRDB = "CockroachDB"; + + public static final String DATABASE_TYPE_H2 = "h2"; + + public static final String DATABASE_TYPE_HSQL = "hsql"; + + public static final String DATABASE_TYPE_MYSQL = "mysql"; + + public static final String DATABASE_TYPE_ORACLE = "oracle"; + + public static final String DATABASE_TYPE_POSTGRES = "postgres"; + + public static final String DATABASE_TYPE_MSSQL = "mssql"; + + public static final String DATABASE_TYPE_DB2 = "db2"; + + public static final String DATABASE_TYPE_COCKROACHDB = "cockroachdb"; + + public static Properties getDefaultDatabaseTypeMappings() { + Properties databaseTypeMappings = new Properties(); + databaseTypeMappings.setProperty("H2", DATABASE_TYPE_H2); + databaseTypeMappings.setProperty("HSQL Database Engine", DATABASE_TYPE_HSQL); + databaseTypeMappings.setProperty("MySQL", DATABASE_TYPE_MYSQL); + databaseTypeMappings.setProperty("MariaDB", DATABASE_TYPE_MYSQL); + databaseTypeMappings.setProperty("Oracle", DATABASE_TYPE_ORACLE); + databaseTypeMappings.setProperty(PRODUCT_NAME_POSTGRES, DATABASE_TYPE_POSTGRES); + databaseTypeMappings.setProperty("Microsoft SQL Server", DATABASE_TYPE_MSSQL); + databaseTypeMappings.setProperty(DATABASE_TYPE_DB2, DATABASE_TYPE_DB2); + databaseTypeMappings.setProperty("DB2", DATABASE_TYPE_DB2); + databaseTypeMappings.setProperty("DB2/NT", DATABASE_TYPE_DB2); + databaseTypeMappings.setProperty("DB2/NT64", DATABASE_TYPE_DB2); + databaseTypeMappings.setProperty("DB2 UDP", DATABASE_TYPE_DB2); + databaseTypeMappings.setProperty("DB2/LINUX", DATABASE_TYPE_DB2); + databaseTypeMappings.setProperty("DB2/LINUX390", DATABASE_TYPE_DB2); + databaseTypeMappings.setProperty("DB2/LINUXX8664", DATABASE_TYPE_DB2); + databaseTypeMappings.setProperty("DB2/LINUXZ64", DATABASE_TYPE_DB2); + databaseTypeMappings.setProperty("DB2/LINUXPPC64", DATABASE_TYPE_DB2); + databaseTypeMappings.setProperty("DB2/LINUXPPC64LE", DATABASE_TYPE_DB2); + databaseTypeMappings.setProperty("DB2/400 SQL", DATABASE_TYPE_DB2); + databaseTypeMappings.setProperty("DB2/6000", DATABASE_TYPE_DB2); + databaseTypeMappings.setProperty("DB2 UDB iSeries", DATABASE_TYPE_DB2); + databaseTypeMappings.setProperty("DB2/AIX64", DATABASE_TYPE_DB2); + databaseTypeMappings.setProperty("DB2/HPUX", DATABASE_TYPE_DB2); + databaseTypeMappings.setProperty("DB2/HP64", DATABASE_TYPE_DB2); + databaseTypeMappings.setProperty("DB2/SUN", DATABASE_TYPE_DB2); + databaseTypeMappings.setProperty("DB2/SUN64", DATABASE_TYPE_DB2); + databaseTypeMappings.setProperty("DB2/PTX", DATABASE_TYPE_DB2); + databaseTypeMappings.setProperty("DB2/2", DATABASE_TYPE_DB2); + databaseTypeMappings.setProperty("DB2 UDB AS400", DATABASE_TYPE_DB2); + databaseTypeMappings.setProperty("DM DBMS", DATABASE_TYPE_MYSQL);// 扩展支持达梦数据 + databaseTypeMappings.setProperty(PRODUCT_NAME_CRDB, DATABASE_TYPE_COCKROACHDB); + return databaseTypeMappings; + } + + protected Map beans; + + protected IdGenerator idGenerator; + + protected boolean usePrefixId; + + protected Clock clock; + + protected ObjectMapper objectMapper; + + // Variables + + public static final int DEFAULT_GENERIC_MAX_LENGTH_STRING = 4000; + + public static final int DEFAULT_ORACLE_MAX_LENGTH_STRING = 2000; + + /** + * Define a max length for storing String variable types in the database. Mainly used + * for the Oracle NVARCHAR2 limit of 2000 characters + */ + protected int maxLengthStringVariableType = -1; + + protected void initEngineConfigurations() { + addEngineConfiguration(getEngineCfgKey(), getEngineScopeType(), this); + } + + // DataSource + // /////////////////////////////////////////////////////////////// + + protected void initDataSource() { + if (dataSource == null) { + if (dataSourceJndiName != null) { + try { + dataSource = (DataSource) new InitialContext().lookup(dataSourceJndiName); + } + catch (Exception e) { + throw new FlowableException( + "couldn't lookup datasource from " + dataSourceJndiName + ": " + e.getMessage(), e); + } + + } + else if (jdbcUrl != null) { + if ((jdbcDriver == null) || (jdbcUsername == null)) { + throw new FlowableException( + "DataSource or JDBC properties have to be specified in a process engine configuration"); + } + + logger.debug("initializing datasource to db: {}", jdbcUrl); + + if (logger.isInfoEnabled()) { + logger.info("Configuring Datasource with following properties (omitted password for security)"); + logger.info("datasource driver : {}", jdbcDriver); + logger.info("datasource url : {}", jdbcUrl); + logger.info("datasource user name : {}", jdbcUsername); + } + + PooledDataSource pooledDataSource = new PooledDataSource(this.getClass().getClassLoader(), jdbcDriver, + jdbcUrl, jdbcUsername, jdbcPassword); + + if (jdbcMaxActiveConnections > 0) { + pooledDataSource.setPoolMaximumActiveConnections(jdbcMaxActiveConnections); + } + if (jdbcMaxIdleConnections > 0) { + pooledDataSource.setPoolMaximumIdleConnections(jdbcMaxIdleConnections); + } + if (jdbcMaxCheckoutTime > 0) { + pooledDataSource.setPoolMaximumCheckoutTime(jdbcMaxCheckoutTime); + } + if (jdbcMaxWaitTime > 0) { + pooledDataSource.setPoolTimeToWait(jdbcMaxWaitTime); + } + if (jdbcPingEnabled) { + pooledDataSource.setPoolPingEnabled(true); + if (jdbcPingQuery != null) { + pooledDataSource.setPoolPingQuery(jdbcPingQuery); + } + pooledDataSource.setPoolPingConnectionsNotUsedFor(jdbcPingConnectionNotUsedFor); + } + if (jdbcDefaultTransactionIsolationLevel > 0) { + pooledDataSource.setDefaultTransactionIsolationLevel(jdbcDefaultTransactionIsolationLevel); + } + dataSource = pooledDataSource; + } + } + + if (databaseType == null) { + initDatabaseType(); + } + } + + public void initDatabaseType() { + Connection connection = null; + try { + connection = dataSource.getConnection(); + DatabaseMetaData databaseMetaData = connection.getMetaData(); + String databaseProductName = databaseMetaData.getDatabaseProductName(); + logger.debug("database product name: '{}'", databaseProductName); + + // CRDB does not expose the version through the jdbc driver, so we need to + // fetch it through version(). + if (PRODUCT_NAME_POSTGRES.equalsIgnoreCase(databaseProductName)) { + try (PreparedStatement preparedStatement = connection.prepareStatement("select version() as version;"); + ResultSet resultSet = preparedStatement.executeQuery()) { + String version = null; + if (resultSet.next()) { + version = resultSet.getString("version"); + } + + if (StringUtils.isNotEmpty(version) + && version.toLowerCase().startsWith(PRODUCT_NAME_CRDB.toLowerCase())) { + databaseProductName = PRODUCT_NAME_CRDB; + logger.info("CockroachDB version '{}' detected", version); + } + } + } + + databaseType = databaseTypeMappings.getProperty(databaseProductName); + if (databaseType == null) { + throw new FlowableException( + "couldn't deduct database type from database product name '" + databaseProductName + "'"); + } + logger.debug("using database type: {}", databaseType); + + } + catch (SQLException e) { + throw new RuntimeException("Exception while initializing Database connection", e); + } + finally { + try { + if (connection != null) { + connection.close(); + } + } + catch (SQLException e) { + logger.error("Exception while closing the Database connection", e); + } + } + + // Special care for MSSQL, as it has a hard limit of 2000 params per statement + // (incl bulk statement). + // Especially with executions, with 100 as default, this limit is passed. + if (DATABASE_TYPE_MSSQL.equals(databaseType)) { + maxNrOfStatementsInBulkInsert = DEFAULT_MAX_NR_OF_STATEMENTS_BULK_INSERT_SQL_SERVER; + } + } + + public void initSchemaManager() { + if (this.commonSchemaManager == null) { + this.commonSchemaManager = new CommonDbSchemaManager(); + } + } + + // session factories //////////////////////////////////////////////////////// + + public void addSessionFactory(SessionFactory sessionFactory) { + sessionFactories.put(sessionFactory.getSessionType(), sessionFactory); + } + + public void initCommandContextFactory() { + if (commandContextFactory == null) { + commandContextFactory = new CommandContextFactory(); + } + } + + public void initTransactionContextFactory() { + if (transactionContextFactory == null) { + transactionContextFactory = new StandaloneMybatisTransactionContextFactory(); + } + } + + public void initCommandExecutors() { + initDefaultCommandConfig(); + initSchemaCommandConfig(); + initCommandInvoker(); + initCommandInterceptors(); + initCommandExecutor(); + } + + public void initDefaultCommandConfig() { + if (defaultCommandConfig == null) { + defaultCommandConfig = new CommandConfig(); + } + } + + public void initSchemaCommandConfig() { + if (schemaCommandConfig == null) { + schemaCommandConfig = new CommandConfig(); + } + } + + public void initCommandInvoker() { + if (commandInvoker == null) { + commandInvoker = new DefaultCommandInvoker(); + } + } + + public void initCommandInterceptors() { + if (commandInterceptors == null) { + commandInterceptors = new ArrayList<>(); + if (customPreCommandInterceptors != null) { + commandInterceptors.addAll(customPreCommandInterceptors); + } + commandInterceptors.addAll(getDefaultCommandInterceptors()); + if (customPostCommandInterceptors != null) { + commandInterceptors.addAll(customPostCommandInterceptors); + } + commandInterceptors.add(commandInvoker); + } + } + + public Collection getDefaultCommandInterceptors() { + if (defaultCommandInterceptors == null) { + List interceptors = new ArrayList<>(); + interceptors.add(new LogInterceptor()); + + if (DATABASE_TYPE_COCKROACHDB.equals(databaseType)) { + interceptors.add(new CrDbRetryInterceptor()); + } + + CommandInterceptor transactionInterceptor = createTransactionInterceptor(); + if (transactionInterceptor != null) { + interceptors.add(transactionInterceptor); + } + + if (commandContextFactory != null) { + String engineCfgKey = getEngineCfgKey(); + CommandContextInterceptor commandContextInterceptor = new CommandContextInterceptor( + commandContextFactory, classLoader, useClassForNameClassLoading, clock, objectMapper); + engineConfigurations.put(engineCfgKey, this); + commandContextInterceptor.setEngineCfgKey(engineCfgKey); + commandContextInterceptor.setEngineConfigurations(engineConfigurations); + interceptors.add(commandContextInterceptor); + } + + if (transactionContextFactory != null) { + interceptors.add(new TransactionContextInterceptor(transactionContextFactory)); + } + + List additionalCommandInterceptors = getAdditionalDefaultCommandInterceptors(); + if (additionalCommandInterceptors != null) { + interceptors.addAll(additionalCommandInterceptors); + } + + defaultCommandInterceptors = interceptors; + } + return defaultCommandInterceptors; + } + + public abstract String getEngineCfgKey(); + + public abstract String getEngineScopeType(); + + public List getAdditionalDefaultCommandInterceptors() { + return null; + } + + public void initCommandExecutor() { + if (commandExecutor == null) { + CommandInterceptor first = initInterceptorChain(commandInterceptors); + commandExecutor = new CommandExecutorImpl(getDefaultCommandConfig(), first); + } + } + + public CommandInterceptor initInterceptorChain(List chain) { + if (chain == null || chain.isEmpty()) { + throw new FlowableException("invalid command interceptor chain configuration: " + chain); + } + for (int i = 0; i < chain.size() - 1; i++) { + chain.get(i).setNext(chain.get(i + 1)); + } + return chain.get(0); + } + + public abstract CommandInterceptor createTransactionInterceptor(); + + public void initBeans() { + if (beans == null) { + beans = new HashMap<>(); + } + } + + // id generator + // ///////////////////////////////////////////////////////////// + + public void initIdGenerator() { + if (idGenerator == null) { + idGenerator = new StrongUuidGenerator(); + } + } + + public void initObjectMapper() { + if (objectMapper == null) { + objectMapper = new ObjectMapper(); + objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); + } + } + + public void initClock() { + if (clock == null) { + clock = new DefaultClockImpl(); + } + } + + // Data managers /////////////////////////////////////////////////////////// + + public void initDataManagers() { + if (propertyDataManager == null) { + propertyDataManager = new MybatisPropertyDataManager(idGenerator); + } + + if (byteArrayDataManager == null) { + byteArrayDataManager = new MybatisByteArrayDataManager(idGenerator); + } + } + + // Entity managers ////////////////////////////////////////////////////////// + + public void initEntityManagers() { + if (propertyEntityManager == null) { + propertyEntityManager = new PropertyEntityManagerImpl(this, propertyDataManager); + } + + if (byteArrayEntityManager == null) { + byteArrayEntityManager = new ByteArrayEntityManagerImpl(byteArrayDataManager, getEngineCfgKey(), + this::getEventDispatcher); + } + + if (tableDataManager == null) { + tableDataManager = new TableDataManagerImpl(this); + } + } + + // services + // ///////////////////////////////////////////////////////////////// + + protected void initService(Object service) { + if (service instanceof CommonEngineServiceImpl) { + ((CommonEngineServiceImpl) service).setCommandExecutor(commandExecutor); + } + } + + // myBatis SqlSessionFactory + // //////////////////////////////////////////////// + + public void initSessionFactories() { + if (sessionFactories == null) { + sessionFactories = new HashMap<>(); + + if (usingRelationalDatabase) { + initDbSqlSessionFactory(); + } + + addSessionFactory(new GenericManagerFactory(EntityCache.class, EntityCacheImpl.class)); + + if (isLoggingSessionEnabled()) { + if (!sessionFactories.containsKey(LoggingSession.class)) { + LoggingSessionFactory loggingSessionFactory = new LoggingSessionFactory(); + loggingSessionFactory.setLoggingListener(loggingListener); + loggingSessionFactory.setObjectMapper(objectMapper); + sessionFactories.put(LoggingSession.class, loggingSessionFactory); + } + } + + commandContextFactory.setSessionFactories(sessionFactories); + + } + else { + if (usingRelationalDatabase) { + initDbSqlSessionFactoryEntitySettings(); + } + } + + if (customSessionFactories != null) { + for (SessionFactory sessionFactory : customSessionFactories) { + addSessionFactory(sessionFactory); + } + } + } + + public void initDbSqlSessionFactory() { + if (dbSqlSessionFactory == null) { + dbSqlSessionFactory = createDbSqlSessionFactory(); + } + dbSqlSessionFactory.setDatabaseType(databaseType); + dbSqlSessionFactory.setSqlSessionFactory(sqlSessionFactory); + dbSqlSessionFactory.setDbHistoryUsed(isDbHistoryUsed); + dbSqlSessionFactory.setDatabaseTablePrefix(databaseTablePrefix); + dbSqlSessionFactory.setTablePrefixIsSchema(tablePrefixIsSchema); + dbSqlSessionFactory.setDatabaseCatalog(databaseCatalog); + dbSqlSessionFactory.setDatabaseSchema(databaseSchema); + dbSqlSessionFactory.setMaxNrOfStatementsInBulkInsert(maxNrOfStatementsInBulkInsert); + + initDbSqlSessionFactoryEntitySettings(); + + addSessionFactory(dbSqlSessionFactory); + } + + public DbSqlSessionFactory createDbSqlSessionFactory() { + return new DbSqlSessionFactory(usePrefixId); + } + + protected abstract void initDbSqlSessionFactoryEntitySettings(); + + protected void defaultInitDbSqlSessionFactoryEntitySettings(List> insertOrder, + List> deleteOrder) { + if (insertOrder != null) { + for (Class clazz : insertOrder) { + dbSqlSessionFactory.getInsertionOrder().add(clazz); + + if (isBulkInsertEnabled) { + dbSqlSessionFactory.getBulkInserteableEntityClasses().add(clazz); + } + } + } + + if (deleteOrder != null) { + for (Class clazz : deleteOrder) { + dbSqlSessionFactory.getDeletionOrder().add(clazz); + } + } + } + + public void initTransactionFactory() { + if (transactionFactory == null) { + if (transactionsExternallyManaged) { + transactionFactory = new ManagedTransactionFactory(); + Properties properties = new Properties(); + properties.put("closeConnection", "false"); + this.transactionFactory.setProperties(properties); + } + else { + transactionFactory = new JdbcTransactionFactory(); + } + } + } + + public void initSqlSessionFactory() { + if (sqlSessionFactory == null) { + InputStream inputStream = null; + try { + inputStream = getMyBatisXmlConfigurationStream(); + + Environment environment = new Environment("default", transactionFactory, dataSource); + Reader reader = new InputStreamReader(inputStream); + Properties properties = new Properties(); + properties.put("prefix", databaseTablePrefix); + + String wildcardEscapeClause = ""; + if ((databaseWildcardEscapeCharacter != null) && (databaseWildcardEscapeCharacter.length() != 0)) { + wildcardEscapeClause = " escape '" + databaseWildcardEscapeCharacter + "'"; + } + properties.put("wildcardEscapeClause", wildcardEscapeClause); + + // set default properties + properties.put("limitBefore", ""); + properties.put("limitAfter", ""); + properties.put("limitBetween", ""); + properties.put("limitBeforeNativeQuery", ""); + properties.put("limitAfterNativeQuery", ""); + properties.put("blobType", "BLOB"); + properties.put("boolValue", "TRUE"); + + if (databaseType != null) { + properties.load(getResourceAsStream(pathToEngineDbProperties())); + } + + Configuration configuration = initMybatisConfiguration(environment, reader, properties); + sqlSessionFactory = new DefaultSqlSessionFactory(configuration); + + } + catch (Exception e) { + throw new FlowableException("Error while building ibatis SqlSessionFactory: " + e.getMessage(), e); + } + finally { + IoUtil.closeSilently(inputStream); + } + } + else { + // This is needed when the SQL Session Factory is created by another engine. + // When custom XML Mappers are registered with this engine they need to be + // loaded in the configuration as well + applyCustomMybatisCustomizations(sqlSessionFactory.getConfiguration()); + } + } + + public String pathToEngineDbProperties() { + return "org/flowable/common/db/properties/" + databaseType + ".properties"; + } + + public Configuration initMybatisConfiguration(Environment environment, Reader reader, Properties properties) { + XMLConfigBuilder parser = new XMLConfigBuilder(reader, "", properties); + Configuration configuration = parser.getConfiguration(); + + if (databaseType != null) { + configuration.setDatabaseId(databaseType); + } + + configuration.setEnvironment(environment); + + initMybatisTypeHandlers(configuration); + initCustomMybatisInterceptors(configuration); + if (isEnableLogSqlExecutionTime()) { + initMyBatisLogSqlExecutionTimePlugin(configuration); + } + + configuration = parseMybatisConfiguration(parser); + return configuration; + } + + public void initCustomMybatisMappers(Configuration configuration) { + if (getCustomMybatisMappers() != null) { + for (Class clazz : getCustomMybatisMappers()) { + if (!configuration.hasMapper(clazz)) { + configuration.addMapper(clazz); + } + } + } + } + + public void initMybatisTypeHandlers(Configuration configuration) { + // When mapping into Map there is currently a problem with + // MyBatis. + // It will return objects which are driver specific. + // Therefore we are registering the mappings between Object.class and the specific + // jdbc type here. + // see https://github.com/mybatis/mybatis-3/issues/2216 for more info + TypeHandlerRegistry handlerRegistry = configuration.getTypeHandlerRegistry(); + + handlerRegistry.register(Object.class, JdbcType.BOOLEAN, new BooleanTypeHandler()); + handlerRegistry.register(Object.class, JdbcType.BIT, new BooleanTypeHandler()); + + handlerRegistry.register(Object.class, JdbcType.TINYINT, new ByteTypeHandler()); + + handlerRegistry.register(Object.class, JdbcType.SMALLINT, new ShortTypeHandler()); + + handlerRegistry.register(Object.class, JdbcType.INTEGER, new IntegerTypeHandler()); + + handlerRegistry.register(Object.class, JdbcType.FLOAT, new FloatTypeHandler()); + + handlerRegistry.register(Object.class, JdbcType.DOUBLE, new DoubleTypeHandler()); + + handlerRegistry.register(Object.class, JdbcType.CHAR, new StringTypeHandler()); + handlerRegistry.register(Object.class, JdbcType.CLOB, new ClobTypeHandler()); + handlerRegistry.register(Object.class, JdbcType.VARCHAR, new StringTypeHandler()); + handlerRegistry.register(Object.class, JdbcType.LONGVARCHAR, new StringTypeHandler()); + handlerRegistry.register(Object.class, JdbcType.NVARCHAR, new NStringTypeHandler()); + handlerRegistry.register(Object.class, JdbcType.NCHAR, new NStringTypeHandler()); + handlerRegistry.register(Object.class, JdbcType.NCLOB, new NClobTypeHandler()); + + handlerRegistry.register(Object.class, JdbcType.ARRAY, new ArrayTypeHandler()); + + handlerRegistry.register(Object.class, JdbcType.BIGINT, new LongTypeHandler()); + + handlerRegistry.register(Object.class, JdbcType.REAL, new BigDecimalTypeHandler()); + handlerRegistry.register(Object.class, JdbcType.DECIMAL, new BigDecimalTypeHandler()); + handlerRegistry.register(Object.class, JdbcType.NUMERIC, new BigDecimalTypeHandler()); + + handlerRegistry.register(Object.class, JdbcType.BLOB, new BlobInputStreamTypeHandler()); + handlerRegistry.register(Object.class, JdbcType.LONGVARBINARY, new BlobTypeHandler()); + + handlerRegistry.register(Object.class, JdbcType.DATE, new DateOnlyTypeHandler()); + handlerRegistry.register(Object.class, JdbcType.TIME, new TimeOnlyTypeHandler()); + handlerRegistry.register(Object.class, JdbcType.TIMESTAMP, new DateTypeHandler()); + + handlerRegistry.register(Object.class, JdbcType.SQLXML, new SqlxmlTypeHandler()); + } + + public void initCustomMybatisInterceptors(Configuration configuration) { + if (customMybatisInterceptors != null) { + for (Interceptor interceptor : customMybatisInterceptors) { + configuration.addInterceptor(interceptor); + } + } + } + + public void initMyBatisLogSqlExecutionTimePlugin(Configuration configuration) { + configuration.addInterceptor(new LogSqlExecutionTimePlugin()); + } + + public Configuration parseMybatisConfiguration(XMLConfigBuilder parser) { + Configuration configuration = parser.parse(); + + applyCustomMybatisCustomizations(configuration); + return configuration; + } + + protected void applyCustomMybatisCustomizations(Configuration configuration) { + initCustomMybatisMappers(configuration); + + if (dependentEngineMybatisTypeAliasConfigs != null) { + for (MybatisTypeAliasConfigurator typeAliasConfig : dependentEngineMybatisTypeAliasConfigs) { + typeAliasConfig.configure(configuration.getTypeAliasRegistry()); + } + } + if (dependentEngineMybatisTypeHandlerConfigs != null) { + for (MybatisTypeHandlerConfigurator typeHandlerConfig : dependentEngineMybatisTypeHandlerConfigs) { + typeHandlerConfig.configure(configuration.getTypeHandlerRegistry()); + } + } + + parseDependentEngineMybatisXMLMappers(configuration); + parseCustomMybatisXMLMappers(configuration); + } + + public void parseCustomMybatisXMLMappers(Configuration configuration) { + if (getCustomMybatisXMLMappers() != null) { + for (String resource : getCustomMybatisXMLMappers()) { + parseMybatisXmlMapping(configuration, resource); + } + } + } + + public void parseDependentEngineMybatisXMLMappers(Configuration configuration) { + if (getDependentEngineMyBatisXmlMappers() != null) { + for (String resource : getDependentEngineMyBatisXmlMappers()) { + parseMybatisXmlMapping(configuration, resource); + } + } + } + + protected void parseMybatisXmlMapping(Configuration configuration, String resource) { + // see XMLConfigBuilder.mapperElement() + XMLMapperBuilder mapperParser = new XMLMapperBuilder(getResourceAsStream(resource), configuration, resource, + configuration.getSqlFragments()); + mapperParser.parse(); + } + + protected InputStream getResourceAsStream(String resource) { + ClassLoader classLoader = getClassLoader(); + if (classLoader != null) { + return getClassLoader().getResourceAsStream(resource); + } + else { + return this.getClass().getClassLoader().getResourceAsStream(resource); + } + } + + public void setMybatisMappingFile(String file) { + this.mybatisMappingFile = file; + } + + public String getMybatisMappingFile() { + return mybatisMappingFile; + } + + public abstract InputStream getMyBatisXmlConfigurationStream(); + + public void initConfigurators() { + + allConfigurators = new ArrayList<>(); + allConfigurators.addAll(getEngineSpecificEngineConfigurators()); + + // Configurators that are explicitly added to the config + if (configurators != null) { + allConfigurators.addAll(configurators); + } + + // Auto discovery through ServiceLoader + if (enableConfiguratorServiceLoader) { + ClassLoader classLoader = getClassLoader(); + if (classLoader == null) { + classLoader = ReflectUtil.getClassLoader(); + } + + ServiceLoader configuratorServiceLoader = ServiceLoader.load(EngineConfigurator.class, + classLoader); + int nrOfServiceLoadedConfigurators = 0; + for (EngineConfigurator configurator : configuratorServiceLoader) { + allConfigurators.add(configurator); + nrOfServiceLoadedConfigurators++; + } + + if (nrOfServiceLoadedConfigurators > 0) { + logger.info("Found {} auto-discoverable Process Engine Configurator{}", nrOfServiceLoadedConfigurators, + nrOfServiceLoadedConfigurators > 1 ? "s" : ""); + } + + if (!allConfigurators.isEmpty()) { + + // Order them according to the priorities (useful for dependent + // configurator) + allConfigurators.sort(new Comparator() { + + @Override + public int compare(EngineConfigurator configurator1, EngineConfigurator configurator2) { + int priority1 = configurator1.getPriority(); + int priority2 = configurator2.getPriority(); + + if (priority1 < priority2) { + return -1; + } + else if (priority1 > priority2) { + return 1; + } + return 0; + } + }); + + // Execute the configurators + logger.info("Found {} Engine Configurators in total:", allConfigurators.size()); + for (EngineConfigurator configurator : allConfigurators) { + logger.info("{} (priority:{})", configurator.getClass(), configurator.getPriority()); + } + + } + + } + } + + public void close() { + if (forceCloseMybatisConnectionPool && dataSource instanceof PooledDataSource) { + /* + * When the datasource is created by a Flowable engine (i.e. it's an instance + * of PooledDataSource), the connection pool needs to be closed when closing + * the engine. Note that calling forceCloseAll() multiple times (as is the + * case when running with multiple engine) is ok. + */ + ((PooledDataSource) dataSource).forceCloseAll(); + } + } + + protected List getEngineSpecificEngineConfigurators() { + // meant to be overridden if needed + return Collections.emptyList(); + } + + public void configuratorsBeforeInit() { + for (EngineConfigurator configurator : allConfigurators) { + logger.info("Executing beforeInit() of {} (priority:{})", configurator.getClass(), + configurator.getPriority()); + configurator.beforeInit(this); + } + } + + public void configuratorsAfterInit() { + for (EngineConfigurator configurator : allConfigurators) { + logger.info("Executing configure() of {} (priority:{})", configurator.getClass(), + configurator.getPriority()); + configurator.configure(this); + } + } + + public LockManager getLockManager(String lockName) { + return new LockManagerImpl(commandExecutor, lockName, getLockPollRate(), getEngineCfgKey()); + } + + // getters and setters + // ////////////////////////////////////////////////////// + + public abstract String getEngineName(); + + public ClassLoader getClassLoader() { + return classLoader; + } + + public AbstractEngineConfiguration setClassLoader(ClassLoader classLoader) { + this.classLoader = classLoader; + return this; + } + + public boolean isUseClassForNameClassLoading() { + return useClassForNameClassLoading; + } + + public AbstractEngineConfiguration setUseClassForNameClassLoading(boolean useClassForNameClassLoading) { + this.useClassForNameClassLoading = useClassForNameClassLoading; + return this; + } + + public void addEngineLifecycleListener(EngineLifecycleListener engineLifecycleListener) { + if (this.engineLifecycleListeners == null) { + this.engineLifecycleListeners = new ArrayList<>(); + } + this.engineLifecycleListeners.add(engineLifecycleListener); + } + + public List getEngineLifecycleListeners() { + return engineLifecycleListeners; + } + + public AbstractEngineConfiguration setEngineLifecycleListeners( + List engineLifecycleListeners) { + this.engineLifecycleListeners = engineLifecycleListeners; + return this; + } + + public String getDatabaseType() { + return databaseType; + } + + public AbstractEngineConfiguration setDatabaseType(String databaseType) { + this.databaseType = databaseType; + return this; + } + + public DataSource getDataSource() { + return dataSource; + } + + public AbstractEngineConfiguration setDataSource(DataSource dataSource) { + this.dataSource = dataSource; + return this; + } + + public SchemaManager getSchemaManager() { + return schemaManager; + } + + public AbstractEngineConfiguration setSchemaManager(SchemaManager schemaManager) { + this.schemaManager = schemaManager; + return this; + } + + public SchemaManager getCommonSchemaManager() { + return commonSchemaManager; + } + + public AbstractEngineConfiguration setCommonSchemaManager(SchemaManager commonSchemaManager) { + this.commonSchemaManager = commonSchemaManager; + return this; + } + + public Command getSchemaManagementCmd() { + return schemaManagementCmd; + } + + public AbstractEngineConfiguration setSchemaManagementCmd(Command schemaManagementCmd) { + this.schemaManagementCmd = schemaManagementCmd; + return this; + } + + public String getJdbcDriver() { + return jdbcDriver; + } + + public AbstractEngineConfiguration setJdbcDriver(String jdbcDriver) { + this.jdbcDriver = jdbcDriver; + return this; + } + + public String getJdbcUrl() { + return jdbcUrl; + } + + public AbstractEngineConfiguration setJdbcUrl(String jdbcUrl) { + this.jdbcUrl = jdbcUrl; + return this; + } + + public String getJdbcUsername() { + return jdbcUsername; + } + + public AbstractEngineConfiguration setJdbcUsername(String jdbcUsername) { + this.jdbcUsername = jdbcUsername; + return this; + } + + public String getJdbcPassword() { + return jdbcPassword; + } + + public AbstractEngineConfiguration setJdbcPassword(String jdbcPassword) { + this.jdbcPassword = jdbcPassword; + return this; + } + + public int getJdbcMaxActiveConnections() { + return jdbcMaxActiveConnections; + } + + public AbstractEngineConfiguration setJdbcMaxActiveConnections(int jdbcMaxActiveConnections) { + this.jdbcMaxActiveConnections = jdbcMaxActiveConnections; + return this; + } + + public int getJdbcMaxIdleConnections() { + return jdbcMaxIdleConnections; + } + + public AbstractEngineConfiguration setJdbcMaxIdleConnections(int jdbcMaxIdleConnections) { + this.jdbcMaxIdleConnections = jdbcMaxIdleConnections; + return this; + } + + public int getJdbcMaxCheckoutTime() { + return jdbcMaxCheckoutTime; + } + + public AbstractEngineConfiguration setJdbcMaxCheckoutTime(int jdbcMaxCheckoutTime) { + this.jdbcMaxCheckoutTime = jdbcMaxCheckoutTime; + return this; + } + + public int getJdbcMaxWaitTime() { + return jdbcMaxWaitTime; + } + + public AbstractEngineConfiguration setJdbcMaxWaitTime(int jdbcMaxWaitTime) { + this.jdbcMaxWaitTime = jdbcMaxWaitTime; + return this; + } + + public boolean isJdbcPingEnabled() { + return jdbcPingEnabled; + } + + public AbstractEngineConfiguration setJdbcPingEnabled(boolean jdbcPingEnabled) { + this.jdbcPingEnabled = jdbcPingEnabled; + return this; + } + + public int getJdbcPingConnectionNotUsedFor() { + return jdbcPingConnectionNotUsedFor; + } + + public AbstractEngineConfiguration setJdbcPingConnectionNotUsedFor(int jdbcPingConnectionNotUsedFor) { + this.jdbcPingConnectionNotUsedFor = jdbcPingConnectionNotUsedFor; + return this; + } + + public int getJdbcDefaultTransactionIsolationLevel() { + return jdbcDefaultTransactionIsolationLevel; + } + + public AbstractEngineConfiguration setJdbcDefaultTransactionIsolationLevel( + int jdbcDefaultTransactionIsolationLevel) { + this.jdbcDefaultTransactionIsolationLevel = jdbcDefaultTransactionIsolationLevel; + return this; + } + + public String getJdbcPingQuery() { + return jdbcPingQuery; + } + + public AbstractEngineConfiguration setJdbcPingQuery(String jdbcPingQuery) { + this.jdbcPingQuery = jdbcPingQuery; + return this; + } + + public String getDataSourceJndiName() { + return dataSourceJndiName; + } + + public AbstractEngineConfiguration setDataSourceJndiName(String dataSourceJndiName) { + this.dataSourceJndiName = dataSourceJndiName; + return this; + } + + public CommandConfig getSchemaCommandConfig() { + return schemaCommandConfig; + } + + public AbstractEngineConfiguration setSchemaCommandConfig(CommandConfig schemaCommandConfig) { + this.schemaCommandConfig = schemaCommandConfig; + return this; + } + + public boolean isTransactionsExternallyManaged() { + return transactionsExternallyManaged; + } + + public AbstractEngineConfiguration setTransactionsExternallyManaged(boolean transactionsExternallyManaged) { + this.transactionsExternallyManaged = transactionsExternallyManaged; + return this; + } + + public Map getBeans() { + return beans; + } + + public AbstractEngineConfiguration setBeans(Map beans) { + this.beans = beans; + return this; + } + + public IdGenerator getIdGenerator() { + return idGenerator; + } + + public AbstractEngineConfiguration setIdGenerator(IdGenerator idGenerator) { + this.idGenerator = idGenerator; + return this; + } + + public boolean isUsePrefixId() { + return usePrefixId; + } + + public AbstractEngineConfiguration setUsePrefixId(boolean usePrefixId) { + this.usePrefixId = usePrefixId; + return this; + } + + public String getXmlEncoding() { + return xmlEncoding; + } + + public AbstractEngineConfiguration setXmlEncoding(String xmlEncoding) { + this.xmlEncoding = xmlEncoding; + return this; + } + + public CommandConfig getDefaultCommandConfig() { + return defaultCommandConfig; + } + + public AbstractEngineConfiguration setDefaultCommandConfig(CommandConfig defaultCommandConfig) { + this.defaultCommandConfig = defaultCommandConfig; + return this; + } + + public CommandExecutor getCommandExecutor() { + return commandExecutor; + } + + public AbstractEngineConfiguration setCommandExecutor(CommandExecutor commandExecutor) { + this.commandExecutor = commandExecutor; + return this; + } + + public CommandContextFactory getCommandContextFactory() { + return commandContextFactory; + } + + public AbstractEngineConfiguration setCommandContextFactory(CommandContextFactory commandContextFactory) { + this.commandContextFactory = commandContextFactory; + return this; + } + + public CommandInterceptor getCommandInvoker() { + return commandInvoker; + } + + public AbstractEngineConfiguration setCommandInvoker(CommandInterceptor commandInvoker) { + this.commandInvoker = commandInvoker; + return this; + } + + public AgendaOperationRunner getAgendaOperationRunner() { + return agendaOperationRunner; + } + + public AbstractEngineConfiguration setAgendaOperationRunner(AgendaOperationRunner agendaOperationRunner) { + this.agendaOperationRunner = agendaOperationRunner; + return this; + } + + public List getCustomPreCommandInterceptors() { + return customPreCommandInterceptors; + } + + public AbstractEngineConfiguration setCustomPreCommandInterceptors( + List customPreCommandInterceptors) { + this.customPreCommandInterceptors = customPreCommandInterceptors; + return this; + } + + public List getCustomPostCommandInterceptors() { + return customPostCommandInterceptors; + } + + public AbstractEngineConfiguration setCustomPostCommandInterceptors( + List customPostCommandInterceptors) { + this.customPostCommandInterceptors = customPostCommandInterceptors; + return this; + } + + public List getCommandInterceptors() { + return commandInterceptors; + } + + public AbstractEngineConfiguration setCommandInterceptors(List commandInterceptors) { + this.commandInterceptors = commandInterceptors; + return this; + } + + public Map getEngineConfigurations() { + return engineConfigurations; + } + + public AbstractEngineConfiguration setEngineConfigurations( + Map engineConfigurations) { + this.engineConfigurations = engineConfigurations; + return this; + } + + public void addEngineConfiguration(String key, String scopeType, AbstractEngineConfiguration engineConfiguration) { + if (engineConfigurations == null) { + engineConfigurations = new HashMap<>(); + } + engineConfigurations.put(key, engineConfiguration); + engineConfigurations.put(scopeType, engineConfiguration); + } + + public Map getServiceConfigurations() { + return serviceConfigurations; + } + + public AbstractEngineConfiguration setServiceConfigurations( + Map serviceConfigurations) { + this.serviceConfigurations = serviceConfigurations; + return this; + } + + public void addServiceConfiguration(String key, AbstractServiceConfiguration serviceConfiguration) { + if (serviceConfigurations == null) { + serviceConfigurations = new HashMap<>(); + } + serviceConfigurations.put(key, serviceConfiguration); + } + + public Map getEventRegistryEventConsumers() { + return eventRegistryEventConsumers; + } + + public AbstractEngineConfiguration setEventRegistryEventConsumers( + Map eventRegistryEventConsumers) { + this.eventRegistryEventConsumers = eventRegistryEventConsumers; + return this; + } + + public void addEventRegistryEventConsumer(String key, EventRegistryEventConsumer eventRegistryEventConsumer) { + if (eventRegistryEventConsumers == null) { + eventRegistryEventConsumers = new HashMap<>(); + } + eventRegistryEventConsumers.put(key, eventRegistryEventConsumer); + } + + public AbstractEngineConfiguration setDefaultCommandInterceptors( + Collection defaultCommandInterceptors) { + this.defaultCommandInterceptors = defaultCommandInterceptors; + return this; + } + + public SqlSessionFactory getSqlSessionFactory() { + return sqlSessionFactory; + } + + public AbstractEngineConfiguration setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) { + this.sqlSessionFactory = sqlSessionFactory; + return this; + } + + public boolean isDbHistoryUsed() { + return isDbHistoryUsed; + } + + public AbstractEngineConfiguration setDbHistoryUsed(boolean isDbHistoryUsed) { + this.isDbHistoryUsed = isDbHistoryUsed; + return this; + } + + public DbSqlSessionFactory getDbSqlSessionFactory() { + return dbSqlSessionFactory; + } + + public AbstractEngineConfiguration setDbSqlSessionFactory(DbSqlSessionFactory dbSqlSessionFactory) { + this.dbSqlSessionFactory = dbSqlSessionFactory; + return this; + } + + public TransactionFactory getTransactionFactory() { + return transactionFactory; + } + + public AbstractEngineConfiguration setTransactionFactory(TransactionFactory transactionFactory) { + this.transactionFactory = transactionFactory; + return this; + } + + public TransactionContextFactory getTransactionContextFactory() { + return transactionContextFactory; + } + + public AbstractEngineConfiguration setTransactionContextFactory( + TransactionContextFactory transactionContextFactory) { + this.transactionContextFactory = transactionContextFactory; + return this; + } + + public int getMaxNrOfStatementsInBulkInsert() { + return maxNrOfStatementsInBulkInsert; + } + + public AbstractEngineConfiguration setMaxNrOfStatementsInBulkInsert(int maxNrOfStatementsInBulkInsert) { + this.maxNrOfStatementsInBulkInsert = maxNrOfStatementsInBulkInsert; + return this; + } + + public boolean isBulkInsertEnabled() { + return isBulkInsertEnabled; + } + + public AbstractEngineConfiguration setBulkInsertEnabled(boolean isBulkInsertEnabled) { + this.isBulkInsertEnabled = isBulkInsertEnabled; + return this; + } + + public Set> getCustomMybatisMappers() { + return customMybatisMappers; + } + + public AbstractEngineConfiguration setCustomMybatisMappers(Set> customMybatisMappers) { + this.customMybatisMappers = customMybatisMappers; + return this; + } + + public Set getCustomMybatisXMLMappers() { + return customMybatisXMLMappers; + } + + public AbstractEngineConfiguration setCustomMybatisXMLMappers(Set customMybatisXMLMappers) { + this.customMybatisXMLMappers = customMybatisXMLMappers; + return this; + } + + public Set getDependentEngineMyBatisXmlMappers() { + return dependentEngineMyBatisXmlMappers; + } + + public AbstractEngineConfiguration setCustomMybatisInterceptors(List customMybatisInterceptors) { + this.customMybatisInterceptors = customMybatisInterceptors; + return this; + } + + public List getCustomMybatisInterceptors() { + return customMybatisInterceptors; + } + + public AbstractEngineConfiguration setDependentEngineMyBatisXmlMappers( + Set dependentEngineMyBatisXmlMappers) { + this.dependentEngineMyBatisXmlMappers = dependentEngineMyBatisXmlMappers; + return this; + } + + public List getDependentEngineMybatisTypeAliasConfigs() { + return dependentEngineMybatisTypeAliasConfigs; + } + + public AbstractEngineConfiguration setDependentEngineMybatisTypeAliasConfigs( + List dependentEngineMybatisTypeAliasConfigs) { + this.dependentEngineMybatisTypeAliasConfigs = dependentEngineMybatisTypeAliasConfigs; + return this; + } + + public List getDependentEngineMybatisTypeHandlerConfigs() { + return dependentEngineMybatisTypeHandlerConfigs; + } + + public AbstractEngineConfiguration setDependentEngineMybatisTypeHandlerConfigs( + List dependentEngineMybatisTypeHandlerConfigs) { + this.dependentEngineMybatisTypeHandlerConfigs = dependentEngineMybatisTypeHandlerConfigs; + return this; + } + + public List getCustomSessionFactories() { + return customSessionFactories; + } + + public AbstractEngineConfiguration addCustomSessionFactory(SessionFactory sessionFactory) { + if (customSessionFactories == null) { + customSessionFactories = new ArrayList<>(); + } + customSessionFactories.add(sessionFactory); + return this; + } + + public AbstractEngineConfiguration setCustomSessionFactories(List customSessionFactories) { + this.customSessionFactories = customSessionFactories; + return this; + } + + public boolean isUsingRelationalDatabase() { + return usingRelationalDatabase; + } + + public AbstractEngineConfiguration setUsingRelationalDatabase(boolean usingRelationalDatabase) { + this.usingRelationalDatabase = usingRelationalDatabase; + return this; + } + + public boolean isUsingSchemaMgmt() { + return usingSchemaMgmt; + } + + public AbstractEngineConfiguration setUsingSchemaMgmt(boolean usingSchema) { + this.usingSchemaMgmt = usingSchema; + return this; + } + + public String getDatabaseTablePrefix() { + return databaseTablePrefix; + } + + public AbstractEngineConfiguration setDatabaseTablePrefix(String databaseTablePrefix) { + this.databaseTablePrefix = databaseTablePrefix; + return this; + } + + public String getDatabaseWildcardEscapeCharacter() { + return databaseWildcardEscapeCharacter; + } + + public AbstractEngineConfiguration setDatabaseWildcardEscapeCharacter(String databaseWildcardEscapeCharacter) { + this.databaseWildcardEscapeCharacter = databaseWildcardEscapeCharacter; + return this; + } + + public String getDatabaseCatalog() { + return databaseCatalog; + } + + public AbstractEngineConfiguration setDatabaseCatalog(String databaseCatalog) { + this.databaseCatalog = databaseCatalog; + return this; + } + + public String getDatabaseSchema() { + return databaseSchema; + } + + public AbstractEngineConfiguration setDatabaseSchema(String databaseSchema) { + this.databaseSchema = databaseSchema; + return this; + } + + public boolean isTablePrefixIsSchema() { + return tablePrefixIsSchema; + } + + public AbstractEngineConfiguration setTablePrefixIsSchema(boolean tablePrefixIsSchema) { + this.tablePrefixIsSchema = tablePrefixIsSchema; + return this; + } + + public boolean isAlwaysLookupLatestDefinitionVersion() { + return alwaysLookupLatestDefinitionVersion; + } + + public AbstractEngineConfiguration setAlwaysLookupLatestDefinitionVersion( + boolean alwaysLookupLatestDefinitionVersion) { + this.alwaysLookupLatestDefinitionVersion = alwaysLookupLatestDefinitionVersion; + return this; + } + + public boolean isFallbackToDefaultTenant() { + return fallbackToDefaultTenant; + } + + public AbstractEngineConfiguration setFallbackToDefaultTenant(boolean fallbackToDefaultTenant) { + this.fallbackToDefaultTenant = fallbackToDefaultTenant; + return this; + } + + /** + * @return name of the default tenant + * @deprecated use {@link AbstractEngineConfiguration#getDefaultTenantProvider()} + * instead + */ + @Deprecated + public String getDefaultTenantValue() { + return getDefaultTenantProvider().getDefaultTenant(null, null, null); + } + + public AbstractEngineConfiguration setDefaultTenantValue(String defaultTenantValue) { + this.defaultTenantProvider = (tenantId, scope, scopeKey) -> defaultTenantValue; + return this; + } + + public DefaultTenantProvider getDefaultTenantProvider() { + return defaultTenantProvider; + } + + public AbstractEngineConfiguration setDefaultTenantProvider(DefaultTenantProvider defaultTenantProvider) { + this.defaultTenantProvider = defaultTenantProvider; + return this; + } + + public boolean isEnableLogSqlExecutionTime() { + return enableLogSqlExecutionTime; + } + + public void setEnableLogSqlExecutionTime(boolean enableLogSqlExecutionTime) { + this.enableLogSqlExecutionTime = enableLogSqlExecutionTime; + } + + public Map, SessionFactory> getSessionFactories() { + return sessionFactories; + } + + public AbstractEngineConfiguration setSessionFactories(Map, SessionFactory> sessionFactories) { + this.sessionFactories = sessionFactories; + return this; + } + + public String getDatabaseSchemaUpdate() { + return databaseSchemaUpdate; + } + + public AbstractEngineConfiguration setDatabaseSchemaUpdate(String databaseSchemaUpdate) { + this.databaseSchemaUpdate = databaseSchemaUpdate; + return this; + } + + public boolean isUseLockForDatabaseSchemaUpdate() { + return useLockForDatabaseSchemaUpdate; + } + + public AbstractEngineConfiguration setUseLockForDatabaseSchemaUpdate(boolean useLockForDatabaseSchemaUpdate) { + this.useLockForDatabaseSchemaUpdate = useLockForDatabaseSchemaUpdate; + return this; + } + + public boolean isEnableEventDispatcher() { + return enableEventDispatcher; + } + + public AbstractEngineConfiguration setEnableEventDispatcher(boolean enableEventDispatcher) { + this.enableEventDispatcher = enableEventDispatcher; + return this; + } + + public FlowableEventDispatcher getEventDispatcher() { + return eventDispatcher; + } + + public AbstractEngineConfiguration setEventDispatcher(FlowableEventDispatcher eventDispatcher) { + this.eventDispatcher = eventDispatcher; + return this; + } + + public List getEventListeners() { + return eventListeners; + } + + public AbstractEngineConfiguration setEventListeners(List eventListeners) { + this.eventListeners = eventListeners; + return this; + } + + public Map> getTypedEventListeners() { + return typedEventListeners; + } + + public AbstractEngineConfiguration setTypedEventListeners( + Map> typedEventListeners) { + this.typedEventListeners = typedEventListeners; + return this; + } + + public List getAdditionalEventDispatchActions() { + return additionalEventDispatchActions; + } + + public AbstractEngineConfiguration setAdditionalEventDispatchActions( + List additionalEventDispatchActions) { + this.additionalEventDispatchActions = additionalEventDispatchActions; + return this; + } + + public void initEventDispatcher() { + if (this.eventDispatcher == null) { + this.eventDispatcher = new FlowableEventDispatcherImpl(); + } + + initAdditionalEventDispatchActions(); + + this.eventDispatcher.setEnabled(enableEventDispatcher); + + initEventListeners(); + initTypedEventListeners(); + } + + protected void initEventListeners() { + if (eventListeners != null) { + for (FlowableEventListener listenerToAdd : eventListeners) { + this.eventDispatcher.addEventListener(listenerToAdd); + } + } + } + + protected void initAdditionalEventDispatchActions() { + if (this.additionalEventDispatchActions == null) { + this.additionalEventDispatchActions = new ArrayList<>(); + } + } + + protected void initTypedEventListeners() { + if (typedEventListeners != null) { + for (Map.Entry> listenersToAdd : typedEventListeners.entrySet()) { + // Extract types from the given string + FlowableEngineEventType[] types = FlowableEngineEventType.getTypesFromString(listenersToAdd.getKey()); + + for (FlowableEventListener listenerToAdd : listenersToAdd.getValue()) { + this.eventDispatcher.addEventListener(listenerToAdd, types); + } + } + } + } + + public boolean isLoggingSessionEnabled() { + return loggingListener != null; + } + + public LoggingListener getLoggingListener() { + return loggingListener; + } + + public void setLoggingListener(LoggingListener loggingListener) { + this.loggingListener = loggingListener; + } + + public Clock getClock() { + return clock; + } + + public AbstractEngineConfiguration setClock(Clock clock) { + this.clock = clock; + return this; + } + + public ObjectMapper getObjectMapper() { + return objectMapper; + } + + public AbstractEngineConfiguration setObjectMapper(ObjectMapper objectMapper) { + this.objectMapper = objectMapper; + return this; + } + + public int getMaxLengthString() { + if (maxLengthStringVariableType == -1) { + if ("oracle".equalsIgnoreCase(databaseType)) { + return DEFAULT_ORACLE_MAX_LENGTH_STRING; + } + else { + return DEFAULT_GENERIC_MAX_LENGTH_STRING; + } + } + else { + return maxLengthStringVariableType; + } + } + + public int getMaxLengthStringVariableType() { + return maxLengthStringVariableType; + } + + public AbstractEngineConfiguration setMaxLengthStringVariableType(int maxLengthStringVariableType) { + this.maxLengthStringVariableType = maxLengthStringVariableType; + return this; + } + + public PropertyDataManager getPropertyDataManager() { + return propertyDataManager; + } + + public Duration getLockPollRate() { + return lockPollRate; + } + + public AbstractEngineConfiguration setLockPollRate(Duration lockPollRate) { + this.lockPollRate = lockPollRate; + return this; + } + + public Duration getSchemaLockWaitTime() { + return schemaLockWaitTime; + } + + public void setSchemaLockWaitTime(Duration schemaLockWaitTime) { + this.schemaLockWaitTime = schemaLockWaitTime; + } + + public AbstractEngineConfiguration setPropertyDataManager(PropertyDataManager propertyDataManager) { + this.propertyDataManager = propertyDataManager; + return this; + } + + public PropertyEntityManager getPropertyEntityManager() { + return propertyEntityManager; + } + + public AbstractEngineConfiguration setPropertyEntityManager(PropertyEntityManager propertyEntityManager) { + this.propertyEntityManager = propertyEntityManager; + return this; + } + + public ByteArrayDataManager getByteArrayDataManager() { + return byteArrayDataManager; + } + + public AbstractEngineConfiguration setByteArrayDataManager(ByteArrayDataManager byteArrayDataManager) { + this.byteArrayDataManager = byteArrayDataManager; + return this; + } + + public ByteArrayEntityManager getByteArrayEntityManager() { + return byteArrayEntityManager; + } + + public AbstractEngineConfiguration setByteArrayEntityManager(ByteArrayEntityManager byteArrayEntityManager) { + this.byteArrayEntityManager = byteArrayEntityManager; + return this; + } + + public TableDataManager getTableDataManager() { + return tableDataManager; + } + + public AbstractEngineConfiguration setTableDataManager(TableDataManager tableDataManager) { + this.tableDataManager = tableDataManager; + return this; + } + + public List getDeployers() { + return deployers; + } + + public AbstractEngineConfiguration setDeployers(List deployers) { + this.deployers = deployers; + return this; + } + + public List getCustomPreDeployers() { + return customPreDeployers; + } + + public AbstractEngineConfiguration setCustomPreDeployers(List customPreDeployers) { + this.customPreDeployers = customPreDeployers; + return this; + } + + public List getCustomPostDeployers() { + return customPostDeployers; + } + + public AbstractEngineConfiguration setCustomPostDeployers(List customPostDeployers) { + this.customPostDeployers = customPostDeployers; + return this; + } + + public boolean isEnableConfiguratorServiceLoader() { + return enableConfiguratorServiceLoader; + } + + public AbstractEngineConfiguration setEnableConfiguratorServiceLoader(boolean enableConfiguratorServiceLoader) { + this.enableConfiguratorServiceLoader = enableConfiguratorServiceLoader; + return this; + } + + public List getConfigurators() { + return configurators; + } + + public AbstractEngineConfiguration addConfigurator(EngineConfigurator configurator) { + if (configurators == null) { + configurators = new ArrayList<>(); + } + configurators.add(configurator); + return this; + } + + /** + * @return All {@link EngineConfigurator} instances. Will only contain values after + * init of the engine. Use the {@link #getConfigurators()} or + * {@link #addConfigurator(EngineConfigurator)} methods otherwise. + */ + public List getAllConfigurators() { + return allConfigurators; + } + + public AbstractEngineConfiguration setConfigurators(List configurators) { + this.configurators = configurators; + return this; + } + + public EngineConfigurator getIdmEngineConfigurator() { + return idmEngineConfigurator; + } + + public AbstractEngineConfiguration setIdmEngineConfigurator(EngineConfigurator idmEngineConfigurator) { + this.idmEngineConfigurator = idmEngineConfigurator; + return this; + } + + public EngineConfigurator getEventRegistryConfigurator() { + return eventRegistryConfigurator; + } + + public AbstractEngineConfiguration setEventRegistryConfigurator(EngineConfigurator eventRegistryConfigurator) { + this.eventRegistryConfigurator = eventRegistryConfigurator; + return this; + } + + public AbstractEngineConfiguration setForceCloseMybatisConnectionPool(boolean forceCloseMybatisConnectionPool) { + this.forceCloseMybatisConnectionPool = forceCloseMybatisConnectionPool; + return this; + } + + public boolean isForceCloseMybatisConnectionPool() { + return forceCloseMybatisConnectionPool; + } + +} diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/resources/application.yml b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/resources/application.yml new file mode 100644 index 0000000..eb59891 --- /dev/null +++ b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/resources/application.yml @@ -0,0 +1,18 @@ +server: + port: 9020 + +spring: + application: + name: @artifactId@ + cloud: + nacos: + username: @nacos.username@ + password: @nacos.password@ + discovery: + server-addr: ${NACOS_HOST:pigx-register}:${NACOS_PORT:8848} + config: + server-addr: ${spring.cloud.nacos.discovery.server-addr} + config: + import: + - optional:nacos:application-@profiles.active@.yml + - optional:nacos:${spring.application.name}-@profiles.active@.yml diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/resources/logback-spring.xml b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..7b165fe --- /dev/null +++ b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/resources/logback-spring.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + + + + + + ${log.path}/debug.log + + ${log.path}/%d{yyyy-MM, aux}/debug.%d{yyyy-MM-dd}.%i.log.gz + 50MB + 30 + + + %date [%thread] %-5level [%logger{50}] %file:%line - %msg%n + + + + + + ${log.path}/error.log + + ${log.path}/%d{yyyy-MM}/error.%d{yyyy-MM-dd}.%i.log.gz + 50MB + 30 + + + %date [%thread] %-5level [%logger{50}] %file:%line - %msg%n + + + ERROR + + + + + + + + + + + + + + + + + diff --git a/pigx-flow/pigx-flow-engine/pom.xml b/pigx-flow/pigx-flow-engine/pom.xml new file mode 100644 index 0000000..6da9c3e --- /dev/null +++ b/pigx-flow/pigx-flow-engine/pom.xml @@ -0,0 +1,22 @@ + + + + 4.0.0 + + + com.pig4cloud + pigx-flow + 5.2.0 + + + pigx-flow-engine + pom + flowable 工作流核心引擎 + + + + pigx-flow-engine-api + pigx-flow-engine-biz + + diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/pom.xml b/pigx-flow/pigx-flow-task/pigx-flow-task-api/pom.xml new file mode 100644 index 0000000..8cb5827 --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-api/pom.xml @@ -0,0 +1,37 @@ + + + 4.0.0 + + com.pig4cloud + pigx-flow-task + 5.2.0 + + + pigx-flow-task-api + + + + + com.pig4cloud + pigx-common-core + + + + com.baomidou + mybatis-plus-extension + + + + com.pig4cloud + pigx-common-feign + + + + com.pig4cloud + pigx-common-excel + + + diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/api/feign/RemoteFlowEngineService.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/api/feign/RemoteFlowEngineService.java new file mode 100644 index 0000000..91613c2 --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/api/feign/RemoteFlowEngineService.java @@ -0,0 +1,127 @@ +package com.pig4cloud.pigx.flow.task.api.feign; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.pig4cloud.pigx.common.core.constant.ServiceNameConstants; +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.flow.task.dto.*; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; + +import java.util.Map; + +/** + * @author lengleng + * @date 2023/7/14 + */ +@FeignClient(contextId = "remoteFlowEngineService", value = ServiceNameConstants.FLOW_ENGINE_SERVER) +public interface RemoteFlowEngineService { + + /** + * 查询任务变量 + * @param variableQueryParamDto 变量查询参数 + * @return 任务变量结果 + */ + @PostMapping("/task/queryTaskVariables") + R> queryTaskVariables(@RequestBody VariableQueryParamDto variableQueryParamDto); + + /** + * 查询简单数据 + * @param userId 用户ID + * @return 索引页统计数据 + */ + @GetMapping("/process-instance/querySimpleData") + R querySimpleData(@RequestParam("userId") Long userId); + + /** + * 创建流程 + * @param map 流程JSON对象 + * @return 创建流程结果 + */ + @PostMapping("/flow/create") + R createFlow(@RequestBody Map map); + + /** + * 启动流程实例 + * @param processInstanceParamDto 流程实例参数 + * @return 启动流程结果 + */ + @PostMapping("/flow/start") + R startProcess(@RequestBody ProcessInstanceParamDto processInstanceParamDto); + + /** + * 查询待办任务 + * @param paramDto 任务查询参数 + * @return 待办任务列表 + */ + @PostMapping("/flow/queryAssignTask") + R> queryAssignTask(@RequestBody TaskQueryParamDto paramDto); + + /** + * 查询已完成任务 + * @param paramDto 任务查询参数 + * @return 已完成任务列表 + */ + @PostMapping("/flow/queryCompletedTask") + R> queryCompletedTask(@RequestBody TaskQueryParamDto paramDto); + + /** + * 完成任务 + * @param taskParamDto 任务参数 + * @return 完成任务结果 + */ + @PostMapping("/task/complete") + R completeTask(@RequestBody TaskParamDto taskParamDto); + + /** + * 设置任务负责人 + * @param taskParamDto 任务参数 + * @return 设置负责人结果 + */ + @PostMapping("/task/setAssignee") + R setAssignee(@RequestBody TaskParamDto taskParamDto); + + /** + * 停止流程实例 + * @param taskParamDto 任务参数 + * @return 停止流程实例结果 + */ + @PostMapping("/flow/stopProcessInstance") + R stopProcessInstance(@RequestBody TaskParamDto taskParamDto); + + /** + * 解决任务 + * @param taskParamDto 任务参数 + * @return 解决任务结果 + */ + @PostMapping("/task/resolveTask") + R resolveTask(@RequestBody TaskParamDto taskParamDto); + + /** + * 退回任务 + * @param taskParamDto 任务参数 + * @return 退回任务结果 + */ + @PostMapping("/task/back") + R back(@RequestBody TaskParamDto taskParamDto); + + /** + * 委派任务 + * @param taskParamDto 任务参数 + * @return 委派任务结果 + */ + @PostMapping("/task/delegateTask") + R delegateTask(@RequestBody TaskParamDto taskParamDto); + + /** + * 查询任务 + * @param taskId 任务ID + * @param userId 用户ID + * @return 任务查询结果 + */ + @GetMapping("/task/engine/queryTask") + R queryTask(@RequestParam("taskId") String taskId, @RequestParam("userId") Long userId); + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/api/feign/RemoteFlowTaskService.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/api/feign/RemoteFlowTaskService.java new file mode 100644 index 0000000..3c7ee34 --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/api/feign/RemoteFlowTaskService.java @@ -0,0 +1,107 @@ +package com.pig4cloud.pigx.flow.task.api.feign; + +import com.pig4cloud.pigx.common.core.constant.ServiceNameConstants; +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.flow.task.dto.*; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; + +import java.util.List; + +/** + * @author lengleng + * @date 2023/7/14 + */ +@FeignClient(contextId = "remoteFlowTaskService", value = ServiceNameConstants.FLOW_TASK_SERVER) +public interface RemoteFlowTaskService { + + /** + * 节点开始事件 + * @param nodeRecordParamDto + */ + @PostMapping("/remote/startNodeEvent") + void startNodeEvent(@RequestBody ProcessNodeRecordParamDto nodeRecordParamDto); + + /** + * 节点结束事件 + * @param nodeRecordParamDto + */ + @PostMapping("/remote/endNodeEvent") + void endNodeEvent(@RequestBody ProcessNodeRecordParamDto nodeRecordParamDto); + + /** + * 流程结束事件 + * @param processInstanceParamDto + */ + @PostMapping("/remote/endProcess") + void endProcessEvent(@RequestBody ProcessInstanceParamDto processInstanceParamDto); + + /** + * 创建流程事件 + * @param processInstanceRecordParamDto + */ + @PostMapping("/remote/createProcessEvent") + void createProcessEvent(@RequestBody ProcessInstanceRecordParamDto processInstanceRecordParamDto); + + /** + * 根据角色id集合查询用户id集合 + * @param roleIdList + */ + @PostMapping("/remote/queryUserIdListByRoleIdList") + R> queryUserIdListByRoleIdList(@RequestBody List roleIdList); + + /** + * 根据部门id集合查询所有的用户id集合 + * @param deptIdList + */ + @PostMapping("/remote/queryUserIdListByDepIdList") + R> queryUserIdListByDepIdList(@RequestBody List deptIdList); + + /** + * 查询流程管理员 + * @param flowId 流程id + */ + @GetMapping("/remote/queryProcessAdmin") + R queryProcessAdmin(@RequestParam("flowId") String flowId); + + /** + * 查询节点数据 + * @param flowId 流程id + * @param nodeId 节点id + * @return + */ + @GetMapping("/processNodeData/getNodeData") + R queryNodeOriData(@RequestParam("flowId") String flowId, @RequestParam("nodeId") String nodeId); + + /** + * 节点开始指派用户了 + * @param processNodeRecordAssignUserParamDto + */ + @PostMapping("/remote/startAssignUser") + R startAssignUser(@RequestBody ProcessNodeRecordAssignUserParamDto processNodeRecordAssignUserParamDto); + + /** + * 任务结束事件 + * @param processNodeRecordAssignUserParamDto + */ + @PostMapping("/remote/taskEndEvent") + R taskEndEvent(@RequestBody ProcessNodeRecordAssignUserParamDto processNodeRecordAssignUserParamDto); + + /** + * 保存抄送数据 + * @param processCopyDto + */ + @PostMapping("/remote/savecc") + R saveCC(@RequestBody ProcessCopyDto processCopyDto); + + /** + * 保存节点原始数据 + * @param processNodeDataDto + */ + @PostMapping("/processNodeData/saveNodeData") + R saveNodeOriData(@RequestBody ProcessNodeDataDto processNodeDataDto); + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/api/feign/packge-info.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/api/feign/packge-info.java new file mode 100644 index 0000000..c01c166 --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/api/feign/packge-info.java @@ -0,0 +1,6 @@ +/* + @author pigx archetype + *

+ * feign client 存放目录,注意 @EnablePigxFeignClients 的扫描范围 + */ +package com.pig4cloud.pigx.flow.task.api.feign; \ No newline at end of file diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/constant/CaptchaTypeEnum.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/constant/CaptchaTypeEnum.java new file mode 100644 index 0000000..6f95f89 --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/constant/CaptchaTypeEnum.java @@ -0,0 +1,28 @@ +package com.pig4cloud.pigx.flow.task.constant; + +/** + * EasyCaptcha 验证码类型枚举 + * + * @author haoxr + * @since 2023/03/24 + */ +public enum CaptchaTypeEnum { + + /** + * 算数 + */ + ARITHMETIC, + /** + * 中文 + */ + CHINESE, + /** + * 中文闪图 + */ + CHINESE_GIF, + /** + * 闪图 + */ + GIF, SPEC + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/constant/FormTypeEnum.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/constant/FormTypeEnum.java new file mode 100644 index 0000000..2d2f68b --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/constant/FormTypeEnum.java @@ -0,0 +1,30 @@ +package com.pig4cloud.pigx.flow.task.constant; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.ArrayList; + +/** + * 表单类型枚举 + */ +@Getter +@AllArgsConstructor +public enum FormTypeEnum { + + INPUT("Input", "单行文本", ""), TEXTAREA("Textarea", "多行文本", ""), NUMBER("Number", "数字", null), + DATE("Date", "日期", null), DATE_TIME("DateTime", "日期时间", null), + + SEQUENCE("Sequence", "发号器", null), LAYOUT("Layout", "明细", null), TIME("Time", "时间", null), + MONEY("Money", "金额", null), SINGLE_SELECT("SingleSelect", "单选", new ArrayList<>()), + SELECT_DEPT("SelectDept", "部门", new ArrayList<>()), SELECT_USER("SelectUser", "用户", new ArrayList<>()), + + ; + + private String type; + + private String name; + + private Object defaultValue; + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/constant/IBaseEnum.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/constant/IBaseEnum.java new file mode 100644 index 0000000..2233b26 --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/constant/IBaseEnum.java @@ -0,0 +1,74 @@ +package com.pig4cloud.pigx.flow.task.constant; + +import cn.hutool.core.util.ObjectUtil; + +import java.util.EnumSet; +import java.util.Objects; + +/** + * 枚举通用接口 + * + * @author haoxr + * @since 2022/3/27 12:06 + */ +public interface IBaseEnum { + + T getValue(); + + String getLabel(); + + /** + * 根据值获取枚举 + * @param value + * @param clazz + * @param 枚举 + * @return + */ + static & IBaseEnum> E getEnumByValue(Object value, Class clazz) { + Objects.requireNonNull(value); + EnumSet allEnums = EnumSet.allOf(clazz); // 获取类型下的所有枚举 + E matchEnum = allEnums.stream().filter(e -> ObjectUtil.equal(e.getValue(), value)).findFirst().orElse(null); + return matchEnum; + } + + /** + * 根据文本标签获取值 + * @param value + * @param clazz + * @param + * @return + */ + static & IBaseEnum> String getLabelByValue(Object value, Class clazz) { + Objects.requireNonNull(value); + EnumSet allEnums = EnumSet.allOf(clazz); // 获取类型下的所有枚举 + E matchEnum = allEnums.stream().filter(e -> ObjectUtil.equal(e.getValue(), value)).findFirst().orElse(null); + + String label = null; + if (matchEnum != null) { + label = matchEnum.getLabel(); + } + return label; + } + + /** + * 根据文本标签获取值 + * @param label + * @param clazz + * @param + * @return + */ + static & IBaseEnum> Object getValueByLabel(String label, Class clazz) { + Objects.requireNonNull(label); + EnumSet allEnums = EnumSet.allOf(clazz); // 获取类型下的所有枚举 + String finalLabel = label; + E matchEnum = allEnums.stream().filter(e -> ObjectUtil.equal(e.getLabel(), finalLabel)).findFirst() + .orElse(null); + + Object value = null; + if (matchEnum != null) { + value = matchEnum.getValue(); + } + return value; + } + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/constant/MenuTypeEnum.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/constant/MenuTypeEnum.java new file mode 100644 index 0000000..5ded24e --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/constant/MenuTypeEnum.java @@ -0,0 +1,30 @@ +package com.pig4cloud.pigx.flow.task.constant; + +import com.baomidou.mybatisplus.annotation.EnumValue; +import lombok.Getter; + +/** + * 菜单类型枚举 + * + * @author haoxr + * @since 2022/4/23 9:36 + */ + +public enum MenuTypeEnum implements IBaseEnum { + + NULL(0, null), MENU(1, "菜单"), CATALOG(2, "目录"), EXTLINK(3, "外链"), BUTTON(4, "按钮"); + + @Getter + @EnumValue // Mybatis-Plus 提供注解表示插入数据库时插入该值 + private Integer value; + + @Getter + // @JsonValue // 表示对枚举序列化时返回此字段 + private String label; + + MenuTypeEnum(Integer value, String label) { + this.value = value; + this.label = label; + } + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/constant/NodeStatusEnum.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/constant/NodeStatusEnum.java new file mode 100644 index 0000000..1a86538 --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/constant/NodeStatusEnum.java @@ -0,0 +1,16 @@ +package com.pig4cloud.pigx.flow.task.constant; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum NodeStatusEnum { + + WKS(0, "未开始"), JXZ(1, "进行中"), YJS(2, "已结束"),; + + private int code; + + private String name; + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/constant/NodeTypeEnum.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/constant/NodeTypeEnum.java new file mode 100644 index 0000000..9e3164d --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/constant/NodeTypeEnum.java @@ -0,0 +1,37 @@ +package com.pig4cloud.pigx.flow.task.constant; + +import lombok.Getter; + +import java.util.Arrays; + +/** + * 节点枚举 + */ +@Getter +public enum NodeTypeEnum { + + ROOT("根节点", 0, false), END("结束节点", -1, false), + + APPROVAL("审批节点", 1, false), CC("抄送节点", 2, false), EXCLUSIVE_GATEWAY("条件分支", 4, true), + + PARALLEL_GATEWAY("并行分支", 5, true), EMPTY("空", 3, false), + + ; + + public static NodeTypeEnum getByValue(int value) { + return Arrays.stream(NodeTypeEnum.values()).filter(w -> w.getValue() == value).findAny().orElse(null); + } + + NodeTypeEnum(String name, Integer value, Boolean branch) { + this.name = name; + this.value = value; + this.branch = branch; + } + + private String name; + + private Integer value; + + private Boolean branch; + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/constant/NodeUserTypeEnum.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/constant/NodeUserTypeEnum.java new file mode 100644 index 0000000..4ae0e2c --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/constant/NodeUserTypeEnum.java @@ -0,0 +1,19 @@ +package com.pig4cloud.pigx.flow.task.constant; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 用户节点类型枚举 + */ +@Getter +@AllArgsConstructor +public enum NodeUserTypeEnum { + + USER("user", "用户"), DEPT("dept", "部门"), ROLE("role", "角色"),; + + private String key; + + private String name; + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/constant/ProcessInstanceConstant.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/constant/ProcessInstanceConstant.java new file mode 100644 index 0000000..057fb98 --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/constant/ProcessInstanceConstant.java @@ -0,0 +1,95 @@ +package com.pig4cloud.pigx.flow.task.constant; + +public class ProcessInstanceConstant { + + /** + * 空执行人 + */ + public static final Long DEFAULT_EMPTY_ASSIGN = -99999999L; + + /** + * 用户任务没有执行人的情况下如何处理 自动通过 + */ + public static final String USER_TASK_NOBODY_HANDLER_TO_PASS = "TO_PASS"; + + /** + * 转交给管理员 + */ + public static final String USER_TASK_NOBODY_HANDLER_TO_ADMIN = "TO_ADMIN"; + + /** + * 指定人员 + */ + public static final String USER_TASK_NOBODY_HANDLER_TO_USER = "TO_USER"; + + /** + * 结束流程 + */ + public static final String USER_TASK_NOBODY_HANDLER_TO_END = "TO_END"; + + public static final String USER_TASK_NOBODY_HANDLER_TO_REFUSE = "TO_REFUSE"; + + /** + * 拒绝之后 结束流程 + */ + public static final String USER_TASK_REFUSE_TYPE_TO_END = "TO_END"; + + /** + * 拒绝之后 到某个节点 + */ + public static final String USER_TASK_REFUSE_TYPE_TO_NODE = "TO_NODE"; + + /** + * 会签 + */ + public static final int MULTIPLE_MODE_AL_SAME = 1; + + /** + * 或签 + */ + public static final int MULTIPLE_MODE_ONE = 2; + + /** + * 顺签 + */ + public static final int MULTIPLE_MODE_ALL_SORT = 3; + + public static class AssignedTypeClass { + + // 指定用户 + public static final int USER = 1; + + // 指定主管 + public static final int LEADER = 2; + + // 发起人自己 + public static final int SELF = 5; + + // 表单人员 + public static final int FORM_USER = 8; + + // 发起人自选 + public static final int SELF_SELECT = 4; + + // 角色 + public static final int ROLE = 3; + + } + + /** + * 表单权限 + */ + public static class FormPermClass { + + // 隐藏 + public static final String HIDE = "H"; + + // 只读 + public static final String READ = "R"; + + // 编辑 + public static final String EDIT = "E"; + + } + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/constant/StatusEnum.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/constant/StatusEnum.java new file mode 100644 index 0000000..92c6edd --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/constant/StatusEnum.java @@ -0,0 +1,26 @@ +package com.pig4cloud.pigx.flow.task.constant; + +import lombok.Getter; + +/** + * 状态枚举 + * + * @author haoxr + * @since 2022/10/14 + */ +public enum StatusEnum implements IBaseEnum { + + ENABLE(1, "启用"), DISABLE(0, "禁用"); + + @Getter + private Integer value; + + @Getter + private String label; + + StatusEnum(Integer value, String label) { + this.value = value; + this.label = label; + } + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/constant/SystemConstants.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/constant/SystemConstants.java new file mode 100644 index 0000000..bb5a78b --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/constant/SystemConstants.java @@ -0,0 +1,26 @@ +package com.pig4cloud.pigx.flow.task.constant; + +/** + * 系统常量 + * + * @author haoxr + * @since 2022/10/22 + */ +public interface SystemConstants { + + /** + * 根节点ID + */ + Long ROOT_NODE_ID = 0L; + + /** + * 系统默认密码 + */ + String DEFAULT_PASSWORD = "123456"; + + /** + * 超级管理员角色编码 + */ + String ROOT_ROLE_CODE = "ROOT"; + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/constant/packge-info.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/constant/packge-info.java new file mode 100644 index 0000000..069ca51 --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/constant/packge-info.java @@ -0,0 +1,6 @@ +/* + * @author pigx archetype + *

+ * 常量和枚举定义 + */ +package com.pig4cloud.pigx.flow.task.constant; \ No newline at end of file diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/CheckChildDto.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/CheckChildDto.java new file mode 100644 index 0000000..cf54a1e --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/CheckChildDto.java @@ -0,0 +1,23 @@ +package com.pig4cloud.pigx.flow.task.dto; + +import lombok.Data; + +import java.util.List; + +/** + * 检查子部门DTO + */ +@Data +public class CheckChildDto { + + /** + * 子部门ID + */ + private Long childId; + + /** + * 父部门ID列表 + */ + private List deptIdList; + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/CheckParentDto.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/CheckParentDto.java new file mode 100644 index 0000000..da3e6ec --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/CheckParentDto.java @@ -0,0 +1,18 @@ +package com.pig4cloud.pigx.flow.task.dto; + +import lombok.Data; + +import java.util.List; + +/** + * 检查是否是给定的父级 + * + */ +@Data +public class CheckParentDto { + + private Long parentId; + + private List deptIdList; + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/Condition.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/Condition.java new file mode 100644 index 0000000..913fb2d --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/Condition.java @@ -0,0 +1,31 @@ +package com.pig4cloud.pigx.flow.task.dto; + +import lombok.Data; + +/** + * 条件类 + */ +@Data +public class Condition { + + /** + * 条件键 + */ + private String key; + + /** + * 表达式 + */ + private String expression; + + /** + * 值 + */ + private Object value; + + /** + * 键类型 + */ + private String keyType; + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/GroupCondition.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/GroupCondition.java new file mode 100644 index 0000000..c1ca622 --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/GroupCondition.java @@ -0,0 +1,23 @@ +package com.pig4cloud.pigx.flow.task.dto; + +import lombok.Data; + +import java.util.List; + +/** + * 分组条件类 + */ +@Data +public class GroupCondition { + + /** + * 是否并行 + */ + private Boolean mode; + + /** + * 条件列表 + */ + private List conditionList; + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/IndexPageStatistics.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/IndexPageStatistics.java new file mode 100644 index 0000000..c081e85 --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/IndexPageStatistics.java @@ -0,0 +1,37 @@ +package com.pig4cloud.pigx.flow.task.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 首页统计数据 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class IndexPageStatistics { + + /** + * 待办数量 + */ + private Long pendingNum; + + /** + * 发起数量 + */ + private Long startedNum; + + /** + * 抄送任务 + */ + private Long copyNum; + + /** + * 完成数量 + */ + private Long completedNum; + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/Nobody.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/Nobody.java new file mode 100644 index 0000000..1520f65 --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/Nobody.java @@ -0,0 +1,14 @@ +package com.pig4cloud.pigx.flow.task.dto; + +import lombok.Data; + +import java.util.List; + +@Data +public class Nobody { + + private String handler; + + private List assignedUser; + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/Node.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/Node.java new file mode 100644 index 0000000..0f0e63d --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/Node.java @@ -0,0 +1,58 @@ +package com.pig4cloud.pigx.flow.task.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +import java.util.List; +import java.util.Map; + +@Data +public class Node { + + private String id; + + private String parentId; + + private String headId; + + private String tailId; + + private String placeHolder; + + private Integer type; + + @JsonProperty(value = "nodeName") + private String name; + + private Boolean error; + + @JsonProperty("childNode") + private Node children; + + private Integer assignedType; + + private Boolean multiple; + + private Integer multipleMode; + + private Integer deptLeaderLevel; + + private String formUserId; + + private String formUserName; + + private List nodeUserList; + + private List conditionNodes; + + private Map formPerms; + + private Nobody nobody; + + private Boolean groupMode; + + private List conditionList; + + private Refuse refuse; + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/NodeHttpResultVO.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/NodeHttpResultVO.java new file mode 100644 index 0000000..f3067a9 --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/NodeHttpResultVO.java @@ -0,0 +1,17 @@ +package com.pig4cloud.pigx.flow.task.dto; + +import lombok.Data; + +import java.util.Map; + +/** + * 节点处理http请求结果对象 + */ +@Data +public class NodeHttpResultVO { + + private Boolean ok; + + private Map data; + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/NodeUser.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/NodeUser.java new file mode 100644 index 0000000..50ccd99 --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/NodeUser.java @@ -0,0 +1,39 @@ +package com.pig4cloud.pigx.flow.task.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 节点用户对象 + */ +@NoArgsConstructor +@Data +@Builder +@AllArgsConstructor +public class NodeUser { + + /** + * 用户od + */ + private Long id; + + /** + * 用户名称 + */ + private String name; + + /** + * 类型 + */ + private String type; + + /** + * 选择 + */ + private Boolean selected; + + private String avatar; + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/ProcessCopyDto.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/ProcessCopyDto.java new file mode 100644 index 0000000..47a7cfe --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/ProcessCopyDto.java @@ -0,0 +1,50 @@ +package com.pig4cloud.pigx.flow.task.dto; + +import lombok.Data; + +import java.time.LocalDateTime; + +@Data +public class ProcessCopyDto { + + /** + * 当前节点时间 + */ + private LocalDateTime nodeTime; + + /** + * 发起人 + */ + private Long startUserId; + + /** + * 流程id + */ + private String flowId; + + /** + * 实例id + */ + private String processInstanceId; + + /** + * 节点id + */ + private String nodeId; + + /** + * 节点 名称 + */ + private String nodeName; + + /** + * 表单数据 + */ + private String formData; + + /** + * 抄送人id + */ + private Long userId; + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/ProcessInstanceParamDto.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/ProcessInstanceParamDto.java new file mode 100644 index 0000000..a6342e9 --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/ProcessInstanceParamDto.java @@ -0,0 +1,34 @@ +package com.pig4cloud.pigx.flow.task.dto; + +import lombok.Data; + +import java.util.HashMap; +import java.util.Map; + +/** + * 流程实例参数对象 + */ +@Data +public class ProcessInstanceParamDto { + + /** + * 流程id + */ + private String flowId; + + /** + * 参数集合 + */ + private Map paramMap = new HashMap<>(); + + /** + * 发起人 + */ + private String startUserId; + + /** + * 实例id + */ + private String processInstanceId; + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/ProcessInstanceRecordParamDto.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/ProcessInstanceRecordParamDto.java new file mode 100644 index 0000000..990d942 --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/ProcessInstanceRecordParamDto.java @@ -0,0 +1,40 @@ +package com.pig4cloud.pigx.flow.task.dto; + +import lombok.Getter; +import lombok.Setter; + +/** + *

+ * 流程记录 + *

+ * + * @author Vincent + * @since 2023-05-07 + */ +@Getter +@Setter +public class ProcessInstanceRecordParamDto { + + /** + * 用户id + */ + private Long userId; + + /** + * 流程id + */ + private String flowId; + + /** + * 流程实例id + */ + private String processInstanceId; + + private String parentProcessInstanceId; + + /** + * 表单数据 + */ + private String formData; + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/ProcessNodeDataDto.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/ProcessNodeDataDto.java new file mode 100644 index 0000000..4571592 --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/ProcessNodeDataDto.java @@ -0,0 +1,14 @@ +package com.pig4cloud.pigx.flow.task.dto; + +import lombok.Data; + +@Data +public class ProcessNodeDataDto { + + private String flowId; + + private String nodeId; + + private String data; + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/ProcessNodeRecordAssignUserParamDto.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/ProcessNodeRecordAssignUserParamDto.java new file mode 100644 index 0000000..87270cb --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/ProcessNodeRecordAssignUserParamDto.java @@ -0,0 +1,66 @@ +package com.pig4cloud.pigx.flow.task.dto; + +import lombok.Data; + +/** + * 流程节点记录-执行人 + */ +@Data +public class ProcessNodeRecordAssignUserParamDto { + + /** + * 流程id (process id) + */ + private String flowId; + + /** + * 流程实例id (process instance id) + */ + private String processInstanceId; + + /** + * 表单数据 (form data) + */ + private String data; + + /** + * 本地数据 (local data) + */ + private String localData; + + /** + * 节点id (node id) + */ + private String nodeId; + + /** + * 用户id (user id) + */ + private Long userId; + + /** + * 执行id (execution id) + */ + private String executionId; + + /** + * 任务id (task id) + */ + private String taskId; + + /** + * 审批描述 (approval description) + */ + private String approveDesc; + + /** + * 节点名称 (node name) + */ + private String nodeName; + + /** + * 任务类型 (task type) + */ + private String taskType; + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/ProcessNodeRecordParamDto.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/ProcessNodeRecordParamDto.java new file mode 100644 index 0000000..259e485 --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/ProcessNodeRecordParamDto.java @@ -0,0 +1,61 @@ +package com.pig4cloud.pigx.flow.task.dto; + +import lombok.Data; + +/** + * 流程节点记录 + */ +@Data +public class ProcessNodeRecordParamDto { + + /** + * 流程id (process id) + */ + private String flowId; + + /** + * 流程实例id (process instance id) + */ + private String processInstanceId; + + /** + * 表单数据 (form data) + */ + private String data; + + /** + * 节点id (node id) + */ + private String nodeId; + + /** + * 节点类型 (node type) + */ + private String nodeType; + + /** + * 节点名字 (node name) + */ + private String nodeName; + + /** + * 执行id (execution id) + */ + private String executionId; + + /** + * 任务id (task id) + */ + private String taskId; + + /** + * 审批描述 (approval description) + */ + private String approveDesc; + + /** + * 任务类型 (task type) + */ + private String taskType; + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/Refuse.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/Refuse.java new file mode 100644 index 0000000..0efbf60 --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/Refuse.java @@ -0,0 +1,12 @@ +package com.pig4cloud.pigx.flow.task.dto; + +import lombok.Data; + +@Data +public class Refuse { + + private String handler; + + private String nodeId; + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/SelectValue.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/SelectValue.java new file mode 100644 index 0000000..2ced06d --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/SelectValue.java @@ -0,0 +1,17 @@ +package com.pig4cloud.pigx.flow.task.dto; + +import lombok.Data; + +/** + * @author Huijun Zhao + * @description + * @date 2023-07-28 10:36 + */ +@Data +public class SelectValue { + + private String key; + + private String value; + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/TaskDto.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/TaskDto.java new file mode 100644 index 0000000..f6d9bf8 --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/TaskDto.java @@ -0,0 +1,97 @@ +package com.pig4cloud.pigx.flow.task.dto; + +import lombok.Data; + +import java.time.LocalDateTime; +import java.util.Date; +import java.util.Map; + +/** + * 任务对象 + */ +@Data +public class TaskDto { + + /** + * 流程id + */ + private String flowId; + + /** + * 参数集合 + */ + private Map paramMap; + + /** + * 实例id + */ + private String processInstanceId; + + /** + * 执行id + */ + private String executionId; + + /** + * 耗时 + */ + private Long durationInMillis; + + /** + * 任务id + */ + private String taskId; + + /** + * 执行人 + */ + private String assign; + + /** + * 任务名称 + */ + private String taskName; + + /** + * 节点id + */ + private String nodeId; + + /** + * 任务创建时间 + */ + private Date taskCreateTime; + + private Date taskEndTime; + + /** + * 流程组名字 + */ + private String groupName; + + /** + * 发起人id + */ + private Long rootUserId; + + /** + * 发起人名字 + */ + private String rootUserName; + + /** + * 发起人头像 + */ + private String rootUserAvatarUrl; + + /** + * 发起时间 + */ + private LocalDateTime startTime; + + /** + * 流程名称 + */ + private String processName; + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/TaskParamDto.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/TaskParamDto.java new file mode 100644 index 0000000..8ab0a8c --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/TaskParamDto.java @@ -0,0 +1,59 @@ +package com.pig4cloud.pigx.flow.task.dto; + +import lombok.Data; + +import java.util.List; +import java.util.Map; + +/** + * 任务完成参数对象 + * + */ +@Data +public class TaskParamDto { + + private String processInstanceId; + + private List processInstanceIdList; + + /** + * 节点id + */ + private String nodeId; + + /** + * 添加子流程发起人 + */ + private Boolean appendChildProcessRootId; + + /** + * 任务id + */ + private String taskId; + + /** + * 用户id + */ + private String userId; + + /** + * 模板用户id + */ + private String targetUserId; + + /** + * 参数 + */ + private Map paramMap; + + /** + * 任务本地变量 + */ + private Map taskLocalParamMap; + + /** + * 模板节点 + */ + private String targetNodeId; + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/TaskQueryParamDto.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/TaskQueryParamDto.java new file mode 100644 index 0000000..059e112 --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/TaskQueryParamDto.java @@ -0,0 +1,43 @@ +package com.pig4cloud.pigx.flow.task.dto; + +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * 用户任务查询参数 + */ +@Data +public class TaskQueryParamDto { + + /** + * 任务执行人 + */ + private String assign; + + /** + * 页码 + */ + private Integer pageNum; + + /** + * 每页的数量 + */ + private Integer pageSize; + + /** + * 流程名称 + */ + private String processName; + + /** + * 任务时间 + */ + private LocalDateTime[] taskTime; + + /** + * 状态 + */ + private Integer status; + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/TaskResultDto.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/TaskResultDto.java new file mode 100644 index 0000000..02467f6 --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/TaskResultDto.java @@ -0,0 +1,45 @@ +package com.pig4cloud.pigx.flow.task.dto; + +import lombok.Data; + +import java.util.Map; + +/** + * 任务结果对象 + * + */ +@Data +public class TaskResultDto { + + private Boolean currentTask; + + /** + * 流程id + */ + private String flowId; + + private Node taskNode; + + private String nodeId; + + /** + * 实例id + */ + private String processInstanceId; + + /** + * 委派状态 + */ + private String delegationState; + + /** + * 是否允许继续委派 + */ + private Boolean delegate; + + /** + * 所有变量 + */ + private Map variableAll; + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/VariableQueryParamDto.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/VariableQueryParamDto.java new file mode 100644 index 0000000..5d1b144 --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/VariableQueryParamDto.java @@ -0,0 +1,16 @@ +package com.pig4cloud.pigx.flow.task.dto; + +import lombok.Data; + +import java.util.List; + +@Data +public class VariableQueryParamDto { + + private String taskId; + + private List keyList; + + private String executionId; + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/packge-info.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/packge-info.java new file mode 100644 index 0000000..0287bad --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/packge-info.java @@ -0,0 +1,6 @@ +/* + * @author pigx archetype + *

+ * DTO 存放目录 + */ +package com.pig4cloud.pigx.flow.task.dto; \ No newline at end of file diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/entity/Process.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/entity/Process.java new file mode 100644 index 0000000..3983be5 --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/entity/Process.java @@ -0,0 +1,136 @@ +package com.pig4cloud.pigx.flow.task.entity; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.Accessors; + +import java.time.LocalDateTime; + +/** + *

+ * + *

+ * + * @author Vincent + * @since 2023-07-06 + */ +@Getter +@Setter +@Accessors(chain = true) +@TableName("process") +public class Process { + + /** + * 表单ID + */ + @TableField("flow_id") + private String flowId; + + /** + * 表单名称 + */ + @TableField("name") + private String name; + + /** + * 图标配置 + */ + @TableField("logo") + private String logo; + + /** + * 设置项 + */ + @TableField("settings") + private String settings; + + /** + * 分组ID + */ + @TableField("group_id") + private Long groupId; + + /** + * 表单设置内容 + */ + @TableField("form_items") + private String formItems; + + /** + * 流程设置内容 + */ + @TableField("process") + private String process; + + /** + * 备注 + */ + @TableField("remark") + private String remark; + + @TableField("sort") + private Integer sort; + + /** + * 0 正常 1=隐藏 + */ + @TableField("is_hidden") + private Boolean hidden; + + /** + * 0 正常 1=停用 + */ + @TableField("is_stop") + private Boolean stop; + + /** + * 流程管理员 + */ + @TableField("admin_id") + private Long adminId; + + /** + * 唯一性id + */ + @TableField("unique_id") + private String uniqueId; + + /** + * 管理员 + */ + @TableField("admin_list") + private String adminList; + + /** + * 范围描述显示 + */ + @TableField("range_show") + private String rangeShow; + + /** + * 用户id + */ + @TableId(value = "id", type = IdType.ASSIGN_ID) + private Long id; + + /** + * 逻辑删除字段 + */ + @TableLogic + @TableField(fill = FieldFill.INSERT) + private String delFlag; + + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** + * 更新时间 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + private LocalDateTime updateTime; + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/entity/ProcessCopy.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/entity/ProcessCopy.java new file mode 100644 index 0000000..9baa515 --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/entity/ProcessCopy.java @@ -0,0 +1,121 @@ +package com.pig4cloud.pigx.flow.task.entity; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.Accessors; + +import java.time.LocalDateTime; + +/** + *

+ * 流程抄送数据 + *

+ * + * @author Vincent + * @since 2023-07-06 + */ +@Getter +@Setter +@Accessors(chain = true) +@TableName("process_copy") +public class ProcessCopy { + + /** + * 用户id + */ + @TableId(value = "id", type = IdType.ASSIGN_ID) + private Long id; + + /** + * 流程发起时间 + */ + @TableField("start_time") + private LocalDateTime startTime; + + /** + * 当前节点时间 + */ + @TableField("node_time") + private LocalDateTime nodeTime; + + /** + * 发起人 + */ + @TableField("start_user_id") + private Long startUserId; + + /** + * 流程id + */ + @TableField("flow_id") + private String flowId; + + /** + * 实例id + */ + @TableField("process_instance_id") + private String processInstanceId; + + /** + * 节点id + */ + @TableField("node_id") + private String nodeId; + + /** + * 分组id + */ + @TableField("group_id") + private Long groupId; + + /** + * 分组名称 + */ + @TableField("group_name") + private String groupName; + + /** + * 流程名称 + */ + @TableField("process_name") + private String processName; + + /** + * 节点 名称 + */ + @TableField("node_name") + private String nodeName; + + /** + * 表单数据 + */ + @TableField("form_data") + private String formData; + + /** + * 抄送人id + */ + @TableField("user_id") + private Long userId; + + /** + * 逻辑删除字段 + */ + @TableLogic + @TableField(fill = FieldFill.INSERT) + private String delFlag; + + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** + * 更新时间 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + private LocalDateTime updateTime; + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/entity/ProcessGroup.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/entity/ProcessGroup.java new file mode 100644 index 0000000..13bb30f --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/entity/ProcessGroup.java @@ -0,0 +1,61 @@ +package com.pig4cloud.pigx.flow.task.entity; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.Accessors; + +import java.time.LocalDateTime; + +/** + *

+ * + *

+ * + * @author Vincent + * @since 2023-07-06 + */ +@Getter +@Setter +@Accessors(chain = true) +@TableName("process_group") +public class ProcessGroup { + + /** + * 分组名 + */ + @TableField("group_name") + private String groupName; + + /** + * 排序 + */ + @TableField("sort") + private Integer sort; + + /** + * 用户id + */ + @TableId(value = "id", type = IdType.ASSIGN_ID) + private Long id; + + /** + * 逻辑删除字段 + */ + @TableLogic + @TableField(fill = FieldFill.INSERT) + private String delFlag; + + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** + * 更新时间 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + private LocalDateTime updateTime; + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/entity/ProcessInstanceRecord.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/entity/ProcessInstanceRecord.java new file mode 100644 index 0000000..6f21d23 --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/entity/ProcessInstanceRecord.java @@ -0,0 +1,116 @@ +package com.pig4cloud.pigx.flow.task.entity; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.Accessors; + +import java.time.LocalDateTime; +import java.util.Date; + +/** + *

+ * 流程记录 + *

+ * + * @author Vincent + * @since 2023-07-06 + */ +@Getter +@Setter +@Accessors(chain = true) +@TableName("process_instance_record") +public class ProcessInstanceRecord { + + /** + * 流程名字 + */ + @TableField("name") + private String name; + + /** + * 头像 + */ + @TableField("logo") + private String logo; + + /** + * 用户id + */ + @TableField("user_id") + private Long userId; + + /** + * 流程id + */ + @TableField("flow_id") + private String flowId; + + /** + * 流程实例id + */ + @TableField("process_instance_id") + private String processInstanceId; + + /** + * 表单数据 + */ + @TableField("form_data") + private String formData; + + /** + * 组id + */ + @TableField("group_id") + private Long groupId; + + /** + * 组名称 + */ + @TableField("group_name") + private String groupName; + + /** + * 状态 + */ + @TableField("status") + private Integer status; + + /** + * 结束时间 + */ + @TableField("end_time") + private Date endTime; + + /** + * 上级流程实例id + */ + @TableField("parent_process_instance_id") + private String parentProcessInstanceId; + + /** + * 用户id + */ + @TableId(value = "id", type = IdType.ASSIGN_ID) + private Long id; + + /** + * 逻辑删除字段 + */ + @TableLogic + @TableField(fill = FieldFill.INSERT) + private String delFlag; + + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** + * 更新时间 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + private LocalDateTime updateTime; + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/entity/ProcessNodeData.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/entity/ProcessNodeData.java new file mode 100644 index 0000000..8c3f0e4 --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/entity/ProcessNodeData.java @@ -0,0 +1,64 @@ +package com.pig4cloud.pigx.flow.task.entity; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.Accessors; + +import java.time.LocalDateTime; + +/** + *

+ * 流程节点数据 + *

+ * + * @author Vincent + * @since 2023-07-06 + */ +@Getter +@Setter +@Accessors(chain = true) +@TableName("process_node_data") +public class ProcessNodeData { + + /** + * 流程id + */ + @TableField("flow_id") + private String flowId; + + /** + * 表单数据 + */ + @TableField("data") + private String data; + + @TableField("node_id") + private String nodeId; + + /** + * 用户id + */ + @TableId(value = "id", type = IdType.ASSIGN_ID) + private Long id; + + /** + * 逻辑删除字段 + */ + @TableLogic + @TableField(fill = FieldFill.INSERT) + private String delFlag; + + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** + * 更新时间 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + private LocalDateTime updateTime; + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/entity/ProcessNodeRecord.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/entity/ProcessNodeRecord.java new file mode 100644 index 0000000..1007408 --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/entity/ProcessNodeRecord.java @@ -0,0 +1,107 @@ +package com.pig4cloud.pigx.flow.task.entity; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.Accessors; + +import java.time.LocalDateTime; +import java.util.Date; + +/** + *

+ * 流程节点记录 + *

+ * + * @author Vincent + * @since 2023-07-06 + */ +@Getter +@Setter +@Accessors(chain = true) +@TableName("process_node_record") +public class ProcessNodeRecord { + + /** + * 流程id + */ + @TableField("flow_id") + private String flowId; + + /** + * 流程实例id + */ + @TableField("process_instance_id") + private String processInstanceId; + + /** + * 表单数据 + */ + @TableField("data") + private String data; + + @TableField("node_id") + private String nodeId; + + /** + * 节点类型 + */ + @TableField("node_type") + private String nodeType; + + /** + * 节点名字 + */ + @TableField("node_name") + private String nodeName; + + /** + * 节点状态 + */ + @TableField("status") + private Integer status; + + /** + * 开始时间 + */ + @TableField("start_time") + private Date startTime; + + /** + * 结束时间 + */ + @TableField("end_time") + private Date endTime; + + /** + * 执行id + */ + @TableField("execution_id") + private String executionId; + + /** + * 用户id + */ + @TableId(value = "id", type = IdType.ASSIGN_ID) + private Long id; + + /** + * 逻辑删除字段 + */ + @TableLogic + @TableField(fill = FieldFill.INSERT) + private String delFlag; + + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** + * 更新时间 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + private LocalDateTime updateTime; + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/entity/ProcessNodeRecordAssignUser.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/entity/ProcessNodeRecordAssignUser.java new file mode 100644 index 0000000..96ab2e1 --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/entity/ProcessNodeRecordAssignUser.java @@ -0,0 +1,130 @@ +package com.pig4cloud.pigx.flow.task.entity; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.Accessors; + +import java.time.LocalDateTime; + +/** + *

+ * 流程节点记录-执行人 + *

+ * + * @author Vincent + * @since 2023-07-06 + */ +@Getter +@Setter +@Accessors(chain = true) +@TableName("process_node_record_assign_user") +public class ProcessNodeRecordAssignUser { + + /** + * 流程id + */ + @TableField("flow_id") + private String flowId; + + /** + * 流程实例id + */ + @TableField("process_instance_id") + private String processInstanceId; + + /** + * 表单数据 + */ + @TableField("data") + private String data; + + @TableField("node_id") + private String nodeId; + + /** + * 用户id + */ + @TableField("user_id") + private String userId; + + /** + * 节点状态 + */ + @TableField("status") + private Integer status; + + /** + * 开始时间 + */ + @TableField("start_time") + private LocalDateTime startTime; + + /** + * 结束时间 + */ + @TableField("end_time") + private LocalDateTime endTime; + + /** + * 执行id + */ + @TableField("execution_id") + private String executionId; + + /** + * 任务id + */ + @TableField("task_id") + private String taskId; + + /** + * 审批意见 + */ + @TableField("approve_desc") + private String approveDesc; + + /** + * 节点名称 + */ + @TableField("node_name") + private String nodeName; + + /** + * 任务类型 + */ + @TableField("task_type") + private String taskType; + + /** + * 表单本地数据 + */ + @TableField("local_data") + private String localData; + + /** + * 用户id + */ + @TableId(value = "id", type = IdType.ASSIGN_ID) + private Long id; + + /** + * 逻辑删除字段 + */ + @TableLogic + @TableField(fill = FieldFill.INSERT) + private String delFlag; + + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** + * 更新时间 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + private LocalDateTime updateTime; + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/entity/ProcessStarter.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/entity/ProcessStarter.java new file mode 100644 index 0000000..fad7f73 --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/entity/ProcessStarter.java @@ -0,0 +1,67 @@ +package com.pig4cloud.pigx.flow.task.entity; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.Accessors; + +import java.time.LocalDateTime; + +/** + *

+ * 流程发起人 + *

+ * + * @author Vincent + * @since 2023-07-06 + */ +@Getter +@Setter +@Accessors(chain = true) +@TableName("process_starter") +public class ProcessStarter { + + /** + * 用户id或者部门id + */ + @TableField("type_id") + private Long typeId; + + /** + * 类型 user dept + */ + @TableField("type") + private String type; + + /** + * 流程id + */ + @TableField("process_id") + private Long processId; + + /** + * 用户id + */ + @TableId(value = "id", type = IdType.ASSIGN_ID) + private Long id; + + /** + * 逻辑删除字段 + */ + @TableLogic + @TableField(fill = FieldFill.INSERT) + private String delFlag; + + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** + * 更新时间 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + private LocalDateTime updateTime; + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/entity/packge-info.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/entity/packge-info.java new file mode 100644 index 0000000..766af77 --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/entity/packge-info.java @@ -0,0 +1,6 @@ +/* + * @author pigx archetype + *

+ * 实体 存放目录 + */ +package com.pig4cloud.pigx.flow.task.entity; \ No newline at end of file diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/utils/NodeUtil.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/utils/NodeUtil.java new file mode 100644 index 0000000..91da0ae --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/utils/NodeUtil.java @@ -0,0 +1,82 @@ +package com.pig4cloud.pigx.flow.task.utils; + +import cn.hutool.core.util.StrUtil; +import com.pig4cloud.pigx.flow.task.constant.NodeTypeEnum; +import com.pig4cloud.pigx.flow.task.constant.ProcessInstanceConstant; +import com.pig4cloud.pigx.flow.task.dto.Node; + +import java.util.ArrayList; +import java.util.List; + +public class NodeUtil { + + public static String getFlowId(String processDefinitionId) { + return StrUtil.subBefore(processDefinitionId, ":", false); + } + + public static boolean isNode(Node childNode) { + return childNode != null && StrUtil.isNotBlank(childNode.getId()); + } + + /** + * 添加结束节点 + * @param node + */ + public static void addEndNode(Node node) { + + Node children = node.getChildren(); + if (isNode(children)) { + addEndNode(children); + } + else { + Node end = new Node(); + end.setId("end"); + end.setType(NodeTypeEnum.END.getValue()); + end.setName("结束节点"); + end.setParentId(node.getId()); + node.setChildren(end); + } + + } + + /** + * 需要发起人选择用户的节点 + * @param node + */ + public static List selectUserNodeId(Node node) { + List list = new ArrayList<>(); + + if (!isNode(node)) { + return list; + } + + Integer type = node.getType(); + + if (type == NodeTypeEnum.APPROVAL.getValue().intValue()) { + + Integer assignedType = node.getAssignedType(); + + boolean selfSelect = assignedType == ProcessInstanceConstant.AssignedTypeClass.SELF_SELECT; + if (selfSelect) { + list.add(node.getId()); + } + } + + if (type == NodeTypeEnum.EXCLUSIVE_GATEWAY.getValue().intValue() + || type == NodeTypeEnum.PARALLEL_GATEWAY.getValue().intValue()) { + + // 条件分支 + List branchs = node.getConditionNodes(); + for (Node branch : branchs) { + Node children = branch.getChildren(); + List strings = selectUserNodeId(children); + list.addAll(strings); + } + } + + List next = selectUserNodeId(node.getChildren()); + list.addAll(next); + return list; + } + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/vo/ErrorRspVo.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/vo/ErrorRspVo.java new file mode 100644 index 0000000..e27aa7b --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/vo/ErrorRspVo.java @@ -0,0 +1,20 @@ +package com.pig4cloud.pigx.flow.task.vo; + +import lombok.AllArgsConstructor; +import lombok.Data; + +/** + * @author : willian fu + * @date : 2022/7/4 + */ +@Data +@AllArgsConstructor +public class ErrorRspVo { + + private Integer code; + + private String msg; + + private String desp; + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/vo/FormGroupVo.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/vo/FormGroupVo.java new file mode 100644 index 0000000..a100fa1 --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/vo/FormGroupVo.java @@ -0,0 +1,57 @@ +package com.pig4cloud.pigx.flow.task.vo; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; +import java.util.List; + +/** + * @author : willian fu + * @date : 2020/9/21 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class FormGroupVo { + + private Long id; + + /** + * 流程名字 + */ + private String name; + + /** + * 流程 + */ + private List items; + + @Data + @Builder + @AllArgsConstructor + public static class FlowVo { + + private String flowId; + + /** + * 发起范围 + */ + private String rangeShow; + + private String name; + + private String logo; + + private Boolean stop; + + private String remark; + + private LocalDateTime updated; + + } + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/vo/FormItemVO.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/vo/FormItemVO.java new file mode 100644 index 0000000..b2e1792 --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/vo/FormItemVO.java @@ -0,0 +1,59 @@ +package com.pig4cloud.pigx.flow.task.vo; + +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 表单 + */ +@Data +@NoArgsConstructor +public class FormItemVO { + + private String id; + + private String perm; + + private String icon; + + private String name; + + private String type; + + private Boolean required; + + private String typeName; + + private String placeholder; + + private Props props; + + @Data + @NoArgsConstructor + public static class Props { + + private Object value; + + private Object dictValue; + + private Object options; + + private Boolean self; + + private Boolean multi; + + private Object oriForm; + + private Object maxLength; + + private Object minLength; + + private Object regex; + + private Object regexDesc; + + private String prefix; + + } + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/vo/NodeFormatParamVo.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/vo/NodeFormatParamVo.java new file mode 100644 index 0000000..d4e85b0 --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/vo/NodeFormatParamVo.java @@ -0,0 +1,18 @@ +package com.pig4cloud.pigx.flow.task.vo; + +import lombok.Data; + +import java.util.Map; + +@Data +public class NodeFormatParamVo { + + private String flowId; + + private String processInstanceId; + + private String taskId; + + private Map paramMap; + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/vo/NodeVo.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/vo/NodeVo.java new file mode 100644 index 0000000..a6ccbfb --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/vo/NodeVo.java @@ -0,0 +1,63 @@ +package com.pig4cloud.pigx.flow.task.vo; + +import lombok.Data; + +import java.util.List; + +/** + * 流程节点显示对象 + */ +@Data +public class NodeVo { + + /** + * nodeId + */ + private String id; + + /** + * 用户列表 + */ + private List userVoList; + + /** + * 显示 + */ + private String placeholder; + + /** + * 状态 1进行中2已完成 + */ + private Integer status; + + /** + * 节点名称 + */ + private String name; + + /** + * 节点类型 + */ + private Object type; + + /** + * 发起人选择用户 + */ + private Boolean selectUser; + + /** + * 是否多选 + */ + private Boolean multiple; + + /** + * 子级列表 + */ + private List children; + + /** + * 分支列表 + */ + private List branch; + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/vo/OrgTreeVo.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/vo/OrgTreeVo.java new file mode 100644 index 0000000..5c07f34 --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/vo/OrgTreeVo.java @@ -0,0 +1,42 @@ +package com.pig4cloud.pigx.flow.task.vo; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author : willian fu + * @version : 1.0 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class OrgTreeVo { + + /** + * 用户od + */ + private Long id; + + /** + * 用户名称 + */ + private String name; + + /** + * 类型 + */ + private String type; + + /** + * 选择 + */ + private Boolean selected; + + private String avatar; + + private Integer status = 1; + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/vo/ProcessCopyVo.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/vo/ProcessCopyVo.java new file mode 100644 index 0000000..1661909 --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/vo/ProcessCopyVo.java @@ -0,0 +1,11 @@ +package com.pig4cloud.pigx.flow.task.vo; + +import com.pig4cloud.pigx.flow.task.entity.ProcessCopy; +import lombok.Data; + +@Data +public class ProcessCopyVo extends ProcessCopy { + + private String startUserName; + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/vo/ProcessVO.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/vo/ProcessVO.java new file mode 100644 index 0000000..fb2c71e --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/vo/ProcessVO.java @@ -0,0 +1,19 @@ +package com.pig4cloud.pigx.flow.task.vo; + +import com.pig4cloud.pigx.flow.task.entity.Process; +import lombok.Data; + +import java.util.List; +import java.util.Map; + +@Data +public class ProcessVO extends Process { + + /** + * 需要发起人选择的节点id + */ + private List selectUserNodeId; + + private Map variableMap; + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/vo/UserVo.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/vo/UserVo.java new file mode 100644 index 0000000..ee52277 --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/vo/UserVo.java @@ -0,0 +1,42 @@ +package com.pig4cloud.pigx.flow.task.vo; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class UserVo { + + /** + * 用户od + */ + private Long id; + + /** + * 用户名称 + */ + private String name; + + private LocalDateTime showTime; + + private String avatar; + + /** + * 意见 + */ + private String approveDesc; + + private String operType; + + /** + * 状态 1进行中2已完成 + */ + private Integer status = 0; + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/resources/META-INF/spring/org.springframework.cloud.openfeign.FeignClient.imports b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/resources/META-INF/spring/org.springframework.cloud.openfeign.FeignClient.imports new file mode 100644 index 0000000..ade8cda --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/resources/META-INF/spring/org.springframework.cloud.openfeign.FeignClient.imports @@ -0,0 +1,2 @@ +com.pig4cloud.pigx.flow.task.api.feign.RemoteFlowTaskService +com.pig4cloud.pigx.flow.task.api.feign.RemoteFlowEngineService diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/Dockerfile b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/Dockerfile new file mode 100644 index 0000000..a0c70ff --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/Dockerfile @@ -0,0 +1,18 @@ +FROM pig4cloud/java:8-jre + +MAINTAINER wangiegie@gmail.com + +ENV TZ=Asia/Shanghai +ENV JAVA_OPTS="-Xms512m -Xmx1024m -Djava.security.egd=file:/dev/./urandom" + +RUN ln -sf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone + +RUN mkdir -p /pigx-flow-task + +WORKDIR /pigx-flow-task + +EXPOSE 9030 + +ADD ./target/pigx-flow-task-biz.jar ./ + +CMD sleep 60;java $JAVA_OPTS -jar pigx-flow-task-biz.jar diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/pom.xml b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/pom.xml new file mode 100644 index 0000000..31b51aa --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/pom.xml @@ -0,0 +1,118 @@ + + + 4.0.0 + + com.pig4cloud + pigx-flow-task + 5.2.0 + + + pigx-flow-task-biz + + + + + org.springframework.boot + spring-boot-starter-undertow + + + + org.springframework.boot + spring-boot-starter-web + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-config + + + + com.pig4cloud + pigx-common-data + + + + com.pig4cloud + pigx-common-sequence + + + + com.pig4cloud + pigx-common-security + + + + com.pig4cloud + pigx-common-xss + + + + com.pig4cloud + pigx-common-sentinel + + + + com.pig4cloud + pigx-common-feign + + + + com.pig4cloud + pigx-flow-task-api + + + + com.pig4cloud + pigx-common-log + + + + com.baomidou + mybatis-plus-boot-starter + + + + com.alibaba + druid-spring-boot-starter + + + + com.mysql + mysql-connector-j + + + + com.pig4cloud + pigx-common-swagger + + + + org.springframework.boot + spring-boot-starter-test + + + com.dameng + DmJdbcDriver18 + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + io.fabric8 + docker-maven-plugin + + + + diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/PigxFlowTaskApplication.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/PigxFlowTaskApplication.java new file mode 100644 index 0000000..5edd300 --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/PigxFlowTaskApplication.java @@ -0,0 +1,26 @@ +package com.pig4cloud.pigx.flow.task; + +import com.pig4cloud.pigx.common.feign.annotation.EnablePigxFeignClients; +import com.pig4cloud.pigx.common.security.annotation.EnablePigxResourceServer; +import com.pig4cloud.pigx.common.swagger.annotation.EnableOpenApi; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.client.discovery.EnableDiscoveryClient; + +/** + * @author pigx archetype + *

+ * 项目启动类 + */ +@EnableOpenApi("task") +@EnablePigxFeignClients +@EnableDiscoveryClient +@EnablePigxResourceServer +@SpringBootApplication +public class PigxFlowTaskApplication { + + public static void main(String[] args) { + SpringApplication.run(PigxFlowTaskApplication.class, args); + } + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/config/SequenceConfiguration.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/config/SequenceConfiguration.java new file mode 100644 index 0000000..7c1b3d3 --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/config/SequenceConfiguration.java @@ -0,0 +1,36 @@ +package com.pig4cloud.pigx.flow.task.config; + +import cn.hutool.core.date.DateUtil; +import com.pig4cloud.pigx.common.data.tenant.TenantContextHolder; +import com.pig4cloud.pigx.common.sequence.builder.DbSeqBuilder; +import com.pig4cloud.pigx.common.sequence.properties.SequenceDbProperties; +import com.pig4cloud.pigx.common.sequence.sequence.Sequence; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import javax.sql.DataSource; + +/** + * @author lengleng + * @date 2023-07-19 + *

+ * 设置发号器生成规则 + */ +@Configuration +public class SequenceConfiguration { + + /** + * 工作流发号器 + * @param dataSource + * @param properties + * @return + */ + @Bean + public Sequence flowSequence(DataSource dataSource, SequenceDbProperties properties) { + return DbSeqBuilder.create() + .bizName(() -> String.format("flow_%s_%s", TenantContextHolder.getTenantId(), DateUtil.today())) + .dataSource(dataSource).step(properties.getStep()).retryTimes(properties.getRetryTimes()) + .tableName(properties.getTableName()).build(); + } + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/controller/CombinationGroupController.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/controller/CombinationGroupController.java new file mode 100644 index 0000000..220dcb1 --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/controller/CombinationGroupController.java @@ -0,0 +1,39 @@ +package com.pig4cloud.pigx.flow.task.controller; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.flow.task.service.ICombinationGroupService; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 组聚合接口控制器 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/combination/group") +public class CombinationGroupController { + + private final ICombinationGroupService combinationGroupService; + + /** + * 查询表单组包含流程 + * @return 表单组数据 + */ + @GetMapping("listGroupWithProcess") + public R listGroupWithProcess(Page page, Long groupId) { + return combinationGroupService.listGroupWithProcess(page, groupId); + } + + /** + * 查询所有我可以发起的表单组 + * @return + */ + @GetMapping("listCurrentUserStartGroup") + public R listCurrentUserStartGroup() { + return combinationGroupService.listCurrentUserStartGroup(); + } + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/controller/OrgController.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/controller/OrgController.java new file mode 100644 index 0000000..45835f7 --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/controller/OrgController.java @@ -0,0 +1,44 @@ +package com.pig4cloud.pigx.flow.task.controller; + +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.flow.task.service.IOrgService; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +/** + * @author : willian fu + * @date : 2022/6/27 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/org") +public class OrgController { + + private final IOrgService orgService; + + /** + * 查询组织架构树 + * @param deptId 部门id + * @param showLeave 是否显示离职员工 + * @return 组织架构树数据 + */ + @GetMapping("tree") + public R getOrgTreeData(@RequestParam(defaultValue = "0") Long deptId, String type, + @RequestParam(defaultValue = "false") Boolean showLeave) { + return orgService.getOrgTreeData(deptId, type, showLeave); + } + + /** + * 模糊搜索用户 + * @param userName 用户名/拼音/首字母 + * @return 匹配到的用户 + */ + @GetMapping("tree/user/search") + public R getOrgTreeUser(@RequestParam String userName) { + return orgService.getOrgTreeUser(userName.trim()); + } + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/controller/ProcessController.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/controller/ProcessController.java new file mode 100644 index 0000000..ee11edc --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/controller/ProcessController.java @@ -0,0 +1,49 @@ +package com.pig4cloud.pigx.flow.task.controller; + +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.flow.task.entity.Process; +import com.pig4cloud.pigx.flow.task.service.IProcessService; +import com.pig4cloud.pigx.flow.task.vo.ProcessVO; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/process") +public class ProcessController { + + private final IProcessService processService; + + /** + * 获取详细数据 + * @param flowId + * @return + */ + @GetMapping("getDetail") + public R getDetail(String flowId) { + return processService.getDetail(flowId); + } + + /** + * 创建流程 + * @param process + * @return + */ + @PostMapping("create") + public R create(@RequestBody Process process) { + return processService.create(process); + } + + /** + * 编辑表单 + * @param flowId 摸板ID + * @param type 类型 stop using delete + * @return 操作结果 + */ + @PutMapping("update/{flowId}") + public R update(@PathVariable String flowId, @RequestParam String type, + @RequestParam(required = false) Long groupId) { + return processService.update(flowId, type, groupId); + } + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/controller/ProcessCopyController.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/controller/ProcessCopyController.java new file mode 100644 index 0000000..218f360 --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/controller/ProcessCopyController.java @@ -0,0 +1,35 @@ +package com.pig4cloud.pigx.flow.task.controller; + +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.flow.task.service.IProcessCopyService; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + *

+ * 流程抄送数据 前端控制器 + *

+ * + * @author Vincent + * @since 2023-05-20 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/processCopy") +public class ProcessCopyController { + + private final IProcessCopyService processCopyService; + + /** + * 查询单个抄送详细信息 + * @param id + * @return + */ + @GetMapping("querySingleDetail") + public R querySingleDetail(long id) { + return processCopyService.querySingleDetail(id); + } + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/controller/ProcessGroupController.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/controller/ProcessGroupController.java new file mode 100644 index 0000000..0323255 --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/controller/ProcessGroupController.java @@ -0,0 +1,47 @@ +package com.pig4cloud.pigx.flow.task.controller; + +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.flow.task.entity.ProcessGroup; +import com.pig4cloud.pigx.flow.task.service.IProcessGroupService; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequiredArgsConstructor +@RequestMapping("processGroup") +public class ProcessGroupController { + + private final IProcessGroupService processGroupService; + + /** + * 组列表 + * @return + */ + @GetMapping("list") + public R> queryList() { + return processGroupService.queryList(); + } + + /** + * 新增流程分组 + * @param processGroup 分组名 + * @return 添加结果 + */ + @PostMapping("create") + public R create(@RequestBody ProcessGroup processGroup) { + return processGroupService.create(processGroup); + } + + /** + * 删除分组 + * @param id + * @return + */ + @DeleteMapping("delete/{id}") + public R delete(@PathVariable long id) { + return processGroupService.delete(id); + } + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/controller/ProcessInstanceController.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/controller/ProcessInstanceController.java new file mode 100644 index 0000000..a99396a --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/controller/ProcessInstanceController.java @@ -0,0 +1,97 @@ +package com.pig4cloud.pigx.flow.task.controller; + +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.flow.task.dto.ProcessInstanceParamDto; +import com.pig4cloud.pigx.flow.task.dto.TaskQueryParamDto; +import com.pig4cloud.pigx.flow.task.service.IProcessInstanceService; +import com.pig4cloud.pigx.flow.task.vo.NodeFormatParamVo; +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; +import org.springframework.web.bind.annotation.*; + +/** + * 流程实例 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/process-instance") +public class ProcessInstanceController { + + private final IProcessInstanceService processInstanceService; + + /** + * 启动流程 + * @param processInstanceParamDto + * @return + */ + @SneakyThrows + @PostMapping("startProcessInstance") + public R startProcessInstance(@RequestBody ProcessInstanceParamDto processInstanceParamDto) { + return processInstanceService.startProcessInstance(processInstanceParamDto); + } + + /** + * 查询当前登录用户的待办任务 + * @param pageDto + * @return + */ + @SneakyThrows + @PostMapping("queryMineTask") + public R queryMineTask(@RequestBody TaskQueryParamDto queryParamDto) { + return processInstanceService.queryMineTask(queryParamDto); + } + + /** + * 查询当前登录用户已办任务 + * @param taskQueryParamDto + * @return + */ + @SneakyThrows + @PostMapping("queryMineEndTask") + public R queryMineEndTask(@RequestBody TaskQueryParamDto taskQueryParamDto) { + return processInstanceService.queryMineEndTask(taskQueryParamDto); + } + + /** + * 查询我发起的 + * @param pageDto + * @return + */ + @SneakyThrows + @PostMapping("queryMineStarted") + public R queryMineStarted(@RequestBody TaskQueryParamDto taskQueryParamDto) { + return processInstanceService.queryMineStarted(taskQueryParamDto); + } + + /** + * 查询抄送我的 + * @param pageDto + * @return + */ + @SneakyThrows + @PostMapping("queryMineCC") + public R queryMineCC(@RequestBody TaskQueryParamDto taskQueryParamDto) { + return processInstanceService.queryMineCC(taskQueryParamDto); + } + + /** + * 格式化流程显示 + * @param nodeFormatParamVo + * @return + */ + @PostMapping("formatStartNodeShow") + public R formatStartNodeShow(@RequestBody NodeFormatParamVo nodeFormatParamVo) { + return processInstanceService.formatStartNodeShow(nodeFormatParamVo); + } + + /** + * 流程详情 + * @param processInstanceId + * @return + */ + @GetMapping("detail") + public R detail(String processInstanceId) { + return processInstanceService.detail(processInstanceId); + } + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/controller/ProcessNodeDataController.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/controller/ProcessNodeDataController.java new file mode 100644 index 0000000..2469185 --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/controller/ProcessNodeDataController.java @@ -0,0 +1,46 @@ +package com.pig4cloud.pigx.flow.task.controller; + +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.flow.task.dto.Node; +import com.pig4cloud.pigx.flow.task.dto.ProcessNodeDataDto; +import com.pig4cloud.pigx.flow.task.service.IProcessNodeDataService; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; + +/** + *

+ * 流程节点数据 前端控制器 + *

+ * + * @author Vincent + * @since 2023-05-07 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/processNodeData") +public class ProcessNodeDataController { + + private final IProcessNodeDataService processNodeDataService; + + /** + * 保存节点数据 + * @param processNodeDataDto + * @return + */ + @PostMapping("saveNodeData") + public R saveNodeData(@RequestBody ProcessNodeDataDto processNodeDataDto) { + return processNodeDataService.saveNodeData(processNodeDataDto); + } + + /** + * 获取节点数据 + * @param flowId + * @param nodeId + * @return + */ + @GetMapping("getNodeData") + public R getNodeData(String flowId, String nodeId) { + return processNodeDataService.getNodeData(flowId, nodeId); + } + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/controller/RemoteController.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/controller/RemoteController.java new file mode 100644 index 0000000..620ab8c --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/controller/RemoteController.java @@ -0,0 +1,152 @@ +package com.pig4cloud.pigx.flow.task.controller; + +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.flow.task.dto.*; +import com.pig4cloud.pigx.flow.task.service.IRemoteService; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Map; + +/** + * 远程请求控制器 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/remote") +public class RemoteController { + + private final IRemoteService remoteService; + + /** + * 根据角色id集合查询用户id集合 + * @param roleIdList + * @return + */ + @PostMapping("queryUserIdListByRoleIdList") + public R> queryUserIdListByRoleIdList(@RequestBody List roleIdList) { + return remoteService.queryUserIdListByRoleIdList(roleIdList); + } + + /** + * 保存抄送 + * @param copyDto + * @return + */ + @PostMapping("savecc") + public R saveCC(@RequestBody ProcessCopyDto copyDto) { + return remoteService.saveCC(copyDto); + } + + /** + * 检查是否是所有的父级 + * @param checkParentDto + * @return + */ + @PostMapping("checkIsAllParent") + public R checkIsAllParent(@RequestBody CheckParentDto checkParentDto) { + return remoteService.checkIsAllParent(checkParentDto); + } + + /** + * 根据部门id集合查询用户id集合 + * @param depIdList + * @return + */ + @PostMapping("queryUserIdListByDepIdList") + public R> queryUserIdListByDepIdList(@RequestBody List depIdList) { + return remoteService.queryUserIdListByDepIdList(depIdList); + } + + /** + * 检查是否是所有的子级 + * @param checkChildDto + * @return + */ + @PostMapping("checkIsAllChild") + public R checkIsAllChild(@RequestBody CheckChildDto checkChildDto) { + return remoteService.checkIsAllChild(checkChildDto); + } + + /** + * 获取用户的信息-包括扩展字段 + * @param userId + * @return + */ + @GetMapping("queryUserAllInfo") + public R> queryUserAllInfo(long userId) { + return remoteService.queryUserAllInfo(userId); + } + + /** + * 开始节点事件 + * @param recordParamDto + * @return + */ + @PostMapping("startNodeEvent") + public R startNodeEvent(@RequestBody ProcessNodeRecordParamDto recordParamDto) { + return remoteService.startNodeEvent(recordParamDto); + } + + /** + * 流程创建了 + * @param processInstanceRecordParamDto + * @return + */ + @PostMapping("createProcessEvent") + public R createProcessEvent(@RequestBody ProcessInstanceRecordParamDto processInstanceRecordParamDto) { + return remoteService.createProcessEvent(processInstanceRecordParamDto); + } + + /** + * 结束节点事件 + * @param recordParamDto + * @return + */ + @PostMapping("endNodeEvent") + public R endNodeEvent(@RequestBody ProcessNodeRecordParamDto recordParamDto) { + return remoteService.endNodeEvent(recordParamDto); + } + + /** + * 开始设置执行人 + * @param processNodeRecordAssignUserParamDto + * @return + */ + @PostMapping("startAssignUser") + public R startAssignUser(@RequestBody ProcessNodeRecordAssignUserParamDto processNodeRecordAssignUserParamDto) { + return remoteService.startAssignUser(processNodeRecordAssignUserParamDto); + } + + /** + * 任务结束事件 + * @param processNodeRecordAssignUserParamDto + * @return + */ + @PostMapping("taskEndEvent") + public R taskEndEvent(@RequestBody ProcessNodeRecordAssignUserParamDto processNodeRecordAssignUserParamDto) { + return remoteService.taskEndEvent(processNodeRecordAssignUserParamDto); + } + + /** + * 实例结束 + * @param processInstanceParamDto + * @return + */ + @PostMapping("endProcess") + public R endProcess(@RequestBody ProcessInstanceParamDto processInstanceParamDto) { + return remoteService.endProcess(processInstanceParamDto.getProcessInstanceId()); + } + + /** + * 查询流程管理员 + * @param flowId + * @return + */ + @GetMapping("queryProcessAdmin") + public R queryProcessAdmin(String flowId) { + return remoteService.queryProcessAdmin(flowId); + } + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/controller/TaskController.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/controller/TaskController.java new file mode 100644 index 0000000..74bd551 --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/controller/TaskController.java @@ -0,0 +1,118 @@ +package com.pig4cloud.pigx.flow.task.controller; + +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.flow.task.dto.TaskParamDto; +import com.pig4cloud.pigx.flow.task.service.ITaskService; +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; +import org.springframework.web.bind.annotation.*; + +/** + * 任务实例 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/task") +public class TaskController { + + private final ITaskService taskService; + + /** + * 查询首页数据看板 + * @return + */ + @SneakyThrows + @GetMapping("queryTaskData") + public R queryTaskData() { + return taskService.queryTaskData(); + } + + /** + * 查询任务 + * @param taskId + * @return + */ + @SneakyThrows + @GetMapping("queryTask") + public R queryTask(String taskId, boolean view) { + + return taskService.queryTask(taskId, view); + + } + + /** + * 完成任务 + * @param completeParamDto + * @return + */ + @SneakyThrows + @PostMapping("completeTask") + public R completeTask(@RequestBody TaskParamDto completeParamDto) { + + return taskService.completeTask(completeParamDto); + + } + + /** + * 前加签 + * @param completeParamDto + * @return + */ + @SneakyThrows + @PostMapping("delegateTask") + public R delegateTask(@RequestBody TaskParamDto completeParamDto) { + + return taskService.delegateTask(completeParamDto); + + } + + /** + * 加签完成任务 + * @param completeParamDto + * @return + */ + @SneakyThrows + @PostMapping("resolveTask") + public R resolveTask(@RequestBody TaskParamDto completeParamDto) { + + return taskService.resolveTask(completeParamDto); + + } + + /** + * 设置执行人 + * @param completeParamDto + * @return + */ + @SneakyThrows + @PostMapping("setAssignee") + public R setAssignee(@RequestBody TaskParamDto completeParamDto) { + + return taskService.setAssignee(completeParamDto); + + } + + /** + * 结束流程 + * @param completeParamDto + * @return + */ + @SneakyThrows + @PostMapping("stopProcessInstance") + public R stopProcessInstance(@RequestBody TaskParamDto completeParamDto) { + + return taskService.stopProcessInstance(completeParamDto); + + } + + /** + * 退回 + * @param taskParamDto + * @return + */ + @PostMapping("back") + public R back(@RequestBody TaskParamDto taskParamDto) { + return taskService.back(taskParamDto); + } + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/mapper/ProcessCopyMapper.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/mapper/ProcessCopyMapper.java new file mode 100644 index 0000000..908f431 --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/mapper/ProcessCopyMapper.java @@ -0,0 +1,18 @@ +package com.pig4cloud.pigx.flow.task.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.pig4cloud.pigx.flow.task.entity.ProcessCopy; +import org.apache.ibatis.annotations.Mapper; + +/** + *

+ * 流程抄送数据 Mapper 接口 + *

+ * + * @author Vincent + * @since 2023-05-20 + */ +@Mapper +public interface ProcessCopyMapper extends BaseMapper { + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/mapper/ProcessGroupMapper.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/mapper/ProcessGroupMapper.java new file mode 100644 index 0000000..35bdd2b --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/mapper/ProcessGroupMapper.java @@ -0,0 +1,18 @@ +package com.pig4cloud.pigx.flow.task.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.pig4cloud.pigx.flow.task.entity.ProcessGroup; +import org.apache.ibatis.annotations.Mapper; + +/** + *

+ * Mapper 接口 + *

+ * + * @author Vincent + * @since 2023-05-25 + */ +@Mapper +public interface ProcessGroupMapper extends BaseMapper { + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/mapper/ProcessInstanceRecordMapper.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/mapper/ProcessInstanceRecordMapper.java new file mode 100644 index 0000000..c7f0014 --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/mapper/ProcessInstanceRecordMapper.java @@ -0,0 +1,18 @@ +package com.pig4cloud.pigx.flow.task.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.pig4cloud.pigx.flow.task.entity.ProcessInstanceRecord; +import org.apache.ibatis.annotations.Mapper; + +/** + *

+ * 流程记录 Mapper 接口 + *

+ * + * @author Vincent + * @since 2023-05-07 + */ +@Mapper +public interface ProcessInstanceRecordMapper extends BaseMapper { + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/mapper/ProcessMapper.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/mapper/ProcessMapper.java new file mode 100644 index 0000000..6af2cd1 --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/mapper/ProcessMapper.java @@ -0,0 +1,18 @@ +package com.pig4cloud.pigx.flow.task.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.pig4cloud.pigx.flow.task.entity.Process; +import org.apache.ibatis.annotations.Mapper; + +/** + *

+ * Mapper 接口 + *

+ * + * @author cxygzl + * @since 2023-05-25 + */ +@Mapper +public interface ProcessMapper extends BaseMapper { + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/mapper/ProcessNodeDataMapper.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/mapper/ProcessNodeDataMapper.java new file mode 100644 index 0000000..9268076 --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/mapper/ProcessNodeDataMapper.java @@ -0,0 +1,18 @@ +package com.pig4cloud.pigx.flow.task.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.pig4cloud.pigx.flow.task.entity.ProcessNodeData; +import org.apache.ibatis.annotations.Mapper; + +/** + *

+ * 流程节点数据 Mapper 接口 + *

+ * + * @author Vincent + * @since 2023-05-07 + */ +@Mapper +public interface ProcessNodeDataMapper extends BaseMapper { + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/mapper/ProcessNodeRecordAssignUserMapper.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/mapper/ProcessNodeRecordAssignUserMapper.java new file mode 100644 index 0000000..bf4540b --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/mapper/ProcessNodeRecordAssignUserMapper.java @@ -0,0 +1,18 @@ +package com.pig4cloud.pigx.flow.task.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.pig4cloud.pigx.flow.task.entity.ProcessNodeRecordAssignUser; +import org.apache.ibatis.annotations.Mapper; + +/** + *

+ * 流程节点记录-执行人 Mapper 接口 + *

+ * + * @author cxygzl + * @since 2023-05-10 + */ +@Mapper +public interface ProcessNodeRecordAssignUserMapper extends BaseMapper { + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/mapper/ProcessNodeRecordMapper.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/mapper/ProcessNodeRecordMapper.java new file mode 100644 index 0000000..75fc11e --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/mapper/ProcessNodeRecordMapper.java @@ -0,0 +1,18 @@ +package com.pig4cloud.pigx.flow.task.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.pig4cloud.pigx.flow.task.entity.ProcessNodeRecord; +import org.apache.ibatis.annotations.Mapper; + +/** + *

+ * 流程节点记录 Mapper 接口 + *

+ * + * @author cxygzl + * @since 2023-05-10 + */ +@Mapper +public interface ProcessNodeRecordMapper extends BaseMapper { + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/mapper/ProcessStarterMapper.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/mapper/ProcessStarterMapper.java new file mode 100644 index 0000000..af113c7 --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/mapper/ProcessStarterMapper.java @@ -0,0 +1,18 @@ +package com.pig4cloud.pigx.flow.task.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.pig4cloud.pigx.flow.task.entity.ProcessStarter; +import org.apache.ibatis.annotations.Mapper; + +/** + *

+ * 流程发起人 Mapper 接口 + *

+ * + * @author Vincent + * @since 2023-05-30 + */ +@Mapper +public interface ProcessStarterMapper extends BaseMapper { + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/ICombinationGroupService.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/ICombinationGroupService.java new file mode 100644 index 0000000..58c0016 --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/ICombinationGroupService.java @@ -0,0 +1,24 @@ +package com.pig4cloud.pigx.flow.task.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.pig4cloud.pigx.common.core.util.R; + +/** + * 聚合接口 + */ +public interface ICombinationGroupService { + + /** + * 查询表单组包含流程 + * @param groupId 表单ID + * @return 表单组数据 + */ + R listGroupWithProcess(Page page, Long groupId); + + /** + * 查询所有我可以发起的表单组 + * @return + */ + R listCurrentUserStartGroup(); + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/IOrgService.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/IOrgService.java new file mode 100644 index 0000000..0d3ffca --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/IOrgService.java @@ -0,0 +1,27 @@ +package com.pig4cloud.pigx.flow.task.service; + +import com.pig4cloud.pigx.common.core.util.R; + +/** + * @author : willian fu + * @version : 1.0 + */ +public interface IOrgService { + + /** + * 查询组织架构树 + * @param deptId 部门id + * @param type 只查询部门架构 + * @param showLeave 是否显示离职员工 + * @return 组织架构树数据 + */ + R getOrgTreeData(Long deptId, String type, Boolean showLeave); + + /** + * 模糊搜索用户 + * @param userName 用户名/拼音/首字母 + * @return 匹配到的用户 + */ + R getOrgTreeUser(String userName); + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/IProcessCopyService.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/IProcessCopyService.java new file mode 100644 index 0000000..9721c42 --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/IProcessCopyService.java @@ -0,0 +1,24 @@ +package com.pig4cloud.pigx.flow.task.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.flow.task.entity.ProcessCopy; + +/** + *

+ * 流程抄送数据 服务类 + *

+ * + * @author Vincent + * @since 2023-05-20 + */ +public interface IProcessCopyService extends IService { + + /** + * 查询单个抄送详细信息 + * @param id + * @return + */ + R querySingleDetail(long id); + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/IProcessGroupService.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/IProcessGroupService.java new file mode 100644 index 0000000..6bb9083 --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/IProcessGroupService.java @@ -0,0 +1,39 @@ +package com.pig4cloud.pigx.flow.task.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.flow.task.entity.ProcessGroup; + +import java.util.List; + +/** + *

+ * 服务类 + *

+ * + * @author Vincent + * @since 2023-05-25 + */ +public interface IProcessGroupService extends IService { + + /** + * 组列表 + * @return + */ + R> queryList(); + + /** + * 新增流程分组 + * @param processGroup 分组名 + * @return 添加结果 + */ + R create(ProcessGroup processGroup); + + /** + * 删除分组 + * @param id + * @return + */ + R delete(long id); + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/IProcessInstanceRecordService.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/IProcessInstanceRecordService.java new file mode 100644 index 0000000..0c97a3b --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/IProcessInstanceRecordService.java @@ -0,0 +1,16 @@ +package com.pig4cloud.pigx.flow.task.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.pig4cloud.pigx.flow.task.entity.ProcessInstanceRecord; + +/** + *

+ * 流程记录 服务类 + *

+ * + * @author Vincent + * @since 2023-05-07 + */ +public interface IProcessInstanceRecordService extends IService { + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/IProcessInstanceService.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/IProcessInstanceService.java new file mode 100644 index 0000000..c57ce7e --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/IProcessInstanceService.java @@ -0,0 +1,69 @@ +package com.pig4cloud.pigx.flow.task.service; + +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.flow.task.dto.ProcessInstanceParamDto; +import com.pig4cloud.pigx.flow.task.dto.TaskQueryParamDto; +import com.pig4cloud.pigx.flow.task.vo.NodeFormatParamVo; + +/** + * 流程实例进程 + */ +public interface IProcessInstanceService { + + /** + * 启动流程 + * @param processInstanceParamDto + * @return + */ + R startProcessInstance(ProcessInstanceParamDto processInstanceParamDto); + + /** + * 查询当前登录用户的待办任务 + * @param taskQueryParamDto taskQueryParamDto + * @return + */ + R queryMineTask(TaskQueryParamDto taskQueryParamDto); + + /** + * 查询已办任务 + * @param taskQueryParamDto + * @return + */ + R queryMineEndTask(TaskQueryParamDto taskQueryParamDto); + + /** + * 流程结束 + * @param processsInstanceId + * @return + */ + R end(String processsInstanceId); + + /** + * 查询我发起的 + * @param taskQueryParamDto + * @return + */ + R queryMineStarted(TaskQueryParamDto taskQueryParamDto); + + /** + * 查询抄送给我的 + * @param taskQueryParamDto + * @return + */ + R queryMineCC(TaskQueryParamDto taskQueryParamDto); + + /** + * 格式化流程显示 + * @param nodeFormatParamVo + * @return + */ + R formatStartNodeShow(NodeFormatParamVo nodeFormatParamVo); + + /** + * 流程详情 + * @param processInstanceId + * @return + */ + R detail(String processInstanceId); + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/IProcessNodeDataService.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/IProcessNodeDataService.java new file mode 100644 index 0000000..7cdd650 --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/IProcessNodeDataService.java @@ -0,0 +1,34 @@ +package com.pig4cloud.pigx.flow.task.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.flow.task.dto.Node; +import com.pig4cloud.pigx.flow.task.dto.ProcessNodeDataDto; +import com.pig4cloud.pigx.flow.task.entity.ProcessNodeData; + +/** + *

+ * 流程节点数据 服务类 + *

+ * + * @author Vincent + * @since 2023-05-07 + */ +public interface IProcessNodeDataService extends IService { + + /** + * 保存流程节点数据 + * @param processNodeDataDto + * @return + */ + R saveNodeData(ProcessNodeDataDto processNodeDataDto); + + /*** + * 获取节点数据 + * @param flowId + * @param nodeId + * @return + */ + R getNodeData(String flowId, String nodeId); + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/IProcessNodeRecordAssignUserService.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/IProcessNodeRecordAssignUserService.java new file mode 100644 index 0000000..53eb1ac --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/IProcessNodeRecordAssignUserService.java @@ -0,0 +1,32 @@ +package com.pig4cloud.pigx.flow.task.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.flow.task.dto.ProcessNodeRecordAssignUserParamDto; +import com.pig4cloud.pigx.flow.task.entity.ProcessNodeRecordAssignUser; + +/** + *

+ * 流程节点记录-执行人 服务类 + *

+ * + * @author cxygzl + * @since 2023-05-10 + */ +public interface IProcessNodeRecordAssignUserService extends IService { + + /** + * 设置执行人 + * @param processNodeRecordAssignUserParamDto + * @return + */ + R addAssignUser(ProcessNodeRecordAssignUserParamDto processNodeRecordAssignUserParamDto); + + /** + * 任务完成通知 + * @param processNodeRecordAssignUserParamDto + * @return + */ + R completeTaskEvent(ProcessNodeRecordAssignUserParamDto processNodeRecordAssignUserParamDto); + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/IProcessNodeRecordService.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/IProcessNodeRecordService.java new file mode 100644 index 0000000..c3229c4 --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/IProcessNodeRecordService.java @@ -0,0 +1,32 @@ +package com.pig4cloud.pigx.flow.task.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.flow.task.dto.ProcessNodeRecordParamDto; +import com.pig4cloud.pigx.flow.task.entity.ProcessNodeRecord; + +/** + *

+ * 流程节点记录 服务类 + *

+ * + * @author cxygzl + * @since 2023-05-10 + */ +public interface IProcessNodeRecordService extends IService { + + /** + * 节点开始 + * @param processNodeRecordParamDto + * @return + */ + R start(ProcessNodeRecordParamDto processNodeRecordParamDto); + + /** + * 节点结束 + * @param processNodeRecordParamDto + * @return + */ + R complete(ProcessNodeRecordParamDto processNodeRecordParamDto); + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/IProcessService.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/IProcessService.java new file mode 100644 index 0000000..da401b6 --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/IProcessService.java @@ -0,0 +1,46 @@ +package com.pig4cloud.pigx.flow.task.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.flow.task.entity.Process; +import com.pig4cloud.pigx.flow.task.vo.ProcessVO; + +/** + *

+ * 服务类 + *

+ * + * @author cxygzl + * @since 2023-05-25 + */ +public interface IProcessService extends IService { + + /** + * 获取详细数据 + * @param flowId + * @return + */ + R getDetail(String flowId); + + Process getByFlowId(String flowId); + + void updateByFlowId(Process process); + + void hide(String flowId); + + /** + * 创建流程 + * @param process + * @return + */ + R create(Process process); + + /** + * 编辑表单 + * @param flowId 摸板ID + * @param type 类型 stop using delete + * @return 操作结果 + */ + R update(String flowId, String type, Long groupId); + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/IProcessStarterService.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/IProcessStarterService.java new file mode 100644 index 0000000..a6bebd9 --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/IProcessStarterService.java @@ -0,0 +1,16 @@ +package com.pig4cloud.pigx.flow.task.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.pig4cloud.pigx.flow.task.entity.ProcessStarter; + +/** + *

+ * 流程发起人 服务类 + *

+ * + * @author Vincent + * @since 2023-05-30 + */ +public interface IProcessStarterService extends IService { + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/IRemoteService.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/IRemoteService.java new file mode 100644 index 0000000..46dd498 --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/IRemoteService.java @@ -0,0 +1,106 @@ + +package com.pig4cloud.pigx.flow.task.service; + +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.flow.task.dto.*; + +import java.util.List; +import java.util.Map; + +/** + * 远程调用的接口 + */ +public interface IRemoteService { + + /** + * 根据角色id集合查询用户id集合 + * @param roleIdList + * @return + */ + R> queryUserIdListByRoleIdList(List roleIdList); + + /** + * 保存抄送 + * @param copyDto + * @return + */ + R saveCC(ProcessCopyDto copyDto); + + /** + * 检查是否是所有的父级 + * @param checkParentDto + * @return + */ + R checkIsAllParent(CheckParentDto checkParentDto); + + /** + * 根据部门id集合查询用户id集合 + * @param depIdList + * @return + */ + R> queryUserIdListByDepIdList(List depIdList); + + /** + * 检查是否是所有的子级 + * @param checkChildDto + * @return + */ + R checkIsAllChild(CheckChildDto checkChildDto); + + /** + * 获取用户的信息-包括扩展字段 + * @param userId + * @return + */ + R> queryUserAllInfo(long userId); + + /** + * 开始节点事件 + * @param recordParamDto + * @return + */ + R startNodeEvent(ProcessNodeRecordParamDto recordParamDto); + + /** + * 流程创建了 + * @param processInstanceRecordParamDto + * @return + */ + R createProcessEvent(ProcessInstanceRecordParamDto processInstanceRecordParamDto); + + /** + * 完成节点事件 + * @param recordParamDto + * @return + */ + R endNodeEvent(ProcessNodeRecordParamDto recordParamDto); + + /** + * 开始设置执行人 + * @param processNodeRecordAssignUserParamDto + * @return + */ + R startAssignUser(ProcessNodeRecordAssignUserParamDto processNodeRecordAssignUserParamDto); + + /** + * 任务结束事件 + * @param processNodeRecordAssignUserParamDto + * @return + */ + R taskEndEvent(ProcessNodeRecordAssignUserParamDto processNodeRecordAssignUserParamDto); + + /** + * 实例结束 + * @param processInstanceId + * @return + */ + R endProcess(String processInstanceId); + + /** + * 查询流程管理员 + * @param flowId + * @return + */ + R queryProcessAdmin(String flowId); + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/ITaskService.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/ITaskService.java new file mode 100644 index 0000000..b84e1d6 --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/ITaskService.java @@ -0,0 +1,67 @@ +package com.pig4cloud.pigx.flow.task.service; + +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.flow.task.dto.TaskParamDto; + +/** + * 任务处理 + */ +public interface ITaskService { + + /** + * 查询任务 + * @param taskId + * @param view + * @return + */ + R queryTask(String taskId, boolean view); + + /** + * 完成任务 + * @param taskParamDto + * @return + */ + R completeTask(TaskParamDto taskParamDto); + + /** + * 前加签 + * @param taskParamDto + * @return + */ + R delegateTask(TaskParamDto taskParamDto); + + /** + * 加签完成任务 + * @param taskParamDto + * @return + */ + R resolveTask(TaskParamDto taskParamDto); + + /** + * 设置执行人 + * @param taskParamDto + * @return + */ + R setAssignee(TaskParamDto taskParamDto); + + /** + * 结束流程 + * @param taskParamDto + * @return + */ + R stopProcessInstance(TaskParamDto taskParamDto); + + /** + * 退回 + * @param taskParamDto + * @return + */ + R back(TaskParamDto taskParamDto); + + /** + * 查询首页数据看板 + * @return + */ + R queryTaskData(); + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/CombinationGroupServiceImpl.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/CombinationGroupServiceImpl.java new file mode 100644 index 0000000..f82c825 --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/CombinationGroupServiceImpl.java @@ -0,0 +1,113 @@ +package com.pig4cloud.pigx.flow.task.service.impl; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.common.security.service.PigxUser; +import com.pig4cloud.pigx.common.security.util.SecurityUtils; +import com.pig4cloud.pigx.flow.task.constant.NodeUserTypeEnum; +import com.pig4cloud.pigx.flow.task.entity.Process; +import com.pig4cloud.pigx.flow.task.entity.ProcessGroup; +import com.pig4cloud.pigx.flow.task.entity.ProcessStarter; +import com.pig4cloud.pigx.flow.task.service.ICombinationGroupService; +import com.pig4cloud.pigx.flow.task.service.IProcessGroupService; +import com.pig4cloud.pigx.flow.task.service.IProcessService; +import com.pig4cloud.pigx.flow.task.service.IProcessStarterService; +import com.pig4cloud.pigx.flow.task.vo.FormGroupVo; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.*; +import java.util.stream.Collectors; + +@Service +@Slf4j +@RequiredArgsConstructor +public class CombinationGroupServiceImpl implements ICombinationGroupService { + + private final IProcessGroupService processGroupService; + + private final IProcessService processService; + + private final IProcessStarterService processStarterService; + + /** + * 查询表单组包含流程 + * @param hidden + * @return 表单组数据 + */ + @Override + public R listGroupWithProcess(Page page, Long groupId) { + return R.ok(processService.lambdaQuery().eq(Process::getGroupId, groupId).eq(Process::getHidden, false) + .orderByAsc(Process::getSort).orderByDesc(Process::getCreateTime).page(page)); + } + + /** + * 查询所有我可以发起的表单组 + * @return + */ + @Override + public R listCurrentUserStartGroup() { + PigxUser user = SecurityUtils.getUser(); + + List formGroupVos = new LinkedList<>(); + + List processGroupList = processGroupService.lambdaQuery().orderByAsc(ProcessGroup::getSort) + .list(); + + processGroupList.forEach(group -> { + FormGroupVo formGroupVo = FormGroupVo.builder().id(group.getId()).name(group.getGroupName()) + .items(new LinkedList<>()).build(); + formGroupVos.add(formGroupVo); + + List processList = processService.lambdaQuery().eq(Process::getGroupId, group.getId()) + .eq(Process::getHidden, false).eq(Process::getStop, false).orderByAsc(Process::getSort).list(); + + Map existMap = new HashMap<>(); + + if (!processList.isEmpty()) { + List idList = processList.stream().map(Process::getId).collect(Collectors.toList()); + // 查询发起人集合 + List processStarterList = processStarterService.lambdaQuery() + .in(ProcessStarter::getProcessId, idList).list(); + Map> groupmap = processStarterList.stream() + .collect(Collectors.groupingBy(ProcessStarter::getProcessId)); + + for (Process process : processList) { + List processStarters = groupmap.get(process.getId()); + if (processStarters == null) { + existMap.put(process.getId(), true); + continue; + } + boolean match = processStarters.stream().anyMatch(w -> w.getTypeId().longValue() == user.getId() + && w.getType().equals(NodeUserTypeEnum.USER.getKey())); + if (match) { + existMap.put(process.getId(), true); + continue; + } + Set deptIdSet = processStarters.stream() + .filter(w -> w.getType().equals(NodeUserTypeEnum.DEPT.getKey())).map(w -> w.getTypeId()) + .collect(Collectors.toSet()); + + existMap.put(process.getId(), deptIdSet.contains(user.getDeptId())); + + } + + } + + processList.forEach(process -> { + + if (!existMap.get(process.getId())) { + return; + } + + formGroupVo.getItems() + .add(FormGroupVo.FlowVo.builder().flowId(process.getFlowId()).name(process.getName()) + .logo(process.getLogo()).remark(process.getRemark()).stop(process.getStop()) + .updated(process.getUpdateTime()).build()); + }); + }); + return R.ok(formGroupVos); + } + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/OrgServiceImpl.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/OrgServiceImpl.java new file mode 100644 index 0000000..00e9966 --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/OrgServiceImpl.java @@ -0,0 +1,131 @@ +package com.pig4cloud.pigx.flow.task.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.lang.Dict; +import cn.hutool.core.util.StrUtil; +import com.pig4cloud.pigx.admin.api.entity.SysDept; +import com.pig4cloud.pigx.admin.api.entity.SysRole; +import com.pig4cloud.pigx.admin.api.entity.SysUser; +import com.pig4cloud.pigx.admin.api.feign.RemoteDeptService; +import com.pig4cloud.pigx.admin.api.feign.RemoteRoleService; +import com.pig4cloud.pigx.admin.api.feign.RemoteUserService; +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.common.core.util.RetOps; +import com.pig4cloud.pigx.flow.task.constant.NodeUserTypeEnum; +import com.pig4cloud.pigx.flow.task.service.IOrgService; +import com.pig4cloud.pigx.flow.task.utils.DataUtil; +import com.pig4cloud.pigx.flow.task.vo.OrgTreeVo; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; +import java.util.stream.Collectors; + +@Service +@RequiredArgsConstructor +public class OrgServiceImpl implements IOrgService { + + private final RemoteUserService remoteUserService; + + private final RemoteRoleService remoteRoleService; + + private final RemoteDeptService remoteDeptService; + + /** + * 查询组织架构树 + * @param deptId 部门id + * @param type 只查询部门架构 + * @param showLeave 是否显示离职员工 + * @return 组织架构树数据 + */ + @Override + public R getOrgTreeData(Long deptId, String type, Boolean showLeave) { + List orgs = new LinkedList<>(); + + if (StrUtil.equals(type, NodeUserTypeEnum.ROLE.getKey())) { + // 角色 + + List roleList = remoteRoleService.getAllRole().getData(); + + for (SysRole role : roleList) { + OrgTreeVo orgTreeVo = new OrgTreeVo(); + orgTreeVo.setId(role.getRoleId()); + orgTreeVo.setName(role.getRoleName()); + orgTreeVo.setType(NodeUserTypeEnum.ROLE.getKey()); + orgTreeVo.setSelected(false); + orgs.add(orgTreeVo); + } + + Dict dict = Dict.create().set("roleList", orgs).set("childDepartments", orgs).set("employees", + new ArrayList<>()); + return R.ok(dict); + + } + + Dict dict = Dict.create().set("titleDepartments", new ArrayList<>()).set("roleList", new ArrayList<>()) + .set("employees", new ArrayList<>()); + + List deptList = remoteDeptService.getAllDept().getData(); + + // 查询所有部门及员工 + { + List deptVoList = new ArrayList(); + for (SysDept dept : deptList) { + OrgTreeVo orgTreeVo = new OrgTreeVo(); + orgTreeVo.setId(dept.getDeptId()); + orgTreeVo.setName(dept.getName()); + orgTreeVo.setType(NodeUserTypeEnum.DEPT.getKey()); + orgTreeVo.setSelected(false); + deptVoList.add(orgTreeVo); + } + dict.set("childDepartments", deptVoList); + } + if (!StrUtil.equals(type, NodeUserTypeEnum.DEPT.getKey())) { + + List userVoList = new ArrayList(); + + List userList = remoteUserService.getUserIdListByDeptIdList(CollUtil.toList(deptId)).getData(); + + for (SysUser user : userList) { + OrgTreeVo orgTreeVo = new OrgTreeVo(); + orgTreeVo.setId(user.getUserId()); + orgTreeVo.setName(user.getUsername()); + orgTreeVo.setType(NodeUserTypeEnum.USER.getKey()); + orgTreeVo.setSelected(false); + orgTreeVo.setAvatar(user.getAvatar()); + userVoList.add(orgTreeVo); + } + dict.set("employees", userVoList); + } + + if (deptId > 0) { + List allDept = remoteDeptService.getAllDept().getData(); + List depts = DataUtil.selectParentByDept(deptId, allDept); + dict.set("titleDepartments", CollUtil.reverse(depts)); + } + + return R.ok(dict); + } + + /** + * 模糊搜索用户 + * @param userName 用户名/拼音/首字母 + * @return 匹配到的用户 + */ + @Override + public R getOrgTreeUser(String userName) { + return R.ok(RetOps.of(remoteUserService.getUserListByUserName(userName)).getData().orElseGet(ArrayList::new) + .stream().map(user -> { + OrgTreeVo orgTreeVo = new OrgTreeVo(); + orgTreeVo.setId(user.getUserId()); + orgTreeVo.setName(user.getUsername()); + orgTreeVo.setType(NodeUserTypeEnum.USER.getKey()); + orgTreeVo.setSelected(false); + orgTreeVo.setAvatar(user.getAvatar()); + return orgTreeVo; + }).collect(Collectors.toList())); + } + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/ProcessCopyServiceImpl.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/ProcessCopyServiceImpl.java new file mode 100644 index 0000000..d812ff3 --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/ProcessCopyServiceImpl.java @@ -0,0 +1,123 @@ +package com.pig4cloud.pigx.flow.task.service.impl; + +import cn.hutool.core.convert.Convert; +import cn.hutool.core.lang.Dict; +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.flow.task.constant.FormTypeEnum; +import com.pig4cloud.pigx.flow.task.constant.ProcessInstanceConstant; +import com.pig4cloud.pigx.flow.task.dto.Node; +import com.pig4cloud.pigx.flow.task.entity.Process; +import com.pig4cloud.pigx.flow.task.entity.ProcessCopy; +import com.pig4cloud.pigx.flow.task.mapper.ProcessCopyMapper; +import com.pig4cloud.pigx.flow.task.service.IProcessCopyService; +import com.pig4cloud.pigx.flow.task.service.IProcessNodeDataService; +import com.pig4cloud.pigx.flow.task.service.IProcessService; +import com.pig4cloud.pigx.flow.task.vo.FormItemVO; +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + *

+ * 流程抄送数据 服务实现类 + *

+ * + * @author Vincent + * @since 2023-05-20 + */ +@Service +@RequiredArgsConstructor +public class ProcessCopyServiceImpl extends ServiceImpl implements IProcessCopyService { + + private final ObjectMapper objectMapper; + + private final IProcessService processService; + + private final IProcessNodeDataService nodeDataService; + + /** + * 查询单个抄送详细信息 + * @param id + * @return + */ + @SneakyThrows + @Override + public R querySingleDetail(long id) { + ProcessCopy processCopy = this.getById(id); + String flowId = processCopy.getFlowId(); + Process oaForms = processService.getByFlowId(flowId); + if (oaForms == null) { + return R.failed("流程不存在"); + } + String formData = processCopy.getFormData(); + + Map variableMap = objectMapper.readValue(formData, new TypeReference>() { + }); + + String nodeId = processCopy.getNodeId(); + + Node node = nodeDataService.getNodeData(flowId, nodeId).getData(); + Map formPerms = node.getFormPerms(); + + List jsonObjectList = objectMapper.readValue(oaForms.getFormItems(), + new TypeReference>() { + }); + for (FormItemVO formItemVO : jsonObjectList) { + String fid = formItemVO.getId(); + String perm = formPerms.get(fid); + formItemVO.setPerm(StrUtil.isBlankIfStr(perm) ? ProcessInstanceConstant.FormPermClass.HIDE : perm); + + if (formItemVO.getType().equals(FormTypeEnum.LAYOUT.getType())) { + // 明细 + + List> subParamList = MapUtil.get(variableMap, fid, + new cn.hutool.core.lang.TypeReference>>() { + }); + + Object value = formItemVO.getProps().getValue(); + + List> l = new ArrayList<>(); + for (Map map : subParamList) { + List subItemList = Convert.toList(FormItemVO.class, value); + for (FormItemVO itemVO : subItemList) { + itemVO.getProps().setValue(map.get(itemVO.getId())); + + String permSub = formPerms.get(itemVO.getId()); + if (StrUtil.isNotBlank(permSub)) { + itemVO.setPerm(ProcessInstanceConstant.FormPermClass.EDIT.equals(permSub) + ? ProcessInstanceConstant.FormPermClass.READ : permSub + + ); + + } + else { + itemVO.setPerm(ProcessInstanceConstant.FormPermClass.HIDE); + } + + } + l.add(subItemList); + } + formItemVO.getProps().setValue(l); + + } + else { + formItemVO.getProps().setValue(variableMap.get(fid)); + + } + + } + Dict set = Dict.create().set("formItems", jsonObjectList); + + return R.ok(set); + } + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/ProcessGroupServiceImpl.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/ProcessGroupServiceImpl.java new file mode 100644 index 0000000..b8063c6 --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/ProcessGroupServiceImpl.java @@ -0,0 +1,61 @@ +package com.pig4cloud.pigx.flow.task.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.flow.task.entity.ProcessGroup; +import com.pig4cloud.pigx.flow.task.mapper.ProcessGroupMapper; +import com.pig4cloud.pigx.flow.task.service.IProcessGroupService; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + *

+ * 服务实现类 + *

+ * + * @author Vincent + * @since 2023-05-25 + */ +@Service +public class ProcessGroupServiceImpl extends ServiceImpl + implements IProcessGroupService { + + /** + * 组列表 + * @return + */ + @Override + public R> queryList() { + List processGroupList = this.lambdaQuery().orderByAsc(ProcessGroup::getSort).list(); + + return R.ok(processGroupList); + } + + /** + * 新增表单分组 + * @param processGroup 分组名 + * @return 添加结果 + */ + @Override + public R create(ProcessGroup processGroup) { + ProcessGroup pg = new ProcessGroup(); + pg.setSort(0); + pg.setGroupName(processGroup.getGroupName()); + + this.save(pg); + return R.ok(); + } + + /** + * 删除分组 + * @param id + * @return + */ + @Override + public R delete(long id) { + this.removeById(id); + return R.ok(); + } + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/ProcessInstanceRecordServiceImpl.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/ProcessInstanceRecordServiceImpl.java new file mode 100644 index 0000000..4bc25a6 --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/ProcessInstanceRecordServiceImpl.java @@ -0,0 +1,21 @@ +package com.pig4cloud.pigx.flow.task.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.pig4cloud.pigx.flow.task.entity.ProcessInstanceRecord; +import com.pig4cloud.pigx.flow.task.mapper.ProcessInstanceRecordMapper; +import com.pig4cloud.pigx.flow.task.service.IProcessInstanceRecordService; +import org.springframework.stereotype.Service; + +/** + *

+ * 流程记录 服务实现类 + *

+ * + * @author Vincent + * @since 2023-05-07 + */ +@Service +public class ProcessInstanceRecordServiceImpl extends ServiceImpl + implements IProcessInstanceRecordService { + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/ProcessInstanceServiceImpl.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/ProcessInstanceServiceImpl.java new file mode 100644 index 0000000..6fca378 --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/ProcessInstanceServiceImpl.java @@ -0,0 +1,417 @@ +package com.pig4cloud.pigx.flow.task.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.lang.Dict; +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.pig4cloud.pigx.admin.api.entity.SysUser; +import com.pig4cloud.pigx.admin.api.feign.RemoteUserService; +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.common.security.service.PigxUser; +import com.pig4cloud.pigx.common.security.util.SecurityUtils; +import com.pig4cloud.pigx.flow.task.api.feign.RemoteFlowEngineService; +import com.pig4cloud.pigx.flow.task.constant.FormTypeEnum; +import com.pig4cloud.pigx.flow.task.constant.NodeStatusEnum; +import com.pig4cloud.pigx.flow.task.constant.NodeUserTypeEnum; +import com.pig4cloud.pigx.flow.task.constant.ProcessInstanceConstant; +import com.pig4cloud.pigx.flow.task.dto.*; +import com.pig4cloud.pigx.flow.task.entity.Process; +import com.pig4cloud.pigx.flow.task.entity.*; +import com.pig4cloud.pigx.flow.task.service.*; +import com.pig4cloud.pigx.flow.task.utils.NodeFormatUtil; +import com.pig4cloud.pigx.flow.task.vo.FormItemVO; +import com.pig4cloud.pigx.flow.task.vo.NodeFormatParamVo; +import com.pig4cloud.pigx.flow.task.vo.NodeVo; +import com.pig4cloud.pigx.flow.task.vo.ProcessCopyVo; +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 实例进程服务 + */ +@Service +@Slf4j +@RequiredArgsConstructor +public class ProcessInstanceServiceImpl implements IProcessInstanceService { + + private final RemoteFlowEngineService flowEngineService; + + private final RemoteUserService userService; + + private final IProcessInstanceRecordService processInstanceRecordService; + + private final IProcessCopyService processCopyService; + + private final IProcessService processService; + + private final IProcessNodeRecordService processNodeRecordService; + + private final IProcessNodeRecordAssignUserService processNodeRecordAssignUserService; + + private final ObjectMapper objectMapper; + + /** + * 启动流程 + * @param processInstanceParamDto + * @return + */ + @Override + public R startProcessInstance(ProcessInstanceParamDto processInstanceParamDto) { + + PigxUser user = SecurityUtils.getUser(); + + processInstanceParamDto.setStartUserId(String.valueOf(user.getId())); + Map paramMap = processInstanceParamDto.getParamMap(); + Dict rootUser = Dict.create().set("id", user.getId()).set("name", user.getUsername()).set("type", + NodeUserTypeEnum.USER.getKey()); + paramMap.put("root", CollUtil.newArrayList(rootUser)); + return flowEngineService.startProcess(processInstanceParamDto); + } + + /** + * 查询当前登录用户的待办任务 + * @param pageVO + * @param taskDto + * @return + */ + @Override + public R queryMineTask(TaskQueryParamDto taskQueryParamDto) { + taskQueryParamDto.setAssign(SecurityUtils.getUser().getId().toString()); + R> r = flowEngineService.queryAssignTask(taskQueryParamDto); + + if (CollUtil.isEmpty(r.getData().getRecords())) { + return r; + } + + Set processInstanceIdSet = r.getData().getRecords().stream().map(TaskDto::getProcessInstanceId) + .collect(Collectors.toSet()); + + // 流程实例记录 + List processInstanceRecordList = processInstanceRecordService.lambdaQuery() + .in(ProcessInstanceRecord::getProcessInstanceId, processInstanceIdSet).list(); + + // 发起人 + List startUserList = processInstanceRecordList.stream().map(ProcessInstanceRecord::getUserId) + .map(userId -> userService.getUserById(userId).getData()).collect(Collectors.toList()); + + Page pageResultDto = r.getData(); + List taskDtoList = new ArrayList<>(); + for (TaskDto record : r.getData().getRecords()) { + ProcessInstanceRecord processInstanceRecord = processInstanceRecordList.stream() + .filter(w -> StrUtil.equals(w.getProcessInstanceId(), record.getProcessInstanceId())).findAny() + .orElse(null); + + if (processInstanceRecord != null) { + record.setProcessName(processInstanceRecord.getName()); + SysUser startUser = startUserList.stream() + .filter(w -> w.getUserId().longValue() == processInstanceRecord.getUserId()).findAny() + .orElse(null); + + record.setRootUserId(processInstanceRecord.getUserId()); + record.setGroupName(processInstanceRecord.getGroupName()); + record.setRootUserName(startUser.getUsername()); + record.setRootUserAvatarUrl(startUser.getAvatar()); + record.setStartTime(processInstanceRecord.getCreateTime()); + + taskDtoList.add(record); + } + } + + pageResultDto.setRecords(taskDtoList); + + return R.ok(pageResultDto); + } + + /** + * 查询已办任务 + * @param taskQueryParamDto + * @return + */ + @Override + public R queryMineEndTask(TaskQueryParamDto taskQueryParamDto) { + taskQueryParamDto.setAssign(SecurityUtils.getUser().getId().toString()); + R> r = flowEngineService.queryCompletedTask(taskQueryParamDto); + + Page pageResultDto = r.getData(); + List records = pageResultDto.getRecords(); + if (CollUtil.isEmpty(records)) { + return R.ok(pageResultDto); + + } + + Set processInstanceIdSet = records.stream().map(TaskDto::getProcessInstanceId) + .collect(Collectors.toSet()); + + // 流程实例记录 + List processInstanceRecordList = processInstanceRecordService.lambdaQuery() + .in(ProcessInstanceRecord::getProcessInstanceId, processInstanceIdSet).list(); + + // 发起人 + List startUserList = processInstanceRecordList.stream().map(ProcessInstanceRecord::getUserId) + .map(userId -> userService.getUserById(userId).getData()).collect(Collectors.toList()); + + List taskDtoList = new ArrayList<>(); + for (TaskDto record : records) { + + ProcessInstanceRecord processInstanceRecord = processInstanceRecordList.stream() + .filter(w -> StrUtil.equals(w.getProcessInstanceId(), record.getProcessInstanceId())).findAny() + .orElse(null); + + if (processInstanceRecord != null) { + + record.setProcessName(processInstanceRecord.getName()); + + SysUser startUser = startUserList.stream() + .filter(w -> w.getUserId().longValue() == processInstanceRecord.getUserId()).findAny() + .orElse(null); + + record.setRootUserId(processInstanceRecord.getUserId()); + record.setGroupName(processInstanceRecord.getGroupName()); + record.setRootUserName(startUser.getName()); + record.setRootUserAvatarUrl(startUser.getAvatar()); + record.setTaskId(record.getTaskId()); + record.setStartTime(processInstanceRecord.getCreateTime()); + taskDtoList.add(record); + } + } + + pageResultDto.setRecords(taskDtoList); + + return R.ok(pageResultDto); + } + + /** + * 流程结束 + * @param processsInstanceId + * @return + */ + @Override + public R end(String processsInstanceId) { + processInstanceRecordService.lambdaUpdate().set(ProcessInstanceRecord::getEndTime, new Date()) + .set(ProcessInstanceRecord::getStatus, NodeStatusEnum.YJS.getCode()) + .eq(ProcessInstanceRecord::getProcessInstanceId, processsInstanceId) + .update(new ProcessInstanceRecord()); + return R.ok(); + } + + /** + * 查询我发起的 + * @param pageDto + * @return + */ + @Override + public R queryMineStarted(TaskQueryParamDto taskQueryParamDto) { + + long userId = SecurityUtils.getUser().getId(); + + Page instanceRecordPage = processInstanceRecordService.lambdaQuery() + .eq(ProcessInstanceRecord::getUserId, userId) + .eq(ProcessInstanceRecord::getStatus, taskQueryParamDto.getStatus()) + .between(ArrayUtil.isNotEmpty(taskQueryParamDto.getTaskTime()), ProcessInstanceRecord::getCreateTime, + ArrayUtil.isNotEmpty(taskQueryParamDto.getTaskTime()) ? taskQueryParamDto.getTaskTime()[0] + : null, + ArrayUtil.isNotEmpty(taskQueryParamDto.getTaskTime()) ? taskQueryParamDto.getTaskTime()[1] + : null) + .orderByDesc(ProcessInstanceRecord::getCreateTime) + .page(new Page<>(taskQueryParamDto.getPageNum(), taskQueryParamDto.getPageSize())); + + return R.ok(instanceRecordPage); + } + + /** + * 查询抄送给我的 + * @param pageDto + * @return + */ + @Override + public R queryMineCC(TaskQueryParamDto taskQueryParamDto) { + + long userId = SecurityUtils.getUser().getId(); + + Page page = processCopyService.lambdaQuery().eq(ProcessCopy::getUserId, userId).between( + ArrayUtil.isNotEmpty(taskQueryParamDto.getTaskTime()), ProcessCopy::getCreateTime, + ArrayUtil.isNotEmpty(taskQueryParamDto.getTaskTime()) ? taskQueryParamDto.getTaskTime()[0] : null, + ArrayUtil.isNotEmpty(taskQueryParamDto.getTaskTime()) ? taskQueryParamDto.getTaskTime()[1] : null) + .orderByDesc(ProcessCopy::getNodeTime) + .page(new Page<>(taskQueryParamDto.getPageNum(), taskQueryParamDto.getPageSize())); + + List records = page.getRecords(); + + List processCopyVoList = BeanUtil.copyToList(records, ProcessCopyVo.class); + + if (CollUtil.isNotEmpty(records)) { + // 发起人 + List startUserList = records.stream().map(ProcessCopy::getStartUserId) + .map(id -> userService.getUserById(id).getData()).collect(Collectors.toList()); + + for (ProcessCopyVo record : processCopyVoList) { + SysUser startUser = startUserList.stream() + .filter(w -> w.getUserId().longValue() == record.getStartUserId()).findAny().orElse(null); + record.setStartUserName(startUser.getUsername()); + } + } + + Page p = BeanUtil.copyProperties(page, Page.class); + + p.setRecords(processCopyVoList); + + return R.ok(p); + } + + /** + * 格式化流程显示 + * @param nodeFormatParamVo + * @return + */ + @SneakyThrows + @Override + public R formatStartNodeShow(NodeFormatParamVo nodeFormatParamVo) { + String flowId = nodeFormatParamVo.getFlowId(); + String processInstanceId = nodeFormatParamVo.getProcessInstanceId(); + if (StrUtil.isAllBlank(flowId, processInstanceId)) { + return R.ok(new ArrayList<>()); + } + + if (StrUtil.isBlankIfStr(flowId) && StrUtil.isNotBlank(processInstanceId)) { + ProcessInstanceRecord processInstanceRecord = processInstanceRecordService.lambdaQuery() + .eq(ProcessInstanceRecord::getProcessInstanceId, processInstanceId).one(); + flowId = processInstanceRecord.getFlowId(); + + } + Map paramMap = nodeFormatParamVo.getParamMap(); + if (StrUtil.isNotBlank(nodeFormatParamVo.getTaskId())) { + VariableQueryParamDto variableQueryParamDto = new VariableQueryParamDto(); + variableQueryParamDto.setTaskId(nodeFormatParamVo.getTaskId()); + R> r = flowEngineService.queryTaskVariables(variableQueryParamDto); + if (!r.isOk()) { + ProcessNodeRecordAssignUser processNodeRecordAssignUser = processNodeRecordAssignUserService + .lambdaQuery().eq(ProcessNodeRecordAssignUser::getTaskId, nodeFormatParamVo.getTaskId()) + .eq(ProcessNodeRecordAssignUser::getStatus, NodeStatusEnum.YJS.getCode()).last("limit 1") + .orderByDesc(ProcessNodeRecordAssignUser::getEndTime).one(); + + String data = processNodeRecordAssignUser.getData(); + + Map variableMap = objectMapper.readValue(data, + new TypeReference>() { + }); + variableMap.putAll(paramMap); + paramMap.putAll(variableMap); + } + else { + Map variableMap = r.getData(); + variableMap.putAll(paramMap); + paramMap.putAll(variableMap); + } + + } + + Set completeNodeSet = new HashSet<>(); + + if (StrUtil.isNotBlank(processInstanceId)) { + List processNodeRecordList = processNodeRecordService.lambdaQuery() + .eq(ProcessNodeRecord::getProcessInstanceId, processInstanceId) + .eq(ProcessNodeRecord::getStatus, NodeStatusEnum.YJS.getCode()).list(); + Set collect = processNodeRecordList.stream().map(ProcessNodeRecord::getNodeId) + .collect(Collectors.toSet()); + completeNodeSet.addAll(collect); + } + + Process oaForms = processService.getByFlowId(flowId); + String process = oaForms.getProcess(); + Node nodeDto = objectMapper.readValue(process, new TypeReference() { + }); + + List processNodeShowDtos = NodeFormatUtil.formatProcessNodeShow(nodeDto, completeNodeSet, + new HashSet<>(), processInstanceId, paramMap); + + return R.ok(processNodeShowDtos); + } + + /** + * 流程详情 + * @param processInstanceId + * @return + */ + @SneakyThrows + @Override + public R detail(String processInstanceId) { + ProcessInstanceRecord processInstanceRecord = processInstanceRecordService.lambdaQuery() + .eq(ProcessInstanceRecord::getProcessInstanceId, processInstanceId).one(); + + Process oaForms = processService.getByFlowId(processInstanceRecord.getFlowId()); + if (oaForms == null) { + return R.failed("流程不存在"); + } + + // 发起人变量数据 + String formData = processInstanceRecord.getFormData(); + Map variableMap = objectMapper.readValue(formData, new TypeReference>() { + }); + // 发起人表单权限 + String process = oaForms.getProcess(); + + Node nodeDto = objectMapper.readValue(process, Node.class); + Map formPerms1 = nodeDto.getFormPerms(); + + List jsonObjectList = objectMapper.readValue(oaForms.getFormItems(), + new TypeReference>() { + }); + for (FormItemVO formItemVO : jsonObjectList) { + String id = formItemVO.getId(); + String perm = formPerms1.get(id); + + formItemVO.setPerm(StrUtil.isBlankIfStr(perm) ? ProcessInstanceConstant.FormPermClass.READ + : (StrUtil.equals(perm, ProcessInstanceConstant.FormPermClass.HIDE) ? perm + : ProcessInstanceConstant.FormPermClass.READ)); + + if (formItemVO.getType().equals(FormTypeEnum.LAYOUT.getType())) { + // 明细 + List> subParamList = MapUtil.get(variableMap, id, + new cn.hutool.core.lang.TypeReference>>() { + }); + + Object value = formItemVO.getProps().getValue(); + + List> l = new ArrayList<>(); + for (Map map : subParamList) { + List subItemList = Convert.toList(FormItemVO.class, value); + for (FormItemVO itemVO : subItemList) { + itemVO.getProps().setValue(map.get(itemVO.getId())); + + String permSub = formPerms1.get(itemVO.getId()); + + itemVO.setPerm(StrUtil.isBlankIfStr(permSub) ? ProcessInstanceConstant.FormPermClass.READ + : (StrUtil.equals(permSub, ProcessInstanceConstant.FormPermClass.HIDE) ? permSub + : ProcessInstanceConstant.FormPermClass.READ)); + + } + l.add(subItemList); + } + formItemVO.getProps().setValue(l); + + } + else { + formItemVO.getProps().setValue(variableMap.get(id)); + + } + + } + Dict set = Dict.create().set("processInstanceId", processInstanceId).set("process", oaForms.getProcess()) + + .set("formItems", jsonObjectList); + + return R.ok(set); + } + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/ProcessNodeDataServiceImpl.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/ProcessNodeDataServiceImpl.java new file mode 100644 index 0000000..817656a --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/ProcessNodeDataServiceImpl.java @@ -0,0 +1,57 @@ +package com.pig4cloud.pigx.flow.task.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.flow.task.dto.Node; +import com.pig4cloud.pigx.flow.task.dto.ProcessNodeDataDto; +import com.pig4cloud.pigx.flow.task.entity.ProcessNodeData; +import com.pig4cloud.pigx.flow.task.mapper.ProcessNodeDataMapper; +import com.pig4cloud.pigx.flow.task.service.IProcessNodeDataService; +import org.springframework.stereotype.Service; + +import java.util.Optional; + +/** + *

+ * 流程节点数据 服务实现类 + *

+ * + * @author Vincent + * @since 2023-05-07 + */ +@Service +public class ProcessNodeDataServiceImpl extends ServiceImpl + implements IProcessNodeDataService { + + /** + * 保存流程节点数据。 + * @param processNodeDataDto 流程节点数据DTO + * @return 保存结果 + */ + @Override + public R saveNodeData(ProcessNodeDataDto processNodeDataDto) { + ProcessNodeData processNodeData = BeanUtil.copyProperties(processNodeDataDto, ProcessNodeData.class); + this.save(processNodeData); + return R.ok(); + } + + /** + * 获取节点数据。 + * @param flowId 流程ID + * @param nodeId 节点ID + * @return 节点数据 + */ + @Override + public R getNodeData(String flowId, String nodeId) { + Optional processNodeDataOptional = this.lambdaQuery().eq(ProcessNodeData::getFlowId, flowId) + .eq(ProcessNodeData::getNodeId, nodeId).oneOpt(); + + Node node = processNodeDataOptional + .map(processNodeData -> JSONUtil.toBean(processNodeData.getData(), Node.class)).orElse(null); + + return R.ok(node); + } + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/ProcessNodeRecordAssignUserServiceImpl.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/ProcessNodeRecordAssignUserServiceImpl.java new file mode 100644 index 0000000..5ef93ed --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/ProcessNodeRecordAssignUserServiceImpl.java @@ -0,0 +1,85 @@ +package com.pig4cloud.pigx.flow.task.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.flow.task.constant.NodeStatusEnum; +import com.pig4cloud.pigx.flow.task.dto.ProcessNodeRecordAssignUserParamDto; +import com.pig4cloud.pigx.flow.task.entity.ProcessNodeRecordAssignUser; +import com.pig4cloud.pigx.flow.task.mapper.ProcessNodeRecordAssignUserMapper; +import com.pig4cloud.pigx.flow.task.service.IProcessNodeRecordAssignUserService; +import org.springframework.stereotype.Service; + +import java.time.LocalDateTime; + +/** + *

+ * 流程节点记录-执行人 服务实现类 + *

+ * + * @author cxygzl + * @since 2023-05-10 + */ +@Service +public class ProcessNodeRecordAssignUserServiceImpl + extends ServiceImpl + implements IProcessNodeRecordAssignUserService { + + /** + * 设置执行人 + * @param processNodeRecordAssignUserParamDto + * @return + */ + @Override + public R addAssignUser(ProcessNodeRecordAssignUserParamDto processNodeRecordAssignUserParamDto) { + if (StrUtil.isNotBlank(processNodeRecordAssignUserParamDto.getApproveDesc())) { + ProcessNodeRecordAssignUser processNodeRecordAssignUser = this.lambdaQuery() + .eq(ProcessNodeRecordAssignUser::getTaskId, processNodeRecordAssignUserParamDto.getTaskId()) + .orderByDesc(ProcessNodeRecordAssignUser::getId).last("limit 1").one(); + if (processNodeRecordAssignUser != null) { + processNodeRecordAssignUser.setApproveDesc(processNodeRecordAssignUserParamDto.getApproveDesc()); + processNodeRecordAssignUser.setTaskType(processNodeRecordAssignUserParamDto.getTaskType()); + processNodeRecordAssignUser.setStatus(NodeStatusEnum.YJS.getCode()); + processNodeRecordAssignUser.setEndTime(LocalDateTime.now()); + this.updateById(processNodeRecordAssignUser); + } + + } + + ProcessNodeRecordAssignUser processNodeRecordAssignUser = BeanUtil + .copyProperties(processNodeRecordAssignUserParamDto, ProcessNodeRecordAssignUser.class); + processNodeRecordAssignUser.setStartTime(LocalDateTime.now()); + processNodeRecordAssignUser.setStatus(NodeStatusEnum.JXZ.getCode()); + processNodeRecordAssignUser.setApproveDesc(""); + processNodeRecordAssignUser.setTaskType(""); + this.save(processNodeRecordAssignUser); + + return R.ok(); + } + + /** + * 任务完成通知 + * @param processNodeRecordAssignUserParamDto + * @return + */ + @Override + public R completeTaskEvent(ProcessNodeRecordAssignUserParamDto processNodeRecordAssignUserParamDto) { + ProcessNodeRecordAssignUser processNodeRecordAssignUser = this.lambdaQuery() + .eq(ProcessNodeRecordAssignUser::getTaskId, processNodeRecordAssignUserParamDto.getTaskId()) + .eq(ProcessNodeRecordAssignUser::getUserId, processNodeRecordAssignUserParamDto.getUserId()) + .eq(ProcessNodeRecordAssignUser::getProcessInstanceId, + processNodeRecordAssignUserParamDto.getProcessInstanceId()) + .eq(ProcessNodeRecordAssignUser::getStatus, NodeStatusEnum.JXZ.getCode()) + .orderByDesc(ProcessNodeRecordAssignUser::getId).last("limit 1").one(); + processNodeRecordAssignUser.setStatus(NodeStatusEnum.YJS.getCode()); + processNodeRecordAssignUser.setApproveDesc(processNodeRecordAssignUserParamDto.getApproveDesc()); + processNodeRecordAssignUser.setEndTime(LocalDateTime.now()); + processNodeRecordAssignUser.setData(processNodeRecordAssignUserParamDto.getData()); + processNodeRecordAssignUser.setLocalData(processNodeRecordAssignUserParamDto.getLocalData()); + processNodeRecordAssignUser.setTaskType("COMPLETE"); + this.updateById(processNodeRecordAssignUser); + return R.ok(); + } + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/ProcessNodeRecordServiceImpl.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/ProcessNodeRecordServiceImpl.java new file mode 100644 index 0000000..de54eb7 --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/ProcessNodeRecordServiceImpl.java @@ -0,0 +1,65 @@ +package com.pig4cloud.pigx.flow.task.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.flow.task.constant.NodeStatusEnum; +import com.pig4cloud.pigx.flow.task.dto.ProcessNodeRecordParamDto; +import com.pig4cloud.pigx.flow.task.entity.ProcessNodeRecord; +import com.pig4cloud.pigx.flow.task.mapper.ProcessNodeRecordMapper; +import com.pig4cloud.pigx.flow.task.service.IProcessNodeRecordService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.Date; + +/** + *

+ * 流程节点记录 服务实现类 + *

+ * + * @author cxygzl + * @since 2023-05-10 + */ +@Slf4j +@Service +public class ProcessNodeRecordServiceImpl extends ServiceImpl + implements IProcessNodeRecordService { + + /** + * 节点开始 + * @param processNodeRecordParamDto + * @return + */ + @Override + public R start(ProcessNodeRecordParamDto processNodeRecordParamDto) { + + ProcessNodeRecord processNodeRecord = BeanUtil.copyProperties(processNodeRecordParamDto, + ProcessNodeRecord.class); + processNodeRecord.setStartTime(new Date()); + processNodeRecord.setStatus(NodeStatusEnum.JXZ.getCode()); + + this.save(processNodeRecord); + return R.ok(); + } + + /** + * 节点结束 + * @param processNodeRecordParamDto + * @return + */ + @Override + public R complete(ProcessNodeRecordParamDto processNodeRecordParamDto) { + + log.info("节点结束---{}", processNodeRecordParamDto); + + // TODO 完成节点和完成任务要区分下 + this.lambdaUpdate().set(ProcessNodeRecord::getStatus, NodeStatusEnum.YJS.getCode()) + .set(ProcessNodeRecord::getEndTime, new Date()) + .eq(ProcessNodeRecord::getProcessInstanceId, processNodeRecordParamDto.getProcessInstanceId()) + .eq(ProcessNodeRecord::getNodeId, processNodeRecordParamDto.getNodeId()) + .update(new ProcessNodeRecord()); + return R.ok(); + } + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/ProcessServiceImpl.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/ProcessServiceImpl.java new file mode 100644 index 0000000..04a8e0d --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/ProcessServiceImpl.java @@ -0,0 +1,254 @@ +package com.pig4cloud.pigx.flow.task.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.common.security.util.SecurityUtils; +import com.pig4cloud.pigx.common.sequence.sequence.Sequence; +import com.pig4cloud.pigx.flow.task.api.feign.RemoteFlowEngineService; +import com.pig4cloud.pigx.flow.task.constant.FormTypeEnum; +import com.pig4cloud.pigx.flow.task.constant.ProcessInstanceConstant; +import com.pig4cloud.pigx.flow.task.dto.Node; +import com.pig4cloud.pigx.flow.task.dto.NodeUser; +import com.pig4cloud.pigx.flow.task.entity.Process; +import com.pig4cloud.pigx.flow.task.entity.ProcessStarter; +import com.pig4cloud.pigx.flow.task.mapper.ProcessMapper; +import com.pig4cloud.pigx.flow.task.service.IProcessService; +import com.pig4cloud.pigx.flow.task.service.IProcessStarterService; +import com.pig4cloud.pigx.flow.task.utils.NodeUtil; +import com.pig4cloud.pigx.flow.task.vo.FormItemVO; +import com.pig4cloud.pigx.flow.task.vo.ProcessVO; +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; +import org.springframework.stereotype.Service; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author cxygzl + * @since 2023-05-25 + */ +@Service +@RequiredArgsConstructor +public class ProcessServiceImpl extends ServiceImpl implements IProcessService { + + private final IProcessStarterService processStarterService; + + private final RemoteFlowEngineService flowEngineService; + + private final Sequence flowSequence; + + private final ObjectMapper objectMapper; + + /** + * 获取详细数据 + * @param flowId + * @return + */ + @Override + public R getDetail(String flowId) { + // 获取流程详情 + ProcessVO processVO = this.getProcessVO(flowId); + return R.ok(processVO); + } + + /** + * 根据流程ID获取流程详情 + * @param flowId 流程ID + * @return 流程详情 + */ + @SneakyThrows + private ProcessVO getProcessVO(String flowId) { + + Process oaForms = getByFlowId(flowId); + String process = oaForms.getProcess(); + String formItems = oaForms.getFormItems(); + Node startNode = objectMapper.readValue(process, new TypeReference() { + }); + + Map formPerms = startNode.getFormPerms(); + + List formItemVOList = objectMapper.readValue(formItems, new TypeReference>() { + }); + for (FormItemVO formItemVO : formItemVOList) { + String perm = MapUtil.getStr(formPerms, formItemVO.getId(), ProcessInstanceConstant.FormPermClass.EDIT); + formItemVO.setPerm(perm); + + // 发号器赋值 + if (StrUtil.equals(formItemVO.getType(), FormTypeEnum.SEQUENCE.getType())) { + FormItemVO.Props props = formItemVO.getProps(); + String prefix = props.getPrefix(); + String nextNo = flowSequence.nextNo(); + formItemVO.setPlaceholder(StrUtil.isNotBlank(prefix) ? prefix + nextNo : nextNo); + props.setValue(StrUtil.isNotBlank(prefix) ? prefix + nextNo : nextNo); + formItemVO.setProps(props); + } + + if (StrUtil.equals(formItemVO.getType(), FormTypeEnum.LAYOUT.getType())) { + // 明细 + Object value = formItemVO.getProps().getValue(); + List subList = Convert.toList(FormItemVO.class, value); + for (FormItemVO itemVO : subList) { + String perm1 = MapUtil.getStr(formPerms, itemVO.getId(), + ProcessInstanceConstant.FormPermClass.EDIT); + itemVO.setPerm(perm1); + } + + formItemVO.getProps().setValue(subList); + formItemVO.getProps(); + } + + } + oaForms.setFormItems(objectMapper.writeValueAsString(formItemVOList)); + + List selectUserNodeId = NodeUtil.selectUserNodeId(startNode); + + ProcessVO processVO = BeanUtil.copyProperties(oaForms, ProcessVO.class); + processVO.setSelectUserNodeId(selectUserNodeId); + + return processVO; + } + + /** + * 根据流程ID获取流程 + * @param flowId 流程ID + * @return 流程 + */ + @Override + public Process getByFlowId(String flowId) { + return this.lambdaQuery().eq(Process::getFlowId, flowId).one(); + } + + /** + * 更新流程 + * @param process 流程 + */ + @Override + public void updateByFlowId(Process process) { + this.lambdaUpdate().eq(Process::getFlowId, process.getFlowId()).update(process); + } + + /** + * 隐藏流程 + * @param flowId 流程ID + */ + @Override + public void hide(String flowId) { + this.lambdaUpdate().set(Process::getHidden, true).eq(Process::getFlowId, flowId).update(new Process()); + } + + /** + * 创建流程 + * @param process 流程 + * @return 操作结果 + */ + @SneakyThrows + @Override + public R create(Process process) { + Map map = new HashMap<>(); + map.put("process", process); + map.put("userId", SecurityUtils.getUser().getId()); + R r = flowEngineService.createFlow(map); + if (!r.isOk()) { + return R.failed(r.getMsg()); + } + String flowId = r.getData(); + NodeUser nodeUser = objectMapper.readValue(process.getAdminList(), new TypeReference>() { + }).get(0); + + // 更新流程 + if (StrUtil.isNotBlank(process.getFlowId())) { + + Process oldProcess = this.getByFlowId(process.getFlowId()); + this.hide(process.getFlowId()); + // 修改所有的管理员 + this.lambdaUpdate().set(Process::getAdminId, nodeUser.getId()) + .eq(Process::getUniqueId, oldProcess.getUniqueId()).update(new Process()); + + } + + Node startNode = objectMapper.readValue(process.getProcess(), Node.class); + + List nodeUserList = startNode.getNodeUserList(); + + StringBuilder stringBuilder = new StringBuilder(); + if (CollUtil.isNotEmpty(nodeUserList)) { + int index = 0; + + for (NodeUser user : nodeUserList) { + if (index > 0) { + stringBuilder.append(","); + } + stringBuilder.append(user.getName()); + index++; + if (index > 5) { + break; + } + + } + } + + Process p = new Process(); + p.setFlowId(flowId); + p.setName(process.getName()); + p.setLogo(process.getLogo()); + p.setSettings(process.getSettings()); + p.setGroupId(process.getGroupId()); + p.setFormItems(process.getFormItems()); + p.setProcess(process.getProcess()); + p.setRemark(process.getRemark()); + p.setSort(0); + p.setHidden(false); + p.setStop(false); + p.setAdminId(nodeUser.getId()); + p.setUniqueId(IdUtil.fastSimpleUUID()); + p.setAdminList(process.getAdminList()); + p.setRangeShow(stringBuilder.toString()); + + this.save(p); + + // 保存范围 + for (NodeUser nodeUserDto : nodeUserList) { + ProcessStarter processStarter = new ProcessStarter(); + + processStarter.setProcessId(p.getId()); + processStarter.setTypeId(nodeUserDto.getId()); + processStarter.setType(nodeUserDto.getType()); + processStarterService.save(processStarter); + } + + return R.ok(); + } + + /** + * 编辑表单 + * @param flowId 流程ID + * @param type 类型 stop using delete + * @param groupId 分组ID + * @return 操作结果 + */ + @Override + public R update(String flowId, String type, Long groupId) { + Process process = new Process(); + process.setFlowId(flowId); + process.setStop("stop".equals(type)); + process.setHidden("delete".equals(type)); + process.setGroupId(groupId); + this.updateByFlowId(process); + return R.ok(); + } + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/ProcessStarterServiceImpl.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/ProcessStarterServiceImpl.java new file mode 100644 index 0000000..68e0b62 --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/ProcessStarterServiceImpl.java @@ -0,0 +1,21 @@ +package com.pig4cloud.pigx.flow.task.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.pig4cloud.pigx.flow.task.entity.ProcessStarter; +import com.pig4cloud.pigx.flow.task.mapper.ProcessStarterMapper; +import com.pig4cloud.pigx.flow.task.service.IProcessStarterService; +import org.springframework.stereotype.Service; + +/** + *

+ * 流程发起人 服务实现类 + *

+ * + * @author Vincent + * @since 2023-05-30 + */ +@Service +public class ProcessStarterServiceImpl extends ServiceImpl + implements IProcessStarterService { + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/RemoteServiceImpl.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/RemoteServiceImpl.java new file mode 100644 index 0000000..5fc0e9a --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/RemoteServiceImpl.java @@ -0,0 +1,257 @@ +package com.pig4cloud.pigx.flow.task.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.thread.ThreadUtil; +import cn.hutool.core.util.ArrayUtil; +import com.pig4cloud.pigx.admin.api.entity.SysDept; +import com.pig4cloud.pigx.admin.api.entity.SysUser; +import com.pig4cloud.pigx.admin.api.feign.RemoteDeptService; +import com.pig4cloud.pigx.admin.api.feign.RemoteUserService; +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.flow.task.constant.NodeStatusEnum; +import com.pig4cloud.pigx.flow.task.dto.*; +import com.pig4cloud.pigx.flow.task.entity.Process; +import com.pig4cloud.pigx.flow.task.entity.ProcessCopy; +import com.pig4cloud.pigx.flow.task.entity.ProcessGroup; +import com.pig4cloud.pigx.flow.task.entity.ProcessInstanceRecord; +import com.pig4cloud.pigx.flow.task.service.*; +import com.pig4cloud.pigx.flow.task.utils.DataUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + +@Service +@Slf4j +@RequiredArgsConstructor +public class RemoteServiceImpl implements IRemoteService { + + private final IProcessInstanceRecordService processInstanceRecordService; + + private final IProcessNodeRecordService processNodeRecordService; + + private final IProcessNodeRecordAssignUserService processNodeRecordAssignUserService; + + private final IProcessInstanceService processInstanceService; + + private final IProcessCopyService processCopyService; + + private final IProcessService processService; + + private final IProcessGroupService processGroupService; + + private final RemoteUserService userService; + + private final RemoteDeptService deptService; + + /** + * 根据角色id集合查询用户id集合 + * @param roleIdList + * @return + */ + @Override + public R> queryUserIdListByRoleIdList(List roleIdList) { + return userService.getUserIdListByRoleIdList(roleIdList); + } + + /** + * 保存抄送 + * @param copyDto + * @return + */ + @Override + public R saveCC(ProcessCopyDto copyDto) { + + String processInstanceId = copyDto.getProcessInstanceId(); + + // 如果抄送是第一个节点 会出现查询不到的情况 + ThreadUtil.execute(() -> { + try { + ProcessInstanceRecord processInstanceRecord = processInstanceRecordService.lambdaQuery() + .eq(ProcessInstanceRecord::getProcessInstanceId, processInstanceId).one(); + + int index = 10; + while (index > 0 && processInstanceRecord == null) { + TimeUnit.SECONDS.sleep(5); + processInstanceRecord = processInstanceRecordService.lambdaQuery() + .eq(ProcessInstanceRecord::getProcessInstanceId, processInstanceId).one(); + index--; + } + + ProcessCopy processCopy = BeanUtil.copyProperties(copyDto, ProcessCopy.class); + processCopy.setGroupId(processInstanceRecord.getGroupId()); + processCopy.setGroupName(processInstanceRecord.getGroupName()); + processCopy.setProcessName(processInstanceRecord.getName()); + processCopy.setStartTime(processInstanceRecord.getCreateTime()); + + processCopyService.save(processCopy); + } + catch (Exception e) { + log.error("Error:", e); + } + }); + + return R.ok(); + } + + /** + * 检查是否是所有的父级 + * @param checkParentDto + * @return + */ + @Override + public R checkIsAllParent(CheckParentDto checkParentDto) { + + Long parentId = checkParentDto.getParentId(); + List deptIdList = checkParentDto.getDeptIdList(); + // 查询子级包括自己 + List allDept = deptService.getAllDept().getData(); + List childrenDeptList = DataUtil.selectChildrenByDept(parentId, allDept); + + List childrenDeptIdList = childrenDeptList.stream().map(SysDept::getDeptId).collect(Collectors.toList()); + childrenDeptIdList.remove(parentId); + + List remainIdList = CollUtil.removeAny(deptIdList, ArrayUtil.toArray(childrenDeptIdList, Long.class)); + + return R.ok(remainIdList.isEmpty()); + } + + /** + * 根据部门id集合查询用户id集合 + * @param depIdList + * @return + */ + @Override + public R> queryUserIdListByDepIdList(List depIdList) { + List list = userService.getUserIdListByDeptIdList(depIdList).getData().stream().map(SysUser::getUserId) + .collect(Collectors.toList()); + return R.ok(list); + } + + /** + * 检查是否是所有的子级 + * @param checkChildDto + * @return + */ + @Override + public R checkIsAllChild(CheckChildDto checkChildDto) { + Long childId = checkChildDto.getChildId(); + List deptIdList = checkChildDto.getDeptIdList(); + // 查询父级包括自己 + List allDept = deptService.getAllDept().getData(); + List parentDeptList = DataUtil.selectParentByDept(childId, allDept); + + List parentDeptIdList = parentDeptList.stream().map(SysDept::getDeptId).collect(Collectors.toList()); + parentDeptIdList.remove(childId); + + List remainIdList = CollUtil.removeAny(deptIdList, ArrayUtil.toArray(parentDeptIdList, Long.class)); + + return R.ok(remainIdList.isEmpty()); + } + + /** + * 获取用户的信息-包括扩展字段 + * @param userId + * @return + */ + @Override + public R> queryUserAllInfo(long userId) { + SysUser sysUser = userService.getUserById(userId).getData(); + return R.ok(BeanUtil.beanToMap(sysUser)); + } + + /** + * 开始节点事件 + * @param recordParamDto + * @return + */ + @Override + public R startNodeEvent(ProcessNodeRecordParamDto recordParamDto) { + return processNodeRecordService.start(recordParamDto); + } + + /** + * 流程创建了 + * @param processInstanceRecordParamDto + * @return + */ + @Override + public R createProcessEvent(ProcessInstanceRecordParamDto processInstanceRecordParamDto) { + ProcessInstanceRecord entity = BeanUtil.copyProperties(processInstanceRecordParamDto, + ProcessInstanceRecord.class); + + Process oaForms = processService.getByFlowId(processInstanceRecordParamDto.getFlowId()); + + ProcessGroup oaFormGroups = processGroupService.getById(oaForms.getGroupId()); + + entity.setName(oaForms.getName()); + entity.setLogo(oaForms.getLogo()); + entity.setUserId(processInstanceRecordParamDto.getUserId()); + entity.setFlowId(processInstanceRecordParamDto.getFlowId()); + entity.setProcessInstanceId(processInstanceRecordParamDto.getProcessInstanceId()); + entity.setGroupId(oaFormGroups.getId()); + entity.setGroupName(oaFormGroups.getGroupName()); + entity.setStatus(NodeStatusEnum.JXZ.getCode()); + + processInstanceRecordService.save(entity); + + return R.ok(); + } + + /** + * 完成节点事件 + * @param recordParamDto + * @return + */ + @Override + public R endNodeEvent(ProcessNodeRecordParamDto recordParamDto) { + return processNodeRecordService.complete(recordParamDto); + } + + /** + * 开始设置执行人 + * @param processNodeRecordAssignUserParamDto + * @return + */ + @Override + public R startAssignUser(ProcessNodeRecordAssignUserParamDto processNodeRecordAssignUserParamDto) { + return processNodeRecordAssignUserService.addAssignUser(processNodeRecordAssignUserParamDto); + } + + /** + * 任务结束事件 + * @param processNodeRecordAssignUserParamDto + * @return + */ + @Override + public R taskEndEvent(ProcessNodeRecordAssignUserParamDto processNodeRecordAssignUserParamDto) { + return processNodeRecordAssignUserService.completeTaskEvent(processNodeRecordAssignUserParamDto); + } + + /** + * 实例结束 + * @param processInstanceId + * @return + */ + @Override + public R endProcess(String processInstanceId) { + return processInstanceService.end(processInstanceId); + } + + /** + * 查询流程管理员 + * @param flowId + * @return + */ + @Override + public R queryProcessAdmin(String flowId) { + Process process = processService.getByFlowId(flowId); + return R.ok(process.getAdminId()); + } + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/TaskServiceImpl.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/TaskServiceImpl.java new file mode 100644 index 0000000..a3a0db6 --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/TaskServiceImpl.java @@ -0,0 +1,334 @@ +package com.pig4cloud.pigx.flow.task.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.lang.Dict; +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.common.security.util.SecurityUtils; +import com.pig4cloud.pigx.flow.task.api.feign.RemoteFlowEngineService; +import com.pig4cloud.pigx.flow.task.constant.FormTypeEnum; +import com.pig4cloud.pigx.flow.task.constant.NodeStatusEnum; +import com.pig4cloud.pigx.flow.task.constant.ProcessInstanceConstant; +import com.pig4cloud.pigx.flow.task.dto.IndexPageStatistics; +import com.pig4cloud.pigx.flow.task.dto.Node; +import com.pig4cloud.pigx.flow.task.dto.TaskParamDto; +import com.pig4cloud.pigx.flow.task.dto.TaskResultDto; +import com.pig4cloud.pigx.flow.task.entity.Process; +import com.pig4cloud.pigx.flow.task.entity.ProcessCopy; +import com.pig4cloud.pigx.flow.task.entity.ProcessInstanceRecord; +import com.pig4cloud.pigx.flow.task.entity.ProcessNodeRecordAssignUser; +import com.pig4cloud.pigx.flow.task.service.*; +import com.pig4cloud.pigx.flow.task.vo.FormItemVO; +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +@Service +@Slf4j +@RequiredArgsConstructor +public class TaskServiceImpl implements ITaskService { + + private final RemoteFlowEngineService flowEngineService; + + private final IProcessService processService; + + private final IProcessCopyService processCopyService; + + private final IProcessNodeDataService nodeDataService; + + private final IProcessNodeRecordAssignUserService processNodeRecordAssignUserService; + + private final IProcessInstanceRecordService processInstanceRecordService; + + private final ObjectMapper objectMapper; + + /** + * 查询首页数据看板 + * @return + */ + @Override + public R queryTaskData() { + R indexPageStatisticsR = flowEngineService + .querySimpleData(SecurityUtils.getUser().getId()); + + // 获取抄送任务 + Long copyCount = processCopyService.lambdaQuery().eq(ProcessCopy::getUserId, SecurityUtils.getUser().getId()) + .count(); + indexPageStatisticsR.getData().setCopyNum(copyCount); + return indexPageStatisticsR; + } + + /** + * 查询任务 + * @param taskId + * @param view + * @return + */ + @SneakyThrows + @Override + public R queryTask(String taskId, boolean view) { + + long userId = SecurityUtils.getUser().getId(); + + R r = flowEngineService.queryTask(taskId, userId); + + if (!r.isOk()) { + return R.failed(r.getMsg()); + } + + TaskResultDto taskResultDto = r.getData(); + + // 变量 + Map paramMap = taskResultDto.getVariableAll(); + // 是否是当前活动任务 + Boolean currentTask = taskResultDto.getCurrentTask(); + if (!currentTask) { + ProcessNodeRecordAssignUser processNodeRecordAssignUser = processNodeRecordAssignUserService.lambdaQuery() + .eq(ProcessNodeRecordAssignUser::getTaskId, taskId) + .eq(ProcessNodeRecordAssignUser::getUserId, userId) + .eq(ProcessNodeRecordAssignUser::getStatus, NodeStatusEnum.YJS.getCode()).last("limit 1") + .orderByDesc(ProcessNodeRecordAssignUser::getEndTime).one(); + + if (processNodeRecordAssignUser != null) { + String data = processNodeRecordAssignUser.getData(); + if (StrUtil.isNotBlank(data)) { + Map collect = objectMapper.readValue(data, + new TypeReference>() { + }); + paramMap.putAll(collect); + + } + } + + } + + // 当前节点数据 + Node node = nodeDataService.getNodeData(taskResultDto.getFlowId(), taskResultDto.getNodeId()).getData(); + Map formPerms = node.getFormPerms(); + + Process oaForms = processService.getByFlowId(taskResultDto.getFlowId()); + if (oaForms == null) { + return R.failed("流程不存在"); + } + + List formItemVOList = JSONUtil.toList(oaForms.getFormItems(), FormItemVO.class); + for (FormItemVO formItemVO : formItemVOList) { + + String id = formItemVO.getId(); + + String perm = formPerms.get(id); + + if (StrUtil.isNotBlank(perm)) { + + formItemVO.setPerm(view ? (ProcessInstanceConstant.FormPermClass.EDIT.equals(perm) + ? ProcessInstanceConstant.FormPermClass.READ : perm) : perm); + + } + else { + formItemVO.setPerm(ProcessInstanceConstant.FormPermClass.HIDE); + } + + if (formItemVO.getType().equals(FormTypeEnum.LAYOUT.getType())) { + // 明细 + + List> subParamList = MapUtil.get(paramMap, id, + new cn.hutool.core.lang.TypeReference>>() { + }); + + Object value = formItemVO.getProps().getValue(); + + List> l = new ArrayList<>(); + for (Map map : subParamList) { + List subItemList = Convert.toList(FormItemVO.class, value); + for (FormItemVO itemVO : subItemList) { + itemVO.getProps().setValue(map.get(itemVO.getId())); + + String permSub = formPerms.get(itemVO.getId()); + if (StrUtil.isNotBlank(permSub)) { + itemVO.setPerm(view ? (ProcessInstanceConstant.FormPermClass.EDIT.equals(permSub) + ? ProcessInstanceConstant.FormPermClass.READ : permSub) : permSub); + + } + else { + itemVO.setPerm(ProcessInstanceConstant.FormPermClass.HIDE); + } + + } + l.add(subItemList); + } + formItemVO.getProps().setValue(l); + { + List subItemList = Convert.toList(FormItemVO.class, value); + for (FormItemVO itemVO : subItemList) { + + String permSub = formPerms.get(itemVO.getId()); + if (StrUtil.isNotBlank(permSub)) { + + itemVO.setPerm(permSub); + + } + else { + itemVO.setPerm(ProcessInstanceConstant.FormPermClass.HIDE); + } + + } + formItemVO.getProps().setOriForm(subItemList); + + } + + } + else { + formItemVO.getProps().setValue(paramMap.get(id)); + + } + + } + Dict set = Dict.create().set("processInstanceId", taskResultDto.getProcessInstanceId()) + .set("node", taskResultDto.getTaskNode()).set("process", oaForms.getProcess()) + .set("delegateAgain", taskResultDto.getDelegate()) + .set("delegationTask", StrUtil.equals(taskResultDto.getDelegationState(), "PENDING")) + + .set("formItems", formItemVOList); + + return R.ok(set); + } + + /** + * 完成任务 + * @param taskParamDto + * @return + */ + @Override + public R completeTask(TaskParamDto taskParamDto) { + long userId = SecurityUtils.getUser().getId(); + taskParamDto.setUserId(String.valueOf(userId)); + + R r = flowEngineService.completeTask(taskParamDto); + + if (!r.isOk()) { + return R.failed(r.getMsg()); + } + + return R.ok(); + } + + /** + * 前加签 + * @param taskParamDto + * @return + */ + @Transactional + @Override + public R delegateTask(TaskParamDto taskParamDto) { + + taskParamDto.setUserId(SecurityUtils.getUser().getId().toString()); + + R r = flowEngineService.delegateTask(taskParamDto); + if (!r.isOk()) { + return R.failed(r.getMsg()); + } + + return R.ok(); + } + + /** + * 加签完成任务 + * @param taskParamDto + * @return + */ + @Override + public R resolveTask(TaskParamDto taskParamDto) { + R r = flowEngineService.resolveTask(taskParamDto); + if (!r.isOk()) { + return R.failed(r.getMsg()); + } + + return R.ok(); + } + + /** + * 设置执行人 + * @param taskParamDto + * @return + */ + @Override + public R setAssignee(TaskParamDto taskParamDto) { + taskParamDto.setUserId(SecurityUtils.getUser().getId().toString()); + R r = flowEngineService.setAssignee(taskParamDto); + if (!r.isOk()) { + return R.failed(r.getMsg()); + } + + return R.ok(); + } + + /** + * 结束流程 + * @param taskParamDto + * @return + */ + @Override + public R stopProcessInstance(TaskParamDto taskParamDto) { + + String processInstanceId = taskParamDto.getProcessInstanceId(); + + List allStopProcessInstanceIdList = getAllStopProcessInstanceIdList(processInstanceId); + CollUtil.reverse(allStopProcessInstanceIdList); + allStopProcessInstanceIdList.add(processInstanceId); + + taskParamDto.setProcessInstanceIdList(allStopProcessInstanceIdList); + taskParamDto.setUserId(SecurityUtils.getUser().getId().toString()); + R r = flowEngineService.stopProcessInstance(taskParamDto); + + if (!r.isOk()) { + return R.failed(r.getMsg()); + } + + return R.ok(); + } + + /** + * 退回 + * @param taskParamDto + * @return + */ + @Override + public R back(TaskParamDto taskParamDto) { + taskParamDto.setUserId(SecurityUtils.getUser().getId().toString()); + R r = flowEngineService.back(taskParamDto); + if (!r.isOk()) { + return R.failed(r.getMsg()); + } + + return R.ok(); + } + + private List getAllStopProcessInstanceIdList(String processInstanceId) { + List list = processInstanceRecordService.lambdaQuery() + .eq(ProcessInstanceRecord::getParentProcessInstanceId, processInstanceId).list(); + + List collect = list.stream().map(w -> w.getProcessInstanceId()).collect(Collectors.toList()); + + for (ProcessInstanceRecord processInstanceRecord : list) { + List allStopProcessInstanceIdList = getAllStopProcessInstanceIdList( + processInstanceRecord.getProcessInstanceId()); + + collect.addAll(allStopProcessInstanceIdList); + + } + return collect; + } + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/utils/DataUtil.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/utils/DataUtil.java new file mode 100644 index 0000000..9f0d1e4 --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/utils/DataUtil.java @@ -0,0 +1,79 @@ +package com.pig4cloud.pigx.flow.task.utils; + +import cn.hutool.core.collection.CollUtil; +import com.pig4cloud.pigx.admin.api.entity.SysDept; +import com.pig4cloud.pigx.admin.api.entity.SysMenu; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +public class DataUtil { + + /** + * 根据当前部门id,向上查找所有的部门 + * @param deptId + * @param allDeptList + * @return 返回包括自己部门在内的所有父级部门 + */ + public static List selectParentByDept(long deptId, List allDeptList) { + List list = new ArrayList<>(); + SysDept dept = allDeptList.stream().filter(w -> w.getDeptId() == deptId).findAny().orElse(null); + if (dept == null || dept.getParentId() == null) { + return list; + } + Long parentId = dept.getParentId(); + List depts = selectParentByDept(parentId, allDeptList); + list.add(dept); + list.addAll(depts); + return list; + + } + + /** + * 根据当前部门id,向下查找所有的部门 + * @param deptId + * @param allDeptList + * @return 返回包括自己部门在内的所有子级部门 + */ + public static List selectChildrenByDept(long deptId, List allDeptList) { + List list = new ArrayList<>(); + list.add(allDeptList.stream().filter(w -> w.getDeptId() == deptId).findFirst().get()); + + List collect = allDeptList.stream().filter(w -> w.getParentId() == deptId) + .collect(Collectors.toList()); + if (CollUtil.isEmpty(collect)) { + return list; + } + for (SysDept dept : collect) { + List depts = selectChildrenByDept(dept.getDeptId(), allDeptList); + list.addAll(depts); + } + return list; + + } + + /** + * 根据当前菜单id,向下查找所有的菜单 + * @param menuId + * @param allMenuList + * @return 返回包括自己在内的所有子级菜单 + */ + public static List selectChildrenByMenu(long menuId, List allMenuList) { + List list = new ArrayList<>(); + list.add(allMenuList.stream().filter(w -> w.getMenuId() == menuId).findFirst().get()); + + List collect = allMenuList.stream().filter(w -> w.getParentId() == menuId) + .collect(Collectors.toList()); + if (CollUtil.isEmpty(collect)) { + return list; + } + for (SysMenu dept : collect) { + List depts = selectChildrenByMenu(dept.getMenuId(), allMenuList); + list.addAll(depts); + } + return list; + + } + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/utils/NodeFormatUtil.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/utils/NodeFormatUtil.java new file mode 100644 index 0000000..f3ffa8a --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/utils/NodeFormatUtil.java @@ -0,0 +1,296 @@ +package com.pig4cloud.pigx.flow.task.utils; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.StrUtil; +import cn.hutool.extra.spring.SpringUtil; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.pig4cloud.pigx.admin.api.entity.SysUser; +import com.pig4cloud.pigx.admin.api.feign.RemoteUserService; +import com.pig4cloud.pigx.common.security.util.SecurityUtils; +import com.pig4cloud.pigx.flow.task.constant.NodeStatusEnum; +import com.pig4cloud.pigx.flow.task.constant.NodeTypeEnum; +import com.pig4cloud.pigx.flow.task.constant.NodeUserTypeEnum; +import com.pig4cloud.pigx.flow.task.constant.ProcessInstanceConstant; +import com.pig4cloud.pigx.flow.task.dto.Node; +import com.pig4cloud.pigx.flow.task.dto.NodeUser; +import com.pig4cloud.pigx.flow.task.entity.ProcessInstanceRecord; +import com.pig4cloud.pigx.flow.task.entity.ProcessNodeRecordAssignUser; +import com.pig4cloud.pigx.flow.task.service.IProcessInstanceRecordService; +import com.pig4cloud.pigx.flow.task.service.IProcessNodeRecordAssignUserService; +import com.pig4cloud.pigx.flow.task.service.IRemoteService; +import com.pig4cloud.pigx.flow.task.vo.NodeVo; +import com.pig4cloud.pigx.flow.task.vo.UserVo; +import lombok.SneakyThrows; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 节点格式化显示工具 + */ +public class NodeFormatUtil { + + /** + * 格式化流程节点显示 + * @param node + * @param completeNodeSet + * @param continueNodeSet + * @param processInstanceId + * @param paramMap + */ + @SneakyThrows + public static List formatProcessNodeShow(Node node, Set completeNodeSet, + Set continueNodeSet, String processInstanceId, Map paramMap) { + List list = new ArrayList<>(); + + if (!NodeUtil.isNode(node)) { + return list; + } + + String name = node.getName(); + Integer type = node.getType(); + + // SELF_SELECT + + NodeVo nodeVo = new NodeVo(); + nodeVo.setId(node.getId()); + nodeVo.setName(name); + nodeVo.setType(type); + nodeVo.setStatus(NodeStatusEnum.WKS.getCode()); + if (completeNodeSet.contains(node.getId())) { + nodeVo.setStatus(NodeStatusEnum.YJS.getCode()); + + } + if (continueNodeSet.contains(node.getId())) { + nodeVo.setStatus(NodeStatusEnum.JXZ.getCode()); + + } + + { + + nodeVo.setPlaceholder(node.getPlaceHolder()); + + } + + List userVoList = new ArrayList<>(); + if (type == NodeTypeEnum.APPROVAL.getValue().intValue()) { + + Integer assignedType = node.getAssignedType(); + + boolean selfSelect = assignedType == ProcessInstanceConstant.AssignedTypeClass.SELF_SELECT; + nodeVo.setSelectUser(selfSelect); + if (selfSelect) { + nodeVo.setMultiple(node.getMultiple()); + } + + // 用户列表 + if (StrUtil.isNotBlank(processInstanceId)) { + IProcessNodeRecordAssignUserService processNodeRecordAssignUserService = SpringUtil + .getBean(IProcessNodeRecordAssignUserService.class); + List processNodeRecordAssignUserList = processNodeRecordAssignUserService + .lambdaQuery().eq(ProcessNodeRecordAssignUser::getNodeId, node.getId()) + .eq(ProcessNodeRecordAssignUser::getProcessInstanceId, processInstanceId) + .orderByAsc(ProcessNodeRecordAssignUser::getCreateTime).list(); + Map> map = processNodeRecordAssignUserList.stream() + .collect(Collectors.groupingBy(ProcessNodeRecordAssignUser::getTaskId)); + + for (Map.Entry> entry : map.entrySet()) { + List value = entry.getValue(); + List collect = value.stream().map(w -> { + UserVo userVo = buildUser(Long.parseLong(w.getUserId())); + userVo.setShowTime(w.getEndTime()); + userVo.setApproveDesc(w.getApproveDesc()); + userVo.setStatus(w.getStatus()); + userVo.setOperType(w.getTaskType()); + return userVo; + }).collect(Collectors.toList()); + userVoList.addAll(collect); + } + + if (processNodeRecordAssignUserList.isEmpty()) { + if (assignedType == ProcessInstanceConstant.AssignedTypeClass.SELF) { + // 发起人自己 + userVoList.addAll(CollUtil.newArrayList(buildRootUser(processInstanceId))); + } + if (assignedType == ProcessInstanceConstant.AssignedTypeClass.SELF_SELECT) { + // 发起人自选 + Object variable = paramMap.get(StrUtil.format("{}_assignee_select", node.getId())); + + ObjectMapper objectMapper = SpringUtil.getBean(ObjectMapper.class); + List nodeUserDtos = objectMapper.readValue(objectMapper.writeValueAsString(variable), + new TypeReference>() { + }); + + List collect = nodeUserDtos.stream().map(w -> Long.valueOf(w.getId())) + .collect(Collectors.toList()); + for (Long aLong : collect) { + UserVo userVo = buildUser(aLong); + userVoList.addAll(CollUtil.newArrayList(userVo)); + } + } + } + + } + else if (assignedType == ProcessInstanceConstant.AssignedTypeClass.USER) { + // 指定用户 + + List nodeUserList = node.getNodeUserList(); + List tempList = buildUser(nodeUserList); + userVoList.addAll(tempList); + + } + else if (assignedType == ProcessInstanceConstant.AssignedTypeClass.FORM_USER) { + // 表单人员 + String formUser = node.getFormUserId(); + + Object o = paramMap.get(formUser); + if (o != null) { + ObjectMapper objectMapper = SpringUtil.getBean(ObjectMapper.class); + String jsonString = objectMapper.writeValueAsString(o); + if (StrUtil.isNotBlank(jsonString)) { + List nodeUserDtoList = objectMapper.readValue(jsonString, + new TypeReference>() { + }); + List userIdList = nodeUserDtoList.stream().map(NodeUser::getId) + .collect(Collectors.toList()); + for (Long aLong : userIdList) { + userVoList.addAll(CollUtil.newArrayList(buildUser(aLong))); + } + } + } + + } + else if (assignedType == ProcessInstanceConstant.AssignedTypeClass.SELF) { + // 发起人自己 + userVoList.addAll(CollUtil.newArrayList(buildUser(SecurityUtils.getUser().getId()))); + } + + } + else if (Objects.equals(node.getType(), NodeTypeEnum.ROOT.getValue())) { + // 发起节点 + if (StrUtil.isBlank(processInstanceId)) { + UserVo userVo = buildUser(SecurityUtils.getUser().getId()); + userVoList.addAll(CollUtil.newArrayList(userVo)); + } + else { + + IProcessInstanceRecordService processInstanceRecordService = SpringUtil + .getBean(IProcessInstanceRecordService.class); + ProcessInstanceRecord processInstanceRecord = processInstanceRecordService.lambdaQuery() + .eq(ProcessInstanceRecord::getProcessInstanceId, processInstanceId).one(); + + UserVo userVo = buildRootUser(processInstanceId); + userVo.setShowTime(processInstanceRecord.getCreateTime()); + userVo.setStatus(NodeStatusEnum.YJS.getCode()); + userVoList.addAll(CollUtil.newArrayList(userVo)); + + } + } + else if (node.getType() == NodeTypeEnum.CC.getValue()) { + // 抄送节点 + + List nodeUserList = node.getNodeUserList(); + + List tempList = buildUser(nodeUserList); + userVoList.addAll(tempList); + + } + nodeVo.setUserVoList(userVoList); + + List branchList = new ArrayList<>(); + + if (type == NodeTypeEnum.EXCLUSIVE_GATEWAY.getValue().intValue() + || type == NodeTypeEnum.PARALLEL_GATEWAY.getValue().intValue()) { + // 条件分支 + List branchs = node.getConditionNodes(); + + for (Node branch : branchs) { + Node children = branch.getChildren(); + List processNodeShowDtos = formatProcessNodeShow(children, completeNodeSet, continueNodeSet, + processInstanceId, paramMap); + + NodeVo p = new NodeVo(); + p.setChildren(processNodeShowDtos); + + p.setPlaceholder(branch.getPlaceHolder()); + branchList.add(p); + } + } + nodeVo.setBranch(branchList); + + list.add(nodeVo); + + List next = formatProcessNodeShow(node.getChildren(), completeNodeSet, continueNodeSet, + processInstanceId, paramMap); + list.addAll(next); + + return list; + } + + /** + * 根据实例id + * @param processInstanceId + * @return + */ + private static UserVo buildRootUser(String processInstanceId) { + + IProcessInstanceRecordService processInstanceRecordService = SpringUtil + .getBean(IProcessInstanceRecordService.class); + ProcessInstanceRecord processInstanceRecord = processInstanceRecordService.lambdaQuery() + .eq(ProcessInstanceRecord::getProcessInstanceId, processInstanceId).one(); + Long userId = processInstanceRecord.getUserId(); + UserVo userVo = buildUser(userId); + return userVo; + } + + /** + * 根据用户id + * @param userId + * @return + */ + private static UserVo buildUser(long userId) { + RemoteUserService userService = SpringUtil.getBean(RemoteUserService.class); + SysUser user = userService.getUserById(userId).getData(); + if (user == null) { + return null; + } + + return UserVo.builder().id(userId).name(user.getName()).avatar(user.getAvatar()).build(); + } + + private static List buildUser(List nodeUserList) { + List userVoList = new ArrayList<>(); + // 用户id + List userIdList = nodeUserList.stream() + .filter(w -> StrUtil.equals(w.getType(), NodeUserTypeEnum.USER.getKey())) + .map(w -> Convert.toLong(w.getId())).collect(Collectors.toList()); + // 部门id + List deptIdList = nodeUserList.stream() + .filter(w -> StrUtil.equals(w.getType(), NodeUserTypeEnum.DEPT.getKey())) + .map(w -> Convert.toLong(w.getId())).collect(Collectors.toList()); + + if (CollUtil.isNotEmpty(deptIdList)) { + + IRemoteService iRemoteService = SpringUtil.getBean(IRemoteService.class); + + List data = iRemoteService.queryUserIdListByDepIdList(deptIdList).getData(); + + if (CollUtil.isNotEmpty(data)) { + for (long datum : data) { + if (!userIdList.contains(datum)) { + userIdList.add(datum); + } + } + } + } + { + for (Long aLong : userIdList) { + userVoList.addAll(CollUtil.newArrayList(buildUser(aLong))); + } + } + return userVoList; + } + +} diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/resources/application.yml b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/resources/application.yml new file mode 100644 index 0000000..382724b --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/resources/application.yml @@ -0,0 +1,18 @@ +server: + port: 9030 + +spring: + application: + name: @artifactId@ + cloud: + nacos: + username: @nacos.username@ + password: @nacos.password@ + discovery: + server-addr: ${NACOS_HOST:pigx-register}:${NACOS_PORT:8848} + config: + server-addr: ${spring.cloud.nacos.discovery.server-addr} + config: + import: + - optional:nacos:application-@profiles.active@.yml + - optional:nacos:${spring.application.name}-@profiles.active@.yml diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/resources/logback-spring.xml b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..7b165fe --- /dev/null +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/resources/logback-spring.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + + + + + + ${log.path}/debug.log + + ${log.path}/%d{yyyy-MM, aux}/debug.%d{yyyy-MM-dd}.%i.log.gz + 50MB + 30 + + + %date [%thread] %-5level [%logger{50}] %file:%line - %msg%n + + + + + + ${log.path}/error.log + + ${log.path}/%d{yyyy-MM}/error.%d{yyyy-MM-dd}.%i.log.gz + 50MB + 30 + + + %date [%thread] %-5level [%logger{50}] %file:%line - %msg%n + + + ERROR + + + + + + + + + + + + + + + + + diff --git a/pigx-flow/pigx-flow-task/pom.xml b/pigx-flow/pigx-flow-task/pom.xml new file mode 100644 index 0000000..949900c --- /dev/null +++ b/pigx-flow/pigx-flow-task/pom.xml @@ -0,0 +1,22 @@ + + + + 4.0.0 + + + com.pig4cloud + pigx-flow + 5.2.0 + + + pigx-flow-task + flowable 工作流业务处理模块 + pom + + + + pigx-flow-task-api + pigx-flow-task-biz + + diff --git a/pigx-flow/pom.xml b/pigx-flow/pom.xml new file mode 100644 index 0000000..5c3f022 --- /dev/null +++ b/pigx-flow/pom.xml @@ -0,0 +1,19 @@ + + + 4.0.0 + + com.pig4cloud + pigx + 5.2.0 + + + pigx-flow + pigx 工作流 + pom + + + pigx-flow-engine + pigx-flow-task + + diff --git a/pigx-register/Dockerfile b/pigx-register/Dockerfile new file mode 100644 index 0000000..b7bb89d --- /dev/null +++ b/pigx-register/Dockerfile @@ -0,0 +1,15 @@ +FROM moxm/java:1.8-full + +RUN mkdir -p /pigx-register + +WORKDIR /pigx-register + +ARG JAR_FILE=target/pigx-register.jar + +COPY ${JAR_FILE} app.jar + +EXPOSE 8848 + +ENV TZ=Asia/Shanghai JAVA_OPTS="-Xms128m -Xmx256m -Djava.security.egd=file:/dev/./urandom" + +CMD sleep 30; java $JAVA_OPTS -jar app.jar diff --git a/pigx-register/pom.xml b/pigx-register/pom.xml new file mode 100644 index 0000000..23672c3 --- /dev/null +++ b/pigx-register/pom.xml @@ -0,0 +1,113 @@ + + + + 4.0.0 + + com.pig4cloud + pigx + 5.2.0 + + + pigx-register + jar + pigx-register + nacos 注册配置中心 + + + 2.2.4-OEM + + + + + io.springboot.nacos + nacos-config + ${nacos.version} + + + org.apache.tomcat.embed + tomcat-embed-jasper + + + + io.springboot.nacos + nacos-naming + ${nacos.version} + + + + io.springboot.nacos + nacos-istio + ${nacos.version} + + + + io.springboot.nacos + nacos-plugin-default-impl + ${nacos.version} + + + + io.springboot.nacos + nacos-prometheus + ${nacos.version} + + + + org.springframework.boot + spring-boot-starter-security + + + + cn.hutool + hutool-system + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + io.fabric8 + docker-maven-plugin + + + + + src/main/resources + true + + **/*.woff + **/*.woff2 + **/*.ttf + **/*.eot + + + + src/main/resources + false + + **/*.woff + **/*.woff2 + **/*.ttf + **/*.eot + + + + + diff --git a/pigx-register/src/main/java/com/alibaba/nacos/PigxNacosApplication.java b/pigx-register/src/main/java/com/alibaba/nacos/PigxNacosApplication.java new file mode 100644 index 0000000..0db538e --- /dev/null +++ b/pigx-register/src/main/java/com/alibaba/nacos/PigxNacosApplication.java @@ -0,0 +1,53 @@ +/* + * Copyright 1999-2018 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.nacos; + +import com.alibaba.nacos.config.ConfigConstants; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.scheduling.annotation.EnableScheduling; + +/** + * @author nacos + *

+ * nacos console 源码运行,方便开发 生产从官网下载zip最新版集群配置运行 + */ +@Slf4j +@EnableScheduling +@SpringBootApplication +public class PigxNacosApplication { + + public static void main(String[] args) { + if (initEnv()) { + SpringApplication.run(PigxNacosApplication.class, args); + } + } + + /** + * 初始化运行环境 + */ + private static boolean initEnv() { + System.setProperty(ConfigConstants.STANDALONE_MODE, "true"); + System.setProperty(ConfigConstants.AUTH_ENABLED, "true"); + System.setProperty(ConfigConstants.LOG_BASEDIR, "logs"); + System.setProperty(ConfigConstants.LOG_ENABLED, "false"); + System.setProperty(ConfigConstants.NACOS_CONTEXT_PATH, "/nacos"); + return true; + } + +} diff --git a/pigx-register/src/main/java/com/alibaba/nacos/config/ConfigConstants.java b/pigx-register/src/main/java/com/alibaba/nacos/config/ConfigConstants.java new file mode 100644 index 0000000..c6d4620 --- /dev/null +++ b/pigx-register/src/main/java/com/alibaba/nacos/config/ConfigConstants.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.alibaba.nacos.config; + +/** + * @author lengleng + * @date 2019-10-31 + *

+ * 覆盖nacos 默认配置 + */ +public interface ConfigConstants { + + /** + * The System property name of Standalone mode + */ + String STANDALONE_MODE = "nacos.standalone"; + + /** + * 是否开启认证 + */ + String AUTH_ENABLED = "nacos.core.auth.enabled"; + + /** + * 日志目录 + */ + String LOG_BASEDIR = "server.tomcat.basedir"; + + /** + * access_log日志开关 + */ + String LOG_ENABLED = "server.tomcat.accesslog.enabled"; + + /** + * 路径 nacos context path + */ + String NACOS_CONTEXT_PATH = "server.servlet.contextPath"; + +} diff --git a/pigx-register/src/main/java/com/alibaba/nacos/config/ConsoleConfig.java b/pigx-register/src/main/java/com/alibaba/nacos/config/ConsoleConfig.java new file mode 100644 index 0000000..b200b85 --- /dev/null +++ b/pigx-register/src/main/java/com/alibaba/nacos/config/ConsoleConfig.java @@ -0,0 +1,77 @@ +/* + * Copyright 1999-2018 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.nacos.config; + +import com.alibaba.nacos.core.code.ControllerMethodsCache; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.PropertySource; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.stereotype.Component; +import org.springframework.web.cors.CorsConfiguration; +import org.springframework.web.cors.UrlBasedCorsConfigurationSource; +import org.springframework.web.filter.CorsFilter; + +import javax.annotation.PostConstruct; +import java.time.ZoneId; + +/** + * Console config. + * + * @author yshen + * @author nkorange + * @since 1.2.0 + */ +@Component +@EnableScheduling +@PropertySource("/application.yml") +public class ConsoleConfig { + + @Autowired + private ControllerMethodsCache methodsCache; + + /** + * Init. + */ + @PostConstruct + public void init() { + methodsCache.initClassMethod("com.alibaba.nacos.core.controller"); + methodsCache.initClassMethod("com.alibaba.nacos.naming.controllers"); + methodsCache.initClassMethod("com.alibaba.nacos.config.server.controller"); + methodsCache.initClassMethod("com.alibaba.nacos.controller"); + } + + @Bean + public CorsFilter corsFilter() { + CorsConfiguration config = new CorsConfiguration(); + config.setAllowCredentials(true); + config.addAllowedOrigin("*"); + config.addAllowedHeader("*"); + config.setMaxAge(18000L); + config.addAllowedMethod("*"); + UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); + source.registerCorsConfiguration("/**", config); + return new CorsFilter(source); + } + + @Bean + public Jackson2ObjectMapperBuilderCustomizer jacksonObjectMapperCustomization() { + return jacksonObjectMapperBuilder -> jacksonObjectMapperBuilder.timeZone(ZoneId.systemDefault().toString()); + } + +} diff --git a/pigx-register/src/main/java/com/alibaba/nacos/console/controller/HealthController.java b/pigx-register/src/main/java/com/alibaba/nacos/console/controller/HealthController.java new file mode 100644 index 0000000..018c636 --- /dev/null +++ b/pigx-register/src/main/java/com/alibaba/nacos/console/controller/HealthController.java @@ -0,0 +1,110 @@ +/* + * Copyright 1999-2018 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.nacos.console.controller; + +import com.alibaba.nacos.config.server.service.repository.ConfigInfoPersistService; +import com.alibaba.nacos.naming.controllers.OperatorController; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.http.HttpServletRequest; + +/** + * Health Controller. + * + * @author hxy1991 + */ +@RestController("consoleHealth") +@RequestMapping("/v1/console/health") +public class HealthController { + + private static final Logger LOGGER = LoggerFactory.getLogger(HealthController.class); + + private final ConfigInfoPersistService configInfoPersistService; + + private final OperatorController apiCommands; + + @Autowired + public HealthController(ConfigInfoPersistService configInfoPersistService, OperatorController apiCommands) { + this.configInfoPersistService = configInfoPersistService; + this.apiCommands = apiCommands; + } + + /** + * Whether the Nacos is in broken states or not, and cannot recover except by being restarted. + * + * @return HTTP code equal to 200 indicates that Nacos is in right states. HTTP code equal to 500 indicates that + * Nacos is in broken states. + */ + @GetMapping("/liveness") + public ResponseEntity liveness() { + return ResponseEntity.ok().body("OK"); + } + + /** + * Ready to receive the request or not. + * + * @return HTTP code equal to 200 indicates that Nacos is ready. HTTP code equal to 500 indicates that Nacos is not + * ready. + */ + @GetMapping("/readiness") + public ResponseEntity readiness(HttpServletRequest request) { + boolean isConfigReadiness = isConfigReadiness(); + boolean isNamingReadiness = isNamingReadiness(request); + + if (isConfigReadiness && isNamingReadiness) { + return ResponseEntity.ok().body("OK"); + } + + if (!isConfigReadiness && !isNamingReadiness) { + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Config and Naming are not in readiness"); + } + + if (!isConfigReadiness) { + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Config is not in readiness"); + } + + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Naming is not in readiness"); + } + + private boolean isConfigReadiness() { + // check db + try { + configInfoPersistService.configInfoCount(""); + return true; + } catch (Exception e) { + LOGGER.error("Config health check fail.", e); + } + return false; + } + + private boolean isNamingReadiness(HttpServletRequest request) { + try { + apiCommands.metrics(request); + return true; + } catch (Exception e) { + LOGGER.error("Naming health check fail.", e); + } + return false; + } +} diff --git a/pigx-register/src/main/java/com/alibaba/nacos/console/controller/NamespaceController.java b/pigx-register/src/main/java/com/alibaba/nacos/console/controller/NamespaceController.java new file mode 100644 index 0000000..e6cacd3 --- /dev/null +++ b/pigx-register/src/main/java/com/alibaba/nacos/console/controller/NamespaceController.java @@ -0,0 +1,155 @@ +/* + * Copyright 1999-2018 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.nacos.console.controller; + +import com.alibaba.nacos.api.exception.NacosException; +import com.alibaba.nacos.auth.annotation.Secured; +import com.alibaba.nacos.common.model.RestResult; +import com.alibaba.nacos.common.model.RestResultUtils; +import com.alibaba.nacos.common.utils.StringUtils; +import com.alibaba.nacos.config.server.service.repository.CommonPersistService; +import com.alibaba.nacos.console.model.Namespace; +import com.alibaba.nacos.console.model.NamespaceAllInfo; +import com.alibaba.nacos.console.service.NamespaceOperationService; +import com.alibaba.nacos.plugin.auth.constant.ActionTypes; +import com.alibaba.nacos.plugin.auth.impl.constant.AuthConstants; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; +import java.util.UUID; +import java.util.regex.Pattern; + +/** + * namespace service. + * + * @author Nacos + */ +@RestController +@RequestMapping("/v1/console/namespaces") +public class NamespaceController { + + @Autowired + private CommonPersistService commonPersistService; + + @Autowired + private NamespaceOperationService namespaceOperationService; + + private final Pattern namespaceIdCheckPattern = Pattern.compile("^[\\w-]+"); + + private static final int NAMESPACE_ID_MAX_LENGTH = 128; + + /** + * Get namespace list. + * + * @return namespace list + */ + @GetMapping + public RestResult> getNamespaces() { + return RestResultUtils.success(namespaceOperationService.getNamespaceList()); + } + + /** + * get namespace all info by namespace id. + * + * @param namespaceId namespaceId + * @return namespace all info + */ + @GetMapping(params = "show=all") + public NamespaceAllInfo getNamespace(@RequestParam("namespaceId") String namespaceId) throws NacosException { + return namespaceOperationService.getNamespace(namespaceId); + } + + /** + * create namespace. + * + * @param namespaceName namespace Name + * @param namespaceDesc namespace Desc + * @return whether create ok + */ + @PostMapping + @Secured(resource = AuthConstants.CONSOLE_RESOURCE_NAME_PREFIX + "namespaces", action = ActionTypes.WRITE) + public Boolean createNamespace(@RequestParam("customNamespaceId") String namespaceId, + @RequestParam("namespaceName") String namespaceName, + @RequestParam(value = "namespaceDesc", required = false) String namespaceDesc) { + if (StringUtils.isBlank(namespaceId)) { + namespaceId = UUID.randomUUID().toString(); + } else { + namespaceId = namespaceId.trim(); + if (!namespaceIdCheckPattern.matcher(namespaceId).matches()) { + return false; + } + if (namespaceId.length() > NAMESPACE_ID_MAX_LENGTH) { + return false; + } + } + try { + return namespaceOperationService.createNamespace(namespaceId, namespaceName, namespaceDesc); + } catch (NacosException e) { + return false; + } + } + + /** + * check namespaceId exist. + * + * @param namespaceId namespace id + * @return true if exist, otherwise false + */ + @GetMapping(params = "checkNamespaceIdExist=true") + public Boolean checkNamespaceIdExist(@RequestParam("customNamespaceId") String namespaceId) { + if (StringUtils.isBlank(namespaceId)) { + return false; + } + return (commonPersistService.tenantInfoCountByTenantId(namespaceId) > 0); + } + + /** + * edit namespace. + * + * @param namespace namespace + * @param namespaceShowName namespace ShowName + * @param namespaceDesc namespace Desc + * @return whether edit ok + */ + @PutMapping + @Secured(resource = AuthConstants.CONSOLE_RESOURCE_NAME_PREFIX + "namespaces", action = ActionTypes.WRITE) + public Boolean editNamespace(@RequestParam("namespace") String namespace, + @RequestParam("namespaceShowName") String namespaceShowName, + @RequestParam(value = "namespaceDesc", required = false) String namespaceDesc) { + return namespaceOperationService.editNamespace(namespace, namespaceShowName, namespaceDesc); + } + + /** + * del namespace by id. + * + * @param namespaceId namespace Id + * @return whether del ok + */ + @DeleteMapping + @Secured(resource = AuthConstants.CONSOLE_RESOURCE_NAME_PREFIX + "namespaces", action = ActionTypes.WRITE) + public Boolean deleteNamespace(@RequestParam("namespaceId") String namespaceId) { + return namespaceOperationService.removeNamespace(namespaceId); + } + +} diff --git a/pigx-register/src/main/java/com/alibaba/nacos/console/controller/ServerStateController.java b/pigx-register/src/main/java/com/alibaba/nacos/console/controller/ServerStateController.java new file mode 100644 index 0000000..47fec8c --- /dev/null +++ b/pigx-register/src/main/java/com/alibaba/nacos/console/controller/ServerStateController.java @@ -0,0 +1,66 @@ +/* + * Copyright 1999-2018 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.nacos.console.controller; + +import cn.hutool.core.io.FileUtil; +import com.alibaba.nacos.common.model.RestResult; +import com.alibaba.nacos.common.model.RestResultUtils; +import com.alibaba.nacos.sys.module.ModuleState; +import com.alibaba.nacos.sys.module.ModuleStateHolder; +import lombok.SneakyThrows; +import org.springframework.core.io.ClassPathResource; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.Map; + +/** + * Server state controller. + * + * @author xingxuechao on:2019/2/27 11:17 AM + */ +@RestController +@RequestMapping("/v1/console/server") +public class ServerStateController { + + private static final String ANNOUNCEMENT_FILE = "conf/announcement.conf"; + + /** + * Get server state of current server. + * + * @return state json. + */ + @GetMapping("/state") + public ResponseEntity> serverState() { + Map serverState = new HashMap<>(4); + for (ModuleState each : ModuleStateHolder.getInstance().getAllModuleStates()) { + each.getStates().forEach((s, o) -> serverState.put(s, null == o ? null : o.toString())); + } + return ResponseEntity.ok().body(serverState); + } + + @SneakyThrows + @GetMapping("/announcement") + public RestResult getAnnouncement() { + ClassPathResource resource = new ClassPathResource(ANNOUNCEMENT_FILE); + return RestResultUtils.success(FileUtil.readString(resource.getFile(), Charset.defaultCharset())); + } +} diff --git a/pigx-register/src/main/java/com/alibaba/nacos/console/controller/v2/NamespaceControllerV2.java b/pigx-register/src/main/java/com/alibaba/nacos/console/controller/v2/NamespaceControllerV2.java new file mode 100644 index 0000000..107e2ff --- /dev/null +++ b/pigx-register/src/main/java/com/alibaba/nacos/console/controller/v2/NamespaceControllerV2.java @@ -0,0 +1,152 @@ +/* + * Copyright 1999-2022 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.nacos.console.controller.v2; + +import com.alibaba.nacos.api.annotation.NacosApi; +import com.alibaba.nacos.api.exception.NacosException; +import com.alibaba.nacos.api.exception.api.NacosApiException; +import com.alibaba.nacos.api.model.v2.ErrorCode; +import com.alibaba.nacos.api.model.v2.Result; +import com.alibaba.nacos.auth.annotation.Secured; +import com.alibaba.nacos.common.utils.StringUtils; +import com.alibaba.nacos.console.model.Namespace; +import com.alibaba.nacos.console.model.NamespaceAllInfo; +import com.alibaba.nacos.console.model.form.NamespaceForm; +import com.alibaba.nacos.console.service.NamespaceOperationService; +import com.alibaba.nacos.plugin.auth.constant.ActionTypes; +import com.alibaba.nacos.plugin.auth.constant.SignType; +import com.alibaba.nacos.plugin.auth.impl.constant.AuthConstants; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; +import java.util.UUID; +import java.util.regex.Pattern; + +/** + * NamespaceControllerV2. + * + * @author dongyafei + * @date 2022/8/16 + */ +@NacosApi +@RestController +@RequestMapping("/v2/console/namespace") +public class NamespaceControllerV2 { + + private final NamespaceOperationService namespaceOperationService; + + public NamespaceControllerV2(NamespaceOperationService namespaceOperationService) { + this.namespaceOperationService = namespaceOperationService; + } + + private final Pattern namespaceIdCheckPattern = Pattern.compile("^[\\w-]+"); + + private static final int NAMESPACE_ID_MAX_LENGTH = 128; + + /** + * Get namespace list. + * + * @return namespace list + */ + @GetMapping("/list") + public Result> getNamespaceList() { + return Result.success(namespaceOperationService.getNamespaceList()); + } + + /** + * get namespace all info by namespace id. + * + * @param namespaceId namespaceId + * @return namespace all info + */ + @GetMapping() + @Secured(resource = AuthConstants.CONSOLE_RESOURCE_NAME_PREFIX + + "namespaces", action = ActionTypes.READ, signType = SignType.CONSOLE) + public Result getNamespace(@RequestParam("namespaceId") String namespaceId) + throws NacosException { + return Result.success(namespaceOperationService.getNamespace(namespaceId)); + } + + /** + * create namespace. + * + * @param namespaceForm namespaceForm. + * @return whether create ok + */ + @PostMapping + @Secured(resource = AuthConstants.CONSOLE_RESOURCE_NAME_PREFIX + + "namespaces", action = ActionTypes.WRITE, signType = SignType.CONSOLE) + public Result createNamespace(NamespaceForm namespaceForm) throws NacosException { + + namespaceForm.validate(); + + String namespaceId = namespaceForm.getNamespaceId(); + String namespaceName = namespaceForm.getNamespaceName(); + String namespaceDesc = namespaceForm.getNamespaceDesc(); + + if (StringUtils.isBlank(namespaceId)) { + namespaceId = UUID.randomUUID().toString(); + } else { + namespaceId = namespaceId.trim(); + if (!namespaceIdCheckPattern.matcher(namespaceId).matches()) { + throw new NacosApiException(HttpStatus.BAD_REQUEST.value(), ErrorCode.ILLEGAL_NAMESPACE, + "namespaceId [" + namespaceId + "] mismatch the pattern"); + } + if (namespaceId.length() > NAMESPACE_ID_MAX_LENGTH) { + throw new NacosApiException(HttpStatus.BAD_REQUEST.value(), ErrorCode.ILLEGAL_NAMESPACE, + "too long namespaceId, over " + NAMESPACE_ID_MAX_LENGTH); + } + } + return Result.success(namespaceOperationService.createNamespace(namespaceId, namespaceName, namespaceDesc)); + } + + /** + * edit namespace. + * + * @param namespaceForm namespace params + * @return whether edit ok + */ + @PutMapping + @Secured(resource = AuthConstants.CONSOLE_RESOURCE_NAME_PREFIX + + "namespaces", action = ActionTypes.WRITE, signType = SignType.CONSOLE) + public Result editNamespace(NamespaceForm namespaceForm) throws NacosException { + namespaceForm.validate(); + return Result.success(namespaceOperationService + .editNamespace(namespaceForm.getNamespaceId(), namespaceForm.getNamespaceName(), + namespaceForm.getNamespaceDesc())); + } + + /** + * delete namespace by id. + * + * @param namespaceId namespace ID + * @return whether delete ok + */ + @DeleteMapping + @Secured(resource = AuthConstants.CONSOLE_RESOURCE_NAME_PREFIX + + "namespaces", action = ActionTypes.WRITE, signType = SignType.CONSOLE) + public Result deleteNamespace(@RequestParam("namespaceId") String namespaceId) { + return Result.success(namespaceOperationService.removeNamespace(namespaceId)); + } +} diff --git a/pigx-register/src/main/java/com/alibaba/nacos/console/enums/NamespaceTypeEnum.java b/pigx-register/src/main/java/com/alibaba/nacos/console/enums/NamespaceTypeEnum.java new file mode 100644 index 0000000..749dedf --- /dev/null +++ b/pigx-register/src/main/java/com/alibaba/nacos/console/enums/NamespaceTypeEnum.java @@ -0,0 +1,66 @@ +/* + * Copyright 1999-2021 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.nacos.console.enums; + +/** + * the enum of namespace. + * 0 : Global configuration, 1 : Default private namespace ,2 : Custom namespace. + * + * @author chenglu + * @date 2021-05-25 17:01 + */ +public enum NamespaceTypeEnum { + + /** + * Global configuration. + */ + GLOBAL(0, "Global configuration"), + + /** + * Default private namespace. + */ + PRIVATE(1, "Default private namespace"), + + /** + * Custom namespace. + */ + CUSTOM(2, "Custom namespace"); + + /** + * the namespace type. + */ + private final int type; + + /** + * the description. + */ + private final String description; + + NamespaceTypeEnum(int type, String description) { + this.type = type; + this.description = description; + } + + public int getType() { + return type; + } + + public String getDescription() { + return description; + } +} + diff --git a/pigx-register/src/main/java/com/alibaba/nacos/console/exception/ConsoleExceptionHandler.java b/pigx-register/src/main/java/com/alibaba/nacos/console/exception/ConsoleExceptionHandler.java new file mode 100644 index 0000000..e4974ba --- /dev/null +++ b/pigx-register/src/main/java/com/alibaba/nacos/console/exception/ConsoleExceptionHandler.java @@ -0,0 +1,64 @@ +/* + * Copyright 1999-2018 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.nacos.console.exception; + +import com.alibaba.nacos.plugin.auth.exception.AccessException; +import com.alibaba.nacos.common.model.RestResultUtils; +import com.alibaba.nacos.common.utils.ExceptionUtil; +import com.alibaba.nacos.core.utils.Commons; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; + +import javax.servlet.http.HttpServletRequest; + +/** + * Exception handler for console module. + * + * @author nkorange + * @since 1.2.0 + */ +@ControllerAdvice +public class ConsoleExceptionHandler { + + private static final Logger LOGGER = LoggerFactory.getLogger(ConsoleExceptionHandler.class); + + @ExceptionHandler(AccessException.class) + private ResponseEntity handleAccessException(AccessException e) { + LOGGER.error("got exception. {}", e.getErrMsg()); + return ResponseEntity.status(HttpStatus.FORBIDDEN).body(e.getErrMsg()); + } + + @ExceptionHandler(IllegalArgumentException.class) + private ResponseEntity handleIllegalArgumentException(IllegalArgumentException e) { + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(ExceptionUtil.getAllExceptionMsg(e)); + } + + @ExceptionHandler(Exception.class) + private ResponseEntity handleException(HttpServletRequest request, Exception e) { + String uri = request.getRequestURI(); + LOGGER.error("CONSOLE {}", uri, e); + if (uri.contains(Commons.NACOS_SERVER_VERSION_V2)) { + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body(RestResultUtils.failed(ExceptionUtil.getAllExceptionMsg(e))); + } + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(ExceptionUtil.getAllExceptionMsg(e)); + } +} diff --git a/pigx-register/src/main/java/com/alibaba/nacos/console/exception/NacosApiExceptionHandler.java b/pigx-register/src/main/java/com/alibaba/nacos/console/exception/NacosApiExceptionHandler.java new file mode 100644 index 0000000..fdab900 --- /dev/null +++ b/pigx-register/src/main/java/com/alibaba/nacos/console/exception/NacosApiExceptionHandler.java @@ -0,0 +1,131 @@ +/* + * Copyright 1999-2022 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.nacos.console.exception; + +import com.alibaba.nacos.api.annotation.NacosApi; +import com.alibaba.nacos.api.exception.NacosException; +import com.alibaba.nacos.api.exception.api.NacosApiException; +import com.alibaba.nacos.api.model.v2.ErrorCode; +import com.alibaba.nacos.api.model.v2.Result; +import com.alibaba.nacos.common.utils.ExceptionUtil; +import com.alibaba.nacos.plugin.auth.exception.AccessException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.core.annotation.Order; +import org.springframework.dao.DataAccessException; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.http.converter.HttpMessageConversionException; +import org.springframework.http.converter.HttpMessageNotReadableException; +import org.springframework.web.HttpMediaTypeException; +import org.springframework.web.bind.MissingServletRequestParameterException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.ResponseStatus; + +import javax.servlet.ServletException; +import java.io.IOException; + +/** + * Exception Handler for Nacos API. + * @author dongyafei + * @date 2022/7/22 + */ + +@Order(-1) +@ControllerAdvice(annotations = {NacosApi.class}) +@ResponseBody +public class NacosApiExceptionHandler { + + private static final Logger LOGGER = LoggerFactory.getLogger(NacosApiExceptionHandler.class); + + @ExceptionHandler(NacosApiException.class) + public ResponseEntity> handleNacosApiException(NacosApiException e) { + LOGGER.error("got exception. {} {}", e.getErrAbstract(), e.getErrMsg()); + return ResponseEntity.status(e.getErrCode()).body(new Result<>(e.getDetailErrCode(), e.getErrAbstract(), e.getErrMsg())); + } + + @ExceptionHandler(NacosException.class) + public ResponseEntity> handleNacosException(NacosException e) { + LOGGER.error("got exception. {}", e.getErrMsg()); + return ResponseEntity.status(e.getErrCode()).body(Result.failure(ErrorCode.SERVER_ERROR, e.getErrMsg())); + } + + @ResponseStatus(HttpStatus.BAD_REQUEST) + @ExceptionHandler(HttpMessageNotReadableException.class) + public Result handleHttpMessageNotReadableException(HttpMessageNotReadableException e) { + LOGGER.error("got exception. {} {}", e.getMessage(), ExceptionUtil.getAllExceptionMsg(e)); + return Result.failure(ErrorCode.PARAMETER_MISSING, e.getMessage()); + } + + @ResponseStatus(HttpStatus.BAD_REQUEST) + @ExceptionHandler(HttpMessageConversionException.class) + public Result handleHttpMessageConversionException(HttpMessageConversionException e) { + LOGGER.error("got exception. {} {}", e.getMessage(), ExceptionUtil.getAllExceptionMsg(e)); + return Result.failure(ErrorCode.PARAMETER_VALIDATE_ERROR, e.getMessage()); + } + + @ResponseStatus(HttpStatus.BAD_REQUEST) + @ExceptionHandler(NumberFormatException.class) + public Result handleNumberFormatException(NumberFormatException e) { + LOGGER.error("got exception. {} {}", e.getMessage(), ExceptionUtil.getAllExceptionMsg(e)); + return Result.failure(ErrorCode.PARAMETER_VALIDATE_ERROR, e.getMessage()); + } + + @ResponseStatus(HttpStatus.BAD_REQUEST) + @ExceptionHandler(IllegalArgumentException.class) + public Result handleIllegalArgumentException(IllegalArgumentException e) { + LOGGER.error("got exception. {} {}", e.getMessage(), ExceptionUtil.getAllExceptionMsg(e)); + return Result.failure(ErrorCode.PARAMETER_VALIDATE_ERROR, e.getMessage()); + } + + @ResponseStatus(HttpStatus.BAD_REQUEST) + @ExceptionHandler(MissingServletRequestParameterException.class) + public Result handleMissingServletRequestParameterException(MissingServletRequestParameterException e) { + LOGGER.error("got exception. {} {}", e.getMessage(), ExceptionUtil.getAllExceptionMsg(e)); + return Result.failure(ErrorCode.PARAMETER_MISSING, e.getMessage()); + } + + @ResponseStatus(HttpStatus.BAD_REQUEST) + @ExceptionHandler(HttpMediaTypeException.class) + public Result handleHttpMediaTypeException(HttpMediaTypeException e) { + LOGGER.error("got exception. {} {}", e.getMessage(), ExceptionUtil.getAllExceptionMsg(e)); + return Result.failure(ErrorCode.MEDIA_TYPE_ERROR, e.getMessage()); + } + + @ResponseStatus(HttpStatus.FORBIDDEN) + @ExceptionHandler(AccessException.class) + public Result handleAccessException(AccessException e) { + LOGGER.error("got exception. {} {}", e.getMessage(), ExceptionUtil.getAllExceptionMsg(e)); + return Result.failure(ErrorCode.ACCESS_DENIED, e.getErrMsg()); + } + + @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) + @ExceptionHandler(value = {DataAccessException.class, ServletException.class, IOException.class}) + public Result handleDataAccessException(Exception e) { + LOGGER.error("got exception. {} {}", e.getMessage(), ExceptionUtil.getAllExceptionMsg(e)); + return Result.failure(ErrorCode.DATA_ACCESS_ERROR, e.getMessage()); + } + + @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) + @ExceptionHandler(Exception.class) + public Result handleOtherException(Exception e) { + LOGGER.error("got exception. {} {}", e.getMessage(), ExceptionUtil.getAllExceptionMsg(e)); + return Result.failure(e.getMessage()); + } +} diff --git a/pigx-register/src/main/java/com/alibaba/nacos/console/filter/XssFilter.java b/pigx-register/src/main/java/com/alibaba/nacos/console/filter/XssFilter.java new file mode 100644 index 0000000..3822f18 --- /dev/null +++ b/pigx-register/src/main/java/com/alibaba/nacos/console/filter/XssFilter.java @@ -0,0 +1,44 @@ +/* + * Copyright 1999-2018 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.nacos.console.filter; + +import org.springframework.web.filter.OncePerRequestFilter; + +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * XSS filter. + * @author onewe + */ +public class XssFilter extends OncePerRequestFilter { + + private static final String CONTENT_SECURITY_POLICY_HEADER = "Content-Security-Policy"; + + private static final String CONTENT_SECURITY_POLICY = "script-src 'self'"; + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) + throws ServletException, IOException { + + response.setHeader(CONTENT_SECURITY_POLICY_HEADER, CONTENT_SECURITY_POLICY); + filterChain.doFilter(request, response); + } +} diff --git a/pigx-register/src/main/java/com/alibaba/nacos/console/model/Namespace.java b/pigx-register/src/main/java/com/alibaba/nacos/console/model/Namespace.java new file mode 100644 index 0000000..66b789b --- /dev/null +++ b/pigx-register/src/main/java/com/alibaba/nacos/console/model/Namespace.java @@ -0,0 +1,115 @@ +/* + * Copyright 1999-2018 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.nacos.console.model; + +/** + * Namespace. + * + * @author diamond + */ +public class Namespace { + + private String namespace; + + private String namespaceShowName; + + private String namespaceDesc; + + private int quota; + + private int configCount; + + /** + * see {@link com.alibaba.nacos.console.enums.NamespaceTypeEnum}. + */ + private int type; + + public String getNamespaceShowName() { + return namespaceShowName; + } + + public void setNamespaceShowName(String namespaceShowName) { + this.namespaceShowName = namespaceShowName; + } + + public String getNamespace() { + return namespace; + } + + public void setNamespace(String namespace) { + this.namespace = namespace; + } + + public Namespace() { + } + + public Namespace(String namespace, String namespaceShowName) { + this.namespace = namespace; + this.namespaceShowName = namespaceShowName; + } + + public Namespace(String namespace, String namespaceShowName, int quota, int configCount, int type) { + this.namespace = namespace; + this.namespaceShowName = namespaceShowName; + this.quota = quota; + this.configCount = configCount; + this.type = type; + } + + public Namespace(String namespace, String namespaceShowName, String namespaceDesc, int quota, int configCount, + int type) { + this.namespace = namespace; + this.namespaceShowName = namespaceShowName; + this.quota = quota; + this.configCount = configCount; + this.type = type; + this.namespaceDesc = namespaceDesc; + } + + public String getNamespaceDesc() { + return namespaceDesc; + } + + public void setNamespaceDesc(String namespaceDesc) { + this.namespaceDesc = namespaceDesc; + } + + public int getQuota() { + return quota; + } + + public void setQuota(int quota) { + this.quota = quota; + } + + public int getConfigCount() { + return configCount; + } + + public void setConfigCount(int configCount) { + this.configCount = configCount; + } + + public int getType() { + return type; + } + + public void setType(int type) { + this.type = type; + } + +} diff --git a/pigx-register/src/main/java/com/alibaba/nacos/console/model/NamespaceAllInfo.java b/pigx-register/src/main/java/com/alibaba/nacos/console/model/NamespaceAllInfo.java new file mode 100644 index 0000000..de576c8 --- /dev/null +++ b/pigx-register/src/main/java/com/alibaba/nacos/console/model/NamespaceAllInfo.java @@ -0,0 +1,31 @@ +/* + * Copyright 1999-2018 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.nacos.console.model; + +/** + * all namespace info. + * + * @author Nacos + */ +public class NamespaceAllInfo extends Namespace { + + public NamespaceAllInfo(String namespace, String namespaceShowName, int quota, int configCount, int type, + String namespaceDesc) { + super(namespace, namespaceShowName, namespaceDesc, quota, configCount, type); + } + +} diff --git a/pigx-register/src/main/java/com/alibaba/nacos/console/model/form/NamespaceForm.java b/pigx-register/src/main/java/com/alibaba/nacos/console/model/form/NamespaceForm.java new file mode 100644 index 0000000..fc4fa08 --- /dev/null +++ b/pigx-register/src/main/java/com/alibaba/nacos/console/model/form/NamespaceForm.java @@ -0,0 +1,111 @@ +/* + * Copyright 1999-2022 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.nacos.console.model.form; + +import com.alibaba.nacos.api.exception.NacosException; +import com.alibaba.nacos.api.exception.api.NacosApiException; +import com.alibaba.nacos.api.model.v2.ErrorCode; +import org.springframework.http.HttpStatus; + +import java.io.Serializable; +import java.util.Objects; + +/** + * NamespaceForm. + * @author dongyafei + * @date 2022/8/16 + */ +public class NamespaceForm implements Serializable { + + private static final long serialVersionUID = -1078976569495343487L; + + private String namespaceId; + + private String namespaceName; + + private String namespaceDesc; + + public NamespaceForm() { + } + + public NamespaceForm(String namespaceId, String namespaceName, String namespaceDesc) { + this.namespaceId = namespaceId; + this.namespaceName = namespaceName; + this.namespaceDesc = namespaceDesc; + } + + public String getNamespaceId() { + return namespaceId; + } + + public void setNamespaceId(String namespaceId) { + this.namespaceId = namespaceId; + } + + public String getNamespaceName() { + return namespaceName; + } + + public void setNamespaceName(String namespaceName) { + this.namespaceName = namespaceName; + } + + public String getNamespaceDesc() { + return namespaceDesc; + } + + public void setNamespaceDesc(String namespaceDesc) { + this.namespaceDesc = namespaceDesc; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + NamespaceForm that = (NamespaceForm) o; + return Objects.equals(namespaceId, that.namespaceId) && Objects.equals(namespaceName, that.namespaceName) + && Objects.equals(namespaceDesc, that.namespaceDesc); + } + + @Override + public int hashCode() { + return Objects.hash(namespaceId, namespaceName, namespaceDesc); + } + + @Override + public String toString() { + return "NamespaceVo{" + "namespaceId='" + namespaceId + '\'' + ", namespaceName='" + namespaceName + '\'' + + ", namespaceDesc='" + namespaceDesc + '\'' + '}'; + } + + /** + * check required param. + * @throws NacosException NacosException + */ + public void validate() throws NacosException { + if (null == namespaceId) { + throw new NacosApiException(HttpStatus.BAD_REQUEST.value(), ErrorCode.PARAMETER_MISSING, "required parameter 'namespaceId' is missing"); + } + if (null == namespaceName) { + throw new NacosApiException(HttpStatus.BAD_REQUEST.value(), ErrorCode.PARAMETER_MISSING, "required parameter 'namespaceName' is missing"); + } + } +} diff --git a/pigx-register/src/main/java/com/alibaba/nacos/console/service/NamespaceOperationService.java b/pigx-register/src/main/java/com/alibaba/nacos/console/service/NamespaceOperationService.java new file mode 100644 index 0000000..2e2a54b --- /dev/null +++ b/pigx-register/src/main/java/com/alibaba/nacos/console/service/NamespaceOperationService.java @@ -0,0 +1,150 @@ +/* + * Copyright 1999-2022 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.nacos.console.service; + +import com.alibaba.nacos.api.exception.NacosException; +import com.alibaba.nacos.api.exception.api.NacosApiException; +import com.alibaba.nacos.api.model.v2.ErrorCode; +import com.alibaba.nacos.common.utils.NamespaceUtil; +import com.alibaba.nacos.common.utils.StringUtils; +import com.alibaba.nacos.config.server.model.TenantInfo; +import com.alibaba.nacos.config.server.service.repository.CommonPersistService; +import com.alibaba.nacos.config.server.service.repository.ConfigInfoPersistService; +import com.alibaba.nacos.console.enums.NamespaceTypeEnum; +import com.alibaba.nacos.console.model.Namespace; +import com.alibaba.nacos.console.model.NamespaceAllInfo; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; + +/** + * NamespaceOperationService. + * + * @author dongyafei + * @date 2022/8/16 + */ + +@Service +public class NamespaceOperationService { + + private final ConfigInfoPersistService configInfoPersistService; + + private final CommonPersistService commonPersistService; + + private static final String DEFAULT_NAMESPACE = "public"; + + private static final String DEFAULT_NAMESPACE_SHOW_NAME = "Public"; + + private static final String DEFAULT_NAMESPACE_DESCRIPTION = "Public Namespace"; + + private static final int DEFAULT_QUOTA = 200; + + private static final String DEFAULT_CREATE_SOURCE = "nacos"; + + private static final String DEFAULT_TENANT = ""; + + private static final String DEFAULT_KP = "1"; + + public NamespaceOperationService(ConfigInfoPersistService configInfoPersistService, + CommonPersistService commonPersistService) { + this.configInfoPersistService = configInfoPersistService; + this.commonPersistService = commonPersistService; + } + + public List getNamespaceList() { + // TODO 获取用kp + List tenantInfos = commonPersistService.findTenantByKp(DEFAULT_KP); + + Namespace namespace0 = new Namespace(NamespaceUtil.getNamespaceDefaultId(), DEFAULT_NAMESPACE, DEFAULT_QUOTA, + configInfoPersistService.configInfoCount(DEFAULT_TENANT), NamespaceTypeEnum.GLOBAL.getType()); + List namespaceList = new ArrayList<>(); + namespaceList.add(namespace0); + + for (TenantInfo tenantInfo : tenantInfos) { + int configCount = configInfoPersistService.configInfoCount(tenantInfo.getTenantId()); + Namespace namespaceTmp = new Namespace(tenantInfo.getTenantId(), tenantInfo.getTenantName(), + tenantInfo.getTenantDesc(), DEFAULT_QUOTA, configCount, NamespaceTypeEnum.CUSTOM.getType()); + namespaceList.add(namespaceTmp); + } + return namespaceList; + } + + /** + * query namespace by namespace id. + * + * @param namespaceId namespace Id. + * @return NamespaceAllInfo. + */ + public NamespaceAllInfo getNamespace(String namespaceId) throws NacosException { + // TODO 获取用kp + if (StringUtils.isBlank(namespaceId) || namespaceId.equals(NamespaceUtil.getNamespaceDefaultId())) { + return new NamespaceAllInfo(namespaceId, DEFAULT_NAMESPACE_SHOW_NAME, DEFAULT_QUOTA, + configInfoPersistService.configInfoCount(DEFAULT_TENANT), NamespaceTypeEnum.GLOBAL.getType(), + DEFAULT_NAMESPACE_DESCRIPTION); + } else { + TenantInfo tenantInfo = commonPersistService.findTenantByKp(DEFAULT_KP, namespaceId); + if (null == tenantInfo) { + throw new NacosApiException(HttpStatus.NOT_FOUND.value(), ErrorCode.NAMESPACE_NOT_EXIST, + "namespaceId [ " + namespaceId + " ] not exist"); + } + int configCount = configInfoPersistService.configInfoCount(namespaceId); + return new NamespaceAllInfo(namespaceId, tenantInfo.getTenantName(), DEFAULT_QUOTA, configCount, + NamespaceTypeEnum.CUSTOM.getType(), tenantInfo.getTenantDesc()); + } + } + + /** + * create namespace. + * + * @param namespaceId namespace ID + * @param namespaceName namespace Name + * @param namespaceDesc namespace Desc + * @return whether create ok + */ + public Boolean createNamespace(String namespaceId, String namespaceName, String namespaceDesc) + throws NacosException { + // TODO 获取用kp + if (commonPersistService.tenantInfoCountByTenantId(namespaceId) > 0) { + throw new NacosApiException(HttpStatus.INTERNAL_SERVER_ERROR.value(), ErrorCode.NAMESPACE_ALREADY_EXIST, + "namespaceId [" + namespaceId + "] already exist"); + } + + commonPersistService + .insertTenantInfoAtomic(DEFAULT_KP, namespaceId, namespaceName, namespaceDesc, DEFAULT_CREATE_SOURCE, + System.currentTimeMillis()); + return true; + } + + /** + * edit namespace. + */ + public Boolean editNamespace(String namespaceId, String namespaceName, String namespaceDesc) { + // TODO 获取用kp + commonPersistService.updateTenantNameAtomic(DEFAULT_KP, namespaceId, namespaceName, namespaceDesc); + return true; + } + + /** + * remove namespace. + */ + public Boolean removeNamespace(String namespaceId) { + commonPersistService.removeTenantInfoAtomic(DEFAULT_KP, namespaceId); + return true; + } +} diff --git a/pigx-register/src/main/resources/application.yml b/pigx-register/src/main/resources/application.yml new file mode 100644 index 0000000..89c6329 --- /dev/null +++ b/pigx-register/src/main/resources/application.yml @@ -0,0 +1,55 @@ +server: + port: 18848 + tomcat: + basedir: logs + error: + include-message: always +db: + num: 1 + user: ${MYSQL_USER:root} + password: ${MYSQL_PWD:root} + url: + 0: jdbc:mysql://${MYSQL_HOST:pigx-mysql}:${MYSQL_PORT:3309}/${MYSQL_DB:pigxx_config}?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true + +nacos: + core: + auth: + server: + identity: + key: serverIdentity + value: security + system.type: nacos + plugin.nacos.token.secret.key: SecretKey012345678901234567890123456789012345678901234567890123456789 + security: + ignore: + urls: /actuator/**,/,/error,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-fe/public/**,/v1/auth/**,/v1/console/health/**,/actuator/**,/v1/console/server/** + +spring: + datasource: + platform: mysql #这个过期属性不能修改,nacos 代码对此有硬编码 + security: + enabled: true + boot: # 接入 spring boot admin + admin: + client: + url: http://pigx-monitor:5001 + username: pig + password: pig + instance: + service-host-type: ip + application: + name: @project.artifactId@ + +useAddressServer: true + +management: + endpoints: + web: + exposure: + include: '*' + metrics: + export: + influx: + enabled: false + elastic: + enabled: false diff --git a/pigx-register/src/main/resources/conf/announcement.conf b/pigx-register/src/main/resources/conf/announcement.conf new file mode 100644 index 0000000..7536ba0 --- /dev/null +++ b/pigx-register/src/main/resources/conf/announcement.conf @@ -0,0 +1 @@ +无论您是多年编程的高级工程师,还是刚刚入门的实习生,部署请完全参考部署手册操作。 diff --git a/pigx-register/src/main/resources/nacos-version.txt b/pigx-register/src/main/resources/nacos-version.txt new file mode 100644 index 0000000..c0e2c01 --- /dev/null +++ b/pigx-register/src/main/resources/nacos-version.txt @@ -0,0 +1 @@ +version=2.2.4 diff --git a/pigx-register/src/main/resources/static/console-ui/public/css/bootstrap.css b/pigx-register/src/main/resources/static/console-ui/public/css/bootstrap.css new file mode 100644 index 0000000..8a9a081 --- /dev/null +++ b/pigx-register/src/main/resources/static/console-ui/public/css/bootstrap.css @@ -0,0 +1,7127 @@ +/* + * Copyright 1999-2018 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/*! normalize.css v2.1.3 | MIT License | git.io/normalize */ + +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +main, +nav, +section, +summary { + display: block; +} + +audio, +canvas, +video { + display: inline-block; +} + +audio:not([controls]) { + display: none; + height: 0; +} + +[hidden], +template { + display: none; +} + +html { + font-family: sans-serif; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; +} + +body { + margin: 0; +} + +a { + background: transparent; +} + +a:focus { + outline: thin dotted; +} + +a:active, +a:hover { + outline: 0; +} + +h1 { + margin: 0.67em 0; + font-size: 2em; +} + +abbr[title] { + border-bottom: 1px dotted; +} + +b, +strong { + font-weight: bold; +} + +dfn { + font-style: italic; +} + +hr { + height: 0; + -moz-box-sizing: content-box; + box-sizing: content-box; +} + +mark { + color: #000; + background: #ff0; +} + +code, +kbd, +pre, +samp { + font-family: monospace, serif; + font-size: 1em; +} + +pre { + white-space: pre-wrap; +} + +q { + quotes: "\201C" "\201D" "\2018" "\2019"; +} + +small { + font-size: 80%; +} + +sub, +sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline; +} + +sup { + top: -0.5em; +} + +sub { + bottom: -0.25em; +} + +img { + border: 0; +} + +svg:not(:root) { + overflow: hidden; +} + +figure { + margin: 0; +} + +fieldset { + padding: 0.35em 0.625em 0.75em; + margin: 0 2px; + border: 1px solid #c0c0c0; +} + +legend { + padding: 0; + border: 0; +} + +button, +input, +select, +textarea { + margin: 0; + font-family: inherit; + font-size: 100%; +} + +button, +input { + line-height: normal; +} + +button, +select { + text-transform: none; +} + +button, +html input[type="button"], +input[type="reset"], +input[type="submit"] { + cursor: pointer; + -webkit-appearance: button; +} + +button[disabled], +html input[disabled] { + cursor: default; +} + +input[type="checkbox"], +input[type="radio"] { + padding: 0; + box-sizing: border-box; +} + +input[type="search"] { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; + -webkit-appearance: textfield; +} + +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +button::-moz-focus-inner, +input::-moz-focus-inner { + padding: 0; + border: 0; +} + +textarea { + overflow: auto; + vertical-align: top; +} + +table { + border-collapse: collapse; + border-spacing: 0; +} + +@media print { + * { + color: #000 !important; + text-shadow: none !important; + background: transparent !important; + box-shadow: none !important; + } + a, + a:visited { + text-decoration: underline; + } + a[href]:after { + content: " (" attr(href) ")"; + } + abbr[title]:after { + content: " (" attr(title) ")"; + } + a[href^="javascript:"]:after, + a[href^="#"]:after { + content: ""; + } + pre, + blockquote { + border: 1px solid #999; + page-break-inside: avoid; + } + thead { + display: table-header-group; + } + tr, + img { + page-break-inside: avoid; + } + img { + max-width: 100% !important; + } + @page { + margin: 2cm .5cm; + } + p, + h2, + h3 { + orphans: 3; + widows: 3; + } + h2, + h3 { + page-break-after: avoid; + } + select { + background: #fff !important; + } + .navbar { + display: none; + } + .table td, + .table th { + background-color: #fff !important; + } + .btn > .caret, + .dropup > .btn > .caret { + border-top-color: #000 !important; + } + .label { + border: 1px solid #000; + } + .table { + border-collapse: collapse !important; + } + .table-bordered th, + .table-bordered td { + border: 1px solid #ddd !important; + } +} + +*, +*:before, +*:after { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +html { + font-size: 62.5%; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} + +body { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + line-height: 1.428571429; + color: #333333; + background-color: #ffffff; +} + +input, +button, +select, +textarea { + font-family: inherit; + font-size: inherit; +} + +a { + color: #428bca; + text-decoration: none; +} + +a:hover, +a:focus { + color: #2a6496; + text-decoration: underline; +} + +a:focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} + +img { + vertical-align: middle; +} + +.img-responsive { + display: block; + height: auto; + max-width: 100%; +} + +.img-rounded { + border-radius: 6px; +} + +.img-thumbnail { + display: inline-block; + height: auto; + max-width: 100%; + padding: 4px; + line-height: 1.428571429; + background-color: #ffffff; + border: 1px solid #dddddd; + border-radius: 4px; + -webkit-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; +} + +.img-circle { + border-radius: 50%; +} + +hr { + margin-top: 20px; + margin-bottom: 20px; + border: 0; + border-top: 1px solid #eeeeee; +} + +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; +} + +h1, +h2, +h3, +h4, +h5, +h6, +.h1, +.h2, +.h3, +.h4, +.h5, +.h6 { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-weight: 500; + line-height: 1.1; + color: inherit; +} + +h1 small, +h2 small, +h3 small, +h4 small, +h5 small, +h6 small, +.h1 small, +.h2 small, +.h3 small, +.h4 small, +.h5 small, +.h6 small, +h1 .small, +h2 .small, +h3 .small, +h4 .small, +h5 .small, +h6 .small, +.h1 .small, +.h2 .small, +.h3 .small, +.h4 .small, +.h5 .small, +.h6 .small { + font-weight: normal; + line-height: 1; + color: #999999; +} + +h1, +h2, +h3 { + margin-top: 20px; + margin-bottom: 10px; +} + +h1 small, +h2 small, +h3 small, +h1 .small, +h2 .small, +h3 .small { + font-size: 65%; +} + +h4, +h5, +h6 { + margin-top: 10px; + margin-bottom: 10px; +} + +h4 small, +h5 small, +h6 small, +h4 .small, +h5 .small, +h6 .small { + font-size: 75%; +} + +h1, +.h1 { + font-size: 36px; +} + +h2, +.h2 { + font-size: 30px; +} + +h3, +.h3 { + font-size: 24px; +} + +h4, +.h4 { + font-size: 18px; +} + +h5, +.h5 { + font-size: 14px; +} + +h6, +.h6 { + font-size: 12px; +} + +p { + margin: 0 0 10px; +} + +.lead { + margin-bottom: 20px; + font-size: 16px; + font-weight: 200; + line-height: 1.4; +} + +@media (min-width: 768px) { + .lead { + font-size: 21px; + } +} + +small, +.small { + font-size: 85%; +} + +cite { + font-style: normal; +} + +.text-muted { + color: #999999; +} + +.text-primary { + color: #428bca; +} + +.text-primary:hover { + color: #3071a9; +} + +.text-warning { + color: #8a6d3b; +} + +.text-warning:hover { + color: #66512c; +} + +.text-danger { + color: #a94442; +} + +.text-danger:hover { + color: #843534; +} + +.text-success { + color: #3c763d; +} + +.text-success:hover { + color: #2b542c; +} + +.text-info { + color: #31708f; +} + +.text-info:hover { + color: #245269; +} + +.text-left { + text-align: left; +} + +.text-right { + text-align: right; +} + +.text-center { + text-align: center; +} + +.page-header { + padding-bottom: 9px; + margin: 40px 0 20px; + border-bottom: 1px solid #eeeeee; +} + +ul, +ol { + margin-top: 0; + margin-bottom: 10px; +} + +ul ul, +ol ul, +ul ol, +ol ol { + margin-bottom: 0; +} + +.list-unstyled { + padding-left: 0; + list-style: none; +} + +.list-inline { + padding-left: 0; + list-style: none; +} + +.list-inline > li { + display: inline-block; + padding-right: 5px; + padding-left: 5px; +} + +.list-inline > li:first-child { + padding-left: 0; +} + +dl { + margin-top: 0; + margin-bottom: 20px; +} + +dt, +dd { + line-height: 1.428571429; +} + +dt { + font-weight: bold; +} + +dd { + margin-left: 0; +} + +@media (min-width: 768px) { + .dl-horizontal dt { + float: left; + width: 160px; + overflow: hidden; + clear: left; + text-align: right; + text-overflow: ellipsis; + white-space: nowrap; + } + .dl-horizontal dd { + margin-left: 180px; + } + .dl-horizontal dd:before, + .dl-horizontal dd:after { + display: table; + content: " "; + } + .dl-horizontal dd:after { + clear: both; + } + .dl-horizontal dd:before, + .dl-horizontal dd:after { + display: table; + content: " "; + } + .dl-horizontal dd:after { + clear: both; + } +} + +abbr[title], +abbr[data-original-title] { + cursor: help; + border-bottom: 1px dotted #999999; +} + +.initialism { + font-size: 90%; + text-transform: uppercase; +} + +blockquote { + padding: 10px 20px; + margin: 0 0 20px; + border-left: 5px solid #eeeeee; +} + +blockquote p { + font-size: 17.5px; + font-weight: 300; + line-height: 1.25; +} + +blockquote p:last-child { + margin-bottom: 0; +} + +blockquote small, +blockquote .small { + display: block; + line-height: 1.428571429; + color: #999999; +} + +blockquote small:before, +blockquote .small:before { + content: '\2014 \00A0'; +} + +blockquote.pull-right { + padding-right: 15px; + padding-left: 0; + border-right: 5px solid #eeeeee; + border-left: 0; +} + +blockquote.pull-right p, +blockquote.pull-right small, +blockquote.pull-right .small { + text-align: right; +} + +blockquote.pull-right small:before, +blockquote.pull-right .small:before { + content: ''; +} + +blockquote.pull-right small:after, +blockquote.pull-right .small:after { + content: '\00A0 \2014'; +} + +blockquote:before, +blockquote:after { + content: ""; +} + +address { + margin-bottom: 20px; + font-style: normal; + line-height: 1.428571429; +} + +code, +kbd, +pre, +samp { + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; +} + +code { + padding: 2px 4px; + font-size: 90%; + color: #c7254e; + white-space: nowrap; + background-color: #f9f2f4; + border-radius: 4px; +} + +pre { + display: block; + padding: 9.5px; + margin: 0 0 10px; + font-size: 13px; + line-height: 1.428571429; + color: #333333; + word-break: break-all; + word-wrap: break-word; + background-color: #f5f5f5; + border: 1px solid #cccccc; + border-radius: 4px; +} + +pre code { + padding: 0; + font-size: inherit; + color: inherit; + white-space: pre-wrap; + background-color: transparent; + border-radius: 0; +} + +.pre-scrollable { + max-height: 340px; + overflow-y: scroll; +} + +.container { + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; +} + +.container:before, +.container:after { + display: table; + content: " "; +} + +.container:after { + clear: both; +} + +.container:before, +.container:after { + display: table; + content: " "; +} + +.container:after { + clear: both; +} + +@media (min-width: 768px) { + .container { + width: 750px; + } +} + +@media (min-width: 992px) { + .container { + width: 970px; + } +} + +@media (min-width: 1200px) { + .container { + width: 1170px; + } +} + +.row { + margin-right: -15px; + margin-left: -15px; +} + +.row:before, +.row:after { + display: table; + content: " "; +} + +.row:after { + clear: both; +} + +.row:before, +.row:after { + display: table; + content: " "; +} + +.row:after { + clear: both; +} + +.col-xs-1, +.col-sm-1, +.col-md-1, +.col-lg-1, +.col-xs-2, +.col-sm-2, +.col-md-2, +.col-lg-2, +.col-xs-3, +.col-sm-3, +.col-md-3, +.col-lg-3, +.col-xs-4, +.col-sm-4, +.col-md-4, +.col-lg-4, +.col-xs-5, +.col-sm-5, +.col-md-5, +.col-lg-5, +.col-xs-6, +.col-sm-6, +.col-md-6, +.col-lg-6, +.col-xs-7, +.col-sm-7, +.col-md-7, +.col-lg-7, +.col-xs-8, +.col-sm-8, +.col-md-8, +.col-lg-8, +.col-xs-9, +.col-sm-9, +.col-md-9, +.col-lg-9, +.col-xs-10, +.col-sm-10, +.col-md-10, +.col-lg-10, +.col-xs-11, +.col-sm-11, +.col-md-11, +.col-lg-11, +.col-xs-12, +.col-sm-12, +.col-md-12, +.col-lg-12 { + position: relative; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; +} + +.col-xs-1, +.col-xs-2, +.col-xs-3, +.col-xs-4, +.col-xs-5, +.col-xs-6, +.col-xs-7, +.col-xs-8, +.col-xs-9, +.col-xs-10, +.col-xs-11, +.col-xs-12 { + float: left; +} + +.col-xs-12 { + width: 100%; +} + +.col-xs-11 { + width: 91.66666666666666%; +} + +.col-xs-10 { + width: 83.33333333333334%; +} + +.col-xs-9 { + width: 75%; +} + +.col-xs-8 { + width: 66.66666666666666%; +} + +.col-xs-7 { + width: 58.333333333333336%; +} + +.col-xs-6 { + width: 50%; +} + +.col-xs-5 { + width: 41.66666666666667%; +} + +.col-xs-4 { + width: 33.33333333333333%; +} + +.col-xs-3 { + width: 25%; +} + +.col-xs-2 { + width: 16.666666666666664%; +} + +.col-xs-1 { + width: 8.333333333333332%; +} + +.col-xs-pull-12 { + right: 100%; +} + +.col-xs-pull-11 { + right: 91.66666666666666%; +} + +.col-xs-pull-10 { + right: 83.33333333333334%; +} + +.col-xs-pull-9 { + right: 75%; +} + +.col-xs-pull-8 { + right: 66.66666666666666%; +} + +.col-xs-pull-7 { + right: 58.333333333333336%; +} + +.col-xs-pull-6 { + right: 50%; +} + +.col-xs-pull-5 { + right: 41.66666666666667%; +} + +.col-xs-pull-4 { + right: 33.33333333333333%; +} + +.col-xs-pull-3 { + right: 25%; +} + +.col-xs-pull-2 { + right: 16.666666666666664%; +} + +.col-xs-pull-1 { + right: 8.333333333333332%; +} + +.col-xs-pull-0 { + right: 0; +} + +.col-xs-push-12 { + left: 100%; +} + +.col-xs-push-11 { + left: 91.66666666666666%; +} + +.col-xs-push-10 { + left: 83.33333333333334%; +} + +.col-xs-push-9 { + left: 75%; +} + +.col-xs-push-8 { + left: 66.66666666666666%; +} + +.col-xs-push-7 { + left: 58.333333333333336%; +} + +.col-xs-push-6 { + left: 50%; +} + +.col-xs-push-5 { + left: 41.66666666666667%; +} + +.col-xs-push-4 { + left: 33.33333333333333%; +} + +.col-xs-push-3 { + left: 25%; +} + +.col-xs-push-2 { + left: 16.666666666666664%; +} + +.col-xs-push-1 { + left: 8.333333333333332%; +} + +.col-xs-push-0 { + left: 0; +} + +.col-xs-offset-12 { + margin-left: 100%; +} + +.col-xs-offset-11 { + margin-left: 91.66666666666666%; +} + +.col-xs-offset-10 { + margin-left: 83.33333333333334%; +} + +.col-xs-offset-9 { + margin-left: 75%; +} + +.col-xs-offset-8 { + margin-left: 66.66666666666666%; +} + +.col-xs-offset-7 { + margin-left: 58.333333333333336%; +} + +.col-xs-offset-6 { + margin-left: 50%; +} + +.col-xs-offset-5 { + margin-left: 41.66666666666667%; +} + +.col-xs-offset-4 { + margin-left: 33.33333333333333%; +} + +.col-xs-offset-3 { + margin-left: 25%; +} + +.col-xs-offset-2 { + margin-left: 16.666666666666664%; +} + +.col-xs-offset-1 { + margin-left: 8.333333333333332%; +} + +.col-xs-offset-0 { + margin-left: 0; +} + +@media (min-width: 768px) { + .col-sm-1, + .col-sm-2, + .col-sm-3, + .col-sm-4, + .col-sm-5, + .col-sm-6, + .col-sm-7, + .col-sm-8, + .col-sm-9, + .col-sm-10, + .col-sm-11, + .col-sm-12 { + float: left; + } + .col-sm-12 { + width: 100%; + } + .col-sm-11 { + width: 91.66666666666666%; + } + .col-sm-10 { + width: 83.33333333333334%; + } + .col-sm-9 { + width: 75%; + } + .col-sm-8 { + width: 66.66666666666666%; + } + .col-sm-7 { + width: 58.333333333333336%; + } + .col-sm-6 { + width: 50%; + } + .col-sm-5 { + width: 41.66666666666667%; + } + .col-sm-4 { + width: 33.33333333333333%; + } + .col-sm-3 { + width: 25%; + } + .col-sm-2 { + width: 16.666666666666664%; + } + .col-sm-1 { + width: 8.333333333333332%; + } + .col-sm-pull-12 { + right: 100%; + } + .col-sm-pull-11 { + right: 91.66666666666666%; + } + .col-sm-pull-10 { + right: 83.33333333333334%; + } + .col-sm-pull-9 { + right: 75%; + } + .col-sm-pull-8 { + right: 66.66666666666666%; + } + .col-sm-pull-7 { + right: 58.333333333333336%; + } + .col-sm-pull-6 { + right: 50%; + } + .col-sm-pull-5 { + right: 41.66666666666667%; + } + .col-sm-pull-4 { + right: 33.33333333333333%; + } + .col-sm-pull-3 { + right: 25%; + } + .col-sm-pull-2 { + right: 16.666666666666664%; + } + .col-sm-pull-1 { + right: 8.333333333333332%; + } + .col-sm-pull-0 { + right: 0; + } + .col-sm-push-12 { + left: 100%; + } + .col-sm-push-11 { + left: 91.66666666666666%; + } + .col-sm-push-10 { + left: 83.33333333333334%; + } + .col-sm-push-9 { + left: 75%; + } + .col-sm-push-8 { + left: 66.66666666666666%; + } + .col-sm-push-7 { + left: 58.333333333333336%; + } + .col-sm-push-6 { + left: 50%; + } + .col-sm-push-5 { + left: 41.66666666666667%; + } + .col-sm-push-4 { + left: 33.33333333333333%; + } + .col-sm-push-3 { + left: 25%; + } + .col-sm-push-2 { + left: 16.666666666666664%; + } + .col-sm-push-1 { + left: 8.333333333333332%; + } + .col-sm-push-0 { + left: 0; + } + .col-sm-offset-12 { + margin-left: 100%; + } + .col-sm-offset-11 { + margin-left: 91.66666666666666%; + } + .col-sm-offset-10 { + margin-left: 83.33333333333334%; + } + .col-sm-offset-9 { + margin-left: 75%; + } + .col-sm-offset-8 { + margin-left: 66.66666666666666%; + } + .col-sm-offset-7 { + margin-left: 58.333333333333336%; + } + .col-sm-offset-6 { + margin-left: 50%; + } + .col-sm-offset-5 { + margin-left: 41.66666666666667%; + } + .col-sm-offset-4 { + margin-left: 33.33333333333333%; + } + .col-sm-offset-3 { + margin-left: 25%; + } + .col-sm-offset-2 { + margin-left: 16.666666666666664%; + } + .col-sm-offset-1 { + margin-left: 8.333333333333332%; + } + .col-sm-offset-0 { + margin-left: 0; + } +} + +@media (min-width: 992px) { + .col-md-1, + .col-md-2, + .col-md-3, + .col-md-4, + .col-md-5, + .col-md-6, + .col-md-7, + .col-md-8, + .col-md-9, + .col-md-10, + .col-md-11, + .col-md-12 { + float: left; + } + .col-md-12 { + width: 100%; + } + .col-md-11 { + width: 91.66666666666666%; + } + .col-md-10 { + width: 83.33333333333334%; + } + .col-md-9 { + width: 75%; + } + .col-md-8 { + width: 66.66666666666666%; + } + .col-md-7 { + width: 58.333333333333336%; + } + .col-md-6 { + width: 50%; + } + .col-md-5 { + width: 41.66666666666667%; + } + .col-md-4 { + width: 33.33333333333333%; + } + .col-md-3 { + width: 25%; + } + .col-md-2 { + width: 16.666666666666664%; + } + .col-md-1 { + width: 8.333333333333332%; + } + .col-md-pull-12 { + right: 100%; + } + .col-md-pull-11 { + right: 91.66666666666666%; + } + .col-md-pull-10 { + right: 83.33333333333334%; + } + .col-md-pull-9 { + right: 75%; + } + .col-md-pull-8 { + right: 66.66666666666666%; + } + .col-md-pull-7 { + right: 58.333333333333336%; + } + .col-md-pull-6 { + right: 50%; + } + .col-md-pull-5 { + right: 41.66666666666667%; + } + .col-md-pull-4 { + right: 33.33333333333333%; + } + .col-md-pull-3 { + right: 25%; + } + .col-md-pull-2 { + right: 16.666666666666664%; + } + .col-md-pull-1 { + right: 8.333333333333332%; + } + .col-md-pull-0 { + right: 0; + } + .col-md-push-12 { + left: 100%; + } + .col-md-push-11 { + left: 91.66666666666666%; + } + .col-md-push-10 { + left: 83.33333333333334%; + } + .col-md-push-9 { + left: 75%; + } + .col-md-push-8 { + left: 66.66666666666666%; + } + .col-md-push-7 { + left: 58.333333333333336%; + } + .col-md-push-6 { + left: 50%; + } + .col-md-push-5 { + left: 41.66666666666667%; + } + .col-md-push-4 { + left: 33.33333333333333%; + } + .col-md-push-3 { + left: 25%; + } + .col-md-push-2 { + left: 16.666666666666664%; + } + .col-md-push-1 { + left: 8.333333333333332%; + } + .col-md-push-0 { + left: 0; + } + .col-md-offset-12 { + margin-left: 100%; + } + .col-md-offset-11 { + margin-left: 91.66666666666666%; + } + .col-md-offset-10 { + margin-left: 83.33333333333334%; + } + .col-md-offset-9 { + margin-left: 75%; + } + .col-md-offset-8 { + margin-left: 66.66666666666666%; + } + .col-md-offset-7 { + margin-left: 58.333333333333336%; + } + .col-md-offset-6 { + margin-left: 50%; + } + .col-md-offset-5 { + margin-left: 41.66666666666667%; + } + .col-md-offset-4 { + margin-left: 33.33333333333333%; + } + .col-md-offset-3 { + margin-left: 25%; + } + .col-md-offset-2 { + margin-left: 16.666666666666664%; + } + .col-md-offset-1 { + margin-left: 8.333333333333332%; + } + .col-md-offset-0 { + margin-left: 0; + } +} + +@media (min-width: 1200px) { + .col-lg-1, + .col-lg-2, + .col-lg-3, + .col-lg-4, + .col-lg-5, + .col-lg-6, + .col-lg-7, + .col-lg-8, + .col-lg-9, + .col-lg-10, + .col-lg-11, + .col-lg-12 { + float: left; + } + .col-lg-12 { + width: 100%; + } + .col-lg-11 { + width: 91.66666666666666%; + } + .col-lg-10 { + width: 83.33333333333334%; + } + .col-lg-9 { + width: 75%; + } + .col-lg-8 { + width: 66.66666666666666%; + } + .col-lg-7 { + width: 58.333333333333336%; + } + .col-lg-6 { + width: 50%; + } + .col-lg-5 { + width: 41.66666666666667%; + } + .col-lg-4 { + width: 33.33333333333333%; + } + .col-lg-3 { + width: 25%; + } + .col-lg-2 { + width: 16.666666666666664%; + } + .col-lg-1 { + width: 8.333333333333332%; + } + .col-lg-pull-12 { + right: 100%; + } + .col-lg-pull-11 { + right: 91.66666666666666%; + } + .col-lg-pull-10 { + right: 83.33333333333334%; + } + .col-lg-pull-9 { + right: 75%; + } + .col-lg-pull-8 { + right: 66.66666666666666%; + } + .col-lg-pull-7 { + right: 58.333333333333336%; + } + .col-lg-pull-6 { + right: 50%; + } + .col-lg-pull-5 { + right: 41.66666666666667%; + } + .col-lg-pull-4 { + right: 33.33333333333333%; + } + .col-lg-pull-3 { + right: 25%; + } + .col-lg-pull-2 { + right: 16.666666666666664%; + } + .col-lg-pull-1 { + right: 8.333333333333332%; + } + .col-lg-pull-0 { + right: 0; + } + .col-lg-push-12 { + left: 100%; + } + .col-lg-push-11 { + left: 91.66666666666666%; + } + .col-lg-push-10 { + left: 83.33333333333334%; + } + .col-lg-push-9 { + left: 75%; + } + .col-lg-push-8 { + left: 66.66666666666666%; + } + .col-lg-push-7 { + left: 58.333333333333336%; + } + .col-lg-push-6 { + left: 50%; + } + .col-lg-push-5 { + left: 41.66666666666667%; + } + .col-lg-push-4 { + left: 33.33333333333333%; + } + .col-lg-push-3 { + left: 25%; + } + .col-lg-push-2 { + left: 16.666666666666664%; + } + .col-lg-push-1 { + left: 8.333333333333332%; + } + .col-lg-push-0 { + left: 0; + } + .col-lg-offset-12 { + margin-left: 100%; + } + .col-lg-offset-11 { + margin-left: 91.66666666666666%; + } + .col-lg-offset-10 { + margin-left: 83.33333333333334%; + } + .col-lg-offset-9 { + margin-left: 75%; + } + .col-lg-offset-8 { + margin-left: 66.66666666666666%; + } + .col-lg-offset-7 { + margin-left: 58.333333333333336%; + } + .col-lg-offset-6 { + margin-left: 50%; + } + .col-lg-offset-5 { + margin-left: 41.66666666666667%; + } + .col-lg-offset-4 { + margin-left: 33.33333333333333%; + } + .col-lg-offset-3 { + margin-left: 25%; + } + .col-lg-offset-2 { + margin-left: 16.666666666666664%; + } + .col-lg-offset-1 { + margin-left: 8.333333333333332%; + } + .col-lg-offset-0 { + margin-left: 0; + } +} + +table { + max-width: 100%; + background-color: transparent; +} + +th { + text-align: left; +} + +.table { + width: 100%; + margin-bottom: 20px; +} + +.table > thead > tr > th, +.table > tbody > tr > th, +.table > tfoot > tr > th, +.table > thead > tr > td, +.table > tbody > tr > td, +.table > tfoot > tr > td { + padding: 8px; + line-height: 1.428571429; + vertical-align: top; + border-top: 1px solid #dddddd; +} + +.table > thead > tr > th { + vertical-align: bottom; + border-bottom: 2px solid #dddddd; +} + +.table > caption + thead > tr:first-child > th, +.table > colgroup + thead > tr:first-child > th, +.table > thead:first-child > tr:first-child > th, +.table > caption + thead > tr:first-child > td, +.table > colgroup + thead > tr:first-child > td, +.table > thead:first-child > tr:first-child > td { + border-top: 0; +} + +.table > tbody + tbody { + border-top: 2px solid #dddddd; +} + +.table .table { + background-color: #ffffff; +} + +.table-condensed > thead > tr > th, +.table-condensed > tbody > tr > th, +.table-condensed > tfoot > tr > th, +.table-condensed > thead > tr > td, +.table-condensed > tbody > tr > td, +.table-condensed > tfoot > tr > td { + padding: 5px; +} + +.table-bordered { + border: 1px solid #dddddd; +} + +.table-bordered > thead > tr > th, +.table-bordered > tbody > tr > th, +.table-bordered > tfoot > tr > th, +.table-bordered > thead > tr > td, +.table-bordered > tbody > tr > td, +.table-bordered > tfoot > tr > td { + border: 1px solid #dddddd; +} + +.table-bordered > thead > tr > th, +.table-bordered > thead > tr > td { + border-bottom-width: 2px; +} + +.table-striped > tbody > tr:nth-child(odd) > td, +.table-striped > tbody > tr:nth-child(odd) > th { + background-color: #f9f9f9; +} + +.table-hover > tbody > tr:hover > td, +.table-hover > tbody > tr:hover > th { + background-color: #f5f5f5; +} + +table col[class*="col-"] { + position: static; + display: table-column; + float: none; +} + +table td[class*="col-"], +table th[class*="col-"] { + display: table-cell; + float: none; +} + +.table > thead > tr > .active, +.table > tbody > tr > .active, +.table > tfoot > tr > .active, +.table > thead > .active > td, +.table > tbody > .active > td, +.table > tfoot > .active > td, +.table > thead > .active > th, +.table > tbody > .active > th, +.table > tfoot > .active > th { + background-color: #f5f5f5; +} + +.table-hover > tbody > tr > .active:hover, +.table-hover > tbody > .active:hover > td, +.table-hover > tbody > .active:hover > th { + background-color: #e8e8e8; +} + +.table > thead > tr > .success, +.table > tbody > tr > .success, +.table > tfoot > tr > .success, +.table > thead > .success > td, +.table > tbody > .success > td, +.table > tfoot > .success > td, +.table > thead > .success > th, +.table > tbody > .success > th, +.table > tfoot > .success > th { + background-color: #dff0d8; +} + +.table-hover > tbody > tr > .success:hover, +.table-hover > tbody > .success:hover > td, +.table-hover > tbody > .success:hover > th { + background-color: #d0e9c6; +} + +.table > thead > tr > .danger, +.table > tbody > tr > .danger, +.table > tfoot > tr > .danger, +.table > thead > .danger > td, +.table > tbody > .danger > td, +.table > tfoot > .danger > td, +.table > thead > .danger > th, +.table > tbody > .danger > th, +.table > tfoot > .danger > th { + background-color: #f2dede; +} + +.table-hover > tbody > tr > .danger:hover, +.table-hover > tbody > .danger:hover > td, +.table-hover > tbody > .danger:hover > th { + background-color: #ebcccc; +} + +.table > thead > tr > .warning, +.table > tbody > tr > .warning, +.table > tfoot > tr > .warning, +.table > thead > .warning > td, +.table > tbody > .warning > td, +.table > tfoot > .warning > td, +.table > thead > .warning > th, +.table > tbody > .warning > th, +.table > tfoot > .warning > th { + background-color: #fcf8e3; +} + +.table-hover > tbody > tr > .warning:hover, +.table-hover > tbody > .warning:hover > td, +.table-hover > tbody > .warning:hover > th { + background-color: #faf2cc; +} + +@media (max-width: 767px) { + .table-responsive { + width: 100%; + margin-bottom: 15px; + overflow-x: scroll; + overflow-y: hidden; + border: 1px solid #dddddd; + -ms-overflow-style: -ms-autohiding-scrollbar; + -webkit-overflow-scrolling: touch; + } + .table-responsive > .table { + margin-bottom: 0; + } + .table-responsive > .table > thead > tr > th, + .table-responsive > .table > tbody > tr > th, + .table-responsive > .table > tfoot > tr > th, + .table-responsive > .table > thead > tr > td, + .table-responsive > .table > tbody > tr > td, + .table-responsive > .table > tfoot > tr > td { + white-space: nowrap; + } + .table-responsive > .table-bordered { + border: 0; + } + .table-responsive > .table-bordered > thead > tr > th:first-child, + .table-responsive > .table-bordered > tbody > tr > th:first-child, + .table-responsive > .table-bordered > tfoot > tr > th:first-child, + .table-responsive > .table-bordered > thead > tr > td:first-child, + .table-responsive > .table-bordered > tbody > tr > td:first-child, + .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; + } + .table-responsive > .table-bordered > thead > tr > th:last-child, + .table-responsive > .table-bordered > tbody > tr > th:last-child, + .table-responsive > .table-bordered > tfoot > tr > th:last-child, + .table-responsive > .table-bordered > thead > tr > td:last-child, + .table-responsive > .table-bordered > tbody > tr > td:last-child, + .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; + } + .table-responsive > .table-bordered > tbody > tr:last-child > th, + .table-responsive > .table-bordered > tfoot > tr:last-child > th, + .table-responsive > .table-bordered > tbody > tr:last-child > td, + .table-responsive > .table-bordered > tfoot > tr:last-child > td { + border-bottom: 0; + } +} + +fieldset { + padding: 0; + margin: 0; + border: 0; +} + +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: 20px; + font-size: 21px; + line-height: inherit; + color: #333333; + border: 0; + border-bottom: 1px solid #e5e5e5; +} + +label { + display: inline-block; + margin-bottom: 5px; + font-weight: bold; +} + +input[type="search"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +input[type="radio"], +input[type="checkbox"] { + margin: 4px 0 0; + margin-top: 1px \9; + /* IE8-9 */ + + line-height: normal; +} + +input[type="file"] { + display: block; +} + +select[multiple], +select[size] { + height: auto; +} + +select optgroup { + font-family: inherit; + font-size: inherit; + font-style: inherit; +} + +input[type="file"]:focus, +input[type="radio"]:focus, +input[type="checkbox"]:focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} + +input[type="number"]::-webkit-outer-spin-button, +input[type="number"]::-webkit-inner-spin-button { + height: auto; +} + +output { + display: block; + padding-top: 7px; + font-size: 14px; + line-height: 1.428571429; + color: #555555; + vertical-align: middle; +} + +.form-control { + display: block; + width: 100%; + height: 34px; + padding: 6px 12px; + font-size: 14px; + line-height: 1.428571429; + color: #555555; + vertical-align: middle; + background-color: #ffffff; + background-image: none; + border: 1px solid #cccccc; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -webkit-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; + transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; +} + +.form-control:focus { + border-color: #66afe9; + outline: 0; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6); +} + +.form-control:-moz-placeholder { + color: #999999; +} + +.form-control::-moz-placeholder { + color: #999999; + opacity: 1; +} + +.form-control:-ms-input-placeholder { + color: #999999; +} + +.form-control::-webkit-input-placeholder { + color: #999999; +} + +.form-control[disabled], +.form-control[readonly], +fieldset[disabled] .form-control { + cursor: not-allowed; + background-color: #eeeeee; +} + +textarea.form-control { + height: auto; +} + +.form-group { + margin-bottom: 15px; +} + +.radio, +.checkbox { + display: block; + min-height: 20px; + padding-left: 20px; + margin-top: 10px; + margin-bottom: 10px; + vertical-align: middle; +} + +.radio label, +.checkbox label { + display: inline; + margin-bottom: 0; + font-weight: normal; + cursor: pointer; +} + +.radio input[type="radio"], +.radio-inline input[type="radio"], +.checkbox input[type="checkbox"], +.checkbox-inline input[type="checkbox"] { + float: left; + margin-left: -20px; +} + +.radio + .radio, +.checkbox + .checkbox { + margin-top: -5px; +} + +.radio-inline, +.checkbox-inline { + display: inline-block; + padding-left: 20px; + margin-bottom: 0; + font-weight: normal; + vertical-align: middle; + cursor: pointer; +} + +.radio-inline + .radio-inline, +.checkbox-inline + .checkbox-inline { + margin-top: 0; + margin-left: 10px; +} + +input[type="radio"][disabled], +input[type="checkbox"][disabled], +.radio[disabled], +.radio-inline[disabled], +.checkbox[disabled], +.checkbox-inline[disabled], +fieldset[disabled] input[type="radio"], +fieldset[disabled] input[type="checkbox"], +fieldset[disabled] .radio, +fieldset[disabled] .radio-inline, +fieldset[disabled] .checkbox, +fieldset[disabled] .checkbox-inline { + cursor: not-allowed; +} + +.input-sm { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} + +select.input-sm { + height: 30px; + line-height: 30px; +} + +textarea.input-sm { + height: auto; +} + +.input-lg { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.33; + border-radius: 6px; +} + +select.input-lg { + height: 46px; + line-height: 46px; +} + +textarea.input-lg { + height: auto; +} + +.has-warning .help-block, +.has-warning .control-label, +.has-warning .radio, +.has-warning .checkbox, +.has-warning .radio-inline, +.has-warning .checkbox-inline { + color: #8a6d3b; +} + +.has-warning .form-control { + border-color: #8a6d3b; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} + +.has-warning .form-control:focus { + border-color: #66512c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b; +} + +.has-warning .input-group-addon { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #8a6d3b; +} + +.has-error .help-block, +.has-error .control-label, +.has-error .radio, +.has-error .checkbox, +.has-error .radio-inline, +.has-error .checkbox-inline { + color: #a94442; +} + +.has-error .form-control { + border-color: #a94442; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} + +.has-error .form-control:focus { + border-color: #843534; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483; +} + +.has-error .input-group-addon { + color: #a94442; + background-color: #f2dede; + border-color: #a94442; +} + +.has-success .help-block, +.has-success .control-label, +.has-success .radio, +.has-success .checkbox, +.has-success .radio-inline, +.has-success .checkbox-inline { + color: #3c763d; +} + +.has-success .form-control { + border-color: #3c763d; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} + +.has-success .form-control:focus { + border-color: #2b542c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168; +} + +.has-success .input-group-addon { + color: #3c763d; + background-color: #dff0d8; + border-color: #3c763d; +} + +.form-control-static { + margin-bottom: 0; +} + +.help-block { + display: block; + margin-top: 5px; + margin-bottom: 10px; + color: #737373; +} + +@media (min-width: 768px) { + .form-inline .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .form-control { + display: inline-block; + } + .form-inline select.form-control { + width: auto; + } + .form-inline .radio, + .form-inline .checkbox { + display: inline-block; + padding-left: 0; + margin-top: 0; + margin-bottom: 0; + } + .form-inline .radio input[type="radio"], + .form-inline .checkbox input[type="checkbox"] { + float: none; + margin-left: 0; + } +} + +.form-horizontal .control-label, +.form-horizontal .radio, +.form-horizontal .checkbox, +.form-horizontal .radio-inline, +.form-horizontal .checkbox-inline { + padding-top: 7px; + margin-top: 0; + margin-bottom: 0; +} + +.form-horizontal .radio, +.form-horizontal .checkbox { + min-height: 27px; +} + +.form-horizontal .form-group { + margin-right: -15px; + margin-left: -15px; +} + +.form-horizontal .form-group:before, +.form-horizontal .form-group:after { + display: table; + content: " "; +} + +.form-horizontal .form-group:after { + clear: both; +} + +.form-horizontal .form-group:before, +.form-horizontal .form-group:after { + display: table; + content: " "; +} + +.form-horizontal .form-group:after { + clear: both; +} + +.form-horizontal .form-control-static { + padding-top: 7px; +} + +@media (min-width: 768px) { + .form-horizontal .control-label { + text-align: right; + } +} + +.btn { + display: inline-block; + padding: 6px 12px; + margin-bottom: 0; + font-size: 14px; + font-weight: normal; + line-height: 1.428571429; + text-align: center; + white-space: nowrap; + vertical-align: middle; + cursor: pointer; + background-image: none; + border: 1px solid transparent; + border-radius: 4px; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + -o-user-select: none; + user-select: none; +} + +.btn:focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} + +.btn:hover, +.btn:focus { + color: #333333; + text-decoration: none; +} + +.btn:active, +.btn.active { + background-image: none; + outline: 0; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); +} + +.btn.disabled, +.btn[disabled], +fieldset[disabled] .btn { + pointer-events: none; + cursor: not-allowed; + opacity: 0.65; + filter: alpha(opacity=65); + -webkit-box-shadow: none; + box-shadow: none; +} + +.btn-default { + color: #333333; + background-color: #ffffff; + border-color: #cccccc; +} + +.btn-default:hover, +.btn-default:focus, +.btn-default:active, +.btn-default.active, +.open .dropdown-toggle.btn-default { + color: #333333; + background-color: #ebebeb; + border-color: #adadad; +} + +.btn-default:active, +.btn-default.active, +.open .dropdown-toggle.btn-default { + background-image: none; +} + +.btn-default.disabled, +.btn-default[disabled], +fieldset[disabled] .btn-default, +.btn-default.disabled:hover, +.btn-default[disabled]:hover, +fieldset[disabled] .btn-default:hover, +.btn-default.disabled:focus, +.btn-default[disabled]:focus, +fieldset[disabled] .btn-default:focus, +.btn-default.disabled:active, +.btn-default[disabled]:active, +fieldset[disabled] .btn-default:active, +.btn-default.disabled.active, +.btn-default[disabled].active, +fieldset[disabled] .btn-default.active { + background-color: #ffffff; + border-color: #cccccc; +} + +.btn-default .badge { + color: #ffffff; + background-color: #fff; +} + +.btn-primary { + color: #ffffff; + background-color: #428bca; + border-color: #357ebd; +} + +.btn-primary:hover, +.btn-primary:focus, +.btn-primary:active, +.btn-primary.active, +.open .dropdown-toggle.btn-primary { + color: #ffffff; + background-color: #3276b1; + border-color: #285e8e; +} + +.btn-primary:active, +.btn-primary.active, +.open .dropdown-toggle.btn-primary { + background-image: none; +} + +.btn-primary.disabled, +.btn-primary[disabled], +fieldset[disabled] .btn-primary, +.btn-primary.disabled:hover, +.btn-primary[disabled]:hover, +fieldset[disabled] .btn-primary:hover, +.btn-primary.disabled:focus, +.btn-primary[disabled]:focus, +fieldset[disabled] .btn-primary:focus, +.btn-primary.disabled:active, +.btn-primary[disabled]:active, +fieldset[disabled] .btn-primary:active, +.btn-primary.disabled.active, +.btn-primary[disabled].active, +fieldset[disabled] .btn-primary.active { + background-color: #428bca; + border-color: #357ebd; +} + +.btn-primary .badge { + color: #428bca; + background-color: #fff; +} + +.btn-warning { + color: #ffffff; + background-color: #f0ad4e; + border-color: #eea236; +} + +.btn-warning:hover, +.btn-warning:focus, +.btn-warning:active, +.btn-warning.active, +.open .dropdown-toggle.btn-warning { + color: #ffffff; + background-color: #ed9c28; + border-color: #d58512; +} + +.btn-warning:active, +.btn-warning.active, +.open .dropdown-toggle.btn-warning { + background-image: none; +} + +.btn-warning.disabled, +.btn-warning[disabled], +fieldset[disabled] .btn-warning, +.btn-warning.disabled:hover, +.btn-warning[disabled]:hover, +fieldset[disabled] .btn-warning:hover, +.btn-warning.disabled:focus, +.btn-warning[disabled]:focus, +fieldset[disabled] .btn-warning:focus, +.btn-warning.disabled:active, +.btn-warning[disabled]:active, +fieldset[disabled] .btn-warning:active, +.btn-warning.disabled.active, +.btn-warning[disabled].active, +fieldset[disabled] .btn-warning.active { + background-color: #f0ad4e; + border-color: #eea236; +} + +.btn-warning .badge { + color: #f0ad4e; + background-color: #fff; +} + +.btn-danger { + color: #ffffff; + background-color: #d9534f; + border-color: #d43f3a; +} + +.btn-danger:hover, +.btn-danger:focus, +.btn-danger:active, +.btn-danger.active, +.open .dropdown-toggle.btn-danger { + color: #ffffff; + background-color: #d2322d; + border-color: #ac2925; +} + +.btn-danger:active, +.btn-danger.active, +.open .dropdown-toggle.btn-danger { + background-image: none; +} + +.btn-danger.disabled, +.btn-danger[disabled], +fieldset[disabled] .btn-danger, +.btn-danger.disabled:hover, +.btn-danger[disabled]:hover, +fieldset[disabled] .btn-danger:hover, +.btn-danger.disabled:focus, +.btn-danger[disabled]:focus, +fieldset[disabled] .btn-danger:focus, +.btn-danger.disabled:active, +.btn-danger[disabled]:active, +fieldset[disabled] .btn-danger:active, +.btn-danger.disabled.active, +.btn-danger[disabled].active, +fieldset[disabled] .btn-danger.active { + background-color: #d9534f; + border-color: #d43f3a; +} + +.btn-danger .badge { + color: #d9534f; + background-color: #fff; +} + +.btn-success { + color: #ffffff; + background-color: #5cb85c; + border-color: #4cae4c; +} + +.btn-success:hover, +.btn-success:focus, +.btn-success:active, +.btn-success.active, +.open .dropdown-toggle.btn-success { + color: #ffffff; + background-color: #47a447; + border-color: #398439; +} + +.btn-success:active, +.btn-success.active, +.open .dropdown-toggle.btn-success { + background-image: none; +} + +.btn-success.disabled, +.btn-success[disabled], +fieldset[disabled] .btn-success, +.btn-success.disabled:hover, +.btn-success[disabled]:hover, +fieldset[disabled] .btn-success:hover, +.btn-success.disabled:focus, +.btn-success[disabled]:focus, +fieldset[disabled] .btn-success:focus, +.btn-success.disabled:active, +.btn-success[disabled]:active, +fieldset[disabled] .btn-success:active, +.btn-success.disabled.active, +.btn-success[disabled].active, +fieldset[disabled] .btn-success.active { + background-color: #5cb85c; + border-color: #4cae4c; +} + +.btn-success .badge { + color: #5cb85c; + background-color: #fff; +} + +.btn-info { + color: #ffffff; + background-color: #5bc0de; + border-color: #46b8da; +} + +.btn-info:hover, +.btn-info:focus, +.btn-info:active, +.btn-info.active, +.open .dropdown-toggle.btn-info { + color: #ffffff; + background-color: #39b3d7; + border-color: #269abc; +} + +.btn-info:active, +.btn-info.active, +.open .dropdown-toggle.btn-info { + background-image: none; +} + +.btn-info.disabled, +.btn-info[disabled], +fieldset[disabled] .btn-info, +.btn-info.disabled:hover, +.btn-info[disabled]:hover, +fieldset[disabled] .btn-info:hover, +.btn-info.disabled:focus, +.btn-info[disabled]:focus, +fieldset[disabled] .btn-info:focus, +.btn-info.disabled:active, +.btn-info[disabled]:active, +fieldset[disabled] .btn-info:active, +.btn-info.disabled.active, +.btn-info[disabled].active, +fieldset[disabled] .btn-info.active { + background-color: #5bc0de; + border-color: #46b8da; +} + +.btn-info .badge { + color: #5bc0de; + background-color: #fff; +} + +.btn-link { + font-weight: normal; + color: #428bca; + cursor: pointer; + border-radius: 0; +} + +.btn-link, +.btn-link:active, +.btn-link[disabled], +fieldset[disabled] .btn-link { + background-color: transparent; + -webkit-box-shadow: none; + box-shadow: none; +} + +.btn-link, +.btn-link:hover, +.btn-link:focus, +.btn-link:active { + border-color: transparent; +} + +.btn-link:hover, +.btn-link:focus { + color: #2a6496; + text-decoration: underline; + background-color: transparent; +} + +.btn-link[disabled]:hover, +fieldset[disabled] .btn-link:hover, +.btn-link[disabled]:focus, +fieldset[disabled] .btn-link:focus { + color: #999999; + text-decoration: none; +} + +.btn-lg { + padding: 10px 16px; + font-size: 18px; + line-height: 1.33; + border-radius: 6px; +} + +.btn-sm { + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} + +.btn-xs { + padding: 1px 5px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} + +.btn-block { + display: block; + width: 100%; + padding-right: 0; + padding-left: 0; +} + +.btn-block + .btn-block { + margin-top: 5px; +} + +input[type="submit"].btn-block, +input[type="reset"].btn-block, +input[type="button"].btn-block { + width: 100%; +} + +.fade { + opacity: 0; + -webkit-transition: opacity 0.15s linear; + transition: opacity 0.15s linear; +} + +.fade.in { + opacity: 1; +} + +.collapse { + display: none; +} + +.collapse.in { + display: block; +} + +.collapsing { + position: relative; + height: 0; + overflow: hidden; + -webkit-transition: height 0.35s ease; + transition: height 0.35s ease; +} + +@font-face { + font-family: 'Glyphicons Halflings'; + src: url('../fonts/glyphicons-halflings-regular.eot'); + src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons-halflingsregular') format('svg'); +} + +.glyphicon { + position: relative; + top: 1px; + display: inline-block; + font-family: 'Glyphicons Halflings'; + -webkit-font-smoothing: antialiased; + font-style: normal; + font-weight: normal; + line-height: 1; + -moz-osx-font-smoothing: grayscale; +} + +.glyphicon:empty { + width: 1em; +} + +.glyphicon-asterisk:before { + content: "\2a"; +} + +.glyphicon-plus:before { + content: "\2b"; +} + +.glyphicon-euro:before { + content: "\20ac"; +} + +.glyphicon-minus:before { + content: "\2212"; +} + +.glyphicon-cloud:before { + content: "\2601"; +} + +.glyphicon-envelope:before { + content: "\2709"; +} + +.glyphicon-pencil:before { + content: "\270f"; +} + +.glyphicon-glass:before { + content: "\e001"; +} + +.glyphicon-music:before { + content: "\e002"; +} + +.glyphicon-search:before { + content: "\e003"; +} + +.glyphicon-heart:before { + content: "\e005"; +} + +.glyphicon-star:before { + content: "\e006"; +} + +.glyphicon-star-empty:before { + content: "\e007"; +} + +.glyphicon-user:before { + content: "\e008"; +} + +.glyphicon-film:before { + content: "\e009"; +} + +.glyphicon-th-large:before { + content: "\e010"; +} + +.glyphicon-th:before { + content: "\e011"; +} + +.glyphicon-th-list:before { + content: "\e012"; +} + +.glyphicon-ok:before { + content: "\e013"; +} + +.glyphicon-remove:before { + content: "\e014"; +} + +.glyphicon-zoom-in:before { + content: "\e015"; +} + +.glyphicon-zoom-out:before { + content: "\e016"; +} + +.glyphicon-off:before { + content: "\e017"; +} + +.glyphicon-signal:before { + content: "\e018"; +} + +.glyphicon-cog:before { + content: "\e019"; +} + +.glyphicon-trash:before { + content: "\e020"; +} + +.glyphicon-home:before { + content: "\e021"; +} + +.glyphicon-file:before { + content: "\e022"; +} + +.glyphicon-time:before { + content: "\e023"; +} + +.glyphicon-road:before { + content: "\e024"; +} + +.glyphicon-download-alt:before { + content: "\e025"; +} + +.glyphicon-download:before { + content: "\e026"; +} + +.glyphicon-upload:before { + content: "\e027"; +} + +.glyphicon-inbox:before { + content: "\e028"; +} + +.glyphicon-play-circle:before { + content: "\e029"; +} + +.glyphicon-repeat:before { + content: "\e030"; +} + +.glyphicon-refresh:before { + content: "\e031"; +} + +.glyphicon-list-alt:before { + content: "\e032"; +} + +.glyphicon-lock:before { + content: "\e033"; +} + +.glyphicon-flag:before { + content: "\e034"; +} + +.glyphicon-headphones:before { + content: "\e035"; +} + +.glyphicon-volume-off:before { + content: "\e036"; +} + +.glyphicon-volume-down:before { + content: "\e037"; +} + +.glyphicon-volume-up:before { + content: "\e038"; +} + +.glyphicon-qrcode:before { + content: "\e039"; +} + +.glyphicon-barcode:before { + content: "\e040"; +} + +.glyphicon-tag:before { + content: "\e041"; +} + +.glyphicon-tags:before { + content: "\e042"; +} + +.glyphicon-book:before { + content: "\e043"; +} + +.glyphicon-bookmark:before { + content: "\e044"; +} + +.glyphicon-print:before { + content: "\e045"; +} + +.glyphicon-camera:before { + content: "\e046"; +} + +.glyphicon-font:before { + content: "\e047"; +} + +.glyphicon-bold:before { + content: "\e048"; +} + +.glyphicon-italic:before { + content: "\e049"; +} + +.glyphicon-text-height:before { + content: "\e050"; +} + +.glyphicon-text-width:before { + content: "\e051"; +} + +.glyphicon-align-left:before { + content: "\e052"; +} + +.glyphicon-align-center:before { + content: "\e053"; +} + +.glyphicon-align-right:before { + content: "\e054"; +} + +.glyphicon-align-justify:before { + content: "\e055"; +} + +.glyphicon-list:before { + content: "\e056"; +} + +.glyphicon-indent-left:before { + content: "\e057"; +} + +.glyphicon-indent-right:before { + content: "\e058"; +} + +.glyphicon-facetime-video:before { + content: "\e059"; +} + +.glyphicon-picture:before { + content: "\e060"; +} + +.glyphicon-map-marker:before { + content: "\e062"; +} + +.glyphicon-adjust:before { + content: "\e063"; +} + +.glyphicon-tint:before { + content: "\e064"; +} + +.glyphicon-edit:before { + content: "\e065"; +} + +.glyphicon-share:before { + content: "\e066"; +} + +.glyphicon-check:before { + content: "\e067"; +} + +.glyphicon-move:before { + content: "\e068"; +} + +.glyphicon-step-backward:before { + content: "\e069"; +} + +.glyphicon-fast-backward:before { + content: "\e070"; +} + +.glyphicon-backward:before { + content: "\e071"; +} + +.glyphicon-play:before { + content: "\e072"; +} + +.glyphicon-pause:before { + content: "\e073"; +} + +.glyphicon-stop:before { + content: "\e074"; +} + +.glyphicon-forward:before { + content: "\e075"; +} + +.glyphicon-fast-forward:before { + content: "\e076"; +} + +.glyphicon-step-forward:before { + content: "\e077"; +} + +.glyphicon-eject:before { + content: "\e078"; +} + +.glyphicon-chevron-left:before { + content: "\e079"; +} + +.glyphicon-chevron-right:before { + content: "\e080"; +} + +.glyphicon-plus-sign:before { + content: "\e081"; +} + +.glyphicon-minus-sign:before { + content: "\e082"; +} + +.glyphicon-remove-sign:before { + content: "\e083"; +} + +.glyphicon-ok-sign:before { + content: "\e084"; +} + +.glyphicon-question-sign:before { + content: "\e085"; +} + +.glyphicon-info-sign:before { + content: "\e086"; +} + +.glyphicon-screenshot:before { + content: "\e087"; +} + +.glyphicon-remove-circle:before { + content: "\e088"; +} + +.glyphicon-ok-circle:before { + content: "\e089"; +} + +.glyphicon-ban-circle:before { + content: "\e090"; +} + +.glyphicon-arrow-left:before { + content: "\e091"; +} + +.glyphicon-arrow-right:before { + content: "\e092"; +} + +.glyphicon-arrow-up:before { + content: "\e093"; +} + +.glyphicon-arrow-down:before { + content: "\e094"; +} + +.glyphicon-share-alt:before { + content: "\e095"; +} + +.glyphicon-resize-full:before { + content: "\e096"; +} + +.glyphicon-resize-small:before { + content: "\e097"; +} + +.glyphicon-exclamation-sign:before { + content: "\e101"; +} + +.glyphicon-gift:before { + content: "\e102"; +} + +.glyphicon-leaf:before { + content: "\e103"; +} + +.glyphicon-fire:before { + content: "\e104"; +} + +.glyphicon-eye-open:before { + content: "\e105"; +} + +.glyphicon-eye-close:before { + content: "\e106"; +} + +.glyphicon-warning-sign:before { + content: "\e107"; +} + +.glyphicon-plane:before { + content: "\e108"; +} + +.glyphicon-calendar:before { + content: "\e109"; +} + +.glyphicon-random:before { + content: "\e110"; +} + +.glyphicon-comment:before { + content: "\e111"; +} + +.glyphicon-magnet:before { + content: "\e112"; +} + +.glyphicon-chevron-up:before { + content: "\e113"; +} + +.glyphicon-chevron-down:before { + content: "\e114"; +} + +.glyphicon-retweet:before { + content: "\e115"; +} + +.glyphicon-shopping-cart:before { + content: "\e116"; +} + +.glyphicon-folder-close:before { + content: "\e117"; +} + +.glyphicon-folder-open:before { + content: "\e118"; +} + +.glyphicon-resize-vertical:before { + content: "\e119"; +} + +.glyphicon-resize-horizontal:before { + content: "\e120"; +} + +.glyphicon-hdd:before { + content: "\e121"; +} + +.glyphicon-bullhorn:before { + content: "\e122"; +} + +.glyphicon-bell:before { + content: "\e123"; +} + +.glyphicon-certificate:before { + content: "\e124"; +} + +.glyphicon-thumbs-up:before { + content: "\e125"; +} + +.glyphicon-thumbs-down:before { + content: "\e126"; +} + +.glyphicon-hand-right:before { + content: "\e127"; +} + +.glyphicon-hand-left:before { + content: "\e128"; +} + +.glyphicon-hand-up:before { + content: "\e129"; +} + +.glyphicon-hand-down:before { + content: "\e130"; +} + +.glyphicon-circle-arrow-right:before { + content: "\e131"; +} + +.glyphicon-circle-arrow-left:before { + content: "\e132"; +} + +.glyphicon-circle-arrow-up:before { + content: "\e133"; +} + +.glyphicon-circle-arrow-down:before { + content: "\e134"; +} + +.glyphicon-globe:before { + content: "\e135"; +} + +.glyphicon-wrench:before { + content: "\e136"; +} + +.glyphicon-tasks:before { + content: "\e137"; +} + +.glyphicon-filter:before { + content: "\e138"; +} + +.glyphicon-briefcase:before { + content: "\e139"; +} + +.glyphicon-fullscreen:before { + content: "\e140"; +} + +.glyphicon-dashboard:before { + content: "\e141"; +} + +.glyphicon-paperclip:before { + content: "\e142"; +} + +.glyphicon-heart-empty:before { + content: "\e143"; +} + +.glyphicon-link:before { + content: "\e144"; +} + +.glyphicon-phone:before { + content: "\e145"; +} + +.glyphicon-pushpin:before { + content: "\e146"; +} + +.glyphicon-usd:before { + content: "\e148"; +} + +.glyphicon-gbp:before { + content: "\e149"; +} + +.glyphicon-sort:before { + content: "\e150"; +} + +.glyphicon-sort-by-alphabet:before { + content: "\e151"; +} + +.glyphicon-sort-by-alphabet-alt:before { + content: "\e152"; +} + +.glyphicon-sort-by-order:before { + content: "\e153"; +} + +.glyphicon-sort-by-order-alt:before { + content: "\e154"; +} + +.glyphicon-sort-by-attributes:before { + content: "\e155"; +} + +.glyphicon-sort-by-attributes-alt:before { + content: "\e156"; +} + +.glyphicon-unchecked:before { + content: "\e157"; +} + +.glyphicon-expand:before { + content: "\e158"; +} + +.glyphicon-collapse-down:before { + content: "\e159"; +} + +.glyphicon-collapse-up:before { + content: "\e160"; +} + +.glyphicon-log-in:before { + content: "\e161"; +} + +.glyphicon-flash:before { + content: "\e162"; +} + +.glyphicon-log-out:before { + content: "\e163"; +} + +.glyphicon-new-window:before { + content: "\e164"; +} + +.glyphicon-record:before { + content: "\e165"; +} + +.glyphicon-save:before { + content: "\e166"; +} + +.glyphicon-open:before { + content: "\e167"; +} + +.glyphicon-saved:before { + content: "\e168"; +} + +.glyphicon-import:before { + content: "\e169"; +} + +.glyphicon-export:before { + content: "\e170"; +} + +.glyphicon-send:before { + content: "\e171"; +} + +.glyphicon-floppy-disk:before { + content: "\e172"; +} + +.glyphicon-floppy-saved:before { + content: "\e173"; +} + +.glyphicon-floppy-remove:before { + content: "\e174"; +} + +.glyphicon-floppy-save:before { + content: "\e175"; +} + +.glyphicon-floppy-open:before { + content: "\e176"; +} + +.glyphicon-credit-card:before { + content: "\e177"; +} + +.glyphicon-transfer:before { + content: "\e178"; +} + +.glyphicon-cutlery:before { + content: "\e179"; +} + +.glyphicon-header:before { + content: "\e180"; +} + +.glyphicon-compressed:before { + content: "\e181"; +} + +.glyphicon-earphone:before { + content: "\e182"; +} + +.glyphicon-phone-alt:before { + content: "\e183"; +} + +.glyphicon-tower:before { + content: "\e184"; +} + +.glyphicon-stats:before { + content: "\e185"; +} + +.glyphicon-sd-video:before { + content: "\e186"; +} + +.glyphicon-hd-video:before { + content: "\e187"; +} + +.glyphicon-subtitles:before { + content: "\e188"; +} + +.glyphicon-sound-stereo:before { + content: "\e189"; +} + +.glyphicon-sound-dolby:before { + content: "\e190"; +} + +.glyphicon-sound-5-1:before { + content: "\e191"; +} + +.glyphicon-sound-6-1:before { + content: "\e192"; +} + +.glyphicon-sound-7-1:before { + content: "\e193"; +} + +.glyphicon-copyright-mark:before { + content: "\e194"; +} + +.glyphicon-registration-mark:before { + content: "\e195"; +} + +.glyphicon-cloud-download:before { + content: "\e197"; +} + +.glyphicon-cloud-upload:before { + content: "\e198"; +} + +.glyphicon-tree-conifer:before { + content: "\e199"; +} + +.glyphicon-tree-deciduous:before { + content: "\e200"; +} + +.caret { + display: inline-block; + width: 0; + height: 0; + margin-left: 2px; + vertical-align: middle; + border-top: 4px solid; + border-right: 4px solid transparent; + border-left: 4px solid transparent; +} + +.dropdown { + position: relative; +} + +.dropdown-toggle:focus { + outline: 0; +} + +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 160px; + padding: 5px 0; + margin: 2px 0 0; + font-size: 14px; + list-style: none; + background-color: #ffffff; + border: 1px solid #cccccc; + border: 1px solid rgba(0, 0, 0, 0.15); + border-radius: 4px; + -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); + box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); + background-clip: padding-box; +} + +.dropdown-menu.pull-right { + right: 0; + left: auto; +} + +.dropdown-menu .divider { + height: 1px; + margin: 9px 0; + overflow: hidden; + background-color: #e5e5e5; +} + +.dropdown-menu > li > a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: 1.428571429; + color: #333333; + white-space: nowrap; +} + +.dropdown-menu > li > a:hover, +.dropdown-menu > li > a:focus { + color: #262626; + text-decoration: none; + background-color: #f5f5f5; +} + +.dropdown-menu > .active > a, +.dropdown-menu > .active > a:hover, +.dropdown-menu > .active > a:focus { + color: #ffffff; + text-decoration: none; + background-color: #428bca; + outline: 0; +} + +.dropdown-menu > .disabled > a, +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + color: #999999; +} + +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + text-decoration: none; + cursor: not-allowed; + background-color: transparent; + background-image: none; + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.open > .dropdown-menu { + display: block; +} + +.open > a { + outline: 0; +} + +.dropdown-header { + display: block; + padding: 3px 20px; + font-size: 12px; + line-height: 1.428571429; + color: #999999; +} + +.dropdown-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 990; +} + +.pull-right > .dropdown-menu { + right: 0; + left: auto; +} + +.dropup .caret, +.navbar-fixed-bottom .dropdown .caret { + border-top: 0; + border-bottom: 4px solid; + content: ""; +} + +.dropup .dropdown-menu, +.navbar-fixed-bottom .dropdown .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 1px; +} + +@media (min-width: 768px) { + .navbar-right .dropdown-menu { + right: 0; + left: auto; + } +} + +.btn-group, +.btn-group-vertical { + position: relative; + display: inline-block; + vertical-align: middle; +} + +.btn-group > .btn, +.btn-group-vertical > .btn { + position: relative; + float: left; +} + +.btn-group > .btn:hover, +.btn-group-vertical > .btn:hover, +.btn-group > .btn:focus, +.btn-group-vertical > .btn:focus, +.btn-group > .btn:active, +.btn-group-vertical > .btn:active, +.btn-group > .btn.active, +.btn-group-vertical > .btn.active { + z-index: 2; +} + +.btn-group > .btn:focus, +.btn-group-vertical > .btn:focus { + outline: none; +} + +.btn-group .btn + .btn, +.btn-group .btn + .btn-group, +.btn-group .btn-group + .btn, +.btn-group .btn-group + .btn-group { + margin-left: -1px; +} + +.btn-toolbar:before, +.btn-toolbar:after { + display: table; + content: " "; +} + +.btn-toolbar:after { + clear: both; +} + +.btn-toolbar:before, +.btn-toolbar:after { + display: table; + content: " "; +} + +.btn-toolbar:after { + clear: both; +} + +.btn-toolbar .btn-group { + float: left; +} + +.btn-toolbar > .btn + .btn, +.btn-toolbar > .btn-group + .btn, +.btn-toolbar > .btn + .btn-group, +.btn-toolbar > .btn-group + .btn-group { + margin-left: 5px; +} + +.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { + border-radius: 0; +} + +.btn-group > .btn:first-child { + margin-left: 0; +} + +.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} + +.btn-group > .btn:last-child:not(:first-child), +.btn-group > .dropdown-toggle:not(:first-child) { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} + +.btn-group > .btn-group { + float: left; +} + +.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} + +.btn-group > .btn-group:first-child > .btn:last-child, +.btn-group > .btn-group:first-child > .dropdown-toggle { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} + +.btn-group > .btn-group:last-child > .btn:first-child { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} + +.btn-group .dropdown-toggle:active, +.btn-group.open .dropdown-toggle { + outline: 0; +} + +.btn-group-xs > .btn { + padding: 1px 5px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} + +.btn-group-sm > .btn { + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} + +.btn-group-lg > .btn { + padding: 10px 16px; + font-size: 18px; + line-height: 1.33; + border-radius: 6px; +} + +.btn-group > .btn + .dropdown-toggle { + padding-right: 8px; + padding-left: 8px; +} + +.btn-group > .btn-lg + .dropdown-toggle { + padding-right: 12px; + padding-left: 12px; +} + +.btn-group.open .dropdown-toggle { + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); +} + +.btn-group.open .dropdown-toggle.btn-link { + -webkit-box-shadow: none; + box-shadow: none; +} + +.btn .caret { + margin-left: 0; +} + +.btn-lg .caret { + border-width: 5px 5px 0; + border-bottom-width: 0; +} + +.dropup .btn-lg .caret { + border-width: 0 5px 5px; +} + +.btn-group-vertical > .btn, +.btn-group-vertical > .btn-group, +.btn-group-vertical > .btn-group > .btn { + display: block; + float: none; + width: 100%; + max-width: 100%; +} + +.btn-group-vertical > .btn-group:before, +.btn-group-vertical > .btn-group:after { + display: table; + content: " "; +} + +.btn-group-vertical > .btn-group:after { + clear: both; +} + +.btn-group-vertical > .btn-group:before, +.btn-group-vertical > .btn-group:after { + display: table; + content: " "; +} + +.btn-group-vertical > .btn-group:after { + clear: both; +} + +.btn-group-vertical > .btn-group > .btn { + float: none; +} + +.btn-group-vertical > .btn + .btn, +.btn-group-vertical > .btn + .btn-group, +.btn-group-vertical > .btn-group + .btn, +.btn-group-vertical > .btn-group + .btn-group { + margin-top: -1px; + margin-left: 0; +} + +.btn-group-vertical > .btn:not(:first-child):not(:last-child) { + border-radius: 0; +} + +.btn-group-vertical > .btn:first-child:not(:last-child) { + border-top-right-radius: 4px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} + +.btn-group-vertical > .btn:last-child:not(:first-child) { + border-top-right-radius: 0; + border-bottom-left-radius: 4px; + border-top-left-radius: 0; +} + +.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} + +.btn-group-vertical > .btn-group:first-child > .btn:last-child, +.btn-group-vertical > .btn-group:first-child > .dropdown-toggle { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} + +.btn-group-vertical > .btn-group:last-child > .btn:first-child { + border-top-right-radius: 0; + border-top-left-radius: 0; +} + +.btn-group-justified { + display: table; + width: 100%; + border-collapse: separate; + table-layout: fixed; +} + +.btn-group-justified > .btn, +.btn-group-justified > .btn-group { + display: table-cell; + float: none; + width: 1%; +} + +.btn-group-justified > .btn-group .btn { + width: 100%; +} + +[data-toggle="buttons"] > .btn > input[type="radio"], +[data-toggle="buttons"] > .btn > input[type="checkbox"] { + display: none; +} + +.input-group { + position: relative; + display: table; + border-collapse: separate; +} + +.input-group[class*="col-"] { + float: none; + padding-right: 0; + padding-left: 0; +} + +.input-group .form-control { + width: 100%; + margin-bottom: 0; +} + +.input-group-lg > .form-control, +.input-group-lg > .input-group-addon, +.input-group-lg > .input-group-btn > .btn { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.33; + border-radius: 6px; +} + +select.input-group-lg > .form-control, +select.input-group-lg > .input-group-addon, +select.input-group-lg > .input-group-btn > .btn { + height: 46px; + line-height: 46px; +} + +textarea.input-group-lg > .form-control, +textarea.input-group-lg > .input-group-addon, +textarea.input-group-lg > .input-group-btn > .btn { + height: auto; +} + +.input-group-sm > .form-control, +.input-group-sm > .input-group-addon, +.input-group-sm > .input-group-btn > .btn { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} + +select.input-group-sm > .form-control, +select.input-group-sm > .input-group-addon, +select.input-group-sm > .input-group-btn > .btn { + height: 30px; + line-height: 30px; +} + +textarea.input-group-sm > .form-control, +textarea.input-group-sm > .input-group-addon, +textarea.input-group-sm > .input-group-btn > .btn { + height: auto; +} + +.input-group-addon, +.input-group-btn, +.input-group .form-control { + display: table-cell; +} + +.input-group-addon:not(:first-child):not(:last-child), +.input-group-btn:not(:first-child):not(:last-child), +.input-group .form-control:not(:first-child):not(:last-child) { + border-radius: 0; +} + +.input-group-addon, +.input-group-btn { + width: 1%; + white-space: nowrap; + vertical-align: middle; +} + +.input-group-addon { + padding: 6px 12px; + font-size: 14px; + font-weight: normal; + line-height: 1; + color: #555555; + text-align: center; + background-color: #eeeeee; + border: 1px solid #cccccc; + border-radius: 4px; +} + +.input-group-addon.input-sm { + padding: 5px 10px; + font-size: 12px; + border-radius: 3px; +} + +.input-group-addon.input-lg { + padding: 10px 16px; + font-size: 18px; + border-radius: 6px; +} + +.input-group-addon input[type="radio"], +.input-group-addon input[type="checkbox"] { + margin-top: 0; +} + +.input-group .form-control:first-child, +.input-group-addon:first-child, +.input-group-btn:first-child > .btn, +.input-group-btn:first-child > .dropdown-toggle, +.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} + +.input-group-addon:first-child { + border-right: 0; +} + +.input-group .form-control:last-child, +.input-group-addon:last-child, +.input-group-btn:last-child > .btn, +.input-group-btn:last-child > .dropdown-toggle, +.input-group-btn:first-child > .btn:not(:first-child) { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} + +.input-group-addon:last-child { + border-left: 0; +} + +.input-group-btn { + position: relative; + white-space: nowrap; +} + +.input-group-btn:first-child > .btn { + margin-right: -1px; +} + +.input-group-btn:last-child > .btn { + margin-left: -1px; +} + +.input-group-btn > .btn { + position: relative; +} + +.input-group-btn > .btn + .btn { + margin-left: -4px; +} + +.input-group-btn > .btn:hover, +.input-group-btn > .btn:active { + z-index: 2; +} + +.nav { + padding-left: 0; + margin-bottom: 0; + list-style: none; +} + +.nav:before, +.nav:after { + display: table; + content: " "; +} + +.nav:after { + clear: both; +} + +.nav:before, +.nav:after { + display: table; + content: " "; +} + +.nav:after { + clear: both; +} + +.nav > li { + position: relative; + display: block; +} + +.nav > li > a { + position: relative; + display: block; + padding: 10px 15px; +} + +.nav > li > a:hover, +.nav > li > a:focus { + text-decoration: none; + background-color: #eeeeee; +} + +.nav > li.disabled > a { + color: #999999; +} + +.nav > li.disabled > a:hover, +.nav > li.disabled > a:focus { + color: #999999; + text-decoration: none; + cursor: not-allowed; + background-color: transparent; +} + +.nav .open > a, +.nav .open > a:hover, +.nav .open > a:focus { + background-color: #eeeeee; + border-color: #428bca; +} + +.nav .nav-divider { + height: 1px; + margin: 9px 0; + overflow: hidden; + background-color: #e5e5e5; +} + +.nav > li > a > img { + max-width: none; +} + +.nav-tabs { + border-bottom: 1px solid #dddddd; +} + +.nav-tabs > li { + float: left; + margin-bottom: -1px; +} + +.nav-tabs > li > a { + margin-right: 2px; + line-height: 1.428571429; + border: 1px solid transparent; + border-radius: 4px 4px 0 0; +} + +.nav-tabs > li > a:hover { + border-color: #eeeeee #eeeeee #dddddd; +} + +.nav-tabs > li.active > a, +.nav-tabs > li.active > a:hover, +.nav-tabs > li.active > a:focus { + color: #555555; + cursor: default; + background-color: #ffffff; + border: 1px solid #dddddd; + border-bottom-color: transparent; +} + +.nav-tabs.nav-justified { + width: 100%; + border-bottom: 0; +} + +.nav-tabs.nav-justified > li { + float: none; +} + +.nav-tabs.nav-justified > li > a { + margin-bottom: 5px; + text-align: center; +} + +.nav-tabs.nav-justified > .dropdown .dropdown-menu { + top: auto; + left: auto; +} + +@media (min-width: 768px) { + .nav-tabs.nav-justified > li { + display: table-cell; + width: 1%; + } + .nav-tabs.nav-justified > li > a { + margin-bottom: 0; + } +} + +.nav-tabs.nav-justified > li > a { + margin-right: 0; + border-radius: 4px; +} + +.nav-tabs.nav-justified > .active > a, +.nav-tabs.nav-justified > .active > a:hover, +.nav-tabs.nav-justified > .active > a:focus { + border: 1px solid #dddddd; +} + +@media (min-width: 768px) { + .nav-tabs.nav-justified > li > a { + border-bottom: 1px solid #dddddd; + border-radius: 4px 4px 0 0; + } + .nav-tabs.nav-justified > .active > a, + .nav-tabs.nav-justified > .active > a:hover, + .nav-tabs.nav-justified > .active > a:focus { + border-bottom-color: #ffffff; + } +} + +.nav-pills > li { + float: left; +} + +.nav-pills > li > a { + border-radius: 4px; +} + +.nav-pills > li + li { + margin-left: 2px; +} + +.nav-pills > li.active > a, +.nav-pills > li.active > a:hover, +.nav-pills > li.active > a:focus { + color: #ffffff; + background-color: #428bca; +} + +.nav-stacked > li { + float: none; +} + +.nav-stacked > li + li { + margin-top: 2px; + margin-left: 0; +} + +.nav-justified { + width: 100%; +} + +.nav-justified > li { + float: none; +} + +.nav-justified > li > a { + margin-bottom: 5px; + text-align: center; +} + +.nav-justified > .dropdown .dropdown-menu { + top: auto; + left: auto; +} + +@media (min-width: 768px) { + .nav-justified > li { + display: table-cell; + width: 1%; + } + .nav-justified > li > a { + margin-bottom: 0; + } +} + +.nav-tabs-justified { + border-bottom: 0; +} + +.nav-tabs-justified > li > a { + margin-right: 0; + border-radius: 4px; +} + +.nav-tabs-justified > .active > a, +.nav-tabs-justified > .active > a:hover, +.nav-tabs-justified > .active > a:focus { + border: 1px solid #dddddd; +} + +@media (min-width: 768px) { + .nav-tabs-justified > li > a { + border-bottom: 1px solid #dddddd; + border-radius: 4px 4px 0 0; + } + .nav-tabs-justified > .active > a, + .nav-tabs-justified > .active > a:hover, + .nav-tabs-justified > .active > a:focus { + border-bottom-color: #ffffff; + } +} + +.tab-content > .tab-pane { + display: none; +} + +.tab-content > .active { + display: block; +} + +.nav-tabs .dropdown-menu { + margin-top: -1px; + border-top-right-radius: 0; + border-top-left-radius: 0; +} + +.navbar { + position: relative; + min-height: 50px; + margin-bottom: 20px; + border: 1px solid transparent; +} + +.navbar:before, +.navbar:after { + display: table; + content: " "; +} + +.navbar:after { + clear: both; +} + +.navbar:before, +.navbar:after { + display: table; + content: " "; +} + +.navbar:after { + clear: both; +} + +@media (min-width: 768px) { + .navbar { + border-radius: 4px; + } +} + +.navbar-header:before, +.navbar-header:after { + display: table; + content: " "; +} + +.navbar-header:after { + clear: both; +} + +.navbar-header:before, +.navbar-header:after { + display: table; + content: " "; +} + +.navbar-header:after { + clear: both; +} + +@media (min-width: 768px) { + .navbar-header { + float: left; + } +} + +.navbar-collapse { + max-height: 340px; + padding-right: 15px; + padding-left: 15px; + overflow-x: visible; + border-top: 1px solid transparent; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1); + -webkit-overflow-scrolling: touch; +} + +.navbar-collapse:before, +.navbar-collapse:after { + display: table; + content: " "; +} + +.navbar-collapse:after { + clear: both; +} + +.navbar-collapse:before, +.navbar-collapse:after { + display: table; + content: " "; +} + +.navbar-collapse:after { + clear: both; +} + +.navbar-collapse.in { + overflow-y: auto; +} + +@media (min-width: 768px) { + .navbar-collapse { + width: auto; + border-top: 0; + box-shadow: none; + } + .navbar-collapse.collapse { + display: block !important; + height: auto !important; + padding-bottom: 0; + overflow: visible !important; + } + .navbar-collapse.in { + overflow-y: visible; + } + .navbar-fixed-top .navbar-collapse, + .navbar-static-top .navbar-collapse, + .navbar-fixed-bottom .navbar-collapse { + padding-right: 0; + padding-left: 0; + } +} + +.container > .navbar-header, +.container > .navbar-collapse { + margin-right: -15px; + margin-left: -15px; +} + +@media (min-width: 768px) { + .container > .navbar-header, + .container > .navbar-collapse { + margin-right: 0; + margin-left: 0; + } +} + +.navbar-static-top { + z-index: 1000; + border-width: 0 0 1px; +} + +@media (min-width: 768px) { + .navbar-static-top { + border-radius: 0; + } +} + +.navbar-fixed-top, +.navbar-fixed-bottom { + position: fixed; + right: 0; + left: 0; + z-index: 1030; +} + +@media (min-width: 768px) { + .navbar-fixed-top, + .navbar-fixed-bottom { + border-radius: 0; + } +} + +.navbar-fixed-top { + top: 0; + border-width: 0 0 1px; +} + +.navbar-fixed-bottom { + bottom: 0; + margin-bottom: 0; + border-width: 1px 0 0; +} + +.navbar-brand { + float: left; + padding: 15px 15px; + font-size: 18px; + line-height: 20px; +} + +.navbar-brand:hover, +.navbar-brand:focus { + text-decoration: none; +} + +@media (min-width: 768px) { + .navbar > .container .navbar-brand { + margin-left: -15px; + } +} + +.navbar-toggle { + position: relative; + float: right; + padding: 9px 10px; + margin-top: 8px; + margin-right: 15px; + margin-bottom: 8px; + background-color: transparent; + background-image: none; + border: 1px solid transparent; + border-radius: 4px; +} + +.navbar-toggle .icon-bar { + display: block; + width: 22px; + height: 2px; + border-radius: 1px; +} + +.navbar-toggle .icon-bar + .icon-bar { + margin-top: 4px; +} + +@media (min-width: 768px) { + .navbar-toggle { + display: none; + } +} + +.navbar-nav { + margin: 7.5px -15px; +} + +.navbar-nav > li > a { + padding-top: 10px; + padding-bottom: 10px; + line-height: 20px; +} + +@media (max-width: 767px) { + .navbar-nav .open .dropdown-menu { + position: static; + float: none; + width: auto; + margin-top: 0; + background-color: transparent; + border: 0; + box-shadow: none; + } + .navbar-nav .open .dropdown-menu > li > a, + .navbar-nav .open .dropdown-menu .dropdown-header { + padding: 5px 15px 5px 25px; + } + .navbar-nav .open .dropdown-menu > li > a { + line-height: 20px; + } + .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-nav .open .dropdown-menu > li > a:focus { + background-image: none; + } +} + +@media (min-width: 768px) { + .navbar-nav { + float: left; + margin: 0; + } + .navbar-nav > li { + float: left; + } + .navbar-nav > li > a { + padding-top: 15px; + padding-bottom: 15px; + } + .navbar-nav.navbar-right:last-child { + margin-right: -15px; + } +} + +@media (min-width: 768px) { + .navbar-left { + float: left !important; + } + .navbar-right { + float: right !important; + } +} + +.navbar-form { + padding: 10px 15px; + margin-top: 8px; + margin-right: -15px; + margin-bottom: 8px; + margin-left: -15px; + border-top: 1px solid transparent; + border-bottom: 1px solid transparent; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); +} + +@media (min-width: 768px) { + .navbar-form .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .form-control { + display: inline-block; + } + .navbar-form select.form-control { + width: auto; + } + .navbar-form .radio, + .navbar-form .checkbox { + display: inline-block; + padding-left: 0; + margin-top: 0; + margin-bottom: 0; + } + .navbar-form .radio input[type="radio"], + .navbar-form .checkbox input[type="checkbox"] { + float: none; + margin-left: 0; + } +} + +@media (max-width: 767px) { + .navbar-form .form-group { + margin-bottom: 5px; + } +} + +@media (min-width: 768px) { + .navbar-form { + width: auto; + padding-top: 0; + padding-bottom: 0; + margin-right: 0; + margin-left: 0; + border: 0; + -webkit-box-shadow: none; + box-shadow: none; + } + .navbar-form.navbar-right:last-child { + margin-right: -15px; + } +} + +.navbar-nav > li > .dropdown-menu { + margin-top: 0; + border-top-right-radius: 0; + border-top-left-radius: 0; +} + +.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} + +.navbar-nav.pull-right > li > .dropdown-menu, +.navbar-nav > li > .dropdown-menu.pull-right { + right: 0; + left: auto; +} + +.navbar-btn { + margin-top: 8px; + margin-bottom: 8px; +} + +.navbar-btn.btn-sm { + margin-top: 10px; + margin-bottom: 10px; +} + +.navbar-btn.btn-xs { + margin-top: 14px; + margin-bottom: 14px; +} + +.navbar-text { + margin-top: 15px; + margin-bottom: 15px; +} + +@media (min-width: 768px) { + .navbar-text { + float: left; + margin-right: 15px; + margin-left: 15px; + } + .navbar-text.navbar-right:last-child { + margin-right: 0; + } +} + +.navbar-default { + background-color: #f8f8f8; + border-color: #e7e7e7; +} + +.navbar-default .navbar-brand { + color: #777777; +} + +.navbar-default .navbar-brand:hover, +.navbar-default .navbar-brand:focus { + color: #5e5e5e; + background-color: transparent; +} + +.navbar-default .navbar-text { + color: #777777; +} + +.navbar-default .navbar-nav > li > a { + color: #777777; +} + +.navbar-default .navbar-nav > li > a:hover, +.navbar-default .navbar-nav > li > a:focus { + color: #333333; + background-color: transparent; +} + +.navbar-default .navbar-nav > .active > a, +.navbar-default .navbar-nav > .active > a:hover, +.navbar-default .navbar-nav > .active > a:focus { + color: #555555; + background-color: #e7e7e7; +} + +.navbar-default .navbar-nav > .disabled > a, +.navbar-default .navbar-nav > .disabled > a:hover, +.navbar-default .navbar-nav > .disabled > a:focus { + color: #cccccc; + background-color: transparent; +} + +.navbar-default .navbar-toggle { + border-color: #dddddd; +} + +.navbar-default .navbar-toggle:hover, +.navbar-default .navbar-toggle:focus { + background-color: #dddddd; +} + +.navbar-default .navbar-toggle .icon-bar { + background-color: #cccccc; +} + +.navbar-default .navbar-collapse, +.navbar-default .navbar-form { + border-color: #e7e7e7; +} + +.navbar-default .navbar-nav > .open > a, +.navbar-default .navbar-nav > .open > a:hover, +.navbar-default .navbar-nav > .open > a:focus { + color: #555555; + background-color: #e7e7e7; +} + +@media (max-width: 767px) { + .navbar-default .navbar-nav .open .dropdown-menu > li > a { + color: #777777; + } + .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { + color: #333333; + background-color: transparent; + } + .navbar-default .navbar-nav .open .dropdown-menu > .active > a, + .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #555555; + background-color: #e7e7e7; + } + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { + color: #cccccc; + background-color: transparent; + } +} + +.navbar-default .navbar-link { + color: #777777; +} + +.navbar-default .navbar-link:hover { + color: #333333; +} + +.navbar-inverse { + background-color: #222222; + border-color: #080808; +} + +.navbar-inverse .navbar-brand { + color: #999999; +} + +.navbar-inverse .navbar-brand:hover, +.navbar-inverse .navbar-brand:focus { + color: #ffffff; + background-color: transparent; +} + +.navbar-inverse .navbar-text { + color: #999999; +} + +.navbar-inverse .navbar-nav > li > a { + color: #999999; +} + +.navbar-inverse .navbar-nav > li > a:hover, +.navbar-inverse .navbar-nav > li > a:focus { + color: #ffffff; + background-color: transparent; +} + +.navbar-inverse .navbar-nav > .active > a, +.navbar-inverse .navbar-nav > .active > a:hover, +.navbar-inverse .navbar-nav > .active > a:focus { + color: #ffffff; + background-color: #080808; +} + +.navbar-inverse .navbar-nav > .disabled > a, +.navbar-inverse .navbar-nav > .disabled > a:hover, +.navbar-inverse .navbar-nav > .disabled > a:focus { + color: #444444; + background-color: transparent; +} + +.navbar-inverse .navbar-toggle { + border-color: #333333; +} + +.navbar-inverse .navbar-toggle:hover, +.navbar-inverse .navbar-toggle:focus { + background-color: #333333; +} + +.navbar-inverse .navbar-toggle .icon-bar { + background-color: #ffffff; +} + +.navbar-inverse .navbar-collapse, +.navbar-inverse .navbar-form { + border-color: #101010; +} + +.navbar-inverse .navbar-nav > .open > a, +.navbar-inverse .navbar-nav > .open > a:hover, +.navbar-inverse .navbar-nav > .open > a:focus { + color: #ffffff; + background-color: #080808; +} + +@media (max-width: 767px) { + .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { + border-color: #080808; + } + .navbar-inverse .navbar-nav .open .dropdown-menu .divider { + background-color: #080808; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { + color: #999999; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { + color: #ffffff; + background-color: transparent; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #ffffff; + background-color: #080808; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { + color: #444444; + background-color: transparent; + } +} + +.navbar-inverse .navbar-link { + color: #999999; +} + +.navbar-inverse .navbar-link:hover { + color: #ffffff; +} + +.breadcrumb { + padding: 8px 15px; + margin-bottom: 20px; + list-style: none; + background-color: #f5f5f5; + border-radius: 4px; +} + +.breadcrumb > li { + display: inline-block; +} + +.breadcrumb > li + li:before { + padding: 0 5px; + color: #cccccc; + content: "/\00a0"; +} + +.breadcrumb > .active { + color: #999999; +} + +.pagination { + display: inline-block; + padding-left: 0; + margin: 20px 0; + border-radius: 4px; +} + +.pagination > li { + display: inline; +} + +.pagination > li > a, +.pagination > li > span { + position: relative; + float: left; + padding: 6px 12px; + margin-left: -1px; + line-height: 1.428571429; + text-decoration: none; + background-color: #ffffff; + border: 1px solid #dddddd; +} + +.pagination > li:first-child > a, +.pagination > li:first-child > span { + margin-left: 0; + border-bottom-left-radius: 4px; + border-top-left-radius: 4px; +} + +.pagination > li:last-child > a, +.pagination > li:last-child > span { + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; +} + +.pagination > li > a:hover, +.pagination > li > span:hover, +.pagination > li > a:focus, +.pagination > li > span:focus { + background-color: #eeeeee; +} + +.pagination > .active > a, +.pagination > .active > span, +.pagination > .active > a:hover, +.pagination > .active > span:hover, +.pagination > .active > a:focus, +.pagination > .active > span:focus { + z-index: 2; + color: #ffffff; + cursor: default; + background-color: #428bca; + border-color: #428bca; +} + +.pagination > .disabled > span, +.pagination > .disabled > span:hover, +.pagination > .disabled > span:focus, +.pagination > .disabled > a, +.pagination > .disabled > a:hover, +.pagination > .disabled > a:focus { + color: #999999; + cursor: not-allowed; + background-color: #ffffff; + border-color: #dddddd; +} + +.pagination-lg > li > a, +.pagination-lg > li > span { + padding: 10px 16px; + font-size: 18px; +} + +.pagination-lg > li:first-child > a, +.pagination-lg > li:first-child > span { + border-bottom-left-radius: 6px; + border-top-left-radius: 6px; +} + +.pagination-lg > li:last-child > a, +.pagination-lg > li:last-child > span { + border-top-right-radius: 6px; + border-bottom-right-radius: 6px; +} + +.pagination-sm > li > a, +.pagination-sm > li > span { + padding: 5px 10px; + font-size: 12px; +} + +.pagination-sm > li:first-child > a, +.pagination-sm > li:first-child > span { + border-bottom-left-radius: 3px; + border-top-left-radius: 3px; +} + +.pagination-sm > li:last-child > a, +.pagination-sm > li:last-child > span { + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; +} + +.pager { + padding-left: 0; + margin: 20px 0; + text-align: center; + list-style: none; +} + +.pager:before, +.pager:after { + display: table; + content: " "; +} + +.pager:after { + clear: both; +} + +.pager:before, +.pager:after { + display: table; + content: " "; +} + +.pager:after { + clear: both; +} + +.pager li { + display: inline; +} + +.pager li > a, +.pager li > span { + display: inline-block; + padding: 5px 14px; + background-color: #ffffff; + border: 1px solid #dddddd; + border-radius: 15px; +} + +.pager li > a:hover, +.pager li > a:focus { + text-decoration: none; + background-color: #eeeeee; +} + +.pager .next > a, +.pager .next > span { + float: right; +} + +.pager .previous > a, +.pager .previous > span { + float: left; +} + +.pager .disabled > a, +.pager .disabled > a:hover, +.pager .disabled > a:focus, +.pager .disabled > span { + color: #999999; + cursor: not-allowed; + background-color: #ffffff; +} + +.label { + display: inline; + padding: .2em .6em .3em; + font-size: 75%; + font-weight: bold; + line-height: 1; + color: #ffffff; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: .25em; +} + +.label[href]:hover, +.label[href]:focus { + color: #ffffff; + text-decoration: none; + cursor: pointer; +} + +.label:empty { + display: none; +} + +.btn .label { + position: relative; + top: -1px; +} + +.label-default { + background-color: #999999; +} + +.label-default[href]:hover, +.label-default[href]:focus { + background-color: #808080; +} + +.label-primary { + background-color: #428bca; +} + +.label-primary[href]:hover, +.label-primary[href]:focus { + background-color: #3071a9; +} + +.label-success { + background-color: #5cb85c; +} + +.label-success[href]:hover, +.label-success[href]:focus { + background-color: #449d44; +} + +.label-info { + background-color: #5bc0de; +} + +.label-info[href]:hover, +.label-info[href]:focus { + background-color: #31b0d5; +} + +.label-warning { + background-color: #f0ad4e; +} + +.label-warning[href]:hover, +.label-warning[href]:focus { + background-color: #ec971f; +} + +.label-danger { + background-color: #d9534f; +} + +.label-danger[href]:hover, +.label-danger[href]:focus { + background-color: #c9302c; +} + +.badge { + display: inline-block; + min-width: 10px; + padding: 3px 7px; + font-size: 12px; + font-weight: bold; + line-height: 1; + color: #ffffff; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + background-color: #999999; + border-radius: 10px; +} + +.badge:empty { + display: none; +} + +.btn .badge { + position: relative; + top: -1px; +} + +a.badge:hover, +a.badge:focus { + color: #ffffff; + text-decoration: none; + cursor: pointer; +} + +a.list-group-item.active > .badge, +.nav-pills > .active > a > .badge { + color: #428bca; + background-color: #ffffff; +} + +.nav-pills > li > a > .badge { + margin-left: 3px; +} + +.jumbotron { + padding: 30px; + margin-bottom: 30px; + font-size: 21px; + font-weight: 200; + line-height: 2.1428571435; + color: inherit; + background-color: #eeeeee; +} + +.jumbotron h1, +.jumbotron .h1 { + line-height: 1; + color: inherit; +} + +.jumbotron p { + line-height: 1.4; +} + +.container .jumbotron { + border-radius: 6px; +} + +.jumbotron .container { + max-width: 100%; +} + +@media screen and (min-width: 768px) { + .jumbotron { + padding-top: 48px; + padding-bottom: 48px; + } + .container .jumbotron { + padding-right: 60px; + padding-left: 60px; + } + .jumbotron h1, + .jumbotron .h1 { + font-size: 63px; + } +} + +.thumbnail { + display: block; + padding: 4px; + margin-bottom: 20px; + line-height: 1.428571429; + background-color: #ffffff; + border: 1px solid #dddddd; + border-radius: 4px; + -webkit-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; +} + +.thumbnail > img, +.thumbnail a > img { + display: block; + height: auto; + max-width: 100%; + margin-right: auto; + margin-left: auto; +} + +a.thumbnail:hover, +a.thumbnail:focus, +a.thumbnail.active { + border-color: #428bca; +} + +.thumbnail .caption { + padding: 9px; + color: #333333; +} + +.alert { + padding: 15px; + margin-bottom: 20px; + border: 1px solid transparent; + border-radius: 4px; +} + +.alert h4 { + margin-top: 0; + color: inherit; +} + +.alert .alert-link { + font-weight: bold; +} + +.alert > p, +.alert > ul { + margin-bottom: 0; +} + +.alert > p + p { + margin-top: 5px; +} + +.alert-dismissable { + padding-right: 35px; +} + +.alert-dismissable .close { + position: relative; + top: -2px; + right: -21px; + color: inherit; +} + +.alert-success { + color: #3c763d; + background-color: #dff0d8; + border-color: #d6e9c6; +} + +.alert-success hr { + border-top-color: #c9e2b3; +} + +.alert-success .alert-link { + color: #2b542c; +} + +.alert-info { + color: #31708f; + background-color: #d9edf7; + border-color: #bce8f1; +} + +.alert-info hr { + border-top-color: #a6e1ec; +} + +.alert-info .alert-link { + color: #245269; +} + +.alert-warning { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #faebcc; +} + +.alert-warning hr { + border-top-color: #f7e1b5; +} + +.alert-warning .alert-link { + color: #66512c; +} + +.alert-danger { + color: #a94442; + background-color: #f2dede; + border-color: #ebccd1; +} + +.alert-danger hr { + border-top-color: #e4b9c0; +} + +.alert-danger .alert-link { + color: #843534; +} + +@-webkit-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} + +@keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} + +.progress { + height: 20px; + margin-bottom: 20px; + overflow: hidden; + background-color: #f5f5f5; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); +} + +.progress-bar { + float: left; + width: 0; + height: 100%; + font-size: 12px; + line-height: 20px; + color: #ffffff; + text-align: center; + background-color: #428bca; + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -webkit-transition: width 0.6s ease; + transition: width 0.6s ease; +} + +.progress-striped .progress-bar { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-size: 40px 40px; +} + +.progress.active .progress-bar { + -webkit-animation: progress-bar-stripes 2s linear infinite; + animation: progress-bar-stripes 2s linear infinite; +} + +.progress-bar-success { + background-color: #5cb85c; +} + +.progress-striped .progress-bar-success { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} + +.progress-bar-info { + background-color: #5bc0de; +} + +.progress-striped .progress-bar-info { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} + +.progress-bar-warning { + background-color: #f0ad4e; +} + +.progress-striped .progress-bar-warning { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} + +.progress-bar-danger { + background-color: #d9534f; +} + +.progress-striped .progress-bar-danger { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} + +.media, +.media-body { + overflow: hidden; + zoom: 1; +} + +.media, +.media .media { + margin-top: 15px; +} + +.media:first-child { + margin-top: 0; +} + +.media-object { + display: block; +} + +.media-heading { + margin: 0 0 5px; +} + +.media > .pull-left { + margin-right: 10px; +} + +.media > .pull-right { + margin-left: 10px; +} + +.media-list { + padding-left: 0; + list-style: none; +} + +.list-group { + padding-left: 0; + margin-bottom: 20px; +} + +.list-group-item { + position: relative; + display: block; + padding: 10px 15px; + margin-bottom: -1px; + background-color: #ffffff; + border: 1px solid #dddddd; +} + +.list-group-item:first-child { + border-top-right-radius: 4px; + border-top-left-radius: 4px; +} + +.list-group-item:last-child { + margin-bottom: 0; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} + +.list-group-item > .badge { + float: right; +} + +.list-group-item > .badge + .badge { + margin-right: 5px; +} + +a.list-group-item { + color: #555555; +} + +a.list-group-item .list-group-item-heading { + color: #333333; +} + +a.list-group-item:hover, +a.list-group-item:focus { + text-decoration: none; + background-color: #f5f5f5; +} + +a.list-group-item.active, +a.list-group-item.active:hover, +a.list-group-item.active:focus { + z-index: 2; + color: #ffffff; + background-color: #428bca; + border-color: #428bca; +} + +a.list-group-item.active .list-group-item-heading, +a.list-group-item.active:hover .list-group-item-heading, +a.list-group-item.active:focus .list-group-item-heading { + color: inherit; +} + +a.list-group-item.active .list-group-item-text, +a.list-group-item.active:hover .list-group-item-text, +a.list-group-item.active:focus .list-group-item-text { + color: #e1edf7; +} + +.list-group-item-heading { + margin-top: 0; + margin-bottom: 5px; +} + +.list-group-item-text { + margin-bottom: 0; + line-height: 1.3; +} + +.panel { + margin-bottom: 20px; + background-color: #ffffff; + border: 1px solid transparent; + border-radius: 4px; + -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); +} + +.panel-body { + padding: 15px; +} + +.panel-body:before, +.panel-body:after { + display: table; + content: " "; +} + +.panel-body:after { + clear: both; +} + +.panel-body:before, +.panel-body:after { + display: table; + content: " "; +} + +.panel-body:after { + clear: both; +} + +.panel > .list-group { + margin-bottom: 0; +} + +.panel > .list-group .list-group-item { + border-width: 1px 0; +} + +.panel > .list-group .list-group-item:first-child { + border-top-right-radius: 0; + border-top-left-radius: 0; +} + +.panel > .list-group .list-group-item:last-child { + border-bottom: 0; +} + +.panel-heading + .list-group .list-group-item:first-child { + border-top-width: 0; +} + +.panel > .table, +.panel > .table-responsive > .table { + margin-bottom: 0; +} + +.panel > .panel-body + .table, +.panel > .panel-body + .table-responsive { + border-top: 1px solid #dddddd; +} + +.panel > .table > tbody:first-child th, +.panel > .table > tbody:first-child td { + border-top: 0; +} + +.panel > .table-bordered, +.panel > .table-responsive > .table-bordered { + border: 0; +} + +.panel > .table-bordered > thead > tr > th:first-child, +.panel > .table-responsive > .table-bordered > thead > tr > th:first-child, +.panel > .table-bordered > tbody > tr > th:first-child, +.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, +.panel > .table-bordered > tfoot > tr > th:first-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, +.panel > .table-bordered > thead > tr > td:first-child, +.panel > .table-responsive > .table-bordered > thead > tr > td:first-child, +.panel > .table-bordered > tbody > tr > td:first-child, +.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, +.panel > .table-bordered > tfoot > tr > td:first-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; +} + +.panel > .table-bordered > thead > tr > th:last-child, +.panel > .table-responsive > .table-bordered > thead > tr > th:last-child, +.panel > .table-bordered > tbody > tr > th:last-child, +.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, +.panel > .table-bordered > tfoot > tr > th:last-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, +.panel > .table-bordered > thead > tr > td:last-child, +.panel > .table-responsive > .table-bordered > thead > tr > td:last-child, +.panel > .table-bordered > tbody > tr > td:last-child, +.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, +.panel > .table-bordered > tfoot > tr > td:last-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; +} + +.panel > .table-bordered > thead > tr:last-child > th, +.panel > .table-responsive > .table-bordered > thead > tr:last-child > th, +.panel > .table-bordered > tbody > tr:last-child > th, +.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th, +.panel > .table-bordered > tfoot > tr:last-child > th, +.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th, +.panel > .table-bordered > thead > tr:last-child > td, +.panel > .table-responsive > .table-bordered > thead > tr:last-child > td, +.panel > .table-bordered > tbody > tr:last-child > td, +.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td, +.panel > .table-bordered > tfoot > tr:last-child > td, +.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td { + border-bottom: 0; +} + +.panel > .table-responsive { + margin-bottom: 0; + border: 0; +} + +.panel-heading { + padding: 10px 15px; + border-bottom: 1px solid transparent; + border-top-right-radius: 3px; + border-top-left-radius: 3px; +} + +.panel-heading > .dropdown .dropdown-toggle { + color: inherit; +} + +.panel-title { + margin-top: 0; + margin-bottom: 0; + font-size: 16px; + color: inherit; +} + +.panel-title > a { + color: inherit; +} + +.panel-footer { + padding: 10px 15px; + background-color: #f5f5f5; + border-top: 1px solid #dddddd; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} + +.panel-group .panel { + margin-bottom: 0; + overflow: hidden; + border-radius: 4px; +} + +.panel-group .panel + .panel { + margin-top: 5px; +} + +.panel-group .panel-heading { + border-bottom: 0; +} + +.panel-group .panel-heading + .panel-collapse .panel-body { + border-top: 1px solid #dddddd; +} + +.panel-group .panel-footer { + border-top: 0; +} + +.panel-group .panel-footer + .panel-collapse .panel-body { + border-bottom: 1px solid #dddddd; +} + +.panel-default { + border-color: #dddddd; +} + +.panel-default > .panel-heading { + color: #333333; + background-color: #f5f5f5; + border-color: #dddddd; +} + +.panel-default > .panel-heading + .panel-collapse .panel-body { + border-top-color: #dddddd; +} + +.panel-default > .panel-footer + .panel-collapse .panel-body { + border-bottom-color: #dddddd; +} + +.panel-primary { + border-color: #428bca; +} + +.panel-primary > .panel-heading { + color: #ffffff; + background-color: #428bca; + border-color: #428bca; +} + +.panel-primary > .panel-heading + .panel-collapse .panel-body { + border-top-color: #428bca; +} + +.panel-primary > .panel-footer + .panel-collapse .panel-body { + border-bottom-color: #428bca; +} + +.panel-success { + border-color: #d6e9c6; +} + +.panel-success > .panel-heading { + color: #3c763d; + background-color: #dff0d8; + border-color: #d6e9c6; +} + +.panel-success > .panel-heading + .panel-collapse .panel-body { + border-top-color: #d6e9c6; +} + +.panel-success > .panel-footer + .panel-collapse .panel-body { + border-bottom-color: #d6e9c6; +} + +.panel-warning { + border-color: #faebcc; +} + +.panel-warning > .panel-heading { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #faebcc; +} + +.panel-warning > .panel-heading + .panel-collapse .panel-body { + border-top-color: #faebcc; +} + +.panel-warning > .panel-footer + .panel-collapse .panel-body { + border-bottom-color: #faebcc; +} + +.panel-danger { + border-color: #ebccd1; +} + +.panel-danger > .panel-heading { + color: #a94442; + background-color: #f2dede; + border-color: #ebccd1; +} + +.panel-danger > .panel-heading + .panel-collapse .panel-body { + border-top-color: #ebccd1; +} + +.panel-danger > .panel-footer + .panel-collapse .panel-body { + border-bottom-color: #ebccd1; +} + +.panel-info { + border-color: #bce8f1; +} + +.panel-info > .panel-heading { + color: #31708f; + background-color: #d9edf7; + border-color: #bce8f1; +} + +.panel-info > .panel-heading + .panel-collapse .panel-body { + border-top-color: #bce8f1; +} + +.panel-info > .panel-footer + .panel-collapse .panel-body { + border-bottom-color: #bce8f1; +} + +.well { + min-height: 20px; + padding: 19px; + margin-bottom: 20px; + background-color: #f5f5f5; + border: 1px solid #e3e3e3; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); +} + +.well blockquote { + border-color: #ddd; + border-color: rgba(0, 0, 0, 0.15); +} + +.well-lg { + padding: 24px; + border-radius: 6px; +} + +.well-sm { + padding: 9px; + border-radius: 3px; +} + +.close { + float: right; + font-size: 21px; + font-weight: bold; + line-height: 1; + color: #000000; + text-shadow: 0 1px 0 #ffffff; + opacity: 0.2; + filter: alpha(opacity=20); +} + +.close:hover, +.close:focus { + color: #000000; + text-decoration: none; + cursor: pointer; + opacity: 0.5; + filter: alpha(opacity=50); +} + +button.close { + padding: 0; + cursor: pointer; + background: transparent; + border: 0; + -webkit-appearance: none; +} + +.modal-open { + overflow: hidden; +} + +.modal { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; + display: none; + overflow: auto; + overflow-y: scroll; +} + +.modal.fade .modal-dialog { + -webkit-transform: translate(0, -25%); + -ms-transform: translate(0, -25%); + transform: translate(0, -25%); + -webkit-transition: -webkit-transform 0.3s ease-out; + -moz-transition: -moz-transform 0.3s ease-out; + -o-transition: -o-transform 0.3s ease-out; + transition: transform 0.3s ease-out; +} + +.modal.in .modal-dialog { + -webkit-transform: translate(0, 0); + -ms-transform: translate(0, 0); + transform: translate(0, 0); +} + +.modal-dialog { + position: relative; + z-index: 1050; + width: auto; + margin: 10px; +} + +.modal-content { + position: relative; + background-color: #ffffff; + border: 1px solid #999999; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 6px; + outline: none; + -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); + box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); + background-clip: padding-box; +} + +.modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1030; + background-color: #000000; +} + +.modal-backdrop.fade { + opacity: 0; + filter: alpha(opacity=0); +} + +.modal-backdrop.in { + opacity: 0.5; + filter: alpha(opacity=50); +} + +.modal-header { + min-height: 16.428571429px; + padding: 15px; + border-bottom: 1px solid #e5e5e5; +} + +.modal-header .close { + margin-top: -2px; +} + +.modal-title { + margin: 0; + line-height: 1.428571429; +} + +.modal-body { + position: relative; + padding: 20px; +} + +.modal-footer { + padding: 19px 20px 20px; + margin-top: 15px; + text-align: right; + border-top: 1px solid #e5e5e5; +} + +.modal-footer:before, +.modal-footer:after { + display: table; + content: " "; +} + +.modal-footer:after { + clear: both; +} + +.modal-footer:before, +.modal-footer:after { + display: table; + content: " "; +} + +.modal-footer:after { + clear: both; +} + +.modal-footer .btn + .btn { + margin-bottom: 0; + margin-left: 5px; +} + +.modal-footer .btn-group .btn + .btn { + margin-left: -1px; +} + +.modal-footer .btn-block + .btn-block { + margin-left: 0; +} + +@media screen and (min-width: 768px) { + .modal-dialog { + width: 600px; + margin: 30px auto; + } + .modal-content { + -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); + box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); + } +} + +.tooltip { + position: absolute; + z-index: 1030; + display: block; + font-size: 12px; + line-height: 1.4; + opacity: 0; + filter: alpha(opacity=0); + visibility: visible; +} + +.tooltip.in { + opacity: 0.9; + filter: alpha(opacity=90); +} + +.tooltip.top { + padding: 5px 0; + margin-top: -3px; +} + +.tooltip.right { + padding: 0 5px; + margin-left: 3px; +} + +.tooltip.bottom { + padding: 5px 0; + margin-top: 3px; +} + +.tooltip.left { + padding: 0 5px; + margin-left: -3px; +} + +.tooltip-inner { + max-width: 200px; + padding: 3px 8px; + color: #ffffff; + text-align: center; + text-decoration: none; + background-color: #000000; + border-radius: 4px; +} + +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} + +.tooltip.top .tooltip-arrow { + bottom: 0; + left: 50%; + margin-left: -5px; + border-top-color: #000000; + border-width: 5px 5px 0; +} + +.tooltip.top-left .tooltip-arrow { + bottom: 0; + left: 5px; + border-top-color: #000000; + border-width: 5px 5px 0; +} + +.tooltip.top-right .tooltip-arrow { + right: 5px; + bottom: 0; + border-top-color: #000000; + border-width: 5px 5px 0; +} + +.tooltip.right .tooltip-arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-right-color: #000000; + border-width: 5px 5px 5px 0; +} + +.tooltip.left .tooltip-arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-left-color: #000000; + border-width: 5px 0 5px 5px; +} + +.tooltip.bottom .tooltip-arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-bottom-color: #000000; + border-width: 0 5px 5px; +} + +.tooltip.bottom-left .tooltip-arrow { + top: 0; + left: 5px; + border-bottom-color: #000000; + border-width: 0 5px 5px; +} + +.tooltip.bottom-right .tooltip-arrow { + top: 0; + right: 5px; + border-bottom-color: #000000; + border-width: 0 5px 5px; +} + +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1010; + display: none; + max-width: 276px; + padding: 1px; + text-align: left; + white-space: normal; + background-color: #ffffff; + border: 1px solid #cccccc; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 6px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + background-clip: padding-box; +} + +.popover.top { + margin-top: -10px; +} + +.popover.right { + margin-left: 10px; +} + +.popover.bottom { + margin-top: 10px; +} + +.popover.left { + margin-left: -10px; +} + +.popover-title { + padding: 8px 14px; + margin: 0; + font-size: 14px; + font-weight: normal; + line-height: 18px; + background-color: #f7f7f7; + border-bottom: 1px solid #ebebeb; + border-radius: 5px 5px 0 0; +} + +.popover-content { + padding: 9px 14px; +} + +.popover .arrow, +.popover .arrow:after { + position: absolute; + display: block; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} + +.popover .arrow { + border-width: 11px; +} + +.popover .arrow:after { + border-width: 10px; + content: ""; +} + +.popover.top .arrow { + bottom: -11px; + left: 50%; + margin-left: -11px; + border-top-color: #999999; + border-top-color: rgba(0, 0, 0, 0.25); + border-bottom-width: 0; +} + +.popover.top .arrow:after { + bottom: 1px; + margin-left: -10px; + border-top-color: #ffffff; + border-bottom-width: 0; + content: " "; +} + +.popover.right .arrow { + top: 50%; + left: -11px; + margin-top: -11px; + border-right-color: #999999; + border-right-color: rgba(0, 0, 0, 0.25); + border-left-width: 0; +} + +.popover.right .arrow:after { + bottom: -10px; + left: 1px; + border-right-color: #ffffff; + border-left-width: 0; + content: " "; +} + +.popover.bottom .arrow { + top: -11px; + left: 50%; + margin-left: -11px; + border-bottom-color: #999999; + border-bottom-color: rgba(0, 0, 0, 0.25); + border-top-width: 0; +} + +.popover.bottom .arrow:after { + top: 1px; + margin-left: -10px; + border-bottom-color: #ffffff; + border-top-width: 0; + content: " "; +} + +.popover.left .arrow { + top: 50%; + right: -11px; + margin-top: -11px; + border-left-color: #999999; + border-left-color: rgba(0, 0, 0, 0.25); + border-right-width: 0; +} + +.popover.left .arrow:after { + right: 1px; + bottom: -10px; + border-left-color: #ffffff; + border-right-width: 0; + content: " "; +} + +.carousel { + position: relative; +} + +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden; +} + +.carousel-inner > .item { + position: relative; + display: none; + -webkit-transition: 0.6s ease-in-out left; + transition: 0.6s ease-in-out left; +} + +.carousel-inner > .item > img, +.carousel-inner > .item > a > img { + display: block; + height: auto; + max-width: 100%; + line-height: 1; +} + +.carousel-inner > .active, +.carousel-inner > .next, +.carousel-inner > .prev { + display: block; +} + +.carousel-inner > .active { + left: 0; +} + +.carousel-inner > .next, +.carousel-inner > .prev { + position: absolute; + top: 0; + width: 100%; +} + +.carousel-inner > .next { + left: 100%; +} + +.carousel-inner > .prev { + left: -100%; +} + +.carousel-inner > .next.left, +.carousel-inner > .prev.right { + left: 0; +} + +.carousel-inner > .active.left { + left: -100%; +} + +.carousel-inner > .active.right { + left: 100%; +} + +.carousel-control { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 15%; + font-size: 20px; + color: #ffffff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); + opacity: 0.5; + filter: alpha(opacity=50); +} + +.carousel-control.left { + background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.5) 0), color-stop(rgba(0, 0, 0, 0.0001) 100%)); + background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0, rgba(0, 0, 0, 0.0001) 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); +} + +.carousel-control.right { + right: 0; + left: auto; + background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.0001) 0), color-stop(rgba(0, 0, 0, 0.5) 100%)); + background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0, rgba(0, 0, 0, 0.5) 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); +} + +.carousel-control:hover, +.carousel-control:focus { + color: #ffffff; + text-decoration: none; + outline: none; + opacity: 0.9; + filter: alpha(opacity=90); +} + +.carousel-control .icon-prev, +.carousel-control .icon-next, +.carousel-control .glyphicon-chevron-left, +.carousel-control .glyphicon-chevron-right { + position: absolute; + top: 50%; + z-index: 5; + display: inline-block; +} + +.carousel-control .icon-prev, +.carousel-control .glyphicon-chevron-left { + left: 50%; +} + +.carousel-control .icon-next, +.carousel-control .glyphicon-chevron-right { + right: 50%; +} + +.carousel-control .icon-prev, +.carousel-control .icon-next { + width: 20px; + height: 20px; + margin-top: -10px; + margin-left: -10px; + font-family: serif; +} + +.carousel-control .icon-prev:before { + content: '\2039'; +} + +.carousel-control .icon-next:before { + content: '\203a'; +} + +.carousel-indicators { + position: absolute; + bottom: 10px; + left: 50%; + z-index: 15; + width: 60%; + padding-left: 0; + margin-left: -30%; + text-align: center; + list-style: none; +} + +.carousel-indicators li { + display: inline-block; + width: 10px; + height: 10px; + margin: 1px; + text-indent: -999px; + cursor: pointer; + background-color: #000 \9; + background-color: rgba(0, 0, 0, 0); + border: 1px solid #ffffff; + border-radius: 10px; +} + +.carousel-indicators .active { + width: 12px; + height: 12px; + margin: 0; + background-color: #ffffff; +} + +.carousel-caption { + position: absolute; + right: 15%; + bottom: 20px; + left: 15%; + z-index: 10; + padding-top: 20px; + padding-bottom: 20px; + color: #ffffff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); +} + +.carousel-caption .btn { + text-shadow: none; +} + +@media screen and (min-width: 768px) { + .carousel-control .glyphicons-chevron-left, + .carousel-control .glyphicons-chevron-right, + .carousel-control .icon-prev, + .carousel-control .icon-next { + width: 30px; + height: 30px; + margin-top: -15px; + margin-left: -15px; + font-size: 30px; + } + .carousel-caption { + right: 20%; + left: 20%; + padding-bottom: 30px; + } + .carousel-indicators { + bottom: 20px; + } +} + +.clearfix:before, +.clearfix:after { + display: table; + content: " "; +} + +.clearfix:after { + clear: both; +} + +.center-block { + display: block; + margin-right: auto; + margin-left: auto; +} + +.pull-right { + float: right !important; +} + +.pull-left { + float: left !important; +} + +.hide { + display: none !important; +} + +.show { + display: block !important; +} + +.invisible { + visibility: hidden; +} + +.text-hide { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +.hidden { + display: none !important; + visibility: hidden !important; +} + +.affix { + position: fixed; +} + +@-ms-viewport { + width: device-width; +} + +.visible-xs, +tr.visible-xs, +th.visible-xs, +td.visible-xs { + display: none !important; +} + +@media (max-width: 767px) { + .visible-xs { + display: block !important; + } + table.visible-xs { + display: table; + } + tr.visible-xs { + display: table-row !important; + } + th.visible-xs, + td.visible-xs { + display: table-cell !important; + } +} + +@media (min-width: 768px) and (max-width: 991px) { + .visible-xs.visible-sm { + display: block !important; + } + table.visible-xs.visible-sm { + display: table; + } + tr.visible-xs.visible-sm { + display: table-row !important; + } + th.visible-xs.visible-sm, + td.visible-xs.visible-sm { + display: table-cell !important; + } +} + +@media (min-width: 992px) and (max-width: 1199px) { + .visible-xs.visible-md { + display: block !important; + } + table.visible-xs.visible-md { + display: table; + } + tr.visible-xs.visible-md { + display: table-row !important; + } + th.visible-xs.visible-md, + td.visible-xs.visible-md { + display: table-cell !important; + } +} + +@media (min-width: 1200px) { + .visible-xs.visible-lg { + display: block !important; + } + table.visible-xs.visible-lg { + display: table; + } + tr.visible-xs.visible-lg { + display: table-row !important; + } + th.visible-xs.visible-lg, + td.visible-xs.visible-lg { + display: table-cell !important; + } +} + +.visible-sm, +tr.visible-sm, +th.visible-sm, +td.visible-sm { + display: none !important; +} + +@media (max-width: 767px) { + .visible-sm.visible-xs { + display: block !important; + } + table.visible-sm.visible-xs { + display: table; + } + tr.visible-sm.visible-xs { + display: table-row !important; + } + th.visible-sm.visible-xs, + td.visible-sm.visible-xs { + display: table-cell !important; + } +} + +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm { + display: block !important; + } + table.visible-sm { + display: table; + } + tr.visible-sm { + display: table-row !important; + } + th.visible-sm, + td.visible-sm { + display: table-cell !important; + } +} + +@media (min-width: 992px) and (max-width: 1199px) { + .visible-sm.visible-md { + display: block !important; + } + table.visible-sm.visible-md { + display: table; + } + tr.visible-sm.visible-md { + display: table-row !important; + } + th.visible-sm.visible-md, + td.visible-sm.visible-md { + display: table-cell !important; + } +} + +@media (min-width: 1200px) { + .visible-sm.visible-lg { + display: block !important; + } + table.visible-sm.visible-lg { + display: table; + } + tr.visible-sm.visible-lg { + display: table-row !important; + } + th.visible-sm.visible-lg, + td.visible-sm.visible-lg { + display: table-cell !important; + } +} + +.visible-md, +tr.visible-md, +th.visible-md, +td.visible-md { + display: none !important; +} + +@media (max-width: 767px) { + .visible-md.visible-xs { + display: block !important; + } + table.visible-md.visible-xs { + display: table; + } + tr.visible-md.visible-xs { + display: table-row !important; + } + th.visible-md.visible-xs, + td.visible-md.visible-xs { + display: table-cell !important; + } +} + +@media (min-width: 768px) and (max-width: 991px) { + .visible-md.visible-sm { + display: block !important; + } + table.visible-md.visible-sm { + display: table; + } + tr.visible-md.visible-sm { + display: table-row !important; + } + th.visible-md.visible-sm, + td.visible-md.visible-sm { + display: table-cell !important; + } +} + +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md { + display: block !important; + } + table.visible-md { + display: table; + } + tr.visible-md { + display: table-row !important; + } + th.visible-md, + td.visible-md { + display: table-cell !important; + } +} + +@media (min-width: 1200px) { + .visible-md.visible-lg { + display: block !important; + } + table.visible-md.visible-lg { + display: table; + } + tr.visible-md.visible-lg { + display: table-row !important; + } + th.visible-md.visible-lg, + td.visible-md.visible-lg { + display: table-cell !important; + } +} + +.visible-lg, +tr.visible-lg, +th.visible-lg, +td.visible-lg { + display: none !important; +} + +@media (max-width: 767px) { + .visible-lg.visible-xs { + display: block !important; + } + table.visible-lg.visible-xs { + display: table; + } + tr.visible-lg.visible-xs { + display: table-row !important; + } + th.visible-lg.visible-xs, + td.visible-lg.visible-xs { + display: table-cell !important; + } +} + +@media (min-width: 768px) and (max-width: 991px) { + .visible-lg.visible-sm { + display: block !important; + } + table.visible-lg.visible-sm { + display: table; + } + tr.visible-lg.visible-sm { + display: table-row !important; + } + th.visible-lg.visible-sm, + td.visible-lg.visible-sm { + display: table-cell !important; + } +} + +@media (min-width: 992px) and (max-width: 1199px) { + .visible-lg.visible-md { + display: block !important; + } + table.visible-lg.visible-md { + display: table; + } + tr.visible-lg.visible-md { + display: table-row !important; + } + th.visible-lg.visible-md, + td.visible-lg.visible-md { + display: table-cell !important; + } +} + +@media (min-width: 1200px) { + .visible-lg { + display: block !important; + } + table.visible-lg { + display: table; + } + tr.visible-lg { + display: table-row !important; + } + th.visible-lg, + td.visible-lg { + display: table-cell !important; + } +} + +.hidden-xs { + display: block !important; +} + +table.hidden-xs { + display: table; +} + +tr.hidden-xs { + display: table-row !important; +} + +th.hidden-xs, +td.hidden-xs { + display: table-cell !important; +} + +@media (max-width: 767px) { + .hidden-xs, + tr.hidden-xs, + th.hidden-xs, + td.hidden-xs { + display: none !important; + } +} + +@media (min-width: 768px) and (max-width: 991px) { + .hidden-xs.hidden-sm, + tr.hidden-xs.hidden-sm, + th.hidden-xs.hidden-sm, + td.hidden-xs.hidden-sm { + display: none !important; + } +} + +@media (min-width: 992px) and (max-width: 1199px) { + .hidden-xs.hidden-md, + tr.hidden-xs.hidden-md, + th.hidden-xs.hidden-md, + td.hidden-xs.hidden-md { + display: none !important; + } +} + +@media (min-width: 1200px) { + .hidden-xs.hidden-lg, + tr.hidden-xs.hidden-lg, + th.hidden-xs.hidden-lg, + td.hidden-xs.hidden-lg { + display: none !important; + } +} + +.hidden-sm { + display: block !important; +} + +table.hidden-sm { + display: table; +} + +tr.hidden-sm { + display: table-row !important; +} + +th.hidden-sm, +td.hidden-sm { + display: table-cell !important; +} + +@media (max-width: 767px) { + .hidden-sm.hidden-xs, + tr.hidden-sm.hidden-xs, + th.hidden-sm.hidden-xs, + td.hidden-sm.hidden-xs { + display: none !important; + } +} + +@media (min-width: 768px) and (max-width: 991px) { + .hidden-sm, + tr.hidden-sm, + th.hidden-sm, + td.hidden-sm { + display: none !important; + } +} + +@media (min-width: 992px) and (max-width: 1199px) { + .hidden-sm.hidden-md, + tr.hidden-sm.hidden-md, + th.hidden-sm.hidden-md, + td.hidden-sm.hidden-md { + display: none !important; + } +} + +@media (min-width: 1200px) { + .hidden-sm.hidden-lg, + tr.hidden-sm.hidden-lg, + th.hidden-sm.hidden-lg, + td.hidden-sm.hidden-lg { + display: none !important; + } +} + +.hidden-md { + display: block !important; +} + +table.hidden-md { + display: table; +} + +tr.hidden-md { + display: table-row !important; +} + +th.hidden-md, +td.hidden-md { + display: table-cell !important; +} + +@media (max-width: 767px) { + .hidden-md.hidden-xs, + tr.hidden-md.hidden-xs, + th.hidden-md.hidden-xs, + td.hidden-md.hidden-xs { + display: none !important; + } +} + +@media (min-width: 768px) and (max-width: 991px) { + .hidden-md.hidden-sm, + tr.hidden-md.hidden-sm, + th.hidden-md.hidden-sm, + td.hidden-md.hidden-sm { + display: none !important; + } +} + +@media (min-width: 992px) and (max-width: 1199px) { + .hidden-md, + tr.hidden-md, + th.hidden-md, + td.hidden-md { + display: none !important; + } +} + +@media (min-width: 1200px) { + .hidden-md.hidden-lg, + tr.hidden-md.hidden-lg, + th.hidden-md.hidden-lg, + td.hidden-md.hidden-lg { + display: none !important; + } +} + +.hidden-lg { + display: block !important; +} + +table.hidden-lg { + display: table; +} + +tr.hidden-lg { + display: table-row !important; +} + +th.hidden-lg, +td.hidden-lg { + display: table-cell !important; +} + +@media (max-width: 767px) { + .hidden-lg.hidden-xs, + tr.hidden-lg.hidden-xs, + th.hidden-lg.hidden-xs, + td.hidden-lg.hidden-xs { + display: none !important; + } +} + +@media (min-width: 768px) and (max-width: 991px) { + .hidden-lg.hidden-sm, + tr.hidden-lg.hidden-sm, + th.hidden-lg.hidden-sm, + td.hidden-lg.hidden-sm { + display: none !important; + } +} + +@media (min-width: 992px) and (max-width: 1199px) { + .hidden-lg.hidden-md, + tr.hidden-lg.hidden-md, + th.hidden-lg.hidden-md, + td.hidden-lg.hidden-md { + display: none !important; + } +} + +@media (min-width: 1200px) { + .hidden-lg, + tr.hidden-lg, + th.hidden-lg, + td.hidden-lg { + display: none !important; + } +} + +.visible-print, +tr.visible-print, +th.visible-print, +td.visible-print { + display: none !important; +} + +@media print { + .visible-print { + display: block !important; + } + table.visible-print { + display: table; + } + tr.visible-print { + display: table-row !important; + } + th.visible-print, + td.visible-print { + display: table-cell !important; + } + .hidden-print, + tr.hidden-print, + th.hidden-print, + td.hidden-print { + display: none !important; + } +} diff --git a/pigx-register/src/main/resources/static/console-ui/public/css/codemirror.css b/pigx-register/src/main/resources/static/console-ui/public/css/codemirror.css new file mode 100644 index 0000000..31bf829 --- /dev/null +++ b/pigx-register/src/main/resources/static/console-ui/public/css/codemirror.css @@ -0,0 +1,356 @@ +/* + * Copyright 1999-2018 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* BASICS */ + +.CodeMirror { + /* Set height, width, borders, and global font properties here */ + font-family: monospace; + height: 300px; + color: black; +} + +/* PADDING */ + +.CodeMirror-lines { + padding: 4px 0; /* Vertical padding around content */ +} +.CodeMirror pre { + padding: 0 4px; /* Horizontal padding of content */ +} + +.CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler { + background-color: white; /* The little square between H and V scrollbars */ +} + +/* GUTTER */ + +.CodeMirror-gutters { + border-right: 1px solid #ddd; + background-color: #f7f7f7; + white-space: nowrap; +} +.CodeMirror-linenumbers {} +.CodeMirror-linenumber { + padding: 0 3px 0 5px; + min-width: 20px; + text-align: right; + color: #999; + white-space: nowrap; +} + +.CodeMirror-guttermarker { color: black; } +.CodeMirror-guttermarker-subtle { color: #999; } + +/* CURSOR */ + +.CodeMirror-cursor { + border-left: 1px solid black; + border-right: none; + width: 0; +} +/* Shown when moving in bi-directional text */ +.CodeMirror div.CodeMirror-secondarycursor { + border-left: 1px solid silver; +} +.cm-fat-cursor .CodeMirror-cursor { + width: auto; + border: 0 !important; + background: #7e7; +} +.cm-fat-cursor div.CodeMirror-cursors { + z-index: 1; +} + +.cm-animate-fat-cursor { + width: auto; + border: 0; + -webkit-animation: blink 1.06s steps(1) infinite; + -moz-animation: blink 1.06s steps(1) infinite; + animation: blink 1.06s steps(1) infinite; + background-color: #7e7; +} +@-moz-keyframes blink { + 0% {} + 50% { background-color: transparent; } + 100% {} +} +@-webkit-keyframes blink { + 0% {} + 50% { background-color: transparent; } + 100% {} +} +@keyframes blink { + 0% {} + 50% { background-color: transparent; } + 100% {} +} + +/* Can style cursor different in overwrite (non-insert) mode */ +.CodeMirror-overwrite .CodeMirror-cursor {} + +.cm-tab { display: inline-block; text-decoration: inherit; } + +.CodeMirror-rulers { + position: absolute; + left: 0; right: 0; top: -50px; bottom: -20px; + overflow: hidden; +} +.CodeMirror-ruler { + border-left: 1px solid #ccc; + top: 0; bottom: 0; + position: absolute; +} + +/* DEFAULT THEME */ + +.cm-s-default .cm-header {color: blue;} +.cm-s-default .cm-quote {color: #090;} +.cm-negative {color: #d44;} +.cm-positive {color: #292;} +.cm-header, .cm-strong {font-weight: bold;} +.cm-em {font-style: italic;} +.cm-link {text-decoration: underline;} +.cm-strikethrough {text-decoration: line-through;} + +.cm-s-default .cm-keyword {color: #708;} +.cm-s-default .cm-atom {color: #219;} +.cm-s-default .cm-number {color: #164;} +.cm-s-default .cm-def {color: #00f;} +.cm-s-default .cm-variable, +.cm-s-default .cm-punctuation, +.cm-s-default .cm-property, +.cm-s-default .cm-operator {} +.cm-s-default .cm-variable-2 {color: #05a;} +.cm-s-default .cm-variable-3, .cm-s-default .cm-type {color: #085;} +.cm-s-default .cm-comment {color: #a50;} +.cm-s-default .cm-string {color: #a11;} +.cm-s-default .cm-string-2 {color: #f50;} +.cm-s-default .cm-meta {color: #555;} +.cm-s-default .cm-qualifier {color: #555;} +.cm-s-default .cm-builtin {color: #30a;} +.cm-s-default .cm-bracket {color: #997;} +.cm-s-default .cm-tag {color: #170;} +.cm-s-default .cm-attribute {color: #00c;} +.cm-s-default .cm-hr {color: #999;} +.cm-s-default .cm-link {color: #00c;} + +.cm-s-default .cm-error {color: #f00;} +.cm-invalidchar {color: #f00;} + +.CodeMirror-composing { border-bottom: 2px solid; } + +/* Default styles for common addons */ + +div.CodeMirror span.CodeMirror-matchingbracket {color: #0f0;} +div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #f22;} +.CodeMirror-matchingtag { background: rgba(255, 150, 0, .3); } +.CodeMirror-activeline-background {background: #e8f2ff;} + +/* STOP */ + +/* The rest of this file contains styles related to the mechanics of + the editor. You probably shouldn't touch them. */ + +.CodeMirror { + position: relative; + overflow: hidden; + background: white; +} + +.CodeMirror-scroll { + overflow: scroll !important; /* Things will break if this is overridden */ + /* 30px is the magic margin used to hide the element's real scrollbars */ + /* See overflow: hidden in .CodeMirror */ + margin-bottom: -30px; margin-right: -30px; + padding-bottom: 30px; + height: 100%; + outline: none; /* Prevent dragging from highlighting the element */ + position: relative; +} +.CodeMirror-sizer { + position: relative; + border-right: 30px solid transparent; +} + +/* The fake, visible scrollbars. Used to force redraw during scrolling + before actual scrolling happens, thus preventing shaking and + flickering artifacts. */ +.CodeMirror-vscrollbar, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler { + position: absolute; + z-index: 6; + display: none; +} +.CodeMirror-vscrollbar { + right: 0; top: 0; + overflow-x: hidden; + overflow-y: scroll; +} +.CodeMirror-hscrollbar { + bottom: 0; left: 0; + overflow-y: hidden; + overflow-x: scroll; +} +.CodeMirror-scrollbar-filler { + right: 0; bottom: 0; +} +.CodeMirror-gutter-filler { + left: 0; bottom: 0; +} + +.CodeMirror-gutters { + position: absolute; left: 0; top: 0; + min-height: 100%; + z-index: 3; +} +.CodeMirror-gutter { + white-space: normal; + height: 100%; + display: inline-block; + vertical-align: top; + margin-bottom: -30px; +} +.CodeMirror-gutter-wrapper { + position: absolute; + z-index: 4; + background: none !important; + border: none !important; +} +.CodeMirror-gutter-background { + position: absolute; + top: 0; bottom: 0; + z-index: 4; +} +.CodeMirror-gutter-elt { + position: absolute; + cursor: default; + z-index: 4; +} +.CodeMirror-gutter-wrapper ::selection { background-color: transparent } +.CodeMirror-gutter-wrapper ::-moz-selection { background-color: transparent } + +.CodeMirror-lines { + cursor: text; + min-height: 1px; /* prevents collapsing before first draw */ +} +.CodeMirror pre { + /* Reset some styles that the rest of the page might have set */ + -moz-border-radius: 0; -webkit-border-radius: 0; border-radius: 0; + border-width: 0; + background: transparent; + font-family: inherit; + font-size: inherit; + margin: 0; + white-space: pre; + word-wrap: normal; + line-height: inherit; + color: inherit; + z-index: 2; + position: relative; + overflow: visible; + -webkit-tap-highlight-color: transparent; + -webkit-font-variant-ligatures: contextual; + font-variant-ligatures: contextual; +} +.CodeMirror-wrap pre { + word-wrap: break-word; + white-space: pre-wrap; + word-break: normal; +} + +.CodeMirror-linebackground { + position: absolute; + left: 0; right: 0; top: 0; bottom: 0; + z-index: 0; +} + +.CodeMirror-linewidget { + position: relative; + z-index: 2; + overflow: auto; +} + +.CodeMirror-widget {} + +.CodeMirror-rtl pre { direction: rtl; } + +.CodeMirror-code { + outline: none; +} + +/* Force content-box sizing for the elements where we expect it */ +.CodeMirror-scroll, +.CodeMirror-sizer, +.CodeMirror-gutter, +.CodeMirror-gutters, +.CodeMirror-linenumber { + -moz-box-sizing: content-box; + box-sizing: content-box; +} + +.CodeMirror-measure { + position: absolute; + width: 100%; + height: 0; + overflow: hidden; + visibility: hidden; +} + +.CodeMirror-cursor { + position: absolute; + pointer-events: none; +} +.CodeMirror-measure pre { position: static; } + +div.CodeMirror-cursors { + visibility: hidden; + position: relative; + z-index: 3; +} +div.CodeMirror-dragcursors { + visibility: visible; +} + +.CodeMirror-focused div.CodeMirror-cursors { + visibility: visible; +} + +.CodeMirror-selected { background: #d9d9d9; } +.CodeMirror-focused .CodeMirror-selected { background: #d7d4f0; } +.CodeMirror-crosshair { cursor: crosshair; } +.CodeMirror-line::selection, .CodeMirror-line > span::selection, .CodeMirror-line > span > span::selection { background: #d7d4f0; } +.CodeMirror-line::-moz-selection, .CodeMirror-line > span::-moz-selection, .CodeMirror-line > span > span::-moz-selection { background: #d7d4f0; } + +.cm-searching { + background: #ffa; + background: rgba(255, 255, 0, .4); +} + +/* Used to force a border model for a node */ +.cm-force-border { padding-right: .1px; } + +@media print { + /* Hide the cursor when printing */ + .CodeMirror div.CodeMirror-cursors { + visibility: hidden; + } +} + +/* See issue #2901 */ +.cm-tab-wrap-hack:after { content: ''; } + +/* Help users use markselection to safely style text background */ +span.CodeMirror-selectedtext { background: none; } diff --git a/pigx-register/src/main/resources/static/console-ui/public/css/console1412.css b/pigx-register/src/main/resources/static/console-ui/public/css/console1412.css new file mode 100644 index 0000000..5849e15 --- /dev/null +++ b/pigx-register/src/main/resources/static/console-ui/public/css/console1412.css @@ -0,0 +1 @@ +@charset "UTF-8";.viewFramework-topbar{position:fixed;width:100%;height:50px;background:#09C;z-index:101}.viewFramework-body{position:absolute;width:100%;top:50px;bottom:0px;background-color:#000;z-index:100}.viewFramework-body .console-global-notice .console-global-notice-nav{top:14px}.viewFramework-body .console-global-notice .console-global-notice-list{margin:0;height:40px}.viewFramework-body .console-global-notice .console-global-notice-list .console-global-notice-item{padding:11px 12px;border:none}.viewFramework-body .console-global-notice .console-global-notice-list .console-global-notice-item .console-global-notice-nomore{top:10px}.viewFramework-body.viewFramework-topbar-hide{top:0px}.viewFramework-body.viewFramework-topbar-hide .viewFramework-sidebar{top:0px}.viewFramework-sidebar{width:0px;display:none;position:fixed;top:50px;bottom:0px;background-color:#293038;z-index:102;overflow-x:hidden}.viewFramework-sidebar .sidebar-content{width:200px;height:100%;overflow:auto;overflow-x:hidden}.viewFramework-sidebar .sidebar-trans{-o-transition:all 0.12s ease,0.12s ease;-ms-transition:all 0.12s ease,0.12s ease;-moz-transition:all 0.12s ease,0.12s ease;-webkit-transition:all 0.12s ease,0.12s ease}.viewFramework-sidebar .sidebar-fold{height:30px;width:180px;background:#394555;color:#aeb9c2;text-align:center;line-height:30px !important;font-size:12px;user-select:none;cursor:pointer;-webkit-user-select:none;-moz-user-select:none}.viewFramework-sidebar .sidebar-fold:hover{background:#37424f}.viewFramework-sidebar .sidebar-nav{width:180px}.viewFramework-sidebar .sidebar-nav ul{margin:0px;padding:0px;list-style:none;overflow:hidden}.viewFramework-sidebar .sidebar-nav li a{display:block;width:100%;height:40px;line-height:40px;overflow:hidden}.viewFramework-sidebar .sidebar-nav li a:hover{background:#37424f}.viewFramework-sidebar .sidebar-nav li a:hover .nav-icon,.viewFramework-sidebar .sidebar-nav li a:hover .nav-title{color:#fff}.viewFramework-sidebar .sidebar-nav .nav-item{position:relative}.viewFramework-sidebar .sidebar-nav .nav-comment{background:#2d3945;color:#cccccc;height:26px;margin-left:8px;line-height:26px;padding:0 7px;vertical-align:middle;position:relative;display:none}.viewFramework-sidebar .sidebar-nav .nav-comment .icon-arrow-left{position:absolute;left:-14px;line-height:26px;font-size:24px;color:#2d3945}.viewFramework-sidebar .sidebar-nav .nav-tooltip-comment{color:#ccc}.viewFramework-sidebar .sidebar-nav .sidebar-title{height:40px;background:#22282e;color:#fff;line-height:40px;position:relative;cursor:pointer;-webkit-user-select:none;-moz-user-select:none}.viewFramework-sidebar .sidebar-nav .sidebar-title:hover{background:#414d5c}.viewFramework-sidebar .sidebar-nav .sidebar-title-icon{display:inline-block;margin:0 8px 0 20px;vertical-align:middle;transition:transform 0.12s;-o-transition:-o-transform 0.12s;-ms-transition:-ms-transform 0.12s;-moz-transition:-moz-transform 0.12s;-webkit-transition:-webkit-transform 0.12s}.viewFramework-sidebar .sidebar-manage{vertical-align:middle;position:absolute;height:40px;width:40px;right:0}.viewFramework-sidebar .sidebar-manage a{display:block;width:100%;height:100%;text-align:center;line-height:40px;font-size:14px;color:#a0abb3;text-decoration:none}.viewFramework-sidebar .sidebar-nav-fold ul{height:0 !important;overflow:hidden}.viewFramework-sidebar .sidebar-nav-fold .sidebar-title-icon{transform:rotate(-90deg);-webkit-transform:rotate(-90deg);-moz-transform:rotate(-90deg);-ms-transform:rotate(-90deg);-o-transform:rotate(-90deg)}.viewFramework-sidebar .sidebar-nav-fold .sidebar-title{background:#37424f;border-bottom:1px solid #414d5c}.viewFramework-sidebar .sidebar-nav .nav-item:hover .nav-comment{display:inline-block}.viewFramework-sidebar .entrance-nav .nav-comment{margin-left:10px}.viewFramework-sidebar .sidebar-nav .nav-icon{width:50px;text-align:center;font-size:16px;float:left;color:#aeb9c2}.viewFramework-sidebar .sidebar-nav .nav-title{float:left;overflow:hidden;color:#fff;white-space:nowrap;text-overflow:ellipsis;display:block;width:130px}.viewFramework-sidebar .entrance-nav .nav-title{width:auto}.viewFramework-sidebar .sidebar-nav li.consolehome .nav-tooltip{top:15px;line-height:40px}.viewFramework-sidebar .sidebar-nav li.consolehome a{height:70px;line-height:70px;background:#293038}.viewFramework-sidebar .sidebar-nav li.consolehome a .nav-icon{font-size:20px}.viewFramework-sidebar .sidebar-nav li.consolehome.active a{background:#293038}.viewFramework-sidebar .sidebar-nav li.active a{background:#0099cc}.viewFramework-sidebar .sidebar-nav li.active a .nav-title{color:#fff}.viewFramework-sidebar .sidebar-nav li.active a .nav-icon{color:#fff}.viewFramework-sidebar .sidebar-nav .manage-nav{height:30px;overflow:hidden}.viewFramework-sidebar .sidebar-nav .manage-nav:hover .nav-icon{color:#fff}.viewFramework-sidebar .sidebar-nav .manage-nav a{display:block;height:100%}.viewFramework-sidebar .sidebar-nav .manage-nav .nav-icon{height:100%;line-height:30px;font-size:16px}.viewFramework-sidebar .sidebar-nav .manage-nav .nav-title{margin-top:14px;background:#293038;height:1px;width:120px}.viewFramework-sidebar .sidebar-nav .more-nav{display:block;width:100%;height:40px;line-height:40px;position:relative}.viewFramework-sidebar .sidebar-nav .more-nav.open .more-nav-switch{background:#09c}.viewFramework-sidebar .sidebar-nav .more-nav.open .more-nav-switch .nav-icon,.viewFramework-sidebar .sidebar-nav .more-nav.open .more-nav-switch .nav-title{color:#fff}.viewFramework-sidebar .sidebar-nav .more-nav.open .more-nav-switch:hover{background:#09c}.viewFramework-sidebar .sidebar-nav .more-nav.open .icon-up{display:none}.viewFramework-sidebar .sidebar-nav .more-nav.open .icon-down{display:inline-block}.viewFramework-sidebar .sidebar-nav .more-nav .icon-up{display:inline-block}.viewFramework-sidebar .sidebar-nav .more-nav .icon-down{display:none}.viewFramework-sidebar .sidebar-nav .more-nav .more-nav-switch{display:block;width:100%;height:40px;line-height:40px}.viewFramework-sidebar .sidebar-nav .more-nav .more-nav-switch:hover{background:#425160}.viewFramework-sidebar .sidebar-nav .more-nav .more-nav-switch:hover .nav-icon,.viewFramework-sidebar .sidebar-nav .more-nav .more-nav-switch:hover .nav-title{color:#fff}.viewFramework-sidebar .sidebar-nav .more-nav .more-nav-container{background:#425160;position:absolute;bottom:40px;top:auto;border:none;border-radius:0 0;box-shadow:none;margin:0;width:100%}.viewFramework-sidebar .sidebar-nav .more-nav .more-nav-container a{color:#fff;text-decoration:none}.viewFramework-sidebar .sidebar-nav .more-nav .more-nav-container .more-nav-item{display:block;height:40px;line-height:40px}.viewFramework-sidebar .sidebar-nav .more-nav .more-nav-container .more-nav-item:hover{background:#3a4856}.viewFramework-sidebar .sidebar-nav .more-nav .more-nav-container .more-nav-item:hover .more-nav-item-icon{color:#aeb9c2}.viewFramework-sidebar .sidebar-nav .more-nav .more-nav-container .more-nav-item-icon{width:50px;display:inline-block;vertical-align:text-top;text-align:center;color:#546478}.viewFramework-sidebar .sidebar-nav .more-nav .more-nav-container .more-nav-item.active{background:#2d3945}.viewFramework-sidebar .sidebar-nav .more-nav .more-nav-container .more-nav-item.active .more-nav-item-icon{color:#0099cc}.viewFramework-sidebar .sidebar-nav .more-nav .more-nav-close{height:20px;background:#09c;text-align:right;line-height:20px;cursor:pointer}.viewFramework-sidebar .sidebar-nav .more-nav .more-nav-close .icon-down{text-align:left;width:32px;display:inline-block;color:#80cce6;vertical-align:middle}.viewFramework-sidebar-mini .viewFramework-sidebar,.viewFramework-sidebar.sidebar-mini{width:50px;display:block}.viewFramework-sidebar-mini .viewFramework-sidebar .sidebar-content,.viewFramework-sidebar.sidebar-mini .sidebar-content{width:70px}.viewFramework-sidebar-mini .viewFramework-sidebar .sidebar-fold,.viewFramework-sidebar.sidebar-mini .sidebar-fold{width:50px}.viewFramework-sidebar-mini .viewFramework-sidebar .sidebar-nav,.viewFramework-sidebar.sidebar-mini .sidebar-nav{width:50px}.viewFramework-sidebar-mini .viewFramework-sidebar .sidebar-nav .nav-item a:hover+.nav-tooltip,.viewFramework-sidebar.sidebar-mini .sidebar-nav .nav-item a:hover+.nav-tooltip{display:block}.viewFramework-sidebar-mini .viewFramework-sidebar .sidebar-nav .nav-title,.viewFramework-sidebar.sidebar-mini .sidebar-nav .nav-title{display:none}.viewFramework-sidebar-mini .viewFramework-sidebar .sidebar-nav .more-nav .more-nav-switch:hover,.viewFramework-sidebar.sidebar-mini .sidebar-nav .more-nav .more-nav-switch:hover{background:#425160 !important}.viewFramework-sidebar-mini .viewFramework-sidebar .sidebar-nav .more-nav.open .more-nav-switch,.viewFramework-sidebar.sidebar-mini .sidebar-nav .more-nav.open .more-nav-switch{background:#425160 !important}.viewFramework-sidebar-mini .viewFramework-sidebar .sidebar-nav .more-nav .more-nav-container,.viewFramework-sidebar.sidebar-mini .sidebar-nav .more-nav .more-nav-container{bottom:0px;left:50px;width:180px}.viewFramework-sidebar-mini .viewFramework-sidebar .sidebar-nav .more-nav .more-nav-container .more-nav-item,.viewFramework-sidebar.sidebar-mini .sidebar-nav .more-nav .more-nav-container .more-nav-item{display:block;height:40px;line-height:40px}.viewFramework-sidebar-mini .viewFramework-sidebar .sidebar-nav .more-nav .more-nav-container .more-nav-item-icon,.viewFramework-sidebar.sidebar-mini .sidebar-nav .more-nav .more-nav-container .more-nav-item-icon{width:50px;padding-left:0}.viewFramework-sidebar-mini .viewFramework-sidebar .sidebar-nav .more-nav .more-nav-close,.viewFramework-sidebar.sidebar-mini .sidebar-nav .more-nav .more-nav-close{display:none}.viewFramework-sidebar-mini .viewFramework-sidebar .sidebar-nav li.consolehome a :hover,.viewFramework-sidebar.sidebar-mini .sidebar-nav li.consolehome a :hover{background:#425160}.viewFramework-sidebar-mini .viewFramework-sidebar .sidebar-title .sidebar-title-text,.viewFramework-sidebar.sidebar-mini .sidebar-title .sidebar-title-text{display:none}.viewFramework-sidebar-mini .viewFramework-sidebar .sidebar-title-inner:hover+.nav-tooltip,.viewFramework-sidebar.sidebar-mini .sidebar-title-inner:hover+.nav-tooltip{display:block}.viewFramework-sidebar-mini .viewFramework-sidebar .sidebar-manage,.viewFramework-sidebar.sidebar-mini .sidebar-manage{display:none}.viewFramework-sidebar-mini .viewFramework-sidebar .entrance-nav .nav-item:hover .nav-comment,.viewFramework-sidebar.sidebar-mini .entrance-nav .nav-item:hover .nav-comment{display:none}.viewFramework-sidebar-full .viewFramework-sidebar,.viewFramework-sidebar.sidebar-full{width:180px;display:block}.viewFramework-sidebar-full .viewFramework-sidebar .sidebar-nav .nav-icon,.viewFramework-sidebar.sidebar-full .sidebar-nav .nav-icon{width:50px}.viewFramework-sidebar-mini .viewFramework-product{left:50px}.viewFramework-sidebar-full .viewFramework-product{left:180px}.viewFramework-sidebar-dialog .modal-dialog{width:730px}.viewFramework-sidebar-dialog .modal-dialog .modal-title{user-select:none;-webkit-user-select:none}.viewFramework-sidebar-manage .sidebar-item-list{padding:4px 0 0 0;height:auto}.viewFramework-sidebar-manage .sidebar-item-list-picked .sidebar-item{border:1px solid #37a9d5}.viewFramework-sidebar-manage .sidebar-item-list-picked .sidebar-item .sidebar-item-opt-icon{display:block}.viewFramework-sidebar-manage .sidebar-item-list-picked .sidebar-item .sidebar-item-icon{color:#516176}.viewFramework-sidebar-manage .sidebar-config-title{padding-left:6px;user-select:none;-webkit-user-select:none}.viewFramework-sidebar-manage .sidebar-item-wrap{padding:6px;width:33.3%;float:left;user-select:none;-webkit-user-select:none}.viewFramework-sidebar-manage .sidebar-item-wrap.on-drag-hover .sidebar-item{border:1px dashed #ddd}.viewFramework-sidebar-manage .sidebar-item{height:32px;padding:4px;line-height:24px;background:#fff;border:1px solid #d3dce3;position:relative;cursor:pointer;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;-o-transition:all 0.1s, 0.1s;-ms-transition:all 0.1s, 0.1s;-moz-transition:all 0.1s, 0.1s;-webkit-transition:all 0.1s, 0.1s}.viewFramework-sidebar-manage .sidebar-item:hover{border:1px solid #37a9d5}.viewFramework-sidebar-manage .sidebar-item:hover .sidebar-item-opt-icon{display:block}.viewFramework-sidebar-manage .sidebar-item .sidebar-item-icon{color:#aeb9c2;font-size:14px;margin:0 2px;position:relative;top:1px}.viewFramework-sidebar-manage .sidebar-item .sidebar-item-opt-icon{display:none;position:absolute;height:30px;width:30px;right:0;top:0;line-height:30px;text-align:center;border-left:1px solid #37a9d5;color:#37a9d5;font-size:14px}.viewFramework-sidebar-manage .sidebar-config-gap{border:1px dashed #e8ecf0;margin:16px 5px;user-select:none;-webkit-user-select:none}.aliyun-console-sidebar-tooltip{position:absolute;z-index:1030;display:block;font-size:12px;line-height:1.4;opacity:0;filter:alpha(opacity=0);visibility:visible}.aliyun-console-sidebar-tooltip .tooltip-inner{max-width:200px;padding:12px 8px;color:#ffffff;text-align:center;text-decoration:none;border-radius:0 0;background-color:#425160}.aliyun-console-sidebar-tooltip .tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.aliyun-console-sidebar-tooltip.in{opacity:0.9;filter:alpha(opacity=90)}.aliyun-console-sidebar-tooltip.right{padding:0 5px;margin-left:3px}.aliyun-console-sidebar-tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#425160;border-width:5px 5px 5px 0}.viewFramework-product{width:auto;position:absolute;top:0px;left:0px;bottom:0px;right:0px;overflow:hidden;background:#FFF}.viewFramework-product-navbar{width:0px;float:left;background-color:#EAEDF1;position:absolute;top:0px;bottom:0px;z-index:2;overflow:hidden;-o-transition:all 0.2s ease;-ms-transition:all 0.2s ease;-moz-transition:all 0.2s ease;-webkit-transition:all 0.2s ease}.viewFramework-product-navbar .product-nav-stage{width:180px;overflow:hidden;position:absolute;top:0px;bottom:0px;right:0px}.viewFramework-product-navbar .product-nav-stage .product-nav-scene{width:180px;position:absolute;top:0px;bottom:0px;-webkit-transition:position,.2s,linear;-moz-transition:position,.2s,linear}.viewFramework-product-navbar .product-nav-stage .product-nav-main-scene{left:0px}.viewFramework-product-navbar .product-nav-stage .product-nav-sub-scene{left:180px}.viewFramework-product-navbar .product-nav-stage-main .product-nav-main-scene{left:0px}.viewFramework-product-navbar .product-nav-stage-main .product-nav-sub-scene{left:180px}.viewFramework-product-navbar .product-nav-stage-sub .product-nav-main-scene{left:-180px}.viewFramework-product-navbar .product-nav-stage-sub .product-nav-sub-scene{left:0px}.viewFramework-product-navbar .product-nav-scene .product-nav-title{width:180px;height:70px;line-height:70px;background:#D9DEE4;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.viewFramework-product-navbar .product-nav-main-scene .product-nav-title{font-weight:bold;text-indent:20px}.viewFramework-product-navbar .product-nav-sub-scene .product-nav-title{text-align:center}.viewFramework-product-navbar .product-nav-sub-scene .product-nav-title a{font-size:20px;color:#546478;text-decoration:none}.viewFramework-product-navbar .product-nav-sub-scene .product-nav-title a:hover{color:#09C}.viewFramework-product-navbar .product-nav-list{position:absolute;top:70px;left:0px;right:0px;bottom:0px;overflow-y:auto;overflow-x:hidden}.viewFramework-product-navbar .product-nav-list .nav-icon{width:30px;height:40px;float:left;text-align:center;font-size:16px;color:#333}.viewFramework-product-navbar .product-nav-list .nav-title{width:138px;float:left;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.viewFramework-product-navbar .product-nav-list .nav-extend{height:40px;line-height:40px;float:right;margin-top:-40px}.viewFramework-product-navbar .product-nav-list ul{list-style:none;padding:0px;margin:0px}.viewFramework-product-navbar .product-nav-list li a{width:180px;height:40px;line-height:40px;display:block;color:#333}.viewFramework-product-navbar .product-nav-list ul ul li a{color:#666}.viewFramework-product-navbar .product-nav-list ul ul li a .nav-title{text-indent:8px}.viewFramework-product-navbar .product-nav-list li a:hover{background-color:#F4F6F8}.viewFramework-product-navbar .product-nav-list li.active a{background-color:#FFF}.viewFramework-product-navbar-collapse{position:absolute;left:0;top:50%;width:20px;height:50px;z-index:3;-o-transition:all 0.2s ease;-ms-transition:all 0.2s ease;-moz-transition:all 0.2s ease;-webkit-transition:all 0.2s ease}.viewFramework-product-navbar-collapse:hover .product-navbar-collapse{left:0}.viewFramework-product-navbar-collapse:hover .product-navbar-collapse-bg{border-bottom:8px solid transparent;border-left:20px solid #D9DEE4;border-top:8px solid transparent}.viewFramework-product-navbar-collapse .product-navbar-collapse-inner{top:-50%;position:relative;overflow:hidden}.viewFramework-product-navbar-collapse .product-navbar-collapse{height:50px;position:relative;left:-7px;text-align:center;cursor:pointer;-o-transition:all 0.1s ease,0.1s ease;-ms-transition:all 0.1s ease,0.1s ease;-moz-transition:all 0.1s ease,0.1s ease;-webkit-transition:all 0.1s ease,0.1s ease}.viewFramework-product-navbar-collapse .product-navbar-collapse>span{font-size:15px;line-height:50px;vertical-align:text-top}.viewFramework-product-navbar-collapse .product-navbar-collapse-bg{width:0;height:50px;position:absolute;top:0;left:0;border-bottom:9px solid transparent;border-left:13px solid #D9DEE4;border-top:9px solid transparent;-o-transition:all 0.1s ease,0.1s ease;-ms-transition:all 0.1s ease,0.1s ease;-moz-transition:all 0.1s ease,0.1s ease;-webkit-transition:all 0.1s ease,0.1s ease}.viewFramework-product-navbar-collapse .icon-collapse-left{display:none}.viewFramework-product-navbar-collapse .icon-collapse-right{display:inline}.viewFramework-product-body{position:absolute;width:auto;top:0px;bottom:0px;left:0px;right:0px;overflow:hidden;overflow-y:auto;-o-transition:all 0.2s ease;-ms-transition:all 0.2s ease;-moz-transition:all 0.2s ease;-webkit-transition:all 0.2s ease}.viewFramework-product-col-1 .viewFramework-product-navbar-bg,.viewFramework-product-col-1 .viewFramework-product-navbar{width:180px}.viewFramework-product-col-1 .viewFramework-product-body{left:180px}.viewFramework-product-col-1 .viewFramework-product-navbar-collapse{left:160px}.viewFramework-product-col-1 .viewFramework-product-navbar-collapse .product-navbar-collapse{right:-7px;left:auto}.viewFramework-product-col-1 .viewFramework-product-navbar-collapse .product-navbar-collapse>span{color:#546478}.viewFramework-product-col-1 .viewFramework-product-navbar-collapse .product-navbar-collapse-bg{right:0;left:auto;border-bottom:9px solid transparent;border-left:none;border-right:13px solid #f7f7f7;border-top:9px solid transparent}.viewFramework-product-col-1 .viewFramework-product-navbar-collapse .icon-collapse-left{display:inline}.viewFramework-product-col-1 .viewFramework-product-navbar-collapse .icon-collapse-right{display:none}.viewFramework-product-col-1 .viewFramework-product-navbar-collapse:hover .product-navbar-collapse{right:0;left:auto}.viewFramework-product-col-1 .viewFramework-product-navbar-collapse:hover .product-navbar-collapse-bg{border-bottom:8px solid transparent;border-left:none;border-right:20px solid #f7f7f7;border-top:8px solid transparent}.viewFramework-product-col-2 .viewFramework-product-navbar-bg,.viewFramework-product-col-2 .viewFramework-product-navbar{width:360px}.viewFramework-product-col-2 .viewFramework-product-body{left:360px}.viewFramework-animate{-webkit-animation-duration:0.1s;animation-duration:0.1s;-webkit-animation-fill-mode:both;animation-fill-mode:both}.viewFramework-fadeIn{-webkit-animation-name:viewFrameworkFadeIn;animation-name:viewFrameworkFadeIn}@-webkit-keyframes viewFrameworkFadeIn{0%{opacity:0}100%{opacity:1}}@keyframes viewFrameworkFadeIn{0%{opacity:0}100%{opacity:1}}.text-muted{color:#999 !important}.text-muted:hover{color:#999 !important}.text-info{color:#69C !important}.text-info:hover{color:#69C !important}.text-primary{color:#09C !important}.text-primary:hover{color:#09C !important}.text-success{color:#090 !important}.text-success:hover{color:#090 !important}.text-warning{color:#F90 !important}.text-warning:hover{color:#F90 !important}.text-danger{color:#F00 !important}.text-danger:hover{color:#F00 !important}.text-explode{color:#CCC !important;font-weight:normal !important;margin:0px 4px !important}span.label{font-weight:normal}.text-size-14{font-size:14px !important}.text-size-16{font-size:16px !important}.text-size-24{font-size:24px !important}.text-size-32{font-size:32px !important}.text-size-48{font-size:48px !important}.text-size-64{font-size:64px !important}.btn{font-size:12px;border-radius:0px;padding:8px 16px;height:32px;line-height:14px}.btn-default{color:#333;border:1px solid #ddd;background-color:#f7f7f7}.btn-default:active{-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.125);box-shadow:inset 0 1px 2px rgba(0,0,0,0.125)}.btn-default:focus{color:#333;border:1px solid #ddd;background-color:#f7f7f7;outline:none}.btn-default:hover{color:#333;border:1px solid #ddd;background-color:#fff}.btn-primary{color:#fff;border:1px solid #09c;background-color:#09c}.btn-primary:active{-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.125);box-shadow:inset 0 1px 2px rgba(0,0,0,0.125)}.btn-primary:focus{color:#fff;border:1px solid #09c;background-color:#09c;outline:none}.btn-primary:hover{color:#fff;border:1px solid #28b5d6;background-color:#28b5d6}.btn-success{color:#fff;border:1px solid #57a235;background-color:#4db118}.btn-success:active{-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.125);box-shadow:inset 0 1px 2px rgba(0,0,0,0.125)}.btn-success:focus{color:#fff;border:1px solid #57a235;background-color:#4db118;outline:none}.btn-success:hover{color:#fff;border:1px solid #57bc20;background-color:#57bc20}.btn-warning{color:#333;border:1px solid #ddd;background-color:#f7f7f7}.btn-warning:active{-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.125);box-shadow:inset 0 1px 2px rgba(0,0,0,0.125)}.btn-warning:focus{color:#333;border:1px solid #ddd;background-color:#f7f7f7;outline:none}.btn-warning:hover{color:#fff;border:1px solid #ffa200;background-color:#ffa200}.btn-danger{color:#333;color:#333;border:1px solid #ddd;background-color:#f7f7f7}.btn-danger:active{-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.125);box-shadow:inset 0 1px 2px rgba(0,0,0,0.125)}.btn-danger:focus{color:#333;border:1px solid #ddd;background-color:#f7f7f7;outline:none}.btn-danger:hover{color:#fff;border:1px solid #f25721;background-color:#f25721}.btn-link{color:#06C;text-shadow:none;border:none}.btn-link:hover{color:#039}.btn-lg{font-size:14px;padding:12px 20px;height:40px;line-height:16px}.btn-sm{font-size:12px;padding:4px 12px;height:24px;line-height:14px}.btn-xs{font-size:12px;padding:2px 8px;height:20px;line-height:14px}.btn.disabled,.btn[disabled]{text-shadow:none;filter:none;opacity:1;color:#bbb;border:1px solid #ddd;background-color:#f7f7f7}.btn.disabled:active,.btn[disabled]:active{-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.125);box-shadow:inset 0 1px 2px rgba(0,0,0,0.125)}.btn.disabled:focus,.btn[disabled]:focus{color:#bbb;border:1px solid #ddd;background-color:#f7f7f7;outline:none}.btn.disabled:hover,.btn[disabled]:hover{color:#bbb;border:1px solid #ddd;background-color:#f7f7f7}.btn.btn-link.disabled,.btn.btn-link[disabled]{border:none;background:transparent none}.btn.btn-primary.disabled,.btn.btn-primary[disabled]{color:#EEE;text-shadow:none;filter:none;opacity:1;color:#fff;border:1px solid #ccc;background-color:#ccc}.btn.btn-primary.disabled:active,.btn.btn-primary[disabled]:active{-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.125);box-shadow:inset 0 1px 2px rgba(0,0,0,0.125)}.btn.btn-primary.disabled:focus,.btn.btn-primary[disabled]:focus{color:#fff;border:1px solid #ccc;background-color:#ccc;outline:none}.btn.btn-primary.disabled:hover,.btn.btn-primary[disabled]:hover{color:#fff;border:1px solid #ccc;background-color:#ccc}.btn-default-active,.btn-default-active:hover,.btn-default-active:focus{border:1px solid #485260;background-color:#525d6d;background:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #525d6d), color-stop(100%, #525d6d));background:-webkit-linear-gradient(top, #525d6d,#525d6d);background:-moz-linear-gradient(top, #525d6d,#525d6d);background:-o-linear-gradient(top, #525d6d,#525d6d);background:linear-gradient(top, #525d6d,#525d6d);color:#FFFFFF;box-shadow:inset 0px 1px 2px rgba(0,0,0,0.3)}.btn-toinstlist{border:1px solid #BBB;color:#666;text-shadow:none;vertical-align:middle;margin-top:7px}.btn-toinstlist .icon-toinstlist{width:12px;height:12px;display:-moz-inline-stack;display:inline-block;vertical-align:middle;*vertical-align:auto;zoom:1;*display:inline;background:url(images/toinstlist.png) center 1px no-repeat}.console-sub-title+.table{margin-top:0px}.table-header{border:1px solid #e1e6eb;width:100%;z-index:1;margin-bottom:-1px;padding:8px;line-height:32px;display:table}.table-header+.table{margin-top:0px}.table{background:#FFF;font-size:12px;border-top:1px solid #e1e6eb;margin-top:8px;border:1px solid #e1e6eb}.table thead tr th{padding:8px 8px;font-weight:normal;color:#999;border-bottom:1px solid #e1e6eb;background-color:#F5F6FA}.table thead tr th a.dropdown-toggle{color:#999}.table thead tr th .dropdown.open a{color:#333}.table tbody tr td{padding:12px 8px;border-top:0px;border-bottom:1px solid #e1e6eb;vertical-align:middle}.table tbody tr td p{margin-bottom:0px}.table tfoot tr td{padding:12px 8px;border-bottom:1px solid #e1e6eb;vertical-align:middle}.table .text-right .dropdown-menu{text-align:left;left:auto;right:0px}.table-hover tbody tr:hover td{background-color:#F9F9FA}.pagination{margin:0px;vertical-align:middle;border-radius:0px}.pagination li a,.pagination li span{height:32px;line-height:20px;color:#333;cursor:pointer;border-color:#CCC}.pagination li a:hover{color:#FFF;background-color:#28B5D6;border-color:#28B5D6}.pagination li span{color:#999}.pagination li span:hover{background:none}.pagination li:first-child>a,.pagination li:first-child>span{border-radius:0px}.pagination li:last-child>a,.pagination li:last-child>span{border-radius:0px}.pagination li.active a,.pagination li.active span{background-color:#09C;border:1px solid #09C}.pagination li.active a:hover,.pagination li.active span:hover{background-color:#09C;border:1px solid #09C}.pagination-info{display:-moz-inline-stack;display:inline-block;vertical-align:middle;*vertical-align:auto;zoom:1;*display:inline;padding:0px 16px;color:#888}.form-group{margin-top:8px;margin-bottom:16px}.help-block{margin:4px 0px}.form-control{height:32px;border-radius:0px;padding:6px;-webkit-transition:none;transition:none;font-size:12px}.form-control:focus{-webkit-box-shadow:none;box-shadow:none}.form-control[size],.form-control[cols],.form-control.autosize{width:auto}.form-control.inline{display:-moz-inline-stack;display:inline-block;vertical-align:middle;*vertical-align:auto;zoom:1;*display:inline}select{color:#555555;vertical-align:middle;background-color:#ffffff;background-image:none;border:1px solid #cccccc}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline{color:#090}.has-success .form-control,input.ng-valid.ng-dirty,textarea.ng-valid.ng-dirty{border-color:#090}.has-success .form-control:focus,input.ng-valid.ng-dirty:focus,textarea.ng-valid.ng-dirty:focus{border-color:#2A0;-webkit-box-shadow:none;box-shadow:none}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline{color:#F90}.has-warning .form-control{border-color:#F90}.has-warning .form-control:focus{border-color:#FA0;-webkit-box-shadow:none;box-shadow:none}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline{color:#E40}.has-error .form-control,input.ng-invalid.ng-dirty,textarea.ng-invalid.ng-dirty{border-color:#E40}.has-error .form-control:focus,input.ng-invalid.ng-dirty:focus,textarea.ng-invalid.ng-dirty:focus{border-color:#F30;-webkit-box-shadow:none;box-shadow:none}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{color:#999}label.control-label{font-weight:normal;font-size:12px;color:#666}.form-inline .form-group{margin:4px 8px 4px 0px}.form-inline .form-control{width:auto}.form-inline .input-group-btn{width:auto}select.input-lg,.input-lg{height:40px}select.input-sm,.input-sm{height:24px}.console-onoff{vertical-align:middle;width:50px;height:20px;display:-moz-inline-stack;display:inline-block;vertical-align:middle;*vertical-align:auto;zoom:1;*display:inline;background-image:url("images/on-off.png");background-image:-webkit-image-set(url("images/on-off.png") 1x, url("images/on-off@2x.png") 2x);background-image:-moz-image-set(url("images/onoff.png") 1x, url("images/onoff@2x.png") 2x);background-image:-o-image-set(url("images/onoff.png") 1x, url("images/onoff@2x.png") 2x);background-image:-ms-image-set(url("images/onoff.png") 1x, url("images/onoff@2x.png") 2x);background-repeat:no-repeat;background-position:0px 0px;cursor:pointer}.console-onoff .onoff-handle{display:block;width:50px;height:20px;-webkit-transition:background-position 0.2s ease;-moz-transition:background-position 0.2s ease;-o-transition:background-position 0.2s ease;transition:background-position 0.2s ease;background-image:url("images/on-off.png");background-image:-webkit-image-set(url("images/on-off.png") 1x, url("images/on-off@2x.png") 2x);background-image:-moz-image-set(url("images/onoff.png") 1x, url("images/onoff@2x.png") 2x);background-image:-o-image-set(url("images/onoff.png") 1x, url("images/onoff@2x.png") 2x);background-image:-ms-image-set(url("images/onoff.png") 1x, url("images/onoff@2x.png") 2x);background-repeat:no-repeat;background-position:0px 0px}.console-onoff .onoff-loading{display:block;width:50px;height:20px;-webkit-transition:background-position 0.2s ease;-moz-transition:background-position 0.2s ease;-o-transition:background-position 0.2s ease;transition:background-position 0.2s ease;background-image:url("images/on-off-loading.gif");background-image:-webkit-image-set(url("images/on-off-loading.gif") 1x, url("images/on-off-loading@2x.gif") 2x);background-image:-moz-image-set(url("images/on-off-loading.gif") 1x, url("images/on-off-loading@2x.gif") 2x);background-image:-o-image-set(url("images/on-off-loading.gif") 1x, url("images/on-off-loading@2x.gif") 2x);background-image:-ms-image-set(url("images/on-off-loading.gif") 1x, url("images/on-off-loading@2x.gif") 2x);background-repeat:no-repeat;background-position:0px 0px}.console-onoff-on{background-position:0px -40px}.console-onoff-on .onoff-handle{background-position:0px 0px}.console-onoff-on .onoff-loading{background-position:32px 4px}.console-onoff-off{background-position:0px -60px}.console-onoff-off .onoff-handle{background-position:-28px 0px}.console-onoff-off .onoff-loading{background-position:4px 4px}.console-onoff[disabled="disabled"]{cursor:not-allowed;background-position:0px -80px}.console-onoff[disabled="disabled"] .onoff-loading{display:none}.console-onoff-on[disabled="disabled"] .onoff-handle{background-position:0px -20px}.console-onoff-off[disabled="disabled"] .onoff-handle{background-position:-28px -20px}.console-number-spinner{display:-moz-inline-stack;display:inline-block;vertical-align:middle;*vertical-align:auto;zoom:1;*display:inline;vertical-align:middle}.console-number-spinner .form-control{width:auto;float:left;text-indent:-16px}.console-number-spinner .console-number-spinner-action{width:14px;height:30px;float:left;margin-left:-16px;border-left:1px solid #E3E3E3;margin-top:1px}.console-number-spinner .console-number-spinner-action button{width:14px;height:15px;overflow:hidden;line-height:16px;font-size:12px;border:0px;background-color:transparent;padding:0px;margin:0px;display:block;color:#999;text-align:center;outline:0px}.console-number-spinner .console-number-spinner-action button:hover{color:#06C}.console-number-spinner .console-number-spinner-action button[disabled]{color:#999}.console-number-spinner .console-number-spinner-action .console-number-spinner-down{border-top:1px solid #E3E3E3}.console-timepicker{display:-moz-inline-stack;display:inline-block;vertical-align:middle;*vertical-align:auto;zoom:1;*display:inline;vertical-align:middle}.console-datepicker{padding:8px}.console-datepicker thead .h6 th{padding-top:8px}.console-datepicker tbody tr:first-child td{padding-top:8px}.console-datepicker tbody .btn{border:0px !important}.console-datepicker tbody .btn:hover{background:#F3F3F3}.console-datepicker tbody .btn-default{background:transparent}.console-datepicker tbody .active,.console-datepicker tbody .active:hover,.console-datepicker tbody .active span{background:#3C0;color:#FFF}.console-datepicker tbody .btn[disabled="disabled"] .btn[disabled="disabled"] span{color:#CCC}.console-datepicker em{font-size:12px;color:#ACD}.aliyun-console-topbar{position:relative;z-index:100;clear:both;height:50px;background:#09C;font-size:12px;min-width:990px}.aliyun-console-topbar a{text-decoration:none}.aliyun-console-topbar a:focus{outline:none}.aliyun-console-topbar .accessibility-ast{position:absolute;top:-10000px;left:-10000px;width:100px}.aliyun-console-topbar .accessibility-ast:focus{position:absolute;top:0;left:310px}.aliyun-console-topbar .icon-arrow-down{display:inline-block;width:18px;text-align:center;vertical-align:middle;transition:transform 0.2s, vertical-align 0.2s;-o-transition:transform 0.2s, vertical-align 0.2s;-ms-transition:transform 0.2s, vertical-align 0.2s;-moz-transition:transform 0.2s, vertical-align 0.2s;-webkit-transition:transform 0.2s, vertical-align 0.2s}.aliyun-console-topbar .dropdown .dropdown-menu{z-index:1;font-size:12px;border-radius:0;-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.1);box-shadow:0 1px 3px rgba(0,0,0,0.1)}.aliyun-console-topbar .dropdown .dropdown-menu a{padding:0}.aliyun-console-topbar .dropdown.open .icon-arrow-down{vertical-align:text-top;transform:rotate(180deg);-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg)}.aliyun-console-topbar .topbar-wrap,.aliyun-console-topbar .topbar-logo,.aliyun-console-topbar .topbar-home,.aliyun-console-topbar .topbar-home-link,.aliyun-console-topbar .topbar-nav,.aliyun-console-topbar .topbar-info{height:100%}.aliyun-console-topbar .topbar-left{float:left}.aliyun-console-topbar .topbar-right{float:right}.aliyun-console-topbar .topbar-clearfix:before,.aliyun-console-topbar .topbar-clearfix:after{display:table;content:" "}.aliyun-console-topbar .topbar-clearfix:after{clear:both}.aliyun-console-topbar .topbar-head{background:#008fbf;height:50px;position:relative;z-index:3}.aliyun-console-topbar .topbar-nav{position:relative;z-index:2;background:#09C}.aliyun-console-topbar .topbar-logo,.aliyun-console-topbar .topbar-home{display:block;width:50px;background:#0099cc;font-size:28px;color:#FFF;text-align:center;line-height:50px}.aliyun-console-topbar .topbar-logo span,.aliyun-console-topbar .topbar-home span{line-height:50px}.aliyun-console-topbar .topbar-logo{background:#0087b4}.aliyun-console-topbar .topbar-home{margin-right:1px;font-size:20px}.aliyun-console-topbar .topbar-home:hover{background:#008fbf}.aliyun-console-topbar .topbar-home-link{padding:0 20px;margin-right:1px;background:#09c}.aliyun-console-topbar .topbar-home{-o-transition:all 0.15s, 0.15s;-ms-transition:all 0.15s, 0.15s;-moz-transition:all 0.15s, 0.15s;-webkit-transition:all 0.15s, 0.15s}.aliyun-console-topbar .topbar-btn{color:#fff;font-size:14px;line-height:50px}.aliyun-console-topbar .topbar-btn:hover,.aliyun-console-topbar .topbar-btn.topbar-btn-dark{background:#008fbf}.aliyun-console-topbar .topbar-nav.open .topbar-nav-btn{background:#fff;color:#333}.aliyun-console-topbar .topbar-nav-btn{padding:0 20px;display:inline-block;height:50px}.aliyun-console-topbar .topbar-nav-list{border:none;padding:10px;margin-top:0;white-space:nowrap}.aliyun-console-topbar .topbar-nav-list .topbar-nav-col{display:inline-block;vertical-align:top;padding:0 10px}.aliyun-console-topbar .topbar-nav-list .topbar-nav-item .topbar-nav-item-title{margin:3px 0px;color:#999;font-weight:600}.aliyun-console-topbar .topbar-nav-list .topbar-nav-item .topbar-nav-gap{border-top:1px solid #f2f2f2;width:100%;margin:6px 0 10px}.aliyun-console-topbar .topbar-nav-list .topbar-nav-item ul{padding:0;margin:8px 0 0 0;list-style:none}.aliyun-console-topbar .topbar-nav-list .topbar-nav-item ul li{min-width:160px;height:28px;line-height:28px;margin-bottom:2px}.aliyun-console-topbar .topbar-nav-list .topbar-nav-item ul li a{display:block;height:100%;padding:0 10px;text-decoration:none;color:#333}.aliyun-console-topbar .topbar-nav-list .topbar-nav-item ul li a:hover{background-color:#f2f2f2}.aliyun-console-topbar .topbar-nav-list .topbar-nav-item ul li a .topbar-nav-item-icon{padding-right:2px;font-size:16px;vertical-align:text-bottom;display:inline-block}.aliyun-console-topbar .topbar-nav-list .topbar-nav-item ul li.topbar-unservice a{color:#999}.aliyun-console-topbar .topbar-nav-list .topbar-nav-item ul li.topbar-unservice a .topbar-nav-item-icon{color:#999}.aliyun-console-topbar .topbar-info{background:#008fbf;position:absolute;z-index:1;top:0;right:0}.aliyun-console-topbar .topbar-info .topbar-btn{padding:0 10px;height:50px;display:block;z-index:2;background:#09c}.aliyun-console-topbar .topbar-info .topbar-btn:hover,.aliyun-console-topbar .topbar-info .topbar-btn.topbar-btn-dark{background:#008fbf}.aliyun-console-topbar .topbar-info .topbar-btn.open{position:relative}.aliyun-console-topbar .topbar-info .topbar-btn-search{padding:0;margin-left:1px}.aliyun-console-topbar .topbar-info .topbar-info-gap{color:#fff}.aliyun-console-topbar .topbar-info .dropdown .dropdown-menu{width:100%;min-width:0;margin:0;border:none}.aliyun-console-topbar .topbar-info .dropdown.open .topbar-btn{color:#333;background:#fff;border-bottom:1px solid #eaedf1;position:relative}.aliyun-console-topbar .topbar-info .topbar-info-btn{height:40px;border-bottom:1px solid #eaedf1}.aliyun-console-topbar .topbar-info .topbar-info-btn a{line-height:39px;padding-left:10px}.aliyun-console-topbar .topbar-info .topbar-user-large .dropdown-menu{width:310px;left:auto;right:0}.aliyun-console-topbar .topbar-info .topbar-user-large .dropdown-menu .user-identity{height:80px;padding:8px 16px;position:relative}.aliyun-console-topbar .topbar-info .topbar-user-large .dropdown-menu .user-identity .user-identity-item{height:32px;line-height:32px;display:block}.aliyun-console-topbar .topbar-info .topbar-user-large .dropdown-menu .user-identity .user-identity-colon{padding:0 5px}.aliyun-console-topbar .topbar-info .topbar-user-large .dropdown-menu .user-identity-sign{padding:2px 6px;background:#7ecef4;color:#fff;border-radius:1px}.aliyun-console-topbar .topbar-info .topbar-user-large .dropdown-menu .user-identity-sign-wrap{position:absolute;top:14px;right:30px}.aliyun-console-topbar .topbar-info .topbar-user-large .dropdown-menu .user-btn-link{display:inline-block;color:#06C}.aliyun-console-topbar .topbar-info .topbar-user-large .dropdown-menu .user-btn-link:hover{background:none;text-decoration:underline}.aliyun-console-topbar .topbar-info .topbar-user-large .dropdown-menu .user-btn-link.user-btn-link-signout{float:right;padding:0 16px}.aliyun-console-topbar .topbar-info-item{display:inline-block;margin-left:1px}.aliyun-console-topbar .topbar-notice{position:relative;font-size:12px;margin-left:1px;padding:0 12px 0 8px !important}.aliyun-console-topbar .topbar-notice .topbar-notice-panel{display:none}.aliyun-console-topbar .topbar-notice.open .topbar-notice-panel{display:block}.aliyun-console-topbar .topbar-notice .topbar-notice-panel{position:absolute;top:48px;left:-185px;width:440px;border-radius:2px;z-index:15;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.175);-moz-box-shadow:0 1px 2px rgba(0,0,0,0.175);box-shadow:0 1px 2px rgba(0,0,0,0.175)}.aliyun-console-topbar .topbar-notice .topbar-notice-panel .topbar-notice-arrow{background:url(images/notice-arrow.png) 0 0 no-repeat;width:11px;height:6px;position:absolute;top:-6px;left:220px}.aliyun-console-topbar .topbar-notice .topbar-notice-panel .topbar-notice-head{height:50px;background-color:#eaedf1;padding:0 15px;line-height:50px;color:#333;font-size:14px}.aliyun-console-topbar .topbar-notice .topbar-notice-panel .topbar-notice-body{height:300px;overflow-y:auto;background:#fff;font-size:12px}.aliyun-console-topbar .topbar-notice .topbar-notice-panel .topbar-notice-body ul{list-style:none;margin:0;padding:0}.aliyun-console-topbar .topbar-notice .topbar-notice-panel .topbar-notice-body ul li{height:60px;line-height:20px;border-bottom:1px solid #eaedf1}.aliyun-console-topbar .topbar-notice .topbar-notice-panel .topbar-notice-body ul li a{display:block;height:100%;padding:10px 10px;background:#fff;color:#333}.aliyun-console-topbar .topbar-notice .topbar-notice-panel .topbar-notice-body ul li a .topbar-notice-link{display:block;max-width:300px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;color:#06c}.aliyun-console-topbar .topbar-notice .topbar-notice-panel .topbar-notice-body ul li a:hover{background:#f9f9f9}.aliyun-console-topbar .topbar-notice .topbar-notice-panel .topbar-notice-body ul li.topbar-notice-readed a{color:#666}.aliyun-console-topbar .topbar-notice .topbar-notice-panel .topbar-notice-body ul li.topbar-notice-readed a .topbar-notice-time{color:#999}.aliyun-console-topbar .topbar-notice .topbar-notice-panel .topbar-notice-body .topbar-notice-empty{text-align:center;color:#666;margin-top:80px}.aliyun-console-topbar .topbar-notice .topbar-notice-panel .topbar-notice-foot{height:50px;line-height:50px;background:#fff;text-align:center}.aliyun-console-topbar .topbar-notice .topbar-notice-panel .topbar-notice-class{padding:8px 0;float:right}.aliyun-console-topbar .topbar-notice .topbar-notice-panel .topbar-notice-class .topbar-notice-class-name{display:block;height:24px;line-height:24px;width:66px;background:#eaedf1;text-align:center;border-radius:3px}.aliyun-console-topbar .topbar-btn-notice{width:auto;display:block;height:50px}.aliyun-console-topbar .topbar-btn-notice .topbar-btn-notice-icon{font-size:24px;line-height:50px;vertical-align:text-bottom;color:#fff}.aliyun-console-topbar .topbar-btn-notice .topbar-btn-notice-num{font-size:12px;color:#fff;background:#ff9900;border-radius:5px;padding:2px 5px;display:inline-block;margin-top:15px;line-height:16px;vertical-align:top;text-align:center}.aliyun-console-topbar .topbar-btn-notice .topbar-btn-notice-num.topbar-btn-notice-num-zero{color:#00ace9;background-color:#0087b4}.aliyun-console-topbar .topbar-btn-notice .topbar-nav-item-short{padding-left:2px}.aliyun-console-topbar .topbar-qrcode{position:relative;margin-left:1px}.aliyun-console-topbar .topbar-qrcode:hover .topbar-qrcode-panel{display:block}.aliyun-console-topbar .topbar-qrcode .topbar-qrcode-panel{top:50px;left:0;position:absolute;width:130px;padding:12px 8px;background:#fff;border:1px solid #eaedf1;box-shadow:0 1px 3px rgba(0,0,0,0.1);display:none}.aliyun-console-topbar .topbar-qrcode .topbar-qrcode-image{width:100px;margin:0 auto}.aliyun-console-topbar .topbar-qrcode .topbar-qrcode-title{text-align:center;padding-top:10px}.aliyun-console-topbar .topbar-new-icon{position:relative;top:-4px;padding-left:2px}.aliyun-console-topbar-search{position:relative;z-index:1}.aliyun-console-topbar-search:hover{background:#008fbf}.aliyun-console-topbar-search:hover .topbar-search-ask{background:#008fbf}.aliyun-console-topbar-search .topbar-search-ask{width:200px;height:50px;border:0;background:#09c;line-height:26px;padding:12px 30px 12px 10px;display:block;color:#fff;-webkit-border-radius:1px 1px;-moz-border-radius:1px / 1px;border-radius:1px / 1px;-o-transition:all 0.15s, 0.15s;-ms-transition:all 0.15s, 0.15s;-moz-transition:all 0.15s, 0.15s;-webkit-transition:all 0.15s, 0.15s}.aliyun-console-topbar-search .topbar-search-ask:focus{outline:none}.aliyun-console-topbar-search .topbar-search-ask-shade{color:#00ace9}.aliyun-console-topbar-search .topbar-search-mark{font-size:16px;line-height:50px;position:absolute;height:50px;width:40px;color:#fff;text-decoration:none;display:block;text-align:center;top:0;right:0}.aliyun-console-topbar-search .topbar-search-mark .icon-search,.aliyun-console-topbar-search .topbar-search-mark .icon-enter{line-height:50px}.aliyun-console-topbar-search.topbar-search-active{background:#008fbf}.aliyun-console-topbar-search.topbar-search-active .topbar-search-ask{background:#008fbf}.aliyun-console-topbar-search.topbar-search-active .topbar-search-ask-shade{color:#fff}.aliyun-console-topbar-search-v1_3_21{position:relative}.aliyun-console-topbar-search-v1_3_21.topbar-search-dropdown-open .topbar-btn{background:#008fbf}.aliyun-console-topbar-search-v1_3_21 .icon-search{font-size:16px;padding-right:4px;position:relative;top:2px}.aliyun-console-topbar-search-v1_3_21 .topbar-search-dropdown{height:38px;position:absolute;bottom:-38px;right:-1px;border:2px solid #008fbf;background:#fff}.aliyun-console-topbar-search-v1_3_21 .topbar-search-dropdown input{display:block;height:34px;padding:4px 6px;margin-right:30px;width:250px;border-width:0;outline:0;line-height:34px;color:#546478;font-size:12px}.aliyun-console-topbar-search-v1_3_21 .topbar-search-dropdown .topbar-search-mark{position:absolute;right:0;top:0;height:34px;width:34px;display:block;line-height:34px;text-align:center;color:#546478}.aliyun-console-topbar-help{position:fixed;top:0;right:0;bottom:0}.aliyun-console-topbar-help .topbar-help-inner{width:486px;overflow:hidden;background:#fff;border-left:1px solid #e1e6eb;position:absolute;right:-486px;-webkit-box-shadow:0 0px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 0px 10px rgba(0,0,0,0.1);box-shadow:0 0px 10px rgba(0,0,0,0.1);-o-transition:all 0.2s ease, 0.2s ease;-ms-transition:all 0.2s ease, 0.2s ease;-moz-transition:all 0.2s ease, 0.2s ease;-webkit-transition:all 0.2s ease, 0.2s ease;z-index:1;top:50px;bottom:0}.aliyun-console-topbar-help .topbar-help-inner.topbar-help-show{right:0px}.aliyun-console-topbar-help .topbar-help-head{height:68px;padding-left:20px;line-height:68px;border-bottom:1px solid #e1e6eb;position:relative;color:#333}.aliyun-console-topbar-help .topbar-help-body{position:absolute;top:68px;bottom:0;background:#fff}.aliyun-console-topbar-help .topbar-help-iframe{height:100%}.aliyun-console-topbar-help .topbar-help-close{font-size:18px;float:right;height:68px;width:68px;line-height:68px !important;text-align:center;color:#546478;cursor:pointer;user-select:none;-webkit-user-select:none;-moz-user-select:none}.aliyun-console-topbar-help .topbar-help-close:hover{color:#000}.console-topbar-new{position:relative;z-index:100;clear:both;height:40px;background:#34383c;font-size:12px;min-width:1000px}.console-topbar-new .console-topbar-btn{width:50px;height:40px;display:inline-block;vertical-align:middle;margin-right:1px;background-color:#2a2e31;text-decoration:none;text-align:center;color:#fff;line-height:40px;-o-transition:all 0.3s;-ms-transition:all 0.3s;-moz-transition:all 0.3s;-webkit-transition:all 0.3s}.console-topbar-new .console-topbar-btn .console-topbar-btn-text{font-size:14px;text-align:center;white-space:nowrap;display:none}.console-topbar-new .console-topbar-btn .console-topbar-btn-icon{font-size:22px;display:inline;line-height:40px;color:#fff}.console-topbar-new .console-topbar-btn .caret{-o-transition:-o-transform 0.3s;-ms-transition:-ms-transform 0.3s;-moz-transition:-moz-transform 0.3s;-webkit-transition:-webkit-transform 0.3s;transition:transform 0.3s}.console-topbar-new .console-topbar-btn:hover{width:auto}.console-topbar-new .console-topbar-btn:hover.console-topbar-btn-inverse,.console-topbar-new .console-topbar-btn:hover.console-topbar-btn-inverse-white{background-color:#585e65;color:#fff}.console-topbar-new .console-topbar-btn:hover .console-topbar-btn-text{display:inline}.console-topbar-new .console-topbar-btn:hover .console-topbar-btn-icon{display:none;vertical-align:text-bottom}.console-topbar-new .console-topbar-btn:hover.console-topbar-btn-home{width:106px}.console-topbar-new .console-topbar-btn:hover.console-topbar-btn-nav{width:120px}.console-topbar-new .console-topbar-btn:hover.console-topbar-btn-ak{width:104px}.console-topbar-new .console-topbar-btn:hover.console-topbar-btn-workorder{width:94px}.console-topbar-new .console-topbar-btn.console-topbar-btn-last{margin-right:0}.console-topbar-new .console-topbar-btn.console-topbar-logo-icon{-o-transition:none;-ms-transition:none;-moz-transition:none;-webkit-transition:none;color:#2a2e31}.console-topbar-new .console-topbar-btn.console-topbar-logo-icon img{width:22px;height:22px;display:block;margin:9px 14px}.console-topbar-new .console-topbar-btn.console-topbar-nav-link{font-size:12px;width:auto;padding:0 15px}.console-topbar-new .console-topbar-btn.console-topbar-nav-link .console-topbar-nav-link-icon{width:16px;height:19px;vertical-align:middle;position:relative;display:inline-block;margin-right:4px;overflow:hidden;font-size:16px}.console-topbar-new .console-topbar-btn.console-topbar-btn-user{width:auto}.console-topbar-new .console-topbar-btn.console-topbar-btn-user .console-topbar-btn-text{display:inline;padding:0 15px}.console-topbar-new .console-topbar-btn.console-topbar-btn-notice{width:auto;padding:0 10px}.console-topbar-new .console-topbar-btn.console-topbar-btn-notice .console-topbar-btn-notice-icon{font-size:24px;line-height:40px;vertical-align:text-bottom}.console-topbar-new .console-topbar-btn.console-topbar-btn-notice .console-topbar-btn-notice-num{font-size:12px;color:#fff;background:#ff9900;border-radius:5px;padding:2px 1px;width:20px;display:inline-block;margin-top:10px;line-height:16px;vertical-align:top}.console-topbar-new .console-topbar-btn.console-topbar-btn-notice .console-topbar-btn-notice-num.console-topbar-btn-notice-num-zero{color:#999;background-color:#34383c}.console-topbar-new .console-topbar-btn.console-topbar-btn-notice .console-topbar-nav-item-short{padding-left:2px}.console-topbar-new .console-topbar-btn.console-topbar-btn-ak{overflow:hidden}.console-topbar-new .console-topbar-btn.console-topbar-btn-nav{overflow:hidden;position:relative;z-index:2}.console-topbar-new .console-topbar-nav .console-topbar-nav-list{border:1px solid #ddd;border-top:none;padding:10px;margin-top:0;margin-left:-1px}.console-topbar-new .console-topbar-nav .console-topbar-nav-list .console-topbar-nav-col{float:left;padding:0 10px}.console-topbar-new .console-topbar-nav .console-topbar-nav-list .console-topbar-nav-item .console-topbar-nav-item-title{margin:3px 0px;color:#999;font-weight:600}.console-topbar-new .console-topbar-nav .console-topbar-nav-list .console-topbar-nav-item .console-topbar-nav-gap{border-top:1px solid #f2f2f2;width:100%;margin:10px 0}.console-topbar-new .console-topbar-nav .console-topbar-nav-list .console-topbar-nav-item ul{padding:0;margin:10px 0 0 0;list-style:none}.console-topbar-new .console-topbar-nav .console-topbar-nav-list .console-topbar-nav-item ul li{width:170px;height:30px;line-height:30px;margin-bottom:2px}.console-topbar-new .console-topbar-nav .console-topbar-nav-list .console-topbar-nav-item ul li a{display:block;height:100%;padding-left:10px;text-decoration:none;color:#333}.console-topbar-new .console-topbar-nav .console-topbar-nav-list .console-topbar-nav-item ul li a:hover{background-color:#f2f2f2}.console-topbar-new .console-topbar-nav .console-topbar-nav-list .console-topbar-nav-item ul li a .console-topbar-nav-item-icon{padding-right:2px;font-size:16px;vertical-align:text-bottom}.console-topbar-new .console-topbar-nav .console-topbar-nav-list .console-topbar-nav-item ul li a .console-topbar-nav-item-icon.icon-ecs{color:#007eff}.console-topbar-new .console-topbar-nav .console-topbar-nav-list .console-topbar-nav-item ul li a .console-topbar-nav-item-icon.icon-slb{color:#f27741}.console-topbar-new .console-topbar-nav .console-topbar-nav-list .console-topbar-nav-item ul li a .console-topbar-nav-item-icon.icon-rds{color:#20f8b8}.console-topbar-new .console-topbar-nav .console-topbar-nav-list .console-topbar-nav-item ul li a .console-topbar-nav-item-icon.icon-oss{color:#ade675}.console-topbar-new .console-topbar-nav .console-topbar-nav-list .console-topbar-nav-item ul li a .console-topbar-nav-item-icon.icon-cdn{color:#bff3fe}.console-topbar-new .console-topbar-nav .console-topbar-nav-list .console-topbar-nav-item ul li a .console-topbar-nav-item-icon.icon-ots{color:#15d4f0}.console-topbar-new .console-topbar-nav .console-topbar-nav-list .console-topbar-nav-item ul li a .console-topbar-nav-item-icon.icon-ocs{color:#40ff8f}.console-topbar-new .console-topbar-nav .console-topbar-nav-list .console-topbar-nav-item ul li a .console-topbar-nav-item-icon.icon-odps{color:#ffba00}.console-topbar-new .console-topbar-nav .console-topbar-nav-list .console-topbar-nav-item ul li a .console-topbar-nav-item-icon.icon-ace{color:#c8341c}.console-topbar-new .console-topbar-nav .console-topbar-nav-list .console-topbar-nav-item ul li a .console-topbar-nav-item-icon.icon-yundun{color:#298edb}.console-topbar-new .console-topbar-nav .console-topbar-nav-list .console-topbar-nav-item ul li a .console-topbar-nav-item-icon.icon-yunjiankong{color:#86f2af}.console-topbar-new .console-topbar-nav .console-topbar-nav-list .console-topbar-nav-item ul li a .console-topbar-nav-item-icon.icon-sls{color:#075ac0}.console-topbar-new .console-topbar-nav .console-topbar-nav-list .console-topbar-nav-item ul li a .console-topbar-nav-item-icon.icon-oas{color:#79df71}.console-topbar-new .console-topbar-nav .console-topbar-nav-list .console-topbar-nav-item ul li a .console-topbar-nav-item-icon.icon-ess{color:#0cf}.console-topbar-new .console-topbar-nav .console-topbar-nav-list .console-topbar-nav-item ul li a .console-topbar-nav-item-icon.icon-mqs{color:#fff400}.console-topbar-new .console-topbar-nav .console-topbar-nav-list .console-topbar-nav-item ul li a .console-topbar-nav-item-icon.icon-vpc{color:#6cf}.console-topbar-new .console-topbar-nav .console-topbar-nav-list .console-topbar-nav-item ul li a .console-topbar-nav-item-icon.icon-opensearch{color:#5bc8e8}.console-topbar-new .console-topbar-nav .console-topbar-nav-list .console-topbar-nav-item ul li a .console-topbar-nav-item-icon.icon-lightcloud{color:#6bbd52}.console-topbar-new .console-topbar-nav .console-topbar-nav-list .console-topbar-nav-item ul li a .console-topbar-nav-item-icon.icon-pts{color:#009dff}.console-topbar-new .console-topbar-nav .console-topbar-nav-list .console-topbar-nav-item ul li a .console-topbar-nav-item-icon.icon-ons{color:#6b3100}.console-topbar-new .console-topbar-nav .console-topbar-nav-list .console-topbar-nav-item ul li a .console-topbar-nav-item-icon.icon-dpc{color:#289de9}.console-topbar-new .console-topbar-nav .console-topbar-nav-list .console-topbar-nav-item ul li a .console-topbar-nav-item-icon.icon-ads{color:#71ceec}.console-topbar-new .console-topbar-nav .console-topbar-nav-list .console-topbar-nav-item ul li a .console-topbar-nav-item-icon.icon-mts{color:#f93}.console-topbar-new .console-topbar-nav .console-topbar-nav-list .console-topbar-nav-item ul li a .console-topbar-nav-item-icon.icon-drds{color:#6f9}.console-topbar-new .console-topbar-nav .console-topbar-nav-list .console-topbar-nav-item ul li.console-topbar-unservice a{color:#999}.console-topbar-new .console-topbar-nav .console-topbar-nav-list .console-topbar-nav-item ul li.console-topbar-unservice a .console-topbar-nav-item-icon{color:#999}.console-topbar-new .dropdown .dropdown-menu{z-index:1;border-radius:0;-webkit-box-shadow:0 2px 4px rgba(0,0,0,0.175);-moz-box-shadow:0 2px 4px rgba(0,0,0,0.175);box-shadow:0 2px 4px rgba(0,0,0,0.175)}.console-topbar-new .dropdown.open .console-topbar-btn.console-topbar-btn-inverse{background-color:#585e65;color:#fff}.console-topbar-new .dropdown.open .console-topbar-btn.console-topbar-btn-inverse-white{background-color:#fff;color:#333}.console-topbar-new .dropdown.open .console-topbar-btn .console-topbar-btn-text{display:inline}.console-topbar-new .dropdown.open .console-topbar-btn .console-topbar-btn-icon{display:none;vertical-align:text-bottom}.console-topbar-new .dropdown.open .console-topbar-btn:hover.console-topbar-btn-inverse-white{background-color:#fff !important;color:#333 !important}.console-topbar-new .dropdown.open .console-topbar-btn.console-topbar-btn-nav{width:120px}.console-topbar-new .dropdown.open .console-topbar-btn.console-topbar-btn-workorder{width:94px}.console-topbar-new .dropdown.open .console-topbar-btn .caret{transform:rotate(180deg);-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg)}.console-topbar-new .console-topbar-user .dropdown-menu,.console-topbar-new .console-topbar-dropdown .dropdown-menu{margin-top:-1px}.console-topbar-new .console-topbar-user .dropdown-menu>li a,.console-topbar-new .console-topbar-dropdown .dropdown-menu>li a{padding:6px 20px}.console-topbar-new .console-topbar-workorder .dropdown-menu{min-width:96px}.console-topbar-new .console-topbar-workorder .dropdown-menu>li a{padding:6px 24px 6px 16px}.console-topbar-new .console-topbar-notice{position:relative}.console-topbar-new .console-topbar-notice .console-topbar-notice-panel{display:none}.console-topbar-new .console-topbar-notice.open .console-topbar-notice-panel{display:block}.console-topbar-new .console-topbar-notice .console-topbar-notice-panel{position:absolute;top:38px;left:-170px;width:390px;border:1px solid #bbb;border-radius:2px;z-index:15;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.175);-moz-box-shadow:0 1px 2px rgba(0,0,0,0.175);box-shadow:0 1px 2px rgba(0,0,0,0.175)}.console-topbar-new .console-topbar-notice .console-topbar-notice-panel .console-topbar-notice-arrow{background:url(images/notice-arrow.png) 0 0 no-repeat;width:11px;height:6px;position:absolute;top:-6px;left:196px}.console-topbar-new .console-topbar-notice .console-topbar-notice-panel .console-topbar-notice-head{height:40px;border-bottom:1px solid #ccc;background-color:#f2f2f2;padding:0 15px;line-height:40px;color:#333;font-size:14px}.console-topbar-new .console-topbar-notice .console-topbar-notice-panel .console-topbar-notice-body{height:240px;overflow-y:auto;background:#fff}.console-topbar-new .console-topbar-notice .console-topbar-notice-panel .console-topbar-notice-body ul{list-style:none;margin:0 5px;padding:0}.console-topbar-new .console-topbar-notice .console-topbar-notice-panel .console-topbar-notice-body ul li{height:40px;line-height:40px;border-bottom:1px solid #ececec}.console-topbar-new .console-topbar-notice .console-topbar-notice-panel .console-topbar-notice-body ul li a{display:block;height:100%;padding:0 10px;background:#fff}.console-topbar-new .console-topbar-notice .console-topbar-notice-panel .console-topbar-notice-body ul li a span{display:block}.console-topbar-new .console-topbar-notice .console-topbar-notice-panel .console-topbar-notice-body ul li a .console-topbar-notice-link{float:left;max-width:272px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.console-topbar-new .console-topbar-notice .console-topbar-notice-panel .console-topbar-notice-body ul li a .console-topbar-notice-time{float:right;color:#333}.console-topbar-new .console-topbar-notice .console-topbar-notice-panel .console-topbar-notice-body ul li a:hover{background:#f9f9f9}.console-topbar-new .console-topbar-notice .console-topbar-notice-panel .console-topbar-notice-body ul li.console-topbar-notice-readed a{color:#666}.console-topbar-new .console-topbar-notice .console-topbar-notice-panel .console-topbar-notice-body ul li.console-topbar-notice-readed a .console-topbar-notice-time{color:#999}.console-topbar-new .console-topbar-notice .console-topbar-notice-panel .console-topbar-notice-body .console-topbar-notice-empty{text-align:center;color:#666;margin-top:80px}.console-topbar-new .console-topbar-notice .console-topbar-notice-panel .console-topbar-notice-foot{height:48px;line-height:48px;background:#fff}.console-topbar-new .console-topbar-notice .console-topbar-notice-panel .console-topbar-notice-foot .console-topbar-notice-more{padding-right:15px}.console-topbar-new .console-topbar-locale{float:left}.console-topbar-new .console-topbar-locale .dropdown-menu{right:0;left:auto;margin-top:-1px;width:50px;min-width:60px}.console-topbar-new .console-topbar-locale .console-topbar-btn.console-topbar-btn-locale{width:60px;background:none}.console-topbar-new .console-topbar-locale .console-topbar-btn.console-topbar-btn-locale .console-topbar-btn-text{display:block}.console-topbar-new.console-topbar-new-en .console-topbar-btn:hover.console-topbar-btn-home{width:116px}.console-topbar-new.console-topbar-new-en .console-topbar-btn:hover.console-topbar-btn-nav{width:170px}.console-topbar-new.console-topbar-new-en .console-topbar-btn:hover.console-topbar-btn-workorder{width:146px}.console-topbar-new.console-topbar-new-en .console-topbar-nav .console-topbar-nav-item ul li{width:auto !important}.console-topbar-new.console-topbar-new-en .console-topbar-nav .console-topbar-nav-item ul li a{padding:0 10px}.console-topbar-new.console-topbar-new-en .dropdown.open .console-topbar-btn.console-topbar-btn-nav{width:170px}.console-topbar-new.console-topbar-new-en .dropdown.open .console-topbar-btn.console-topbar-btn-workorder{width:146px}.console-navbar{font-size:12px;color:#666666;word-wrap:break-word;height:56px;border:none;border-bottom:1px solid #dddddd;box-shadow:0px 0px 4px rgba(0,0,0,0.1);position:relative;box-sizing:content-box;margin-bottom:0px;background-color:#fff;border-radius:0 !important;z-index:2}.console-navbar *{box-sizing:content-box}.console-navbar a{color:#333}.console-navbar .console-navbar-title{float:left;line-height:56px;padding:0 40px 0 14px;font-size:18px;color:#999999}.console-navbar .console-navbar-title .console-navbar-subtitle{margin-right:5px}.console-navbar .nav li{float:left;display:inline;margin:0 20px;height:56px;font-size:14px}.console-navbar .nav li a{padding:0 2px;float:left;height:55px;color:#333333;line-height:56px;text-decoration:none}.console-navbar .nav li a:hover,.console-navbar .nav li a:focus{background-color:#fff}.console-navbar .nav li.active{height:55px}.console-navbar .nav li.active a{color:#ff4902;border-bottom:2px solid #ff4902}.console-navbar .console-navbar-a-default{cursor:default}.console-navbar .console-navbar-links-example{margin-top:15px;padding:0 15px 0;line-height:24px;border-left:1px solid #eeeeee}.console-navbar .console-navbar-links-example a{color:#b3b3b3}.console-title{padding:16px 0px;min-height:70px}.console-title .nav-pills{display:inline-block;vertical-align:bottom}.console-title .nav-pills li a,.console-title .nav-pills li a:focus,.console-title .nav-pills li button,.console-title .nav-pills li button:focus{padding:6px 6px}.console-title h1,.console-title h2,.console-title h3,.console-title h4,.console-title h5,.console-title h6{display:inline-block;text-indent:8px;border-left:2px solid #88B7E0;margin-top:0px;margin-bottom:0px;margin-right:8px}.console-title h1{margin-top:0px;margin-bottom:0px}.console-title h2{margin-top:2px;margin-bottom:2px}.console-title h3{margin-top:4px;margin-bottom:4px}.console-title h4{margin-top:6px;margin-bottom:6px}.console-title h5{margin-top:8px;margin-bottom:8px}.console-title-border{border-bottom:1px solid #DDD}.console-sub-title{position:relative;padding-left:16px;margin-bottom:-1px;display:table;width:100%;z-index:1;height:40px;border:1px solid #E1E6EB;border-left:3px solid #778;background-color:#F4F5F9}.console-sub-title h5{color:#666;font-size:14px}.console-box-border{border:1px solid #E1E6EB}.margin-left,.margin-left-1{margin-left:8px !important}.margin-left-2{margin-left:16px !important}.margin-left-3{margin-left:24px !important}.margin-left-4{margin-left:32px !important}.margin-right,.margin-right-1{margin-right:8px !important}.margin-right-2{margin-right:16px !important}.margin-right-3{margin-right:24px !important}.margin-right-4{margin-right:32px !important}.margin-top,.margin-top-1{margin-top:8px !important}.margin-top-2{margin-top:16px !important}.margin-top-3{margin-top:24px !important}.margin-top-4{margin-top:32px !important}.row-padding-1{padding-top:8px;padding-bottom:8px}.row-padding,.row-padding-2{padding-top:16px;padding-bottom:16px}.row-padding-3{padding-top:24px;padding-bottom:24px}.row-padding-4{padding-top:32px;padding-bottom:32px}.row-margin-1{margin-top:8px;margin-bottom:8px}.row-margin,.row-margin-2{margin-top:16px;margin-bottom:16px}.row-margin-3{margin-top:24px;margin-bottom:24px}.row-margin-4{margin-top:32px;margin-bottom:32px}.col-padding-1{padding-left:8px;padding-right:8px}.col-padding,.col-padding-2{padding-left:16px;padding-right:16px}.col-padding-3{padding-left:24px;padding-right:24px}.col-padding-4{padding-left:32px;padding-right:32px}.col-margin-1{margin-left:8px;margin-right:8px}.col-margin,.col-margin-2{margin-left:16px;margin-right:16px}.col-margin-3{margin-left:24px;margin-right:24px}.col-margin-4{margin-left:32px;margin-right:32px}.inline-block{display:inline-block !important;display:-moz-inline-stack;display:inline-block;vertical-align:middle;*vertical-align:auto;zoom:1;*display:inline}.partition{display:-moz-inline-stack;display:inline-block;vertical-align:middle;*vertical-align:auto;zoom:1;*display:inline;padding:0px 4px}.no-data{padding:24px 0px;text-align:center;color:#666}@font-face{font-family:'aliyun-console-font';src:url("fonts/aliyun-console-font.eot?t91au5");src:url("fonts/aliyun-console-font.eot?t91au5#iefix") format("embedded-opentype"),url("fonts/aliyun-console-font.ttf?t91au5") format("truetype"),url("fonts/aliyun-console-font.woff?t91au5") format("woff"),url("fonts/aliyun-console-font.svg?t91au5#aliyun-console-font") format("svg");font-weight:normal;font-style:normal}[class^="icon-"],[class*=" icon-"]{font-family:'aliyun-console-font' !important;speak:none;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.icon-logo2:before{content:"\e63b"}.icon-logo1:before{content:"\e63a"}.icon-logo-new:before{content:"\e97f"}.icon-dms-2:before{content:"\e92d"}.icon-dms-3:before{content:"\e92e"}.icon-dms:before{content:"\e92f"}.icon-gpdb-2:before{content:"\e983"}.icon-gpdb-3:before{content:"\e984"}.icon-gpdb:before{content:"\e985"}.icon-schedulerx-2:before{content:"\e986"}.icon-schedulerx-3:before{content:"\e987"}.icon-schedulerx:before{content:"\e988"}.icon-txc-2:before{content:"\e989"}.icon-txc-3:before{content:"\e98a"}.icon-txc:before{content:"\e98b"}.icon-csb-2:before{content:"\e909"}.icon-csb-3:before{content:"\e90a"}.icon-csb:before{content:"\e90b"}.icon-mobsec-2:before{content:"\e96d"}.icon-mobsec-3:before{content:"\e96e"}.icon-mobsec:before{content:"\e96f"}.icon-mss-2:before{content:"\e970"}.icon-mss-3:before{content:"\e971"}.icon-mss:before{content:"\e972"}.icon-sos-2:before{content:"\e973"}.icon-sos-3:before{content:"\e974"}.icon-sos:before{content:"\e975"}.icon-sppc-2:before{content:"\e976"}.icon-sppc-3:before{content:"\e977"}.icon-sppc:before{content:"\e978"}.icon-webfirewall-2:before{content:"\e979"}.icon-webfirewall-3:before{content:"\e97a"}.icon-webfirewall:before{content:"\e97b"}.icon-xianzhi-2:before{content:"\e97c"}.icon-xianzhi-3:before{content:"\e97d"}.icon-xianzhi:before{content:"\e97e"}.icon-livevideo-2:before{content:"\e964"}.icon-livevideo-3:before{content:"\e965"}.icon-livevideo:before{content:"\e966"}.icon-slm-2:before{content:"\e967"}.icon-slm-3:before{content:"\e968"}.icon-slm:before{content:"\e969"}.icon-vod-2:before{content:"\e96a"}.icon-vod-3:before{content:"\e96b"}.icon-vod:before{content:"\e96c"}.icon-kms-2:before{content:"\e95e"}.icon-kms-3:before{content:"\e95f"}.icon-kms:before{content:"\e960"}.icon-nas-2:before{content:"\e961"}.icon-nas-3:before{content:"\e962"}.icon-nas:before{content:"\e963"}.icon-apigateway-2:before{content:"\e94f"}.icon-apigateway-3:before{content:"\e950"}.icon-apigateway:before{content:"\e951"}.icon-oceanbase-2:before{content:"\e952"}.icon-oceanbase-3:before{content:"\e953"}.icon-oceanbase:before{content:"\e954"}.icon-petadata-2:before{content:"\e955"}.icon-petadata-3:before{content:"\e956"}.icon-petadata:before{content:"\e957"}.icon-ecsm-2:before{content:"\e958"}.icon-ecsm-3:before{content:"\e959"}.icon-ecsm:before{content:"\e95a"}.icon-yundunzhengshu-2:before{content:"\e95b"}.icon-yundunzhengshu-3:before{content:"\e95c"}.icon-yundunzhengshu:before{content:"\e95d"}.icon-cdi-2:before{content:"\e93a"}.icon-cdi-3:before{content:"\e93b"}.icon-cdi:before{content:"\e93c"}.icon-disk-2:before{content:"\e93d"}.icon-disk-3:before{content:"\e93e"}.icon-disk:before{content:"\e93f"}.icon-dsi-2:before{content:"\e940"}.icon-dsi-3:before{content:"\e941"}.icon-dsi:before{content:"\e942"}.icon-hpc-2:before{content:"\e943"}.icon-hpc-3:before{content:"\e944"}.icon-hpc:before{content:"\e945"}.icon-httpdns-2:before{content:"\e946"}.icon-httpdns-3:before{content:"\e947"}.icon-httpdns:before{content:"\e948"}.icon-iot-2:before{content:"\e949"}.icon-iot-3:before{content:"\e94a"}.icon-iot2:before{content:"\e94b"}.icon-vipaegis-2:before{content:"\e94c"}.icon-vipaegis-3:before{content:"\e94d"}.icon-vipaegis:before{content:"\e94e"}.icon-cs-2:before{content:"\e92a"}.icon-cs-3:before{content:"\e92b"}.icon-cs:before{content:"\e92c"}.icon-ewh-2:before{content:"\e930"}.icon-ewh-3:before{content:"\e931"}.icon-ewh:before{content:"\e932"}.icon-expressconnect-2:before{content:"\e933"}.icon-expressconnect-3:before{content:"\e934"}.icon-expressconnect:before{content:"\e935"}.icon-hsm-2:before{content:"\e936"}.icon-hsm-3:before{content:"\e937"}.icon-hsm:before{content:"\e938"}.icon-kuaizhaolian:before{content:"\e939"}.icon-mongodb-2:before{content:"\e927"}.icon-mongodb-3:before{content:"\e928"}.icon-mongodb:before{content:"\e929"}.icon-actiontrail-2:before{content:"\e90f"}.icon-actiontrail-3:before{content:"\e910"}.icon-actiontrail:before{content:"\e911"}.icon-ats-2:before{content:"\e912"}.icon-ats-3:before{content:"\e913"}.icon-ats:before{content:"\e914"}.icon-cli-2:before{content:"\e915"}.icon-cli-3:before{content:"\e916"}.icon-cli:before{content:"\e917"}.icon-directmail-2:before{content:"\e918"}.icon-directmail-3:before{content:"\e919"}.icon-directmail:before{content:"\e91a"}.icon-eclipse-2:before{content:"\e91b"}.icon-eclipse-3:before{content:"\e91c"}.icon-eclipse:before{content:"\e91d"}.icon-havip-2:before{content:"\e91e"}.icon-havip-3:before{content:"\e91f"}.icon-havip:before{content:"\e920"}.icon-ros-2:before{content:"\e921"}.icon-ros-3:before{content:"\e922"}.icon-ros:before{content:"\e923"}.icon-visualstudio-2:before{content:"\e924"}.icon-visualstudio-3:before{content:"\e925"}.icon-visualstudio:before{content:"\e926"}.icon-emr-2:before{content:"\e90c"}.icon-emr-3:before{content:"\e90d"}.icon-emr:before{content:"\e90e"}.icon-antifraud-3:before{content:"\e903"}.icon-antifraud:before{content:"\e904"}.icon-antifraud-2:before{content:"\e905"}.icon-ddosbasic:before{content:"\e906"}.icon-ddosbasic-3:before{content:"\e907"}.icon-ddosbasic-2:before{content:"\e908"}.icon-aegis:before{content:"\e900"}.icon-aegis-3:before{content:"\e901"}.icon-aegis-2:before{content:"\e902"}.icon-amr-2:before{content:"\e71c"}.icon-amr-3:before{content:"\e71d"}.icon-amr:before{content:"\e71e"}.icon-eip-2:before{content:"\e71f"}.icon-eip-3:before{content:"\e720"}.icon-eip:before{content:"\e721"}.icon-expense-i18n:before{content:"\e71b"}.icon-aps-2:before{content:"\e715"}.icon-aps-3:before{content:"\e716"}.icon-aps:before{content:"\e717"}.icon-batchcompute-2:before{content:"\e718"}.icon-batchcompute-3:before{content:"\e719"}.icon-batchcompute:before{content:"\e71a"}.icon-sas-2:before{content:"\e70c"}.icon-sas-3:before{content:"\e70d"}.icon-sas:before{content:"\e70e"}.icon-scan-2:before{content:"\e70f"}.icon-scan-3:before{content:"\e710"}.icon-scan:before{content:"\e711"}.icon-waf-2:before{content:"\e712"}.icon-waf-3:before{content:"\e713"}.icon-waf:before{content:"\e714"}.icon-mns-2:before{content:"\e709"}.icon-mns-3:before{content:"\e70a"}.icon-mns:before{content:"\e70b"}.icon-qrcode:before{content:"\e708"}.icon-unfold:before{content:"\e707"}.icon-fold:before{content:"\e706"}.icon-form:before{content:"\e6fd"}.icon-accelerate:before{content:"\e6fe"}.icon-feedback:before{content:"\e702"}.icon-vdc-2:before{content:"\e703"}.icon-vdc-3:before{content:"\e704"}.icon-vdc:before{content:"\e705"}.icon-new:before{content:"\e6fc"}.icon-collapse-right:before{content:"\e6fb"}.icon-collapse-left:before{content:"\e6fa"}.icon-aec:before{content:"\e6f3"}.icon-aic:before{content:"\e6f4"}.icon-mobile-2:before{content:"\e6f5"}.icon-amc:before{content:"\e6f6"}.icon-arc:before{content:"\e6f7"}.icon-game:before{content:"\e6f8"}.icon-iot:before{content:"\e6f9"}.icon-right:before{content:"\e6f2"}.icon-afc:before{content:"\e6f0"}.icon-specs:before{content:"\e6f1"}.icon-pen-2:before{content:"\e6c8"}.icon-key:before{content:"\e635"}.icon-bsn:before{content:"\e6ea"}.icon-mac-2:before{content:"\e6eb"}.icon-mac-3:before{content:"\e6ec"}.icon-mac:before{content:"\e6ed"}.icon-fenxiao:before{content:"\e6ee"}.icon-account-2:before{content:"\e6ef"}.icon-qiyeyouxiang-2:before{content:"\e6be"}.icon-qiyeyouxiang-3:before{content:"\e6bf"}.icon-qiyeyouxiang:before{content:"\e6c0"}.icon-yuming-2:before{content:"\e6d3"}.icon-yuming-3:before{content:"\e6df"}.icon-yuming:before{content:"\e6e0"}.icon-yumingyuwangzhan-2:before{content:"\e6e1"}.icon-yumingyuwangzhan-3:before{content:"\e6e2"}.icon-yumingyuwangzhan:before{content:"\e6e3"}.icon-yunjiexi-2:before{content:"\e6e4"}.icon-yunjiexi-3:before{content:"\e6e5"}.icon-yunjiexi:before{content:"\e6e6"}.icon-yunxunizhuji-2:before{content:"\e6e7"}.icon-yunxunizhuji-3:before{content:"\e6e8"}.icon-yunxunizhuji:before{content:"\e6e9"}.icon-api-3:before{content:"\e6d2"}.icon-api-2:before{content:"\e6d4"}.icon-api:before{content:"\e6d5"}.icon-dpa-2:before{content:"\e6d6"}.icon-dpa-3:before{content:"\e6d7"}.icon-dpa:before{content:"\e6d8"}.icon-lvwang-2:before{content:"\e6d9"}.icon-lvwang-3:before{content:"\e6da"}.icon-lvwang:before{content:"\e6db"}.icon-mas-2:before{content:"\e6dc"}.icon-mas-3:before{content:"\e6dd"}.icon-mas:before{content:"\e6de"}.icon-dts-2:before{content:"\e6cf"}.icon-dts-3:before{content:"\e6d0"}.icon-dts:before{content:"\e6d1"}.icon-android:before{content:"\e6c9"}.icon-cps-2:before{content:"\e6ca"}.icon-cps-3:before{content:"\e6cb"}.icon-cps:before{content:"\e6cc"}.icon-ios:before{content:"\e6cd"}.icon-vitality:before{content:"\e6ce"}.icon-dfs-2:before{content:"\e6bb"}.icon-dfs-3:before{content:"\e6bc"}.icon-dfs:before{content:"\e6bd"}.icon-edas-2:before{content:"\e6c1"}.icon-edas-3:before{content:"\e6c2"}.icon-edas:before{content:"\e6c3"}.icon-enter:before{content:"\e6c4"}.icon-usableCenter-2:before{content:"\e6c5"}.icon-usableCenter-3:before{content:"\e6c6"}.icon-usableCenter:before{content:"\e6c7"}.icon-ace-2:before{content:"\e600"}.icon-ace:before{content:"\e601"}.icon-add-1:before{content:"\e602"}.icon-add-2:before{content:"\e603"}.icon-add:before{content:"\e604"}.icon-ads-2:before{content:"\e605"}.icon-ads:before{content:"\e606"}.icon-amplify:before{content:"\e607"}.icon-arrow-down:before{content:"\e608"}.icon-arrow-left:before{content:"\e609"}.icon-arrow-right:before{content:"\e60a"}.icon-arrow-up:before{content:"\e60b"}.icon-backup:before{content:"\e60c"}.icon-bell:before{content:"\e60d"}.icon-buy:before{content:"\e60e"}.icon-calendar:before{content:"\e60f"}.icon-cdn-2:before{content:"\e610"}.icon-cdn:before{content:"\e611"}.icon-cdp:before{content:"\e612"}.icon-clock:before{content:"\e613"}.icon-cloudisk:before{content:"\e614"}.icon-cloudisk2:before{content:"\e615"}.icon-db-g:before{content:"\e616"}.icon-db-r:before{content:"\e617"}.icon-db-sign:before{content:"\e618"}.icon-db-t:before{content:"\e619"}.icon-db:before{content:"\e61a"}.icon-ddos-2:before{content:"\e61b"}.icon-ddos:before{content:"\e61c"}.icon-detail-2:before{content:"\e61d"}.icon-detail:before{content:"\e61e"}.icon-disk-image:before{content:"\e61f"}.icon-down:before{content:"\e620"}.icon-dpc-2:before{content:"\e621"}.icon-dpc:before{content:"\e622"}.icon-drds-2:before{content:"\e623"}.icon-drds:before{content:"\e624"}.icon-ecs-2:before{content:"\e625"}.icon-ecs:before{content:"\e626"}.icon-ess-2:before{content:"\e627"}.icon-ess:before{content:"\e628"}.icon-exec-snapshot-policy:before{content:"\e629"}.icon-goback:before{content:"\e62a"}.icon-graphs:before{content:"\e62b"}.icon-help-1:before{content:"\e62c"}.icon-help-2:before{content:"\e62d"}.icon-help:before{content:"\e62e"}.icon-home:before{content:"\e62f"}.icon-info-1:before{content:"\e630"}.icon-info-2:before{content:"\e631"}.icon-info:before{content:"\e632"}.icon-invite:before{content:"\e633"}.icon-jiankong-2:before{content:"\e634"}.icon-lightcloud-2:before{content:"\e636"}.icon-lightcloud:before{content:"\e637"}.icon-log:before{content:"\e638"}.icon-logo:before{content:"\e639"}.icon-menu:before{content:"\e63c"}.icon-mqs-2:before{content:"\e63d"}.icon-mqs:before{content:"\e63e"}.icon-mts:before{content:"\e63f"}.icon-narrow:before{content:"\e640"}.icon-no-1:before{content:"\e641"}.icon-no-2:before{content:"\e642"}.icon-no:before{content:"\e643"}.icon-oas-2:before{content:"\e644"}.icon-oas:before{content:"\e645"}.icon-ocs-2:before{content:"\e646"}.icon-ocs:before{content:"\e647"}.icon-odps-2:before{content:"\e648"}.icon-odps:before{content:"\e649"}.icon-ons-2:before{content:"\e64a"}.icon-ons:before{content:"\e64b"}.icon-opensearch-2:before{content:"\e64c"}.icon-opensearch:before{content:"\e64d"}.icon-oss-2:before{content:"\e64e"}.icon-oss:before{content:"\e64f"}.icon-ots-2:before{content:"\e650"}.icon-ots:before{content:"\e651"}.icon-pen:before{content:"\e652"}.icon-performance:before{content:"\e653"}.icon-pts-2:before{content:"\e654"}.icon-pts:before{content:"\e655"}.icon-ram-2:before{content:"\e656"}.icon-ram:before{content:"\e657"}.icon-rds-2:before{content:"\e658"}.icon-rds:before{content:"\e659"}.icon-regional:before{content:"\e65a"}.icon-remove-1:before{content:"\e65b"}.icon-remove-2:before{content:"\e65c"}.icon-remove:before{content:"\e65d"}.icon-renew-mgt:before{content:"\e65e"}.icon-safe-lock:before{content:"\e65f"}.icon-safetycontrol:before{content:"\e660"}.icon-search:before{content:"\e661"}.icon-setup:before{content:"\e662"}.icon-shift-in:before{content:"\e663"}.icon-slb-2:before{content:"\e664"}.icon-slb:before{content:"\e665"}.icon-sls-2:before{content:"\e666"}.icon-sls:before{content:"\e667"}.icon-snapshot:before{content:"\e668"}.icon-text-free:before{content:"\e669"}.icon-threshold:before{content:"\e66a"}.icon-tree:before{content:"\e66b"}.icon-unlock:before{content:"\e66c"}.icon-up:before{content:"\e66d"}.icon-updown:before{content:"\e66e"}.icon-viewtable:before{content:"\e66f"}.icon-vpc-2:before{content:"\e670"}.icon-vpc:before{content:"\e671"}.icon-warning-1:before{content:"\e672"}.icon-warning-2:before{content:"\e673"}.icon-warning:before{content:"\e674"}.icon-weekly:before{content:"\e675"}.icon-yes-1:before{content:"\e676"}.icon-yes-2:before{content:"\e677"}.icon-yes:before{content:"\e678"}.icon-yundun-2:before{content:"\e679"}.icon-yundun:before{content:"\e67a"}.icon-yunjiankong:before{content:"\e67b"}.icon-annex:before{content:"\e67c"}.icon-renew:before{content:"\e67d"}.icon-renew-2:before{content:"\e67e"}.icon-plus-border:before{content:"\e67f"}.icon-wo-domain:before{content:"\e680"}.icon-wo-email:before{content:"\e681"}.icon-wo-host:before{content:"\e682"}.icon-wo-sitebuild:before{content:"\e683"}.icon-wo-salepre:before{content:"\e684"}.icon-wo-beian:before{content:"\e685"}.icon-wo-account:before{content:"\e686"}.icon-wo-finance:before{content:"\e687"}.icon-square:before{content:"\e688"}.icon-left:before{content:"\e689"}.icon-upload:before{content:"\e68a"}.icon-list-open:before{content:"\e68b"}.icon-pause:before{content:"\e68c"}.icon-list-close:before{content:"\e68d"}.icon-circle:before{content:"\e68e"}.icon-refresh:before{content:"\e68f"}.icon-return:before{content:"\e690"}.icon-undo:before{content:"\e691"}.icon-alipay:before{content:"\e692"}.icon-auto-renew:before{content:"\e693"}.icon-mobile:before{content:"\e694"}.icon-account:before{content:"\e695"}.icon-services:before{content:"\e696"}.icon-expense:before{content:"\e697"}.icon-redisa-2:before{content:"\e698"}.icon-redisa:before{content:"\e699"}.icon-ddos-3:before{content:"\e69a"}.icon-redisa-3:before{content:"\e69b"}.icon-toolsimage-2:before{content:"\e69c"}.icon-cdp-2:before{content:"\e69d"}.icon-mts-2:before{content:"\e69e"}.icon-toolsimage:before{content:"\e69f"}.icon-toolsimage-3:before{content:"\e6a0"}.icon-ons-3:before{content:"\e6a1"}.icon-ram-3:before{content:"\e6a2"}.icon-yundun-3:before{content:"\e6a3"}.icon-pts-3:before{content:"\e6a4"}.icon-mts-3:before{content:"\e6a5"}.icon-mqs-3:before{content:"\e6a6"}.icon-drds-3:before{content:"\e6a7"}.icon-cdp-3:before{content:"\e6a8"}.icon-dpc-3:before{content:"\e6a9"}.icon-ads-3:before{content:"\e6aa"}.icon-jiankong-3:before{content:"\e6ab"}.icon-vpc-3:before{content:"\e6ac"}.icon-slb-3:before{content:"\e6ad"}.icon-rds-3:before{content:"\e6ae"}.icon-ots-3:before{content:"\e6af"}.icon-oss-3:before{content:"\e6b0"}.icon-ess-3:before{content:"\e6b1"}.icon-opensearch-3:before{content:"\e6b2"}.icon-odps-3:before{content:"\e6b3"}.icon-ocs-3:before{content:"\e6b4"}.icon-oas-3:before{content:"\e6b5"}.icon-lightcloud-3:before{content:"\e6b6"}.icon-cdn-3:before{content:"\e6b7"}.icon-ace-3:before{content:"\e6b8"}.icon-sls-3:before{content:"\e6b9"}.icon-ecs-3:before{content:"\e6ba"}.modal-content{border-radius:0px;border:1px solid #999;border:1px solid rgba(0,0,0,0.3);-webkit-box-shadow:0px 5px 10px rgba(0,0,0,0.5);-moz-box-shadow:0px 5px 10px rgba(0,0,0,0.5);box-shadow:0px 5px 10px rgba(0,0,0,0.5)}.modal-footer{margin-top:0px}.modal-title{font-size:14px}.modal-header .close{font-size:28px;margin-top:-8px;font-weight:normal}.modal-backdrop{background-color:#FFF}.console-message-dialog .modal-body .lead{font-size:16px}.console-message-dialog .modal-body p{margin-top:6px}.nav-tabs>li>a,.nav-tabs.nav-justified>li>a{border-radius:0px 0px 0px 0px}.nav-tabs{border-color:#ddd}.nav-tabs>li{margin-left:-1px;border-top:1px solid #ddd;border-left:1px solid #ddd;border-right:1px solid #ddd;z-index:1}.nav-tabs>li>a,.nav-tabs>li>a:focus{color:#666;border-left:0px;border-right:0px;margin-right:0px;padding:10px 16px;background:#FBFAF8;border-bottom:0px}.nav-tabs>li.active{border-top:0px;border-left:1px solid #ddd;border-right:1px solid #ddd;z-index:3}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{border-top:2px solid #00a2ca;border-left:0px;border-right:0px;border-bottom:1px solid #FFF;color:#333}.nav-tabs>li>a:hover{background-color:#FFF;color:#09C}.nav-tabs .open>a,.nav-tabs .open>a:hover,.nav-tabs .open>a:focus{color:#000;background-color:#FAFAFA;border-color:#EEE}.nav-tabs.nav-justified>li:first-child{border-left:1px solid #ddd}.nav-tabs.nav-justified>li{border-top:1px solid #ddd;border-left:0px solid #ddd;border-right:1px solid #ddd;z-index:1}.nav-tabs.nav-justified>li>a{border-left:0px;border-right:0px;margin-right:0px;background-color:#fbfaf8;border-bottom:1px solid #ddd}.nav-tabs.nav-justified>li>a:hover{color:#09C;background-color:#FFF}.nav-tabs.nav-justified>li.active{border-top:0px;z-index:3}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border-top:2px solid #00a2ca;border-left:0px;border-right:0px;border-bottom:1px solid #FFF;color:#333;background-color:#FFF}.nav-pills li a,.nav-pills li a:focus,.nav-pills li button,.nav-pills li button:focus{padding:6px 12px;border-radius:0px;border:1px solid #D9DEE4;background-color:#D9DEE4;color:#666;line-height:20px;height:32px;margin-left:2px}.nav-pills li a:hover,.nav-pills li a:focus:hover,.nav-pills li button:hover,.nav-pills li button:focus:hover{border:1px solid #D9DEE4;background-color:#DCE2E7;color:#444}.nav-pills li.active a,.nav-pills li.active a:hover,.nav-pills li.active a:focus,.nav-pills li.active button,.nav-pills li.active button:hover,.nav-pills li.active button:focus{border:1px solid #546478;background-color:#546478;color:#FFFFFF}.c-texttrimmer-pen{position:absolute;width:18px;height:18px;font-size:12px;padding:2px;text-align:center;margin-left:6px}.c-texttrimmer-box{position:absolute;padding:16px;background:#fff;z-index:1000;border:1px solid #999;border:1px solid rgba(0,0,0,0.3);-webkit-border-radius:0px;-moz-border-radius:0px;-ms-border-radius:0px;-o-border-radius:0px;border-radius:0px;-webkit-box-shadow:1px 1px 8px rgba(0,0,0,0.5);-moz-box-shadow:1px 1px 8px rgba(0,0,0,0.5);box-shadow:1px 1px 8px rgba(0,0,0,0.5)}.c-texttrimmer-box:focus{outline:none}.c-texttrimmer-box p{margin:0 0 10px}.c-texttrimmer-box p.c-texttrimmer-tip{color:red}.c-texttrimmer-box .c-texttrimmer-btnbox a{margin-right:8px}.modal,.modal-open{overflow:auto;overflow-y:auto}.console-helper{position:absolute;height:100%;width:400px;right:0px;top:32px;z-index:1000;border:1px solid #eee;background:#fff;border-left:1px solid #dddddd;box-shadow:0px 0px 4px rgba(0,0,0,0.2);position:fixed}.console-helper-animation{-webkit-transition:all 0.3s cubic-bezier(0.25, 0.5, 0.5, 0.9);transition:all 0.3s cubic-bezier(0.25, 0.5, 0.5, 0.9);-webkit-transform:translateX(0);transform:translateX(0)}.console-helper-folded{right:-400px}.console-helper-folded .console-helper-head .console-helper-button{margin-left:-44px}.console-helper-head{height:56px;background:#f5f5f5;border-bottom:1px solid #dddddd}.console-helper-head .console-helper-button{float:left;background:url(images/helper-icon.png) center center no-repeat;height:32px;width:32px;margin:12px;cursor:pointer;opacity:0.6}.console-helper-head .console-helper-button:hover{opacity:1}.console-helper-head .console-helper-title{float:left;font-size:14px;line-height:32px;height:32px;margin:12px 0;color:#333}.console-helper-body .console-helper-nav{border-bottom:1px solid #dddddd;margin:0 20px;list-style:none;overflow:hidden;zoom:1;padding:0}.console-helper-body .console-helper-nav li{float:left;padding:12px}.console-helper-body .console-helper-nav li a{color:#666}.console-helper-body .console-helper-nav li a:hover{color:#000}.console-helper-body .console-helper-nav li.active{border-bottom:2px solid #999}.console-helper-body .console-helper-panel-list .console-helper-panel{margin:20px}.console-helper-body .console-helper-panel-list .console-helper-panel .console-helper-xiaoyun .console-helper-xiaoyun-search{height:32px}.console-helper-body .console-helper-panel-list .console-helper-panel .console-helper-xiaoyun .console-helper-xiaoyun-recommend ul{list-style:none;margin:0;padding:0}.console-helper-foot{background:#f5f5f5;position:absolute;width:100%;bottom:0;left:0;border-top:1px solid #eee}.console-helper-foot .console-helper-service{overflow:hidden;zoom:1;height:32px;margin:12px;list-style:none}.console-helper-foot .console-helper-service li{width:48%;float:left}.console-helper-foot .console-helper-service li p{margin:0;color:#666}.console-helper-foot .console-helper-service li p a{color:#666}.console-helper-foot .console-helper-service li p a:hover{text-decoration:underline}.growl{z-index:9999999;top:50px;width:260px}.alert-success{color:#090;background-color:#F2FFEA;border-color:#C7DDB9}.alert-success .alert-link{color:#063;font-weight:normal}.alert-info{color:#555;background-color:#F9F9F9;border-color:#DDD}.alert-info .alert-link{color:#06C;font-weight:normal}.alert-warning{color:#f68300;background-color:#FCF8E2;border-color:#FBECCB}.alert-warning .alert-link{color:#c50;font-weight:normal}.alert-danger{color:#ee2117;background-color:#FFF6F2;border-color:#F1ACAC}.alert-danger .alert-link{color:#b00;font-weight:normal}.alert{padding:6px 12px;line-height:18px;margin-bottom:6px;border-radius:0px}.alert .close{margin-top:-5px}.alert ul{padding-left:16px}.product-icons-32,.product-icons-48,.product-icons-64{background-repeat:no-repeat;display:-moz-inline-stack;display:inline-block;vertical-align:middle;*vertical-align:auto;zoom:1;*display:inline;background-image:url(aliyun-logo/product.icons.png);background-image:-webkit-image-set(url(aliyun-logo/product.icons.png) 1x, url(aliyun-logo/product.icons@2x.png) 2x);background-image:-moz-image-set(url(aliyun-logo/product.icons.png) 1x, url(aliyun-logo/product.icons@2x.png) 2x);background-image:-ms-image-set(url(aliyun-logo/product.icons.png) 1x, url(aliyun-logo/product.icons@2x.png) 2x);background-image:-os-image-set(url(aliyun-logo/product.icons.png) 1x, url(aliyun-logo/product.icons@2x.png) 2x)}.product-icons-32{width:32px;height:32px}.product-icons-48{width:48px;height:48px}.product-icons-64{width:64px;height:64px}.product-icons-32.product-icons-ace-grey{background-position:-448px -1088px !important}.product-icons-32.product-icons-ace{background-position:-800px -1024px !important}.product-icons-48.product-icons-ace-grey{background-position:-192px -832px !important}.product-icons-48.product-icons-ace{background-position:-720px -880px !important}.product-icons-64.product-icons-ace-grey{background-position:-576px -128px !important}.product-icons-64.product-icons-ace{background-position:0px -64px !important}.product-icons-32.product-icons-actiontrail-grey{background-position:-416px -1088px !important}.product-icons-32.product-icons-actiontrail{background-position:-384px -1088px !important}.product-icons-48.product-icons-actiontrail-grey{background-position:-976px -288px !important}.product-icons-48.product-icons-actiontrail{background-position:-432px -976px !important}.product-icons-64.product-icons-actiontrail-grey{background-position:-128px 0px !important}.product-icons-64.product-icons-actiontrail{background-position:-128px -64px !important}.product-icons-32.product-icons-ads-grey{background-position:-352px -1088px !important}.product-icons-32.product-icons-ads{background-position:-256px -1088px !important}.product-icons-48.product-icons-ads-grey{background-position:-768px -880px !important}.product-icons-48.product-icons-ads{background-position:-928px -384px !important}.product-icons-64.product-icons-ads-grey{background-position:-64px -128px !important}.product-icons-64.product-icons-ads{background-position:-128px -128px !important}.product-icons-32.product-icons-aegis-grey{background-position:-224px -1088px !important}.product-icons-32.product-icons-aegis{background-position:-192px -1088px !important}.product-icons-48.product-icons-aegis-grey{background-position:-688px -768px !important}.product-icons-48.product-icons-aegis{background-position:-832px -96px !important}.product-icons-64.product-icons-aegis-grey{background-position:-192px -64px !important}.product-icons-64.product-icons-aegis{background-position:-192px -128px !important}.product-icons-32.product-icons-antifraud-grey{background-position:-160px -1088px !important}.product-icons-32.product-icons-antifraud{background-position:-64px -1088px !important}.product-icons-48.product-icons-antifraud-grey{background-position:-880px -480px !important}.product-icons-48.product-icons-antifraud{background-position:-880px -720px !important}.product-icons-64.product-icons-antifraud-grey{background-position:-64px -192px !important}.product-icons-64.product-icons-antifraud{background-position:-128px -192px !important}.product-icons-32.product-icons-api-grey{background-position:-32px -1088px !important}.product-icons-32.product-icons-api{background-position:0px -1088px !important}.product-icons-48.product-icons-api-grey{background-position:-96px -928px !important}.product-icons-48.product-icons-api{background-position:-192px -928px !important}.product-icons-64.product-icons-api-grey{background-position:-256px 0px !important}.product-icons-64.product-icons-api{background-position:-256px -64px !important}.product-icons-32.product-icons-apigateway-grey{background-position:-1104px -1056px !important}.product-icons-32.product-icons-apigateway{background-position:-1104px -960px !important}.product-icons-48.product-icons-apigateway-grey{background-position:-480px -976px !important}.product-icons-48.product-icons-apigateway{background-position:-576px -976px !important}.product-icons-64.product-icons-apigateway-grey{background-position:-256px -192px !important}.product-icons-64.product-icons-apigateway{background-position:0px -256px !important}.product-icons-32.product-icons-aps-grey{background-position:-1104px -928px !important}.product-icons-32.product-icons-aps{background-position:-1104px -896px !important}.product-icons-48.product-icons-aps-grey{background-position:-832px -432px !important}.product-icons-48.product-icons-aps{background-position:-832px -528px !important}.product-icons-64.product-icons-aps-grey{background-position:-128px -256px !important}.product-icons-64.product-icons-aps{background-position:-192px -256px !important}.product-icons-32.product-icons-ats-grey{background-position:-1104px -864px !important}.product-icons-32.product-icons-ats{background-position:-1104px -768px !important}.product-icons-48.product-icons-ats-grey{background-position:-768px -832px !important}.product-icons-48.product-icons-ats{background-position:-880px 0px !important}.product-icons-64.product-icons-ats-grey{background-position:-320px 0px !important}.product-icons-64.product-icons-ats{background-position:-320px -64px !important}.product-icons-32.product-icons-batchcompute-grey{background-position:-1104px -736px !important}.product-icons-32.product-icons-batchcompute{background-position:-1104px -704px !important}.product-icons-48.product-icons-batchcompute-grey{background-position:-192px -880px !important}.product-icons-48.product-icons-batchcompute{background-position:-288px -880px !important}.product-icons-64.product-icons-batchcompute-grey{background-position:-320px -192px !important}.product-icons-64.product-icons-batchcompute{background-position:-320px -256px !important}.product-icons-32.product-icons-cas-grey{background-position:-1104px -672px !important}.product-icons-32.product-icons-cas{background-position:-1104px -576px !important}.product-icons-48.product-icons-cas-grey{background-position:-928px -432px !important}.product-icons-48.product-icons-cas{background-position:-928px -480px !important}.product-icons-64.product-icons-cas-grey{background-position:-64px -320px !important}.product-icons-64.product-icons-cas{background-position:-128px -320px !important}.product-icons-32.product-icons-cdi-grey{background-position:-1104px -544px !important}.product-icons-32.product-icons-cdi{background-position:-1104px -512px !important}.product-icons-48.product-icons-cdi-grey{background-position:-672px -928px !important}.product-icons-48.product-icons-cdi{background-position:-720px -928px !important}.product-icons-64.product-icons-cdi-grey{background-position:-256px -320px !important}.product-icons-64.product-icons-cdi{background-position:-320px -320px !important}.product-icons-32.product-icons-cdn-grey{background-position:-1104px -480px !important}.product-icons-32.product-icons-cdn{background-position:-1104px -384px !important}.product-icons-48.product-icons-cdn-grey{background-position:-976px -864px !important}.product-icons-48.product-icons-cdn{background-position:-976px -912px !important}.product-icons-64.product-icons-cdn-grey{background-position:-384px -64px !important}.product-icons-64.product-icons-cdn{background-position:-384px -128px !important}.product-icons-32.product-icons-cdp-grey{background-position:-1104px -352px !important}.product-icons-32.product-icons-cdp{background-position:-1104px -320px !important}.product-icons-48.product-icons-cdp-grey{background-position:-1024px -48px !important}.product-icons-48.product-icons-cdp{background-position:-1024px -96px !important}.product-icons-64.product-icons-cdp-grey{background-position:-384px -256px !important}.product-icons-64.product-icons-cdp{background-position:-384px -320px !important}.product-icons-32.product-icons-cli-grey{background-position:-1104px -288px !important}.product-icons-32.product-icons-cli{background-position:-1104px -192px !important}.product-icons-48.product-icons-cli-grey{background-position:-832px -144px !important}.product-icons-48.product-icons-cli{background-position:-832px -192px !important}.product-icons-64.product-icons-cli-grey{background-position:-64px -384px !important}.product-icons-64.product-icons-cli{background-position:-128px -384px !important}.product-icons-32.product-icons-containerservice-grey{background-position:-1104px -160px !important}.product-icons-32.product-icons-containerservice{background-position:-1104px -128px !important}.product-icons-48.product-icons-containerservice-grey{background-position:-832px -720px !important}.product-icons-48.product-icons-containerservice{background-position:-832px -768px !important}.product-icons-64.product-icons-containerservice-grey{background-position:-256px -384px !important}.product-icons-64.product-icons-containerservice{background-position:-320px -384px !important}.product-icons-32.product-icons-cps-grey{background-position:-1104px -96px !important}.product-icons-32.product-icons-cps{background-position:-1104px 0px !important}.product-icons-48.product-icons-cps-grey{background-position:-480px -832px !important}.product-icons-48.product-icons-cps{background-position:-528px -832px !important}.product-icons-64.product-icons-cps-grey{background-position:-448px 0px !important}.product-icons-64.product-icons-cps{background-position:-448px -64px !important}.product-icons-32.product-icons-csb-grey{background-position:-1056px -1056px !important}.product-icons-32.product-icons-csb{background-position:-1024px -1056px !important}.product-icons-48.product-icons-csb-grey{background-position:-880px -192px !important}.product-icons-48.product-icons-csb{background-position:-880px -240px !important}.product-icons-64.product-icons-csb-grey{background-position:-448px -192px !important}.product-icons-64.product-icons-csb{background-position:-448px -256px !important}.product-icons-32.product-icons-ddos-grey{background-position:-992px -1056px !important}.product-icons-32.product-icons-ddos{background-position:-896px -1056px !important}.product-icons-48.product-icons-ddos-grey{background-position:-880px -768px !important}.product-icons-48.product-icons-ddos{background-position:-880px -816px !important}.product-icons-64.product-icons-ddos-grey{background-position:-448px -384px !important}.product-icons-64.product-icons-ddos{background-position:0px -448px !important}.product-icons-32.product-icons-ddosbasic-grey{background-position:-864px -1056px !important}.product-icons-32.product-icons-ddosbasic{background-position:-832px -1056px !important}.product-icons-48.product-icons-ddosbasic-grey{background-position:-480px -880px !important}.product-icons-48.product-icons-ddosbasic{background-position:-528px -880px !important}.product-icons-64.product-icons-ddosbasic-grey{background-position:-128px -448px !important}.product-icons-64.product-icons-ddosbasic{background-position:-192px -448px !important}.product-icons-32.product-icons-dfs-grey{background-position:-800px -1056px !important}.product-icons-32.product-icons-dfs{background-position:-704px -1056px !important}.product-icons-48.product-icons-dfs-grey{background-position:-928px -144px !important}.product-icons-48.product-icons-dfs{background-position:-928px -192px !important}.product-icons-64.product-icons-dfs-grey{background-position:-320px -448px !important}.product-icons-64.product-icons-dfs{background-position:-384px -448px !important}.product-icons-32.product-icons-directmail-grey{background-position:-672px -1056px !important}.product-icons-32.product-icons-directmail{background-position:-640px -1056px !important}.product-icons-48.product-icons-directmail-grey{background-position:-928px -672px !important}.product-icons-48.product-icons-directmail{background-position:-928px -720px !important}.product-icons-64.product-icons-directmail-grey{background-position:-512px 0px !important}.product-icons-64.product-icons-directmail{background-position:-512px -64px !important}.product-icons-32.product-icons-disk-grey{background-position:-608px -1056px !important}.product-icons-32.product-icons-disk{background-position:-512px -1056px !important}.product-icons-48.product-icons-disk-grey{background-position:-336px -928px !important}.product-icons-48.product-icons-disk{background-position:-384px -928px !important}.product-icons-64.product-icons-disk-grey{background-position:-512px -192px !important}.product-icons-64.product-icons-disk{background-position:-512px -256px !important}.product-icons-32.product-icons-dms-grey{background-position:-480px -1056px !important}.product-icons-32.product-icons-dms{background-position:-448px -1056px !important}.product-icons-48.product-icons-dms-grey{background-position:-912px -928px !important}.product-icons-48.product-icons-dms{background-position:-976px 0px !important}.product-icons-64.product-icons-dms-grey{background-position:-512px -384px !important}.product-icons-64.product-icons-dms{background-position:-512px -448px !important}.product-icons-32.product-icons-dpc-grey{background-position:-416px -1056px !important}.product-icons-32.product-icons-dpc{background-position:-320px -1056px !important}.product-icons-48.product-icons-dpc-grey{background-position:-976px -528px !important}.product-icons-48.product-icons-dpc{background-position:-976px -576px !important}.product-icons-64.product-icons-dpc-grey{background-position:-64px -512px !important}.product-icons-64.product-icons-dpc{background-position:-128px -512px !important}.product-icons-32.product-icons-drds-grey{background-position:-288px -1056px !important}.product-icons-32.product-icons-drds{background-position:-256px -1056px !important}.product-icons-48.product-icons-drds-grey{background-position:-144px -976px !important}.product-icons-48.product-icons-drds{background-position:-192px -976px !important}.product-icons-64.product-icons-drds-grey{background-position:-256px -512px !important}.product-icons-64.product-icons-drds{background-position:-320px -512px !important}.product-icons-32.product-icons-dsi-grey{background-position:-224px -1056px !important}.product-icons-32.product-icons-dsi{background-position:-128px -1056px !important}.product-icons-48.product-icons-dsi-grey{background-position:-720px -976px !important}.product-icons-48.product-icons-dsi{background-position:-768px -976px !important}.product-icons-64.product-icons-dsi-grey{background-position:-448px -512px !important}.product-icons-64.product-icons-dsi{background-position:-512px -512px !important}.product-icons-32.product-icons-dts-grey{background-position:-96px -1056px !important}.product-icons-32.product-icons-dts{background-position:-64px -1056px !important}.product-icons-48.product-icons-dts-grey{background-position:-1024px -288px !important}.product-icons-48.product-icons-dts{background-position:-1024px -336px !important}.product-icons-64.product-icons-dts-grey{background-position:-576px -64px !important}.product-icons-64.product-icons-dts{background-position:0px 0px !important}.product-icons-32.product-icons-eclipse-grey{background-position:-32px -1056px !important}.product-icons-32.product-icons-eclipse{background-position:-1072px -992px !important}.product-icons-48.product-icons-eclipse-grey{background-position:-832px 0px !important}.product-icons-48.product-icons-eclipse{background-position:-832px -48px !important}.product-icons-64.product-icons-eclipse-grey{background-position:-576px -256px !important}.product-icons-64.product-icons-eclipse{background-position:-576px -320px !important}.product-icons-32.product-icons-ecs-grey{background-position:-1072px -960px !important}.product-icons-32.product-icons-ecs{background-position:-1072px -928px !important}.product-icons-48.product-icons-ecs-grey{background-position:-832px -288px !important}.product-icons-48.product-icons-ecs{background-position:-832px -336px !important}.product-icons-64.product-icons-ecs-grey{background-position:-576px -448px !important}.product-icons-64.product-icons-ecs{background-position:-576px -512px !important}.product-icons-32.product-icons-edas-grey{background-position:-1072px -896px !important}.product-icons-32.product-icons-edas{background-position:-1072px -800px !important}.product-icons-48.product-icons-edas-grey{background-position:-832px -576px !important}.product-icons-48.product-icons-edas{background-position:-832px -624px !important}.product-icons-64.product-icons-edas-grey{background-position:-64px -576px !important}.product-icons-64.product-icons-edas{background-position:-128px -576px !important}.product-icons-32.product-icons-elp-grey{background-position:-1072px -768px !important}.product-icons-32.product-icons-elp{background-position:-1072px -736px !important}.product-icons-48.product-icons-elp-grey{background-position:-48px -832px !important}.product-icons-48.product-icons-elp{background-position:-96px -832px !important}.product-icons-64.product-icons-elp-grey{background-position:-256px -576px !important}.product-icons-64.product-icons-elp{background-position:-320px -576px !important}.product-icons-32.product-icons-emapreduce-grey{background-position:-1072px -704px !important}.product-icons-32.product-icons-emapreduce{background-position:-1072px -608px !important}.product-icons-48.product-icons-emapreduce-grey{background-position:-336px -832px !important}.product-icons-48.product-icons-emapreduce{background-position:-384px -832px !important}.product-icons-64.product-icons-emapreduce-grey{background-position:-448px -576px !important}.product-icons-64.product-icons-emapreduce{background-position:-512px -576px !important}.product-icons-32.product-icons-esn-grey{background-position:-1072px -576px !important}.product-icons-32.product-icons-esn{background-position:-1072px -544px !important}.product-icons-48.product-icons-esn-grey{background-position:-624px -832px !important}.product-icons-48.product-icons-esn{background-position:-672px -832px !important}.product-icons-64.product-icons-esn-grey{background-position:-640px 0px !important}.product-icons-64.product-icons-esn{background-position:-640px -64px !important}.product-icons-32.product-icons-ess-grey{background-position:-1072px -512px !important}.product-icons-32.product-icons-ess{background-position:-1072px -416px !important}.product-icons-48.product-icons-ess-grey{background-position:-880px -48px !important}.product-icons-48.product-icons-ess{background-position:-880px -96px !important}.product-icons-64.product-icons-ess-grey{background-position:-640px -192px !important}.product-icons-64.product-icons-ess{background-position:-640px -256px !important}.product-icons-32.product-icons-expressconnect-grey{background-position:-1072px -384px !important}.product-icons-32.product-icons-expressconnect{background-position:-1072px -352px !important}.product-icons-48.product-icons-expressconnect-grey{background-position:-880px -336px !important}.product-icons-48.product-icons-expressconnect{background-position:-880px -384px !important}.product-icons-64.product-icons-expressconnect-grey{background-position:-640px -384px !important}.product-icons-64.product-icons-expressconnect{background-position:-640px -448px !important}.product-icons-32.product-icons-havip-grey{background-position:-1072px -320px !important}.product-icons-32.product-icons-havip{background-position:-1072px -224px !important}.product-icons-48.product-icons-havip-grey{background-position:-880px -624px !important}.product-icons-48.product-icons-havip{background-position:-880px -672px !important}.product-icons-64.product-icons-havip-grey{background-position:-640px -576px !important}.product-icons-64.product-icons-havip{background-position:0px -640px !important}.product-icons-32.product-icons-hpc-grey{background-position:-1072px -192px !important}.product-icons-32.product-icons-hpc{background-position:-1072px -160px !important}.product-icons-48.product-icons-hpc-grey{background-position:-48px -880px !important}.product-icons-48.product-icons-hpc{background-position:-96px -880px !important}.product-icons-64.product-icons-hpc-grey{background-position:-128px -640px !important}.product-icons-64.product-icons-hpc{background-position:-192px -640px !important}.product-icons-32.product-icons-hsm-grey{background-position:-1072px -128px !important}.product-icons-32.product-icons-hsm{background-position:-1072px -32px !important}.product-icons-48.product-icons-hsm-grey{background-position:-336px -880px !important}.product-icons-48.product-icons-hsm{background-position:-384px -880px !important}.product-icons-64.product-icons-hsm-grey{background-position:-320px -640px !important}.product-icons-64.product-icons-hsm{background-position:-384px -640px !important}.product-icons-32.product-icons-iot-grey{background-position:-1072px 0px !important}.product-icons-32.product-icons-iot{background-position:-1024px -1024px !important}.product-icons-48.product-icons-iot-grey{background-position:-624px -880px !important}.product-icons-48.product-icons-iot{background-position:-672px -880px !important}.product-icons-64.product-icons-iot-grey{background-position:-512px -640px !important}.product-icons-64.product-icons-iot{background-position:-576px -640px !important}.product-icons-32.product-icons-jiankong-grey{background-position:-992px -1024px !important}.product-icons-32.product-icons-jiankong{background-position:-896px -1024px !important}.product-icons-48.product-icons-jiankong-grey{background-position:-928px 0px !important}.product-icons-48.product-icons-jiankong{background-position:-928px -48px !important}.product-icons-64.product-icons-jiankong-grey{background-position:-704px 0px !important}.product-icons-64.product-icons-jiankong{background-position:-704px -64px !important}.product-icons-32.product-icons-keyongxingzhongxin-grey{background-position:-864px -1024px !important}.product-icons-32.product-icons-keyongxingzhongxin{background-position:-832px -1024px !important}.product-icons-48.product-icons-keyongxingzhongxin-grey{background-position:-928px -288px !important}.product-icons-48.product-icons-keyongxingzhongxin{background-position:-144px -832px !important}.product-icons-64.product-icons-keyongxingzhongxin-grey{background-position:-704px -192px !important}.product-icons-64.product-icons-keyongxingzhongxin{background-position:-704px -256px !important}.product-icons-32.product-icons-kms-grey{background-position:-704px -1024px !important}.product-icons-32.product-icons-kms{background-position:-672px -1024px !important}.product-icons-48.product-icons-kms-grey{background-position:-928px -576px !important}.product-icons-48.product-icons-kms{background-position:-928px -624px !important}.product-icons-64.product-icons-kms-grey{background-position:-704px -448px !important}.product-icons-64.product-icons-kms{background-position:-704px -512px !important}.product-icons-32.product-icons-kvstore-grey{background-position:-640px -1024px !important}.product-icons-32.product-icons-kvstore{background-position:-608px -1024px !important}.product-icons-48.product-icons-kvstore-grey{background-position:-928px -864px !important}.product-icons-48.product-icons-kvstore{background-position:0px -928px !important}.product-icons-64.product-icons-kvstore-grey{background-position:-704px -576px !important}.product-icons-64.product-icons-kvstore{background-position:-704px -640px !important}.product-icons-32.product-icons-livevideo-grey{background-position:-512px -1024px !important}.product-icons-32.product-icons-livevideo{background-position:-480px -1024px !important}.product-icons-48.product-icons-livevideo-grey{background-position:-240px -928px !important}.product-icons-48.product-icons-livevideo{background-position:-288px -928px !important}.product-icons-64.product-icons-livevideo-grey{background-position:-128px -704px !important}.product-icons-64.product-icons-livevideo{background-position:-192px -704px !important}.product-icons-32.product-icons-lvwang-grey{background-position:-448px -1024px !important}.product-icons-32.product-icons-lvwang{background-position:-416px -1024px !important}.product-icons-48.product-icons-lvwang-grey{background-position:-528px -928px !important}.product-icons-48.product-icons-lvwang{background-position:-576px -928px !important}.product-icons-64.product-icons-lvwang-grey{background-position:-256px -704px !important}.product-icons-64.product-icons-lvwang{background-position:-320px -704px !important}.product-icons-32.product-icons-mac-grey{background-position:-320px -1024px !important}.product-icons-32.product-icons-mac{background-position:-288px -1024px !important}.product-icons-48.product-icons-mac-grey{background-position:-816px -928px !important}.product-icons-48.product-icons-mac{background-position:-864px -928px !important}.product-icons-64.product-icons-mac-grey{background-position:-512px -704px !important}.product-icons-64.product-icons-mac{background-position:-576px -704px !important}.product-icons-32.product-icons-man-grey{background-position:-256px -1024px !important}.product-icons-32.product-icons-man{background-position:-224px -1024px !important}.product-icons-48.product-icons-man-grey{background-position:-976px -144px !important}.product-icons-48.product-icons-man{background-position:-976px -192px !important}.product-icons-64.product-icons-man-grey{background-position:-640px -704px !important}.product-icons-64.product-icons-man{background-position:-704px -704px !important}.product-icons-32.product-icons-mns-grey{background-position:-128px -1024px !important}.product-icons-32.product-icons-mns{background-position:-96px -1024px !important}.product-icons-48.product-icons-mns-grey{background-position:-976px -432px !important}.product-icons-48.product-icons-mns{background-position:-976px -480px !important}.product-icons-64.product-icons-mns-grey{background-position:-768px -128px !important}.product-icons-64.product-icons-mns{background-position:-768px -192px !important}.product-icons-32.product-icons-mongodb-grey{background-position:-64px -1024px !important}.product-icons-32.product-icons-mongodb{background-position:-32px -1024px !important}.product-icons-48.product-icons-mongodb-grey{background-position:-976px -720px !important}.product-icons-48.product-icons-mongodb{background-position:-976px -768px !important}.product-icons-64.product-icons-mongodb-grey{background-position:-768px -256px !important}.product-icons-64.product-icons-mongodb{background-position:-768px -320px !important}.product-icons-32.product-icons-mqs-grey{background-position:-1024px -960px !important}.product-icons-32.product-icons-mqs{background-position:-1024px -928px !important}.product-icons-48.product-icons-mqs-grey{background-position:-48px -976px !important}.product-icons-48.product-icons-mqs{background-position:-96px -976px !important}.product-icons-64.product-icons-mqs-grey{background-position:-768px -512px !important}.product-icons-64.product-icons-mqs{background-position:-768px -576px !important}.product-icons-32.product-icons-mss-grey{background-position:-1024px -896px !important}.product-icons-32.product-icons-mss{background-position:-1024px -864px !important}.product-icons-48.product-icons-mss-grey{background-position:-336px -976px !important}.product-icons-48.product-icons-mss{background-position:-384px -976px !important}.product-icons-64.product-icons-mss-grey{background-position:-768px -640px !important}.product-icons-64.product-icons-mss{background-position:-768px -704px !important}.product-icons-32.product-icons-mts-grey{background-position:-1024px -768px !important}.product-icons-32.product-icons-mts{background-position:-1024px -736px !important}.product-icons-48.product-icons-mts-grey{background-position:-624px -976px !important}.product-icons-48.product-icons-mts{background-position:-672px -976px !important}.product-icons-64.product-icons-mts-grey{background-position:-128px -768px !important}.product-icons-64.product-icons-mts{background-position:-192px -768px !important}.product-icons-32.product-icons-nas-grey{background-position:-1024px -704px !important}.product-icons-32.product-icons-nas{background-position:-1024px -672px !important}.product-icons-48.product-icons-nas-grey{background-position:-912px -976px !important}.product-icons-48.product-icons-nas{background-position:-960px -976px !important}.product-icons-64.product-icons-nas-grey{background-position:-256px -768px !important}.product-icons-64.product-icons-nas{background-position:-320px -768px !important}.product-icons-32.product-icons-oas-grey{background-position:-1024px -576px !important}.product-icons-32.product-icons-oas{background-position:-1024px -544px !important}.product-icons-48.product-icons-oas-grey{background-position:-1024px -192px !important}.product-icons-48.product-icons-oas{background-position:-1024px -240px !important}.product-icons-64.product-icons-oas-grey{background-position:-512px -768px !important}.product-icons-64.product-icons-oas{background-position:-576px -768px !important}.product-icons-32.product-icons-oceanbase-grey{background-position:0px -1056px !important}.product-icons-32.product-icons-oceanbase{background-position:-1024px -512px !important}.product-icons-48.product-icons-oceanbase-grey{background-position:-1024px -432px !important}.product-icons-48.product-icons-oceanbase{background-position:-1024px -384px !important}.product-icons-64.product-icons-oceanbase-grey{background-position:-448px -768px !important}.product-icons-64.product-icons-oceanbase{background-position:-384px -768px !important}.product-icons-32.product-icons-ocs-grey{background-position:-1024px -608px !important}.product-icons-32.product-icons-ocs{background-position:-1024px -640px !important}.product-icons-48.product-icons-ocs-grey{background-position:-864px -976px !important}.product-icons-48.product-icons-ocs{background-position:-816px -976px !important}.product-icons-64.product-icons-ocs-grey{background-position:-64px -768px !important}.product-icons-64.product-icons-ocs{background-position:0px -768px !important}.product-icons-32.product-icons-odps-grey{background-position:-1024px -800px !important}.product-icons-32.product-icons-odps{background-position:-1024px -832px !important}.product-icons-48.product-icons-odps-grey{background-position:-288px -976px !important}.product-icons-48.product-icons-odps{background-position:-240px -976px !important}.product-icons-64.product-icons-odps-grey{background-position:-768px -448px !important}.product-icons-64.product-icons-odps{background-position:-768px -384px !important}.product-icons-32.product-icons-ons-grey{background-position:-1024px -992px !important}.product-icons-32.product-icons-ons{background-position:0px -1024px !important}.product-icons-48.product-icons-ons-grey{background-position:-976px -672px !important}.product-icons-48.product-icons-ons{background-position:-976px -624px !important}.product-icons-64.product-icons-ons-grey{background-position:-768px -64px !important}.product-icons-64.product-icons-ons{background-position:-768px 0px !important}.product-icons-32.product-icons-opensearch-grey{background-position:-160px -1024px !important}.product-icons-32.product-icons-opensearch{background-position:-192px -1024px !important}.product-icons-48.product-icons-opensearch-grey{background-position:-976px -96px !important}.product-icons-48.product-icons-opensearch{background-position:-976px -48px !important}.product-icons-64.product-icons-opensearch-grey{background-position:-448px -704px !important}.product-icons-64.product-icons-opensearch{background-position:-384px -704px !important}.product-icons-32.product-icons-oss-grey{background-position:-352px -1024px !important}.product-icons-32.product-icons-oss{background-position:-384px -1024px !important}.product-icons-48.product-icons-oss-grey{background-position:-480px -928px !important}.product-icons-48.product-icons-oss{background-position:-432px -928px !important}.product-icons-64.product-icons-oss-grey{background-position:-64px -704px !important}.product-icons-64.product-icons-oss{background-position:0px -704px !important}.product-icons-32.product-icons-ots-grey{background-position:-544px -1024px !important}.product-icons-32.product-icons-ots{background-position:-576px -1024px !important}.product-icons-48.product-icons-ots-grey{background-position:-928px -816px !important}.product-icons-48.product-icons-ots{background-position:-928px -768px !important}.product-icons-64.product-icons-ots-grey{background-position:-704px -384px !important}.product-icons-64.product-icons-ots{background-position:-704px -320px !important}.product-icons-32.product-icons-petadata-grey{background-position:-736px -1024px !important}.product-icons-32.product-icons-petadata{background-position:-768px -1024px !important}.product-icons-48.product-icons-petadata-grey{background-position:-928px -336px !important}.product-icons-48.product-icons-petadata{background-position:-928px -240px !important}.product-icons-64.product-icons-petadata-grey{background-position:-704px -128px !important}.product-icons-64.product-icons-petadata{background-position:-640px -640px !important}.product-icons-32.product-icons-pts-grey{background-position:-928px -1024px !important}.product-icons-32.product-icons-pts{background-position:-960px -1024px !important}.product-icons-48.product-icons-pts-grey{background-position:-816px -880px !important}.product-icons-48.product-icons-pts{background-position:-576px -880px !important}.product-icons-64.product-icons-pts-grey{background-position:-448px -640px !important}.product-icons-64.product-icons-pts{background-position:-256px -640px !important}.product-icons-32.product-icons-ram-grey{background-position:-1072px -64px !important}.product-icons-32.product-icons-ram{background-position:-1072px -96px !important}.product-icons-48.product-icons-ram-grey{background-position:-240px -880px !important}.product-icons-48.product-icons-ram{background-position:0px -880px !important}.product-icons-64.product-icons-ram-grey{background-position:-64px -640px !important}.product-icons-64.product-icons-ram{background-position:-640px -512px !important}.product-icons-32.product-icons-rds-grey{background-position:-1072px -256px !important}.product-icons-32.product-icons-rds{background-position:-1072px -288px !important}.product-icons-48.product-icons-rds-grey{background-position:-880px -528px !important}.product-icons-48.product-icons-rds{background-position:-880px -288px !important}.product-icons-64.product-icons-rds-grey{background-position:-640px -320px !important}.product-icons-64.product-icons-rds{background-position:-640px -128px !important}.product-icons-32.product-icons-ros-grey{background-position:-1072px -448px !important}.product-icons-32.product-icons-ros{background-position:-1072px -480px !important}.product-icons-48.product-icons-ros-grey{background-position:-816px -832px !important}.product-icons-48.product-icons-ros{background-position:-576px -832px !important}.product-icons-64.product-icons-ros-grey{background-position:-576px -576px !important}.product-icons-64.product-icons-ros{background-position:-384px -576px !important}.product-icons-32.product-icons-sas-grey{background-position:-1072px -640px !important}.product-icons-32.product-icons-sas{background-position:-1072px -672px !important}.product-icons-48.product-icons-sas-grey{background-position:-240px -832px !important}.product-icons-48.product-icons-sas{background-position:0px -832px !important}.product-icons-64.product-icons-sas-grey{background-position:-192px -576px !important}.product-icons-64.product-icons-sas{background-position:0px -576px !important}.product-icons-32.product-icons-scan-grey{background-position:-1072px -832px !important}.product-icons-32.product-icons-scan{background-position:-1072px -864px !important}.product-icons-48.product-icons-scan-grey{background-position:-832px -480px !important}.product-icons-48.product-icons-scan{background-position:-832px -240px !important}.product-icons-64.product-icons-scan-grey{background-position:-576px -384px !important}.product-icons-64.product-icons-scan{background-position:-576px -192px !important}.product-icons-32.product-icons-slb-grey{background-position:-1072px -1024px !important}.product-icons-32.product-icons-slb{background-position:-1024px -480px !important}.product-icons-48.product-icons-slb-grey{background-position:-736px -768px !important}.product-icons-48.product-icons-slb{background-position:-1024px -144px !important}.product-icons-64.product-icons-slb-grey{background-position:-576px 0px !important}.product-icons-64.product-icons-slb{background-position:-384px -512px !important}.product-icons-32.product-icons-slm-grey{background-position:-160px -1056px !important}.product-icons-32.product-icons-slm{background-position:-192px -1056px !important}.product-icons-48.product-icons-slm-grey{background-position:-528px -976px !important}.product-icons-48.product-icons-slm{background-position:0px -976px !important}.product-icons-64.product-icons-slm-grey{background-position:-192px -512px !important}.product-icons-64.product-icons-slm{background-position:0px -512px !important}.product-icons-32.product-icons-sls-grey{background-position:-352px -1056px !important}.product-icons-32.product-icons-sls{background-position:-384px -1056px !important}.product-icons-48.product-icons-sls-grey{background-position:-976px -336px !important}.product-icons-48.product-icons-sls{background-position:-768px -928px !important}.product-icons-64.product-icons-sls-grey{background-position:-512px -320px !important}.product-icons-64.product-icons-sls{background-position:-512px -128px !important}.product-icons-32.product-icons-sos-grey{background-position:-544px -1056px !important}.product-icons-32.product-icons-sos{background-position:-576px -1056px !important}.product-icons-48.product-icons-sos-grey{background-position:-144px -928px !important}.product-icons-48.product-icons-sos{background-position:-928px -528px !important}.product-icons-64.product-icons-sos-grey{background-position:-448px -448px !important}.product-icons-64.product-icons-sos{background-position:-256px -448px !important}.product-icons-32.product-icons-toolsimage-grey{background-position:-736px -1056px !important}.product-icons-32.product-icons-toolsimage{background-position:-768px -1056px !important}.product-icons-48.product-icons-toolsimage-grey{background-position:-864px -880px !important}.product-icons-48.product-icons-toolsimage{background-position:-432px -880px !important}.product-icons-64.product-icons-toolsimage-grey{background-position:-64px -448px !important}.product-icons-64.product-icons-toolsimage{background-position:-448px -320px !important}.product-icons-32.product-icons-vipaegis-grey{background-position:-928px -1056px !important}.product-icons-32.product-icons-vipaegis{background-position:-960px -1056px !important}.product-icons-48.product-icons-vipaegis-grey{background-position:-880px -576px !important}.product-icons-48.product-icons-vipaegis{background-position:-880px -144px !important}.product-icons-64.product-icons-vipaegis-grey{background-position:-448px -128px !important}.product-icons-64.product-icons-vipaegis{background-position:-384px -384px !important}.product-icons-32.product-icons-visualstudio-grey{background-position:-1104px -32px !important}.product-icons-32.product-icons-visualstudio{background-position:-1104px -64px !important}.product-icons-48.product-icons-visualstudio-grey{background-position:-288px -832px !important}.product-icons-48.product-icons-visualstudio{background-position:-832px -672px !important}.product-icons-64.product-icons-visualstudio-grey{background-position:-192px -384px !important}.product-icons-64.product-icons-visualstudio{background-position:0px -384px !important}.product-icons-32.product-icons-vod-grey{background-position:-1104px -224px !important}.product-icons-32.product-icons-vod{background-position:-1104px -256px !important}.product-icons-48.product-icons-vod-grey{background-position:-784px -768px !important}.product-icons-48.product-icons-vod{background-position:-1024px 0px !important}.product-icons-64.product-icons-vod-grey{background-position:-384px -192px !important}.product-icons-64.product-icons-vod{background-position:-384px 0px !important}.product-icons-32.product-icons-vpc-grey{background-position:-1104px -416px !important}.product-icons-32.product-icons-vpc{background-position:-1104px -448px !important}.product-icons-48.product-icons-vpc-grey{background-position:-976px -384px !important}.product-icons-48.product-icons-vpc{background-position:-624px -928px !important}.product-icons-64.product-icons-vpc-grey{background-position:-192px -320px !important}.product-icons-64.product-icons-vpc{background-position:0px -320px !important}.product-icons-32.product-icons-waf-grey{background-position:-1104px -608px !important}.product-icons-32.product-icons-waf{background-position:-1104px -640px !important}.product-icons-48.product-icons-waf-grey{background-position:-928px -96px !important}.product-icons-48.product-icons-waf{background-position:-144px -880px !important}.product-icons-64.product-icons-waf-grey{background-position:-320px -128px !important}.product-icons-64.product-icons-waf{background-position:-256px -256px !important}.product-icons-32.product-icons-xianzhi-grey{background-position:-1104px -800px !important}.product-icons-32.product-icons-xianzhi{background-position:-1104px -832px !important}.product-icons-48.product-icons-xianzhi-grey{background-position:-432px -832px !important}.product-icons-48.product-icons-xianzhi{background-position:-832px -384px !important}.product-icons-64.product-icons-xianzhi-grey{background-position:-64px -256px !important}.product-icons-64.product-icons-xianzhi{background-position:-256px -128px !important}.product-icons-32.product-icons-ysf-grey{background-position:-1104px -992px !important}.product-icons-32.product-icons-ysf{background-position:-1104px -1024px !important}.product-icons-48.product-icons-ysf-grey{background-position:-976px -816px !important}.product-icons-48.product-icons-ysf{background-position:-48px -928px !important}.product-icons-64.product-icons-ysf-grey{background-position:-192px -192px !important}.product-icons-64.product-icons-ysf{background-position:0px -192px !important}.product-icons-32.product-icons-yundun-grey{background-position:-96px -1088px !important}.product-icons-32.product-icons-yundun{background-position:-128px -1088px !important}.product-icons-48.product-icons-yundun-grey{background-position:-720px -832px !important}.product-icons-48.product-icons-yundun{background-position:-640px -768px !important}.product-icons-64.product-icons-yundun-grey{background-position:-192px 0px !important}.product-icons-64.product-icons-yundun{background-position:0px -128px !important}.product-icons-32.product-icons-yunjiankong-grey{background-position:-288px -1088px !important}.product-icons-32.product-icons-yunjiankong{background-position:-320px -1088px !important}.product-icons-48.product-icons-yunjiankong-grey{background-position:-880px -432px !important}.product-icons-48.product-icons-yunjiankong{background-position:-976px -240px !important}.product-icons-64.product-icons-yunjiankong-grey{background-position:-64px -64px !important}.product-icons-64.product-icons-yunjiankong{background-position:-64px 0px !important}.console-search{box-sizing:border-box;float:left;margin-right:1px;position:relative;z-index:11}.console-search *{box-sizing:border-box}.console-search .console-search-ask{position:relative}.console-search .console-search-ask .console-search-ask-input{width:200px;height:40px;background:#2a2e31;border:0;padding:12px 30px 12px 10px;display:inline-block;color:#999;-webkit-border-radius:1px 1px;-moz-border-radius:1px / 1px;border-radius:1px / 1px;-o-transition:all 0.3s, 0.3s;-ms-transition:all 0.3s, 0.3s;-moz-transition:all 0.3s, 0.3s;-webkit-transition:all 0.3s, 0.3s}.console-search .console-search-ask .console-search-ask-input:focus{outline:none}.console-search .console-search-ask .console-search-mark{font-size:16px;line-height:30px;position:absolute;height:100%;width:40px;color:#eee;padding:5px;text-decoration:none;display:block}.console-search .console-search-ask .console-search-questionmark{right:0;top:0}.console-search .console-search-ask-active .console-search-ask-input{width:320px;height:40px;background:#f2f2f2;border:0;color:#000}.console-search .console-search-ask-active .console-search-questionmark{color:#0099cc}.console-search .console-search-answer{width:402px;margin-top:2px;left:-1px;border:1px solid #d4d4d4;border-top:none;background:#fff;position:absolute;-webkit-border-radius:2px 2px;-moz-border-radius:2px / 2px;border-radius:2px / 2px;text-shadow:1px}.console-search .console-search-answer .console-search-answer-head{background:#f8f8f8;border-bottom:1px solid #eee;height:42px}.console-search .console-search-answer .console-search-answer-head ul{list-style:none;margin:0;padding:0 24px}.console-search .console-search-answer .console-search-answer-head ul li{float:left;margin-right:14px;height:42px;line-height:42px}.console-search .console-search-answer .console-search-answer-head ul li a{display:block;width:100%;height:100%;color:#666;text-decoration:none}.console-search .console-search-answer .console-search-answer-head ul li a:hover{color:#ff6500;border-bottom:2px solid #ff6500}.console-search .console-search-answer .console-search-answer-head ul li.console-search-tab-active a{color:#ff6500;border-bottom:2px solid #ff6500}.console-search .console-search-answer .console-search-answer-body{padding:0 24px}.console-search .console-search-answer .console-search-answer-body .console-search-answer-list .console-search-answer-item{height:40px;line-height:40px;border-bottom:1px solid #eee}.console-search .console-search-answer .console-search-answer-body .console-search-answer-list .console-search-answer-item a{color:#00a2ca}.console-search .console-search-answer .console-search-answer-body .console-search-answer-more{height:40px;line-height:40px;text-align:right}.console-search .console-search-answer .console-search-answer-body .console-search-answer-more a{color:#00a2ca}.selector{width:100%;height:140px;border:1px solid #999;background-color:#FFF;overflow-x:hidden;overflow-y:auto}.selector .selector-list{list-style:none;margin:0px;padding:0px}.selector .selector-list .selector-item{height:32px;line-height:32px;overflow:hidden;border-bottom:1px solid #DDD;text-overflow:ellipsis;white-space:nowrap;text-indent:8px}.selector .selector-list .selector-item:hover{color:#06C;background-color:#FAFCFF;cursor:pointer}.selector .selector-list .selector-item.active{background-color:#37C;color:#FFF}.selector .selector-list .selector-item.disabled{color:#AAA;cursor:not-allowed;background-color:#FAFAFA}.selector .selector-msg{text-align:center;color:#999;height:32px;line-height:32px}.selector.selector-status-error .selector-msg{cursor:pointer}.selector.selector-status-hasmore .selector-msg{cursor:pointer}.list-selector .selector-box{width:45%;float:left}.list-selector .selector-box .inner-wrap{border:1px solid #bbb;height:200px;overflow:hidden}.list-selector .selector-box .inner-wrap .inner-head{border:1px solid #eee;margin:6px;position:relative}.list-selector .selector-box .inner-wrap .inner-head input{border:0;width:90%}.list-selector .selector-box .inner-wrap .inner-head input:focus{outline:0}.list-selector .selector-box .inner-wrap .inner-head .search{width:20px;height:20px;line-height:20px;padding:0 6px;cursor:pointer;position:absolute;right:0;top:0}.list-selector .selector-box .inner-wrap .inner-body{height:160px;overflow-y:auto;overflow-x:hidden;border:0}.list-selector .selector-box .inner-wrap .inner-body2{height:200px;overflow-y:auto;overflow-x:hidden;border:0}.list-selector .selector-mid{width:10%;text-align:center;float:left}.list-selector .selector-mid .mid-box{margin:10px auto;height:40px;width:40px;font-weight:bold;border:1px solid #bbb;background:#f7f7f7;display:block;cursor:pointer}.list-selector .selector-mid .mid-margin{margin-top:80px;margin-bottom:10px}.aliyun-console-table-search-list{min-width:100px}.console-global-notice{position:relative;margin-top:-1px;z-index:1}.console-global-notice .console-global-notice-nav{position:absolute;top:13px;left:25px;z-index:2}.console-global-notice .console-global-notice-nav span{width:12px;height:12px;display:block;float:left;background:#e8e8e8;border-radius:12px;margin-right:3px;cursor:pointer}.console-global-notice .console-global-notice-nav span.active{background:#999999}.console-global-notice .console-global-notice-list{height:50px;position:relative}.console-global-notice .console-global-notice-list .console-global-notice-item{position:absolute;width:100%;top:0;left:0;z-index:1;padding:10px 12px;border-radius:2px;margin-bottom:0px;text-align:left}.console-global-notice .console-global-notice-list .console-global-notice-item .console-global-notice-nomore{position:absolute;top:8px;right:12px}.console-global-notice .console-global-notice-list .console-global-notice-item .console-global-notice-content{padding-right:80px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.console-clip-copy{background:rgba(0,0,0,0.75);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#bf000000,endColorstr=#bf000000);position:absolute;color:#fff;line-height:24px;height:24px;overflow:hidden;padding:0px 12px 0px 30px}.console-clip-copy .rectangle1,.console-clip-copy .rectangle2{position:absolute;top:8px;left:13px;border:1px solid #fff;width:10px;height:12px;background:#404040;z-index:2}.console-clip-copy .rectangle2{left:15px;z-index:1;top:5px}.console-clip-copyed{padding-left:12px}.console-clip-copyed .rectangle1,.console-clip-copyed .rectangle2{display:none}.console-aside-wrap{position:fixed;z-index:105}.console-aside-wrap .console-aside{position:absolute;display:none}.console-aside-wrap .console-aside.console-aside-transform{-o-transition:all 0.3s, 0.3s;-ms-transition:all 0.3s, 0.3s;-moz-transition:all 0.3s, 0.3s;-webkit-transition:all 0.3s, 0.3s}.console-aside-wrap.top{top:0;width:100%}.console-aside-wrap.top .console-aside{top:0;width:100%}.console-aside-wrap.right{right:0;height:100%;top:0}.console-aside-wrap.right .console-aside{right:0;height:100%}.console-aside-wrap.left{left:0;height:100%;top:0}.console-aside-wrap.left .console-aside{left:0;height:100%}.console-aside-wrap.bottom{bottom:0;width:100%}.console-aside-wrap.bottom .console-aside{bottom:0;width:100%}.table-default-viewer{width:100%;background-color:#FFF}.table-default-viewer td{padding:11px 20px;border:1px solid #eeeeee}.table-default-viewer.off{display:none}.table-viewer-topbar-content{padding:0px;margin:0px;margin-right:8px}.table-viewer-header{margin-top:10px;margin-bottom:-1px;height:40px;background:#F5f6FA;line-height:38px;border:1px solid #e1e6eb;position:relative;border-left:4px solid #6d7781}.table-viewer-header .table-viewer-topbar-title{font-size:14px;color:#333333;display:inline-block;margin-left:16px}.table-viewer-header .table-viewer-topbar-content{margin-right:60px}.table-viewer-header .toggle-drop-down-icon{-webkit-user-select:none;-moz-user-select:none;user-select:none;-o-user-select:none;-ms-user-select:none;position:absolute;width:40px;height:39px;right:0;top:0;border-left:1px solid #e1e6eb}.table-viewer-header .table-viewer-dropdown{display:inline-block;margin:10px;font-size:20px}.simple-chart{height:100%;border:1px solid #ccd6e0;position:relative;-webkit-box-shadow:0px 0px 3px rgba(0,0,0,0.1);-moz-box-shadow:0px 0px 3px rgba(0,0,0,0.1);box-shadow:0px 0px 3px rgba(0,0,0,0.1)}.simple-chart .simple-chart-head{height:40px;line-height:40px;font-size:14px;padding-left:10px;background:#f8f9fb}.simple-chart .simple-chart-head-title{float:left}.simple-chart .simple-chart-operations{float:right}.simple-chart .simple-chart-operations .simple-chart-btn{display:inline-block;border-left:1px solid #e1e6eb;width:40px;text-align:center;cursor:pointer}.simple-chart .simple-chart-operations .simple-chart-btn span{font-size:14px;font-weight:bold;vertical-align:text-bottom}.simple-chart .simple-chart-body{border-top:1px solid #ccd6e0;padding:0px 2px 2px 0px}.simple-chart .simple-chart-body .highcharts-container{float:left}.simple-chart .simple-chart-body-inner{height:100%}.simple-chart .simple-chart-annulus-center{position:absolute;text-align:center}.simple-chart .simple-chart-annulus-center .simple-chart-annulus-number{color:#0099cc;font-size:32px}.simple-chart.simple-chart-nowrap{border:none;-webkit-box-shadow:0px 0px 0px;-moz-box-shadow:0px 0px 0px;box-shadow:0px 0px 0px}.simple-chart.simple-chart-nowrap .simple-chart-head{display:none}.simple-chart.simple-chart-nowrap .simple-chart-body{border:none;height:100% !important}.console-middle-page{margin-top:80px}.console-middle-page .console-middle-page-icon{text-align:right}.console-middle-page .console-middle-page-title{font-size:20px;margin:0;line-height:48px}.console-middle-page .console-middle-page-text{font-size:12px;color:#666}.console-middle-page .console-middle-page-link{border-top:1px solid #EEE;margin-top:16px;padding-top:16px}.console-middle-page .console-middle-page-link>a{padding-right:14px}.console-rank-select{height:32px;padding:8px 0px;overflow:hidden}.console-rank-select .rank-item{width:20px;height:16px;line-height:16px;overflow:hidden;display:block;float:left;font-size:16px;color:#CCC;cursor:pointer;zoom:1}.console-rank-select .rank-active{color:#09C}.console-rank-select .rank-hover{color:#3CF}.simple-loading{position:relative}.simple-loading .simple-loading-inner{margin-left:auto;margin-right:auto}.simple-loading-1:before,.simple-loading-1:after,.simple-loading-1{border-radius:50%;width:14px;height:14px;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation:simple-loading-1 1.8s infinite ease-in-out;animation:simple-loading-1 1.8s infinite ease-in-out}.simple-loading-1{font-size:10px;position:relative;text-indent:-9999em;-webkit-animation-delay:0.16s;animation-delay:0.16s}.simple-loading-1:before{left:-30px}.simple-loading-1:after{left:30px;-webkit-animation-delay:0.32s;animation-delay:0.32s}.simple-loading-1:before,.simple-loading-1:after{content:'';position:absolute;top:0}@-webkit-keyframes simple-loading-1{0%,80%,100%{box-shadow:0 2.5em 0 -1.3em #ddd}40%{box-shadow:0 2.5em 0 0 #ddd}}@keyframes simple-loading-1{0%,80%,100%{box-shadow:0 2.5em 0 -1.3em #ddd}40%{box-shadow:0 2.5em 0 0 #ddd}}.feedback-container{position:fixed;right:0px;bottom:100px;font-family:微软雅黑, 'Microsoft Yahei', 'Hiragino Sans GB', tahoma, arial, 宋体;font-size:12px;font-stretch:normal;font-style:normal;font-variant:normal;font-weight:normal;z-index:100}.feedback-container:hover .feedback-trigger .feedback-trigger-text,.feedback-container.active .feedback-trigger .feedback-trigger-text{width:56px;padding:0 0px 0 4px}.feedback-container h1,.feedback-container h2,.feedback-container textarea,.feedback-container input{margin:0;padding:0;border:0}.feedback-container .feedback{position:absolute;width:396px;background:rgba(0,162,202,0.5);padding:3px;right:81px;bottom:0}.feedback-container .feedback .feedback-panel{width:390px;background:#fff;padding:20px}.feedback-container .feedback .feedback-title{border-bottom:1px solid #eee;padding-bottom:8px;margin-bottom:15px}.feedback-container .feedback .feedback-title h1{color:#000;font-size:16px;display:inline-block}.feedback-container .feedback .feedback-title h1 i{cursor:pointer;margin-top:6px;float:right}.feedback-container .feedback .feedback-content{position:relative;margin-bottom:15px}.feedback-container .feedback .feedback-content h2{font-size:14px;margin-bottom:5px}.feedback-container .feedback .feedback-content .must{position:absolute;left:-10px;top:3px;color:red}.feedback-container .feedback textarea,.feedback-container .feedback input{font:12px/1.5 "\5FAE\8F6F\96C5\9ED1","Microsoft Yahei","Hiragino Sans GB",tahoma,arial,"\5B8B\4F53"}.feedback-container .feedback .feedback-content textarea{resize:none;height:106px;width:100%;padding:9px 10px;margin:6px 1px 1px 0;border:solid 1px #e8e8e8;border-radius:4px;line-height:16px;color:#333;font-size:12px;outline:0}.feedback-container .feedback .feedback-content .feedback-content-count{color:#666;margin-top:5px}.feedback-container .feedback .feedback-contact{margin-bottom:25px;position:relative}.feedback-container .feedback .feedback-contact h2{font-size:14px;margin-bottom:5px}.feedback-container .feedback .feedback-contact input{height:36px;margin-bottom:20px;resize:none;width:100%;padding:9px 10px;margin:6px 1px 1px 0;border:solid 1px #e8e8e8;line-height:16px;color:#333;font-size:12px;outline:0;background:#fff;border-radius:4px;text-decoration:none;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;user-select:none}.feedback-container .feedback .feedback-contact input:focus{background:#e9fbfe;border:solid 1px #e8e8e8}.feedback-container .feedback .feedback-contact .inputError{position:absolute;bottom:-22px;left:2px;color:red}.feedback-container .feedback .submit-btn{padding:0;height:24px;line-height:24px;font-size:12px;display:inline-block;min-width:78px;background:#00a2ca;color:#fff;text-align:center;outline:none;border-radius:0;text-decoration:none;cursor:pointer}.feedback-container .feedback .submit-btn:hover{background:#33b5d4;border-color:#33b5d4;text-decoration:none}.feedback-container .feedback .feedback-footer{text-align:center;padding:5px 0}.feedback-container .feedback .submit-btn.disabled{background:#efefef;border-color:#efefef;color:#ccc;cursor:default}.feedback .thanks{font-size:16px;margin-left:15px;color:#000;position:relative;top:-9px}.feedback .feedback-close{display:inline-block;float:right;cursor:pointer;font-size:18px}.feedback .feedback-check{font-size:30px;color:#65ce00}.feedback-container .feedback-trigger{display:inline-block;background-color:#3d5061;font-size:12px;color:#fff;border-radius:4px;cursor:pointer;padding:4px 4px 1px 1px}.feedback-container .feedback-trigger .feedback-trigger-text{padding:0;display:inline-block;height:16px;overflow:hidden;width:0;-moz-transition:all 0.3s ease-in;-webkit-transition:all 0.3s ease-in;-o-transition:all 0.3s ease-in;transition:all 0.3s ease-in}.feedback-container .feedback-trigger .feedback-trigger-icon{padding:0;display:inline-block;font-size:15px}.console-guide-dialog .modal-dialog{width:840px}.console-guide-dialog .modal-body{margin-bottom:15px}.console-guide-dialog .carousel-control{display:none}.console-guide-dialog .carousel-indicators{bottom:-40px !important}.console-guide-dialog .carousel-indicators li{background:#e8e8e8;width:16px;height:16px;border-radius:12px;margin:0 0 0 2px}.console-guide-dialog .carousel-indicators li.active{background:#09c;width:16px;height:16px;border-radius:12px;margin:0 0 0 2px}.console-guide-dialog .console-guide-dialog-link{position:absolute;z-index:100;bottom:20px;right:20px}.console-tag-select{position:absolute;width:320px}.console-tag-select ul{list-style:none;box-shadow:none !important;display:block;margin:0;padding:0}.console-tag-select .console-tag-dropdown{position:absolute;top:100%;left:0;z-index:1000;margin-top:2px;width:326px}.console-tag-select .console-tag-dropdown .dropdown-menu{position:static;border:1px solid #e1e6eb;width:160px}.console-tag-select .console-tag-dropdown .dropdown-menu .console-tag-key-item-block{padding:7px 16px;display:block}.console-tag-select .console-tag-dropdown .dropdown-menu .console-tag-key-item-empty{color:#999;font-style:italic}.console-tag-select .console-tag-dropdown .dropdown-menu .console-tag-key-item-title .console-tag-key-item-block{background:#F5F6FA;border-bottom:1px solid #eee}.console-tag-select .console-tag-dropdown .dropdown-menu li a{border-bottom:1px solid #eee;white-space:pre-line;position:relative}.console-tag-select .console-tag-dropdown .dropdown-menu li a:hover,.console-tag-select .console-tag-dropdown .dropdown-menu li a:focus{background-color:#F9F9FA}.console-tag-select .console-tag-dropdown .dropdown-menu li:last-child a{border-bottom:none}.console-tag-select .console-tag-dropdown .dropdown-menu li.tag-active a,.console-tag-select .console-tag-dropdown .dropdown-menu li.tag-active a:hover,.console-tag-select .console-tag-dropdown .dropdown-menu li.tag-active a:focus{text-decoration:none;outline:0;-webkit-transition:backgroud 0.2s ease, 0.2s ease}.console-tag-select .console-tag-dropdown .dropdown-menu li.tag-active a .console-tag-selected-icon,.console-tag-select .console-tag-dropdown .dropdown-menu li.tag-active a:hover .console-tag-selected-icon,.console-tag-select .console-tag-dropdown .dropdown-menu li.tag-active a:focus .console-tag-selected-icon{display:block}.console-tag-select .console-tag-dropdown .dropdown-menu li.tag-key-active{border-left:2px solid #09c;margin-left:-1px}.console-tag-select .console-tag-dropdown .dropdown-menu li.tag-key-active a,.console-tag-select .console-tag-dropdown .dropdown-menu li.tag-key-active a:hover,.console-tag-select .console-tag-dropdown .dropdown-menu li.tag-key-active a:focus{padding-left:15px}.console-tag-select .console-tag-dropdown .dropdown-menu .console-tag-value-item a.tag-active,.console-tag-select .console-tag-dropdown .dropdown-menu .console-tag-value-item a.tag-active:hover,.console-tag-select .console-tag-dropdown .dropdown-menu .console-tag-value-item a.tag-active:focus{background-color:#F9F9FA}.console-tag-select .console-tag-dropdown .console-tag-value-dropdown{margin-left:-1px}.console-tag-select .console-tag-pagepick{padding:0 5px}.console-tag-select .console-tag-pagepick a{display:inline-block !important;border-bottom:none !important;-webkit-user-select:none}.console-tag-select .console-tag-selected-icon{display:none;float:right;font-size:14px;position:absolute;right:8px;top:8px}.console-tag-select .console-tag-label-wrap{padding-left:2px}.console-tag-select .console-tag-label{padding:5px 20px 5px 5px;background:#f1f1f1;position:relative;margin-left:2px}.console-tag-select .console-tag-label .console-tag-label-remove{position:absolute;top:0;right:0;width:20px;height:27px;line-height:27px;text-align:center;cursor:pointer}.console-tag-select-view .console-tag-label{padding:5px 20px 5px 5px;background:#f1f1f1;position:relative;margin-left:2px}.console-tag-select-view .console-tag-label .console-tag-label-remove{position:absolute;top:0;right:0;width:20px;height:27px;line-height:27px;text-align:center;cursor:pointer;color:#666}.console-tag-select-view .console-tag-label .console-tag-label-colon{padding:0 1px}.console-tag-edit .tag-panel{min-height:120px;border:2px dashed #ddd;padding:8px}.console-tag-edit .tag-panel .console-tag-select-view .console-tag-label{margin:4px}.console-tag-edit .tag-edit-tip{color:#999;font-style:italic;margin-top:8px}.console-tag-edit-form{display:inline-block}.console-tag-edit-form input.form-control{width:80px}.console-tag-edit-form.form-inline .form-group{margin:0 8px 0 0px}.console-tag-loading-overlay{position:absolute;height:100%;width:100%;top:0;left:0;background:#fff;opacity:0.5;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=50)}.console-tag-loading-block{position:absolute;top:50%;left:50%}.console-searchbar-textinput{min-width:180px}.console-shuttle .title{border-left:1px solid #e1e6eb;border-right:1px solid #e1e6eb;border-top:1px solid #e1e6eb;background-color:#F5F6FA;padding-left:5px;line-height:30px}.console-shuttle .search{position:relative}.console-shuttle .search .icon-search{position:absolute;right:5px;top:10px;font-size:12px}.console-shuttle .search input{width:100%;height:32px}.console-shuttle .selector{border:1px solid #e1e6eb;height:240px}.console-shuttle .left-selector{height:220px}.console-shuttle .right-selector{height:240px}.console-shuttle .search-hidden{height:240px}.console-shuttle .btn{display:block;margin:12px 45%}.console-shuttle .console-selector{width:40%}.console-shuttle .console-selector-result{width:40%}.console-shuttle .selector-group-options{vertical-align:middle;width:20%;text-align:center;margin-top:100px}.console-shuttle .selector-list .line-head{line-height:12px;margin-bottom:8px;color:#000}.console-shuttle .selector-list .line-bottom{line-height:12px;color:#999}.console-shuttle .selector-list .line-column-left{display:inline-block}.console-shuttle .selector-list .line-column-right{display:inline-block;float:right;padding:5px 0;color:#000}.console-shuttle .selector-list .line-yellow-text{color:#ff6600}.console-shuttle .selector-list .selector-item{height:auto;line-height:normal;padding:10px;text-indent:0}.console-shuttle .selector-list .selector-item:hover{color:auto;background:#f9f9f9}.console-shuttle .selector-list .selector-item.active{color:#fff;background:#0099cb}.console-shuttle .selector-list .selector-item.active .line-head{color:#fff}.console-shuttle .selector-list .selector-item.active .line-bottom{color:#fff}.console-shuttle .selector-list .selector-item.active .line-yellow-text{color:#fff}.console-shuttle .selector-list .selector-item.active .line-column-right{color:#fff}body{font-size:12px}body,h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:"Helvetica Neue", "Luxi Sans", "DejaVu Sans", Tahoma, "Hiragino Sans GB", STHeiti, "Microsoft YaHei"}a{color:#06C;cursor:pointer}a:hover{color:#039}label{font-size:100%}.nowrap{white-space:nowrap}.breakall{word-break:break-all;word-wrap:break-word}input::-ms-clear{display:none}input[type="radio"],input[type="checkbox"]{margin-top:2px;margin-top:1px \9}.console-container{padding:0 15px}.console-sidebar{border-right:1px solid #DDD}.console-sidebar .nav{margin-right:4px}.console-sidebar .nav li{border-bottom:1px solid #DDD;padding:4px 0px;position:relative}.console-sidebar .nav li a{color:#333;padding:6px 16px;border-left:2px solid #FFF}.console-sidebar .nav li a:hover{background-color:#FFF;border-left:2px solid #F90}.console-sidebar .nav li a span[class^="icon-"]{position:absolute;left:0px;top:8px;color:#999;font-size:14px}.console-sidebar .nav li.active a{color:#fff;border-left:2px solid #F90;background-color:#313844}.console-sidebar .nav .nav{margin-right:0px}.console-sidebar .nav .nav li{border-bottom:0px}.console-sidebar .nav .nav li a{text-indent:12px;background:#FFF;border-left-color:#FFF;color:#333}.console-sidebar .nav .nav li a:hover{background-color:#FFF;border-left:2px solid #F90}.console-sidebar .nav .nav li.active a{color:#fff;border-left:2px solid #F90;background-color:#313844}.console-instance-head{padding:3px 0px;border-bottom:1px solid #DDD}.console-instance-head h3.instance-id{display:inline-block;margin-right:8px;vertical-align:middle}.console-instance-head .pull-right{padding:16px 0px 10px}.dropdown-menu{font-size:12px;border-radius:0px;padding:0px;box-shadow:2px 2px 8px rgba(0,0,0,0.2)}.dropdown-menu li a{padding:7px 16px}.dropdown-menu .divider{margin:0px 0px}.console-chart{width:100%}.tooltip{word-break:break-all}.popover .popover-inner{padding:8px}.popover .popover-inner .popover-content{padding:0px}.console-not-service{margin-top:80px}.console-not-service .console-not-service-icon{text-align:right;padding-top:8px}.console-not-service .console-not-service-title{font-size:20px}.console-not-service .console-not-service-text{font-size:12px;color:#666}.console-not-service .console-not-service-link{border-top:1px solid #EEE;margin-top:16px;padding-top:16px}.console-step{height:24px;position:relative;margin-left:0px;margin-right:0px}.console-step .step{font-size:14px;height:24px;line-height:24px;color:#FFF;background:#cacaca;z-index:1;text-align:center}.console-step .step:before{content:'';display:block;position:absolute;left:-12px;z-index:8;top:0px;border-top:12px solid #cacaca;border-left:12px solid transparent !important;border-bottom:12px solid #cacaca}.console-step .step:after{content:'';display:block;width:16px;height:24px;position:absolute;right:0px;z-index:9;top:0px;border-top:12px solid transparent !important;border-left:12px solid #cacaca;border-bottom:12px solid transparent !important;background-color:#FFF}.console-step .step-first:before{display:none}.console-step .step-end:after{display:none}.console-step .step-pass{background-color:#99dcf3}.console-step .step-pass:after{border-color:#99dcf3}.console-step .step-pass:before{border-color:#99dcf3}.console-step .step-active{background-color:#00a0c7}.console-step .step-active:after{border-color:#00a0c7}.console-step .step-active:before{border-color:#00a0c7} diff --git a/pigx-register/src/main/resources/static/console-ui/public/css/font-awesome.css b/pigx-register/src/main/resources/static/console-ui/public/css/font-awesome.css new file mode 100644 index 0000000..99f21da --- /dev/null +++ b/pigx-register/src/main/resources/static/console-ui/public/css/font-awesome.css @@ -0,0 +1,2102 @@ +/* + * Copyright 1999-2018 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/*! + * Font Awesome 4.5.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */ +/* FONT PATH + * -------------------------- */ +@font-face { + font-family: 'FontAwesome'; + src: url('../fonts/fontawesome-webfont.eot?v=4.5.0'); + src: url('../fonts/fontawesome-webfont.eot?#iefix&v=4.5.0') format('embedded-opentype'), url('../fonts/fontawesome-webfont.woff2?v=4.5.0') format('woff2'), url('../fonts/fontawesome-webfont.woff?v=4.5.0') format('woff'), url('../fonts/fontawesome-webfont.ttf?v=4.5.0') format('truetype'), url('../fonts/fontawesome-webfont.svg?v=4.5.0#fontawesomeregular') format('svg'); + font-weight: normal; + font-style: normal; +} +.fa { + display: inline-block; + font: normal normal normal 14px/1 FontAwesome; + font-size: inherit; + text-rendering: auto; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +/* makes the font 33% larger relative to the icon container */ +.fa-lg { + font-size: 1.33333333em; + line-height: 0.75em; + vertical-align: -15%; +} +.fa-2x { + font-size: 2em; +} +.fa-3x { + font-size: 3em; +} +.fa-4x { + font-size: 4em; +} +.fa-5x { + font-size: 5em; +} +.fa-fw { + width: 1.28571429em; + text-align: center; +} +.fa-ul { + padding-left: 0; + margin-left: 2.14285714em; + list-style-type: none; +} +.fa-ul > li { + position: relative; +} +.fa-li { + position: absolute; + left: -2.14285714em; + width: 2.14285714em; + top: 0.14285714em; + text-align: center; +} +.fa-li.fa-lg { + left: -1.85714286em; +} +.fa-border { + padding: .2em .25em .15em; + border: solid 0.08em #eeeeee; + border-radius: .1em; +} +.fa-pull-left { + float: left; +} +.fa-pull-right { + float: right; +} +.fa.fa-pull-left { + margin-right: .3em; +} +.fa.fa-pull-right { + margin-left: .3em; +} +/* Deprecated as of 4.4.0 */ +.pull-right { + float: right; +} +.pull-left { + float: left; +} +.fa.pull-left { + margin-right: .3em; +} +.fa.pull-right { + margin-left: .3em; +} +.fa-spin { + -webkit-animation: fa-spin 2s infinite linear; + animation: fa-spin 2s infinite linear; +} +.fa-pulse { + -webkit-animation: fa-spin 1s infinite steps(8); + animation: fa-spin 1s infinite steps(8); +} +@-webkit-keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} +@keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} +.fa-rotate-90 { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1); + -webkit-transform: rotate(90deg); + -ms-transform: rotate(90deg); + transform: rotate(90deg); +} +.fa-rotate-180 { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2); + -webkit-transform: rotate(180deg); + -ms-transform: rotate(180deg); + transform: rotate(180deg); +} +.fa-rotate-270 { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3); + -webkit-transform: rotate(270deg); + -ms-transform: rotate(270deg); + transform: rotate(270deg); +} +.fa-flip-horizontal { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1); + -webkit-transform: scale(-1, 1); + -ms-transform: scale(-1, 1); + transform: scale(-1, 1); +} +.fa-flip-vertical { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1); + -webkit-transform: scale(1, -1); + -ms-transform: scale(1, -1); + transform: scale(1, -1); +} +:root .fa-rotate-90, +:root .fa-rotate-180, +:root .fa-rotate-270, +:root .fa-flip-horizontal, +:root .fa-flip-vertical { + filter: none; +} +.fa-stack { + position: relative; + display: inline-block; + width: 2em; + height: 2em; + line-height: 2em; + vertical-align: middle; +} +.fa-stack-1x, +.fa-stack-2x { + position: absolute; + left: 0; + width: 100%; + text-align: center; +} +.fa-stack-1x { + line-height: inherit; +} +.fa-stack-2x { + font-size: 2em; +} +.fa-inverse { + color: #ffffff; +} +/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen + readers do not read off random characters that represent icons */ +.fa-glass:before { + content: "\f000"; +} +.fa-music:before { + content: "\f001"; +} +.fa-search:before { + content: "\f002"; +} +.fa-envelope-o:before { + content: "\f003"; +} +.fa-heart:before { + content: "\f004"; +} +.fa-star:before { + content: "\f005"; +} +.fa-star-o:before { + content: "\f006"; +} +.fa-user:before { + content: "\f007"; +} +.fa-film:before { + content: "\f008"; +} +.fa-th-large:before { + content: "\f009"; +} +.fa-th:before { + content: "\f00a"; +} +.fa-th-list:before { + content: "\f00b"; +} +.fa-check:before { + content: "\f00c"; +} +.fa-remove:before, +.fa-close:before, +.fa-times:before { + content: "\f00d"; +} +.fa-search-plus:before { + content: "\f00e"; +} +.fa-search-minus:before { + content: "\f010"; +} +.fa-power-off:before { + content: "\f011"; +} +.fa-signal:before { + content: "\f012"; +} +.fa-gear:before, +.fa-cog:before { + content: "\f013"; +} +.fa-trash-o:before { + content: "\f014"; +} +.fa-home:before { + content: "\f015"; +} +.fa-file-o:before { + content: "\f016"; +} +.fa-clock-o:before { + content: "\f017"; +} +.fa-road:before { + content: "\f018"; +} +.fa-download:before { + content: "\f019"; +} +.fa-arrow-circle-o-down:before { + content: "\f01a"; +} +.fa-arrow-circle-o-up:before { + content: "\f01b"; +} +.fa-inbox:before { + content: "\f01c"; +} +.fa-play-circle-o:before { + content: "\f01d"; +} +.fa-rotate-right:before, +.fa-repeat:before { + content: "\f01e"; +} +.fa-refresh:before { + content: "\f021"; +} +.fa-list-alt:before { + content: "\f022"; +} +.fa-lock:before { + content: "\f023"; +} +.fa-flag:before { + content: "\f024"; +} +.fa-headphones:before { + content: "\f025"; +} +.fa-volume-off:before { + content: "\f026"; +} +.fa-volume-down:before { + content: "\f027"; +} +.fa-volume-up:before { + content: "\f028"; +} +.fa-qrcode:before { + content: "\f029"; +} +.fa-barcode:before { + content: "\f02a"; +} +.fa-tag:before { + content: "\f02b"; +} +.fa-tags:before { + content: "\f02c"; +} +.fa-book:before { + content: "\f02d"; +} +.fa-bookmark:before { + content: "\f02e"; +} +.fa-print:before { + content: "\f02f"; +} +.fa-camera:before { + content: "\f030"; +} +.fa-font:before { + content: "\f031"; +} +.fa-bold:before { + content: "\f032"; +} +.fa-italic:before { + content: "\f033"; +} +.fa-text-height:before { + content: "\f034"; +} +.fa-text-width:before { + content: "\f035"; +} +.fa-align-left:before { + content: "\f036"; +} +.fa-align-center:before { + content: "\f037"; +} +.fa-align-right:before { + content: "\f038"; +} +.fa-align-justify:before { + content: "\f039"; +} +.fa-list:before { + content: "\f03a"; +} +.fa-dedent:before, +.fa-outdent:before { + content: "\f03b"; +} +.fa-indent:before { + content: "\f03c"; +} +.fa-video-camera:before { + content: "\f03d"; +} +.fa-photo:before, +.fa-image:before, +.fa-picture-o:before { + content: "\f03e"; +} +.fa-pencil:before { + content: "\f040"; +} +.fa-map-marker:before { + content: "\f041"; +} +.fa-adjust:before { + content: "\f042"; +} +.fa-tint:before { + content: "\f043"; +} +.fa-edit:before, +.fa-pencil-square-o:before { + content: "\f044"; +} +.fa-share-square-o:before { + content: "\f045"; +} +.fa-check-square-o:before { + content: "\f046"; +} +.fa-arrows:before { + content: "\f047"; +} +.fa-step-backward:before { + content: "\f048"; +} +.fa-fast-backward:before { + content: "\f049"; +} +.fa-backward:before { + content: "\f04a"; +} +.fa-play:before { + content: "\f04b"; +} +.fa-pause:before { + content: "\f04c"; +} +.fa-stop:before { + content: "\f04d"; +} +.fa-forward:before { + content: "\f04e"; +} +.fa-fast-forward:before { + content: "\f050"; +} +.fa-step-forward:before { + content: "\f051"; +} +.fa-eject:before { + content: "\f052"; +} +.fa-chevron-left:before { + content: "\f053"; +} +.fa-chevron-right:before { + content: "\f054"; +} +.fa-plus-circle:before { + content: "\f055"; +} +.fa-minus-circle:before { + content: "\f056"; +} +.fa-times-circle:before { + content: "\f057"; +} +.fa-check-circle:before { + content: "\f058"; +} +.fa-question-circle:before { + content: "\f059"; +} +.fa-info-circle:before { + content: "\f05a"; +} +.fa-crosshairs:before { + content: "\f05b"; +} +.fa-times-circle-o:before { + content: "\f05c"; +} +.fa-check-circle-o:before { + content: "\f05d"; +} +.fa-ban:before { + content: "\f05e"; +} +.fa-arrow-left:before { + content: "\f060"; +} +.fa-arrow-right:before { + content: "\f061"; +} +.fa-arrow-up:before { + content: "\f062"; +} +.fa-arrow-down:before { + content: "\f063"; +} +.fa-mail-forward:before, +.fa-share:before { + content: "\f064"; +} +.fa-expand:before { + content: "\f065"; +} +.fa-compress:before { + content: "\f066"; +} +.fa-plus:before { + content: "\f067"; +} +.fa-minus:before { + content: "\f068"; +} +.fa-asterisk:before { + content: "\f069"; +} +.fa-exclamation-circle:before { + content: "\f06a"; +} +.fa-gift:before { + content: "\f06b"; +} +.fa-leaf:before { + content: "\f06c"; +} +.fa-fire:before { + content: "\f06d"; +} +.fa-eye:before { + content: "\f06e"; +} +.fa-eye-slash:before { + content: "\f070"; +} +.fa-warning:before, +.fa-exclamation-triangle:before { + content: "\f071"; +} +.fa-plane:before { + content: "\f072"; +} +.fa-calendar:before { + content: "\f073"; +} +.fa-random:before { + content: "\f074"; +} +.fa-comment:before { + content: "\f075"; +} +.fa-magnet:before { + content: "\f076"; +} +.fa-chevron-up:before { + content: "\f077"; +} +.fa-chevron-down:before { + content: "\f078"; +} +.fa-retweet:before { + content: "\f079"; +} +.fa-shopping-cart:before { + content: "\f07a"; +} +.fa-folder:before { + content: "\f07b"; +} +.fa-folder-open:before { + content: "\f07c"; +} +.fa-arrows-v:before { + content: "\f07d"; +} +.fa-arrows-h:before { + content: "\f07e"; +} +.fa-bar-chart-o:before, +.fa-bar-chart:before { + content: "\f080"; +} +.fa-twitter-square:before { + content: "\f081"; +} +.fa-facebook-square:before { + content: "\f082"; +} +.fa-camera-retro:before { + content: "\f083"; +} +.fa-key:before { + content: "\f084"; +} +.fa-gears:before, +.fa-cogs:before { + content: "\f085"; +} +.fa-comments:before { + content: "\f086"; +} +.fa-thumbs-o-up:before { + content: "\f087"; +} +.fa-thumbs-o-down:before { + content: "\f088"; +} +.fa-star-half:before { + content: "\f089"; +} +.fa-heart-o:before { + content: "\f08a"; +} +.fa-sign-out:before { + content: "\f08b"; +} +.fa-linkedin-square:before { + content: "\f08c"; +} +.fa-thumb-tack:before { + content: "\f08d"; +} +.fa-external-link:before { + content: "\f08e"; +} +.fa-sign-in:before { + content: "\f090"; +} +.fa-trophy:before { + content: "\f091"; +} +.fa-github-square:before { + content: "\f092"; +} +.fa-upload:before { + content: "\f093"; +} +.fa-lemon-o:before { + content: "\f094"; +} +.fa-phone:before { + content: "\f095"; +} +.fa-square-o:before { + content: "\f096"; +} +.fa-bookmark-o:before { + content: "\f097"; +} +.fa-phone-square:before { + content: "\f098"; +} +.fa-twitter:before { + content: "\f099"; +} +.fa-facebook-f:before, +.fa-facebook:before { + content: "\f09a"; +} +.fa-github:before { + content: "\f09b"; +} +.fa-unlock:before { + content: "\f09c"; +} +.fa-credit-card:before { + content: "\f09d"; +} +.fa-feed:before, +.fa-rss:before { + content: "\f09e"; +} +.fa-hdd-o:before { + content: "\f0a0"; +} +.fa-bullhorn:before { + content: "\f0a1"; +} +.fa-bell:before { + content: "\f0f3"; +} +.fa-certificate:before { + content: "\f0a3"; +} +.fa-hand-o-right:before { + content: "\f0a4"; +} +.fa-hand-o-left:before { + content: "\f0a5"; +} +.fa-hand-o-up:before { + content: "\f0a6"; +} +.fa-hand-o-down:before { + content: "\f0a7"; +} +.fa-arrow-circle-left:before { + content: "\f0a8"; +} +.fa-arrow-circle-right:before { + content: "\f0a9"; +} +.fa-arrow-circle-up:before { + content: "\f0aa"; +} +.fa-arrow-circle-down:before { + content: "\f0ab"; +} +.fa-globe:before { + content: "\f0ac"; +} +.fa-wrench:before { + content: "\f0ad"; +} +.fa-tasks:before { + content: "\f0ae"; +} +.fa-filter:before { + content: "\f0b0"; +} +.fa-briefcase:before { + content: "\f0b1"; +} +.fa-arrows-alt:before { + content: "\f0b2"; +} +.fa-group:before, +.fa-users:before { + content: "\f0c0"; +} +.fa-chain:before, +.fa-link:before { + content: "\f0c1"; +} +.fa-cloud:before { + content: "\f0c2"; +} +.fa-flask:before { + content: "\f0c3"; +} +.fa-cut:before, +.fa-scissors:before { + content: "\f0c4"; +} +.fa-copy:before, +.fa-files-o:before { + content: "\f0c5"; +} +.fa-paperclip:before { + content: "\f0c6"; +} +.fa-save:before, +.fa-floppy-o:before { + content: "\f0c7"; +} +.fa-square:before { + content: "\f0c8"; +} +.fa-navicon:before, +.fa-reorder:before, +.fa-bars:before { + content: "\f0c9"; +} +.fa-list-ul:before { + content: "\f0ca"; +} +.fa-list-ol:before { + content: "\f0cb"; +} +.fa-strikethrough:before { + content: "\f0cc"; +} +.fa-underline:before { + content: "\f0cd"; +} +.fa-table:before { + content: "\f0ce"; +} +.fa-magic:before { + content: "\f0d0"; +} +.fa-truck:before { + content: "\f0d1"; +} +.fa-pinterest:before { + content: "\f0d2"; +} +.fa-pinterest-square:before { + content: "\f0d3"; +} +.fa-google-plus-square:before { + content: "\f0d4"; +} +.fa-google-plus:before { + content: "\f0d5"; +} +.fa-money:before { + content: "\f0d6"; +} +.fa-caret-down:before { + content: "\f0d7"; +} +.fa-caret-up:before { + content: "\f0d8"; +} +.fa-caret-left:before { + content: "\f0d9"; +} +.fa-caret-right:before { + content: "\f0da"; +} +.fa-columns:before { + content: "\f0db"; +} +.fa-unsorted:before, +.fa-sort:before { + content: "\f0dc"; +} +.fa-sort-down:before, +.fa-sort-desc:before { + content: "\f0dd"; +} +.fa-sort-up:before, +.fa-sort-asc:before { + content: "\f0de"; +} +.fa-envelope:before { + content: "\f0e0"; +} +.fa-linkedin:before { + content: "\f0e1"; +} +.fa-rotate-left:before, +.fa-undo:before { + content: "\f0e2"; +} +.fa-legal:before, +.fa-gavel:before { + content: "\f0e3"; +} +.fa-dashboard:before, +.fa-tachometer:before { + content: "\f0e4"; +} +.fa-comment-o:before { + content: "\f0e5"; +} +.fa-comments-o:before { + content: "\f0e6"; +} +.fa-flash:before, +.fa-bolt:before { + content: "\f0e7"; +} +.fa-sitemap:before { + content: "\f0e8"; +} +.fa-umbrella:before { + content: "\f0e9"; +} +.fa-paste:before, +.fa-clipboard:before { + content: "\f0ea"; +} +.fa-lightbulb-o:before { + content: "\f0eb"; +} +.fa-exchange:before { + content: "\f0ec"; +} +.fa-cloud-download:before { + content: "\f0ed"; +} +.fa-cloud-upload:before { + content: "\f0ee"; +} +.fa-user-md:before { + content: "\f0f0"; +} +.fa-stethoscope:before { + content: "\f0f1"; +} +.fa-suitcase:before { + content: "\f0f2"; +} +.fa-bell-o:before { + content: "\f0a2"; +} +.fa-coffee:before { + content: "\f0f4"; +} +.fa-cutlery:before { + content: "\f0f5"; +} +.fa-file-text-o:before { + content: "\f0f6"; +} +.fa-building-o:before { + content: "\f0f7"; +} +.fa-hospital-o:before { + content: "\f0f8"; +} +.fa-ambulance:before { + content: "\f0f9"; +} +.fa-medkit:before { + content: "\f0fa"; +} +.fa-fighter-jet:before { + content: "\f0fb"; +} +.fa-beer:before { + content: "\f0fc"; +} +.fa-h-square:before { + content: "\f0fd"; +} +.fa-plus-square:before { + content: "\f0fe"; +} +.fa-angle-double-left:before { + content: "\f100"; +} +.fa-angle-double-right:before { + content: "\f101"; +} +.fa-angle-double-up:before { + content: "\f102"; +} +.fa-angle-double-down:before { + content: "\f103"; +} +.fa-angle-left:before { + content: "\f104"; +} +.fa-angle-right:before { + content: "\f105"; +} +.fa-angle-up:before { + content: "\f106"; +} +.fa-angle-down:before { + content: "\f107"; +} +.fa-desktop:before { + content: "\f108"; +} +.fa-laptop:before { + content: "\f109"; +} +.fa-tablet:before { + content: "\f10a"; +} +.fa-mobile-phone:before, +.fa-mobile:before { + content: "\f10b"; +} +.fa-circle-o:before { + content: "\f10c"; +} +.fa-quote-left:before { + content: "\f10d"; +} +.fa-quote-right:before { + content: "\f10e"; +} +.fa-spinner:before { + content: "\f110"; +} +.fa-circle:before { + content: "\f111"; +} +.fa-mail-reply:before, +.fa-reply:before { + content: "\f112"; +} +.fa-github-alt:before { + content: "\f113"; +} +.fa-folder-o:before { + content: "\f114"; +} +.fa-folder-open-o:before { + content: "\f115"; +} +.fa-smile-o:before { + content: "\f118"; +} +.fa-frown-o:before { + content: "\f119"; +} +.fa-meh-o:before { + content: "\f11a"; +} +.fa-gamepad:before { + content: "\f11b"; +} +.fa-keyboard-o:before { + content: "\f11c"; +} +.fa-flag-o:before { + content: "\f11d"; +} +.fa-flag-checkered:before { + content: "\f11e"; +} +.fa-terminal:before { + content: "\f120"; +} +.fa-code:before { + content: "\f121"; +} +.fa-mail-reply-all:before, +.fa-reply-all:before { + content: "\f122"; +} +.fa-star-half-empty:before, +.fa-star-half-full:before, +.fa-star-half-o:before { + content: "\f123"; +} +.fa-location-arrow:before { + content: "\f124"; +} +.fa-crop:before { + content: "\f125"; +} +.fa-code-fork:before { + content: "\f126"; +} +.fa-unlink:before, +.fa-chain-broken:before { + content: "\f127"; +} +.fa-question:before { + content: "\f128"; +} +.fa-info:before { + content: "\f129"; +} +.fa-exclamation:before { + content: "\f12a"; +} +.fa-superscript:before { + content: "\f12b"; +} +.fa-subscript:before { + content: "\f12c"; +} +.fa-eraser:before { + content: "\f12d"; +} +.fa-puzzle-piece:before { + content: "\f12e"; +} +.fa-microphone:before { + content: "\f130"; +} +.fa-microphone-slash:before { + content: "\f131"; +} +.fa-shield:before { + content: "\f132"; +} +.fa-calendar-o:before { + content: "\f133"; +} +.fa-fire-extinguisher:before { + content: "\f134"; +} +.fa-rocket:before { + content: "\f135"; +} +.fa-maxcdn:before { + content: "\f136"; +} +.fa-chevron-circle-left:before { + content: "\f137"; +} +.fa-chevron-circle-right:before { + content: "\f138"; +} +.fa-chevron-circle-up:before { + content: "\f139"; +} +.fa-chevron-circle-down:before { + content: "\f13a"; +} +.fa-html5:before { + content: "\f13b"; +} +.fa-css3:before { + content: "\f13c"; +} +.fa-anchor:before { + content: "\f13d"; +} +.fa-unlock-alt:before { + content: "\f13e"; +} +.fa-bullseye:before { + content: "\f140"; +} +.fa-ellipsis-h:before { + content: "\f141"; +} +.fa-ellipsis-v:before { + content: "\f142"; +} +.fa-rss-square:before { + content: "\f143"; +} +.fa-play-circle:before { + content: "\f144"; +} +.fa-ticket:before { + content: "\f145"; +} +.fa-minus-square:before { + content: "\f146"; +} +.fa-minus-square-o:before { + content: "\f147"; +} +.fa-level-up:before { + content: "\f148"; +} +.fa-level-down:before { + content: "\f149"; +} +.fa-check-square:before { + content: "\f14a"; +} +.fa-pencil-square:before { + content: "\f14b"; +} +.fa-external-link-square:before { + content: "\f14c"; +} +.fa-share-square:before { + content: "\f14d"; +} +.fa-compass:before { + content: "\f14e"; +} +.fa-toggle-down:before, +.fa-caret-square-o-down:before { + content: "\f150"; +} +.fa-toggle-up:before, +.fa-caret-square-o-up:before { + content: "\f151"; +} +.fa-toggle-right:before, +.fa-caret-square-o-right:before { + content: "\f152"; +} +.fa-euro:before, +.fa-eur:before { + content: "\f153"; +} +.fa-gbp:before { + content: "\f154"; +} +.fa-dollar:before, +.fa-usd:before { + content: "\f155"; +} +.fa-rupee:before, +.fa-inr:before { + content: "\f156"; +} +.fa-cny:before, +.fa-rmb:before, +.fa-yen:before, +.fa-jpy:before { + content: "\f157"; +} +.fa-ruble:before, +.fa-rouble:before, +.fa-rub:before { + content: "\f158"; +} +.fa-won:before, +.fa-krw:before { + content: "\f159"; +} +.fa-bitcoin:before, +.fa-btc:before { + content: "\f15a"; +} +.fa-file:before { + content: "\f15b"; +} +.fa-file-text:before { + content: "\f15c"; +} +.fa-sort-alpha-asc:before { + content: "\f15d"; +} +.fa-sort-alpha-desc:before { + content: "\f15e"; +} +.fa-sort-amount-asc:before { + content: "\f160"; +} +.fa-sort-amount-desc:before { + content: "\f161"; +} +.fa-sort-numeric-asc:before { + content: "\f162"; +} +.fa-sort-numeric-desc:before { + content: "\f163"; +} +.fa-thumbs-up:before { + content: "\f164"; +} +.fa-thumbs-down:before { + content: "\f165"; +} +.fa-youtube-square:before { + content: "\f166"; +} +.fa-youtube:before { + content: "\f167"; +} +.fa-xing:before { + content: "\f168"; +} +.fa-xing-square:before { + content: "\f169"; +} +.fa-youtube-play:before { + content: "\f16a"; +} +.fa-dropbox:before { + content: "\f16b"; +} +.fa-stack-overflow:before { + content: "\f16c"; +} +.fa-instagram:before { + content: "\f16d"; +} +.fa-flickr:before { + content: "\f16e"; +} +.fa-adn:before { + content: "\f170"; +} +.fa-bitbucket:before { + content: "\f171"; +} +.fa-bitbucket-square:before { + content: "\f172"; +} +.fa-tumblr:before { + content: "\f173"; +} +.fa-tumblr-square:before { + content: "\f174"; +} +.fa-long-arrow-down:before { + content: "\f175"; +} +.fa-long-arrow-up:before { + content: "\f176"; +} +.fa-long-arrow-left:before { + content: "\f177"; +} +.fa-long-arrow-right:before { + content: "\f178"; +} +.fa-apple:before { + content: "\f179"; +} +.fa-windows:before { + content: "\f17a"; +} +.fa-android:before { + content: "\f17b"; +} +.fa-linux:before { + content: "\f17c"; +} +.fa-dribbble:before { + content: "\f17d"; +} +.fa-skype:before { + content: "\f17e"; +} +.fa-foursquare:before { + content: "\f180"; +} +.fa-trello:before { + content: "\f181"; +} +.fa-female:before { + content: "\f182"; +} +.fa-male:before { + content: "\f183"; +} +.fa-gittip:before, +.fa-gratipay:before { + content: "\f184"; +} +.fa-sun-o:before { + content: "\f185"; +} +.fa-moon-o:before { + content: "\f186"; +} +.fa-archive:before { + content: "\f187"; +} +.fa-bug:before { + content: "\f188"; +} +.fa-vk:before { + content: "\f189"; +} +.fa-weibo:before { + content: "\f18a"; +} +.fa-renren:before { + content: "\f18b"; +} +.fa-pagelines:before { + content: "\f18c"; +} +.fa-stack-exchange:before { + content: "\f18d"; +} +.fa-arrow-circle-o-right:before { + content: "\f18e"; +} +.fa-arrow-circle-o-left:before { + content: "\f190"; +} +.fa-toggle-left:before, +.fa-caret-square-o-left:before { + content: "\f191"; +} +.fa-dot-circle-o:before { + content: "\f192"; +} +.fa-wheelchair:before { + content: "\f193"; +} +.fa-vimeo-square:before { + content: "\f194"; +} +.fa-turkish-lira:before, +.fa-try:before { + content: "\f195"; +} +.fa-plus-square-o:before { + content: "\f196"; +} +.fa-space-shuttle:before { + content: "\f197"; +} +.fa-slack:before { + content: "\f198"; +} +.fa-envelope-square:before { + content: "\f199"; +} +.fa-wordpress:before { + content: "\f19a"; +} +.fa-openid:before { + content: "\f19b"; +} +.fa-institution:before, +.fa-bank:before, +.fa-university:before { + content: "\f19c"; +} +.fa-mortar-board:before, +.fa-graduation-cap:before { + content: "\f19d"; +} +.fa-yahoo:before { + content: "\f19e"; +} +.fa-google:before { + content: "\f1a0"; +} +.fa-reddit:before { + content: "\f1a1"; +} +.fa-reddit-square:before { + content: "\f1a2"; +} +.fa-stumbleupon-circle:before { + content: "\f1a3"; +} +.fa-stumbleupon:before { + content: "\f1a4"; +} +.fa-delicious:before { + content: "\f1a5"; +} +.fa-digg:before { + content: "\f1a6"; +} +.fa-pied-piper:before { + content: "\f1a7"; +} +.fa-pied-piper-alt:before { + content: "\f1a8"; +} +.fa-drupal:before { + content: "\f1a9"; +} +.fa-joomla:before { + content: "\f1aa"; +} +.fa-language:before { + content: "\f1ab"; +} +.fa-fax:before { + content: "\f1ac"; +} +.fa-building:before { + content: "\f1ad"; +} +.fa-child:before { + content: "\f1ae"; +} +.fa-paw:before { + content: "\f1b0"; +} +.fa-spoon:before { + content: "\f1b1"; +} +.fa-cube:before { + content: "\f1b2"; +} +.fa-cubes:before { + content: "\f1b3"; +} +.fa-behance:before { + content: "\f1b4"; +} +.fa-behance-square:before { + content: "\f1b5"; +} +.fa-steam:before { + content: "\f1b6"; +} +.fa-steam-square:before { + content: "\f1b7"; +} +.fa-recycle:before { + content: "\f1b8"; +} +.fa-automobile:before, +.fa-car:before { + content: "\f1b9"; +} +.fa-cab:before, +.fa-taxi:before { + content: "\f1ba"; +} +.fa-tree:before { + content: "\f1bb"; +} +.fa-spotify:before { + content: "\f1bc"; +} +.fa-deviantart:before { + content: "\f1bd"; +} +.fa-soundcloud:before { + content: "\f1be"; +} +.fa-database:before { + content: "\f1c0"; +} +.fa-file-pdf-o:before { + content: "\f1c1"; +} +.fa-file-word-o:before { + content: "\f1c2"; +} +.fa-file-excel-o:before { + content: "\f1c3"; +} +.fa-file-powerpoint-o:before { + content: "\f1c4"; +} +.fa-file-photo-o:before, +.fa-file-picture-o:before, +.fa-file-image-o:before { + content: "\f1c5"; +} +.fa-file-zip-o:before, +.fa-file-archive-o:before { + content: "\f1c6"; +} +.fa-file-sound-o:before, +.fa-file-audio-o:before { + content: "\f1c7"; +} +.fa-file-movie-o:before, +.fa-file-video-o:before { + content: "\f1c8"; +} +.fa-file-code-o:before { + content: "\f1c9"; +} +.fa-vine:before { + content: "\f1ca"; +} +.fa-codepen:before { + content: "\f1cb"; +} +.fa-jsfiddle:before { + content: "\f1cc"; +} +.fa-life-bouy:before, +.fa-life-buoy:before, +.fa-life-saver:before, +.fa-support:before, +.fa-life-ring:before { + content: "\f1cd"; +} +.fa-circle-o-notch:before { + content: "\f1ce"; +} +.fa-ra:before, +.fa-rebel:before { + content: "\f1d0"; +} +.fa-ge:before, +.fa-empire:before { + content: "\f1d1"; +} +.fa-git-square:before { + content: "\f1d2"; +} +.fa-git:before { + content: "\f1d3"; +} +.fa-y-combinator-square:before, +.fa-yc-square:before, +.fa-hacker-news:before { + content: "\f1d4"; +} +.fa-tencent-weibo:before { + content: "\f1d5"; +} +.fa-qq:before { + content: "\f1d6"; +} +.fa-wechat:before, +.fa-weixin:before { + content: "\f1d7"; +} +.fa-send:before, +.fa-paper-plane:before { + content: "\f1d8"; +} +.fa-send-o:before, +.fa-paper-plane-o:before { + content: "\f1d9"; +} +.fa-history:before { + content: "\f1da"; +} +.fa-circle-thin:before { + content: "\f1db"; +} +.fa-header:before { + content: "\f1dc"; +} +.fa-paragraph:before { + content: "\f1dd"; +} +.fa-sliders:before { + content: "\f1de"; +} +.fa-share-alt:before { + content: "\f1e0"; +} +.fa-share-alt-square:before { + content: "\f1e1"; +} +.fa-bomb:before { + content: "\f1e2"; +} +.fa-soccer-ball-o:before, +.fa-futbol-o:before { + content: "\f1e3"; +} +.fa-tty:before { + content: "\f1e4"; +} +.fa-binoculars:before { + content: "\f1e5"; +} +.fa-plug:before { + content: "\f1e6"; +} +.fa-slideshare:before { + content: "\f1e7"; +} +.fa-twitch:before { + content: "\f1e8"; +} +.fa-yelp:before { + content: "\f1e9"; +} +.fa-newspaper-o:before { + content: "\f1ea"; +} +.fa-wifi:before { + content: "\f1eb"; +} +.fa-calculator:before { + content: "\f1ec"; +} +.fa-paypal:before { + content: "\f1ed"; +} +.fa-google-wallet:before { + content: "\f1ee"; +} +.fa-cc-visa:before { + content: "\f1f0"; +} +.fa-cc-mastercard:before { + content: "\f1f1"; +} +.fa-cc-discover:before { + content: "\f1f2"; +} +.fa-cc-amex:before { + content: "\f1f3"; +} +.fa-cc-paypal:before { + content: "\f1f4"; +} +.fa-cc-stripe:before { + content: "\f1f5"; +} +.fa-bell-slash:before { + content: "\f1f6"; +} +.fa-bell-slash-o:before { + content: "\f1f7"; +} +.fa-trash:before { + content: "\f1f8"; +} +.fa-copyright:before { + content: "\f1f9"; +} +.fa-at:before { + content: "\f1fa"; +} +.fa-eyedropper:before { + content: "\f1fb"; +} +.fa-paint-brush:before { + content: "\f1fc"; +} +.fa-birthday-cake:before { + content: "\f1fd"; +} +.fa-area-chart:before { + content: "\f1fe"; +} +.fa-pie-chart:before { + content: "\f200"; +} +.fa-line-chart:before { + content: "\f201"; +} +.fa-lastfm:before { + content: "\f202"; +} +.fa-lastfm-square:before { + content: "\f203"; +} +.fa-toggle-off:before { + content: "\f204"; +} +.fa-toggle-on:before { + content: "\f205"; +} +.fa-bicycle:before { + content: "\f206"; +} +.fa-bus:before { + content: "\f207"; +} +.fa-ioxhost:before { + content: "\f208"; +} +.fa-angellist:before { + content: "\f209"; +} +.fa-cc:before { + content: "\f20a"; +} +.fa-shekel:before, +.fa-sheqel:before, +.fa-ils:before { + content: "\f20b"; +} +.fa-meanpath:before { + content: "\f20c"; +} +.fa-buysellads:before { + content: "\f20d"; +} +.fa-connectdevelop:before { + content: "\f20e"; +} +.fa-dashcube:before { + content: "\f210"; +} +.fa-forumbee:before { + content: "\f211"; +} +.fa-leanpub:before { + content: "\f212"; +} +.fa-sellsy:before { + content: "\f213"; +} +.fa-shirtsinbulk:before { + content: "\f214"; +} +.fa-simplybuilt:before { + content: "\f215"; +} +.fa-skyatlas:before { + content: "\f216"; +} +.fa-cart-plus:before { + content: "\f217"; +} +.fa-cart-arrow-down:before { + content: "\f218"; +} +.fa-diamond:before { + content: "\f219"; +} +.fa-ship:before { + content: "\f21a"; +} +.fa-user-secret:before { + content: "\f21b"; +} +.fa-motorcycle:before { + content: "\f21c"; +} +.fa-street-view:before { + content: "\f21d"; +} +.fa-heartbeat:before { + content: "\f21e"; +} +.fa-venus:before { + content: "\f221"; +} +.fa-mars:before { + content: "\f222"; +} +.fa-mercury:before { + content: "\f223"; +} +.fa-intersex:before, +.fa-transgender:before { + content: "\f224"; +} +.fa-transgender-alt:before { + content: "\f225"; +} +.fa-venus-double:before { + content: "\f226"; +} +.fa-mars-double:before { + content: "\f227"; +} +.fa-venus-mars:before { + content: "\f228"; +} +.fa-mars-stroke:before { + content: "\f229"; +} +.fa-mars-stroke-v:before { + content: "\f22a"; +} +.fa-mars-stroke-h:before { + content: "\f22b"; +} +.fa-neuter:before { + content: "\f22c"; +} +.fa-genderless:before { + content: "\f22d"; +} +.fa-facebook-official:before { + content: "\f230"; +} +.fa-pinterest-p:before { + content: "\f231"; +} +.fa-whatsapp:before { + content: "\f232"; +} +.fa-server:before { + content: "\f233"; +} +.fa-user-plus:before { + content: "\f234"; +} +.fa-user-times:before { + content: "\f235"; +} +.fa-hotel:before, +.fa-bed:before { + content: "\f236"; +} +.fa-viacoin:before { + content: "\f237"; +} +.fa-train:before { + content: "\f238"; +} +.fa-subway:before { + content: "\f239"; +} +.fa-medium:before { + content: "\f23a"; +} +.fa-yc:before, +.fa-y-combinator:before { + content: "\f23b"; +} +.fa-optin-monster:before { + content: "\f23c"; +} +.fa-opencart:before { + content: "\f23d"; +} +.fa-expeditedssl:before { + content: "\f23e"; +} +.fa-battery-4:before, +.fa-battery-full:before { + content: "\f240"; +} +.fa-battery-3:before, +.fa-battery-three-quarters:before { + content: "\f241"; +} +.fa-battery-2:before, +.fa-battery-half:before { + content: "\f242"; +} +.fa-battery-1:before, +.fa-battery-quarter:before { + content: "\f243"; +} +.fa-battery-0:before, +.fa-battery-empty:before { + content: "\f244"; +} +.fa-mouse-pointer:before { + content: "\f245"; +} +.fa-i-cursor:before { + content: "\f246"; +} +.fa-object-group:before { + content: "\f247"; +} +.fa-object-ungroup:before { + content: "\f248"; +} +.fa-sticky-note:before { + content: "\f249"; +} +.fa-sticky-note-o:before { + content: "\f24a"; +} +.fa-cc-jcb:before { + content: "\f24b"; +} +.fa-cc-diners-club:before { + content: "\f24c"; +} +.fa-clone:before { + content: "\f24d"; +} +.fa-balance-scale:before { + content: "\f24e"; +} +.fa-hourglass-o:before { + content: "\f250"; +} +.fa-hourglass-1:before, +.fa-hourglass-start:before { + content: "\f251"; +} +.fa-hourglass-2:before, +.fa-hourglass-half:before { + content: "\f252"; +} +.fa-hourglass-3:before, +.fa-hourglass-end:before { + content: "\f253"; +} +.fa-hourglass:before { + content: "\f254"; +} +.fa-hand-grab-o:before, +.fa-hand-rock-o:before { + content: "\f255"; +} +.fa-hand-stop-o:before, +.fa-hand-paper-o:before { + content: "\f256"; +} +.fa-hand-scissors-o:before { + content: "\f257"; +} +.fa-hand-lizard-o:before { + content: "\f258"; +} +.fa-hand-spock-o:before { + content: "\f259"; +} +.fa-hand-pointer-o:before { + content: "\f25a"; +} +.fa-hand-peace-o:before { + content: "\f25b"; +} +.fa-trademark:before { + content: "\f25c"; +} +.fa-registered:before { + content: "\f25d"; +} +.fa-creative-commons:before { + content: "\f25e"; +} +.fa-gg:before { + content: "\f260"; +} +.fa-gg-circle:before { + content: "\f261"; +} +.fa-tripadvisor:before { + content: "\f262"; +} +.fa-odnoklassniki:before { + content: "\f263"; +} +.fa-odnoklassniki-square:before { + content: "\f264"; +} +.fa-get-pocket:before { + content: "\f265"; +} +.fa-wikipedia-w:before { + content: "\f266"; +} +.fa-safari:before { + content: "\f267"; +} +.fa-chrome:before { + content: "\f268"; +} +.fa-firefox:before { + content: "\f269"; +} +.fa-opera:before { + content: "\f26a"; +} +.fa-internet-explorer:before { + content: "\f26b"; +} +.fa-tv:before, +.fa-television:before { + content: "\f26c"; +} +.fa-contao:before { + content: "\f26d"; +} +.fa-500px:before { + content: "\f26e"; +} +.fa-amazon:before { + content: "\f270"; +} +.fa-calendar-plus-o:before { + content: "\f271"; +} +.fa-calendar-minus-o:before { + content: "\f272"; +} +.fa-calendar-times-o:before { + content: "\f273"; +} +.fa-calendar-check-o:before { + content: "\f274"; +} +.fa-industry:before { + content: "\f275"; +} +.fa-map-pin:before { + content: "\f276"; +} +.fa-map-signs:before { + content: "\f277"; +} +.fa-map-o:before { + content: "\f278"; +} +.fa-map:before { + content: "\f279"; +} +.fa-commenting:before { + content: "\f27a"; +} +.fa-commenting-o:before { + content: "\f27b"; +} +.fa-houzz:before { + content: "\f27c"; +} +.fa-vimeo:before { + content: "\f27d"; +} +.fa-black-tie:before { + content: "\f27e"; +} +.fa-fonticons:before { + content: "\f280"; +} +.fa-reddit-alien:before { + content: "\f281"; +} +.fa-edge:before { + content: "\f282"; +} +.fa-credit-card-alt:before { + content: "\f283"; +} +.fa-codiepie:before { + content: "\f284"; +} +.fa-modx:before { + content: "\f285"; +} +.fa-fort-awesome:before { + content: "\f286"; +} +.fa-usb:before { + content: "\f287"; +} +.fa-product-hunt:before { + content: "\f288"; +} +.fa-mixcloud:before { + content: "\f289"; +} +.fa-scribd:before { + content: "\f28a"; +} +.fa-pause-circle:before { + content: "\f28b"; +} +.fa-pause-circle-o:before { + content: "\f28c"; +} +.fa-stop-circle:before { + content: "\f28d"; +} +.fa-stop-circle-o:before { + content: "\f28e"; +} +.fa-shopping-bag:before { + content: "\f290"; +} +.fa-shopping-basket:before { + content: "\f291"; +} +.fa-hashtag:before { + content: "\f292"; +} +.fa-bluetooth:before { + content: "\f293"; +} +.fa-bluetooth-b:before { + content: "\f294"; +} +.fa-percent:before { + content: "\f295"; +} diff --git a/pigx-register/src/main/resources/static/console-ui/public/css/fonts/aliyun-console-font.eot b/pigx-register/src/main/resources/static/console-ui/public/css/fonts/aliyun-console-font.eot new file mode 100644 index 0000000..df84394 Binary files /dev/null and b/pigx-register/src/main/resources/static/console-ui/public/css/fonts/aliyun-console-font.eot differ diff --git a/pigx-register/src/main/resources/static/console-ui/public/css/fonts/aliyun-console-font.ttf b/pigx-register/src/main/resources/static/console-ui/public/css/fonts/aliyun-console-font.ttf new file mode 100644 index 0000000..a765a05 Binary files /dev/null and b/pigx-register/src/main/resources/static/console-ui/public/css/fonts/aliyun-console-font.ttf differ diff --git a/pigx-register/src/main/resources/static/console-ui/public/css/fonts/aliyun-console-font.woff b/pigx-register/src/main/resources/static/console-ui/public/css/fonts/aliyun-console-font.woff new file mode 100644 index 0000000..34fc568 Binary files /dev/null and b/pigx-register/src/main/resources/static/console-ui/public/css/fonts/aliyun-console-font.woff differ diff --git a/pigx-register/src/main/resources/static/console-ui/public/css/fonts/font_515771_emcns5054x3whfr.ttf b/pigx-register/src/main/resources/static/console-ui/public/css/fonts/font_515771_emcns5054x3whfr.ttf new file mode 100644 index 0000000..95551f3 Binary files /dev/null and b/pigx-register/src/main/resources/static/console-ui/public/css/fonts/font_515771_emcns5054x3whfr.ttf differ diff --git a/pigx-register/src/main/resources/static/console-ui/public/css/fonts/font_515771_emcns5054x3whfr.woff b/pigx-register/src/main/resources/static/console-ui/public/css/fonts/font_515771_emcns5054x3whfr.woff new file mode 100644 index 0000000..9487bb6 Binary files /dev/null and b/pigx-register/src/main/resources/static/console-ui/public/css/fonts/font_515771_emcns5054x3whfr.woff differ diff --git a/pigx-register/src/main/resources/static/console-ui/public/css/fonts/roboto-bold.ttf b/pigx-register/src/main/resources/static/console-ui/public/css/fonts/roboto-bold.ttf new file mode 100644 index 0000000..cbe70c8 Binary files /dev/null and b/pigx-register/src/main/resources/static/console-ui/public/css/fonts/roboto-bold.ttf differ diff --git a/pigx-register/src/main/resources/static/console-ui/public/css/fonts/roboto-bold.woff b/pigx-register/src/main/resources/static/console-ui/public/css/fonts/roboto-bold.woff new file mode 100644 index 0000000..b14ec18 Binary files /dev/null and b/pigx-register/src/main/resources/static/console-ui/public/css/fonts/roboto-bold.woff differ diff --git a/pigx-register/src/main/resources/static/console-ui/public/css/fonts/roboto-bold.woff2 b/pigx-register/src/main/resources/static/console-ui/public/css/fonts/roboto-bold.woff2 new file mode 100644 index 0000000..9fd172f Binary files /dev/null and b/pigx-register/src/main/resources/static/console-ui/public/css/fonts/roboto-bold.woff2 differ diff --git a/pigx-register/src/main/resources/static/console-ui/public/css/fonts/roboto-regular.ttf b/pigx-register/src/main/resources/static/console-ui/public/css/fonts/roboto-regular.ttf new file mode 100644 index 0000000..695e4d4 Binary files /dev/null and b/pigx-register/src/main/resources/static/console-ui/public/css/fonts/roboto-regular.ttf differ diff --git a/pigx-register/src/main/resources/static/console-ui/public/css/fonts/roboto-regular.woff b/pigx-register/src/main/resources/static/console-ui/public/css/fonts/roboto-regular.woff new file mode 100644 index 0000000..b41d905 Binary files /dev/null and b/pigx-register/src/main/resources/static/console-ui/public/css/fonts/roboto-regular.woff differ diff --git a/pigx-register/src/main/resources/static/console-ui/public/css/fonts/roboto-regular.woff2 b/pigx-register/src/main/resources/static/console-ui/public/css/fonts/roboto-regular.woff2 new file mode 100644 index 0000000..74b5d0e Binary files /dev/null and b/pigx-register/src/main/resources/static/console-ui/public/css/fonts/roboto-regular.woff2 differ diff --git a/pigx-register/src/main/resources/static/console-ui/public/css/icon.css b/pigx-register/src/main/resources/static/console-ui/public/css/icon.css new file mode 100644 index 0000000..99faccf --- /dev/null +++ b/pigx-register/src/main/resources/static/console-ui/public/css/icon.css @@ -0,0 +1,265 @@ +/* + * Copyright 1999-2018 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@font-face { + /*无边框*/ + font-family: "iconfont-1"; + src: url('icon1/iconfont.eot?t=1458627591'); /* IE9*/ + src: url('icon1/iconfont.eot?t=1458627591#iefix') format('embedded-opentype'), /* IE6-IE8 */ url('icon1/iconfont.woff?t=1458627591') format('woff'), /* chrome, firefox */ url('icon1/iconfont.ttf?t=1458627591') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/ url('icon1/iconfont.svg?t=1458627591#iconfont') format('svg'); /* iOS 4.1- */ +} + +@font-face { + /*有边框*/ + font-family: "iconfont-2"; + src: url('icon/iconfont.eot'); /* IE9*/ + src: url('icon/iconfont.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ url('icon/iconfont.woff') format('woff'), /* chrome, firefox */ url('icon/iconfont.ttf') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/ url('icon/iconfont.svg#iconfont') format('svg'); /* iOS 4.1- */ +} + +.iconfont { + /* 有边框 */ + font-family: "iconfont" !important; + font-size: 16px; + font-style: normal; + -webkit-font-smoothing: antialiased; + -webkit-text-stroke-width: 0.2px; + -moz-osx-font-smoothing: grayscale; +} + +.iconfont-1 { + /*无边框*/ + + font-family: "iconfont-1" !important; + font-size: 16px; + font-style: normal; + -webkit-font-smoothing: antialiased; + -webkit-text-stroke-width: 0.2px; + -moz-osx-font-smoothing: grayscale; +} + +.iconfont-2 { + /*有边框*/ + font-family: "iconfont-2" !important; + font-size: 16px; + font-style: normal; + -webkit-font-smoothing: antialiased; + -webkit-text-stroke-width: 0.2px; + -moz-osx-font-smoothing: grayscale; +} + +.logo { + +} + +.panel-logo { + padding-right: 2px; + font-size: 18px; + display: inline-block; + color: #333; +} + +.icon-lg { + font-size: 80px !important; +} + +.icon-size-md { + font-size: 40px !important; + vertical-align: middle; +} + +.icon-size-lg { + font-size: 80px !important; + vertical-align: middle; +} + +.icon-hsf:before { + content: "\e62f" !important; +} + +.icon-rocketmq:before { + content: "\e632" !important; +} + +.icon-notify:before { + content: "\e61e" !important; +} + +.icon-tddl:before { + content: "\e61e" !important; +} + +.icon-pandora:before { + content: "\e622" !important; +} + +.icon-ailtomcat:before { + content: "\e628" !important; +} + +.icon-configserver:before { + content: "\e61e" !important; +} + +.icon-diamondserver:before { + content: "\e62a" !important; +} + +.icon-vipserver:before { + content: "\e625" !important; +} + +.icon-eagleeye:before { + content: "\e62c" !important; +} + +.icon-tengine:before { + content: "\e635" !important; +} + +.icon-tair:before { + content: "\e634" !important; +} + +.icon-hbase:before { + content: "\e62d" !important; +} + +.icon-jstorm:before { + content: "\e627" !important; +} + +.icon-histore:before { + content: "\e62e" !important; +} + +.icon-jingwei:before { + content: "\e61e" !important; +} + +.icon-txc:before { + content: "\e636" !important; +} + +.icon-edas:before { + content: "\e620" !important; +} + +.icon-csb:before { + content: "\e61e" !important; +} + +.icon-ons:before { + content: "\e630" !important; +} + +.icon-drds:before { + content: "\e61f" !important; +} + +.icon-duct:before { + content: "\e62b" !important; +} + +.icon-amazon:before { + content: "\e61e" !important; +} + +.icon-autoload:before { + content: "\e61e" !important; +} + +.icon-switch:before { + content: "\e633" !important; +} + +.icon-sentinel:before { + content: "\e623" !important; +} + +.icon-preplan:before { + content: "\e631" !important; +} + +.icon-moses:before { + content: "\e61e" !important; +} + +.icon-zeus:before { + content: "\e61e" !important; +} + +.icon-athena:before { + content: "\e61e" !important; +} + +.icon-bcp:before { + content: "\e61e" !important; +} + +.icon-lark:before { + content: "\e61e" !important; +} + +.icon-nest:before { + content: "\e61e" !important; +} + +.icon-monkeyking:before { + content: "\e61e" !important; +} + +.icon-tab:before { + content: "\e61e" !important; +} + +.icon-oceanus:before { + content: "\e61e" !important; +} + +.icon-eos :before { + content: "\e61e" !important; +} + +.icon-sonar:before { + content: "\e61e" !important; +} + +.icon-ai:before { + content: "\e605" !important; +} + +.icon-hotcode:before { + content: "\e621" !important; +} + +.icon-taokeeper:before { + content: "\e624" !important; +} + +.icon-mdl:before { + content: "\e61e" !important; +} + +.icon-mw:before { + content: "\e61e" !important; +} + +.icon-default:before { + content: "\e607" !important; +} + +.icon-alitomcat:before { + content: "\e607" !important; +} diff --git a/pigx-register/src/main/resources/static/console-ui/public/css/merge.css b/pigx-register/src/main/resources/static/console-ui/public/css/merge.css new file mode 100644 index 0000000..a764a98 --- /dev/null +++ b/pigx-register/src/main/resources/static/console-ui/public/css/merge.css @@ -0,0 +1,129 @@ +/* + * Copyright 1999-2018 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +.CodeMirror-merge { + position: relative; + border: 1px solid #ddd; + white-space: pre; +} + +.CodeMirror-merge, .CodeMirror-merge .CodeMirror { + height: 350px; +} + +.CodeMirror-merge-2pane .CodeMirror-merge-pane { width: 47%; } +.CodeMirror-merge-2pane .CodeMirror-merge-gap { width: 6%; } +.CodeMirror-merge-3pane .CodeMirror-merge-pane { width: 31%; } +.CodeMirror-merge-3pane .CodeMirror-merge-gap { width: 3.5%; } + +.CodeMirror-merge-pane { + display: inline-block; + white-space: normal; + vertical-align: top; +} +.CodeMirror-merge-pane-rightmost { + position: absolute; + right: 0px; + z-index: 1; +} + +.CodeMirror-merge-gap { + z-index: 2; + display: inline-block; + height: 100%; + -moz-box-sizing: border-box; + box-sizing: border-box; + overflow: hidden; + border-left: 1px solid #ddd; + border-right: 1px solid #ddd; + position: relative; + background: #f8f8f8; +} + +.CodeMirror-merge-scrolllock-wrap { + position: absolute; + bottom: 0; left: 50%; +} +.CodeMirror-merge-scrolllock { + position: relative; + left: -50%; + cursor: pointer; + color: #555; + line-height: 1; +} + +.CodeMirror-merge-copybuttons-left, .CodeMirror-merge-copybuttons-right { + position: absolute; + left: 0; top: 0; + right: 0; bottom: 0; + line-height: 1; +} + +.CodeMirror-merge-copy { + position: absolute; + cursor: pointer; + color: #44c; + z-index: 3; +} + +.CodeMirror-merge-copy-reverse { + position: absolute; + cursor: pointer; + color: #44c; +} + +.CodeMirror-merge-copybuttons-left .CodeMirror-merge-copy { left: 2px; } +.CodeMirror-merge-copybuttons-right .CodeMirror-merge-copy { right: 2px; } + +.CodeMirror-merge-r-inserted, .CodeMirror-merge-l-inserted { + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAACCAYAAACddGYaAAAAGUlEQVQI12MwuCXy3+CWyH8GBgYGJgYkAABZbAQ9ELXurwAAAABJRU5ErkJggg==); + background-position: bottom left; + background-repeat: repeat-x; +} + +.CodeMirror-merge-r-deleted, .CodeMirror-merge-l-deleted { + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAACCAYAAACddGYaAAAAGUlEQVQI12M4Kyb2/6yY2H8GBgYGJgYkAABURgPz6Ks7wQAAAABJRU5ErkJggg==); + background-position: bottom left; + background-repeat: repeat-x; +} + +.CodeMirror-merge-r-chunk { background: #ffffe0; } +.CodeMirror-merge-r-chunk-start { border-top: 1px solid #ee8; } +.CodeMirror-merge-r-chunk-end { border-bottom: 1px solid #ee8; } +.CodeMirror-merge-r-connect { fill: #ffffe0; stroke: #ee8; stroke-width: 1px; } + +.CodeMirror-merge-l-chunk { background: #eef; } +.CodeMirror-merge-l-chunk-start { border-top: 1px solid #88e; } +.CodeMirror-merge-l-chunk-end { border-bottom: 1px solid #88e; } +.CodeMirror-merge-l-connect { fill: #eef; stroke: #88e; stroke-width: 1px; } + +.CodeMirror-merge-l-chunk.CodeMirror-merge-r-chunk { background: #dfd; } +.CodeMirror-merge-l-chunk-start.CodeMirror-merge-r-chunk-start { border-top: 1px solid #4e4; } +.CodeMirror-merge-l-chunk-end.CodeMirror-merge-r-chunk-end { border-bottom: 1px solid #4e4; } + +.CodeMirror-merge-collapsed-widget:before { + content: "(...)"; +} +.CodeMirror-merge-collapsed-widget { + cursor: pointer; + color: #88b; + background: #eef; + border: 1px solid #ddf; + font-size: 90%; + padding: 0 3px; + border-radius: 4px; +} +.CodeMirror-merge-collapsed-line .CodeMirror-gutter-elt { display: none; } diff --git a/pigx-register/src/main/resources/static/console-ui/public/fonts/font_1533967_slipq25tezj.ttf b/pigx-register/src/main/resources/static/console-ui/public/fonts/font_1533967_slipq25tezj.ttf new file mode 100644 index 0000000..40cb59e Binary files /dev/null and b/pigx-register/src/main/resources/static/console-ui/public/fonts/font_1533967_slipq25tezj.ttf differ diff --git a/pigx-register/src/main/resources/static/console-ui/public/fonts/font_1533967_slipq25tezj.woff b/pigx-register/src/main/resources/static/console-ui/public/fonts/font_1533967_slipq25tezj.woff new file mode 100644 index 0000000..8ac144a Binary files /dev/null and b/pigx-register/src/main/resources/static/console-ui/public/fonts/font_1533967_slipq25tezj.woff differ diff --git a/pigx-register/src/main/resources/static/console-ui/public/fonts/font_1533967_slipq25tezj.woff2 b/pigx-register/src/main/resources/static/console-ui/public/fonts/font_1533967_slipq25tezj.woff2 new file mode 100644 index 0000000..931e3f3 Binary files /dev/null and b/pigx-register/src/main/resources/static/console-ui/public/fonts/font_1533967_slipq25tezj.woff2 differ diff --git a/pigx-register/src/main/resources/static/console-ui/public/fonts/roboto-bold.eot b/pigx-register/src/main/resources/static/console-ui/public/fonts/roboto-bold.eot new file mode 100644 index 0000000..f5d0715 Binary files /dev/null and b/pigx-register/src/main/resources/static/console-ui/public/fonts/roboto-bold.eot differ diff --git a/pigx-register/src/main/resources/static/console-ui/public/fonts/roboto-bold.ttf b/pigx-register/src/main/resources/static/console-ui/public/fonts/roboto-bold.ttf new file mode 100644 index 0000000..cbe70c8 Binary files /dev/null and b/pigx-register/src/main/resources/static/console-ui/public/fonts/roboto-bold.ttf differ diff --git a/pigx-register/src/main/resources/static/console-ui/public/fonts/roboto-bold.woff b/pigx-register/src/main/resources/static/console-ui/public/fonts/roboto-bold.woff new file mode 100644 index 0000000..b14ec18 Binary files /dev/null and b/pigx-register/src/main/resources/static/console-ui/public/fonts/roboto-bold.woff differ diff --git a/pigx-register/src/main/resources/static/console-ui/public/fonts/roboto-bold.woff2 b/pigx-register/src/main/resources/static/console-ui/public/fonts/roboto-bold.woff2 new file mode 100644 index 0000000..9fd172f Binary files /dev/null and b/pigx-register/src/main/resources/static/console-ui/public/fonts/roboto-bold.woff2 differ diff --git a/pigx-register/src/main/resources/static/console-ui/public/fonts/roboto-light.eot b/pigx-register/src/main/resources/static/console-ui/public/fonts/roboto-light.eot new file mode 100644 index 0000000..6d239a9 Binary files /dev/null and b/pigx-register/src/main/resources/static/console-ui/public/fonts/roboto-light.eot differ diff --git a/pigx-register/src/main/resources/static/console-ui/public/fonts/roboto-light.ttf b/pigx-register/src/main/resources/static/console-ui/public/fonts/roboto-light.ttf new file mode 100644 index 0000000..c1c59d2 Binary files /dev/null and b/pigx-register/src/main/resources/static/console-ui/public/fonts/roboto-light.ttf differ diff --git a/pigx-register/src/main/resources/static/console-ui/public/fonts/roboto-light.woff b/pigx-register/src/main/resources/static/console-ui/public/fonts/roboto-light.woff new file mode 100644 index 0000000..381b92a Binary files /dev/null and b/pigx-register/src/main/resources/static/console-ui/public/fonts/roboto-light.woff differ diff --git a/pigx-register/src/main/resources/static/console-ui/public/fonts/roboto-light.woff2 b/pigx-register/src/main/resources/static/console-ui/public/fonts/roboto-light.woff2 new file mode 100644 index 0000000..d643829 Binary files /dev/null and b/pigx-register/src/main/resources/static/console-ui/public/fonts/roboto-light.woff2 differ diff --git a/pigx-register/src/main/resources/static/console-ui/public/fonts/roboto-medium.eot b/pigx-register/src/main/resources/static/console-ui/public/fonts/roboto-medium.eot new file mode 100644 index 0000000..b80d4a4 Binary files /dev/null and b/pigx-register/src/main/resources/static/console-ui/public/fonts/roboto-medium.eot differ diff --git a/pigx-register/src/main/resources/static/console-ui/public/fonts/roboto-medium.ttf b/pigx-register/src/main/resources/static/console-ui/public/fonts/roboto-medium.ttf new file mode 100644 index 0000000..f0bfe55 Binary files /dev/null and b/pigx-register/src/main/resources/static/console-ui/public/fonts/roboto-medium.ttf differ diff --git a/pigx-register/src/main/resources/static/console-ui/public/fonts/roboto-medium.woff b/pigx-register/src/main/resources/static/console-ui/public/fonts/roboto-medium.woff new file mode 100644 index 0000000..f5bd71c Binary files /dev/null and b/pigx-register/src/main/resources/static/console-ui/public/fonts/roboto-medium.woff differ diff --git a/pigx-register/src/main/resources/static/console-ui/public/fonts/roboto-medium.woff2 b/pigx-register/src/main/resources/static/console-ui/public/fonts/roboto-medium.woff2 new file mode 100644 index 0000000..2f2c83b Binary files /dev/null and b/pigx-register/src/main/resources/static/console-ui/public/fonts/roboto-medium.woff2 differ diff --git a/pigx-register/src/main/resources/static/console-ui/public/fonts/roboto-regular.eot b/pigx-register/src/main/resources/static/console-ui/public/fonts/roboto-regular.eot new file mode 100644 index 0000000..2db1202 Binary files /dev/null and b/pigx-register/src/main/resources/static/console-ui/public/fonts/roboto-regular.eot differ diff --git a/pigx-register/src/main/resources/static/console-ui/public/fonts/roboto-regular.ttf b/pigx-register/src/main/resources/static/console-ui/public/fonts/roboto-regular.ttf new file mode 100644 index 0000000..695e4d4 Binary files /dev/null and b/pigx-register/src/main/resources/static/console-ui/public/fonts/roboto-regular.ttf differ diff --git a/pigx-register/src/main/resources/static/console-ui/public/fonts/roboto-regular.woff b/pigx-register/src/main/resources/static/console-ui/public/fonts/roboto-regular.woff new file mode 100644 index 0000000..b41d905 Binary files /dev/null and b/pigx-register/src/main/resources/static/console-ui/public/fonts/roboto-regular.woff differ diff --git a/pigx-register/src/main/resources/static/console-ui/public/fonts/roboto-regular.woff2 b/pigx-register/src/main/resources/static/console-ui/public/fonts/roboto-regular.woff2 new file mode 100644 index 0000000..74b5d0e Binary files /dev/null and b/pigx-register/src/main/resources/static/console-ui/public/fonts/roboto-regular.woff2 differ diff --git a/pigx-register/src/main/resources/static/console-ui/public/fonts/roboto-thin.eot b/pigx-register/src/main/resources/static/console-ui/public/fonts/roboto-thin.eot new file mode 100644 index 0000000..17b6504 Binary files /dev/null and b/pigx-register/src/main/resources/static/console-ui/public/fonts/roboto-thin.eot differ diff --git a/pigx-register/src/main/resources/static/console-ui/public/fonts/roboto-thin.ttf b/pigx-register/src/main/resources/static/console-ui/public/fonts/roboto-thin.ttf new file mode 100644 index 0000000..542f190 Binary files /dev/null and b/pigx-register/src/main/resources/static/console-ui/public/fonts/roboto-thin.ttf differ diff --git a/pigx-register/src/main/resources/static/console-ui/public/fonts/roboto-thin.woff b/pigx-register/src/main/resources/static/console-ui/public/fonts/roboto-thin.woff new file mode 100644 index 0000000..842dfe1 Binary files /dev/null and b/pigx-register/src/main/resources/static/console-ui/public/fonts/roboto-thin.woff differ diff --git a/pigx-register/src/main/resources/static/console-ui/public/fonts/roboto-thin.woff2 b/pigx-register/src/main/resources/static/console-ui/public/fonts/roboto-thin.woff2 new file mode 100644 index 0000000..6a53617 Binary files /dev/null and b/pigx-register/src/main/resources/static/console-ui/public/fonts/roboto-thin.woff2 differ diff --git a/pigx-register/src/main/resources/static/console-ui/public/icons/icon-font.eot b/pigx-register/src/main/resources/static/console-ui/public/icons/icon-font.eot new file mode 100644 index 0000000..63971bf Binary files /dev/null and b/pigx-register/src/main/resources/static/console-ui/public/icons/icon-font.eot differ diff --git a/pigx-register/src/main/resources/static/console-ui/public/icons/icon-font.svg b/pigx-register/src/main/resources/static/console-ui/public/icons/icon-font.svg new file mode 100644 index 0000000..007b4f8 --- /dev/null +++ b/pigx-register/src/main/resources/static/console-ui/public/icons/icon-font.svg @@ -0,0 +1,159 @@ + + + + + +Created by iconfont + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/pigx-register/src/main/resources/static/console-ui/public/icons/icon-font.ttf b/pigx-register/src/main/resources/static/console-ui/public/icons/icon-font.ttf new file mode 100644 index 0000000..95551f3 Binary files /dev/null and b/pigx-register/src/main/resources/static/console-ui/public/icons/icon-font.ttf differ diff --git a/pigx-register/src/main/resources/static/console-ui/public/icons/icon-font.woff b/pigx-register/src/main/resources/static/console-ui/public/icons/icon-font.woff new file mode 100644 index 0000000..9487bb6 Binary files /dev/null and b/pigx-register/src/main/resources/static/console-ui/public/icons/icon-font.woff differ diff --git a/pigx-register/src/main/resources/static/console-ui/public/icons/icon-font.woff2 b/pigx-register/src/main/resources/static/console-ui/public/icons/icon-font.woff2 new file mode 100644 index 0000000..3d11f84 Binary files /dev/null and b/pigx-register/src/main/resources/static/console-ui/public/icons/icon-font.woff2 differ diff --git a/pigx-register/src/main/resources/static/console-ui/public/img/black_dot.png b/pigx-register/src/main/resources/static/console-ui/public/img/black_dot.png new file mode 100644 index 0000000..1b64e7d Binary files /dev/null and b/pigx-register/src/main/resources/static/console-ui/public/img/black_dot.png differ diff --git a/pigx-register/src/main/resources/static/console-ui/public/img/favicon.ico b/pigx-register/src/main/resources/static/console-ui/public/img/favicon.ico new file mode 100644 index 0000000..0439e0c Binary files /dev/null and b/pigx-register/src/main/resources/static/console-ui/public/img/favicon.ico differ diff --git a/pigx-register/src/main/resources/static/console-ui/public/img/logo-2000-390.svg b/pigx-register/src/main/resources/static/console-ui/public/img/logo-2000-390.svg new file mode 100644 index 0000000..8264c1a --- /dev/null +++ b/pigx-register/src/main/resources/static/console-ui/public/img/logo-2000-390.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pigx-register/src/main/resources/static/console-ui/public/img/nacos-logo.png b/pigx-register/src/main/resources/static/console-ui/public/img/nacos-logo.png new file mode 100644 index 0000000..0d7626a Binary files /dev/null and b/pigx-register/src/main/resources/static/console-ui/public/img/nacos-logo.png differ diff --git a/pigx-register/src/main/resources/static/console-ui/public/img/nacos.png b/pigx-register/src/main/resources/static/console-ui/public/img/nacos.png new file mode 100644 index 0000000..9d9fba8 Binary files /dev/null and b/pigx-register/src/main/resources/static/console-ui/public/img/nacos.png differ diff --git a/pigx-register/src/main/resources/static/console-ui/public/js/codemirror.addone.fullscreen.js b/pigx-register/src/main/resources/static/console-ui/public/js/codemirror.addone.fullscreen.js new file mode 100644 index 0000000..d2a760b --- /dev/null +++ b/pigx-register/src/main/resources/static/console-ui/public/js/codemirror.addone.fullscreen.js @@ -0,0 +1,54 @@ +/* + * Copyright 1999-2018 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + CodeMirror.defineOption("fullScreen", false, function(cm, val, old) { + if (old == CodeMirror.Init) old = false; + if (!old == !val) return; + if (val) setFullscreen(cm); + else setNormal(cm); + }); + + function setFullscreen(cm) { + var wrap = cm.getWrapperElement(); + cm.state.fullScreenRestore = {scrollTop: window.pageYOffset, scrollLeft: window.pageXOffset, + width: wrap.style.width, height: wrap.style.height}; + wrap.style.width = ""; + wrap.style.height = "auto"; + wrap.className += " CodeMirror-fullscreen"; + document.documentElement.style.overflow = "hidden"; + cm.refresh(); + } + + function setNormal(cm) { + var wrap = cm.getWrapperElement(); + wrap.className = wrap.className.replace(/\s*CodeMirror-fullscreen\b/, ""); + document.documentElement.style.overflow = ""; + var info = cm.state.fullScreenRestore; + wrap.style.width = info.width; wrap.style.height = info.height; + window.scrollTo(info.scrollLeft, info.scrollTop); + cm.refresh(); + } +}); diff --git a/pigx-register/src/main/resources/static/console-ui/public/js/codemirror.addone.json-lint.js b/pigx-register/src/main/resources/static/console-ui/public/js/codemirror.addone.json-lint.js new file mode 100644 index 0000000..f443ecd --- /dev/null +++ b/pigx-register/src/main/resources/static/console-ui/public/js/codemirror.addone.json-lint.js @@ -0,0 +1,44 @@ +/* + * Copyright 1999-2018 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Depends on jsonlint.js from https://github.com/zaach/jsonlint + +// declare global: jsonlint + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.registerHelper("lint", "json", function(text) { + var found = []; + jsonlint.parseError = function(str, hash) { + var loc = hash.loc; + found.push({from: CodeMirror.Pos(loc.first_line - 1, loc.first_column), + to: CodeMirror.Pos(loc.last_line - 1, loc.last_column), + message: str}); + }; + try { jsonlint.parse(text); } + catch(e) {} + return found; +}); + +}); diff --git a/pigx-register/src/main/resources/static/console-ui/public/js/codemirror.addone.lint.js b/pigx-register/src/main/resources/static/console-ui/public/js/codemirror.addone.lint.js new file mode 100644 index 0000000..82c7224 --- /dev/null +++ b/pigx-register/src/main/resources/static/console-ui/public/js/codemirror.addone.lint.js @@ -0,0 +1,251 @@ +/* + * Copyright 1999-2018 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + var GUTTER_ID = "CodeMirror-lint-markers"; + + function showTooltip(e, content) { + var tt = document.createElement("div"); + tt.className = "CodeMirror-lint-tooltip"; + tt.appendChild(content.cloneNode(true)); + document.body.appendChild(tt); + + function position(e) { + if (!tt.parentNode) return CodeMirror.off(document, "mousemove", position); + tt.style.top = Math.max(0, e.clientY - tt.offsetHeight - 5) + "px"; + tt.style.left = (e.clientX + 5) + "px"; + } + CodeMirror.on(document, "mousemove", position); + position(e); + if (tt.style.opacity != null) tt.style.opacity = 1; + return tt; + } + function rm(elt) { + if (elt.parentNode) elt.parentNode.removeChild(elt); + } + function hideTooltip(tt) { + if (!tt.parentNode) return; + if (tt.style.opacity == null) rm(tt); + tt.style.opacity = 0; + setTimeout(function() { rm(tt); }, 600); + } + + function showTooltipFor(e, content, node) { + var tooltip = showTooltip(e, content); + function hide() { + CodeMirror.off(node, "mouseout", hide); + if (tooltip) { hideTooltip(tooltip); tooltip = null; } + } + var poll = setInterval(function() { + if (tooltip) for (var n = node;; n = n.parentNode) { + if (n && n.nodeType == 11) n = n.host; + if (n == document.body) return; + if (!n) { hide(); break; } + } + if (!tooltip) return clearInterval(poll); + }, 400); + CodeMirror.on(node, "mouseout", hide); + } + + function LintState(cm, options, hasGutter) { + this.marked = []; + this.options = options; + this.timeout = null; + this.hasGutter = hasGutter; + this.onMouseOver = function(e) { onMouseOver(cm, e); }; + this.waitingFor = 0 + } + + function parseOptions(_cm, options) { + if (options instanceof Function) return {getAnnotations: options}; + if (!options || options === true) options = {}; + return options; + } + + function clearMarks(cm) { + var state = cm.state.lint; + if (state.hasGutter) cm.clearGutter(GUTTER_ID); + for (var i = 0; i < state.marked.length; ++i) + state.marked[i].clear(); + state.marked.length = 0; + } + + function makeMarker(labels, severity, multiple, tooltips) { + var marker = document.createElement("div"), inner = marker; + marker.className = "CodeMirror-lint-marker-" + severity; + if (multiple) { + inner = marker.appendChild(document.createElement("div")); + inner.className = "CodeMirror-lint-marker-multiple"; + } + + if (tooltips != false) CodeMirror.on(inner, "mouseover", function(e) { + showTooltipFor(e, labels, inner); + }); + + return marker; + } + + function getMaxSeverity(a, b) { + if (a == "error") return a; + else return b; + } + + function groupByLine(annotations) { + var lines = []; + for (var i = 0; i < annotations.length; ++i) { + var ann = annotations[i], line = ann.from.line; + (lines[line] || (lines[line] = [])).push(ann); + } + return lines; + } + + function annotationTooltip(ann) { + var severity = ann.severity; + if (!severity) severity = "error"; + var tip = document.createElement("div"); + tip.className = "CodeMirror-lint-message-" + severity; + tip.appendChild(document.createTextNode(ann.message)); + return tip; + } + + function lintAsync(cm, getAnnotations, passOptions) { + var state = cm.state.lint + var id = ++state.waitingFor + function abort() { + id = -1 + cm.off("change", abort) + } + cm.on("change", abort) + getAnnotations(cm.getValue(), function(annotations, arg2) { + cm.off("change", abort) + if (state.waitingFor != id) return + if (arg2 && annotations instanceof CodeMirror) annotations = arg2 + updateLinting(cm, annotations) + }, passOptions, cm); + } + + function startLinting(cm) { + var state = cm.state.lint, options = state.options; + var passOptions = options.options || options; // Support deprecated passing of `options` property in options + var getAnnotations = options.getAnnotations || cm.getHelper(CodeMirror.Pos(0, 0), "lint"); + if (!getAnnotations) return; + if (options.async || getAnnotations.async) { + lintAsync(cm, getAnnotations, passOptions) + } else { + updateLinting(cm, getAnnotations(cm.getValue(), passOptions, cm)); + } + } + + function updateLinting(cm, annotationsNotSorted) { + clearMarks(cm); + var state = cm.state.lint, options = state.options; + + var annotations = groupByLine(annotationsNotSorted); + + for (var line = 0; line < annotations.length; ++line) { + var anns = annotations[line]; + if (!anns) continue; + + var maxSeverity = null; + var tipLabel = state.hasGutter && document.createDocumentFragment(); + + for (var i = 0; i < anns.length; ++i) { + var ann = anns[i]; + var severity = ann.severity; + if (!severity) severity = "error"; + maxSeverity = getMaxSeverity(maxSeverity, severity); + + if (options.formatAnnotation) ann = options.formatAnnotation(ann); + if (state.hasGutter) tipLabel.appendChild(annotationTooltip(ann)); + + if (ann.to) state.marked.push(cm.markText(ann.from, ann.to, { + className: "CodeMirror-lint-mark-" + severity, + __annotation: ann + })); + } + + if (state.hasGutter) + cm.setGutterMarker(line, GUTTER_ID, makeMarker(tipLabel, maxSeverity, anns.length > 1, + state.options.tooltips)); + } + if (options.onUpdateLinting) options.onUpdateLinting(annotationsNotSorted, annotations, cm); + } + + function onChange(cm) { + var state = cm.state.lint; + if (!state) return; + clearTimeout(state.timeout); + state.timeout = setTimeout(function(){startLinting(cm);}, state.options.delay || 500); + } + + function popupTooltips(annotations, e) { + var target = e.target || e.srcElement; + var tooltip = document.createDocumentFragment(); + for (var i = 0; i < annotations.length; i++) { + var ann = annotations[i]; + tooltip.appendChild(annotationTooltip(ann)); + } + showTooltipFor(e, tooltip, target); + } + + function onMouseOver(cm, e) { + var target = e.target || e.srcElement; + if (!/\bCodeMirror-lint-mark-/.test(target.className)) return; + var box = target.getBoundingClientRect(), x = (box.left + box.right) / 2, y = (box.top + box.bottom) / 2; + var spans = cm.findMarksAt(cm.coordsChar({left: x, top: y}, "client")); + + var annotations = []; + for (var i = 0; i < spans.length; ++i) { + annotations.push(spans[i].__annotation); + } + if (annotations.length) popupTooltips(annotations, e); + } + + CodeMirror.defineOption("lint", false, function(cm, val, old) { + if (old && old != CodeMirror.Init) { + clearMarks(cm); + if (cm.state.lint.options.lintOnChange !== false) + cm.off("change", onChange); + CodeMirror.off(cm.getWrapperElement(), "mouseover", cm.state.lint.onMouseOver); + clearTimeout(cm.state.lint.timeout); + delete cm.state.lint; + } + + if (val) { + var gutters = cm.getOption("gutters"), hasLintGutter = false; + for (var i = 0; i < gutters.length; ++i) if (gutters[i] == GUTTER_ID) hasLintGutter = true; + var state = cm.state.lint = new LintState(cm, parseOptions(cm, val), hasLintGutter); + if (state.options.lintOnChange !== false) + cm.on("change", onChange); + if (state.options.tooltips != false) + CodeMirror.on(cm.getWrapperElement(), "mouseover", state.onMouseOver); + + startLinting(cm); + } + }); + + CodeMirror.defineExtension("performLint", function() { + if (this.state.lint) startLinting(this); + }); +}); diff --git a/pigx-register/src/main/resources/static/console-ui/public/js/codemirror.js b/pigx-register/src/main/resources/static/console-ui/public/js/codemirror.js new file mode 100644 index 0000000..c762f3f --- /dev/null +++ b/pigx-register/src/main/resources/static/console-ui/public/js/codemirror.js @@ -0,0 +1,9515 @@ +/* + * Copyright 1999-2018 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// This is CodeMirror (http://codemirror.net), a code editor +// implemented in JavaScript on top of the browser's DOM. +// +// You can find some technical background for some of the code below +// at http://marijnhaverbeke.nl/blog/#cm-internals . + +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global.CodeMirror = factory()); +}(this, (function () { 'use strict'; + +// Kludges for bugs and behavior differences that can't be feature +// detected are enabled based on userAgent etc sniffing. +var userAgent = navigator.userAgent; +var platform = navigator.platform; + +var gecko = /gecko\/\d/i.test(userAgent); +var ie_upto10 = /MSIE \d/.test(userAgent); +var ie_11up = /Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(userAgent); +var edge = /Edge\/(\d+)/.exec(userAgent); +var ie = ie_upto10 || ie_11up || edge; +var ie_version = ie && (ie_upto10 ? document.documentMode || 6 : +(edge || ie_11up)[1]); +var webkit = !edge && /WebKit\//.test(userAgent); +var qtwebkit = webkit && /Qt\/\d+\.\d+/.test(userAgent); +var chrome = !edge && /Chrome\//.test(userAgent); +var presto = /Opera\//.test(userAgent); +var safari = /Apple Computer/.test(navigator.vendor); +var mac_geMountainLion = /Mac OS X 1\d\D([8-9]|\d\d)\D/.test(userAgent); +var phantom = /PhantomJS/.test(userAgent); + +var ios = !edge && /AppleWebKit/.test(userAgent) && /Mobile\/\w+/.test(userAgent); +var android = /Android/.test(userAgent); +// This is woefully incomplete. Suggestions for alternative methods welcome. +var mobile = ios || android || /webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(userAgent); +var mac = ios || /Mac/.test(platform); +var chromeOS = /\bCrOS\b/.test(userAgent); +var windows = /win/i.test(platform); + +var presto_version = presto && userAgent.match(/Version\/(\d*\.\d*)/); +if (presto_version) { presto_version = Number(presto_version[1]); } +if (presto_version && presto_version >= 15) { presto = false; webkit = true; } +// Some browsers use the wrong event properties to signal cmd/ctrl on OS X +var flipCtrlCmd = mac && (qtwebkit || presto && (presto_version == null || presto_version < 12.11)); +var captureRightClick = gecko || (ie && ie_version >= 9); + +function classTest(cls) { return new RegExp("(^|\\s)" + cls + "(?:$|\\s)\\s*") } + +var rmClass = function(node, cls) { + var current = node.className; + var match = classTest(cls).exec(current); + if (match) { + var after = current.slice(match.index + match[0].length); + node.className = current.slice(0, match.index) + (after ? match[1] + after : ""); + } +}; + +function removeChildren(e) { + for (var count = e.childNodes.length; count > 0; --count) + { e.removeChild(e.firstChild); } + return e +} + +function removeChildrenAndAdd(parent, e) { + return removeChildren(parent).appendChild(e) +} + +function elt(tag, content, className, style) { + var e = document.createElement(tag); + if (className) { e.className = className; } + if (style) { e.style.cssText = style; } + if (typeof content == "string") { e.appendChild(document.createTextNode(content)); } + else if (content) { for (var i = 0; i < content.length; ++i) { e.appendChild(content[i]); } } + return e +} +// wrapper for elt, which removes the elt from the accessibility tree +function eltP(tag, content, className, style) { + var e = elt(tag, content, className, style); + e.setAttribute("role", "presentation"); + return e +} + +var range; +if (document.createRange) { range = function(node, start, end, endNode) { + var r = document.createRange(); + r.setEnd(endNode || node, end); + r.setStart(node, start); + return r +}; } +else { range = function(node, start, end) { + var r = document.body.createTextRange(); + try { r.moveToElementText(node.parentNode); } + catch(e) { return r } + r.collapse(true); + r.moveEnd("character", end); + r.moveStart("character", start); + return r +}; } + +function contains(parent, child) { + if (child.nodeType == 3) // Android browser always returns false when child is a textnode + { child = child.parentNode; } + if (parent.contains) + { return parent.contains(child) } + do { + if (child.nodeType == 11) { child = child.host; } + if (child == parent) { return true } + } while (child = child.parentNode) +} + +function activeElt() { + // IE and Edge may throw an "Unspecified Error" when accessing document.activeElement. + // IE < 10 will throw when accessed while the page is loading or in an iframe. + // IE > 9 and Edge will throw when accessed in an iframe if document.body is unavailable. + var activeElement; + try { + activeElement = document.activeElement; + } catch(e) { + activeElement = document.body || null; + } + while (activeElement && activeElement.shadowRoot && activeElement.shadowRoot.activeElement) + { activeElement = activeElement.shadowRoot.activeElement; } + return activeElement +} + +function addClass(node, cls) { + var current = node.className; + if (!classTest(cls).test(current)) { node.className += (current ? " " : "") + cls; } +} +function joinClasses(a, b) { + var as = a.split(" "); + for (var i = 0; i < as.length; i++) + { if (as[i] && !classTest(as[i]).test(b)) { b += " " + as[i]; } } + return b +} + +var selectInput = function(node) { node.select(); }; +if (ios) // Mobile Safari apparently has a bug where select() is broken. + { selectInput = function(node) { node.selectionStart = 0; node.selectionEnd = node.value.length; }; } +else if (ie) // Suppress mysterious IE10 errors + { selectInput = function(node) { try { node.select(); } catch(_e) {} }; } + +function bind(f) { + var args = Array.prototype.slice.call(arguments, 1); + return function(){return f.apply(null, args)} +} + +function copyObj(obj, target, overwrite) { + if (!target) { target = {}; } + for (var prop in obj) + { if (obj.hasOwnProperty(prop) && (overwrite !== false || !target.hasOwnProperty(prop))) + { target[prop] = obj[prop]; } } + return target +} + +// Counts the column offset in a string, taking tabs into account. +// Used mostly to find indentation. +function countColumn(string, end, tabSize, startIndex, startValue) { + if (end == null) { + end = string.search(/[^\s\u00a0]/); + if (end == -1) { end = string.length; } + } + for (var i = startIndex || 0, n = startValue || 0;;) { + var nextTab = string.indexOf("\t", i); + if (nextTab < 0 || nextTab >= end) + { return n + (end - i) } + n += nextTab - i; + n += tabSize - (n % tabSize); + i = nextTab + 1; + } +} + +var Delayed = function() {this.id = null;}; +Delayed.prototype.set = function (ms, f) { + clearTimeout(this.id); + this.id = setTimeout(f, ms); +}; + +function indexOf(array, elt) { + for (var i = 0; i < array.length; ++i) + { if (array[i] == elt) { return i } } + return -1 +} + +// Number of pixels added to scroller and sizer to hide scrollbar +var scrollerGap = 30; + +// Returned or thrown by various protocols to signal 'I'm not +// handling this'. +var Pass = {toString: function(){return "CodeMirror.Pass"}}; + +// Reused option objects for setSelection & friends +var sel_dontScroll = {scroll: false}; +var sel_mouse = {origin: "*mouse"}; +var sel_move = {origin: "+move"}; + +// The inverse of countColumn -- find the offset that corresponds to +// a particular column. +function findColumn(string, goal, tabSize) { + for (var pos = 0, col = 0;;) { + var nextTab = string.indexOf("\t", pos); + if (nextTab == -1) { nextTab = string.length; } + var skipped = nextTab - pos; + if (nextTab == string.length || col + skipped >= goal) + { return pos + Math.min(skipped, goal - col) } + col += nextTab - pos; + col += tabSize - (col % tabSize); + pos = nextTab + 1; + if (col >= goal) { return pos } + } +} + +var spaceStrs = [""]; +function spaceStr(n) { + while (spaceStrs.length <= n) + { spaceStrs.push(lst(spaceStrs) + " "); } + return spaceStrs[n] +} + +function lst(arr) { return arr[arr.length-1] } + +function map(array, f) { + var out = []; + for (var i = 0; i < array.length; i++) { out[i] = f(array[i], i); } + return out +} + +function insertSorted(array, value, score) { + var pos = 0, priority = score(value); + while (pos < array.length && score(array[pos]) <= priority) { pos++; } + array.splice(pos, 0, value); +} + +function nothing() {} + +function createObj(base, props) { + var inst; + if (Object.create) { + inst = Object.create(base); + } else { + nothing.prototype = base; + inst = new nothing(); + } + if (props) { copyObj(props, inst); } + return inst +} + +var nonASCIISingleCaseWordChar = /[\u00df\u0587\u0590-\u05f4\u0600-\u06ff\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/; +function isWordCharBasic(ch) { + return /\w/.test(ch) || ch > "\x80" && + (ch.toUpperCase() != ch.toLowerCase() || nonASCIISingleCaseWordChar.test(ch)) +} +function isWordChar(ch, helper) { + if (!helper) { return isWordCharBasic(ch) } + if (helper.source.indexOf("\\w") > -1 && isWordCharBasic(ch)) { return true } + return helper.test(ch) +} + +function isEmpty(obj) { + for (var n in obj) { if (obj.hasOwnProperty(n) && obj[n]) { return false } } + return true +} + +// Extending unicode characters. A series of a non-extending char + +// any number of extending chars is treated as a single unit as far +// as editing and measuring is concerned. This is not fully correct, +// since some scripts/fonts/browsers also treat other configurations +// of code points as a group. +var extendingChars = /[\u0300-\u036f\u0483-\u0489\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u065e\u0670\u06d6-\u06dc\u06de-\u06e4\u06e7\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0900-\u0902\u093c\u0941-\u0948\u094d\u0951-\u0955\u0962\u0963\u0981\u09bc\u09be\u09c1-\u09c4\u09cd\u09d7\u09e2\u09e3\u0a01\u0a02\u0a3c\u0a41\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a70\u0a71\u0a75\u0a81\u0a82\u0abc\u0ac1-\u0ac5\u0ac7\u0ac8\u0acd\u0ae2\u0ae3\u0b01\u0b3c\u0b3e\u0b3f\u0b41-\u0b44\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b82\u0bbe\u0bc0\u0bcd\u0bd7\u0c3e-\u0c40\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0cbc\u0cbf\u0cc2\u0cc6\u0ccc\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0d3e\u0d41-\u0d44\u0d4d\u0d57\u0d62\u0d63\u0dca\u0dcf\u0dd2-\u0dd4\u0dd6\u0ddf\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0f18\u0f19\u0f35\u0f37\u0f39\u0f71-\u0f7e\u0f80-\u0f84\u0f86\u0f87\u0f90-\u0f97\u0f99-\u0fbc\u0fc6\u102d-\u1030\u1032-\u1037\u1039\u103a\u103d\u103e\u1058\u1059\u105e-\u1060\u1071-\u1074\u1082\u1085\u1086\u108d\u109d\u135f\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b7-\u17bd\u17c6\u17c9-\u17d3\u17dd\u180b-\u180d\u18a9\u1920-\u1922\u1927\u1928\u1932\u1939-\u193b\u1a17\u1a18\u1a56\u1a58-\u1a5e\u1a60\u1a62\u1a65-\u1a6c\u1a73-\u1a7c\u1a7f\u1b00-\u1b03\u1b34\u1b36-\u1b3a\u1b3c\u1b42\u1b6b-\u1b73\u1b80\u1b81\u1ba2-\u1ba5\u1ba8\u1ba9\u1c2c-\u1c33\u1c36\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1dc0-\u1de6\u1dfd-\u1dff\u200c\u200d\u20d0-\u20f0\u2cef-\u2cf1\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua66f-\ua672\ua67c\ua67d\ua6f0\ua6f1\ua802\ua806\ua80b\ua825\ua826\ua8c4\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua951\ua980-\ua982\ua9b3\ua9b6-\ua9b9\ua9bc\uaa29-\uaa2e\uaa31\uaa32\uaa35\uaa36\uaa43\uaa4c\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uabe5\uabe8\uabed\udc00-\udfff\ufb1e\ufe00-\ufe0f\ufe20-\ufe26\uff9e\uff9f]/; +function isExtendingChar(ch) { return ch.charCodeAt(0) >= 768 && extendingChars.test(ch) } + +// Returns a number from the range [`0`; `str.length`] unless `pos` is outside that range. +function skipExtendingChars(str, pos, dir) { + while ((dir < 0 ? pos > 0 : pos < str.length) && isExtendingChar(str.charAt(pos))) { pos += dir; } + return pos +} + +// Returns the value from the range [`from`; `to`] that satisfies +// `pred` and is closest to `from`. Assumes that at least `to` satisfies `pred`. +function findFirst(pred, from, to) { + for (;;) { + if (Math.abs(from - to) <= 1) { return pred(from) ? from : to } + var mid = Math.floor((from + to) / 2); + if (pred(mid)) { to = mid; } + else { from = mid; } + } +} + +// The display handles the DOM integration, both for input reading +// and content drawing. It holds references to DOM nodes and +// display-related state. + +function Display(place, doc, input) { + var d = this; + this.input = input; + + // Covers bottom-right square when both scrollbars are present. + d.scrollbarFiller = elt("div", null, "CodeMirror-scrollbar-filler"); + d.scrollbarFiller.setAttribute("cm-not-content", "true"); + // Covers bottom of gutter when coverGutterNextToScrollbar is on + // and h scrollbar is present. + d.gutterFiller = elt("div", null, "CodeMirror-gutter-filler"); + d.gutterFiller.setAttribute("cm-not-content", "true"); + // Will contain the actual code, positioned to cover the viewport. + d.lineDiv = eltP("div", null, "CodeMirror-code"); + // Elements are added to these to represent selection and cursors. + d.selectionDiv = elt("div", null, null, "position: relative; z-index: 1"); + d.cursorDiv = elt("div", null, "CodeMirror-cursors"); + // A visibility: hidden element used to find the size of things. + d.measure = elt("div", null, "CodeMirror-measure"); + // When lines outside of the viewport are measured, they are drawn in this. + d.lineMeasure = elt("div", null, "CodeMirror-measure"); + // Wraps everything that needs to exist inside the vertically-padded coordinate system + d.lineSpace = eltP("div", [d.measure, d.lineMeasure, d.selectionDiv, d.cursorDiv, d.lineDiv], + null, "position: relative; outline: none"); + var lines = eltP("div", [d.lineSpace], "CodeMirror-lines"); + // Moved around its parent to cover visible view. + d.mover = elt("div", [lines], null, "position: relative"); + // Set to the height of the document, allowing scrolling. + d.sizer = elt("div", [d.mover], "CodeMirror-sizer"); + d.sizerWidth = null; + // Behavior of elts with overflow: auto and padding is + // inconsistent across browsers. This is used to ensure the + // scrollable area is big enough. + d.heightForcer = elt("div", null, null, "position: absolute; height: " + scrollerGap + "px; width: 1px;"); + // Will contain the gutters, if any. + d.gutters = elt("div", null, "CodeMirror-gutters"); + d.lineGutter = null; + // Actual scrollable element. + d.scroller = elt("div", [d.sizer, d.heightForcer, d.gutters], "CodeMirror-scroll"); + d.scroller.setAttribute("tabIndex", "-1"); + // The element in which the editor lives. + d.wrapper = elt("div", [d.scrollbarFiller, d.gutterFiller, d.scroller], "CodeMirror"); + + // Work around IE7 z-index bug (not perfect, hence IE7 not really being supported) + if (ie && ie_version < 8) { d.gutters.style.zIndex = -1; d.scroller.style.paddingRight = 0; } + if (!webkit && !(gecko && mobile)) { d.scroller.draggable = true; } + + if (place) { + if (place.appendChild) { place.appendChild(d.wrapper); } + else { place(d.wrapper); } + } + + // Current rendered range (may be bigger than the view window). + d.viewFrom = d.viewTo = doc.first; + d.reportedViewFrom = d.reportedViewTo = doc.first; + // Information about the rendered lines. + d.view = []; + d.renderedView = null; + // Holds info about a single rendered line when it was rendered + // for measurement, while not in view. + d.externalMeasured = null; + // Empty space (in pixels) above the view + d.viewOffset = 0; + d.lastWrapHeight = d.lastWrapWidth = 0; + d.updateLineNumbers = null; + + d.nativeBarWidth = d.barHeight = d.barWidth = 0; + d.scrollbarsClipped = false; + + // Used to only resize the line number gutter when necessary (when + // the amount of lines crosses a boundary that makes its width change) + d.lineNumWidth = d.lineNumInnerWidth = d.lineNumChars = null; + // Set to true when a non-horizontal-scrolling line widget is + // added. As an optimization, line widget aligning is skipped when + // this is false. + d.alignWidgets = false; + + d.cachedCharWidth = d.cachedTextHeight = d.cachedPaddingH = null; + + // Tracks the maximum line length so that the horizontal scrollbar + // can be kept static when scrolling. + d.maxLine = null; + d.maxLineLength = 0; + d.maxLineChanged = false; + + // Used for measuring wheel scrolling granularity + d.wheelDX = d.wheelDY = d.wheelStartX = d.wheelStartY = null; + + // True when shift is held down. + d.shift = false; + + // Used to track whether anything happened since the context menu + // was opened. + d.selForContextMenu = null; + + d.activeTouch = null; + + input.init(d); +} + +// Find the line object corresponding to the given line number. +function getLine(doc, n) { + n -= doc.first; + if (n < 0 || n >= doc.size) { throw new Error("There is no line " + (n + doc.first) + " in the document.") } + var chunk = doc; + while (!chunk.lines) { + for (var i = 0;; ++i) { + var child = chunk.children[i], sz = child.chunkSize(); + if (n < sz) { chunk = child; break } + n -= sz; + } + } + return chunk.lines[n] +} + +// Get the part of a document between two positions, as an array of +// strings. +function getBetween(doc, start, end) { + var out = [], n = start.line; + doc.iter(start.line, end.line + 1, function (line) { + var text = line.text; + if (n == end.line) { text = text.slice(0, end.ch); } + if (n == start.line) { text = text.slice(start.ch); } + out.push(text); + ++n; + }); + return out +} +// Get the lines between from and to, as array of strings. +function getLines(doc, from, to) { + var out = []; + doc.iter(from, to, function (line) { out.push(line.text); }); // iter aborts when callback returns truthy value + return out +} + +// Update the height of a line, propagating the height change +// upwards to parent nodes. +function updateLineHeight(line, height) { + var diff = height - line.height; + if (diff) { for (var n = line; n; n = n.parent) { n.height += diff; } } +} + +// Given a line object, find its line number by walking up through +// its parent links. +function lineNo(line) { + if (line.parent == null) { return null } + var cur = line.parent, no = indexOf(cur.lines, line); + for (var chunk = cur.parent; chunk; cur = chunk, chunk = chunk.parent) { + for (var i = 0;; ++i) { + if (chunk.children[i] == cur) { break } + no += chunk.children[i].chunkSize(); + } + } + return no + cur.first +} + +// Find the line at the given vertical position, using the height +// information in the document tree. +function lineAtHeight(chunk, h) { + var n = chunk.first; + outer: do { + for (var i$1 = 0; i$1 < chunk.children.length; ++i$1) { + var child = chunk.children[i$1], ch = child.height; + if (h < ch) { chunk = child; continue outer } + h -= ch; + n += child.chunkSize(); + } + return n + } while (!chunk.lines) + var i = 0; + for (; i < chunk.lines.length; ++i) { + var line = chunk.lines[i], lh = line.height; + if (h < lh) { break } + h -= lh; + } + return n + i +} + +function isLine(doc, l) {return l >= doc.first && l < doc.first + doc.size} + +function lineNumberFor(options, i) { + return String(options.lineNumberFormatter(i + options.firstLineNumber)) +} + +// A Pos instance represents a position within the text. +function Pos(line, ch, sticky) { + if ( sticky === void 0 ) sticky = null; + + if (!(this instanceof Pos)) { return new Pos(line, ch, sticky) } + this.line = line; + this.ch = ch; + this.sticky = sticky; +} + +// Compare two positions, return 0 if they are the same, a negative +// number when a is less, and a positive number otherwise. +function cmp(a, b) { return a.line - b.line || a.ch - b.ch } + +function equalCursorPos(a, b) { return a.sticky == b.sticky && cmp(a, b) == 0 } + +function copyPos(x) {return Pos(x.line, x.ch)} +function maxPos(a, b) { return cmp(a, b) < 0 ? b : a } +function minPos(a, b) { return cmp(a, b) < 0 ? a : b } + +// Most of the external API clips given positions to make sure they +// actually exist within the document. +function clipLine(doc, n) {return Math.max(doc.first, Math.min(n, doc.first + doc.size - 1))} +function clipPos(doc, pos) { + if (pos.line < doc.first) { return Pos(doc.first, 0) } + var last = doc.first + doc.size - 1; + if (pos.line > last) { return Pos(last, getLine(doc, last).text.length) } + return clipToLen(pos, getLine(doc, pos.line).text.length) +} +function clipToLen(pos, linelen) { + var ch = pos.ch; + if (ch == null || ch > linelen) { return Pos(pos.line, linelen) } + else if (ch < 0) { return Pos(pos.line, 0) } + else { return pos } +} +function clipPosArray(doc, array) { + var out = []; + for (var i = 0; i < array.length; i++) { out[i] = clipPos(doc, array[i]); } + return out +} + +// Optimize some code when these features are not used. +var sawReadOnlySpans = false; +var sawCollapsedSpans = false; + +function seeReadOnlySpans() { + sawReadOnlySpans = true; +} + +function seeCollapsedSpans() { + sawCollapsedSpans = true; +} + +// TEXTMARKER SPANS + +function MarkedSpan(marker, from, to) { + this.marker = marker; + this.from = from; this.to = to; +} + +// Search an array of spans for a span matching the given marker. +function getMarkedSpanFor(spans, marker) { + if (spans) { for (var i = 0; i < spans.length; ++i) { + var span = spans[i]; + if (span.marker == marker) { return span } + } } +} +// Remove a span from an array, returning undefined if no spans are +// left (we don't store arrays for lines without spans). +function removeMarkedSpan(spans, span) { + var r; + for (var i = 0; i < spans.length; ++i) + { if (spans[i] != span) { (r || (r = [])).push(spans[i]); } } + return r +} +// Add a span to a line. +function addMarkedSpan(line, span) { + line.markedSpans = line.markedSpans ? line.markedSpans.concat([span]) : [span]; + span.marker.attachLine(line); +} + +// Used for the algorithm that adjusts markers for a change in the +// document. These functions cut an array of spans at a given +// character position, returning an array of remaining chunks (or +// undefined if nothing remains). +function markedSpansBefore(old, startCh, isInsert) { + var nw; + if (old) { for (var i = 0; i < old.length; ++i) { + var span = old[i], marker = span.marker; + var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= startCh : span.from < startCh); + if (startsBefore || span.from == startCh && marker.type == "bookmark" && (!isInsert || !span.marker.insertLeft)) { + var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= startCh : span.to > startCh);(nw || (nw = [])).push(new MarkedSpan(marker, span.from, endsAfter ? null : span.to)); + } + } } + return nw +} +function markedSpansAfter(old, endCh, isInsert) { + var nw; + if (old) { for (var i = 0; i < old.length; ++i) { + var span = old[i], marker = span.marker; + var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= endCh : span.to > endCh); + if (endsAfter || span.from == endCh && marker.type == "bookmark" && (!isInsert || span.marker.insertLeft)) { + var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= endCh : span.from < endCh);(nw || (nw = [])).push(new MarkedSpan(marker, startsBefore ? null : span.from - endCh, + span.to == null ? null : span.to - endCh)); + } + } } + return nw +} + +// Given a change object, compute the new set of marker spans that +// cover the line in which the change took place. Removes spans +// entirely within the change, reconnects spans belonging to the +// same marker that appear on both sides of the change, and cuts off +// spans partially within the change. Returns an array of span +// arrays with one element for each line in (after) the change. +function stretchSpansOverChange(doc, change) { + if (change.full) { return null } + var oldFirst = isLine(doc, change.from.line) && getLine(doc, change.from.line).markedSpans; + var oldLast = isLine(doc, change.to.line) && getLine(doc, change.to.line).markedSpans; + if (!oldFirst && !oldLast) { return null } + + var startCh = change.from.ch, endCh = change.to.ch, isInsert = cmp(change.from, change.to) == 0; + // Get the spans that 'stick out' on both sides + var first = markedSpansBefore(oldFirst, startCh, isInsert); + var last = markedSpansAfter(oldLast, endCh, isInsert); + + // Next, merge those two ends + var sameLine = change.text.length == 1, offset = lst(change.text).length + (sameLine ? startCh : 0); + if (first) { + // Fix up .to properties of first + for (var i = 0; i < first.length; ++i) { + var span = first[i]; + if (span.to == null) { + var found = getMarkedSpanFor(last, span.marker); + if (!found) { span.to = startCh; } + else if (sameLine) { span.to = found.to == null ? null : found.to + offset; } + } + } + } + if (last) { + // Fix up .from in last (or move them into first in case of sameLine) + for (var i$1 = 0; i$1 < last.length; ++i$1) { + var span$1 = last[i$1]; + if (span$1.to != null) { span$1.to += offset; } + if (span$1.from == null) { + var found$1 = getMarkedSpanFor(first, span$1.marker); + if (!found$1) { + span$1.from = offset; + if (sameLine) { (first || (first = [])).push(span$1); } + } + } else { + span$1.from += offset; + if (sameLine) { (first || (first = [])).push(span$1); } + } + } + } + // Make sure we didn't create any zero-length spans + if (first) { first = clearEmptySpans(first); } + if (last && last != first) { last = clearEmptySpans(last); } + + var newMarkers = [first]; + if (!sameLine) { + // Fill gap with whole-line-spans + var gap = change.text.length - 2, gapMarkers; + if (gap > 0 && first) + { for (var i$2 = 0; i$2 < first.length; ++i$2) + { if (first[i$2].to == null) + { (gapMarkers || (gapMarkers = [])).push(new MarkedSpan(first[i$2].marker, null, null)); } } } + for (var i$3 = 0; i$3 < gap; ++i$3) + { newMarkers.push(gapMarkers); } + newMarkers.push(last); + } + return newMarkers +} + +// Remove spans that are empty and don't have a clearWhenEmpty +// option of false. +function clearEmptySpans(spans) { + for (var i = 0; i < spans.length; ++i) { + var span = spans[i]; + if (span.from != null && span.from == span.to && span.marker.clearWhenEmpty !== false) + { spans.splice(i--, 1); } + } + if (!spans.length) { return null } + return spans +} + +// Used to 'clip' out readOnly ranges when making a change. +function removeReadOnlyRanges(doc, from, to) { + var markers = null; + doc.iter(from.line, to.line + 1, function (line) { + if (line.markedSpans) { for (var i = 0; i < line.markedSpans.length; ++i) { + var mark = line.markedSpans[i].marker; + if (mark.readOnly && (!markers || indexOf(markers, mark) == -1)) + { (markers || (markers = [])).push(mark); } + } } + }); + if (!markers) { return null } + var parts = [{from: from, to: to}]; + for (var i = 0; i < markers.length; ++i) { + var mk = markers[i], m = mk.find(0); + for (var j = 0; j < parts.length; ++j) { + var p = parts[j]; + if (cmp(p.to, m.from) < 0 || cmp(p.from, m.to) > 0) { continue } + var newParts = [j, 1], dfrom = cmp(p.from, m.from), dto = cmp(p.to, m.to); + if (dfrom < 0 || !mk.inclusiveLeft && !dfrom) + { newParts.push({from: p.from, to: m.from}); } + if (dto > 0 || !mk.inclusiveRight && !dto) + { newParts.push({from: m.to, to: p.to}); } + parts.splice.apply(parts, newParts); + j += newParts.length - 3; + } + } + return parts +} + +// Connect or disconnect spans from a line. +function detachMarkedSpans(line) { + var spans = line.markedSpans; + if (!spans) { return } + for (var i = 0; i < spans.length; ++i) + { spans[i].marker.detachLine(line); } + line.markedSpans = null; +} +function attachMarkedSpans(line, spans) { + if (!spans) { return } + for (var i = 0; i < spans.length; ++i) + { spans[i].marker.attachLine(line); } + line.markedSpans = spans; +} + +// Helpers used when computing which overlapping collapsed span +// counts as the larger one. +function extraLeft(marker) { return marker.inclusiveLeft ? -1 : 0 } +function extraRight(marker) { return marker.inclusiveRight ? 1 : 0 } + +// Returns a number indicating which of two overlapping collapsed +// spans is larger (and thus includes the other). Falls back to +// comparing ids when the spans cover exactly the same range. +function compareCollapsedMarkers(a, b) { + var lenDiff = a.lines.length - b.lines.length; + if (lenDiff != 0) { return lenDiff } + var aPos = a.find(), bPos = b.find(); + var fromCmp = cmp(aPos.from, bPos.from) || extraLeft(a) - extraLeft(b); + if (fromCmp) { return -fromCmp } + var toCmp = cmp(aPos.to, bPos.to) || extraRight(a) - extraRight(b); + if (toCmp) { return toCmp } + return b.id - a.id +} + +// Find out whether a line ends or starts in a collapsed span. If +// so, return the marker for that span. +function collapsedSpanAtSide(line, start) { + var sps = sawCollapsedSpans && line.markedSpans, found; + if (sps) { for (var sp = (void 0), i = 0; i < sps.length; ++i) { + sp = sps[i]; + if (sp.marker.collapsed && (start ? sp.from : sp.to) == null && + (!found || compareCollapsedMarkers(found, sp.marker) < 0)) + { found = sp.marker; } + } } + return found +} +function collapsedSpanAtStart(line) { return collapsedSpanAtSide(line, true) } +function collapsedSpanAtEnd(line) { return collapsedSpanAtSide(line, false) } + +// Test whether there exists a collapsed span that partially +// overlaps (covers the start or end, but not both) of a new span. +// Such overlap is not allowed. +function conflictingCollapsedRange(doc, lineNo$$1, from, to, marker) { + var line = getLine(doc, lineNo$$1); + var sps = sawCollapsedSpans && line.markedSpans; + if (sps) { for (var i = 0; i < sps.length; ++i) { + var sp = sps[i]; + if (!sp.marker.collapsed) { continue } + var found = sp.marker.find(0); + var fromCmp = cmp(found.from, from) || extraLeft(sp.marker) - extraLeft(marker); + var toCmp = cmp(found.to, to) || extraRight(sp.marker) - extraRight(marker); + if (fromCmp >= 0 && toCmp <= 0 || fromCmp <= 0 && toCmp >= 0) { continue } + if (fromCmp <= 0 && (sp.marker.inclusiveRight && marker.inclusiveLeft ? cmp(found.to, from) >= 0 : cmp(found.to, from) > 0) || + fromCmp >= 0 && (sp.marker.inclusiveRight && marker.inclusiveLeft ? cmp(found.from, to) <= 0 : cmp(found.from, to) < 0)) + { return true } + } } +} + +// A visual line is a line as drawn on the screen. Folding, for +// example, can cause multiple logical lines to appear on the same +// visual line. This finds the start of the visual line that the +// given line is part of (usually that is the line itself). +function visualLine(line) { + var merged; + while (merged = collapsedSpanAtStart(line)) + { line = merged.find(-1, true).line; } + return line +} + +function visualLineEnd(line) { + var merged; + while (merged = collapsedSpanAtEnd(line)) + { line = merged.find(1, true).line; } + return line +} + +// Returns an array of logical lines that continue the visual line +// started by the argument, or undefined if there are no such lines. +function visualLineContinued(line) { + var merged, lines; + while (merged = collapsedSpanAtEnd(line)) { + line = merged.find(1, true).line + ;(lines || (lines = [])).push(line); + } + return lines +} + +// Get the line number of the start of the visual line that the +// given line number is part of. +function visualLineNo(doc, lineN) { + var line = getLine(doc, lineN), vis = visualLine(line); + if (line == vis) { return lineN } + return lineNo(vis) +} + +// Get the line number of the start of the next visual line after +// the given line. +function visualLineEndNo(doc, lineN) { + if (lineN > doc.lastLine()) { return lineN } + var line = getLine(doc, lineN), merged; + if (!lineIsHidden(doc, line)) { return lineN } + while (merged = collapsedSpanAtEnd(line)) + { line = merged.find(1, true).line; } + return lineNo(line) + 1 +} + +// Compute whether a line is hidden. Lines count as hidden when they +// are part of a visual line that starts with another line, or when +// they are entirely covered by collapsed, non-widget span. +function lineIsHidden(doc, line) { + var sps = sawCollapsedSpans && line.markedSpans; + if (sps) { for (var sp = (void 0), i = 0; i < sps.length; ++i) { + sp = sps[i]; + if (!sp.marker.collapsed) { continue } + if (sp.from == null) { return true } + if (sp.marker.widgetNode) { continue } + if (sp.from == 0 && sp.marker.inclusiveLeft && lineIsHiddenInner(doc, line, sp)) + { return true } + } } +} +function lineIsHiddenInner(doc, line, span) { + if (span.to == null) { + var end = span.marker.find(1, true); + return lineIsHiddenInner(doc, end.line, getMarkedSpanFor(end.line.markedSpans, span.marker)) + } + if (span.marker.inclusiveRight && span.to == line.text.length) + { return true } + for (var sp = (void 0), i = 0; i < line.markedSpans.length; ++i) { + sp = line.markedSpans[i]; + if (sp.marker.collapsed && !sp.marker.widgetNode && sp.from == span.to && + (sp.to == null || sp.to != span.from) && + (sp.marker.inclusiveLeft || span.marker.inclusiveRight) && + lineIsHiddenInner(doc, line, sp)) { return true } + } +} + +// Find the height above the given line. +function heightAtLine(lineObj) { + lineObj = visualLine(lineObj); + + var h = 0, chunk = lineObj.parent; + for (var i = 0; i < chunk.lines.length; ++i) { + var line = chunk.lines[i]; + if (line == lineObj) { break } + else { h += line.height; } + } + for (var p = chunk.parent; p; chunk = p, p = chunk.parent) { + for (var i$1 = 0; i$1 < p.children.length; ++i$1) { + var cur = p.children[i$1]; + if (cur == chunk) { break } + else { h += cur.height; } + } + } + return h +} + +// Compute the character length of a line, taking into account +// collapsed ranges (see markText) that might hide parts, and join +// other lines onto it. +function lineLength(line) { + if (line.height == 0) { return 0 } + var len = line.text.length, merged, cur = line; + while (merged = collapsedSpanAtStart(cur)) { + var found = merged.find(0, true); + cur = found.from.line; + len += found.from.ch - found.to.ch; + } + cur = line; + while (merged = collapsedSpanAtEnd(cur)) { + var found$1 = merged.find(0, true); + len -= cur.text.length - found$1.from.ch; + cur = found$1.to.line; + len += cur.text.length - found$1.to.ch; + } + return len +} + +// Find the longest line in the document. +function findMaxLine(cm) { + var d = cm.display, doc = cm.doc; + d.maxLine = getLine(doc, doc.first); + d.maxLineLength = lineLength(d.maxLine); + d.maxLineChanged = true; + doc.iter(function (line) { + var len = lineLength(line); + if (len > d.maxLineLength) { + d.maxLineLength = len; + d.maxLine = line; + } + }); +} + +// BIDI HELPERS + +function iterateBidiSections(order, from, to, f) { + if (!order) { return f(from, to, "ltr") } + var found = false; + for (var i = 0; i < order.length; ++i) { + var part = order[i]; + if (part.from < to && part.to > from || from == to && part.to == from) { + f(Math.max(part.from, from), Math.min(part.to, to), part.level == 1 ? "rtl" : "ltr"); + found = true; + } + } + if (!found) { f(from, to, "ltr"); } +} + +var bidiOther = null; +function getBidiPartAt(order, ch, sticky) { + var found; + bidiOther = null; + for (var i = 0; i < order.length; ++i) { + var cur = order[i]; + if (cur.from < ch && cur.to > ch) { return i } + if (cur.to == ch) { + if (cur.from != cur.to && sticky == "before") { found = i; } + else { bidiOther = i; } + } + if (cur.from == ch) { + if (cur.from != cur.to && sticky != "before") { found = i; } + else { bidiOther = i; } + } + } + return found != null ? found : bidiOther +} + +// Bidirectional ordering algorithm +// See http://unicode.org/reports/tr9/tr9-13.html for the algorithm +// that this (partially) implements. + +// One-char codes used for character types: +// L (L): Left-to-Right +// R (R): Right-to-Left +// r (AL): Right-to-Left Arabic +// 1 (EN): European Number +// + (ES): European Number Separator +// % (ET): European Number Terminator +// n (AN): Arabic Number +// , (CS): Common Number Separator +// m (NSM): Non-Spacing Mark +// b (BN): Boundary Neutral +// s (B): Paragraph Separator +// t (S): Segment Separator +// w (WS): Whitespace +// N (ON): Other Neutrals + +// Returns null if characters are ordered as they appear +// (left-to-right), or an array of sections ({from, to, level} +// objects) in the order in which they occur visually. +var bidiOrdering = (function() { + // Character types for codepoints 0 to 0xff + var lowTypes = "bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLN"; + // Character types for codepoints 0x600 to 0x6f9 + var arabicTypes = "nnnnnnNNr%%r,rNNmmmmmmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmmmnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmnNmmmmmmrrmmNmmmmrr1111111111"; + function charType(code) { + if (code <= 0xf7) { return lowTypes.charAt(code) } + else if (0x590 <= code && code <= 0x5f4) { return "R" } + else if (0x600 <= code && code <= 0x6f9) { return arabicTypes.charAt(code - 0x600) } + else if (0x6ee <= code && code <= 0x8ac) { return "r" } + else if (0x2000 <= code && code <= 0x200b) { return "w" } + else if (code == 0x200c) { return "b" } + else { return "L" } + } + + var bidiRE = /[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac]/; + var isNeutral = /[stwN]/, isStrong = /[LRr]/, countsAsLeft = /[Lb1n]/, countsAsNum = /[1n]/; + + function BidiSpan(level, from, to) { + this.level = level; + this.from = from; this.to = to; + } + + return function(str, direction) { + var outerType = direction == "ltr" ? "L" : "R"; + + if (str.length == 0 || direction == "ltr" && !bidiRE.test(str)) { return false } + var len = str.length, types = []; + for (var i = 0; i < len; ++i) + { types.push(charType(str.charCodeAt(i))); } + + // W1. Examine each non-spacing mark (NSM) in the level run, and + // change the type of the NSM to the type of the previous + // character. If the NSM is at the start of the level run, it will + // get the type of sor. + for (var i$1 = 0, prev = outerType; i$1 < len; ++i$1) { + var type = types[i$1]; + if (type == "m") { types[i$1] = prev; } + else { prev = type; } + } + + // W2. Search backwards from each instance of a European number + // until the first strong type (R, L, AL, or sor) is found. If an + // AL is found, change the type of the European number to Arabic + // number. + // W3. Change all ALs to R. + for (var i$2 = 0, cur = outerType; i$2 < len; ++i$2) { + var type$1 = types[i$2]; + if (type$1 == "1" && cur == "r") { types[i$2] = "n"; } + else if (isStrong.test(type$1)) { cur = type$1; if (type$1 == "r") { types[i$2] = "R"; } } + } + + // W4. A single European separator between two European numbers + // changes to a European number. A single common separator between + // two numbers of the same type changes to that type. + for (var i$3 = 1, prev$1 = types[0]; i$3 < len - 1; ++i$3) { + var type$2 = types[i$3]; + if (type$2 == "+" && prev$1 == "1" && types[i$3+1] == "1") { types[i$3] = "1"; } + else if (type$2 == "," && prev$1 == types[i$3+1] && + (prev$1 == "1" || prev$1 == "n")) { types[i$3] = prev$1; } + prev$1 = type$2; + } + + // W5. A sequence of European terminators adjacent to European + // numbers changes to all European numbers. + // W6. Otherwise, separators and terminators change to Other + // Neutral. + for (var i$4 = 0; i$4 < len; ++i$4) { + var type$3 = types[i$4]; + if (type$3 == ",") { types[i$4] = "N"; } + else if (type$3 == "%") { + var end = (void 0); + for (end = i$4 + 1; end < len && types[end] == "%"; ++end) {} + var replace = (i$4 && types[i$4-1] == "!") || (end < len && types[end] == "1") ? "1" : "N"; + for (var j = i$4; j < end; ++j) { types[j] = replace; } + i$4 = end - 1; + } + } + + // W7. Search backwards from each instance of a European number + // until the first strong type (R, L, or sor) is found. If an L is + // found, then change the type of the European number to L. + for (var i$5 = 0, cur$1 = outerType; i$5 < len; ++i$5) { + var type$4 = types[i$5]; + if (cur$1 == "L" && type$4 == "1") { types[i$5] = "L"; } + else if (isStrong.test(type$4)) { cur$1 = type$4; } + } + + // N1. A sequence of neutrals takes the direction of the + // surrounding strong text if the text on both sides has the same + // direction. European and Arabic numbers act as if they were R in + // terms of their influence on neutrals. Start-of-level-run (sor) + // and end-of-level-run (eor) are used at level run boundaries. + // N2. Any remaining neutrals take the embedding direction. + for (var i$6 = 0; i$6 < len; ++i$6) { + if (isNeutral.test(types[i$6])) { + var end$1 = (void 0); + for (end$1 = i$6 + 1; end$1 < len && isNeutral.test(types[end$1]); ++end$1) {} + var before = (i$6 ? types[i$6-1] : outerType) == "L"; + var after = (end$1 < len ? types[end$1] : outerType) == "L"; + var replace$1 = before == after ? (before ? "L" : "R") : outerType; + for (var j$1 = i$6; j$1 < end$1; ++j$1) { types[j$1] = replace$1; } + i$6 = end$1 - 1; + } + } + + // Here we depart from the documented algorithm, in order to avoid + // building up an actual levels array. Since there are only three + // levels (0, 1, 2) in an implementation that doesn't take + // explicit embedding into account, we can build up the order on + // the fly, without following the level-based algorithm. + var order = [], m; + for (var i$7 = 0; i$7 < len;) { + if (countsAsLeft.test(types[i$7])) { + var start = i$7; + for (++i$7; i$7 < len && countsAsLeft.test(types[i$7]); ++i$7) {} + order.push(new BidiSpan(0, start, i$7)); + } else { + var pos = i$7, at = order.length; + for (++i$7; i$7 < len && types[i$7] != "L"; ++i$7) {} + for (var j$2 = pos; j$2 < i$7;) { + if (countsAsNum.test(types[j$2])) { + if (pos < j$2) { order.splice(at, 0, new BidiSpan(1, pos, j$2)); } + var nstart = j$2; + for (++j$2; j$2 < i$7 && countsAsNum.test(types[j$2]); ++j$2) {} + order.splice(at, 0, new BidiSpan(2, nstart, j$2)); + pos = j$2; + } else { ++j$2; } + } + if (pos < i$7) { order.splice(at, 0, new BidiSpan(1, pos, i$7)); } + } + } + if (order[0].level == 1 && (m = str.match(/^\s+/))) { + order[0].from = m[0].length; + order.unshift(new BidiSpan(0, 0, m[0].length)); + } + if (lst(order).level == 1 && (m = str.match(/\s+$/))) { + lst(order).to -= m[0].length; + order.push(new BidiSpan(0, len - m[0].length, len)); + } + + return direction == "rtl" ? order.reverse() : order + } +})(); + +// Get the bidi ordering for the given line (and cache it). Returns +// false for lines that are fully left-to-right, and an array of +// BidiSpan objects otherwise. +function getOrder(line, direction) { + var order = line.order; + if (order == null) { order = line.order = bidiOrdering(line.text, direction); } + return order +} + +function moveCharLogically(line, ch, dir) { + var target = skipExtendingChars(line.text, ch + dir, dir); + return target < 0 || target > line.text.length ? null : target +} + +function moveLogically(line, start, dir) { + var ch = moveCharLogically(line, start.ch, dir); + return ch == null ? null : new Pos(start.line, ch, dir < 0 ? "after" : "before") +} + +function endOfLine(visually, cm, lineObj, lineNo, dir) { + if (visually) { + var order = getOrder(lineObj, cm.doc.direction); + if (order) { + var part = dir < 0 ? lst(order) : order[0]; + var moveInStorageOrder = (dir < 0) == (part.level == 1); + var sticky = moveInStorageOrder ? "after" : "before"; + var ch; + // With a wrapped rtl chunk (possibly spanning multiple bidi parts), + // it could be that the last bidi part is not on the last visual line, + // since visual lines contain content order-consecutive chunks. + // Thus, in rtl, we are looking for the first (content-order) character + // in the rtl chunk that is on the last line (that is, the same line + // as the last (content-order) character). + if (part.level > 0) { + var prep = prepareMeasureForLine(cm, lineObj); + ch = dir < 0 ? lineObj.text.length - 1 : 0; + var targetTop = measureCharPrepared(cm, prep, ch).top; + ch = findFirst(function (ch) { return measureCharPrepared(cm, prep, ch).top == targetTop; }, (dir < 0) == (part.level == 1) ? part.from : part.to - 1, ch); + if (sticky == "before") { ch = moveCharLogically(lineObj, ch, 1); } + } else { ch = dir < 0 ? part.to : part.from; } + return new Pos(lineNo, ch, sticky) + } + } + return new Pos(lineNo, dir < 0 ? lineObj.text.length : 0, dir < 0 ? "before" : "after") +} + +function moveVisually(cm, line, start, dir) { + var bidi = getOrder(line, cm.doc.direction); + if (!bidi) { return moveLogically(line, start, dir) } + if (start.ch >= line.text.length) { + start.ch = line.text.length; + start.sticky = "before"; + } else if (start.ch <= 0) { + start.ch = 0; + start.sticky = "after"; + } + var partPos = getBidiPartAt(bidi, start.ch, start.sticky), part = bidi[partPos]; + if (cm.doc.direction == "ltr" && part.level % 2 == 0 && (dir > 0 ? part.to > start.ch : part.from < start.ch)) { + // Case 1: We move within an ltr part in an ltr editor. Even with wrapped lines, + // nothing interesting happens. + return moveLogically(line, start, dir) + } + + var mv = function (pos, dir) { return moveCharLogically(line, pos instanceof Pos ? pos.ch : pos, dir); }; + var prep; + var getWrappedLineExtent = function (ch) { + if (!cm.options.lineWrapping) { return {begin: 0, end: line.text.length} } + prep = prep || prepareMeasureForLine(cm, line); + return wrappedLineExtentChar(cm, line, prep, ch) + }; + var wrappedLineExtent = getWrappedLineExtent(start.sticky == "before" ? mv(start, -1) : start.ch); + + if (cm.doc.direction == "rtl" || part.level == 1) { + var moveInStorageOrder = (part.level == 1) == (dir < 0); + var ch = mv(start, moveInStorageOrder ? 1 : -1); + if (ch != null && (!moveInStorageOrder ? ch >= part.from && ch >= wrappedLineExtent.begin : ch <= part.to && ch <= wrappedLineExtent.end)) { + // Case 2: We move within an rtl part or in an rtl editor on the same visual line + var sticky = moveInStorageOrder ? "before" : "after"; + return new Pos(start.line, ch, sticky) + } + } + + // Case 3: Could not move within this bidi part in this visual line, so leave + // the current bidi part + + var searchInVisualLine = function (partPos, dir, wrappedLineExtent) { + var getRes = function (ch, moveInStorageOrder) { return moveInStorageOrder + ? new Pos(start.line, mv(ch, 1), "before") + : new Pos(start.line, ch, "after"); }; + + for (; partPos >= 0 && partPos < bidi.length; partPos += dir) { + var part = bidi[partPos]; + var moveInStorageOrder = (dir > 0) == (part.level != 1); + var ch = moveInStorageOrder ? wrappedLineExtent.begin : mv(wrappedLineExtent.end, -1); + if (part.from <= ch && ch < part.to) { return getRes(ch, moveInStorageOrder) } + ch = moveInStorageOrder ? part.from : mv(part.to, -1); + if (wrappedLineExtent.begin <= ch && ch < wrappedLineExtent.end) { return getRes(ch, moveInStorageOrder) } + } + }; + + // Case 3a: Look for other bidi parts on the same visual line + var res = searchInVisualLine(partPos + dir, dir, wrappedLineExtent); + if (res) { return res } + + // Case 3b: Look for other bidi parts on the next visual line + var nextCh = dir > 0 ? wrappedLineExtent.end : mv(wrappedLineExtent.begin, -1); + if (nextCh != null && !(dir > 0 && nextCh == line.text.length)) { + res = searchInVisualLine(dir > 0 ? 0 : bidi.length - 1, dir, getWrappedLineExtent(nextCh)); + if (res) { return res } + } + + // Case 4: Nowhere to move + return null +} + +// EVENT HANDLING + +// Lightweight event framework. on/off also work on DOM nodes, +// registering native DOM handlers. + +var noHandlers = []; + +var on = function(emitter, type, f) { + if (emitter.addEventListener) { + emitter.addEventListener(type, f, false); + } else if (emitter.attachEvent) { + emitter.attachEvent("on" + type, f); + } else { + var map$$1 = emitter._handlers || (emitter._handlers = {}); + map$$1[type] = (map$$1[type] || noHandlers).concat(f); + } +}; + +function getHandlers(emitter, type) { + return emitter._handlers && emitter._handlers[type] || noHandlers +} + +function off(emitter, type, f) { + if (emitter.removeEventListener) { + emitter.removeEventListener(type, f, false); + } else if (emitter.detachEvent) { + emitter.detachEvent("on" + type, f); + } else { + var map$$1 = emitter._handlers, arr = map$$1 && map$$1[type]; + if (arr) { + var index = indexOf(arr, f); + if (index > -1) + { map$$1[type] = arr.slice(0, index).concat(arr.slice(index + 1)); } + } + } +} + +function signal(emitter, type /*, values...*/) { + var handlers = getHandlers(emitter, type); + if (!handlers.length) { return } + var args = Array.prototype.slice.call(arguments, 2); + for (var i = 0; i < handlers.length; ++i) { handlers[i].apply(null, args); } +} + +// The DOM events that CodeMirror handles can be overridden by +// registering a (non-DOM) handler on the editor for the event name, +// and preventDefault-ing the event in that handler. +function signalDOMEvent(cm, e, override) { + if (typeof e == "string") + { e = {type: e, preventDefault: function() { this.defaultPrevented = true; }}; } + signal(cm, override || e.type, cm, e); + return e_defaultPrevented(e) || e.codemirrorIgnore +} + +function signalCursorActivity(cm) { + var arr = cm._handlers && cm._handlers.cursorActivity; + if (!arr) { return } + var set = cm.curOp.cursorActivityHandlers || (cm.curOp.cursorActivityHandlers = []); + for (var i = 0; i < arr.length; ++i) { if (indexOf(set, arr[i]) == -1) + { set.push(arr[i]); } } +} + +function hasHandler(emitter, type) { + return getHandlers(emitter, type).length > 0 +} + +// Add on and off methods to a constructor's prototype, to make +// registering events on such objects more convenient. +function eventMixin(ctor) { + ctor.prototype.on = function(type, f) {on(this, type, f);}; + ctor.prototype.off = function(type, f) {off(this, type, f);}; +} + +// Due to the fact that we still support jurassic IE versions, some +// compatibility wrappers are needed. + +function e_preventDefault(e) { + if (e.preventDefault) { e.preventDefault(); } + else { e.returnValue = false; } +} +function e_stopPropagation(e) { + if (e.stopPropagation) { e.stopPropagation(); } + else { e.cancelBubble = true; } +} +function e_defaultPrevented(e) { + return e.defaultPrevented != null ? e.defaultPrevented : e.returnValue == false +} +function e_stop(e) {e_preventDefault(e); e_stopPropagation(e);} + +function e_target(e) {return e.target || e.srcElement} +function e_button(e) { + var b = e.which; + if (b == null) { + if (e.button & 1) { b = 1; } + else if (e.button & 2) { b = 3; } + else if (e.button & 4) { b = 2; } + } + if (mac && e.ctrlKey && b == 1) { b = 3; } + return b +} + +// Detect drag-and-drop +var dragAndDrop = function() { + // There is *some* kind of drag-and-drop support in IE6-8, but I + // couldn't get it to work yet. + if (ie && ie_version < 9) { return false } + var div = elt('div'); + return "draggable" in div || "dragDrop" in div +}(); + +var zwspSupported; +function zeroWidthElement(measure) { + if (zwspSupported == null) { + var test = elt("span", "\u200b"); + removeChildrenAndAdd(measure, elt("span", [test, document.createTextNode("x")])); + if (measure.firstChild.offsetHeight != 0) + { zwspSupported = test.offsetWidth <= 1 && test.offsetHeight > 2 && !(ie && ie_version < 8); } + } + var node = zwspSupported ? elt("span", "\u200b") : + elt("span", "\u00a0", null, "display: inline-block; width: 1px; margin-right: -1px"); + node.setAttribute("cm-text", ""); + return node +} + +// Feature-detect IE's crummy client rect reporting for bidi text +var badBidiRects; +function hasBadBidiRects(measure) { + if (badBidiRects != null) { return badBidiRects } + var txt = removeChildrenAndAdd(measure, document.createTextNode("A\u062eA")); + var r0 = range(txt, 0, 1).getBoundingClientRect(); + var r1 = range(txt, 1, 2).getBoundingClientRect(); + removeChildren(measure); + if (!r0 || r0.left == r0.right) { return false } // Safari returns null in some cases (#2780) + return badBidiRects = (r1.right - r0.right < 3) +} + +// See if "".split is the broken IE version, if so, provide an +// alternative way to split lines. +var splitLinesAuto = "\n\nb".split(/\n/).length != 3 ? function (string) { + var pos = 0, result = [], l = string.length; + while (pos <= l) { + var nl = string.indexOf("\n", pos); + if (nl == -1) { nl = string.length; } + var line = string.slice(pos, string.charAt(nl - 1) == "\r" ? nl - 1 : nl); + var rt = line.indexOf("\r"); + if (rt != -1) { + result.push(line.slice(0, rt)); + pos += rt + 1; + } else { + result.push(line); + pos = nl + 1; + } + } + return result +} : function (string) { return string.split(/\r\n?|\n/); }; + +var hasSelection = window.getSelection ? function (te) { + try { return te.selectionStart != te.selectionEnd } + catch(e) { return false } +} : function (te) { + var range$$1; + try {range$$1 = te.ownerDocument.selection.createRange();} + catch(e) {} + if (!range$$1 || range$$1.parentElement() != te) { return false } + return range$$1.compareEndPoints("StartToEnd", range$$1) != 0 +}; + +var hasCopyEvent = (function () { + var e = elt("div"); + if ("oncopy" in e) { return true } + e.setAttribute("oncopy", "return;"); + return typeof e.oncopy == "function" +})(); + +var badZoomedRects = null; +function hasBadZoomedRects(measure) { + if (badZoomedRects != null) { return badZoomedRects } + var node = removeChildrenAndAdd(measure, elt("span", "x")); + var normal = node.getBoundingClientRect(); + var fromRange = range(node, 0, 1).getBoundingClientRect(); + return badZoomedRects = Math.abs(normal.left - fromRange.left) > 1 +} + +// Known modes, by name and by MIME +var modes = {}; +var mimeModes = {}; + +// Extra arguments are stored as the mode's dependencies, which is +// used by (legacy) mechanisms like loadmode.js to automatically +// load a mode. (Preferred mechanism is the require/define calls.) +function defineMode(name, mode) { + if (arguments.length > 2) + { mode.dependencies = Array.prototype.slice.call(arguments, 2); } + modes[name] = mode; +} + +function defineMIME(mime, spec) { + mimeModes[mime] = spec; +} + +// Given a MIME type, a {name, ...options} config object, or a name +// string, return a mode config object. +function resolveMode(spec) { + if (typeof spec == "string" && mimeModes.hasOwnProperty(spec)) { + spec = mimeModes[spec]; + } else if (spec && typeof spec.name == "string" && mimeModes.hasOwnProperty(spec.name)) { + var found = mimeModes[spec.name]; + if (typeof found == "string") { found = {name: found}; } + spec = createObj(found, spec); + spec.name = found.name; + } else if (typeof spec == "string" && /^[\w\-]+\/[\w\-]+\+xml$/.test(spec)) { + return resolveMode("application/xml") + } else if (typeof spec == "string" && /^[\w\-]+\/[\w\-]+\+json$/.test(spec)) { + return resolveMode("application/json") + } + if (typeof spec == "string") { return {name: spec} } + else { return spec || {name: "null"} } +} + +// Given a mode spec (anything that resolveMode accepts), find and +// initialize an actual mode object. +function getMode(options, spec) { + spec = resolveMode(spec); + var mfactory = modes[spec.name]; + if (!mfactory) { return getMode(options, "text/plain") } + var modeObj = mfactory(options, spec); + if (modeExtensions.hasOwnProperty(spec.name)) { + var exts = modeExtensions[spec.name]; + for (var prop in exts) { + if (!exts.hasOwnProperty(prop)) { continue } + if (modeObj.hasOwnProperty(prop)) { modeObj["_" + prop] = modeObj[prop]; } + modeObj[prop] = exts[prop]; + } + } + modeObj.name = spec.name; + if (spec.helperType) { modeObj.helperType = spec.helperType; } + if (spec.modeProps) { for (var prop$1 in spec.modeProps) + { modeObj[prop$1] = spec.modeProps[prop$1]; } } + + return modeObj +} + +// This can be used to attach properties to mode objects from +// outside the actual mode definition. +var modeExtensions = {}; +function extendMode(mode, properties) { + var exts = modeExtensions.hasOwnProperty(mode) ? modeExtensions[mode] : (modeExtensions[mode] = {}); + copyObj(properties, exts); +} + +function copyState(mode, state) { + if (state === true) { return state } + if (mode.copyState) { return mode.copyState(state) } + var nstate = {}; + for (var n in state) { + var val = state[n]; + if (val instanceof Array) { val = val.concat([]); } + nstate[n] = val; + } + return nstate +} + +// Given a mode and a state (for that mode), find the inner mode and +// state at the position that the state refers to. +function innerMode(mode, state) { + var info; + while (mode.innerMode) { + info = mode.innerMode(state); + if (!info || info.mode == mode) { break } + state = info.state; + mode = info.mode; + } + return info || {mode: mode, state: state} +} + +function startState(mode, a1, a2) { + return mode.startState ? mode.startState(a1, a2) : true +} + +// STRING STREAM + +// Fed to the mode parsers, provides helper functions to make +// parsers more succinct. + +var StringStream = function(string, tabSize, lineOracle) { + this.pos = this.start = 0; + this.string = string; + this.tabSize = tabSize || 8; + this.lastColumnPos = this.lastColumnValue = 0; + this.lineStart = 0; + this.lineOracle = lineOracle; +}; + +StringStream.prototype.eol = function () {return this.pos >= this.string.length}; +StringStream.prototype.sol = function () {return this.pos == this.lineStart}; +StringStream.prototype.peek = function () {return this.string.charAt(this.pos) || undefined}; +StringStream.prototype.next = function () { + if (this.pos < this.string.length) + { return this.string.charAt(this.pos++) } +}; +StringStream.prototype.eat = function (match) { + var ch = this.string.charAt(this.pos); + var ok; + if (typeof match == "string") { ok = ch == match; } + else { ok = ch && (match.test ? match.test(ch) : match(ch)); } + if (ok) {++this.pos; return ch} +}; +StringStream.prototype.eatWhile = function (match) { + var start = this.pos; + while (this.eat(match)){} + return this.pos > start +}; +StringStream.prototype.eatSpace = function () { + var this$1 = this; + + var start = this.pos; + while (/[\s\u00a0]/.test(this.string.charAt(this.pos))) { ++this$1.pos; } + return this.pos > start +}; +StringStream.prototype.skipToEnd = function () {this.pos = this.string.length;}; +StringStream.prototype.skipTo = function (ch) { + var found = this.string.indexOf(ch, this.pos); + if (found > -1) {this.pos = found; return true} +}; +StringStream.prototype.backUp = function (n) {this.pos -= n;}; +StringStream.prototype.column = function () { + if (this.lastColumnPos < this.start) { + this.lastColumnValue = countColumn(this.string, this.start, this.tabSize, this.lastColumnPos, this.lastColumnValue); + this.lastColumnPos = this.start; + } + return this.lastColumnValue - (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0) +}; +StringStream.prototype.indentation = function () { + return countColumn(this.string, null, this.tabSize) - + (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0) +}; +StringStream.prototype.match = function (pattern, consume, caseInsensitive) { + if (typeof pattern == "string") { + var cased = function (str) { return caseInsensitive ? str.toLowerCase() : str; }; + var substr = this.string.substr(this.pos, pattern.length); + if (cased(substr) == cased(pattern)) { + if (consume !== false) { this.pos += pattern.length; } + return true + } + } else { + var match = this.string.slice(this.pos).match(pattern); + if (match && match.index > 0) { return null } + if (match && consume !== false) { this.pos += match[0].length; } + return match + } +}; +StringStream.prototype.current = function (){return this.string.slice(this.start, this.pos)}; +StringStream.prototype.hideFirstChars = function (n, inner) { + this.lineStart += n; + try { return inner() } + finally { this.lineStart -= n; } +}; +StringStream.prototype.lookAhead = function (n) { + var oracle = this.lineOracle; + return oracle && oracle.lookAhead(n) +}; + +var SavedContext = function(state, lookAhead) { + this.state = state; + this.lookAhead = lookAhead; +}; + +var Context = function(doc, state, line, lookAhead) { + this.state = state; + this.doc = doc; + this.line = line; + this.maxLookAhead = lookAhead || 0; +}; + +Context.prototype.lookAhead = function (n) { + var line = this.doc.getLine(this.line + n); + if (line != null && n > this.maxLookAhead) { this.maxLookAhead = n; } + return line +}; + +Context.prototype.nextLine = function () { + this.line++; + if (this.maxLookAhead > 0) { this.maxLookAhead--; } +}; + +Context.fromSaved = function (doc, saved, line) { + if (saved instanceof SavedContext) + { return new Context(doc, copyState(doc.mode, saved.state), line, saved.lookAhead) } + else + { return new Context(doc, copyState(doc.mode, saved), line) } +}; + +Context.prototype.save = function (copy) { + var state = copy !== false ? copyState(this.doc.mode, this.state) : this.state; + return this.maxLookAhead > 0 ? new SavedContext(state, this.maxLookAhead) : state +}; + + +// Compute a style array (an array starting with a mode generation +// -- for invalidation -- followed by pairs of end positions and +// style strings), which is used to highlight the tokens on the +// line. +function highlightLine(cm, line, context, forceToEnd) { + // A styles array always starts with a number identifying the + // mode/overlays that it is based on (for easy invalidation). + var st = [cm.state.modeGen], lineClasses = {}; + // Compute the base array of styles + runMode(cm, line.text, cm.doc.mode, context, function (end, style) { return st.push(end, style); }, + lineClasses, forceToEnd); + var state = context.state; + + // Run overlays, adjust style array. + var loop = function ( o ) { + var overlay = cm.state.overlays[o], i = 1, at = 0; + context.state = true; + runMode(cm, line.text, overlay.mode, context, function (end, style) { + var start = i; + // Ensure there's a token end at the current position, and that i points at it + while (at < end) { + var i_end = st[i]; + if (i_end > end) + { st.splice(i, 1, end, st[i+1], i_end); } + i += 2; + at = Math.min(end, i_end); + } + if (!style) { return } + if (overlay.opaque) { + st.splice(start, i - start, end, "overlay " + style); + i = start + 2; + } else { + for (; start < i; start += 2) { + var cur = st[start+1]; + st[start+1] = (cur ? cur + " " : "") + "overlay " + style; + } + } + }, lineClasses); + }; + + for (var o = 0; o < cm.state.overlays.length; ++o) loop( o ); + context.state = state; + + return {styles: st, classes: lineClasses.bgClass || lineClasses.textClass ? lineClasses : null} +} + +function getLineStyles(cm, line, updateFrontier) { + if (!line.styles || line.styles[0] != cm.state.modeGen) { + var context = getContextBefore(cm, lineNo(line)); + var resetState = line.text.length > cm.options.maxHighlightLength && copyState(cm.doc.mode, context.state); + var result = highlightLine(cm, line, context); + if (resetState) { context.state = resetState; } + line.stateAfter = context.save(!resetState); + line.styles = result.styles; + if (result.classes) { line.styleClasses = result.classes; } + else if (line.styleClasses) { line.styleClasses = null; } + if (updateFrontier === cm.doc.highlightFrontier) + { cm.doc.modeFrontier = Math.max(cm.doc.modeFrontier, ++cm.doc.highlightFrontier); } + } + return line.styles +} + +function getContextBefore(cm, n, precise) { + var doc = cm.doc, display = cm.display; + if (!doc.mode.startState) { return new Context(doc, true, n) } + var start = findStartLine(cm, n, precise); + var saved = start > doc.first && getLine(doc, start - 1).stateAfter; + var context = saved ? Context.fromSaved(doc, saved, start) : new Context(doc, startState(doc.mode), start); + + doc.iter(start, n, function (line) { + processLine(cm, line.text, context); + var pos = context.line; + line.stateAfter = pos == n - 1 || pos % 5 == 0 || pos >= display.viewFrom && pos < display.viewTo ? context.save() : null; + context.nextLine(); + }); + if (precise) { doc.modeFrontier = context.line; } + return context +} + +// Lightweight form of highlight -- proceed over this line and +// update state, but don't save a style array. Used for lines that +// aren't currently visible. +function processLine(cm, text, context, startAt) { + var mode = cm.doc.mode; + var stream = new StringStream(text, cm.options.tabSize, context); + stream.start = stream.pos = startAt || 0; + if (text == "") { callBlankLine(mode, context.state); } + while (!stream.eol()) { + readToken(mode, stream, context.state); + stream.start = stream.pos; + } +} + +function callBlankLine(mode, state) { + if (mode.blankLine) { return mode.blankLine(state) } + if (!mode.innerMode) { return } + var inner = innerMode(mode, state); + if (inner.mode.blankLine) { return inner.mode.blankLine(inner.state) } +} + +function readToken(mode, stream, state, inner) { + for (var i = 0; i < 10; i++) { + if (inner) { inner[0] = innerMode(mode, state).mode; } + var style = mode.token(stream, state); + if (stream.pos > stream.start) { return style } + } + throw new Error("Mode " + mode.name + " failed to advance stream.") +} + +var Token = function(stream, type, state) { + this.start = stream.start; this.end = stream.pos; + this.string = stream.current(); + this.type = type || null; + this.state = state; +}; + +// Utility for getTokenAt and getLineTokens +function takeToken(cm, pos, precise, asArray) { + var doc = cm.doc, mode = doc.mode, style; + pos = clipPos(doc, pos); + var line = getLine(doc, pos.line), context = getContextBefore(cm, pos.line, precise); + var stream = new StringStream(line.text, cm.options.tabSize, context), tokens; + if (asArray) { tokens = []; } + while ((asArray || stream.pos < pos.ch) && !stream.eol()) { + stream.start = stream.pos; + style = readToken(mode, stream, context.state); + if (asArray) { tokens.push(new Token(stream, style, copyState(doc.mode, context.state))); } + } + return asArray ? tokens : new Token(stream, style, context.state) +} + +function extractLineClasses(type, output) { + if (type) { for (;;) { + var lineClass = type.match(/(?:^|\s+)line-(background-)?(\S+)/); + if (!lineClass) { break } + type = type.slice(0, lineClass.index) + type.slice(lineClass.index + lineClass[0].length); + var prop = lineClass[1] ? "bgClass" : "textClass"; + if (output[prop] == null) + { output[prop] = lineClass[2]; } + else if (!(new RegExp("(?:^|\s)" + lineClass[2] + "(?:$|\s)")).test(output[prop])) + { output[prop] += " " + lineClass[2]; } + } } + return type +} + +// Run the given mode's parser over a line, calling f for each token. +function runMode(cm, text, mode, context, f, lineClasses, forceToEnd) { + var flattenSpans = mode.flattenSpans; + if (flattenSpans == null) { flattenSpans = cm.options.flattenSpans; } + var curStart = 0, curStyle = null; + var stream = new StringStream(text, cm.options.tabSize, context), style; + var inner = cm.options.addModeClass && [null]; + if (text == "") { extractLineClasses(callBlankLine(mode, context.state), lineClasses); } + while (!stream.eol()) { + if (stream.pos > cm.options.maxHighlightLength) { + flattenSpans = false; + if (forceToEnd) { processLine(cm, text, context, stream.pos); } + stream.pos = text.length; + style = null; + } else { + style = extractLineClasses(readToken(mode, stream, context.state, inner), lineClasses); + } + if (inner) { + var mName = inner[0].name; + if (mName) { style = "m-" + (style ? mName + " " + style : mName); } + } + if (!flattenSpans || curStyle != style) { + while (curStart < stream.start) { + curStart = Math.min(stream.start, curStart + 5000); + f(curStart, curStyle); + } + curStyle = style; + } + stream.start = stream.pos; + } + while (curStart < stream.pos) { + // Webkit seems to refuse to render text nodes longer than 57444 + // characters, and returns inaccurate measurements in nodes + // starting around 5000 chars. + var pos = Math.min(stream.pos, curStart + 5000); + f(pos, curStyle); + curStart = pos; + } +} + +// Finds the line to start with when starting a parse. Tries to +// find a line with a stateAfter, so that it can start with a +// valid state. If that fails, it returns the line with the +// smallest indentation, which tends to need the least context to +// parse correctly. +function findStartLine(cm, n, precise) { + var minindent, minline, doc = cm.doc; + var lim = precise ? -1 : n - (cm.doc.mode.innerMode ? 1000 : 100); + for (var search = n; search > lim; --search) { + if (search <= doc.first) { return doc.first } + var line = getLine(doc, search - 1), after = line.stateAfter; + if (after && (!precise || search + (after instanceof SavedContext ? after.lookAhead : 0) <= doc.modeFrontier)) + { return search } + var indented = countColumn(line.text, null, cm.options.tabSize); + if (minline == null || minindent > indented) { + minline = search - 1; + minindent = indented; + } + } + return minline +} + +function retreatFrontier(doc, n) { + doc.modeFrontier = Math.min(doc.modeFrontier, n); + if (doc.highlightFrontier < n - 10) { return } + var start = doc.first; + for (var line = n - 1; line > start; line--) { + var saved = getLine(doc, line).stateAfter; + // change is on 3 + // state on line 1 looked ahead 2 -- so saw 3 + // test 1 + 2 < 3 should cover this + if (saved && (!(saved instanceof SavedContext) || line + saved.lookAhead < n)) { + start = line + 1; + break + } + } + doc.highlightFrontier = Math.min(doc.highlightFrontier, start); +} + +// LINE DATA STRUCTURE + +// Line objects. These hold state related to a line, including +// highlighting info (the styles array). +var Line = function(text, markedSpans, estimateHeight) { + this.text = text; + attachMarkedSpans(this, markedSpans); + this.height = estimateHeight ? estimateHeight(this) : 1; +}; + +Line.prototype.lineNo = function () { return lineNo(this) }; +eventMixin(Line); + +// Change the content (text, markers) of a line. Automatically +// invalidates cached information and tries to re-estimate the +// line's height. +function updateLine(line, text, markedSpans, estimateHeight) { + line.text = text; + if (line.stateAfter) { line.stateAfter = null; } + if (line.styles) { line.styles = null; } + if (line.order != null) { line.order = null; } + detachMarkedSpans(line); + attachMarkedSpans(line, markedSpans); + var estHeight = estimateHeight ? estimateHeight(line) : 1; + if (estHeight != line.height) { updateLineHeight(line, estHeight); } +} + +// Detach a line from the document tree and its markers. +function cleanUpLine(line) { + line.parent = null; + detachMarkedSpans(line); +} + +// Convert a style as returned by a mode (either null, or a string +// containing one or more styles) to a CSS style. This is cached, +// and also looks for line-wide styles. +var styleToClassCache = {}; +var styleToClassCacheWithMode = {}; +function interpretTokenStyle(style, options) { + if (!style || /^\s*$/.test(style)) { return null } + var cache = options.addModeClass ? styleToClassCacheWithMode : styleToClassCache; + return cache[style] || + (cache[style] = style.replace(/\S+/g, "cm-$&")) +} + +// Render the DOM representation of the text of a line. Also builds +// up a 'line map', which points at the DOM nodes that represent +// specific stretches of text, and is used by the measuring code. +// The returned object contains the DOM node, this map, and +// information about line-wide styles that were set by the mode. +function buildLineContent(cm, lineView) { + // The padding-right forces the element to have a 'border', which + // is needed on Webkit to be able to get line-level bounding + // rectangles for it (in measureChar). + var content = eltP("span", null, null, webkit ? "padding-right: .1px" : null); + var builder = {pre: eltP("pre", [content], "CodeMirror-line"), content: content, + col: 0, pos: 0, cm: cm, + trailingSpace: false, + splitSpaces: (ie || webkit) && cm.getOption("lineWrapping")}; + lineView.measure = {}; + + // Iterate over the logical lines that make up this visual line. + for (var i = 0; i <= (lineView.rest ? lineView.rest.length : 0); i++) { + var line = i ? lineView.rest[i - 1] : lineView.line, order = (void 0); + builder.pos = 0; + builder.addToken = buildToken; + // Optionally wire in some hacks into the token-rendering + // algorithm, to deal with browser quirks. + if (hasBadBidiRects(cm.display.measure) && (order = getOrder(line, cm.doc.direction))) + { builder.addToken = buildTokenBadBidi(builder.addToken, order); } + builder.map = []; + var allowFrontierUpdate = lineView != cm.display.externalMeasured && lineNo(line); + insertLineContent(line, builder, getLineStyles(cm, line, allowFrontierUpdate)); + if (line.styleClasses) { + if (line.styleClasses.bgClass) + { builder.bgClass = joinClasses(line.styleClasses.bgClass, builder.bgClass || ""); } + if (line.styleClasses.textClass) + { builder.textClass = joinClasses(line.styleClasses.textClass, builder.textClass || ""); } + } + + // Ensure at least a single node is present, for measuring. + if (builder.map.length == 0) + { builder.map.push(0, 0, builder.content.appendChild(zeroWidthElement(cm.display.measure))); } + + // Store the map and a cache object for the current logical line + if (i == 0) { + lineView.measure.map = builder.map; + lineView.measure.cache = {}; + } else { + (lineView.measure.maps || (lineView.measure.maps = [])).push(builder.map) + ;(lineView.measure.caches || (lineView.measure.caches = [])).push({}); + } + } + + // See issue #2901 + if (webkit) { + var last = builder.content.lastChild; + if (/\bcm-tab\b/.test(last.className) || (last.querySelector && last.querySelector(".cm-tab"))) + { builder.content.className = "cm-tab-wrap-hack"; } + } + + signal(cm, "renderLine", cm, lineView.line, builder.pre); + if (builder.pre.className) + { builder.textClass = joinClasses(builder.pre.className, builder.textClass || ""); } + + return builder +} + +function defaultSpecialCharPlaceholder(ch) { + var token = elt("span", "\u2022", "cm-invalidchar"); + token.title = "\\u" + ch.charCodeAt(0).toString(16); + token.setAttribute("aria-label", token.title); + return token +} + +// Build up the DOM representation for a single token, and add it to +// the line map. Takes care to render special characters separately. +function buildToken(builder, text, style, startStyle, endStyle, title, css) { + if (!text) { return } + var displayText = builder.splitSpaces ? splitSpaces(text, builder.trailingSpace) : text; + var special = builder.cm.state.specialChars, mustWrap = false; + var content; + if (!special.test(text)) { + builder.col += text.length; + content = document.createTextNode(displayText); + builder.map.push(builder.pos, builder.pos + text.length, content); + if (ie && ie_version < 9) { mustWrap = true; } + builder.pos += text.length; + } else { + content = document.createDocumentFragment(); + var pos = 0; + while (true) { + special.lastIndex = pos; + var m = special.exec(text); + var skipped = m ? m.index - pos : text.length - pos; + if (skipped) { + var txt = document.createTextNode(displayText.slice(pos, pos + skipped)); + if (ie && ie_version < 9) { content.appendChild(elt("span", [txt])); } + else { content.appendChild(txt); } + builder.map.push(builder.pos, builder.pos + skipped, txt); + builder.col += skipped; + builder.pos += skipped; + } + if (!m) { break } + pos += skipped + 1; + var txt$1 = (void 0); + if (m[0] == "\t") { + var tabSize = builder.cm.options.tabSize, tabWidth = tabSize - builder.col % tabSize; + txt$1 = content.appendChild(elt("span", spaceStr(tabWidth), "cm-tab")); + txt$1.setAttribute("role", "presentation"); + txt$1.setAttribute("cm-text", "\t"); + builder.col += tabWidth; + } else if (m[0] == "\r" || m[0] == "\n") { + txt$1 = content.appendChild(elt("span", m[0] == "\r" ? "\u240d" : "\u2424", "cm-invalidchar")); + txt$1.setAttribute("cm-text", m[0]); + builder.col += 1; + } else { + txt$1 = builder.cm.options.specialCharPlaceholder(m[0]); + txt$1.setAttribute("cm-text", m[0]); + if (ie && ie_version < 9) { content.appendChild(elt("span", [txt$1])); } + else { content.appendChild(txt$1); } + builder.col += 1; + } + builder.map.push(builder.pos, builder.pos + 1, txt$1); + builder.pos++; + } + } + builder.trailingSpace = displayText.charCodeAt(text.length - 1) == 32; + if (style || startStyle || endStyle || mustWrap || css) { + var fullStyle = style || ""; + if (startStyle) { fullStyle += startStyle; } + if (endStyle) { fullStyle += endStyle; } + var token = elt("span", [content], fullStyle, css); + if (title) { token.title = title; } + return builder.content.appendChild(token) + } + builder.content.appendChild(content); +} + +function splitSpaces(text, trailingBefore) { + if (text.length > 1 && !/ /.test(text)) { return text } + var spaceBefore = trailingBefore, result = ""; + for (var i = 0; i < text.length; i++) { + var ch = text.charAt(i); + if (ch == " " && spaceBefore && (i == text.length - 1 || text.charCodeAt(i + 1) == 32)) + { ch = "\u00a0"; } + result += ch; + spaceBefore = ch == " "; + } + return result +} + +// Work around nonsense dimensions being reported for stretches of +// right-to-left text. +function buildTokenBadBidi(inner, order) { + return function (builder, text, style, startStyle, endStyle, title, css) { + style = style ? style + " cm-force-border" : "cm-force-border"; + var start = builder.pos, end = start + text.length; + for (;;) { + // Find the part that overlaps with the start of this text + var part = (void 0); + for (var i = 0; i < order.length; i++) { + part = order[i]; + if (part.to > start && part.from <= start) { break } + } + if (part.to >= end) { return inner(builder, text, style, startStyle, endStyle, title, css) } + inner(builder, text.slice(0, part.to - start), style, startStyle, null, title, css); + startStyle = null; + text = text.slice(part.to - start); + start = part.to; + } + } +} + +function buildCollapsedSpan(builder, size, marker, ignoreWidget) { + var widget = !ignoreWidget && marker.widgetNode; + if (widget) { builder.map.push(builder.pos, builder.pos + size, widget); } + if (!ignoreWidget && builder.cm.display.input.needsContentAttribute) { + if (!widget) + { widget = builder.content.appendChild(document.createElement("span")); } + widget.setAttribute("cm-marker", marker.id); + } + if (widget) { + builder.cm.display.input.setUneditable(widget); + builder.content.appendChild(widget); + } + builder.pos += size; + builder.trailingSpace = false; +} + +// Outputs a number of spans to make up a line, taking highlighting +// and marked text into account. +function insertLineContent(line, builder, styles) { + var spans = line.markedSpans, allText = line.text, at = 0; + if (!spans) { + for (var i$1 = 1; i$1 < styles.length; i$1+=2) + { builder.addToken(builder, allText.slice(at, at = styles[i$1]), interpretTokenStyle(styles[i$1+1], builder.cm.options)); } + return + } + + var len = allText.length, pos = 0, i = 1, text = "", style, css; + var nextChange = 0, spanStyle, spanEndStyle, spanStartStyle, title, collapsed; + for (;;) { + if (nextChange == pos) { // Update current marker set + spanStyle = spanEndStyle = spanStartStyle = title = css = ""; + collapsed = null; nextChange = Infinity; + var foundBookmarks = [], endStyles = (void 0); + for (var j = 0; j < spans.length; ++j) { + var sp = spans[j], m = sp.marker; + if (m.type == "bookmark" && sp.from == pos && m.widgetNode) { + foundBookmarks.push(m); + } else if (sp.from <= pos && (sp.to == null || sp.to > pos || m.collapsed && sp.to == pos && sp.from == pos)) { + if (sp.to != null && sp.to != pos && nextChange > sp.to) { + nextChange = sp.to; + spanEndStyle = ""; + } + if (m.className) { spanStyle += " " + m.className; } + if (m.css) { css = (css ? css + ";" : "") + m.css; } + if (m.startStyle && sp.from == pos) { spanStartStyle += " " + m.startStyle; } + if (m.endStyle && sp.to == nextChange) { (endStyles || (endStyles = [])).push(m.endStyle, sp.to); } + if (m.title && !title) { title = m.title; } + if (m.collapsed && (!collapsed || compareCollapsedMarkers(collapsed.marker, m) < 0)) + { collapsed = sp; } + } else if (sp.from > pos && nextChange > sp.from) { + nextChange = sp.from; + } + } + if (endStyles) { for (var j$1 = 0; j$1 < endStyles.length; j$1 += 2) + { if (endStyles[j$1 + 1] == nextChange) { spanEndStyle += " " + endStyles[j$1]; } } } + + if (!collapsed || collapsed.from == pos) { for (var j$2 = 0; j$2 < foundBookmarks.length; ++j$2) + { buildCollapsedSpan(builder, 0, foundBookmarks[j$2]); } } + if (collapsed && (collapsed.from || 0) == pos) { + buildCollapsedSpan(builder, (collapsed.to == null ? len + 1 : collapsed.to) - pos, + collapsed.marker, collapsed.from == null); + if (collapsed.to == null) { return } + if (collapsed.to == pos) { collapsed = false; } + } + } + if (pos >= len) { break } + + var upto = Math.min(len, nextChange); + while (true) { + if (text) { + var end = pos + text.length; + if (!collapsed) { + var tokenText = end > upto ? text.slice(0, upto - pos) : text; + builder.addToken(builder, tokenText, style ? style + spanStyle : spanStyle, + spanStartStyle, pos + tokenText.length == nextChange ? spanEndStyle : "", title, css); + } + if (end >= upto) {text = text.slice(upto - pos); pos = upto; break} + pos = end; + spanStartStyle = ""; + } + text = allText.slice(at, at = styles[i++]); + style = interpretTokenStyle(styles[i++], builder.cm.options); + } + } +} + + +// These objects are used to represent the visible (currently drawn) +// part of the document. A LineView may correspond to multiple +// logical lines, if those are connected by collapsed ranges. +function LineView(doc, line, lineN) { + // The starting line + this.line = line; + // Continuing lines, if any + this.rest = visualLineContinued(line); + // Number of logical lines in this visual line + this.size = this.rest ? lineNo(lst(this.rest)) - lineN + 1 : 1; + this.node = this.text = null; + this.hidden = lineIsHidden(doc, line); +} + +// Create a range of LineView objects for the given lines. +function buildViewArray(cm, from, to) { + var array = [], nextPos; + for (var pos = from; pos < to; pos = nextPos) { + var view = new LineView(cm.doc, getLine(cm.doc, pos), pos); + nextPos = pos + view.size; + array.push(view); + } + return array +} + +var operationGroup = null; + +function pushOperation(op) { + if (operationGroup) { + operationGroup.ops.push(op); + } else { + op.ownsGroup = operationGroup = { + ops: [op], + delayedCallbacks: [] + }; + } +} + +function fireCallbacksForOps(group) { + // Calls delayed callbacks and cursorActivity handlers until no + // new ones appear + var callbacks = group.delayedCallbacks, i = 0; + do { + for (; i < callbacks.length; i++) + { callbacks[i].call(null); } + for (var j = 0; j < group.ops.length; j++) { + var op = group.ops[j]; + if (op.cursorActivityHandlers) + { while (op.cursorActivityCalled < op.cursorActivityHandlers.length) + { op.cursorActivityHandlers[op.cursorActivityCalled++].call(null, op.cm); } } + } + } while (i < callbacks.length) +} + +function finishOperation(op, endCb) { + var group = op.ownsGroup; + if (!group) { return } + + try { fireCallbacksForOps(group); } + finally { + operationGroup = null; + endCb(group); + } +} + +var orphanDelayedCallbacks = null; + +// Often, we want to signal events at a point where we are in the +// middle of some work, but don't want the handler to start calling +// other methods on the editor, which might be in an inconsistent +// state or simply not expect any other events to happen. +// signalLater looks whether there are any handlers, and schedules +// them to be executed when the last operation ends, or, if no +// operation is active, when a timeout fires. +function signalLater(emitter, type /*, values...*/) { + var arr = getHandlers(emitter, type); + if (!arr.length) { return } + var args = Array.prototype.slice.call(arguments, 2), list; + if (operationGroup) { + list = operationGroup.delayedCallbacks; + } else if (orphanDelayedCallbacks) { + list = orphanDelayedCallbacks; + } else { + list = orphanDelayedCallbacks = []; + setTimeout(fireOrphanDelayed, 0); + } + var loop = function ( i ) { + list.push(function () { return arr[i].apply(null, args); }); + }; + + for (var i = 0; i < arr.length; ++i) + loop( i ); +} + +function fireOrphanDelayed() { + var delayed = orphanDelayedCallbacks; + orphanDelayedCallbacks = null; + for (var i = 0; i < delayed.length; ++i) { delayed[i](); } +} + +// When an aspect of a line changes, a string is added to +// lineView.changes. This updates the relevant part of the line's +// DOM structure. +function updateLineForChanges(cm, lineView, lineN, dims) { + for (var j = 0; j < lineView.changes.length; j++) { + var type = lineView.changes[j]; + if (type == "text") { updateLineText(cm, lineView); } + else if (type == "gutter") { updateLineGutter(cm, lineView, lineN, dims); } + else if (type == "class") { updateLineClasses(cm, lineView); } + else if (type == "widget") { updateLineWidgets(cm, lineView, dims); } + } + lineView.changes = null; +} + +// Lines with gutter elements, widgets or a background class need to +// be wrapped, and have the extra elements added to the wrapper div +function ensureLineWrapped(lineView) { + if (lineView.node == lineView.text) { + lineView.node = elt("div", null, null, "position: relative"); + if (lineView.text.parentNode) + { lineView.text.parentNode.replaceChild(lineView.node, lineView.text); } + lineView.node.appendChild(lineView.text); + if (ie && ie_version < 8) { lineView.node.style.zIndex = 2; } + } + return lineView.node +} + +function updateLineBackground(cm, lineView) { + var cls = lineView.bgClass ? lineView.bgClass + " " + (lineView.line.bgClass || "") : lineView.line.bgClass; + if (cls) { cls += " CodeMirror-linebackground"; } + if (lineView.background) { + if (cls) { lineView.background.className = cls; } + else { lineView.background.parentNode.removeChild(lineView.background); lineView.background = null; } + } else if (cls) { + var wrap = ensureLineWrapped(lineView); + lineView.background = wrap.insertBefore(elt("div", null, cls), wrap.firstChild); + cm.display.input.setUneditable(lineView.background); + } +} + +// Wrapper around buildLineContent which will reuse the structure +// in display.externalMeasured when possible. +function getLineContent(cm, lineView) { + var ext = cm.display.externalMeasured; + if (ext && ext.line == lineView.line) { + cm.display.externalMeasured = null; + lineView.measure = ext.measure; + return ext.built + } + return buildLineContent(cm, lineView) +} + +// Redraw the line's text. Interacts with the background and text +// classes because the mode may output tokens that influence these +// classes. +function updateLineText(cm, lineView) { + var cls = lineView.text.className; + var built = getLineContent(cm, lineView); + if (lineView.text == lineView.node) { lineView.node = built.pre; } + lineView.text.parentNode.replaceChild(built.pre, lineView.text); + lineView.text = built.pre; + if (built.bgClass != lineView.bgClass || built.textClass != lineView.textClass) { + lineView.bgClass = built.bgClass; + lineView.textClass = built.textClass; + updateLineClasses(cm, lineView); + } else if (cls) { + lineView.text.className = cls; + } +} + +function updateLineClasses(cm, lineView) { + updateLineBackground(cm, lineView); + if (lineView.line.wrapClass) + { ensureLineWrapped(lineView).className = lineView.line.wrapClass; } + else if (lineView.node != lineView.text) + { lineView.node.className = ""; } + var textClass = lineView.textClass ? lineView.textClass + " " + (lineView.line.textClass || "") : lineView.line.textClass; + lineView.text.className = textClass || ""; +} + +function updateLineGutter(cm, lineView, lineN, dims) { + if (lineView.gutter) { + lineView.node.removeChild(lineView.gutter); + lineView.gutter = null; + } + if (lineView.gutterBackground) { + lineView.node.removeChild(lineView.gutterBackground); + lineView.gutterBackground = null; + } + if (lineView.line.gutterClass) { + var wrap = ensureLineWrapped(lineView); + lineView.gutterBackground = elt("div", null, "CodeMirror-gutter-background " + lineView.line.gutterClass, + ("left: " + (cm.options.fixedGutter ? dims.fixedPos : -dims.gutterTotalWidth) + "px; width: " + (dims.gutterTotalWidth) + "px")); + cm.display.input.setUneditable(lineView.gutterBackground); + wrap.insertBefore(lineView.gutterBackground, lineView.text); + } + var markers = lineView.line.gutterMarkers; + if (cm.options.lineNumbers || markers) { + var wrap$1 = ensureLineWrapped(lineView); + var gutterWrap = lineView.gutter = elt("div", null, "CodeMirror-gutter-wrapper", ("left: " + (cm.options.fixedGutter ? dims.fixedPos : -dims.gutterTotalWidth) + "px")); + cm.display.input.setUneditable(gutterWrap); + wrap$1.insertBefore(gutterWrap, lineView.text); + if (lineView.line.gutterClass) + { gutterWrap.className += " " + lineView.line.gutterClass; } + if (cm.options.lineNumbers && (!markers || !markers["CodeMirror-linenumbers"])) + { lineView.lineNumber = gutterWrap.appendChild( + elt("div", lineNumberFor(cm.options, lineN), + "CodeMirror-linenumber CodeMirror-gutter-elt", + ("left: " + (dims.gutterLeft["CodeMirror-linenumbers"]) + "px; width: " + (cm.display.lineNumInnerWidth) + "px"))); } + if (markers) { for (var k = 0; k < cm.options.gutters.length; ++k) { + var id = cm.options.gutters[k], found = markers.hasOwnProperty(id) && markers[id]; + if (found) + { gutterWrap.appendChild(elt("div", [found], "CodeMirror-gutter-elt", + ("left: " + (dims.gutterLeft[id]) + "px; width: " + (dims.gutterWidth[id]) + "px"))); } + } } + } +} + +function updateLineWidgets(cm, lineView, dims) { + if (lineView.alignable) { lineView.alignable = null; } + for (var node = lineView.node.firstChild, next = (void 0); node; node = next) { + next = node.nextSibling; + if (node.className == "CodeMirror-linewidget") + { lineView.node.removeChild(node); } + } + insertLineWidgets(cm, lineView, dims); +} + +// Build a line's DOM representation from scratch +function buildLineElement(cm, lineView, lineN, dims) { + var built = getLineContent(cm, lineView); + lineView.text = lineView.node = built.pre; + if (built.bgClass) { lineView.bgClass = built.bgClass; } + if (built.textClass) { lineView.textClass = built.textClass; } + + updateLineClasses(cm, lineView); + updateLineGutter(cm, lineView, lineN, dims); + insertLineWidgets(cm, lineView, dims); + return lineView.node +} + +// A lineView may contain multiple logical lines (when merged by +// collapsed spans). The widgets for all of them need to be drawn. +function insertLineWidgets(cm, lineView, dims) { + insertLineWidgetsFor(cm, lineView.line, lineView, dims, true); + if (lineView.rest) { for (var i = 0; i < lineView.rest.length; i++) + { insertLineWidgetsFor(cm, lineView.rest[i], lineView, dims, false); } } +} + +function insertLineWidgetsFor(cm, line, lineView, dims, allowAbove) { + if (!line.widgets) { return } + var wrap = ensureLineWrapped(lineView); + for (var i = 0, ws = line.widgets; i < ws.length; ++i) { + var widget = ws[i], node = elt("div", [widget.node], "CodeMirror-linewidget"); + if (!widget.handleMouseEvents) { node.setAttribute("cm-ignore-events", "true"); } + positionLineWidget(widget, node, lineView, dims); + cm.display.input.setUneditable(node); + if (allowAbove && widget.above) + { wrap.insertBefore(node, lineView.gutter || lineView.text); } + else + { wrap.appendChild(node); } + signalLater(widget, "redraw"); + } +} + +function positionLineWidget(widget, node, lineView, dims) { + if (widget.noHScroll) { + (lineView.alignable || (lineView.alignable = [])).push(node); + var width = dims.wrapperWidth; + node.style.left = dims.fixedPos + "px"; + if (!widget.coverGutter) { + width -= dims.gutterTotalWidth; + node.style.paddingLeft = dims.gutterTotalWidth + "px"; + } + node.style.width = width + "px"; + } + if (widget.coverGutter) { + node.style.zIndex = 5; + node.style.position = "relative"; + if (!widget.noHScroll) { node.style.marginLeft = -dims.gutterTotalWidth + "px"; } + } +} + +function widgetHeight(widget) { + if (widget.height != null) { return widget.height } + var cm = widget.doc.cm; + if (!cm) { return 0 } + if (!contains(document.body, widget.node)) { + var parentStyle = "position: relative;"; + if (widget.coverGutter) + { parentStyle += "margin-left: -" + cm.display.gutters.offsetWidth + "px;"; } + if (widget.noHScroll) + { parentStyle += "width: " + cm.display.wrapper.clientWidth + "px;"; } + removeChildrenAndAdd(cm.display.measure, elt("div", [widget.node], null, parentStyle)); + } + return widget.height = widget.node.parentNode.offsetHeight +} + +// Return true when the given mouse event happened in a widget +function eventInWidget(display, e) { + for (var n = e_target(e); n != display.wrapper; n = n.parentNode) { + if (!n || (n.nodeType == 1 && n.getAttribute("cm-ignore-events") == "true") || + (n.parentNode == display.sizer && n != display.mover)) + { return true } + } +} + +// POSITION MEASUREMENT + +function paddingTop(display) {return display.lineSpace.offsetTop} +function paddingVert(display) {return display.mover.offsetHeight - display.lineSpace.offsetHeight} +function paddingH(display) { + if (display.cachedPaddingH) { return display.cachedPaddingH } + var e = removeChildrenAndAdd(display.measure, elt("pre", "x")); + var style = window.getComputedStyle ? window.getComputedStyle(e) : e.currentStyle; + var data = {left: parseInt(style.paddingLeft), right: parseInt(style.paddingRight)}; + if (!isNaN(data.left) && !isNaN(data.right)) { display.cachedPaddingH = data; } + return data +} + +function scrollGap(cm) { return scrollerGap - cm.display.nativeBarWidth } +function displayWidth(cm) { + return cm.display.scroller.clientWidth - scrollGap(cm) - cm.display.barWidth +} +function displayHeight(cm) { + return cm.display.scroller.clientHeight - scrollGap(cm) - cm.display.barHeight +} + +// Ensure the lineView.wrapping.heights array is populated. This is +// an array of bottom offsets for the lines that make up a drawn +// line. When lineWrapping is on, there might be more than one +// height. +function ensureLineHeights(cm, lineView, rect) { + var wrapping = cm.options.lineWrapping; + var curWidth = wrapping && displayWidth(cm); + if (!lineView.measure.heights || wrapping && lineView.measure.width != curWidth) { + var heights = lineView.measure.heights = []; + if (wrapping) { + lineView.measure.width = curWidth; + var rects = lineView.text.firstChild.getClientRects(); + for (var i = 0; i < rects.length - 1; i++) { + var cur = rects[i], next = rects[i + 1]; + if (Math.abs(cur.bottom - next.bottom) > 2) + { heights.push((cur.bottom + next.top) / 2 - rect.top); } + } + } + heights.push(rect.bottom - rect.top); + } +} + +// Find a line map (mapping character offsets to text nodes) and a +// measurement cache for the given line number. (A line view might +// contain multiple lines when collapsed ranges are present.) +function mapFromLineView(lineView, line, lineN) { + if (lineView.line == line) + { return {map: lineView.measure.map, cache: lineView.measure.cache} } + for (var i = 0; i < lineView.rest.length; i++) + { if (lineView.rest[i] == line) + { return {map: lineView.measure.maps[i], cache: lineView.measure.caches[i]} } } + for (var i$1 = 0; i$1 < lineView.rest.length; i$1++) + { if (lineNo(lineView.rest[i$1]) > lineN) + { return {map: lineView.measure.maps[i$1], cache: lineView.measure.caches[i$1], before: true} } } +} + +// Render a line into the hidden node display.externalMeasured. Used +// when measurement is needed for a line that's not in the viewport. +function updateExternalMeasurement(cm, line) { + line = visualLine(line); + var lineN = lineNo(line); + var view = cm.display.externalMeasured = new LineView(cm.doc, line, lineN); + view.lineN = lineN; + var built = view.built = buildLineContent(cm, view); + view.text = built.pre; + removeChildrenAndAdd(cm.display.lineMeasure, built.pre); + return view +} + +// Get a {top, bottom, left, right} box (in line-local coordinates) +// for a given character. +function measureChar(cm, line, ch, bias) { + return measureCharPrepared(cm, prepareMeasureForLine(cm, line), ch, bias) +} + +// Find a line view that corresponds to the given line number. +function findViewForLine(cm, lineN) { + if (lineN >= cm.display.viewFrom && lineN < cm.display.viewTo) + { return cm.display.view[findViewIndex(cm, lineN)] } + var ext = cm.display.externalMeasured; + if (ext && lineN >= ext.lineN && lineN < ext.lineN + ext.size) + { return ext } +} + +// Measurement can be split in two steps, the set-up work that +// applies to the whole line, and the measurement of the actual +// character. Functions like coordsChar, that need to do a lot of +// measurements in a row, can thus ensure that the set-up work is +// only done once. +function prepareMeasureForLine(cm, line) { + var lineN = lineNo(line); + var view = findViewForLine(cm, lineN); + if (view && !view.text) { + view = null; + } else if (view && view.changes) { + updateLineForChanges(cm, view, lineN, getDimensions(cm)); + cm.curOp.forceUpdate = true; + } + if (!view) + { view = updateExternalMeasurement(cm, line); } + + var info = mapFromLineView(view, line, lineN); + return { + line: line, view: view, rect: null, + map: info.map, cache: info.cache, before: info.before, + hasHeights: false + } +} + +// Given a prepared measurement object, measures the position of an +// actual character (or fetches it from the cache). +function measureCharPrepared(cm, prepared, ch, bias, varHeight) { + if (prepared.before) { ch = -1; } + var key = ch + (bias || ""), found; + if (prepared.cache.hasOwnProperty(key)) { + found = prepared.cache[key]; + } else { + if (!prepared.rect) + { prepared.rect = prepared.view.text.getBoundingClientRect(); } + if (!prepared.hasHeights) { + ensureLineHeights(cm, prepared.view, prepared.rect); + prepared.hasHeights = true; + } + found = measureCharInner(cm, prepared, ch, bias); + if (!found.bogus) { prepared.cache[key] = found; } + } + return {left: found.left, right: found.right, + top: varHeight ? found.rtop : found.top, + bottom: varHeight ? found.rbottom : found.bottom} +} + +var nullRect = {left: 0, right: 0, top: 0, bottom: 0}; + +function nodeAndOffsetInLineMap(map$$1, ch, bias) { + var node, start, end, collapse, mStart, mEnd; + // First, search the line map for the text node corresponding to, + // or closest to, the target character. + for (var i = 0; i < map$$1.length; i += 3) { + mStart = map$$1[i]; + mEnd = map$$1[i + 1]; + if (ch < mStart) { + start = 0; end = 1; + collapse = "left"; + } else if (ch < mEnd) { + start = ch - mStart; + end = start + 1; + } else if (i == map$$1.length - 3 || ch == mEnd && map$$1[i + 3] > ch) { + end = mEnd - mStart; + start = end - 1; + if (ch >= mEnd) { collapse = "right"; } + } + if (start != null) { + node = map$$1[i + 2]; + if (mStart == mEnd && bias == (node.insertLeft ? "left" : "right")) + { collapse = bias; } + if (bias == "left" && start == 0) + { while (i && map$$1[i - 2] == map$$1[i - 3] && map$$1[i - 1].insertLeft) { + node = map$$1[(i -= 3) + 2]; + collapse = "left"; + } } + if (bias == "right" && start == mEnd - mStart) + { while (i < map$$1.length - 3 && map$$1[i + 3] == map$$1[i + 4] && !map$$1[i + 5].insertLeft) { + node = map$$1[(i += 3) + 2]; + collapse = "right"; + } } + break + } + } + return {node: node, start: start, end: end, collapse: collapse, coverStart: mStart, coverEnd: mEnd} +} + +function getUsefulRect(rects, bias) { + var rect = nullRect; + if (bias == "left") { for (var i = 0; i < rects.length; i++) { + if ((rect = rects[i]).left != rect.right) { break } + } } else { for (var i$1 = rects.length - 1; i$1 >= 0; i$1--) { + if ((rect = rects[i$1]).left != rect.right) { break } + } } + return rect +} + +function measureCharInner(cm, prepared, ch, bias) { + var place = nodeAndOffsetInLineMap(prepared.map, ch, bias); + var node = place.node, start = place.start, end = place.end, collapse = place.collapse; + + var rect; + if (node.nodeType == 3) { // If it is a text node, use a range to retrieve the coordinates. + for (var i$1 = 0; i$1 < 4; i$1++) { // Retry a maximum of 4 times when nonsense rectangles are returned + while (start && isExtendingChar(prepared.line.text.charAt(place.coverStart + start))) { --start; } + while (place.coverStart + end < place.coverEnd && isExtendingChar(prepared.line.text.charAt(place.coverStart + end))) { ++end; } + if (ie && ie_version < 9 && start == 0 && end == place.coverEnd - place.coverStart) + { rect = node.parentNode.getBoundingClientRect(); } + else + { rect = getUsefulRect(range(node, start, end).getClientRects(), bias); } + if (rect.left || rect.right || start == 0) { break } + end = start; + start = start - 1; + collapse = "right"; + } + if (ie && ie_version < 11) { rect = maybeUpdateRectForZooming(cm.display.measure, rect); } + } else { // If it is a widget, simply get the box for the whole widget. + if (start > 0) { collapse = bias = "right"; } + var rects; + if (cm.options.lineWrapping && (rects = node.getClientRects()).length > 1) + { rect = rects[bias == "right" ? rects.length - 1 : 0]; } + else + { rect = node.getBoundingClientRect(); } + } + if (ie && ie_version < 9 && !start && (!rect || !rect.left && !rect.right)) { + var rSpan = node.parentNode.getClientRects()[0]; + if (rSpan) + { rect = {left: rSpan.left, right: rSpan.left + charWidth(cm.display), top: rSpan.top, bottom: rSpan.bottom}; } + else + { rect = nullRect; } + } + + var rtop = rect.top - prepared.rect.top, rbot = rect.bottom - prepared.rect.top; + var mid = (rtop + rbot) / 2; + var heights = prepared.view.measure.heights; + var i = 0; + for (; i < heights.length - 1; i++) + { if (mid < heights[i]) { break } } + var top = i ? heights[i - 1] : 0, bot = heights[i]; + var result = {left: (collapse == "right" ? rect.right : rect.left) - prepared.rect.left, + right: (collapse == "left" ? rect.left : rect.right) - prepared.rect.left, + top: top, bottom: bot}; + if (!rect.left && !rect.right) { result.bogus = true; } + if (!cm.options.singleCursorHeightPerLine) { result.rtop = rtop; result.rbottom = rbot; } + + return result +} + +// Work around problem with bounding client rects on ranges being +// returned incorrectly when zoomed on IE10 and below. +function maybeUpdateRectForZooming(measure, rect) { + if (!window.screen || screen.logicalXDPI == null || + screen.logicalXDPI == screen.deviceXDPI || !hasBadZoomedRects(measure)) + { return rect } + var scaleX = screen.logicalXDPI / screen.deviceXDPI; + var scaleY = screen.logicalYDPI / screen.deviceYDPI; + return {left: rect.left * scaleX, right: rect.right * scaleX, + top: rect.top * scaleY, bottom: rect.bottom * scaleY} +} + +function clearLineMeasurementCacheFor(lineView) { + if (lineView.measure) { + lineView.measure.cache = {}; + lineView.measure.heights = null; + if (lineView.rest) { for (var i = 0; i < lineView.rest.length; i++) + { lineView.measure.caches[i] = {}; } } + } +} + +function clearLineMeasurementCache(cm) { + cm.display.externalMeasure = null; + removeChildren(cm.display.lineMeasure); + for (var i = 0; i < cm.display.view.length; i++) + { clearLineMeasurementCacheFor(cm.display.view[i]); } +} + +function clearCaches(cm) { + clearLineMeasurementCache(cm); + cm.display.cachedCharWidth = cm.display.cachedTextHeight = cm.display.cachedPaddingH = null; + if (!cm.options.lineWrapping) { cm.display.maxLineChanged = true; } + cm.display.lineNumChars = null; +} + +function pageScrollX() { + // Work around https://bugs.chromium.org/p/chromium/issues/detail?id=489206 + // which causes page_Offset and bounding client rects to use + // different reference viewports and invalidate our calculations. + if (chrome && android) { return -(document.body.getBoundingClientRect().left - parseInt(getComputedStyle(document.body).marginLeft)) } + return window.pageXOffset || (document.documentElement || document.body).scrollLeft +} +function pageScrollY() { + if (chrome && android) { return -(document.body.getBoundingClientRect().top - parseInt(getComputedStyle(document.body).marginTop)) } + return window.pageYOffset || (document.documentElement || document.body).scrollTop +} + +// Converts a {top, bottom, left, right} box from line-local +// coordinates into another coordinate system. Context may be one of +// "line", "div" (display.lineDiv), "local"./null (editor), "window", +// or "page". +function intoCoordSystem(cm, lineObj, rect, context, includeWidgets) { + if (!includeWidgets && lineObj.widgets) { for (var i = 0; i < lineObj.widgets.length; ++i) { if (lineObj.widgets[i].above) { + var size = widgetHeight(lineObj.widgets[i]); + rect.top += size; rect.bottom += size; + } } } + if (context == "line") { return rect } + if (!context) { context = "local"; } + var yOff = heightAtLine(lineObj); + if (context == "local") { yOff += paddingTop(cm.display); } + else { yOff -= cm.display.viewOffset; } + if (context == "page" || context == "window") { + var lOff = cm.display.lineSpace.getBoundingClientRect(); + yOff += lOff.top + (context == "window" ? 0 : pageScrollY()); + var xOff = lOff.left + (context == "window" ? 0 : pageScrollX()); + rect.left += xOff; rect.right += xOff; + } + rect.top += yOff; rect.bottom += yOff; + return rect +} + +// Coverts a box from "div" coords to another coordinate system. +// Context may be "window", "page", "div", or "local"./null. +function fromCoordSystem(cm, coords, context) { + if (context == "div") { return coords } + var left = coords.left, top = coords.top; + // First move into "page" coordinate system + if (context == "page") { + left -= pageScrollX(); + top -= pageScrollY(); + } else if (context == "local" || !context) { + var localBox = cm.display.sizer.getBoundingClientRect(); + left += localBox.left; + top += localBox.top; + } + + var lineSpaceBox = cm.display.lineSpace.getBoundingClientRect(); + return {left: left - lineSpaceBox.left, top: top - lineSpaceBox.top} +} + +function charCoords(cm, pos, context, lineObj, bias) { + if (!lineObj) { lineObj = getLine(cm.doc, pos.line); } + return intoCoordSystem(cm, lineObj, measureChar(cm, lineObj, pos.ch, bias), context) +} + +// Returns a box for a given cursor position, which may have an +// 'other' property containing the position of the secondary cursor +// on a bidi boundary. +// A cursor Pos(line, char, "before") is on the same visual line as `char - 1` +// and after `char - 1` in writing order of `char - 1` +// A cursor Pos(line, char, "after") is on the same visual line as `char` +// and before `char` in writing order of `char` +// Examples (upper-case letters are RTL, lower-case are LTR): +// Pos(0, 1, ...) +// before after +// ab a|b a|b +// aB a|B aB| +// Ab |Ab A|b +// AB B|A B|A +// Every position after the last character on a line is considered to stick +// to the last character on the line. +function cursorCoords(cm, pos, context, lineObj, preparedMeasure, varHeight) { + lineObj = lineObj || getLine(cm.doc, pos.line); + if (!preparedMeasure) { preparedMeasure = prepareMeasureForLine(cm, lineObj); } + function get(ch, right) { + var m = measureCharPrepared(cm, preparedMeasure, ch, right ? "right" : "left", varHeight); + if (right) { m.left = m.right; } else { m.right = m.left; } + return intoCoordSystem(cm, lineObj, m, context) + } + var order = getOrder(lineObj, cm.doc.direction), ch = pos.ch, sticky = pos.sticky; + if (ch >= lineObj.text.length) { + ch = lineObj.text.length; + sticky = "before"; + } else if (ch <= 0) { + ch = 0; + sticky = "after"; + } + if (!order) { return get(sticky == "before" ? ch - 1 : ch, sticky == "before") } + + function getBidi(ch, partPos, invert) { + var part = order[partPos], right = (part.level % 2) != 0; + return get(invert ? ch - 1 : ch, right != invert) + } + var partPos = getBidiPartAt(order, ch, sticky); + var other = bidiOther; + var val = getBidi(ch, partPos, sticky == "before"); + if (other != null) { val.other = getBidi(ch, other, sticky != "before"); } + return val +} + +// Used to cheaply estimate the coordinates for a position. Used for +// intermediate scroll updates. +function estimateCoords(cm, pos) { + var left = 0; + pos = clipPos(cm.doc, pos); + if (!cm.options.lineWrapping) { left = charWidth(cm.display) * pos.ch; } + var lineObj = getLine(cm.doc, pos.line); + var top = heightAtLine(lineObj) + paddingTop(cm.display); + return {left: left, right: left, top: top, bottom: top + lineObj.height} +} + +// Positions returned by coordsChar contain some extra information. +// xRel is the relative x position of the input coordinates compared +// to the found position (so xRel > 0 means the coordinates are to +// the right of the character position, for example). When outside +// is true, that means the coordinates lie outside the line's +// vertical range. +function PosWithInfo(line, ch, sticky, outside, xRel) { + var pos = Pos(line, ch, sticky); + pos.xRel = xRel; + if (outside) { pos.outside = true; } + return pos +} + +// Compute the character position closest to the given coordinates. +// Input must be lineSpace-local ("div" coordinate system). +function coordsChar(cm, x, y) { + var doc = cm.doc; + y += cm.display.viewOffset; + if (y < 0) { return PosWithInfo(doc.first, 0, null, true, -1) } + var lineN = lineAtHeight(doc, y), last = doc.first + doc.size - 1; + if (lineN > last) + { return PosWithInfo(doc.first + doc.size - 1, getLine(doc, last).text.length, null, true, 1) } + if (x < 0) { x = 0; } + + var lineObj = getLine(doc, lineN); + for (;;) { + var found = coordsCharInner(cm, lineObj, lineN, x, y); + var merged = collapsedSpanAtEnd(lineObj); + var mergedPos = merged && merged.find(0, true); + if (merged && (found.ch > mergedPos.from.ch || found.ch == mergedPos.from.ch && found.xRel > 0)) + { lineN = lineNo(lineObj = mergedPos.to.line); } + else + { return found } + } +} + +function wrappedLineExtent(cm, lineObj, preparedMeasure, y) { + var measure = function (ch) { return intoCoordSystem(cm, lineObj, measureCharPrepared(cm, preparedMeasure, ch), "line"); }; + var end = lineObj.text.length; + var begin = findFirst(function (ch) { return measure(ch - 1).bottom <= y; }, end, 0); + end = findFirst(function (ch) { return measure(ch).top > y; }, begin, end); + return {begin: begin, end: end} +} + +function wrappedLineExtentChar(cm, lineObj, preparedMeasure, target) { + var targetTop = intoCoordSystem(cm, lineObj, measureCharPrepared(cm, preparedMeasure, target), "line").top; + return wrappedLineExtent(cm, lineObj, preparedMeasure, targetTop) +} + +function coordsCharInner(cm, lineObj, lineNo$$1, x, y) { + y -= heightAtLine(lineObj); + var begin = 0, end = lineObj.text.length; + var preparedMeasure = prepareMeasureForLine(cm, lineObj); + var pos; + var order = getOrder(lineObj, cm.doc.direction); + if (order) { + if (cm.options.lineWrapping) { + var assign; + ((assign = wrappedLineExtent(cm, lineObj, preparedMeasure, y), begin = assign.begin, end = assign.end, assign)); + } + pos = new Pos(lineNo$$1, Math.floor(begin + (end - begin) / 2)); + var beginLeft = cursorCoords(cm, pos, "line", lineObj, preparedMeasure).left; + var dir = beginLeft < x ? 1 : -1; + var prevDiff, diff = beginLeft - x, prevPos; + var steps = Math.ceil((end - begin) / 4); + outer: do { + prevDiff = diff; + prevPos = pos; + var i = 0; + for (; i < steps; ++i) { + var prevPos$1 = pos; + pos = moveVisually(cm, lineObj, pos, dir); + if (pos == null || pos.ch < begin || end <= (pos.sticky == "before" ? pos.ch - 1 : pos.ch)) { + pos = prevPos$1; + break outer + } + } + diff = cursorCoords(cm, pos, "line", lineObj, preparedMeasure).left - x; + if (steps > 1) { + var diff_change_per_step = Math.abs(diff - prevDiff) / steps; + steps = Math.min(steps, Math.ceil(Math.abs(diff) / diff_change_per_step)); + dir = diff < 0 ? 1 : -1; + } + } while (diff != 0 && (steps > 1 || ((dir < 0) != (diff < 0) && (Math.abs(diff) <= Math.abs(prevDiff))))) + if (Math.abs(diff) > Math.abs(prevDiff)) { + if ((diff < 0) == (prevDiff < 0)) { throw new Error("Broke out of infinite loop in coordsCharInner") } + pos = prevPos; + } + } else { + var ch = findFirst(function (ch) { + var box = intoCoordSystem(cm, lineObj, measureCharPrepared(cm, preparedMeasure, ch), "line"); + if (box.top > y) { + // For the cursor stickiness + end = Math.min(ch, end); + return true + } + else if (box.bottom <= y) { return false } + else if (box.left > x) { return true } + else if (box.right < x) { return false } + else { return (x - box.left < box.right - x) } + }, begin, end); + ch = skipExtendingChars(lineObj.text, ch, 1); + pos = new Pos(lineNo$$1, ch, ch == end ? "before" : "after"); + } + var coords = cursorCoords(cm, pos, "line", lineObj, preparedMeasure); + if (y < coords.top || coords.bottom < y) { pos.outside = true; } + pos.xRel = x < coords.left ? -1 : (x > coords.right ? 1 : 0); + return pos +} + +var measureText; +// Compute the default text height. +function textHeight(display) { + if (display.cachedTextHeight != null) { return display.cachedTextHeight } + if (measureText == null) { + measureText = elt("pre"); + // Measure a bunch of lines, for browsers that compute + // fractional heights. + for (var i = 0; i < 49; ++i) { + measureText.appendChild(document.createTextNode("x")); + measureText.appendChild(elt("br")); + } + measureText.appendChild(document.createTextNode("x")); + } + removeChildrenAndAdd(display.measure, measureText); + var height = measureText.offsetHeight / 50; + if (height > 3) { display.cachedTextHeight = height; } + removeChildren(display.measure); + return height || 1 +} + +// Compute the default character width. +function charWidth(display) { + if (display.cachedCharWidth != null) { return display.cachedCharWidth } + var anchor = elt("span", "xxxxxxxxxx"); + var pre = elt("pre", [anchor]); + removeChildrenAndAdd(display.measure, pre); + var rect = anchor.getBoundingClientRect(), width = (rect.right - rect.left) / 10; + if (width > 2) { display.cachedCharWidth = width; } + return width || 10 +} + +// Do a bulk-read of the DOM positions and sizes needed to draw the +// view, so that we don't interleave reading and writing to the DOM. +function getDimensions(cm) { + var d = cm.display, left = {}, width = {}; + var gutterLeft = d.gutters.clientLeft; + for (var n = d.gutters.firstChild, i = 0; n; n = n.nextSibling, ++i) { + left[cm.options.gutters[i]] = n.offsetLeft + n.clientLeft + gutterLeft; + width[cm.options.gutters[i]] = n.clientWidth; + } + return {fixedPos: compensateForHScroll(d), + gutterTotalWidth: d.gutters.offsetWidth, + gutterLeft: left, + gutterWidth: width, + wrapperWidth: d.wrapper.clientWidth} +} + +// Computes display.scroller.scrollLeft + display.gutters.offsetWidth, +// but using getBoundingClientRect to get a sub-pixel-accurate +// result. +function compensateForHScroll(display) { + return display.scroller.getBoundingClientRect().left - display.sizer.getBoundingClientRect().left +} + +// Returns a function that estimates the height of a line, to use as +// first approximation until the line becomes visible (and is thus +// properly measurable). +function estimateHeight(cm) { + var th = textHeight(cm.display), wrapping = cm.options.lineWrapping; + var perLine = wrapping && Math.max(5, cm.display.scroller.clientWidth / charWidth(cm.display) - 3); + return function (line) { + if (lineIsHidden(cm.doc, line)) { return 0 } + + var widgetsHeight = 0; + if (line.widgets) { for (var i = 0; i < line.widgets.length; i++) { + if (line.widgets[i].height) { widgetsHeight += line.widgets[i].height; } + } } + + if (wrapping) + { return widgetsHeight + (Math.ceil(line.text.length / perLine) || 1) * th } + else + { return widgetsHeight + th } + } +} + +function estimateLineHeights(cm) { + var doc = cm.doc, est = estimateHeight(cm); + doc.iter(function (line) { + var estHeight = est(line); + if (estHeight != line.height) { updateLineHeight(line, estHeight); } + }); +} + +// Given a mouse event, find the corresponding position. If liberal +// is false, it checks whether a gutter or scrollbar was clicked, +// and returns null if it was. forRect is used by rectangular +// selections, and tries to estimate a character position even for +// coordinates beyond the right of the text. +function posFromMouse(cm, e, liberal, forRect) { + var display = cm.display; + if (!liberal && e_target(e).getAttribute("cm-not-content") == "true") { return null } + + var x, y, space = display.lineSpace.getBoundingClientRect(); + // Fails unpredictably on IE[67] when mouse is dragged around quickly. + try { x = e.clientX - space.left; y = e.clientY - space.top; } + catch (e) { return null } + var coords = coordsChar(cm, x, y), line; + if (forRect && coords.xRel == 1 && (line = getLine(cm.doc, coords.line).text).length == coords.ch) { + var colDiff = countColumn(line, line.length, cm.options.tabSize) - line.length; + coords = Pos(coords.line, Math.max(0, Math.round((x - paddingH(cm.display).left) / charWidth(cm.display)) - colDiff)); + } + return coords +} + +// Find the view element corresponding to a given line. Return null +// when the line isn't visible. +function findViewIndex(cm, n) { + if (n >= cm.display.viewTo) { return null } + n -= cm.display.viewFrom; + if (n < 0) { return null } + var view = cm.display.view; + for (var i = 0; i < view.length; i++) { + n -= view[i].size; + if (n < 0) { return i } + } +} + +function updateSelection(cm) { + cm.display.input.showSelection(cm.display.input.prepareSelection()); +} + +function prepareSelection(cm, primary) { + var doc = cm.doc, result = {}; + var curFragment = result.cursors = document.createDocumentFragment(); + var selFragment = result.selection = document.createDocumentFragment(); + + for (var i = 0; i < doc.sel.ranges.length; i++) { + if (primary === false && i == doc.sel.primIndex) { continue } + var range$$1 = doc.sel.ranges[i]; + if (range$$1.from().line >= cm.display.viewTo || range$$1.to().line < cm.display.viewFrom) { continue } + var collapsed = range$$1.empty(); + if (collapsed || cm.options.showCursorWhenSelecting) + { drawSelectionCursor(cm, range$$1.head, curFragment); } + if (!collapsed) + { drawSelectionRange(cm, range$$1, selFragment); } + } + return result +} + +// Draws a cursor for the given range +function drawSelectionCursor(cm, head, output) { + var pos = cursorCoords(cm, head, "div", null, null, !cm.options.singleCursorHeightPerLine); + + var cursor = output.appendChild(elt("div", "\u00a0", "CodeMirror-cursor")); + cursor.style.left = pos.left + "px"; + cursor.style.top = pos.top + "px"; + cursor.style.height = Math.max(0, pos.bottom - pos.top) * cm.options.cursorHeight + "px"; + + if (pos.other) { + // Secondary cursor, shown when on a 'jump' in bi-directional text + var otherCursor = output.appendChild(elt("div", "\u00a0", "CodeMirror-cursor CodeMirror-secondarycursor")); + otherCursor.style.display = ""; + otherCursor.style.left = pos.other.left + "px"; + otherCursor.style.top = pos.other.top + "px"; + otherCursor.style.height = (pos.other.bottom - pos.other.top) * .85 + "px"; + } +} + +// Draws the given range as a highlighted selection +function drawSelectionRange(cm, range$$1, output) { + var display = cm.display, doc = cm.doc; + var fragment = document.createDocumentFragment(); + var padding = paddingH(cm.display), leftSide = padding.left; + var rightSide = Math.max(display.sizerWidth, displayWidth(cm) - display.sizer.offsetLeft) - padding.right; + + function add(left, top, width, bottom) { + if (top < 0) { top = 0; } + top = Math.round(top); + bottom = Math.round(bottom); + fragment.appendChild(elt("div", null, "CodeMirror-selected", ("position: absolute; left: " + left + "px;\n top: " + top + "px; width: " + (width == null ? rightSide - left : width) + "px;\n height: " + (bottom - top) + "px"))); + } + + function drawForLine(line, fromArg, toArg) { + var lineObj = getLine(doc, line); + var lineLen = lineObj.text.length; + var start, end; + function coords(ch, bias) { + return charCoords(cm, Pos(line, ch), "div", lineObj, bias) + } + + iterateBidiSections(getOrder(lineObj, doc.direction), fromArg || 0, toArg == null ? lineLen : toArg, function (from, to, dir) { + var leftPos = coords(from, "left"), rightPos, left, right; + if (from == to) { + rightPos = leftPos; + left = right = leftPos.left; + } else { + rightPos = coords(to - 1, "right"); + if (dir == "rtl") { var tmp = leftPos; leftPos = rightPos; rightPos = tmp; } + left = leftPos.left; + right = rightPos.right; + } + if (fromArg == null && from == 0) { left = leftSide; } + if (rightPos.top - leftPos.top > 3) { // Different lines, draw top part + add(left, leftPos.top, null, leftPos.bottom); + left = leftSide; + if (leftPos.bottom < rightPos.top) { add(left, leftPos.bottom, null, rightPos.top); } + } + if (toArg == null && to == lineLen) { right = rightSide; } + if (!start || leftPos.top < start.top || leftPos.top == start.top && leftPos.left < start.left) + { start = leftPos; } + if (!end || rightPos.bottom > end.bottom || rightPos.bottom == end.bottom && rightPos.right > end.right) + { end = rightPos; } + if (left < leftSide + 1) { left = leftSide; } + add(left, rightPos.top, right - left, rightPos.bottom); + }); + return {start: start, end: end} + } + + var sFrom = range$$1.from(), sTo = range$$1.to(); + if (sFrom.line == sTo.line) { + drawForLine(sFrom.line, sFrom.ch, sTo.ch); + } else { + var fromLine = getLine(doc, sFrom.line), toLine = getLine(doc, sTo.line); + var singleVLine = visualLine(fromLine) == visualLine(toLine); + var leftEnd = drawForLine(sFrom.line, sFrom.ch, singleVLine ? fromLine.text.length + 1 : null).end; + var rightStart = drawForLine(sTo.line, singleVLine ? 0 : null, sTo.ch).start; + if (singleVLine) { + if (leftEnd.top < rightStart.top - 2) { + add(leftEnd.right, leftEnd.top, null, leftEnd.bottom); + add(leftSide, rightStart.top, rightStart.left, rightStart.bottom); + } else { + add(leftEnd.right, leftEnd.top, rightStart.left - leftEnd.right, leftEnd.bottom); + } + } + if (leftEnd.bottom < rightStart.top) + { add(leftSide, leftEnd.bottom, null, rightStart.top); } + } + + output.appendChild(fragment); +} + +// Cursor-blinking +function restartBlink(cm) { + if (!cm.state.focused) { return } + var display = cm.display; + clearInterval(display.blinker); + var on = true; + display.cursorDiv.style.visibility = ""; + if (cm.options.cursorBlinkRate > 0) + { display.blinker = setInterval(function () { return display.cursorDiv.style.visibility = (on = !on) ? "" : "hidden"; }, + cm.options.cursorBlinkRate); } + else if (cm.options.cursorBlinkRate < 0) + { display.cursorDiv.style.visibility = "hidden"; } +} + +function ensureFocus(cm) { + if (!cm.state.focused) { cm.display.input.focus(); onFocus(cm); } +} + +function delayBlurEvent(cm) { + cm.state.delayingBlurEvent = true; + setTimeout(function () { if (cm.state.delayingBlurEvent) { + cm.state.delayingBlurEvent = false; + onBlur(cm); + } }, 100); +} + +function onFocus(cm, e) { + if (cm.state.delayingBlurEvent) { cm.state.delayingBlurEvent = false; } + + if (cm.options.readOnly == "nocursor") { return } + if (!cm.state.focused) { + signal(cm, "focus", cm, e); + cm.state.focused = true; + addClass(cm.display.wrapper, "CodeMirror-focused"); + // This test prevents this from firing when a context + // menu is closed (since the input reset would kill the + // select-all detection hack) + if (!cm.curOp && cm.display.selForContextMenu != cm.doc.sel) { + cm.display.input.reset(); + if (webkit) { setTimeout(function () { return cm.display.input.reset(true); }, 20); } // Issue #1730 + } + cm.display.input.receivedFocus(); + } + restartBlink(cm); +} +function onBlur(cm, e) { + if (cm.state.delayingBlurEvent) { return } + + if (cm.state.focused) { + signal(cm, "blur", cm, e); + cm.state.focused = false; + rmClass(cm.display.wrapper, "CodeMirror-focused"); + } + clearInterval(cm.display.blinker); + setTimeout(function () { if (!cm.state.focused) { cm.display.shift = false; } }, 150); +} + +// Read the actual heights of the rendered lines, and update their +// stored heights to match. +function updateHeightsInViewport(cm) { + var display = cm.display; + var prevBottom = display.lineDiv.offsetTop; + for (var i = 0; i < display.view.length; i++) { + var cur = display.view[i], height = (void 0); + if (cur.hidden) { continue } + if (ie && ie_version < 8) { + var bot = cur.node.offsetTop + cur.node.offsetHeight; + height = bot - prevBottom; + prevBottom = bot; + } else { + var box = cur.node.getBoundingClientRect(); + height = box.bottom - box.top; + } + var diff = cur.line.height - height; + if (height < 2) { height = textHeight(display); } + if (diff > .005 || diff < -.005) { + updateLineHeight(cur.line, height); + updateWidgetHeight(cur.line); + if (cur.rest) { for (var j = 0; j < cur.rest.length; j++) + { updateWidgetHeight(cur.rest[j]); } } + } + } +} + +// Read and store the height of line widgets associated with the +// given line. +function updateWidgetHeight(line) { + if (line.widgets) { for (var i = 0; i < line.widgets.length; ++i) + { line.widgets[i].height = line.widgets[i].node.parentNode.offsetHeight; } } +} + +// Compute the lines that are visible in a given viewport (defaults +// the the current scroll position). viewport may contain top, +// height, and ensure (see op.scrollToPos) properties. +function visibleLines(display, doc, viewport) { + var top = viewport && viewport.top != null ? Math.max(0, viewport.top) : display.scroller.scrollTop; + top = Math.floor(top - paddingTop(display)); + var bottom = viewport && viewport.bottom != null ? viewport.bottom : top + display.wrapper.clientHeight; + + var from = lineAtHeight(doc, top), to = lineAtHeight(doc, bottom); + // Ensure is a {from: {line, ch}, to: {line, ch}} object, and + // forces those lines into the viewport (if possible). + if (viewport && viewport.ensure) { + var ensureFrom = viewport.ensure.from.line, ensureTo = viewport.ensure.to.line; + if (ensureFrom < from) { + from = ensureFrom; + to = lineAtHeight(doc, heightAtLine(getLine(doc, ensureFrom)) + display.wrapper.clientHeight); + } else if (Math.min(ensureTo, doc.lastLine()) >= to) { + from = lineAtHeight(doc, heightAtLine(getLine(doc, ensureTo)) - display.wrapper.clientHeight); + to = ensureTo; + } + } + return {from: from, to: Math.max(to, from + 1)} +} + +// Re-align line numbers and gutter marks to compensate for +// horizontal scrolling. +function alignHorizontally(cm) { + var display = cm.display, view = display.view; + if (!display.alignWidgets && (!display.gutters.firstChild || !cm.options.fixedGutter)) { return } + var comp = compensateForHScroll(display) - display.scroller.scrollLeft + cm.doc.scrollLeft; + var gutterW = display.gutters.offsetWidth, left = comp + "px"; + for (var i = 0; i < view.length; i++) { if (!view[i].hidden) { + if (cm.options.fixedGutter) { + if (view[i].gutter) + { view[i].gutter.style.left = left; } + if (view[i].gutterBackground) + { view[i].gutterBackground.style.left = left; } + } + var align = view[i].alignable; + if (align) { for (var j = 0; j < align.length; j++) + { align[j].style.left = left; } } + } } + if (cm.options.fixedGutter) + { display.gutters.style.left = (comp + gutterW) + "px"; } +} + +// Used to ensure that the line number gutter is still the right +// size for the current document size. Returns true when an update +// is needed. +function maybeUpdateLineNumberWidth(cm) { + if (!cm.options.lineNumbers) { return false } + var doc = cm.doc, last = lineNumberFor(cm.options, doc.first + doc.size - 1), display = cm.display; + if (last.length != display.lineNumChars) { + var test = display.measure.appendChild(elt("div", [elt("div", last)], + "CodeMirror-linenumber CodeMirror-gutter-elt")); + var innerW = test.firstChild.offsetWidth, padding = test.offsetWidth - innerW; + display.lineGutter.style.width = ""; + display.lineNumInnerWidth = Math.max(innerW, display.lineGutter.offsetWidth - padding) + 1; + display.lineNumWidth = display.lineNumInnerWidth + padding; + display.lineNumChars = display.lineNumInnerWidth ? last.length : -1; + display.lineGutter.style.width = display.lineNumWidth + "px"; + updateGutterSpace(cm); + return true + } + return false +} + +// SCROLLING THINGS INTO VIEW + +// If an editor sits on the top or bottom of the window, partially +// scrolled out of view, this ensures that the cursor is visible. +function maybeScrollWindow(cm, rect) { + if (signalDOMEvent(cm, "scrollCursorIntoView")) { return } + + var display = cm.display, box = display.sizer.getBoundingClientRect(), doScroll = null; + if (rect.top + box.top < 0) { doScroll = true; } + else if (rect.bottom + box.top > (window.innerHeight || document.documentElement.clientHeight)) { doScroll = false; } + if (doScroll != null && !phantom) { + var scrollNode = elt("div", "\u200b", null, ("position: absolute;\n top: " + (rect.top - display.viewOffset - paddingTop(cm.display)) + "px;\n height: " + (rect.bottom - rect.top + scrollGap(cm) + display.barHeight) + "px;\n left: " + (rect.left) + "px; width: " + (Math.max(2, rect.right - rect.left)) + "px;")); + cm.display.lineSpace.appendChild(scrollNode); + scrollNode.scrollIntoView(doScroll); + cm.display.lineSpace.removeChild(scrollNode); + } +} + +// Scroll a given position into view (immediately), verifying that +// it actually became visible (as line heights are accurately +// measured, the position of something may 'drift' during drawing). +function scrollPosIntoView(cm, pos, end, margin) { + if (margin == null) { margin = 0; } + var rect; + if (!cm.options.lineWrapping && pos == end) { + // Set pos and end to the cursor positions around the character pos sticks to + // If pos.sticky == "before", that is around pos.ch - 1, otherwise around pos.ch + // If pos == Pos(_, 0, "before"), pos and end are unchanged + pos = pos.ch ? Pos(pos.line, pos.sticky == "before" ? pos.ch - 1 : pos.ch, "after") : pos; + end = pos.sticky == "before" ? Pos(pos.line, pos.ch + 1, "before") : pos; + } + for (var limit = 0; limit < 5; limit++) { + var changed = false; + var coords = cursorCoords(cm, pos); + var endCoords = !end || end == pos ? coords : cursorCoords(cm, end); + rect = {left: Math.min(coords.left, endCoords.left), + top: Math.min(coords.top, endCoords.top) - margin, + right: Math.max(coords.left, endCoords.left), + bottom: Math.max(coords.bottom, endCoords.bottom) + margin}; + var scrollPos = calculateScrollPos(cm, rect); + var startTop = cm.doc.scrollTop, startLeft = cm.doc.scrollLeft; + if (scrollPos.scrollTop != null) { + updateScrollTop(cm, scrollPos.scrollTop); + if (Math.abs(cm.doc.scrollTop - startTop) > 1) { changed = true; } + } + if (scrollPos.scrollLeft != null) { + setScrollLeft(cm, scrollPos.scrollLeft); + if (Math.abs(cm.doc.scrollLeft - startLeft) > 1) { changed = true; } + } + if (!changed) { break } + } + return rect +} + +// Scroll a given set of coordinates into view (immediately). +function scrollIntoView(cm, rect) { + var scrollPos = calculateScrollPos(cm, rect); + if (scrollPos.scrollTop != null) { updateScrollTop(cm, scrollPos.scrollTop); } + if (scrollPos.scrollLeft != null) { setScrollLeft(cm, scrollPos.scrollLeft); } +} + +// Calculate a new scroll position needed to scroll the given +// rectangle into view. Returns an object with scrollTop and +// scrollLeft properties. When these are undefined, the +// vertical/horizontal position does not need to be adjusted. +function calculateScrollPos(cm, rect) { + var display = cm.display, snapMargin = textHeight(cm.display); + if (rect.top < 0) { rect.top = 0; } + var screentop = cm.curOp && cm.curOp.scrollTop != null ? cm.curOp.scrollTop : display.scroller.scrollTop; + var screen = displayHeight(cm), result = {}; + if (rect.bottom - rect.top > screen) { rect.bottom = rect.top + screen; } + var docBottom = cm.doc.height + paddingVert(display); + var atTop = rect.top < snapMargin, atBottom = rect.bottom > docBottom - snapMargin; + if (rect.top < screentop) { + result.scrollTop = atTop ? 0 : rect.top; + } else if (rect.bottom > screentop + screen) { + var newTop = Math.min(rect.top, (atBottom ? docBottom : rect.bottom) - screen); + if (newTop != screentop) { result.scrollTop = newTop; } + } + + var screenleft = cm.curOp && cm.curOp.scrollLeft != null ? cm.curOp.scrollLeft : display.scroller.scrollLeft; + var screenw = displayWidth(cm) - (cm.options.fixedGutter ? display.gutters.offsetWidth : 0); + var tooWide = rect.right - rect.left > screenw; + if (tooWide) { rect.right = rect.left + screenw; } + if (rect.left < 10) + { result.scrollLeft = 0; } + else if (rect.left < screenleft) + { result.scrollLeft = Math.max(0, rect.left - (tooWide ? 0 : 10)); } + else if (rect.right > screenw + screenleft - 3) + { result.scrollLeft = rect.right + (tooWide ? 0 : 10) - screenw; } + return result +} + +// Store a relative adjustment to the scroll position in the current +// operation (to be applied when the operation finishes). +function addToScrollTop(cm, top) { + if (top == null) { return } + resolveScrollToPos(cm); + cm.curOp.scrollTop = (cm.curOp.scrollTop == null ? cm.doc.scrollTop : cm.curOp.scrollTop) + top; +} + +// Make sure that at the end of the operation the current cursor is +// shown. +function ensureCursorVisible(cm) { + resolveScrollToPos(cm); + var cur = cm.getCursor(); + cm.curOp.scrollToPos = {from: cur, to: cur, margin: cm.options.cursorScrollMargin}; +} + +function scrollToCoords(cm, x, y) { + if (x != null || y != null) { resolveScrollToPos(cm); } + if (x != null) { cm.curOp.scrollLeft = x; } + if (y != null) { cm.curOp.scrollTop = y; } +} + +function scrollToRange(cm, range$$1) { + resolveScrollToPos(cm); + cm.curOp.scrollToPos = range$$1; +} + +// When an operation has its scrollToPos property set, and another +// scroll action is applied before the end of the operation, this +// 'simulates' scrolling that position into view in a cheap way, so +// that the effect of intermediate scroll commands is not ignored. +function resolveScrollToPos(cm) { + var range$$1 = cm.curOp.scrollToPos; + if (range$$1) { + cm.curOp.scrollToPos = null; + var from = estimateCoords(cm, range$$1.from), to = estimateCoords(cm, range$$1.to); + scrollToCoordsRange(cm, from, to, range$$1.margin); + } +} + +function scrollToCoordsRange(cm, from, to, margin) { + var sPos = calculateScrollPos(cm, { + left: Math.min(from.left, to.left), + top: Math.min(from.top, to.top) - margin, + right: Math.max(from.right, to.right), + bottom: Math.max(from.bottom, to.bottom) + margin + }); + scrollToCoords(cm, sPos.scrollLeft, sPos.scrollTop); +} + +// Sync the scrollable area and scrollbars, ensure the viewport +// covers the visible area. +function updateScrollTop(cm, val) { + if (Math.abs(cm.doc.scrollTop - val) < 2) { return } + if (!gecko) { updateDisplaySimple(cm, {top: val}); } + setScrollTop(cm, val, true); + if (gecko) { updateDisplaySimple(cm); } + startWorker(cm, 100); +} + +function setScrollTop(cm, val, forceScroll) { + val = Math.min(cm.display.scroller.scrollHeight - cm.display.scroller.clientHeight, val); + if (cm.display.scroller.scrollTop == val && !forceScroll) { return } + cm.doc.scrollTop = val; + cm.display.scrollbars.setScrollTop(val); + if (cm.display.scroller.scrollTop != val) { cm.display.scroller.scrollTop = val; } +} + +// Sync scroller and scrollbar, ensure the gutter elements are +// aligned. +function setScrollLeft(cm, val, isScroller, forceScroll) { + val = Math.min(val, cm.display.scroller.scrollWidth - cm.display.scroller.clientWidth); + if ((isScroller ? val == cm.doc.scrollLeft : Math.abs(cm.doc.scrollLeft - val) < 2) && !forceScroll) { return } + cm.doc.scrollLeft = val; + alignHorizontally(cm); + if (cm.display.scroller.scrollLeft != val) { cm.display.scroller.scrollLeft = val; } + cm.display.scrollbars.setScrollLeft(val); +} + +// SCROLLBARS + +// Prepare DOM reads needed to update the scrollbars. Done in one +// shot to minimize update/measure roundtrips. +function measureForScrollbars(cm) { + var d = cm.display, gutterW = d.gutters.offsetWidth; + var docH = Math.round(cm.doc.height + paddingVert(cm.display)); + return { + clientHeight: d.scroller.clientHeight, + viewHeight: d.wrapper.clientHeight, + scrollWidth: d.scroller.scrollWidth, clientWidth: d.scroller.clientWidth, + viewWidth: d.wrapper.clientWidth, + barLeft: cm.options.fixedGutter ? gutterW : 0, + docHeight: docH, + scrollHeight: docH + scrollGap(cm) + d.barHeight, + nativeBarWidth: d.nativeBarWidth, + gutterWidth: gutterW + } +} + +var NativeScrollbars = function(place, scroll, cm) { + this.cm = cm; + var vert = this.vert = elt("div", [elt("div", null, null, "min-width: 1px")], "CodeMirror-vscrollbar"); + var horiz = this.horiz = elt("div", [elt("div", null, null, "height: 100%; min-height: 1px")], "CodeMirror-hscrollbar"); + place(vert); place(horiz); + + on(vert, "scroll", function () { + if (vert.clientHeight) { scroll(vert.scrollTop, "vertical"); } + }); + on(horiz, "scroll", function () { + if (horiz.clientWidth) { scroll(horiz.scrollLeft, "horizontal"); } + }); + + this.checkedZeroWidth = false; + // Need to set a minimum width to see the scrollbar on IE7 (but must not set it on IE8). + if (ie && ie_version < 8) { this.horiz.style.minHeight = this.vert.style.minWidth = "18px"; } +}; + +NativeScrollbars.prototype.update = function (measure) { + var needsH = measure.scrollWidth > measure.clientWidth + 1; + var needsV = measure.scrollHeight > measure.clientHeight + 1; + var sWidth = measure.nativeBarWidth; + + if (needsV) { + this.vert.style.display = "block"; + this.vert.style.bottom = needsH ? sWidth + "px" : "0"; + var totalHeight = measure.viewHeight - (needsH ? sWidth : 0); + // A bug in IE8 can cause this value to be negative, so guard it. + this.vert.firstChild.style.height = + Math.max(0, measure.scrollHeight - measure.clientHeight + totalHeight) + "px"; + } else { + this.vert.style.display = ""; + this.vert.firstChild.style.height = "0"; + } + + if (needsH) { + this.horiz.style.display = "block"; + this.horiz.style.right = needsV ? sWidth + "px" : "0"; + this.horiz.style.left = measure.barLeft + "px"; + var totalWidth = measure.viewWidth - measure.barLeft - (needsV ? sWidth : 0); + this.horiz.firstChild.style.width = + Math.max(0, measure.scrollWidth - measure.clientWidth + totalWidth) + "px"; + } else { + this.horiz.style.display = ""; + this.horiz.firstChild.style.width = "0"; + } + + if (!this.checkedZeroWidth && measure.clientHeight > 0) { + if (sWidth == 0) { this.zeroWidthHack(); } + this.checkedZeroWidth = true; + } + + return {right: needsV ? sWidth : 0, bottom: needsH ? sWidth : 0} +}; + +NativeScrollbars.prototype.setScrollLeft = function (pos) { + if (this.horiz.scrollLeft != pos) { this.horiz.scrollLeft = pos; } + if (this.disableHoriz) { this.enableZeroWidthBar(this.horiz, this.disableHoriz, "horiz"); } +}; + +NativeScrollbars.prototype.setScrollTop = function (pos) { + if (this.vert.scrollTop != pos) { this.vert.scrollTop = pos; } + if (this.disableVert) { this.enableZeroWidthBar(this.vert, this.disableVert, "vert"); } +}; + +NativeScrollbars.prototype.zeroWidthHack = function () { + var w = mac && !mac_geMountainLion ? "12px" : "18px"; + this.horiz.style.height = this.vert.style.width = w; + this.horiz.style.pointerEvents = this.vert.style.pointerEvents = "none"; + this.disableHoriz = new Delayed; + this.disableVert = new Delayed; +}; + +NativeScrollbars.prototype.enableZeroWidthBar = function (bar, delay, type) { + bar.style.pointerEvents = "auto"; + function maybeDisable() { + // To find out whether the scrollbar is still visible, we + // check whether the element under the pixel in the bottom + // right corner of the scrollbar box is the scrollbar box + // itself (when the bar is still visible) or its filler child + // (when the bar is hidden). If it is still visible, we keep + // it enabled, if it's hidden, we disable pointer events. + var box = bar.getBoundingClientRect(); + var elt$$1 = type == "vert" ? document.elementFromPoint(box.right - 1, (box.top + box.bottom) / 2) + : document.elementFromPoint((box.right + box.left) / 2, box.bottom - 1); + if (elt$$1 != bar) { bar.style.pointerEvents = "none"; } + else { delay.set(1000, maybeDisable); } + } + delay.set(1000, maybeDisable); +}; + +NativeScrollbars.prototype.clear = function () { + var parent = this.horiz.parentNode; + parent.removeChild(this.horiz); + parent.removeChild(this.vert); +}; + +var NullScrollbars = function () {}; + +NullScrollbars.prototype.update = function () { return {bottom: 0, right: 0} }; +NullScrollbars.prototype.setScrollLeft = function () {}; +NullScrollbars.prototype.setScrollTop = function () {}; +NullScrollbars.prototype.clear = function () {}; + +function updateScrollbars(cm, measure) { + if (!measure) { measure = measureForScrollbars(cm); } + var startWidth = cm.display.barWidth, startHeight = cm.display.barHeight; + updateScrollbarsInner(cm, measure); + for (var i = 0; i < 4 && startWidth != cm.display.barWidth || startHeight != cm.display.barHeight; i++) { + if (startWidth != cm.display.barWidth && cm.options.lineWrapping) + { updateHeightsInViewport(cm); } + updateScrollbarsInner(cm, measureForScrollbars(cm)); + startWidth = cm.display.barWidth; startHeight = cm.display.barHeight; + } +} + +// Re-synchronize the fake scrollbars with the actual size of the +// content. +function updateScrollbarsInner(cm, measure) { + var d = cm.display; + var sizes = d.scrollbars.update(measure); + + d.sizer.style.paddingRight = (d.barWidth = sizes.right) + "px"; + d.sizer.style.paddingBottom = (d.barHeight = sizes.bottom) + "px"; + d.heightForcer.style.borderBottom = sizes.bottom + "px solid transparent"; + + if (sizes.right && sizes.bottom) { + d.scrollbarFiller.style.display = "block"; + d.scrollbarFiller.style.height = sizes.bottom + "px"; + d.scrollbarFiller.style.width = sizes.right + "px"; + } else { d.scrollbarFiller.style.display = ""; } + if (sizes.bottom && cm.options.coverGutterNextToScrollbar && cm.options.fixedGutter) { + d.gutterFiller.style.display = "block"; + d.gutterFiller.style.height = sizes.bottom + "px"; + d.gutterFiller.style.width = measure.gutterWidth + "px"; + } else { d.gutterFiller.style.display = ""; } +} + +var scrollbarModel = {"native": NativeScrollbars, "null": NullScrollbars}; + +function initScrollbars(cm) { + if (cm.display.scrollbars) { + cm.display.scrollbars.clear(); + if (cm.display.scrollbars.addClass) + { rmClass(cm.display.wrapper, cm.display.scrollbars.addClass); } + } + + cm.display.scrollbars = new scrollbarModel[cm.options.scrollbarStyle](function (node) { + cm.display.wrapper.insertBefore(node, cm.display.scrollbarFiller); + // Prevent clicks in the scrollbars from killing focus + on(node, "mousedown", function () { + if (cm.state.focused) { setTimeout(function () { return cm.display.input.focus(); }, 0); } + }); + node.setAttribute("cm-not-content", "true"); + }, function (pos, axis) { + if (axis == "horizontal") { setScrollLeft(cm, pos); } + else { updateScrollTop(cm, pos); } + }, cm); + if (cm.display.scrollbars.addClass) + { addClass(cm.display.wrapper, cm.display.scrollbars.addClass); } +} + +// Operations are used to wrap a series of changes to the editor +// state in such a way that each change won't have to update the +// cursor and display (which would be awkward, slow, and +// error-prone). Instead, display updates are batched and then all +// combined and executed at once. + +var nextOpId = 0; +// Start a new operation. +function startOperation(cm) { + cm.curOp = { + cm: cm, + viewChanged: false, // Flag that indicates that lines might need to be redrawn + startHeight: cm.doc.height, // Used to detect need to update scrollbar + forceUpdate: false, // Used to force a redraw + updateInput: null, // Whether to reset the input textarea + typing: false, // Whether this reset should be careful to leave existing text (for compositing) + changeObjs: null, // Accumulated changes, for firing change events + cursorActivityHandlers: null, // Set of handlers to fire cursorActivity on + cursorActivityCalled: 0, // Tracks which cursorActivity handlers have been called already + selectionChanged: false, // Whether the selection needs to be redrawn + updateMaxLine: false, // Set when the widest line needs to be determined anew + scrollLeft: null, scrollTop: null, // Intermediate scroll position, not pushed to DOM yet + scrollToPos: null, // Used to scroll to a specific position + focus: false, + id: ++nextOpId // Unique ID + }; + pushOperation(cm.curOp); +} + +// Finish an operation, updating the display and signalling delayed events +function endOperation(cm) { + var op = cm.curOp; + finishOperation(op, function (group) { + for (var i = 0; i < group.ops.length; i++) + { group.ops[i].cm.curOp = null; } + endOperations(group); + }); +} + +// The DOM updates done when an operation finishes are batched so +// that the minimum number of relayouts are required. +function endOperations(group) { + var ops = group.ops; + for (var i = 0; i < ops.length; i++) // Read DOM + { endOperation_R1(ops[i]); } + for (var i$1 = 0; i$1 < ops.length; i$1++) // Write DOM (maybe) + { endOperation_W1(ops[i$1]); } + for (var i$2 = 0; i$2 < ops.length; i$2++) // Read DOM + { endOperation_R2(ops[i$2]); } + for (var i$3 = 0; i$3 < ops.length; i$3++) // Write DOM (maybe) + { endOperation_W2(ops[i$3]); } + for (var i$4 = 0; i$4 < ops.length; i$4++) // Read DOM + { endOperation_finish(ops[i$4]); } +} + +function endOperation_R1(op) { + var cm = op.cm, display = cm.display; + maybeClipScrollbars(cm); + if (op.updateMaxLine) { findMaxLine(cm); } + + op.mustUpdate = op.viewChanged || op.forceUpdate || op.scrollTop != null || + op.scrollToPos && (op.scrollToPos.from.line < display.viewFrom || + op.scrollToPos.to.line >= display.viewTo) || + display.maxLineChanged && cm.options.lineWrapping; + op.update = op.mustUpdate && + new DisplayUpdate(cm, op.mustUpdate && {top: op.scrollTop, ensure: op.scrollToPos}, op.forceUpdate); +} + +function endOperation_W1(op) { + op.updatedDisplay = op.mustUpdate && updateDisplayIfNeeded(op.cm, op.update); +} + +function endOperation_R2(op) { + var cm = op.cm, display = cm.display; + if (op.updatedDisplay) { updateHeightsInViewport(cm); } + + op.barMeasure = measureForScrollbars(cm); + + // If the max line changed since it was last measured, measure it, + // and ensure the document's width matches it. + // updateDisplay_W2 will use these properties to do the actual resizing + if (display.maxLineChanged && !cm.options.lineWrapping) { + op.adjustWidthTo = measureChar(cm, display.maxLine, display.maxLine.text.length).left + 3; + cm.display.sizerWidth = op.adjustWidthTo; + op.barMeasure.scrollWidth = + Math.max(display.scroller.clientWidth, display.sizer.offsetLeft + op.adjustWidthTo + scrollGap(cm) + cm.display.barWidth); + op.maxScrollLeft = Math.max(0, display.sizer.offsetLeft + op.adjustWidthTo - displayWidth(cm)); + } + + if (op.updatedDisplay || op.selectionChanged) + { op.preparedSelection = display.input.prepareSelection(op.focus); } +} + +function endOperation_W2(op) { + var cm = op.cm; + + if (op.adjustWidthTo != null) { + cm.display.sizer.style.minWidth = op.adjustWidthTo + "px"; + if (op.maxScrollLeft < cm.doc.scrollLeft) + { setScrollLeft(cm, Math.min(cm.display.scroller.scrollLeft, op.maxScrollLeft), true); } + cm.display.maxLineChanged = false; + } + + var takeFocus = op.focus && op.focus == activeElt() && (!document.hasFocus || document.hasFocus()); + if (op.preparedSelection) + { cm.display.input.showSelection(op.preparedSelection, takeFocus); } + if (op.updatedDisplay || op.startHeight != cm.doc.height) + { updateScrollbars(cm, op.barMeasure); } + if (op.updatedDisplay) + { setDocumentHeight(cm, op.barMeasure); } + + if (op.selectionChanged) { restartBlink(cm); } + + if (cm.state.focused && op.updateInput) + { cm.display.input.reset(op.typing); } + if (takeFocus) { ensureFocus(op.cm); } +} + +function endOperation_finish(op) { + var cm = op.cm, display = cm.display, doc = cm.doc; + + if (op.updatedDisplay) { postUpdateDisplay(cm, op.update); } + + // Abort mouse wheel delta measurement, when scrolling explicitly + if (display.wheelStartX != null && (op.scrollTop != null || op.scrollLeft != null || op.scrollToPos)) + { display.wheelStartX = display.wheelStartY = null; } + + // Propagate the scroll position to the actual DOM scroller + if (op.scrollTop != null) { setScrollTop(cm, op.scrollTop, op.forceScroll); } + + if (op.scrollLeft != null) { setScrollLeft(cm, op.scrollLeft, true, true); } + // If we need to scroll a specific position into view, do so. + if (op.scrollToPos) { + var rect = scrollPosIntoView(cm, clipPos(doc, op.scrollToPos.from), + clipPos(doc, op.scrollToPos.to), op.scrollToPos.margin); + maybeScrollWindow(cm, rect); + } + + // Fire events for markers that are hidden/unidden by editing or + // undoing + var hidden = op.maybeHiddenMarkers, unhidden = op.maybeUnhiddenMarkers; + if (hidden) { for (var i = 0; i < hidden.length; ++i) + { if (!hidden[i].lines.length) { signal(hidden[i], "hide"); } } } + if (unhidden) { for (var i$1 = 0; i$1 < unhidden.length; ++i$1) + { if (unhidden[i$1].lines.length) { signal(unhidden[i$1], "unhide"); } } } + + if (display.wrapper.offsetHeight) + { doc.scrollTop = cm.display.scroller.scrollTop; } + + // Fire change events, and delayed event handlers + if (op.changeObjs) + { signal(cm, "changes", cm, op.changeObjs); } + if (op.update) + { op.update.finish(); } +} + +// Run the given function in an operation +function runInOp(cm, f) { + if (cm.curOp) { return f() } + startOperation(cm); + try { return f() } + finally { endOperation(cm); } +} +// Wraps a function in an operation. Returns the wrapped function. +function operation(cm, f) { + return function() { + if (cm.curOp) { return f.apply(cm, arguments) } + startOperation(cm); + try { return f.apply(cm, arguments) } + finally { endOperation(cm); } + } +} +// Used to add methods to editor and doc instances, wrapping them in +// operations. +function methodOp(f) { + return function() { + if (this.curOp) { return f.apply(this, arguments) } + startOperation(this); + try { return f.apply(this, arguments) } + finally { endOperation(this); } + } +} +function docMethodOp(f) { + return function() { + var cm = this.cm; + if (!cm || cm.curOp) { return f.apply(this, arguments) } + startOperation(cm); + try { return f.apply(this, arguments) } + finally { endOperation(cm); } + } +} + +// Updates the display.view data structure for a given change to the +// document. From and to are in pre-change coordinates. Lendiff is +// the amount of lines added or subtracted by the change. This is +// used for changes that span multiple lines, or change the way +// lines are divided into visual lines. regLineChange (below) +// registers single-line changes. +function regChange(cm, from, to, lendiff) { + if (from == null) { from = cm.doc.first; } + if (to == null) { to = cm.doc.first + cm.doc.size; } + if (!lendiff) { lendiff = 0; } + + var display = cm.display; + if (lendiff && to < display.viewTo && + (display.updateLineNumbers == null || display.updateLineNumbers > from)) + { display.updateLineNumbers = from; } + + cm.curOp.viewChanged = true; + + if (from >= display.viewTo) { // Change after + if (sawCollapsedSpans && visualLineNo(cm.doc, from) < display.viewTo) + { resetView(cm); } + } else if (to <= display.viewFrom) { // Change before + if (sawCollapsedSpans && visualLineEndNo(cm.doc, to + lendiff) > display.viewFrom) { + resetView(cm); + } else { + display.viewFrom += lendiff; + display.viewTo += lendiff; + } + } else if (from <= display.viewFrom && to >= display.viewTo) { // Full overlap + resetView(cm); + } else if (from <= display.viewFrom) { // Top overlap + var cut = viewCuttingPoint(cm, to, to + lendiff, 1); + if (cut) { + display.view = display.view.slice(cut.index); + display.viewFrom = cut.lineN; + display.viewTo += lendiff; + } else { + resetView(cm); + } + } else if (to >= display.viewTo) { // Bottom overlap + var cut$1 = viewCuttingPoint(cm, from, from, -1); + if (cut$1) { + display.view = display.view.slice(0, cut$1.index); + display.viewTo = cut$1.lineN; + } else { + resetView(cm); + } + } else { // Gap in the middle + var cutTop = viewCuttingPoint(cm, from, from, -1); + var cutBot = viewCuttingPoint(cm, to, to + lendiff, 1); + if (cutTop && cutBot) { + display.view = display.view.slice(0, cutTop.index) + .concat(buildViewArray(cm, cutTop.lineN, cutBot.lineN)) + .concat(display.view.slice(cutBot.index)); + display.viewTo += lendiff; + } else { + resetView(cm); + } + } + + var ext = display.externalMeasured; + if (ext) { + if (to < ext.lineN) + { ext.lineN += lendiff; } + else if (from < ext.lineN + ext.size) + { display.externalMeasured = null; } + } +} + +// Register a change to a single line. Type must be one of "text", +// "gutter", "class", "widget" +function regLineChange(cm, line, type) { + cm.curOp.viewChanged = true; + var display = cm.display, ext = cm.display.externalMeasured; + if (ext && line >= ext.lineN && line < ext.lineN + ext.size) + { display.externalMeasured = null; } + + if (line < display.viewFrom || line >= display.viewTo) { return } + var lineView = display.view[findViewIndex(cm, line)]; + if (lineView.node == null) { return } + var arr = lineView.changes || (lineView.changes = []); + if (indexOf(arr, type) == -1) { arr.push(type); } +} + +// Clear the view. +function resetView(cm) { + cm.display.viewFrom = cm.display.viewTo = cm.doc.first; + cm.display.view = []; + cm.display.viewOffset = 0; +} + +function viewCuttingPoint(cm, oldN, newN, dir) { + var index = findViewIndex(cm, oldN), diff, view = cm.display.view; + if (!sawCollapsedSpans || newN == cm.doc.first + cm.doc.size) + { return {index: index, lineN: newN} } + var n = cm.display.viewFrom; + for (var i = 0; i < index; i++) + { n += view[i].size; } + if (n != oldN) { + if (dir > 0) { + if (index == view.length - 1) { return null } + diff = (n + view[index].size) - oldN; + index++; + } else { + diff = n - oldN; + } + oldN += diff; newN += diff; + } + while (visualLineNo(cm.doc, newN) != newN) { + if (index == (dir < 0 ? 0 : view.length - 1)) { return null } + newN += dir * view[index - (dir < 0 ? 1 : 0)].size; + index += dir; + } + return {index: index, lineN: newN} +} + +// Force the view to cover a given range, adding empty view element +// or clipping off existing ones as needed. +function adjustView(cm, from, to) { + var display = cm.display, view = display.view; + if (view.length == 0 || from >= display.viewTo || to <= display.viewFrom) { + display.view = buildViewArray(cm, from, to); + display.viewFrom = from; + } else { + if (display.viewFrom > from) + { display.view = buildViewArray(cm, from, display.viewFrom).concat(display.view); } + else if (display.viewFrom < from) + { display.view = display.view.slice(findViewIndex(cm, from)); } + display.viewFrom = from; + if (display.viewTo < to) + { display.view = display.view.concat(buildViewArray(cm, display.viewTo, to)); } + else if (display.viewTo > to) + { display.view = display.view.slice(0, findViewIndex(cm, to)); } + } + display.viewTo = to; +} + +// Count the number of lines in the view whose DOM representation is +// out of date (or nonexistent). +function countDirtyView(cm) { + var view = cm.display.view, dirty = 0; + for (var i = 0; i < view.length; i++) { + var lineView = view[i]; + if (!lineView.hidden && (!lineView.node || lineView.changes)) { ++dirty; } + } + return dirty +} + +// HIGHLIGHT WORKER + +function startWorker(cm, time) { + if (cm.doc.highlightFrontier < cm.display.viewTo) + { cm.state.highlight.set(time, bind(highlightWorker, cm)); } +} + +function highlightWorker(cm) { + var doc = cm.doc; + if (doc.highlightFrontier >= cm.display.viewTo) { return } + var end = +new Date + cm.options.workTime; + var context = getContextBefore(cm, doc.highlightFrontier); + var changedLines = []; + + doc.iter(context.line, Math.min(doc.first + doc.size, cm.display.viewTo + 500), function (line) { + if (context.line >= cm.display.viewFrom) { // Visible + var oldStyles = line.styles; + var resetState = line.text.length > cm.options.maxHighlightLength ? copyState(doc.mode, context.state) : null; + var highlighted = highlightLine(cm, line, context, true); + if (resetState) { context.state = resetState; } + line.styles = highlighted.styles; + var oldCls = line.styleClasses, newCls = highlighted.classes; + if (newCls) { line.styleClasses = newCls; } + else if (oldCls) { line.styleClasses = null; } + var ischange = !oldStyles || oldStyles.length != line.styles.length || + oldCls != newCls && (!oldCls || !newCls || oldCls.bgClass != newCls.bgClass || oldCls.textClass != newCls.textClass); + for (var i = 0; !ischange && i < oldStyles.length; ++i) { ischange = oldStyles[i] != line.styles[i]; } + if (ischange) { changedLines.push(context.line); } + line.stateAfter = context.save(); + context.nextLine(); + } else { + if (line.text.length <= cm.options.maxHighlightLength) + { processLine(cm, line.text, context); } + line.stateAfter = context.line % 5 == 0 ? context.save() : null; + context.nextLine(); + } + if (+new Date > end) { + startWorker(cm, cm.options.workDelay); + return true + } + }); + doc.highlightFrontier = context.line; + doc.modeFrontier = Math.max(doc.modeFrontier, context.line); + if (changedLines.length) { runInOp(cm, function () { + for (var i = 0; i < changedLines.length; i++) + { regLineChange(cm, changedLines[i], "text"); } + }); } +} + +// DISPLAY DRAWING + +var DisplayUpdate = function(cm, viewport, force) { + var display = cm.display; + + this.viewport = viewport; + // Store some values that we'll need later (but don't want to force a relayout for) + this.visible = visibleLines(display, cm.doc, viewport); + this.editorIsHidden = !display.wrapper.offsetWidth; + this.wrapperHeight = display.wrapper.clientHeight; + this.wrapperWidth = display.wrapper.clientWidth; + this.oldDisplayWidth = displayWidth(cm); + this.force = force; + this.dims = getDimensions(cm); + this.events = []; +}; + +DisplayUpdate.prototype.signal = function (emitter, type) { + if (hasHandler(emitter, type)) + { this.events.push(arguments); } +}; +DisplayUpdate.prototype.finish = function () { + var this$1 = this; + + for (var i = 0; i < this.events.length; i++) + { signal.apply(null, this$1.events[i]); } +}; + +function maybeClipScrollbars(cm) { + var display = cm.display; + if (!display.scrollbarsClipped && display.scroller.offsetWidth) { + display.nativeBarWidth = display.scroller.offsetWidth - display.scroller.clientWidth; + display.heightForcer.style.height = scrollGap(cm) + "px"; + display.sizer.style.marginBottom = -display.nativeBarWidth + "px"; + display.sizer.style.borderRightWidth = scrollGap(cm) + "px"; + display.scrollbarsClipped = true; + } +} + +function selectionSnapshot(cm) { + if (cm.hasFocus()) { return null } + var active = activeElt(); + if (!active || !contains(cm.display.lineDiv, active)) { return null } + var result = {activeElt: active}; + if (window.getSelection) { + var sel = window.getSelection(); + if (sel.anchorNode && sel.extend && contains(cm.display.lineDiv, sel.anchorNode)) { + result.anchorNode = sel.anchorNode; + result.anchorOffset = sel.anchorOffset; + result.focusNode = sel.focusNode; + result.focusOffset = sel.focusOffset; + } + } + return result +} + +function restoreSelection(snapshot) { + if (!snapshot || !snapshot.activeElt || snapshot.activeElt == activeElt()) { return } + snapshot.activeElt.focus(); + if (snapshot.anchorNode && contains(document.body, snapshot.anchorNode) && contains(document.body, snapshot.focusNode)) { + var sel = window.getSelection(), range$$1 = document.createRange(); + range$$1.setEnd(snapshot.anchorNode, snapshot.anchorOffset); + range$$1.collapse(false); + sel.removeAllRanges(); + sel.addRange(range$$1); + sel.extend(snapshot.focusNode, snapshot.focusOffset); + } +} + +// Does the actual updating of the line display. Bails out +// (returning false) when there is nothing to be done and forced is +// false. +function updateDisplayIfNeeded(cm, update) { + var display = cm.display, doc = cm.doc; + + if (update.editorIsHidden) { + resetView(cm); + return false + } + + // Bail out if the visible area is already rendered and nothing changed. + if (!update.force && + update.visible.from >= display.viewFrom && update.visible.to <= display.viewTo && + (display.updateLineNumbers == null || display.updateLineNumbers >= display.viewTo) && + display.renderedView == display.view && countDirtyView(cm) == 0) + { return false } + + if (maybeUpdateLineNumberWidth(cm)) { + resetView(cm); + update.dims = getDimensions(cm); + } + + // Compute a suitable new viewport (from & to) + var end = doc.first + doc.size; + var from = Math.max(update.visible.from - cm.options.viewportMargin, doc.first); + var to = Math.min(end, update.visible.to + cm.options.viewportMargin); + if (display.viewFrom < from && from - display.viewFrom < 20) { from = Math.max(doc.first, display.viewFrom); } + if (display.viewTo > to && display.viewTo - to < 20) { to = Math.min(end, display.viewTo); } + if (sawCollapsedSpans) { + from = visualLineNo(cm.doc, from); + to = visualLineEndNo(cm.doc, to); + } + + var different = from != display.viewFrom || to != display.viewTo || + display.lastWrapHeight != update.wrapperHeight || display.lastWrapWidth != update.wrapperWidth; + adjustView(cm, from, to); + + display.viewOffset = heightAtLine(getLine(cm.doc, display.viewFrom)); + // Position the mover div to align with the current scroll position + cm.display.mover.style.top = display.viewOffset + "px"; + + var toUpdate = countDirtyView(cm); + if (!different && toUpdate == 0 && !update.force && display.renderedView == display.view && + (display.updateLineNumbers == null || display.updateLineNumbers >= display.viewTo)) + { return false } + + // For big changes, we hide the enclosing element during the + // update, since that speeds up the operations on most browsers. + var selSnapshot = selectionSnapshot(cm); + if (toUpdate > 4) { display.lineDiv.style.display = "none"; } + patchDisplay(cm, display.updateLineNumbers, update.dims); + if (toUpdate > 4) { display.lineDiv.style.display = ""; } + display.renderedView = display.view; + // There might have been a widget with a focused element that got + // hidden or updated, if so re-focus it. + restoreSelection(selSnapshot); + + // Prevent selection and cursors from interfering with the scroll + // width and height. + removeChildren(display.cursorDiv); + removeChildren(display.selectionDiv); + display.gutters.style.height = display.sizer.style.minHeight = 0; + + if (different) { + display.lastWrapHeight = update.wrapperHeight; + display.lastWrapWidth = update.wrapperWidth; + startWorker(cm, 400); + } + + display.updateLineNumbers = null; + + return true +} + +function postUpdateDisplay(cm, update) { + var viewport = update.viewport; + + for (var first = true;; first = false) { + if (!first || !cm.options.lineWrapping || update.oldDisplayWidth == displayWidth(cm)) { + // Clip forced viewport to actual scrollable area. + if (viewport && viewport.top != null) + { viewport = {top: Math.min(cm.doc.height + paddingVert(cm.display) - displayHeight(cm), viewport.top)}; } + // Updated line heights might result in the drawn area not + // actually covering the viewport. Keep looping until it does. + update.visible = visibleLines(cm.display, cm.doc, viewport); + if (update.visible.from >= cm.display.viewFrom && update.visible.to <= cm.display.viewTo) + { break } + } + if (!updateDisplayIfNeeded(cm, update)) { break } + updateHeightsInViewport(cm); + var barMeasure = measureForScrollbars(cm); + updateSelection(cm); + updateScrollbars(cm, barMeasure); + setDocumentHeight(cm, barMeasure); + update.force = false; + } + + update.signal(cm, "update", cm); + if (cm.display.viewFrom != cm.display.reportedViewFrom || cm.display.viewTo != cm.display.reportedViewTo) { + update.signal(cm, "viewportChange", cm, cm.display.viewFrom, cm.display.viewTo); + cm.display.reportedViewFrom = cm.display.viewFrom; cm.display.reportedViewTo = cm.display.viewTo; + } +} + +function updateDisplaySimple(cm, viewport) { + var update = new DisplayUpdate(cm, viewport); + if (updateDisplayIfNeeded(cm, update)) { + updateHeightsInViewport(cm); + postUpdateDisplay(cm, update); + var barMeasure = measureForScrollbars(cm); + updateSelection(cm); + updateScrollbars(cm, barMeasure); + setDocumentHeight(cm, barMeasure); + update.finish(); + } +} + +// Sync the actual display DOM structure with display.view, removing +// nodes for lines that are no longer in view, and creating the ones +// that are not there yet, and updating the ones that are out of +// date. +function patchDisplay(cm, updateNumbersFrom, dims) { + var display = cm.display, lineNumbers = cm.options.lineNumbers; + var container = display.lineDiv, cur = container.firstChild; + + function rm(node) { + var next = node.nextSibling; + // Works around a throw-scroll bug in OS X Webkit + if (webkit && mac && cm.display.currentWheelTarget == node) + { node.style.display = "none"; } + else + { node.parentNode.removeChild(node); } + return next + } + + var view = display.view, lineN = display.viewFrom; + // Loop over the elements in the view, syncing cur (the DOM nodes + // in display.lineDiv) with the view as we go. + for (var i = 0; i < view.length; i++) { + var lineView = view[i]; + if (lineView.hidden) { + } else if (!lineView.node || lineView.node.parentNode != container) { // Not drawn yet + var node = buildLineElement(cm, lineView, lineN, dims); + container.insertBefore(node, cur); + } else { // Already drawn + while (cur != lineView.node) { cur = rm(cur); } + var updateNumber = lineNumbers && updateNumbersFrom != null && + updateNumbersFrom <= lineN && lineView.lineNumber; + if (lineView.changes) { + if (indexOf(lineView.changes, "gutter") > -1) { updateNumber = false; } + updateLineForChanges(cm, lineView, lineN, dims); + } + if (updateNumber) { + removeChildren(lineView.lineNumber); + lineView.lineNumber.appendChild(document.createTextNode(lineNumberFor(cm.options, lineN))); + } + cur = lineView.node.nextSibling; + } + lineN += lineView.size; + } + while (cur) { cur = rm(cur); } +} + +function updateGutterSpace(cm) { + var width = cm.display.gutters.offsetWidth; + cm.display.sizer.style.marginLeft = width + "px"; +} + +function setDocumentHeight(cm, measure) { + cm.display.sizer.style.minHeight = measure.docHeight + "px"; + cm.display.heightForcer.style.top = measure.docHeight + "px"; + cm.display.gutters.style.height = (measure.docHeight + cm.display.barHeight + scrollGap(cm)) + "px"; +} + +// Rebuild the gutter elements, ensure the margin to the left of the +// code matches their width. +function updateGutters(cm) { + var gutters = cm.display.gutters, specs = cm.options.gutters; + removeChildren(gutters); + var i = 0; + for (; i < specs.length; ++i) { + var gutterClass = specs[i]; + var gElt = gutters.appendChild(elt("div", null, "CodeMirror-gutter " + gutterClass)); + if (gutterClass == "CodeMirror-linenumbers") { + cm.display.lineGutter = gElt; + gElt.style.width = (cm.display.lineNumWidth || 1) + "px"; + } + } + gutters.style.display = i ? "" : "none"; + updateGutterSpace(cm); +} + +// Make sure the gutters options contains the element +// "CodeMirror-linenumbers" when the lineNumbers option is true. +function setGuttersForLineNumbers(options) { + var found = indexOf(options.gutters, "CodeMirror-linenumbers"); + if (found == -1 && options.lineNumbers) { + options.gutters = options.gutters.concat(["CodeMirror-linenumbers"]); + } else if (found > -1 && !options.lineNumbers) { + options.gutters = options.gutters.slice(0); + options.gutters.splice(found, 1); + } +} + +// Since the delta values reported on mouse wheel events are +// unstandardized between browsers and even browser versions, and +// generally horribly unpredictable, this code starts by measuring +// the scroll effect that the first few mouse wheel events have, +// and, from that, detects the way it can convert deltas to pixel +// offsets afterwards. +// +// The reason we want to know the amount a wheel event will scroll +// is that it gives us a chance to update the display before the +// actual scrolling happens, reducing flickering. + +var wheelSamples = 0; +var wheelPixelsPerUnit = null; +// Fill in a browser-detected starting value on browsers where we +// know one. These don't have to be accurate -- the result of them +// being wrong would just be a slight flicker on the first wheel +// scroll (if it is large enough). +if (ie) { wheelPixelsPerUnit = -.53; } +else if (gecko) { wheelPixelsPerUnit = 15; } +else if (chrome) { wheelPixelsPerUnit = -.7; } +else if (safari) { wheelPixelsPerUnit = -1/3; } + +function wheelEventDelta(e) { + var dx = e.wheelDeltaX, dy = e.wheelDeltaY; + if (dx == null && e.detail && e.axis == e.HORIZONTAL_AXIS) { dx = e.detail; } + if (dy == null && e.detail && e.axis == e.VERTICAL_AXIS) { dy = e.detail; } + else if (dy == null) { dy = e.wheelDelta; } + return {x: dx, y: dy} +} +function wheelEventPixels(e) { + var delta = wheelEventDelta(e); + delta.x *= wheelPixelsPerUnit; + delta.y *= wheelPixelsPerUnit; + return delta +} + +function onScrollWheel(cm, e) { + var delta = wheelEventDelta(e), dx = delta.x, dy = delta.y; + + var display = cm.display, scroll = display.scroller; + // Quit if there's nothing to scroll here + var canScrollX = scroll.scrollWidth > scroll.clientWidth; + var canScrollY = scroll.scrollHeight > scroll.clientHeight; + if (!(dx && canScrollX || dy && canScrollY)) { return } + + // Webkit browsers on OS X abort momentum scrolls when the target + // of the scroll event is removed from the scrollable element. + // This hack (see related code in patchDisplay) makes sure the + // element is kept around. + if (dy && mac && webkit) { + outer: for (var cur = e.target, view = display.view; cur != scroll; cur = cur.parentNode) { + for (var i = 0; i < view.length; i++) { + if (view[i].node == cur) { + cm.display.currentWheelTarget = cur; + break outer + } + } + } + } + + // On some browsers, horizontal scrolling will cause redraws to + // happen before the gutter has been realigned, causing it to + // wriggle around in a most unseemly way. When we have an + // estimated pixels/delta value, we just handle horizontal + // scrolling entirely here. It'll be slightly off from native, but + // better than glitching out. + if (dx && !gecko && !presto && wheelPixelsPerUnit != null) { + if (dy && canScrollY) + { updateScrollTop(cm, Math.max(0, scroll.scrollTop + dy * wheelPixelsPerUnit)); } + setScrollLeft(cm, Math.max(0, scroll.scrollLeft + dx * wheelPixelsPerUnit)); + // Only prevent default scrolling if vertical scrolling is + // actually possible. Otherwise, it causes vertical scroll + // jitter on OSX trackpads when deltaX is small and deltaY + // is large (issue #3579) + if (!dy || (dy && canScrollY)) + { e_preventDefault(e); } + display.wheelStartX = null; // Abort measurement, if in progress + return + } + + // 'Project' the visible viewport to cover the area that is being + // scrolled into view (if we know enough to estimate it). + if (dy && wheelPixelsPerUnit != null) { + var pixels = dy * wheelPixelsPerUnit; + var top = cm.doc.scrollTop, bot = top + display.wrapper.clientHeight; + if (pixels < 0) { top = Math.max(0, top + pixels - 50); } + else { bot = Math.min(cm.doc.height, bot + pixels + 50); } + updateDisplaySimple(cm, {top: top, bottom: bot}); + } + + if (wheelSamples < 20) { + if (display.wheelStartX == null) { + display.wheelStartX = scroll.scrollLeft; display.wheelStartY = scroll.scrollTop; + display.wheelDX = dx; display.wheelDY = dy; + setTimeout(function () { + if (display.wheelStartX == null) { return } + var movedX = scroll.scrollLeft - display.wheelStartX; + var movedY = scroll.scrollTop - display.wheelStartY; + var sample = (movedY && display.wheelDY && movedY / display.wheelDY) || + (movedX && display.wheelDX && movedX / display.wheelDX); + display.wheelStartX = display.wheelStartY = null; + if (!sample) { return } + wheelPixelsPerUnit = (wheelPixelsPerUnit * wheelSamples + sample) / (wheelSamples + 1); + ++wheelSamples; + }, 200); + } else { + display.wheelDX += dx; display.wheelDY += dy; + } + } +} + +// Selection objects are immutable. A new one is created every time +// the selection changes. A selection is one or more non-overlapping +// (and non-touching) ranges, sorted, and an integer that indicates +// which one is the primary selection (the one that's scrolled into +// view, that getCursor returns, etc). +var Selection = function(ranges, primIndex) { + this.ranges = ranges; + this.primIndex = primIndex; +}; + +Selection.prototype.primary = function () { return this.ranges[this.primIndex] }; + +Selection.prototype.equals = function (other) { + var this$1 = this; + + if (other == this) { return true } + if (other.primIndex != this.primIndex || other.ranges.length != this.ranges.length) { return false } + for (var i = 0; i < this.ranges.length; i++) { + var here = this$1.ranges[i], there = other.ranges[i]; + if (!equalCursorPos(here.anchor, there.anchor) || !equalCursorPos(here.head, there.head)) { return false } + } + return true +}; + +Selection.prototype.deepCopy = function () { + var this$1 = this; + + var out = []; + for (var i = 0; i < this.ranges.length; i++) + { out[i] = new Range(copyPos(this$1.ranges[i].anchor), copyPos(this$1.ranges[i].head)); } + return new Selection(out, this.primIndex) +}; + +Selection.prototype.somethingSelected = function () { + var this$1 = this; + + for (var i = 0; i < this.ranges.length; i++) + { if (!this$1.ranges[i].empty()) { return true } } + return false +}; + +Selection.prototype.contains = function (pos, end) { + var this$1 = this; + + if (!end) { end = pos; } + for (var i = 0; i < this.ranges.length; i++) { + var range = this$1.ranges[i]; + if (cmp(end, range.from()) >= 0 && cmp(pos, range.to()) <= 0) + { return i } + } + return -1 +}; + +var Range = function(anchor, head) { + this.anchor = anchor; this.head = head; +}; + +Range.prototype.from = function () { return minPos(this.anchor, this.head) }; +Range.prototype.to = function () { return maxPos(this.anchor, this.head) }; +Range.prototype.empty = function () { return this.head.line == this.anchor.line && this.head.ch == this.anchor.ch }; + +// Take an unsorted, potentially overlapping set of ranges, and +// build a selection out of it. 'Consumes' ranges array (modifying +// it). +function normalizeSelection(ranges, primIndex) { + var prim = ranges[primIndex]; + ranges.sort(function (a, b) { return cmp(a.from(), b.from()); }); + primIndex = indexOf(ranges, prim); + for (var i = 1; i < ranges.length; i++) { + var cur = ranges[i], prev = ranges[i - 1]; + if (cmp(prev.to(), cur.from()) >= 0) { + var from = minPos(prev.from(), cur.from()), to = maxPos(prev.to(), cur.to()); + var inv = prev.empty() ? cur.from() == cur.head : prev.from() == prev.head; + if (i <= primIndex) { --primIndex; } + ranges.splice(--i, 2, new Range(inv ? to : from, inv ? from : to)); + } + } + return new Selection(ranges, primIndex) +} + +function simpleSelection(anchor, head) { + return new Selection([new Range(anchor, head || anchor)], 0) +} + +// Compute the position of the end of a change (its 'to' property +// refers to the pre-change end). +function changeEnd(change) { + if (!change.text) { return change.to } + return Pos(change.from.line + change.text.length - 1, + lst(change.text).length + (change.text.length == 1 ? change.from.ch : 0)) +} + +// Adjust a position to refer to the post-change position of the +// same text, or the end of the change if the change covers it. +function adjustForChange(pos, change) { + if (cmp(pos, change.from) < 0) { return pos } + if (cmp(pos, change.to) <= 0) { return changeEnd(change) } + + var line = pos.line + change.text.length - (change.to.line - change.from.line) - 1, ch = pos.ch; + if (pos.line == change.to.line) { ch += changeEnd(change).ch - change.to.ch; } + return Pos(line, ch) +} + +function computeSelAfterChange(doc, change) { + var out = []; + for (var i = 0; i < doc.sel.ranges.length; i++) { + var range = doc.sel.ranges[i]; + out.push(new Range(adjustForChange(range.anchor, change), + adjustForChange(range.head, change))); + } + return normalizeSelection(out, doc.sel.primIndex) +} + +function offsetPos(pos, old, nw) { + if (pos.line == old.line) + { return Pos(nw.line, pos.ch - old.ch + nw.ch) } + else + { return Pos(nw.line + (pos.line - old.line), pos.ch) } +} + +// Used by replaceSelections to allow moving the selection to the +// start or around the replaced test. Hint may be "start" or "around". +function computeReplacedSel(doc, changes, hint) { + var out = []; + var oldPrev = Pos(doc.first, 0), newPrev = oldPrev; + for (var i = 0; i < changes.length; i++) { + var change = changes[i]; + var from = offsetPos(change.from, oldPrev, newPrev); + var to = offsetPos(changeEnd(change), oldPrev, newPrev); + oldPrev = change.to; + newPrev = to; + if (hint == "around") { + var range = doc.sel.ranges[i], inv = cmp(range.head, range.anchor) < 0; + out[i] = new Range(inv ? to : from, inv ? from : to); + } else { + out[i] = new Range(from, from); + } + } + return new Selection(out, doc.sel.primIndex) +} + +// Used to get the editor into a consistent state again when options change. + +function loadMode(cm) { + cm.doc.mode = getMode(cm.options, cm.doc.modeOption); + resetModeState(cm); +} + +function resetModeState(cm) { + cm.doc.iter(function (line) { + if (line.stateAfter) { line.stateAfter = null; } + if (line.styles) { line.styles = null; } + }); + cm.doc.modeFrontier = cm.doc.highlightFrontier = cm.doc.first; + startWorker(cm, 100); + cm.state.modeGen++; + if (cm.curOp) { regChange(cm); } +} + +// DOCUMENT DATA STRUCTURE + +// By default, updates that start and end at the beginning of a line +// are treated specially, in order to make the association of line +// widgets and marker elements with the text behave more intuitive. +function isWholeLineUpdate(doc, change) { + return change.from.ch == 0 && change.to.ch == 0 && lst(change.text) == "" && + (!doc.cm || doc.cm.options.wholeLineUpdateBefore) +} + +// Perform a change on the document data structure. +function updateDoc(doc, change, markedSpans, estimateHeight$$1) { + function spansFor(n) {return markedSpans ? markedSpans[n] : null} + function update(line, text, spans) { + updateLine(line, text, spans, estimateHeight$$1); + signalLater(line, "change", line, change); + } + function linesFor(start, end) { + var result = []; + for (var i = start; i < end; ++i) + { result.push(new Line(text[i], spansFor(i), estimateHeight$$1)); } + return result + } + + var from = change.from, to = change.to, text = change.text; + var firstLine = getLine(doc, from.line), lastLine = getLine(doc, to.line); + var lastText = lst(text), lastSpans = spansFor(text.length - 1), nlines = to.line - from.line; + + // Adjust the line structure + if (change.full) { + doc.insert(0, linesFor(0, text.length)); + doc.remove(text.length, doc.size - text.length); + } else if (isWholeLineUpdate(doc, change)) { + // This is a whole-line replace. Treated specially to make + // sure line objects move the way they are supposed to. + var added = linesFor(0, text.length - 1); + update(lastLine, lastLine.text, lastSpans); + if (nlines) { doc.remove(from.line, nlines); } + if (added.length) { doc.insert(from.line, added); } + } else if (firstLine == lastLine) { + if (text.length == 1) { + update(firstLine, firstLine.text.slice(0, from.ch) + lastText + firstLine.text.slice(to.ch), lastSpans); + } else { + var added$1 = linesFor(1, text.length - 1); + added$1.push(new Line(lastText + firstLine.text.slice(to.ch), lastSpans, estimateHeight$$1)); + update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0)); + doc.insert(from.line + 1, added$1); + } + } else if (text.length == 1) { + update(firstLine, firstLine.text.slice(0, from.ch) + text[0] + lastLine.text.slice(to.ch), spansFor(0)); + doc.remove(from.line + 1, nlines); + } else { + update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0)); + update(lastLine, lastText + lastLine.text.slice(to.ch), lastSpans); + var added$2 = linesFor(1, text.length - 1); + if (nlines > 1) { doc.remove(from.line + 1, nlines - 1); } + doc.insert(from.line + 1, added$2); + } + + signalLater(doc, "change", doc, change); +} + +// Call f for all linked documents. +function linkedDocs(doc, f, sharedHistOnly) { + function propagate(doc, skip, sharedHist) { + if (doc.linked) { for (var i = 0; i < doc.linked.length; ++i) { + var rel = doc.linked[i]; + if (rel.doc == skip) { continue } + var shared = sharedHist && rel.sharedHist; + if (sharedHistOnly && !shared) { continue } + f(rel.doc, shared); + propagate(rel.doc, doc, shared); + } } + } + propagate(doc, null, true); +} + +// Attach a document to an editor. +function attachDoc(cm, doc) { + if (doc.cm) { throw new Error("This document is already in use.") } + cm.doc = doc; + doc.cm = cm; + estimateLineHeights(cm); + loadMode(cm); + setDirectionClass(cm); + if (!cm.options.lineWrapping) { findMaxLine(cm); } + cm.options.mode = doc.modeOption; + regChange(cm); +} + +function setDirectionClass(cm) { + (cm.doc.direction == "rtl" ? addClass : rmClass)(cm.display.lineDiv, "CodeMirror-rtl"); +} + +function directionChanged(cm) { + runInOp(cm, function () { + setDirectionClass(cm); + regChange(cm); + }); +} + +function History(startGen) { + // Arrays of change events and selections. Doing something adds an + // event to done and clears undo. Undoing moves events from done + // to undone, redoing moves them in the other direction. + this.done = []; this.undone = []; + this.undoDepth = Infinity; + // Used to track when changes can be merged into a single undo + // event + this.lastModTime = this.lastSelTime = 0; + this.lastOp = this.lastSelOp = null; + this.lastOrigin = this.lastSelOrigin = null; + // Used by the isClean() method + this.generation = this.maxGeneration = startGen || 1; +} + +// Create a history change event from an updateDoc-style change +// object. +function historyChangeFromChange(doc, change) { + var histChange = {from: copyPos(change.from), to: changeEnd(change), text: getBetween(doc, change.from, change.to)}; + attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1); + linkedDocs(doc, function (doc) { return attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1); }, true); + return histChange +} + +// Pop all selection events off the end of a history array. Stop at +// a change event. +function clearSelectionEvents(array) { + while (array.length) { + var last = lst(array); + if (last.ranges) { array.pop(); } + else { break } + } +} + +// Find the top change event in the history. Pop off selection +// events that are in the way. +function lastChangeEvent(hist, force) { + if (force) { + clearSelectionEvents(hist.done); + return lst(hist.done) + } else if (hist.done.length && !lst(hist.done).ranges) { + return lst(hist.done) + } else if (hist.done.length > 1 && !hist.done[hist.done.length - 2].ranges) { + hist.done.pop(); + return lst(hist.done) + } +} + +// Register a change in the history. Merges changes that are within +// a single operation, or are close together with an origin that +// allows merging (starting with "+") into a single event. +function addChangeToHistory(doc, change, selAfter, opId) { + var hist = doc.history; + hist.undone.length = 0; + var time = +new Date, cur; + var last; + + if ((hist.lastOp == opId || + hist.lastOrigin == change.origin && change.origin && + ((change.origin.charAt(0) == "+" && doc.cm && hist.lastModTime > time - doc.cm.options.historyEventDelay) || + change.origin.charAt(0) == "*")) && + (cur = lastChangeEvent(hist, hist.lastOp == opId))) { + // Merge this change into the last event + last = lst(cur.changes); + if (cmp(change.from, change.to) == 0 && cmp(change.from, last.to) == 0) { + // Optimized case for simple insertion -- don't want to add + // new changesets for every character typed + last.to = changeEnd(change); + } else { + // Add new sub-event + cur.changes.push(historyChangeFromChange(doc, change)); + } + } else { + // Can not be merged, start a new event. + var before = lst(hist.done); + if (!before || !before.ranges) + { pushSelectionToHistory(doc.sel, hist.done); } + cur = {changes: [historyChangeFromChange(doc, change)], + generation: hist.generation}; + hist.done.push(cur); + while (hist.done.length > hist.undoDepth) { + hist.done.shift(); + if (!hist.done[0].ranges) { hist.done.shift(); } + } + } + hist.done.push(selAfter); + hist.generation = ++hist.maxGeneration; + hist.lastModTime = hist.lastSelTime = time; + hist.lastOp = hist.lastSelOp = opId; + hist.lastOrigin = hist.lastSelOrigin = change.origin; + + if (!last) { signal(doc, "historyAdded"); } +} + +function selectionEventCanBeMerged(doc, origin, prev, sel) { + var ch = origin.charAt(0); + return ch == "*" || + ch == "+" && + prev.ranges.length == sel.ranges.length && + prev.somethingSelected() == sel.somethingSelected() && + new Date - doc.history.lastSelTime <= (doc.cm ? doc.cm.options.historyEventDelay : 500) +} + +// Called whenever the selection changes, sets the new selection as +// the pending selection in the history, and pushes the old pending +// selection into the 'done' array when it was significantly +// different (in number of selected ranges, emptiness, or time). +function addSelectionToHistory(doc, sel, opId, options) { + var hist = doc.history, origin = options && options.origin; + + // A new event is started when the previous origin does not match + // the current, or the origins don't allow matching. Origins + // starting with * are always merged, those starting with + are + // merged when similar and close together in time. + if (opId == hist.lastSelOp || + (origin && hist.lastSelOrigin == origin && + (hist.lastModTime == hist.lastSelTime && hist.lastOrigin == origin || + selectionEventCanBeMerged(doc, origin, lst(hist.done), sel)))) + { hist.done[hist.done.length - 1] = sel; } + else + { pushSelectionToHistory(sel, hist.done); } + + hist.lastSelTime = +new Date; + hist.lastSelOrigin = origin; + hist.lastSelOp = opId; + if (options && options.clearRedo !== false) + { clearSelectionEvents(hist.undone); } +} + +function pushSelectionToHistory(sel, dest) { + var top = lst(dest); + if (!(top && top.ranges && top.equals(sel))) + { dest.push(sel); } +} + +// Used to store marked span information in the history. +function attachLocalSpans(doc, change, from, to) { + var existing = change["spans_" + doc.id], n = 0; + doc.iter(Math.max(doc.first, from), Math.min(doc.first + doc.size, to), function (line) { + if (line.markedSpans) + { (existing || (existing = change["spans_" + doc.id] = {}))[n] = line.markedSpans; } + ++n; + }); +} + +// When un/re-doing restores text containing marked spans, those +// that have been explicitly cleared should not be restored. +function removeClearedSpans(spans) { + if (!spans) { return null } + var out; + for (var i = 0; i < spans.length; ++i) { + if (spans[i].marker.explicitlyCleared) { if (!out) { out = spans.slice(0, i); } } + else if (out) { out.push(spans[i]); } + } + return !out ? spans : out.length ? out : null +} + +// Retrieve and filter the old marked spans stored in a change event. +function getOldSpans(doc, change) { + var found = change["spans_" + doc.id]; + if (!found) { return null } + var nw = []; + for (var i = 0; i < change.text.length; ++i) + { nw.push(removeClearedSpans(found[i])); } + return nw +} + +// Used for un/re-doing changes from the history. Combines the +// result of computing the existing spans with the set of spans that +// existed in the history (so that deleting around a span and then +// undoing brings back the span). +function mergeOldSpans(doc, change) { + var old = getOldSpans(doc, change); + var stretched = stretchSpansOverChange(doc, change); + if (!old) { return stretched } + if (!stretched) { return old } + + for (var i = 0; i < old.length; ++i) { + var oldCur = old[i], stretchCur = stretched[i]; + if (oldCur && stretchCur) { + spans: for (var j = 0; j < stretchCur.length; ++j) { + var span = stretchCur[j]; + for (var k = 0; k < oldCur.length; ++k) + { if (oldCur[k].marker == span.marker) { continue spans } } + oldCur.push(span); + } + } else if (stretchCur) { + old[i] = stretchCur; + } + } + return old +} + +// Used both to provide a JSON-safe object in .getHistory, and, when +// detaching a document, to split the history in two +function copyHistoryArray(events, newGroup, instantiateSel) { + var copy = []; + for (var i = 0; i < events.length; ++i) { + var event = events[i]; + if (event.ranges) { + copy.push(instantiateSel ? Selection.prototype.deepCopy.call(event) : event); + continue + } + var changes = event.changes, newChanges = []; + copy.push({changes: newChanges}); + for (var j = 0; j < changes.length; ++j) { + var change = changes[j], m = (void 0); + newChanges.push({from: change.from, to: change.to, text: change.text}); + if (newGroup) { for (var prop in change) { if (m = prop.match(/^spans_(\d+)$/)) { + if (indexOf(newGroup, Number(m[1])) > -1) { + lst(newChanges)[prop] = change[prop]; + delete change[prop]; + } + } } } + } + } + return copy +} + +// The 'scroll' parameter given to many of these indicated whether +// the new cursor position should be scrolled into view after +// modifying the selection. + +// If shift is held or the extend flag is set, extends a range to +// include a given position (and optionally a second position). +// Otherwise, simply returns the range between the given positions. +// Used for cursor motion and such. +function extendRange(range, head, other, extend) { + if (extend) { + var anchor = range.anchor; + if (other) { + var posBefore = cmp(head, anchor) < 0; + if (posBefore != (cmp(other, anchor) < 0)) { + anchor = head; + head = other; + } else if (posBefore != (cmp(head, other) < 0)) { + head = other; + } + } + return new Range(anchor, head) + } else { + return new Range(other || head, head) + } +} + +// Extend the primary selection range, discard the rest. +function extendSelection(doc, head, other, options, extend) { + if (extend == null) { extend = doc.cm && (doc.cm.display.shift || doc.extend); } + setSelection(doc, new Selection([extendRange(doc.sel.primary(), head, other, extend)], 0), options); +} + +// Extend all selections (pos is an array of selections with length +// equal the number of selections) +function extendSelections(doc, heads, options) { + var out = []; + var extend = doc.cm && (doc.cm.display.shift || doc.extend); + for (var i = 0; i < doc.sel.ranges.length; i++) + { out[i] = extendRange(doc.sel.ranges[i], heads[i], null, extend); } + var newSel = normalizeSelection(out, doc.sel.primIndex); + setSelection(doc, newSel, options); +} + +// Updates a single range in the selection. +function replaceOneSelection(doc, i, range, options) { + var ranges = doc.sel.ranges.slice(0); + ranges[i] = range; + setSelection(doc, normalizeSelection(ranges, doc.sel.primIndex), options); +} + +// Reset the selection to a single range. +function setSimpleSelection(doc, anchor, head, options) { + setSelection(doc, simpleSelection(anchor, head), options); +} + +// Give beforeSelectionChange handlers a change to influence a +// selection update. +function filterSelectionChange(doc, sel, options) { + var obj = { + ranges: sel.ranges, + update: function(ranges) { + var this$1 = this; + + this.ranges = []; + for (var i = 0; i < ranges.length; i++) + { this$1.ranges[i] = new Range(clipPos(doc, ranges[i].anchor), + clipPos(doc, ranges[i].head)); } + }, + origin: options && options.origin + }; + signal(doc, "beforeSelectionChange", doc, obj); + if (doc.cm) { signal(doc.cm, "beforeSelectionChange", doc.cm, obj); } + if (obj.ranges != sel.ranges) { return normalizeSelection(obj.ranges, obj.ranges.length - 1) } + else { return sel } +} + +function setSelectionReplaceHistory(doc, sel, options) { + var done = doc.history.done, last = lst(done); + if (last && last.ranges) { + done[done.length - 1] = sel; + setSelectionNoUndo(doc, sel, options); + } else { + setSelection(doc, sel, options); + } +} + +// Set a new selection. +function setSelection(doc, sel, options) { + setSelectionNoUndo(doc, sel, options); + addSelectionToHistory(doc, doc.sel, doc.cm ? doc.cm.curOp.id : NaN, options); +} + +function setSelectionNoUndo(doc, sel, options) { + if (hasHandler(doc, "beforeSelectionChange") || doc.cm && hasHandler(doc.cm, "beforeSelectionChange")) + { sel = filterSelectionChange(doc, sel, options); } + + var bias = options && options.bias || + (cmp(sel.primary().head, doc.sel.primary().head) < 0 ? -1 : 1); + setSelectionInner(doc, skipAtomicInSelection(doc, sel, bias, true)); + + if (!(options && options.scroll === false) && doc.cm) + { ensureCursorVisible(doc.cm); } +} + +function setSelectionInner(doc, sel) { + if (sel.equals(doc.sel)) { return } + + doc.sel = sel; + + if (doc.cm) { + doc.cm.curOp.updateInput = doc.cm.curOp.selectionChanged = true; + signalCursorActivity(doc.cm); + } + signalLater(doc, "cursorActivity", doc); +} + +// Verify that the selection does not partially select any atomic +// marked ranges. +function reCheckSelection(doc) { + setSelectionInner(doc, skipAtomicInSelection(doc, doc.sel, null, false)); +} + +// Return a selection that does not partially select any atomic +// ranges. +function skipAtomicInSelection(doc, sel, bias, mayClear) { + var out; + for (var i = 0; i < sel.ranges.length; i++) { + var range = sel.ranges[i]; + var old = sel.ranges.length == doc.sel.ranges.length && doc.sel.ranges[i]; + var newAnchor = skipAtomic(doc, range.anchor, old && old.anchor, bias, mayClear); + var newHead = skipAtomic(doc, range.head, old && old.head, bias, mayClear); + if (out || newAnchor != range.anchor || newHead != range.head) { + if (!out) { out = sel.ranges.slice(0, i); } + out[i] = new Range(newAnchor, newHead); + } + } + return out ? normalizeSelection(out, sel.primIndex) : sel +} + +function skipAtomicInner(doc, pos, oldPos, dir, mayClear) { + var line = getLine(doc, pos.line); + if (line.markedSpans) { for (var i = 0; i < line.markedSpans.length; ++i) { + var sp = line.markedSpans[i], m = sp.marker; + if ((sp.from == null || (m.inclusiveLeft ? sp.from <= pos.ch : sp.from < pos.ch)) && + (sp.to == null || (m.inclusiveRight ? sp.to >= pos.ch : sp.to > pos.ch))) { + if (mayClear) { + signal(m, "beforeCursorEnter"); + if (m.explicitlyCleared) { + if (!line.markedSpans) { break } + else {--i; continue} + } + } + if (!m.atomic) { continue } + + if (oldPos) { + var near = m.find(dir < 0 ? 1 : -1), diff = (void 0); + if (dir < 0 ? m.inclusiveRight : m.inclusiveLeft) + { near = movePos(doc, near, -dir, near && near.line == pos.line ? line : null); } + if (near && near.line == pos.line && (diff = cmp(near, oldPos)) && (dir < 0 ? diff < 0 : diff > 0)) + { return skipAtomicInner(doc, near, pos, dir, mayClear) } + } + + var far = m.find(dir < 0 ? -1 : 1); + if (dir < 0 ? m.inclusiveLeft : m.inclusiveRight) + { far = movePos(doc, far, dir, far.line == pos.line ? line : null); } + return far ? skipAtomicInner(doc, far, pos, dir, mayClear) : null + } + } } + return pos +} + +// Ensure a given position is not inside an atomic range. +function skipAtomic(doc, pos, oldPos, bias, mayClear) { + var dir = bias || 1; + var found = skipAtomicInner(doc, pos, oldPos, dir, mayClear) || + (!mayClear && skipAtomicInner(doc, pos, oldPos, dir, true)) || + skipAtomicInner(doc, pos, oldPos, -dir, mayClear) || + (!mayClear && skipAtomicInner(doc, pos, oldPos, -dir, true)); + if (!found) { + doc.cantEdit = true; + return Pos(doc.first, 0) + } + return found +} + +function movePos(doc, pos, dir, line) { + if (dir < 0 && pos.ch == 0) { + if (pos.line > doc.first) { return clipPos(doc, Pos(pos.line - 1)) } + else { return null } + } else if (dir > 0 && pos.ch == (line || getLine(doc, pos.line)).text.length) { + if (pos.line < doc.first + doc.size - 1) { return Pos(pos.line + 1, 0) } + else { return null } + } else { + return new Pos(pos.line, pos.ch + dir) + } +} + +function selectAll(cm) { + cm.setSelection(Pos(cm.firstLine(), 0), Pos(cm.lastLine()), sel_dontScroll); +} + +// UPDATING + +// Allow "beforeChange" event handlers to influence a change +function filterChange(doc, change, update) { + var obj = { + canceled: false, + from: change.from, + to: change.to, + text: change.text, + origin: change.origin, + cancel: function () { return obj.canceled = true; } + }; + if (update) { obj.update = function (from, to, text, origin) { + if (from) { obj.from = clipPos(doc, from); } + if (to) { obj.to = clipPos(doc, to); } + if (text) { obj.text = text; } + if (origin !== undefined) { obj.origin = origin; } + }; } + signal(doc, "beforeChange", doc, obj); + if (doc.cm) { signal(doc.cm, "beforeChange", doc.cm, obj); } + + if (obj.canceled) { return null } + return {from: obj.from, to: obj.to, text: obj.text, origin: obj.origin} +} + +// Apply a change to a document, and add it to the document's +// history, and propagating it to all linked documents. +function makeChange(doc, change, ignoreReadOnly) { + if (doc.cm) { + if (!doc.cm.curOp) { return operation(doc.cm, makeChange)(doc, change, ignoreReadOnly) } + if (doc.cm.state.suppressEdits) { return } + } + + if (hasHandler(doc, "beforeChange") || doc.cm && hasHandler(doc.cm, "beforeChange")) { + change = filterChange(doc, change, true); + if (!change) { return } + } + + // Possibly split or suppress the update based on the presence + // of read-only spans in its range. + var split = sawReadOnlySpans && !ignoreReadOnly && removeReadOnlyRanges(doc, change.from, change.to); + if (split) { + for (var i = split.length - 1; i >= 0; --i) + { makeChangeInner(doc, {from: split[i].from, to: split[i].to, text: i ? [""] : change.text}); } + } else { + makeChangeInner(doc, change); + } +} + +function makeChangeInner(doc, change) { + if (change.text.length == 1 && change.text[0] == "" && cmp(change.from, change.to) == 0) { return } + var selAfter = computeSelAfterChange(doc, change); + addChangeToHistory(doc, change, selAfter, doc.cm ? doc.cm.curOp.id : NaN); + + makeChangeSingleDoc(doc, change, selAfter, stretchSpansOverChange(doc, change)); + var rebased = []; + + linkedDocs(doc, function (doc, sharedHist) { + if (!sharedHist && indexOf(rebased, doc.history) == -1) { + rebaseHist(doc.history, change); + rebased.push(doc.history); + } + makeChangeSingleDoc(doc, change, null, stretchSpansOverChange(doc, change)); + }); +} + +// Revert a change stored in a document's history. +function makeChangeFromHistory(doc, type, allowSelectionOnly) { + if (doc.cm && doc.cm.state.suppressEdits && !allowSelectionOnly) { return } + + var hist = doc.history, event, selAfter = doc.sel; + var source = type == "undo" ? hist.done : hist.undone, dest = type == "undo" ? hist.undone : hist.done; + + // Verify that there is a useable event (so that ctrl-z won't + // needlessly clear selection events) + var i = 0; + for (; i < source.length; i++) { + event = source[i]; + if (allowSelectionOnly ? event.ranges && !event.equals(doc.sel) : !event.ranges) + { break } + } + if (i == source.length) { return } + hist.lastOrigin = hist.lastSelOrigin = null; + + for (;;) { + event = source.pop(); + if (event.ranges) { + pushSelectionToHistory(event, dest); + if (allowSelectionOnly && !event.equals(doc.sel)) { + setSelection(doc, event, {clearRedo: false}); + return + } + selAfter = event; + } + else { break } + } + + // Build up a reverse change object to add to the opposite history + // stack (redo when undoing, and vice versa). + var antiChanges = []; + pushSelectionToHistory(selAfter, dest); + dest.push({changes: antiChanges, generation: hist.generation}); + hist.generation = event.generation || ++hist.maxGeneration; + + var filter = hasHandler(doc, "beforeChange") || doc.cm && hasHandler(doc.cm, "beforeChange"); + + var loop = function ( i ) { + var change = event.changes[i]; + change.origin = type; + if (filter && !filterChange(doc, change, false)) { + source.length = 0; + return {} + } + + antiChanges.push(historyChangeFromChange(doc, change)); + + var after = i ? computeSelAfterChange(doc, change) : lst(source); + makeChangeSingleDoc(doc, change, after, mergeOldSpans(doc, change)); + if (!i && doc.cm) { doc.cm.scrollIntoView({from: change.from, to: changeEnd(change)}); } + var rebased = []; + + // Propagate to the linked documents + linkedDocs(doc, function (doc, sharedHist) { + if (!sharedHist && indexOf(rebased, doc.history) == -1) { + rebaseHist(doc.history, change); + rebased.push(doc.history); + } + makeChangeSingleDoc(doc, change, null, mergeOldSpans(doc, change)); + }); + }; + + for (var i$1 = event.changes.length - 1; i$1 >= 0; --i$1) { + var returned = loop( i$1 ); + + if ( returned ) return returned.v; + } +} + +// Sub-views need their line numbers shifted when text is added +// above or below them in the parent document. +function shiftDoc(doc, distance) { + if (distance == 0) { return } + doc.first += distance; + doc.sel = new Selection(map(doc.sel.ranges, function (range) { return new Range( + Pos(range.anchor.line + distance, range.anchor.ch), + Pos(range.head.line + distance, range.head.ch) + ); }), doc.sel.primIndex); + if (doc.cm) { + regChange(doc.cm, doc.first, doc.first - distance, distance); + for (var d = doc.cm.display, l = d.viewFrom; l < d.viewTo; l++) + { regLineChange(doc.cm, l, "gutter"); } + } +} + +// More lower-level change function, handling only a single document +// (not linked ones). +function makeChangeSingleDoc(doc, change, selAfter, spans) { + if (doc.cm && !doc.cm.curOp) + { return operation(doc.cm, makeChangeSingleDoc)(doc, change, selAfter, spans) } + + if (change.to.line < doc.first) { + shiftDoc(doc, change.text.length - 1 - (change.to.line - change.from.line)); + return + } + if (change.from.line > doc.lastLine()) { return } + + // Clip the change to the size of this doc + if (change.from.line < doc.first) { + var shift = change.text.length - 1 - (doc.first - change.from.line); + shiftDoc(doc, shift); + change = {from: Pos(doc.first, 0), to: Pos(change.to.line + shift, change.to.ch), + text: [lst(change.text)], origin: change.origin}; + } + var last = doc.lastLine(); + if (change.to.line > last) { + change = {from: change.from, to: Pos(last, getLine(doc, last).text.length), + text: [change.text[0]], origin: change.origin}; + } + + change.removed = getBetween(doc, change.from, change.to); + + if (!selAfter) { selAfter = computeSelAfterChange(doc, change); } + if (doc.cm) { makeChangeSingleDocInEditor(doc.cm, change, spans); } + else { updateDoc(doc, change, spans); } + setSelectionNoUndo(doc, selAfter, sel_dontScroll); +} + +// Handle the interaction of a change to a document with the editor +// that this document is part of. +function makeChangeSingleDocInEditor(cm, change, spans) { + var doc = cm.doc, display = cm.display, from = change.from, to = change.to; + + var recomputeMaxLength = false, checkWidthStart = from.line; + if (!cm.options.lineWrapping) { + checkWidthStart = lineNo(visualLine(getLine(doc, from.line))); + doc.iter(checkWidthStart, to.line + 1, function (line) { + if (line == display.maxLine) { + recomputeMaxLength = true; + return true + } + }); + } + + if (doc.sel.contains(change.from, change.to) > -1) + { signalCursorActivity(cm); } + + updateDoc(doc, change, spans, estimateHeight(cm)); + + if (!cm.options.lineWrapping) { + doc.iter(checkWidthStart, from.line + change.text.length, function (line) { + var len = lineLength(line); + if (len > display.maxLineLength) { + display.maxLine = line; + display.maxLineLength = len; + display.maxLineChanged = true; + recomputeMaxLength = false; + } + }); + if (recomputeMaxLength) { cm.curOp.updateMaxLine = true; } + } + + retreatFrontier(doc, from.line); + startWorker(cm, 400); + + var lendiff = change.text.length - (to.line - from.line) - 1; + // Remember that these lines changed, for updating the display + if (change.full) + { regChange(cm); } + else if (from.line == to.line && change.text.length == 1 && !isWholeLineUpdate(cm.doc, change)) + { regLineChange(cm, from.line, "text"); } + else + { regChange(cm, from.line, to.line + 1, lendiff); } + + var changesHandler = hasHandler(cm, "changes"), changeHandler = hasHandler(cm, "change"); + if (changeHandler || changesHandler) { + var obj = { + from: from, to: to, + text: change.text, + removed: change.removed, + origin: change.origin + }; + if (changeHandler) { signalLater(cm, "change", cm, obj); } + if (changesHandler) { (cm.curOp.changeObjs || (cm.curOp.changeObjs = [])).push(obj); } + } + cm.display.selForContextMenu = null; +} + +function replaceRange(doc, code, from, to, origin) { + if (!to) { to = from; } + if (cmp(to, from) < 0) { var tmp = to; to = from; from = tmp; } + if (typeof code == "string") { code = doc.splitLines(code); } + makeChange(doc, {from: from, to: to, text: code, origin: origin}); +} + +// Rebasing/resetting history to deal with externally-sourced changes + +function rebaseHistSelSingle(pos, from, to, diff) { + if (to < pos.line) { + pos.line += diff; + } else if (from < pos.line) { + pos.line = from; + pos.ch = 0; + } +} + +// Tries to rebase an array of history events given a change in the +// document. If the change touches the same lines as the event, the +// event, and everything 'behind' it, is discarded. If the change is +// before the event, the event's positions are updated. Uses a +// copy-on-write scheme for the positions, to avoid having to +// reallocate them all on every rebase, but also avoid problems with +// shared position objects being unsafely updated. +function rebaseHistArray(array, from, to, diff) { + for (var i = 0; i < array.length; ++i) { + var sub = array[i], ok = true; + if (sub.ranges) { + if (!sub.copied) { sub = array[i] = sub.deepCopy(); sub.copied = true; } + for (var j = 0; j < sub.ranges.length; j++) { + rebaseHistSelSingle(sub.ranges[j].anchor, from, to, diff); + rebaseHistSelSingle(sub.ranges[j].head, from, to, diff); + } + continue + } + for (var j$1 = 0; j$1 < sub.changes.length; ++j$1) { + var cur = sub.changes[j$1]; + if (to < cur.from.line) { + cur.from = Pos(cur.from.line + diff, cur.from.ch); + cur.to = Pos(cur.to.line + diff, cur.to.ch); + } else if (from <= cur.to.line) { + ok = false; + break + } + } + if (!ok) { + array.splice(0, i + 1); + i = 0; + } + } +} + +function rebaseHist(hist, change) { + var from = change.from.line, to = change.to.line, diff = change.text.length - (to - from) - 1; + rebaseHistArray(hist.done, from, to, diff); + rebaseHistArray(hist.undone, from, to, diff); +} + +// Utility for applying a change to a line by handle or number, +// returning the number and optionally registering the line as +// changed. +function changeLine(doc, handle, changeType, op) { + var no = handle, line = handle; + if (typeof handle == "number") { line = getLine(doc, clipLine(doc, handle)); } + else { no = lineNo(handle); } + if (no == null) { return null } + if (op(line, no) && doc.cm) { regLineChange(doc.cm, no, changeType); } + return line +} + +// The document is represented as a BTree consisting of leaves, with +// chunk of lines in them, and branches, with up to ten leaves or +// other branch nodes below them. The top node is always a branch +// node, and is the document object itself (meaning it has +// additional methods and properties). +// +// All nodes have parent links. The tree is used both to go from +// line numbers to line objects, and to go from objects to numbers. +// It also indexes by height, and is used to convert between height +// and line object, and to find the total height of the document. +// +// See also http://marijnhaverbeke.nl/blog/codemirror-line-tree.html + +function LeafChunk(lines) { + var this$1 = this; + + this.lines = lines; + this.parent = null; + var height = 0; + for (var i = 0; i < lines.length; ++i) { + lines[i].parent = this$1; + height += lines[i].height; + } + this.height = height; +} + +LeafChunk.prototype = { + chunkSize: function chunkSize() { return this.lines.length }, + + // Remove the n lines at offset 'at'. + removeInner: function removeInner(at, n) { + var this$1 = this; + + for (var i = at, e = at + n; i < e; ++i) { + var line = this$1.lines[i]; + this$1.height -= line.height; + cleanUpLine(line); + signalLater(line, "delete"); + } + this.lines.splice(at, n); + }, + + // Helper used to collapse a small branch into a single leaf. + collapse: function collapse(lines) { + lines.push.apply(lines, this.lines); + }, + + // Insert the given array of lines at offset 'at', count them as + // having the given height. + insertInner: function insertInner(at, lines, height) { + var this$1 = this; + + this.height += height; + this.lines = this.lines.slice(0, at).concat(lines).concat(this.lines.slice(at)); + for (var i = 0; i < lines.length; ++i) { lines[i].parent = this$1; } + }, + + // Used to iterate over a part of the tree. + iterN: function iterN(at, n, op) { + var this$1 = this; + + for (var e = at + n; at < e; ++at) + { if (op(this$1.lines[at])) { return true } } + } +}; + +function BranchChunk(children) { + var this$1 = this; + + this.children = children; + var size = 0, height = 0; + for (var i = 0; i < children.length; ++i) { + var ch = children[i]; + size += ch.chunkSize(); height += ch.height; + ch.parent = this$1; + } + this.size = size; + this.height = height; + this.parent = null; +} + +BranchChunk.prototype = { + chunkSize: function chunkSize() { return this.size }, + + removeInner: function removeInner(at, n) { + var this$1 = this; + + this.size -= n; + for (var i = 0; i < this.children.length; ++i) { + var child = this$1.children[i], sz = child.chunkSize(); + if (at < sz) { + var rm = Math.min(n, sz - at), oldHeight = child.height; + child.removeInner(at, rm); + this$1.height -= oldHeight - child.height; + if (sz == rm) { this$1.children.splice(i--, 1); child.parent = null; } + if ((n -= rm) == 0) { break } + at = 0; + } else { at -= sz; } + } + // If the result is smaller than 25 lines, ensure that it is a + // single leaf node. + if (this.size - n < 25 && + (this.children.length > 1 || !(this.children[0] instanceof LeafChunk))) { + var lines = []; + this.collapse(lines); + this.children = [new LeafChunk(lines)]; + this.children[0].parent = this; + } + }, + + collapse: function collapse(lines) { + var this$1 = this; + + for (var i = 0; i < this.children.length; ++i) { this$1.children[i].collapse(lines); } + }, + + insertInner: function insertInner(at, lines, height) { + var this$1 = this; + + this.size += lines.length; + this.height += height; + for (var i = 0; i < this.children.length; ++i) { + var child = this$1.children[i], sz = child.chunkSize(); + if (at <= sz) { + child.insertInner(at, lines, height); + if (child.lines && child.lines.length > 50) { + // To avoid memory thrashing when child.lines is huge (e.g. first view of a large file), it's never spliced. + // Instead, small slices are taken. They're taken in order because sequential memory accesses are fastest. + var remaining = child.lines.length % 25 + 25; + for (var pos = remaining; pos < child.lines.length;) { + var leaf = new LeafChunk(child.lines.slice(pos, pos += 25)); + child.height -= leaf.height; + this$1.children.splice(++i, 0, leaf); + leaf.parent = this$1; + } + child.lines = child.lines.slice(0, remaining); + this$1.maybeSpill(); + } + break + } + at -= sz; + } + }, + + // When a node has grown, check whether it should be split. + maybeSpill: function maybeSpill() { + if (this.children.length <= 10) { return } + var me = this; + do { + var spilled = me.children.splice(me.children.length - 5, 5); + var sibling = new BranchChunk(spilled); + if (!me.parent) { // Become the parent node + var copy = new BranchChunk(me.children); + copy.parent = me; + me.children = [copy, sibling]; + me = copy; + } else { + me.size -= sibling.size; + me.height -= sibling.height; + var myIndex = indexOf(me.parent.children, me); + me.parent.children.splice(myIndex + 1, 0, sibling); + } + sibling.parent = me.parent; + } while (me.children.length > 10) + me.parent.maybeSpill(); + }, + + iterN: function iterN(at, n, op) { + var this$1 = this; + + for (var i = 0; i < this.children.length; ++i) { + var child = this$1.children[i], sz = child.chunkSize(); + if (at < sz) { + var used = Math.min(n, sz - at); + if (child.iterN(at, used, op)) { return true } + if ((n -= used) == 0) { break } + at = 0; + } else { at -= sz; } + } + } +}; + +// Line widgets are block elements displayed above or below a line. + +var LineWidget = function(doc, node, options) { + var this$1 = this; + + if (options) { for (var opt in options) { if (options.hasOwnProperty(opt)) + { this$1[opt] = options[opt]; } } } + this.doc = doc; + this.node = node; +}; + +LineWidget.prototype.clear = function () { + var this$1 = this; + + var cm = this.doc.cm, ws = this.line.widgets, line = this.line, no = lineNo(line); + if (no == null || !ws) { return } + for (var i = 0; i < ws.length; ++i) { if (ws[i] == this$1) { ws.splice(i--, 1); } } + if (!ws.length) { line.widgets = null; } + var height = widgetHeight(this); + updateLineHeight(line, Math.max(0, line.height - height)); + if (cm) { + runInOp(cm, function () { + adjustScrollWhenAboveVisible(cm, line, -height); + regLineChange(cm, no, "widget"); + }); + signalLater(cm, "lineWidgetCleared", cm, this, no); + } +}; + +LineWidget.prototype.changed = function () { + var this$1 = this; + + var oldH = this.height, cm = this.doc.cm, line = this.line; + this.height = null; + var diff = widgetHeight(this) - oldH; + if (!diff) { return } + updateLineHeight(line, line.height + diff); + if (cm) { + runInOp(cm, function () { + cm.curOp.forceUpdate = true; + adjustScrollWhenAboveVisible(cm, line, diff); + signalLater(cm, "lineWidgetChanged", cm, this$1, lineNo(line)); + }); + } +}; +eventMixin(LineWidget); + +function adjustScrollWhenAboveVisible(cm, line, diff) { + if (heightAtLine(line) < ((cm.curOp && cm.curOp.scrollTop) || cm.doc.scrollTop)) + { addToScrollTop(cm, diff); } +} + +function addLineWidget(doc, handle, node, options) { + var widget = new LineWidget(doc, node, options); + var cm = doc.cm; + if (cm && widget.noHScroll) { cm.display.alignWidgets = true; } + changeLine(doc, handle, "widget", function (line) { + var widgets = line.widgets || (line.widgets = []); + if (widget.insertAt == null) { widgets.push(widget); } + else { widgets.splice(Math.min(widgets.length - 1, Math.max(0, widget.insertAt)), 0, widget); } + widget.line = line; + if (cm && !lineIsHidden(doc, line)) { + var aboveVisible = heightAtLine(line) < doc.scrollTop; + updateLineHeight(line, line.height + widgetHeight(widget)); + if (aboveVisible) { addToScrollTop(cm, widget.height); } + cm.curOp.forceUpdate = true; + } + return true + }); + signalLater(cm, "lineWidgetAdded", cm, widget, typeof handle == "number" ? handle : lineNo(handle)); + return widget +} + +// TEXTMARKERS + +// Created with markText and setBookmark methods. A TextMarker is a +// handle that can be used to clear or find a marked position in the +// document. Line objects hold arrays (markedSpans) containing +// {from, to, marker} object pointing to such marker objects, and +// indicating that such a marker is present on that line. Multiple +// lines may point to the same marker when it spans across lines. +// The spans will have null for their from/to properties when the +// marker continues beyond the start/end of the line. Markers have +// links back to the lines they currently touch. + +// Collapsed markers have unique ids, in order to be able to order +// them, which is needed for uniquely determining an outer marker +// when they overlap (they may nest, but not partially overlap). +var nextMarkerId = 0; + +var TextMarker = function(doc, type) { + this.lines = []; + this.type = type; + this.doc = doc; + this.id = ++nextMarkerId; +}; + +// Clear the marker. +TextMarker.prototype.clear = function () { + var this$1 = this; + + if (this.explicitlyCleared) { return } + var cm = this.doc.cm, withOp = cm && !cm.curOp; + if (withOp) { startOperation(cm); } + if (hasHandler(this, "clear")) { + var found = this.find(); + if (found) { signalLater(this, "clear", found.from, found.to); } + } + var min = null, max = null; + for (var i = 0; i < this.lines.length; ++i) { + var line = this$1.lines[i]; + var span = getMarkedSpanFor(line.markedSpans, this$1); + if (cm && !this$1.collapsed) { regLineChange(cm, lineNo(line), "text"); } + else if (cm) { + if (span.to != null) { max = lineNo(line); } + if (span.from != null) { min = lineNo(line); } + } + line.markedSpans = removeMarkedSpan(line.markedSpans, span); + if (span.from == null && this$1.collapsed && !lineIsHidden(this$1.doc, line) && cm) + { updateLineHeight(line, textHeight(cm.display)); } + } + if (cm && this.collapsed && !cm.options.lineWrapping) { for (var i$1 = 0; i$1 < this.lines.length; ++i$1) { + var visual = visualLine(this$1.lines[i$1]), len = lineLength(visual); + if (len > cm.display.maxLineLength) { + cm.display.maxLine = visual; + cm.display.maxLineLength = len; + cm.display.maxLineChanged = true; + } + } } + + if (min != null && cm && this.collapsed) { regChange(cm, min, max + 1); } + this.lines.length = 0; + this.explicitlyCleared = true; + if (this.atomic && this.doc.cantEdit) { + this.doc.cantEdit = false; + if (cm) { reCheckSelection(cm.doc); } + } + if (cm) { signalLater(cm, "markerCleared", cm, this, min, max); } + if (withOp) { endOperation(cm); } + if (this.parent) { this.parent.clear(); } +}; + +// Find the position of the marker in the document. Returns a {from, +// to} object by default. Side can be passed to get a specific side +// -- 0 (both), -1 (left), or 1 (right). When lineObj is true, the +// Pos objects returned contain a line object, rather than a line +// number (used to prevent looking up the same line twice). +TextMarker.prototype.find = function (side, lineObj) { + var this$1 = this; + + if (side == null && this.type == "bookmark") { side = 1; } + var from, to; + for (var i = 0; i < this.lines.length; ++i) { + var line = this$1.lines[i]; + var span = getMarkedSpanFor(line.markedSpans, this$1); + if (span.from != null) { + from = Pos(lineObj ? line : lineNo(line), span.from); + if (side == -1) { return from } + } + if (span.to != null) { + to = Pos(lineObj ? line : lineNo(line), span.to); + if (side == 1) { return to } + } + } + return from && {from: from, to: to} +}; + +// Signals that the marker's widget changed, and surrounding layout +// should be recomputed. +TextMarker.prototype.changed = function () { + var this$1 = this; + + var pos = this.find(-1, true), widget = this, cm = this.doc.cm; + if (!pos || !cm) { return } + runInOp(cm, function () { + var line = pos.line, lineN = lineNo(pos.line); + var view = findViewForLine(cm, lineN); + if (view) { + clearLineMeasurementCacheFor(view); + cm.curOp.selectionChanged = cm.curOp.forceUpdate = true; + } + cm.curOp.updateMaxLine = true; + if (!lineIsHidden(widget.doc, line) && widget.height != null) { + var oldHeight = widget.height; + widget.height = null; + var dHeight = widgetHeight(widget) - oldHeight; + if (dHeight) + { updateLineHeight(line, line.height + dHeight); } + } + signalLater(cm, "markerChanged", cm, this$1); + }); +}; + +TextMarker.prototype.attachLine = function (line) { + if (!this.lines.length && this.doc.cm) { + var op = this.doc.cm.curOp; + if (!op.maybeHiddenMarkers || indexOf(op.maybeHiddenMarkers, this) == -1) + { (op.maybeUnhiddenMarkers || (op.maybeUnhiddenMarkers = [])).push(this); } + } + this.lines.push(line); +}; + +TextMarker.prototype.detachLine = function (line) { + this.lines.splice(indexOf(this.lines, line), 1); + if (!this.lines.length && this.doc.cm) { + var op = this.doc.cm.curOp;(op.maybeHiddenMarkers || (op.maybeHiddenMarkers = [])).push(this); + } +}; +eventMixin(TextMarker); + +// Create a marker, wire it up to the right lines, and +function markText(doc, from, to, options, type) { + // Shared markers (across linked documents) are handled separately + // (markTextShared will call out to this again, once per + // document). + if (options && options.shared) { return markTextShared(doc, from, to, options, type) } + // Ensure we are in an operation. + if (doc.cm && !doc.cm.curOp) { return operation(doc.cm, markText)(doc, from, to, options, type) } + + var marker = new TextMarker(doc, type), diff = cmp(from, to); + if (options) { copyObj(options, marker, false); } + // Don't connect empty markers unless clearWhenEmpty is false + if (diff > 0 || diff == 0 && marker.clearWhenEmpty !== false) + { return marker } + if (marker.replacedWith) { + // Showing up as a widget implies collapsed (widget replaces text) + marker.collapsed = true; + marker.widgetNode = eltP("span", [marker.replacedWith], "CodeMirror-widget"); + if (!options.handleMouseEvents) { marker.widgetNode.setAttribute("cm-ignore-events", "true"); } + if (options.insertLeft) { marker.widgetNode.insertLeft = true; } + } + if (marker.collapsed) { + if (conflictingCollapsedRange(doc, from.line, from, to, marker) || + from.line != to.line && conflictingCollapsedRange(doc, to.line, from, to, marker)) + { throw new Error("Inserting collapsed marker partially overlapping an existing one") } + seeCollapsedSpans(); + } + + if (marker.addToHistory) + { addChangeToHistory(doc, {from: from, to: to, origin: "markText"}, doc.sel, NaN); } + + var curLine = from.line, cm = doc.cm, updateMaxLine; + doc.iter(curLine, to.line + 1, function (line) { + if (cm && marker.collapsed && !cm.options.lineWrapping && visualLine(line) == cm.display.maxLine) + { updateMaxLine = true; } + if (marker.collapsed && curLine != from.line) { updateLineHeight(line, 0); } + addMarkedSpan(line, new MarkedSpan(marker, + curLine == from.line ? from.ch : null, + curLine == to.line ? to.ch : null)); + ++curLine; + }); + // lineIsHidden depends on the presence of the spans, so needs a second pass + if (marker.collapsed) { doc.iter(from.line, to.line + 1, function (line) { + if (lineIsHidden(doc, line)) { updateLineHeight(line, 0); } + }); } + + if (marker.clearOnEnter) { on(marker, "beforeCursorEnter", function () { return marker.clear(); }); } + + if (marker.readOnly) { + seeReadOnlySpans(); + if (doc.history.done.length || doc.history.undone.length) + { doc.clearHistory(); } + } + if (marker.collapsed) { + marker.id = ++nextMarkerId; + marker.atomic = true; + } + if (cm) { + // Sync editor state + if (updateMaxLine) { cm.curOp.updateMaxLine = true; } + if (marker.collapsed) + { regChange(cm, from.line, to.line + 1); } + else if (marker.className || marker.title || marker.startStyle || marker.endStyle || marker.css) + { for (var i = from.line; i <= to.line; i++) { regLineChange(cm, i, "text"); } } + if (marker.atomic) { reCheckSelection(cm.doc); } + signalLater(cm, "markerAdded", cm, marker); + } + return marker +} + +// SHARED TEXTMARKERS + +// A shared marker spans multiple linked documents. It is +// implemented as a meta-marker-object controlling multiple normal +// markers. +var SharedTextMarker = function(markers, primary) { + var this$1 = this; + + this.markers = markers; + this.primary = primary; + for (var i = 0; i < markers.length; ++i) + { markers[i].parent = this$1; } +}; + +SharedTextMarker.prototype.clear = function () { + var this$1 = this; + + if (this.explicitlyCleared) { return } + this.explicitlyCleared = true; + for (var i = 0; i < this.markers.length; ++i) + { this$1.markers[i].clear(); } + signalLater(this, "clear"); +}; + +SharedTextMarker.prototype.find = function (side, lineObj) { + return this.primary.find(side, lineObj) +}; +eventMixin(SharedTextMarker); + +function markTextShared(doc, from, to, options, type) { + options = copyObj(options); + options.shared = false; + var markers = [markText(doc, from, to, options, type)], primary = markers[0]; + var widget = options.widgetNode; + linkedDocs(doc, function (doc) { + if (widget) { options.widgetNode = widget.cloneNode(true); } + markers.push(markText(doc, clipPos(doc, from), clipPos(doc, to), options, type)); + for (var i = 0; i < doc.linked.length; ++i) + { if (doc.linked[i].isParent) { return } } + primary = lst(markers); + }); + return new SharedTextMarker(markers, primary) +} + +function findSharedMarkers(doc) { + return doc.findMarks(Pos(doc.first, 0), doc.clipPos(Pos(doc.lastLine())), function (m) { return m.parent; }) +} + +function copySharedMarkers(doc, markers) { + for (var i = 0; i < markers.length; i++) { + var marker = markers[i], pos = marker.find(); + var mFrom = doc.clipPos(pos.from), mTo = doc.clipPos(pos.to); + if (cmp(mFrom, mTo)) { + var subMark = markText(doc, mFrom, mTo, marker.primary, marker.primary.type); + marker.markers.push(subMark); + subMark.parent = marker; + } + } +} + +function detachSharedMarkers(markers) { + var loop = function ( i ) { + var marker = markers[i], linked = [marker.primary.doc]; + linkedDocs(marker.primary.doc, function (d) { return linked.push(d); }); + for (var j = 0; j < marker.markers.length; j++) { + var subMarker = marker.markers[j]; + if (indexOf(linked, subMarker.doc) == -1) { + subMarker.parent = null; + marker.markers.splice(j--, 1); + } + } + }; + + for (var i = 0; i < markers.length; i++) loop( i ); +} + +var nextDocId = 0; +var Doc = function(text, mode, firstLine, lineSep, direction) { + if (!(this instanceof Doc)) { return new Doc(text, mode, firstLine, lineSep, direction) } + if (firstLine == null) { firstLine = 0; } + + BranchChunk.call(this, [new LeafChunk([new Line("", null)])]); + this.first = firstLine; + this.scrollTop = this.scrollLeft = 0; + this.cantEdit = false; + this.cleanGeneration = 1; + this.modeFrontier = this.highlightFrontier = firstLine; + var start = Pos(firstLine, 0); + this.sel = simpleSelection(start); + this.history = new History(null); + this.id = ++nextDocId; + this.modeOption = mode; + this.lineSep = lineSep; + this.direction = (direction == "rtl") ? "rtl" : "ltr"; + this.extend = false; + + if (typeof text == "string") { text = this.splitLines(text); } + updateDoc(this, {from: start, to: start, text: text}); + setSelection(this, simpleSelection(start), sel_dontScroll); +}; + +Doc.prototype = createObj(BranchChunk.prototype, { + constructor: Doc, + // Iterate over the document. Supports two forms -- with only one + // argument, it calls that for each line in the document. With + // three, it iterates over the range given by the first two (with + // the second being non-inclusive). + iter: function(from, to, op) { + if (op) { this.iterN(from - this.first, to - from, op); } + else { this.iterN(this.first, this.first + this.size, from); } + }, + + // Non-public interface for adding and removing lines. + insert: function(at, lines) { + var height = 0; + for (var i = 0; i < lines.length; ++i) { height += lines[i].height; } + this.insertInner(at - this.first, lines, height); + }, + remove: function(at, n) { this.removeInner(at - this.first, n); }, + + // From here, the methods are part of the public interface. Most + // are also available from CodeMirror (editor) instances. + + getValue: function(lineSep) { + var lines = getLines(this, this.first, this.first + this.size); + if (lineSep === false) { return lines } + return lines.join(lineSep || this.lineSeparator()) + }, + setValue: docMethodOp(function(code) { + var top = Pos(this.first, 0), last = this.first + this.size - 1; + makeChange(this, {from: top, to: Pos(last, getLine(this, last).text.length), + text: this.splitLines(code), origin: "setValue", full: true}, true); + if (this.cm) { scrollToCoords(this.cm, 0, 0); } + setSelection(this, simpleSelection(top), sel_dontScroll); + }), + replaceRange: function(code, from, to, origin) { + from = clipPos(this, from); + to = to ? clipPos(this, to) : from; + replaceRange(this, code, from, to, origin); + }, + getRange: function(from, to, lineSep) { + var lines = getBetween(this, clipPos(this, from), clipPos(this, to)); + if (lineSep === false) { return lines } + return lines.join(lineSep || this.lineSeparator()) + }, + + getLine: function(line) {var l = this.getLineHandle(line); return l && l.text}, + + getLineHandle: function(line) {if (isLine(this, line)) { return getLine(this, line) }}, + getLineNumber: function(line) {return lineNo(line)}, + + getLineHandleVisualStart: function(line) { + if (typeof line == "number") { line = getLine(this, line); } + return visualLine(line) + }, + + lineCount: function() {return this.size}, + firstLine: function() {return this.first}, + lastLine: function() {return this.first + this.size - 1}, + + clipPos: function(pos) {return clipPos(this, pos)}, + + getCursor: function(start) { + var range$$1 = this.sel.primary(), pos; + if (start == null || start == "head") { pos = range$$1.head; } + else if (start == "anchor") { pos = range$$1.anchor; } + else if (start == "end" || start == "to" || start === false) { pos = range$$1.to(); } + else { pos = range$$1.from(); } + return pos + }, + listSelections: function() { return this.sel.ranges }, + somethingSelected: function() {return this.sel.somethingSelected()}, + + setCursor: docMethodOp(function(line, ch, options) { + setSimpleSelection(this, clipPos(this, typeof line == "number" ? Pos(line, ch || 0) : line), null, options); + }), + setSelection: docMethodOp(function(anchor, head, options) { + setSimpleSelection(this, clipPos(this, anchor), clipPos(this, head || anchor), options); + }), + extendSelection: docMethodOp(function(head, other, options) { + extendSelection(this, clipPos(this, head), other && clipPos(this, other), options); + }), + extendSelections: docMethodOp(function(heads, options) { + extendSelections(this, clipPosArray(this, heads), options); + }), + extendSelectionsBy: docMethodOp(function(f, options) { + var heads = map(this.sel.ranges, f); + extendSelections(this, clipPosArray(this, heads), options); + }), + setSelections: docMethodOp(function(ranges, primary, options) { + var this$1 = this; + + if (!ranges.length) { return } + var out = []; + for (var i = 0; i < ranges.length; i++) + { out[i] = new Range(clipPos(this$1, ranges[i].anchor), + clipPos(this$1, ranges[i].head)); } + if (primary == null) { primary = Math.min(ranges.length - 1, this.sel.primIndex); } + setSelection(this, normalizeSelection(out, primary), options); + }), + addSelection: docMethodOp(function(anchor, head, options) { + var ranges = this.sel.ranges.slice(0); + ranges.push(new Range(clipPos(this, anchor), clipPos(this, head || anchor))); + setSelection(this, normalizeSelection(ranges, ranges.length - 1), options); + }), + + getSelection: function(lineSep) { + var this$1 = this; + + var ranges = this.sel.ranges, lines; + for (var i = 0; i < ranges.length; i++) { + var sel = getBetween(this$1, ranges[i].from(), ranges[i].to()); + lines = lines ? lines.concat(sel) : sel; + } + if (lineSep === false) { return lines } + else { return lines.join(lineSep || this.lineSeparator()) } + }, + getSelections: function(lineSep) { + var this$1 = this; + + var parts = [], ranges = this.sel.ranges; + for (var i = 0; i < ranges.length; i++) { + var sel = getBetween(this$1, ranges[i].from(), ranges[i].to()); + if (lineSep !== false) { sel = sel.join(lineSep || this$1.lineSeparator()); } + parts[i] = sel; + } + return parts + }, + replaceSelection: function(code, collapse, origin) { + var dup = []; + for (var i = 0; i < this.sel.ranges.length; i++) + { dup[i] = code; } + this.replaceSelections(dup, collapse, origin || "+input"); + }, + replaceSelections: docMethodOp(function(code, collapse, origin) { + var this$1 = this; + + var changes = [], sel = this.sel; + for (var i = 0; i < sel.ranges.length; i++) { + var range$$1 = sel.ranges[i]; + changes[i] = {from: range$$1.from(), to: range$$1.to(), text: this$1.splitLines(code[i]), origin: origin}; + } + var newSel = collapse && collapse != "end" && computeReplacedSel(this, changes, collapse); + for (var i$1 = changes.length - 1; i$1 >= 0; i$1--) + { makeChange(this$1, changes[i$1]); } + if (newSel) { setSelectionReplaceHistory(this, newSel); } + else if (this.cm) { ensureCursorVisible(this.cm); } + }), + undo: docMethodOp(function() {makeChangeFromHistory(this, "undo");}), + redo: docMethodOp(function() {makeChangeFromHistory(this, "redo");}), + undoSelection: docMethodOp(function() {makeChangeFromHistory(this, "undo", true);}), + redoSelection: docMethodOp(function() {makeChangeFromHistory(this, "redo", true);}), + + setExtending: function(val) {this.extend = val;}, + getExtending: function() {return this.extend}, + + historySize: function() { + var hist = this.history, done = 0, undone = 0; + for (var i = 0; i < hist.done.length; i++) { if (!hist.done[i].ranges) { ++done; } } + for (var i$1 = 0; i$1 < hist.undone.length; i$1++) { if (!hist.undone[i$1].ranges) { ++undone; } } + return {undo: done, redo: undone} + }, + clearHistory: function() {this.history = new History(this.history.maxGeneration);}, + + markClean: function() { + this.cleanGeneration = this.changeGeneration(true); + }, + changeGeneration: function(forceSplit) { + if (forceSplit) + { this.history.lastOp = this.history.lastSelOp = this.history.lastOrigin = null; } + return this.history.generation + }, + isClean: function (gen) { + return this.history.generation == (gen || this.cleanGeneration) + }, + + getHistory: function() { + return {done: copyHistoryArray(this.history.done), + undone: copyHistoryArray(this.history.undone)} + }, + setHistory: function(histData) { + var hist = this.history = new History(this.history.maxGeneration); + hist.done = copyHistoryArray(histData.done.slice(0), null, true); + hist.undone = copyHistoryArray(histData.undone.slice(0), null, true); + }, + + setGutterMarker: docMethodOp(function(line, gutterID, value) { + return changeLine(this, line, "gutter", function (line) { + var markers = line.gutterMarkers || (line.gutterMarkers = {}); + markers[gutterID] = value; + if (!value && isEmpty(markers)) { line.gutterMarkers = null; } + return true + }) + }), + + clearGutter: docMethodOp(function(gutterID) { + var this$1 = this; + + this.iter(function (line) { + if (line.gutterMarkers && line.gutterMarkers[gutterID]) { + changeLine(this$1, line, "gutter", function () { + line.gutterMarkers[gutterID] = null; + if (isEmpty(line.gutterMarkers)) { line.gutterMarkers = null; } + return true + }); + } + }); + }), + + lineInfo: function(line) { + var n; + if (typeof line == "number") { + if (!isLine(this, line)) { return null } + n = line; + line = getLine(this, line); + if (!line) { return null } + } else { + n = lineNo(line); + if (n == null) { return null } + } + return {line: n, handle: line, text: line.text, gutterMarkers: line.gutterMarkers, + textClass: line.textClass, bgClass: line.bgClass, wrapClass: line.wrapClass, + widgets: line.widgets} + }, + + addLineClass: docMethodOp(function(handle, where, cls) { + return changeLine(this, handle, where == "gutter" ? "gutter" : "class", function (line) { + var prop = where == "text" ? "textClass" + : where == "background" ? "bgClass" + : where == "gutter" ? "gutterClass" : "wrapClass"; + if (!line[prop]) { line[prop] = cls; } + else if (classTest(cls).test(line[prop])) { return false } + else { line[prop] += " " + cls; } + return true + }) + }), + removeLineClass: docMethodOp(function(handle, where, cls) { + return changeLine(this, handle, where == "gutter" ? "gutter" : "class", function (line) { + var prop = where == "text" ? "textClass" + : where == "background" ? "bgClass" + : where == "gutter" ? "gutterClass" : "wrapClass"; + var cur = line[prop]; + if (!cur) { return false } + else if (cls == null) { line[prop] = null; } + else { + var found = cur.match(classTest(cls)); + if (!found) { return false } + var end = found.index + found[0].length; + line[prop] = cur.slice(0, found.index) + (!found.index || end == cur.length ? "" : " ") + cur.slice(end) || null; + } + return true + }) + }), + + addLineWidget: docMethodOp(function(handle, node, options) { + return addLineWidget(this, handle, node, options) + }), + removeLineWidget: function(widget) { widget.clear(); }, + + markText: function(from, to, options) { + return markText(this, clipPos(this, from), clipPos(this, to), options, options && options.type || "range") + }, + setBookmark: function(pos, options) { + var realOpts = {replacedWith: options && (options.nodeType == null ? options.widget : options), + insertLeft: options && options.insertLeft, + clearWhenEmpty: false, shared: options && options.shared, + handleMouseEvents: options && options.handleMouseEvents}; + pos = clipPos(this, pos); + return markText(this, pos, pos, realOpts, "bookmark") + }, + findMarksAt: function(pos) { + pos = clipPos(this, pos); + var markers = [], spans = getLine(this, pos.line).markedSpans; + if (spans) { for (var i = 0; i < spans.length; ++i) { + var span = spans[i]; + if ((span.from == null || span.from <= pos.ch) && + (span.to == null || span.to >= pos.ch)) + { markers.push(span.marker.parent || span.marker); } + } } + return markers + }, + findMarks: function(from, to, filter) { + from = clipPos(this, from); to = clipPos(this, to); + var found = [], lineNo$$1 = from.line; + this.iter(from.line, to.line + 1, function (line) { + var spans = line.markedSpans; + if (spans) { for (var i = 0; i < spans.length; i++) { + var span = spans[i]; + if (!(span.to != null && lineNo$$1 == from.line && from.ch >= span.to || + span.from == null && lineNo$$1 != from.line || + span.from != null && lineNo$$1 == to.line && span.from >= to.ch) && + (!filter || filter(span.marker))) + { found.push(span.marker.parent || span.marker); } + } } + ++lineNo$$1; + }); + return found + }, + getAllMarks: function() { + var markers = []; + this.iter(function (line) { + var sps = line.markedSpans; + if (sps) { for (var i = 0; i < sps.length; ++i) + { if (sps[i].from != null) { markers.push(sps[i].marker); } } } + }); + return markers + }, + + posFromIndex: function(off) { + var ch, lineNo$$1 = this.first, sepSize = this.lineSeparator().length; + this.iter(function (line) { + var sz = line.text.length + sepSize; + if (sz > off) { ch = off; return true } + off -= sz; + ++lineNo$$1; + }); + return clipPos(this, Pos(lineNo$$1, ch)) + }, + indexFromPos: function (coords) { + coords = clipPos(this, coords); + var index = coords.ch; + if (coords.line < this.first || coords.ch < 0) { return 0 } + var sepSize = this.lineSeparator().length; + this.iter(this.first, coords.line, function (line) { // iter aborts when callback returns a truthy value + index += line.text.length + sepSize; + }); + return index + }, + + copy: function(copyHistory) { + var doc = new Doc(getLines(this, this.first, this.first + this.size), + this.modeOption, this.first, this.lineSep, this.direction); + doc.scrollTop = this.scrollTop; doc.scrollLeft = this.scrollLeft; + doc.sel = this.sel; + doc.extend = false; + if (copyHistory) { + doc.history.undoDepth = this.history.undoDepth; + doc.setHistory(this.getHistory()); + } + return doc + }, + + linkedDoc: function(options) { + if (!options) { options = {}; } + var from = this.first, to = this.first + this.size; + if (options.from != null && options.from > from) { from = options.from; } + if (options.to != null && options.to < to) { to = options.to; } + var copy = new Doc(getLines(this, from, to), options.mode || this.modeOption, from, this.lineSep, this.direction); + if (options.sharedHist) { copy.history = this.history + ; }(this.linked || (this.linked = [])).push({doc: copy, sharedHist: options.sharedHist}); + copy.linked = [{doc: this, isParent: true, sharedHist: options.sharedHist}]; + copySharedMarkers(copy, findSharedMarkers(this)); + return copy + }, + unlinkDoc: function(other) { + var this$1 = this; + + if (other instanceof CodeMirror$1) { other = other.doc; } + if (this.linked) { for (var i = 0; i < this.linked.length; ++i) { + var link = this$1.linked[i]; + if (link.doc != other) { continue } + this$1.linked.splice(i, 1); + other.unlinkDoc(this$1); + detachSharedMarkers(findSharedMarkers(this$1)); + break + } } + // If the histories were shared, split them again + if (other.history == this.history) { + var splitIds = [other.id]; + linkedDocs(other, function (doc) { return splitIds.push(doc.id); }, true); + other.history = new History(null); + other.history.done = copyHistoryArray(this.history.done, splitIds); + other.history.undone = copyHistoryArray(this.history.undone, splitIds); + } + }, + iterLinkedDocs: function(f) {linkedDocs(this, f);}, + + getMode: function() {return this.mode}, + getEditor: function() {return this.cm}, + + splitLines: function(str) { + if (this.lineSep) { return str.split(this.lineSep) } + return splitLinesAuto(str) + }, + lineSeparator: function() { return this.lineSep || "\n" }, + + setDirection: docMethodOp(function (dir) { + if (dir != "rtl") { dir = "ltr"; } + if (dir == this.direction) { return } + this.direction = dir; + this.iter(function (line) { return line.order = null; }); + if (this.cm) { directionChanged(this.cm); } + }) +}); + +// Public alias. +Doc.prototype.eachLine = Doc.prototype.iter; + +// Kludge to work around strange IE behavior where it'll sometimes +// re-fire a series of drag-related events right after the drop (#1551) +var lastDrop = 0; + +function onDrop(e) { + var cm = this; + clearDragCursor(cm); + if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e)) + { return } + e_preventDefault(e); + if (ie) { lastDrop = +new Date; } + var pos = posFromMouse(cm, e, true), files = e.dataTransfer.files; + if (!pos || cm.isReadOnly()) { return } + // Might be a file drop, in which case we simply extract the text + // and insert it. + if (files && files.length && window.FileReader && window.File) { + var n = files.length, text = Array(n), read = 0; + var loadFile = function (file, i) { + if (cm.options.allowDropFileTypes && + indexOf(cm.options.allowDropFileTypes, file.type) == -1) + { return } + + var reader = new FileReader; + reader.onload = operation(cm, function () { + var content = reader.result; + if (/[\x00-\x08\x0e-\x1f]{2}/.test(content)) { content = ""; } + text[i] = content; + if (++read == n) { + pos = clipPos(cm.doc, pos); + var change = {from: pos, to: pos, + text: cm.doc.splitLines(text.join(cm.doc.lineSeparator())), + origin: "paste"}; + makeChange(cm.doc, change); + setSelectionReplaceHistory(cm.doc, simpleSelection(pos, changeEnd(change))); + } + }); + reader.readAsText(file); + }; + for (var i = 0; i < n; ++i) { loadFile(files[i], i); } + } else { // Normal drop + // Don't do a replace if the drop happened inside of the selected text. + if (cm.state.draggingText && cm.doc.sel.contains(pos) > -1) { + cm.state.draggingText(e); + // Ensure the editor is re-focused + setTimeout(function () { return cm.display.input.focus(); }, 20); + return + } + try { + var text$1 = e.dataTransfer.getData("Text"); + if (text$1) { + var selected; + if (cm.state.draggingText && !cm.state.draggingText.copy) + { selected = cm.listSelections(); } + setSelectionNoUndo(cm.doc, simpleSelection(pos, pos)); + if (selected) { for (var i$1 = 0; i$1 < selected.length; ++i$1) + { replaceRange(cm.doc, "", selected[i$1].anchor, selected[i$1].head, "drag"); } } + cm.replaceSelection(text$1, "around", "paste"); + cm.display.input.focus(); + } + } + catch(e){} + } +} + +function onDragStart(cm, e) { + if (ie && (!cm.state.draggingText || +new Date - lastDrop < 100)) { e_stop(e); return } + if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e)) { return } + + e.dataTransfer.setData("Text", cm.getSelection()); + e.dataTransfer.effectAllowed = "copyMove"; + + // Use dummy image instead of default browsers image. + // Recent Safari (~6.0.2) have a tendency to segfault when this happens, so we don't do it there. + if (e.dataTransfer.setDragImage && !safari) { + var img = elt("img", null, null, "position: fixed; left: 0; top: 0;"); + img.src = "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="; + if (presto) { + img.width = img.height = 1; + cm.display.wrapper.appendChild(img); + // Force a relayout, or Opera won't use our image for some obscure reason + img._top = img.offsetTop; + } + e.dataTransfer.setDragImage(img, 0, 0); + if (presto) { img.parentNode.removeChild(img); } + } +} + +function onDragOver(cm, e) { + var pos = posFromMouse(cm, e); + if (!pos) { return } + var frag = document.createDocumentFragment(); + drawSelectionCursor(cm, pos, frag); + if (!cm.display.dragCursor) { + cm.display.dragCursor = elt("div", null, "CodeMirror-cursors CodeMirror-dragcursors"); + cm.display.lineSpace.insertBefore(cm.display.dragCursor, cm.display.cursorDiv); + } + removeChildrenAndAdd(cm.display.dragCursor, frag); +} + +function clearDragCursor(cm) { + if (cm.display.dragCursor) { + cm.display.lineSpace.removeChild(cm.display.dragCursor); + cm.display.dragCursor = null; + } +} + +// These must be handled carefully, because naively registering a +// handler for each editor will cause the editors to never be +// garbage collected. + +function forEachCodeMirror(f) { + if (!document.getElementsByClassName) { return } + var byClass = document.getElementsByClassName("CodeMirror"); + for (var i = 0; i < byClass.length; i++) { + var cm = byClass[i].CodeMirror; + if (cm) { f(cm); } + } +} + +var globalsRegistered = false; +function ensureGlobalHandlers() { + if (globalsRegistered) { return } + registerGlobalHandlers(); + globalsRegistered = true; +} +function registerGlobalHandlers() { + // When the window resizes, we need to refresh active editors. + var resizeTimer; + on(window, "resize", function () { + if (resizeTimer == null) { resizeTimer = setTimeout(function () { + resizeTimer = null; + forEachCodeMirror(onResize); + }, 100); } + }); + // When the window loses focus, we want to show the editor as blurred + on(window, "blur", function () { return forEachCodeMirror(onBlur); }); +} +// Called when the window resizes +function onResize(cm) { + var d = cm.display; + if (d.lastWrapHeight == d.wrapper.clientHeight && d.lastWrapWidth == d.wrapper.clientWidth) + { return } + // Might be a text scaling operation, clear size caches. + d.cachedCharWidth = d.cachedTextHeight = d.cachedPaddingH = null; + d.scrollbarsClipped = false; + cm.setSize(); +} + +var keyNames = { + 3: "Enter", 8: "Backspace", 9: "Tab", 13: "Enter", 16: "Shift", 17: "Ctrl", 18: "Alt", + 19: "Pause", 20: "CapsLock", 27: "Esc", 32: "Space", 33: "PageUp", 34: "PageDown", 35: "End", + 36: "Home", 37: "Left", 38: "Up", 39: "Right", 40: "Down", 44: "PrintScrn", 45: "Insert", + 46: "Delete", 59: ";", 61: "=", 91: "Mod", 92: "Mod", 93: "Mod", + 106: "*", 107: "=", 109: "-", 110: ".", 111: "/", 127: "Delete", + 173: "-", 186: ";", 187: "=", 188: ",", 189: "-", 190: ".", 191: "/", 192: "`", 219: "[", 220: "\\", + 221: "]", 222: "'", 63232: "Up", 63233: "Down", 63234: "Left", 63235: "Right", 63272: "Delete", + 63273: "Home", 63275: "End", 63276: "PageUp", 63277: "PageDown", 63302: "Insert" +}; + +// Number keys +for (var i = 0; i < 10; i++) { keyNames[i + 48] = keyNames[i + 96] = String(i); } +// Alphabetic keys +for (var i$1 = 65; i$1 <= 90; i$1++) { keyNames[i$1] = String.fromCharCode(i$1); } +// Function keys +for (var i$2 = 1; i$2 <= 12; i$2++) { keyNames[i$2 + 111] = keyNames[i$2 + 63235] = "F" + i$2; } + +var keyMap = {}; + +keyMap.basic = { + "Left": "goCharLeft", "Right": "goCharRight", "Up": "goLineUp", "Down": "goLineDown", + "End": "goLineEnd", "Home": "goLineStartSmart", "PageUp": "goPageUp", "PageDown": "goPageDown", + "Delete": "delCharAfter", "Backspace": "delCharBefore", "Shift-Backspace": "delCharBefore", + "Tab": "defaultTab", "Shift-Tab": "indentAuto", + "Enter": "newlineAndIndent", "Insert": "toggleOverwrite", + "Esc": "singleSelection" +}; +// Note that the save and find-related commands aren't defined by +// default. User code or addons can define them. Unknown commands +// are simply ignored. +keyMap.pcDefault = { + "Ctrl-A": "selectAll", "Ctrl-D": "deleteLine", "Ctrl-Z": "undo", "Shift-Ctrl-Z": "redo", "Ctrl-Y": "redo", + "Ctrl-Home": "goDocStart", "Ctrl-End": "goDocEnd", "Ctrl-Up": "goLineUp", "Ctrl-Down": "goLineDown", + "Ctrl-Left": "goGroupLeft", "Ctrl-Right": "goGroupRight", "Alt-Left": "goLineStart", "Alt-Right": "goLineEnd", + "Ctrl-Backspace": "delGroupBefore", "Ctrl-Delete": "delGroupAfter", "Ctrl-S": "save", "Ctrl-F": "find", + "Ctrl-G": "findNext", "Shift-Ctrl-G": "findPrev", "Shift-Ctrl-F": "replace", "Shift-Ctrl-R": "replaceAll", + "Ctrl-[": "indentLess", "Ctrl-]": "indentMore", + "Ctrl-U": "undoSelection", "Shift-Ctrl-U": "redoSelection", "Alt-U": "redoSelection", + fallthrough: "basic" +}; +// Very basic readline/emacs-style bindings, which are standard on Mac. +keyMap.emacsy = { + "Ctrl-F": "goCharRight", "Ctrl-B": "goCharLeft", "Ctrl-P": "goLineUp", "Ctrl-N": "goLineDown", + "Alt-F": "goWordRight", "Alt-B": "goWordLeft", "Ctrl-A": "goLineStart", "Ctrl-E": "goLineEnd", + "Ctrl-V": "goPageDown", "Shift-Ctrl-V": "goPageUp", "Ctrl-D": "delCharAfter", "Ctrl-H": "delCharBefore", + "Alt-D": "delWordAfter", "Alt-Backspace": "delWordBefore", "Ctrl-K": "killLine", "Ctrl-T": "transposeChars", + "Ctrl-O": "openLine" +}; +keyMap.macDefault = { + "Cmd-A": "selectAll", "Cmd-D": "deleteLine", "Cmd-Z": "undo", "Shift-Cmd-Z": "redo", "Cmd-Y": "redo", + "Cmd-Home": "goDocStart", "Cmd-Up": "goDocStart", "Cmd-End": "goDocEnd", "Cmd-Down": "goDocEnd", "Alt-Left": "goGroupLeft", + "Alt-Right": "goGroupRight", "Cmd-Left": "goLineLeft", "Cmd-Right": "goLineRight", "Alt-Backspace": "delGroupBefore", + "Ctrl-Alt-Backspace": "delGroupAfter", "Alt-Delete": "delGroupAfter", "Cmd-S": "save", "Cmd-F": "find", + "Cmd-G": "findNext", "Shift-Cmd-G": "findPrev", "Cmd-Alt-F": "replace", "Shift-Cmd-Alt-F": "replaceAll", + "Cmd-[": "indentLess", "Cmd-]": "indentMore", "Cmd-Backspace": "delWrappedLineLeft", "Cmd-Delete": "delWrappedLineRight", + "Cmd-U": "undoSelection", "Shift-Cmd-U": "redoSelection", "Ctrl-Up": "goDocStart", "Ctrl-Down": "goDocEnd", + fallthrough: ["basic", "emacsy"] +}; +keyMap["default"] = mac ? keyMap.macDefault : keyMap.pcDefault; + +// KEYMAP DISPATCH + +function normalizeKeyName(name) { + var parts = name.split(/-(?!$)/); + name = parts[parts.length - 1]; + var alt, ctrl, shift, cmd; + for (var i = 0; i < parts.length - 1; i++) { + var mod = parts[i]; + if (/^(cmd|meta|m)$/i.test(mod)) { cmd = true; } + else if (/^a(lt)?$/i.test(mod)) { alt = true; } + else if (/^(c|ctrl|control)$/i.test(mod)) { ctrl = true; } + else if (/^s(hift)?$/i.test(mod)) { shift = true; } + else { throw new Error("Unrecognized modifier name: " + mod) } + } + if (alt) { name = "Alt-" + name; } + if (ctrl) { name = "Ctrl-" + name; } + if (cmd) { name = "Cmd-" + name; } + if (shift) { name = "Shift-" + name; } + return name +} + +// This is a kludge to keep keymaps mostly working as raw objects +// (backwards compatibility) while at the same time support features +// like normalization and multi-stroke key bindings. It compiles a +// new normalized keymap, and then updates the old object to reflect +// this. +function normalizeKeyMap(keymap) { + var copy = {}; + for (var keyname in keymap) { if (keymap.hasOwnProperty(keyname)) { + var value = keymap[keyname]; + if (/^(name|fallthrough|(de|at)tach)$/.test(keyname)) { continue } + if (value == "...") { delete keymap[keyname]; continue } + + var keys = map(keyname.split(" "), normalizeKeyName); + for (var i = 0; i < keys.length; i++) { + var val = (void 0), name = (void 0); + if (i == keys.length - 1) { + name = keys.join(" "); + val = value; + } else { + name = keys.slice(0, i + 1).join(" "); + val = "..."; + } + var prev = copy[name]; + if (!prev) { copy[name] = val; } + else if (prev != val) { throw new Error("Inconsistent bindings for " + name) } + } + delete keymap[keyname]; + } } + for (var prop in copy) { keymap[prop] = copy[prop]; } + return keymap +} + +function lookupKey(key, map$$1, handle, context) { + map$$1 = getKeyMap(map$$1); + var found = map$$1.call ? map$$1.call(key, context) : map$$1[key]; + if (found === false) { return "nothing" } + if (found === "...") { return "multi" } + if (found != null && handle(found)) { return "handled" } + + if (map$$1.fallthrough) { + if (Object.prototype.toString.call(map$$1.fallthrough) != "[object Array]") + { return lookupKey(key, map$$1.fallthrough, handle, context) } + for (var i = 0; i < map$$1.fallthrough.length; i++) { + var result = lookupKey(key, map$$1.fallthrough[i], handle, context); + if (result) { return result } + } + } +} + +// Modifier key presses don't count as 'real' key presses for the +// purpose of keymap fallthrough. +function isModifierKey(value) { + var name = typeof value == "string" ? value : keyNames[value.keyCode]; + return name == "Ctrl" || name == "Alt" || name == "Shift" || name == "Mod" +} + +function addModifierNames(name, event, noShift) { + var base = name; + if (event.altKey && base != "Alt") { name = "Alt-" + name; } + if ((flipCtrlCmd ? event.metaKey : event.ctrlKey) && base != "Ctrl") { name = "Ctrl-" + name; } + if ((flipCtrlCmd ? event.ctrlKey : event.metaKey) && base != "Cmd") { name = "Cmd-" + name; } + if (!noShift && event.shiftKey && base != "Shift") { name = "Shift-" + name; } + return name +} + +// Look up the name of a key as indicated by an event object. +function keyName(event, noShift) { + if (presto && event.keyCode == 34 && event["char"]) { return false } + var name = keyNames[event.keyCode]; + if (name == null || event.altGraphKey) { return false } + return addModifierNames(name, event, noShift) +} + +function getKeyMap(val) { + return typeof val == "string" ? keyMap[val] : val +} + +// Helper for deleting text near the selection(s), used to implement +// backspace, delete, and similar functionality. +function deleteNearSelection(cm, compute) { + var ranges = cm.doc.sel.ranges, kill = []; + // Build up a set of ranges to kill first, merging overlapping + // ranges. + for (var i = 0; i < ranges.length; i++) { + var toKill = compute(ranges[i]); + while (kill.length && cmp(toKill.from, lst(kill).to) <= 0) { + var replaced = kill.pop(); + if (cmp(replaced.from, toKill.from) < 0) { + toKill.from = replaced.from; + break + } + } + kill.push(toKill); + } + // Next, remove those actual ranges. + runInOp(cm, function () { + for (var i = kill.length - 1; i >= 0; i--) + { replaceRange(cm.doc, "", kill[i].from, kill[i].to, "+delete"); } + ensureCursorVisible(cm); + }); +} + +// Commands are parameter-less actions that can be performed on an +// editor, mostly used for keybindings. +var commands = { + selectAll: selectAll, + singleSelection: function (cm) { return cm.setSelection(cm.getCursor("anchor"), cm.getCursor("head"), sel_dontScroll); }, + killLine: function (cm) { return deleteNearSelection(cm, function (range) { + if (range.empty()) { + var len = getLine(cm.doc, range.head.line).text.length; + if (range.head.ch == len && range.head.line < cm.lastLine()) + { return {from: range.head, to: Pos(range.head.line + 1, 0)} } + else + { return {from: range.head, to: Pos(range.head.line, len)} } + } else { + return {from: range.from(), to: range.to()} + } + }); }, + deleteLine: function (cm) { return deleteNearSelection(cm, function (range) { return ({ + from: Pos(range.from().line, 0), + to: clipPos(cm.doc, Pos(range.to().line + 1, 0)) + }); }); }, + delLineLeft: function (cm) { return deleteNearSelection(cm, function (range) { return ({ + from: Pos(range.from().line, 0), to: range.from() + }); }); }, + delWrappedLineLeft: function (cm) { return deleteNearSelection(cm, function (range) { + var top = cm.charCoords(range.head, "div").top + 5; + var leftPos = cm.coordsChar({left: 0, top: top}, "div"); + return {from: leftPos, to: range.from()} + }); }, + delWrappedLineRight: function (cm) { return deleteNearSelection(cm, function (range) { + var top = cm.charCoords(range.head, "div").top + 5; + var rightPos = cm.coordsChar({left: cm.display.lineDiv.offsetWidth + 100, top: top}, "div"); + return {from: range.from(), to: rightPos } + }); }, + undo: function (cm) { return cm.undo(); }, + redo: function (cm) { return cm.redo(); }, + undoSelection: function (cm) { return cm.undoSelection(); }, + redoSelection: function (cm) { return cm.redoSelection(); }, + goDocStart: function (cm) { return cm.extendSelection(Pos(cm.firstLine(), 0)); }, + goDocEnd: function (cm) { return cm.extendSelection(Pos(cm.lastLine())); }, + goLineStart: function (cm) { return cm.extendSelectionsBy(function (range) { return lineStart(cm, range.head.line); }, + {origin: "+move", bias: 1} + ); }, + goLineStartSmart: function (cm) { return cm.extendSelectionsBy(function (range) { return lineStartSmart(cm, range.head); }, + {origin: "+move", bias: 1} + ); }, + goLineEnd: function (cm) { return cm.extendSelectionsBy(function (range) { return lineEnd(cm, range.head.line); }, + {origin: "+move", bias: -1} + ); }, + goLineRight: function (cm) { return cm.extendSelectionsBy(function (range) { + var top = cm.charCoords(range.head, "div").top + 5; + return cm.coordsChar({left: cm.display.lineDiv.offsetWidth + 100, top: top}, "div") + }, sel_move); }, + goLineLeft: function (cm) { return cm.extendSelectionsBy(function (range) { + var top = cm.charCoords(range.head, "div").top + 5; + return cm.coordsChar({left: 0, top: top}, "div") + }, sel_move); }, + goLineLeftSmart: function (cm) { return cm.extendSelectionsBy(function (range) { + var top = cm.charCoords(range.head, "div").top + 5; + var pos = cm.coordsChar({left: 0, top: top}, "div"); + if (pos.ch < cm.getLine(pos.line).search(/\S/)) { return lineStartSmart(cm, range.head) } + return pos + }, sel_move); }, + goLineUp: function (cm) { return cm.moveV(-1, "line"); }, + goLineDown: function (cm) { return cm.moveV(1, "line"); }, + goPageUp: function (cm) { return cm.moveV(-1, "page"); }, + goPageDown: function (cm) { return cm.moveV(1, "page"); }, + goCharLeft: function (cm) { return cm.moveH(-1, "char"); }, + goCharRight: function (cm) { return cm.moveH(1, "char"); }, + goColumnLeft: function (cm) { return cm.moveH(-1, "column"); }, + goColumnRight: function (cm) { return cm.moveH(1, "column"); }, + goWordLeft: function (cm) { return cm.moveH(-1, "word"); }, + goGroupRight: function (cm) { return cm.moveH(1, "group"); }, + goGroupLeft: function (cm) { return cm.moveH(-1, "group"); }, + goWordRight: function (cm) { return cm.moveH(1, "word"); }, + delCharBefore: function (cm) { return cm.deleteH(-1, "char"); }, + delCharAfter: function (cm) { return cm.deleteH(1, "char"); }, + delWordBefore: function (cm) { return cm.deleteH(-1, "word"); }, + delWordAfter: function (cm) { return cm.deleteH(1, "word"); }, + delGroupBefore: function (cm) { return cm.deleteH(-1, "group"); }, + delGroupAfter: function (cm) { return cm.deleteH(1, "group"); }, + indentAuto: function (cm) { return cm.indentSelection("smart"); }, + indentMore: function (cm) { return cm.indentSelection("add"); }, + indentLess: function (cm) { return cm.indentSelection("subtract"); }, + insertTab: function (cm) { return cm.replaceSelection("\t"); }, + insertSoftTab: function (cm) { + var spaces = [], ranges = cm.listSelections(), tabSize = cm.options.tabSize; + for (var i = 0; i < ranges.length; i++) { + var pos = ranges[i].from(); + var col = countColumn(cm.getLine(pos.line), pos.ch, tabSize); + spaces.push(spaceStr(tabSize - col % tabSize)); + } + cm.replaceSelections(spaces); + }, + defaultTab: function (cm) { + if (cm.somethingSelected()) { cm.indentSelection("add"); } + else { cm.execCommand("insertTab"); } + }, + // Swap the two chars left and right of each selection's head. + // Move cursor behind the two swapped characters afterwards. + // + // Doesn't consider line feeds a character. + // Doesn't scan more than one line above to find a character. + // Doesn't do anything on an empty line. + // Doesn't do anything with non-empty selections. + transposeChars: function (cm) { return runInOp(cm, function () { + var ranges = cm.listSelections(), newSel = []; + for (var i = 0; i < ranges.length; i++) { + if (!ranges[i].empty()) { continue } + var cur = ranges[i].head, line = getLine(cm.doc, cur.line).text; + if (line) { + if (cur.ch == line.length) { cur = new Pos(cur.line, cur.ch - 1); } + if (cur.ch > 0) { + cur = new Pos(cur.line, cur.ch + 1); + cm.replaceRange(line.charAt(cur.ch - 1) + line.charAt(cur.ch - 2), + Pos(cur.line, cur.ch - 2), cur, "+transpose"); + } else if (cur.line > cm.doc.first) { + var prev = getLine(cm.doc, cur.line - 1).text; + if (prev) { + cur = new Pos(cur.line, 1); + cm.replaceRange(line.charAt(0) + cm.doc.lineSeparator() + + prev.charAt(prev.length - 1), + Pos(cur.line - 1, prev.length - 1), cur, "+transpose"); + } + } + } + newSel.push(new Range(cur, cur)); + } + cm.setSelections(newSel); + }); }, + newlineAndIndent: function (cm) { return runInOp(cm, function () { + var sels = cm.listSelections(); + for (var i = sels.length - 1; i >= 0; i--) + { cm.replaceRange(cm.doc.lineSeparator(), sels[i].anchor, sels[i].head, "+input"); } + sels = cm.listSelections(); + for (var i$1 = 0; i$1 < sels.length; i$1++) + { cm.indentLine(sels[i$1].from().line, null, true); } + ensureCursorVisible(cm); + }); }, + openLine: function (cm) { return cm.replaceSelection("\n", "start"); }, + toggleOverwrite: function (cm) { return cm.toggleOverwrite(); } +}; + + +function lineStart(cm, lineN) { + var line = getLine(cm.doc, lineN); + var visual = visualLine(line); + if (visual != line) { lineN = lineNo(visual); } + return endOfLine(true, cm, visual, lineN, 1) +} +function lineEnd(cm, lineN) { + var line = getLine(cm.doc, lineN); + var visual = visualLineEnd(line); + if (visual != line) { lineN = lineNo(visual); } + return endOfLine(true, cm, line, lineN, -1) +} +function lineStartSmart(cm, pos) { + var start = lineStart(cm, pos.line); + var line = getLine(cm.doc, start.line); + var order = getOrder(line, cm.doc.direction); + if (!order || order[0].level == 0) { + var firstNonWS = Math.max(0, line.text.search(/\S/)); + var inWS = pos.line == start.line && pos.ch <= firstNonWS && pos.ch; + return Pos(start.line, inWS ? 0 : firstNonWS, start.sticky) + } + return start +} + +// Run a handler that was bound to a key. +function doHandleBinding(cm, bound, dropShift) { + if (typeof bound == "string") { + bound = commands[bound]; + if (!bound) { return false } + } + // Ensure previous input has been read, so that the handler sees a + // consistent view of the document + cm.display.input.ensurePolled(); + var prevShift = cm.display.shift, done = false; + try { + if (cm.isReadOnly()) { cm.state.suppressEdits = true; } + if (dropShift) { cm.display.shift = false; } + done = bound(cm) != Pass; + } finally { + cm.display.shift = prevShift; + cm.state.suppressEdits = false; + } + return done +} + +function lookupKeyForEditor(cm, name, handle) { + for (var i = 0; i < cm.state.keyMaps.length; i++) { + var result = lookupKey(name, cm.state.keyMaps[i], handle, cm); + if (result) { return result } + } + return (cm.options.extraKeys && lookupKey(name, cm.options.extraKeys, handle, cm)) + || lookupKey(name, cm.options.keyMap, handle, cm) +} + +// Note that, despite the name, this function is also used to check +// for bound mouse clicks. + +var stopSeq = new Delayed; +function dispatchKey(cm, name, e, handle) { + var seq = cm.state.keySeq; + if (seq) { + if (isModifierKey(name)) { return "handled" } + stopSeq.set(50, function () { + if (cm.state.keySeq == seq) { + cm.state.keySeq = null; + cm.display.input.reset(); + } + }); + name = seq + " " + name; + } + var result = lookupKeyForEditor(cm, name, handle); + + if (result == "multi") + { cm.state.keySeq = name; } + if (result == "handled") + { signalLater(cm, "keyHandled", cm, name, e); } + + if (result == "handled" || result == "multi") { + e_preventDefault(e); + restartBlink(cm); + } + + if (seq && !result && /\'$/.test(name)) { + e_preventDefault(e); + return true + } + return !!result +} + +// Handle a key from the keydown event. +function handleKeyBinding(cm, e) { + var name = keyName(e, true); + if (!name) { return false } + + if (e.shiftKey && !cm.state.keySeq) { + // First try to resolve full name (including 'Shift-'). Failing + // that, see if there is a cursor-motion command (starting with + // 'go') bound to the keyname without 'Shift-'. + return dispatchKey(cm, "Shift-" + name, e, function (b) { return doHandleBinding(cm, b, true); }) + || dispatchKey(cm, name, e, function (b) { + if (typeof b == "string" ? /^go[A-Z]/.test(b) : b.motion) + { return doHandleBinding(cm, b) } + }) + } else { + return dispatchKey(cm, name, e, function (b) { return doHandleBinding(cm, b); }) + } +} + +// Handle a key from the keypress event +function handleCharBinding(cm, e, ch) { + return dispatchKey(cm, "'" + ch + "'", e, function (b) { return doHandleBinding(cm, b, true); }) +} + +var lastStoppedKey = null; +function onKeyDown(e) { + var cm = this; + cm.curOp.focus = activeElt(); + if (signalDOMEvent(cm, e)) { return } + // IE does strange things with escape. + if (ie && ie_version < 11 && e.keyCode == 27) { e.returnValue = false; } + var code = e.keyCode; + cm.display.shift = code == 16 || e.shiftKey; + var handled = handleKeyBinding(cm, e); + if (presto) { + lastStoppedKey = handled ? code : null; + // Opera has no cut event... we try to at least catch the key combo + if (!handled && code == 88 && !hasCopyEvent && (mac ? e.metaKey : e.ctrlKey)) + { cm.replaceSelection("", null, "cut"); } + } + + // Turn mouse into crosshair when Alt is held on Mac. + if (code == 18 && !/\bCodeMirror-crosshair\b/.test(cm.display.lineDiv.className)) + { showCrossHair(cm); } +} + +function showCrossHair(cm) { + var lineDiv = cm.display.lineDiv; + addClass(lineDiv, "CodeMirror-crosshair"); + + function up(e) { + if (e.keyCode == 18 || !e.altKey) { + rmClass(lineDiv, "CodeMirror-crosshair"); + off(document, "keyup", up); + off(document, "mouseover", up); + } + } + on(document, "keyup", up); + on(document, "mouseover", up); +} + +function onKeyUp(e) { + if (e.keyCode == 16) { this.doc.sel.shift = false; } + signalDOMEvent(this, e); +} + +function onKeyPress(e) { + var cm = this; + if (eventInWidget(cm.display, e) || signalDOMEvent(cm, e) || e.ctrlKey && !e.altKey || mac && e.metaKey) { return } + var keyCode = e.keyCode, charCode = e.charCode; + if (presto && keyCode == lastStoppedKey) {lastStoppedKey = null; e_preventDefault(e); return} + if ((presto && (!e.which || e.which < 10)) && handleKeyBinding(cm, e)) { return } + var ch = String.fromCharCode(charCode == null ? keyCode : charCode); + // Some browsers fire keypress events for backspace + if (ch == "\x08") { return } + if (handleCharBinding(cm, e, ch)) { return } + cm.display.input.onKeyPress(e); +} + +var DOUBLECLICK_DELAY = 400; + +var PastClick = function(time, pos, button) { + this.time = time; + this.pos = pos; + this.button = button; +}; + +PastClick.prototype.compare = function (time, pos, button) { + return this.time + DOUBLECLICK_DELAY > time && + cmp(pos, this.pos) == 0 && button == this.button +}; + +var lastClick; +var lastDoubleClick; +function clickRepeat(pos, button) { + var now = +new Date; + if (lastDoubleClick && lastDoubleClick.compare(now, pos, button)) { + lastClick = lastDoubleClick = null; + return "triple" + } else if (lastClick && lastClick.compare(now, pos, button)) { + lastDoubleClick = new PastClick(now, pos, button); + lastClick = null; + return "double" + } else { + lastClick = new PastClick(now, pos, button); + lastDoubleClick = null; + return "single" + } +} + +// A mouse down can be a single click, double click, triple click, +// start of selection drag, start of text drag, new cursor +// (ctrl-click), rectangle drag (alt-drag), or xwin +// middle-click-paste. Or it might be a click on something we should +// not interfere with, such as a scrollbar or widget. +function onMouseDown(e) { + var cm = this, display = cm.display; + if (signalDOMEvent(cm, e) || display.activeTouch && display.input.supportsTouch()) { return } + display.input.ensurePolled(); + display.shift = e.shiftKey; + + if (eventInWidget(display, e)) { + if (!webkit) { + // Briefly turn off draggability, to allow widgets to do + // normal dragging things. + display.scroller.draggable = false; + setTimeout(function () { return display.scroller.draggable = true; }, 100); + } + return + } + if (clickInGutter(cm, e)) { return } + var pos = posFromMouse(cm, e), button = e_button(e), repeat = pos ? clickRepeat(pos, button) : "single"; + window.focus(); + + // #3261: make sure, that we're not starting a second selection + if (button == 1 && cm.state.selectingText) + { cm.state.selectingText(e); } + + if (pos && handleMappedButton(cm, button, pos, repeat, e)) { return } + + if (button == 1) { + if (pos) { leftButtonDown(cm, pos, repeat, e); } + else if (e_target(e) == display.scroller) { e_preventDefault(e); } + } else if (button == 2) { + if (pos) { extendSelection(cm.doc, pos); } + setTimeout(function () { return display.input.focus(); }, 20); + } else if (button == 3) { + if (captureRightClick) { onContextMenu(cm, e); } + else { delayBlurEvent(cm); } + } +} + +function handleMappedButton(cm, button, pos, repeat, event) { + var name = "Click"; + if (repeat == "double") { name = "Double" + name; } + else if (repeat == "triple") { name = "Triple" + name; } + name = (button == 1 ? "Left" : button == 2 ? "Middle" : "Right") + name; + + return dispatchKey(cm, addModifierNames(name, event), event, function (bound) { + if (typeof bound == "string") { bound = commands[bound]; } + if (!bound) { return false } + var done = false; + try { + if (cm.isReadOnly()) { cm.state.suppressEdits = true; } + done = bound(cm, pos) != Pass; + } finally { + cm.state.suppressEdits = false; + } + return done + }) +} + +function configureMouse(cm, repeat, event) { + var option = cm.getOption("configureMouse"); + var value = option ? option(cm, repeat, event) : {}; + if (value.unit == null) { + var rect = chromeOS ? event.shiftKey && event.metaKey : event.altKey; + value.unit = rect ? "rectangle" : repeat == "single" ? "char" : repeat == "double" ? "word" : "line"; + } + if (value.extend == null || cm.doc.extend) { value.extend = cm.doc.extend || event.shiftKey; } + if (value.addNew == null) { value.addNew = mac ? event.metaKey : event.ctrlKey; } + if (value.moveOnDrag == null) { value.moveOnDrag = !(mac ? event.altKey : event.ctrlKey); } + return value +} + +function leftButtonDown(cm, pos, repeat, event) { + if (ie) { setTimeout(bind(ensureFocus, cm), 0); } + else { cm.curOp.focus = activeElt(); } + + var behavior = configureMouse(cm, repeat, event); + + var sel = cm.doc.sel, contained; + if (cm.options.dragDrop && dragAndDrop && !cm.isReadOnly() && + repeat == "single" && (contained = sel.contains(pos)) > -1 && + (cmp((contained = sel.ranges[contained]).from(), pos) < 0 || pos.xRel > 0) && + (cmp(contained.to(), pos) > 0 || pos.xRel < 0)) + { leftButtonStartDrag(cm, event, pos, behavior); } + else + { leftButtonSelect(cm, event, pos, behavior); } +} + +// Start a text drag. When it ends, see if any dragging actually +// happen, and treat as a click if it didn't. +function leftButtonStartDrag(cm, event, pos, behavior) { + var display = cm.display, moved = false; + var dragEnd = operation(cm, function (e) { + if (webkit) { display.scroller.draggable = false; } + cm.state.draggingText = false; + off(document, "mouseup", dragEnd); + off(document, "mousemove", mouseMove); + off(display.scroller, "dragstart", dragStart); + off(display.scroller, "drop", dragEnd); + if (!moved) { + e_preventDefault(e); + if (!behavior.addNew) + { extendSelection(cm.doc, pos, null, null, behavior.extend); } + // Work around unexplainable focus problem in IE9 (#2127) and Chrome (#3081) + if (webkit || ie && ie_version == 9) + { setTimeout(function () {document.body.focus(); display.input.focus();}, 20); } + else + { display.input.focus(); } + } + }); + var mouseMove = function(e2) { + moved = moved || Math.abs(event.clientX - e2.clientX) + Math.abs(event.clientY - e2.clientY) >= 10; + }; + var dragStart = function () { return moved = true; }; + // Let the drag handler handle this. + if (webkit) { display.scroller.draggable = true; } + cm.state.draggingText = dragEnd; + dragEnd.copy = !behavior.moveOnDrag; + // IE's approach to draggable + if (display.scroller.dragDrop) { display.scroller.dragDrop(); } + on(document, "mouseup", dragEnd); + on(document, "mousemove", mouseMove); + on(display.scroller, "dragstart", dragStart); + on(display.scroller, "drop", dragEnd); + + delayBlurEvent(cm); + setTimeout(function () { return display.input.focus(); }, 20); +} + +function rangeForUnit(cm, pos, unit) { + if (unit == "char") { return new Range(pos, pos) } + if (unit == "word") { return cm.findWordAt(pos) } + if (unit == "line") { return new Range(Pos(pos.line, 0), clipPos(cm.doc, Pos(pos.line + 1, 0))) } + var result = unit(cm, pos); + return new Range(result.from, result.to) +} + +// Normal selection, as opposed to text dragging. +function leftButtonSelect(cm, event, start, behavior) { + var display = cm.display, doc = cm.doc; + e_preventDefault(event); + + var ourRange, ourIndex, startSel = doc.sel, ranges = startSel.ranges; + if (behavior.addNew && !behavior.extend) { + ourIndex = doc.sel.contains(start); + if (ourIndex > -1) + { ourRange = ranges[ourIndex]; } + else + { ourRange = new Range(start, start); } + } else { + ourRange = doc.sel.primary(); + ourIndex = doc.sel.primIndex; + } + + if (behavior.unit == "rectangle") { + if (!behavior.addNew) { ourRange = new Range(start, start); } + start = posFromMouse(cm, event, true, true); + ourIndex = -1; + } else { + var range$$1 = rangeForUnit(cm, start, behavior.unit); + if (behavior.extend) + { ourRange = extendRange(ourRange, range$$1.anchor, range$$1.head, behavior.extend); } + else + { ourRange = range$$1; } + } + + if (!behavior.addNew) { + ourIndex = 0; + setSelection(doc, new Selection([ourRange], 0), sel_mouse); + startSel = doc.sel; + } else if (ourIndex == -1) { + ourIndex = ranges.length; + setSelection(doc, normalizeSelection(ranges.concat([ourRange]), ourIndex), + {scroll: false, origin: "*mouse"}); + } else if (ranges.length > 1 && ranges[ourIndex].empty() && behavior.unit == "char" && !behavior.extend) { + setSelection(doc, normalizeSelection(ranges.slice(0, ourIndex).concat(ranges.slice(ourIndex + 1)), 0), + {scroll: false, origin: "*mouse"}); + startSel = doc.sel; + } else { + replaceOneSelection(doc, ourIndex, ourRange, sel_mouse); + } + + var lastPos = start; + function extendTo(pos) { + if (cmp(lastPos, pos) == 0) { return } + lastPos = pos; + + if (behavior.unit == "rectangle") { + var ranges = [], tabSize = cm.options.tabSize; + var startCol = countColumn(getLine(doc, start.line).text, start.ch, tabSize); + var posCol = countColumn(getLine(doc, pos.line).text, pos.ch, tabSize); + var left = Math.min(startCol, posCol), right = Math.max(startCol, posCol); + for (var line = Math.min(start.line, pos.line), end = Math.min(cm.lastLine(), Math.max(start.line, pos.line)); + line <= end; line++) { + var text = getLine(doc, line).text, leftPos = findColumn(text, left, tabSize); + if (left == right) + { ranges.push(new Range(Pos(line, leftPos), Pos(line, leftPos))); } + else if (text.length > leftPos) + { ranges.push(new Range(Pos(line, leftPos), Pos(line, findColumn(text, right, tabSize)))); } + } + if (!ranges.length) { ranges.push(new Range(start, start)); } + setSelection(doc, normalizeSelection(startSel.ranges.slice(0, ourIndex).concat(ranges), ourIndex), + {origin: "*mouse", scroll: false}); + cm.scrollIntoView(pos); + } else { + var oldRange = ourRange; + var range$$1 = rangeForUnit(cm, pos, behavior.unit); + var anchor = oldRange.anchor, head; + if (cmp(range$$1.anchor, anchor) > 0) { + head = range$$1.head; + anchor = minPos(oldRange.from(), range$$1.anchor); + } else { + head = range$$1.anchor; + anchor = maxPos(oldRange.to(), range$$1.head); + } + var ranges$1 = startSel.ranges.slice(0); + ranges$1[ourIndex] = new Range(clipPos(doc, anchor), head); + setSelection(doc, normalizeSelection(ranges$1, ourIndex), sel_mouse); + } + } + + var editorSize = display.wrapper.getBoundingClientRect(); + // Used to ensure timeout re-tries don't fire when another extend + // happened in the meantime (clearTimeout isn't reliable -- at + // least on Chrome, the timeouts still happen even when cleared, + // if the clear happens after their scheduled firing time). + var counter = 0; + + function extend(e) { + var curCount = ++counter; + var cur = posFromMouse(cm, e, true, behavior.unit == "rectangle"); + if (!cur) { return } + if (cmp(cur, lastPos) != 0) { + cm.curOp.focus = activeElt(); + extendTo(cur); + var visible = visibleLines(display, doc); + if (cur.line >= visible.to || cur.line < visible.from) + { setTimeout(operation(cm, function () {if (counter == curCount) { extend(e); }}), 150); } + } else { + var outside = e.clientY < editorSize.top ? -20 : e.clientY > editorSize.bottom ? 20 : 0; + if (outside) { setTimeout(operation(cm, function () { + if (counter != curCount) { return } + display.scroller.scrollTop += outside; + extend(e); + }), 50); } + } + } + + function done(e) { + cm.state.selectingText = false; + counter = Infinity; + e_preventDefault(e); + display.input.focus(); + off(document, "mousemove", move); + off(document, "mouseup", up); + doc.history.lastSelOrigin = null; + } + + var move = operation(cm, function (e) { + if (!e_button(e)) { done(e); } + else { extend(e); } + }); + var up = operation(cm, done); + cm.state.selectingText = up; + on(document, "mousemove", move); + on(document, "mouseup", up); +} + + +// Determines whether an event happened in the gutter, and fires the +// handlers for the corresponding event. +function gutterEvent(cm, e, type, prevent) { + var mX, mY; + try { mX = e.clientX; mY = e.clientY; } + catch(e) { return false } + if (mX >= Math.floor(cm.display.gutters.getBoundingClientRect().right)) { return false } + if (prevent) { e_preventDefault(e); } + + var display = cm.display; + var lineBox = display.lineDiv.getBoundingClientRect(); + + if (mY > lineBox.bottom || !hasHandler(cm, type)) { return e_defaultPrevented(e) } + mY -= lineBox.top - display.viewOffset; + + for (var i = 0; i < cm.options.gutters.length; ++i) { + var g = display.gutters.childNodes[i]; + if (g && g.getBoundingClientRect().right >= mX) { + var line = lineAtHeight(cm.doc, mY); + var gutter = cm.options.gutters[i]; + signal(cm, type, cm, line, gutter, e); + return e_defaultPrevented(e) + } + } +} + +function clickInGutter(cm, e) { + return gutterEvent(cm, e, "gutterClick", true) +} + +// CONTEXT MENU HANDLING + +// To make the context menu work, we need to briefly unhide the +// textarea (making it as unobtrusive as possible) to let the +// right-click take effect on it. +function onContextMenu(cm, e) { + if (eventInWidget(cm.display, e) || contextMenuInGutter(cm, e)) { return } + if (signalDOMEvent(cm, e, "contextmenu")) { return } + cm.display.input.onContextMenu(e); +} + +function contextMenuInGutter(cm, e) { + if (!hasHandler(cm, "gutterContextMenu")) { return false } + return gutterEvent(cm, e, "gutterContextMenu", false) +} + +function themeChanged(cm) { + cm.display.wrapper.className = cm.display.wrapper.className.replace(/\s*cm-s-\S+/g, "") + + cm.options.theme.replace(/(^|\s)\s*/g, " cm-s-"); + clearCaches(cm); +} + +var Init = {toString: function(){return "CodeMirror.Init"}}; + +var defaults = {}; +var optionHandlers = {}; + +function defineOptions(CodeMirror) { + var optionHandlers = CodeMirror.optionHandlers; + + function option(name, deflt, handle, notOnInit) { + CodeMirror.defaults[name] = deflt; + if (handle) { optionHandlers[name] = + notOnInit ? function (cm, val, old) {if (old != Init) { handle(cm, val, old); }} : handle; } + } + + CodeMirror.defineOption = option; + + // Passed to option handlers when there is no old value. + CodeMirror.Init = Init; + + // These two are, on init, called from the constructor because they + // have to be initialized before the editor can start at all. + option("value", "", function (cm, val) { return cm.setValue(val); }, true); + option("mode", null, function (cm, val) { + cm.doc.modeOption = val; + loadMode(cm); + }, true); + + option("indentUnit", 2, loadMode, true); + option("indentWithTabs", false); + option("smartIndent", true); + option("tabSize", 4, function (cm) { + resetModeState(cm); + clearCaches(cm); + regChange(cm); + }, true); + option("lineSeparator", null, function (cm, val) { + cm.doc.lineSep = val; + if (!val) { return } + var newBreaks = [], lineNo = cm.doc.first; + cm.doc.iter(function (line) { + for (var pos = 0;;) { + var found = line.text.indexOf(val, pos); + if (found == -1) { break } + pos = found + val.length; + newBreaks.push(Pos(lineNo, found)); + } + lineNo++; + }); + for (var i = newBreaks.length - 1; i >= 0; i--) + { replaceRange(cm.doc, val, newBreaks[i], Pos(newBreaks[i].line, newBreaks[i].ch + val.length)); } + }); + option("specialChars", /[\u0000-\u001f\u007f-\u009f\u00ad\u061c\u200b-\u200f\u2028\u2029\ufeff]/g, function (cm, val, old) { + cm.state.specialChars = new RegExp(val.source + (val.test("\t") ? "" : "|\t"), "g"); + if (old != Init) { cm.refresh(); } + }); + option("specialCharPlaceholder", defaultSpecialCharPlaceholder, function (cm) { return cm.refresh(); }, true); + option("electricChars", true); + option("inputStyle", mobile ? "contenteditable" : "textarea", function () { + throw new Error("inputStyle can not (yet) be changed in a running editor") // FIXME + }, true); + option("spellcheck", false, function (cm, val) { return cm.getInputField().spellcheck = val; }, true); + option("rtlMoveVisually", !windows); + option("wholeLineUpdateBefore", true); + + option("theme", "default", function (cm) { + themeChanged(cm); + guttersChanged(cm); + }, true); + option("keyMap", "default", function (cm, val, old) { + var next = getKeyMap(val); + var prev = old != Init && getKeyMap(old); + if (prev && prev.detach) { prev.detach(cm, next); } + if (next.attach) { next.attach(cm, prev || null); } + }); + option("extraKeys", null); + option("configureMouse", null); + + option("lineWrapping", false, wrappingChanged, true); + option("gutters", [], function (cm) { + setGuttersForLineNumbers(cm.options); + guttersChanged(cm); + }, true); + option("fixedGutter", true, function (cm, val) { + cm.display.gutters.style.left = val ? compensateForHScroll(cm.display) + "px" : "0"; + cm.refresh(); + }, true); + option("coverGutterNextToScrollbar", false, function (cm) { return updateScrollbars(cm); }, true); + option("scrollbarStyle", "native", function (cm) { + initScrollbars(cm); + updateScrollbars(cm); + cm.display.scrollbars.setScrollTop(cm.doc.scrollTop); + cm.display.scrollbars.setScrollLeft(cm.doc.scrollLeft); + }, true); + option("lineNumbers", false, function (cm) { + setGuttersForLineNumbers(cm.options); + guttersChanged(cm); + }, true); + option("firstLineNumber", 1, guttersChanged, true); + option("lineNumberFormatter", function (integer) { return integer; }, guttersChanged, true); + option("showCursorWhenSelecting", false, updateSelection, true); + + option("resetSelectionOnContextMenu", true); + option("lineWiseCopyCut", true); + option("pasteLinesPerSelection", true); + + option("readOnly", false, function (cm, val) { + if (val == "nocursor") { + onBlur(cm); + cm.display.input.blur(); + } + cm.display.input.readOnlyChanged(val); + }); + option("disableInput", false, function (cm, val) {if (!val) { cm.display.input.reset(); }}, true); + option("dragDrop", true, dragDropChanged); + option("allowDropFileTypes", null); + + option("cursorBlinkRate", 530); + option("cursorScrollMargin", 0); + option("cursorHeight", 1, updateSelection, true); + option("singleCursorHeightPerLine", true, updateSelection, true); + option("workTime", 100); + option("workDelay", 100); + option("flattenSpans", true, resetModeState, true); + option("addModeClass", false, resetModeState, true); + option("pollInterval", 100); + option("undoDepth", 200, function (cm, val) { return cm.doc.history.undoDepth = val; }); + option("historyEventDelay", 1250); + option("viewportMargin", 10, function (cm) { return cm.refresh(); }, true); + option("maxHighlightLength", 10000, resetModeState, true); + option("moveInputWithCursor", true, function (cm, val) { + if (!val) { cm.display.input.resetPosition(); } + }); + + option("tabindex", null, function (cm, val) { return cm.display.input.getField().tabIndex = val || ""; }); + option("autofocus", null); + option("direction", "ltr", function (cm, val) { return cm.doc.setDirection(val); }, true); +} + +function guttersChanged(cm) { + updateGutters(cm); + regChange(cm); + alignHorizontally(cm); +} + +function dragDropChanged(cm, value, old) { + var wasOn = old && old != Init; + if (!value != !wasOn) { + var funcs = cm.display.dragFunctions; + var toggle = value ? on : off; + toggle(cm.display.scroller, "dragstart", funcs.start); + toggle(cm.display.scroller, "dragenter", funcs.enter); + toggle(cm.display.scroller, "dragover", funcs.over); + toggle(cm.display.scroller, "dragleave", funcs.leave); + toggle(cm.display.scroller, "drop", funcs.drop); + } +} + +function wrappingChanged(cm) { + if (cm.options.lineWrapping) { + addClass(cm.display.wrapper, "CodeMirror-wrap"); + cm.display.sizer.style.minWidth = ""; + cm.display.sizerWidth = null; + } else { + rmClass(cm.display.wrapper, "CodeMirror-wrap"); + findMaxLine(cm); + } + estimateLineHeights(cm); + regChange(cm); + clearCaches(cm); + setTimeout(function () { return updateScrollbars(cm); }, 100); +} + +// A CodeMirror instance represents an editor. This is the object +// that user code is usually dealing with. + +function CodeMirror$1(place, options) { + var this$1 = this; + + if (!(this instanceof CodeMirror$1)) { return new CodeMirror$1(place, options) } + + this.options = options = options ? copyObj(options) : {}; + // Determine effective options based on given values and defaults. + copyObj(defaults, options, false); + setGuttersForLineNumbers(options); + + var doc = options.value; + if (typeof doc == "string") { doc = new Doc(doc, options.mode, null, options.lineSeparator, options.direction); } + this.doc = doc; + + var input = new CodeMirror$1.inputStyles[options.inputStyle](this); + var display = this.display = new Display(place, doc, input); + display.wrapper.CodeMirror = this; + updateGutters(this); + themeChanged(this); + if (options.lineWrapping) + { this.display.wrapper.className += " CodeMirror-wrap"; } + initScrollbars(this); + + this.state = { + keyMaps: [], // stores maps added by addKeyMap + overlays: [], // highlighting overlays, as added by addOverlay + modeGen: 0, // bumped when mode/overlay changes, used to invalidate highlighting info + overwrite: false, + delayingBlurEvent: false, + focused: false, + suppressEdits: false, // used to disable editing during key handlers when in readOnly mode + pasteIncoming: false, cutIncoming: false, // help recognize paste/cut edits in input.poll + selectingText: false, + draggingText: false, + highlight: new Delayed(), // stores highlight worker timeout + keySeq: null, // Unfinished key sequence + specialChars: null + }; + + if (options.autofocus && !mobile) { display.input.focus(); } + + // Override magic textarea content restore that IE sometimes does + // on our hidden textarea on reload + if (ie && ie_version < 11) { setTimeout(function () { return this$1.display.input.reset(true); }, 20); } + + registerEventHandlers(this); + ensureGlobalHandlers(); + + startOperation(this); + this.curOp.forceUpdate = true; + attachDoc(this, doc); + + if ((options.autofocus && !mobile) || this.hasFocus()) + { setTimeout(bind(onFocus, this), 20); } + else + { onBlur(this); } + + for (var opt in optionHandlers) { if (optionHandlers.hasOwnProperty(opt)) + { optionHandlers[opt](this$1, options[opt], Init); } } + maybeUpdateLineNumberWidth(this); + if (options.finishInit) { options.finishInit(this); } + for (var i = 0; i < initHooks.length; ++i) { initHooks[i](this$1); } + endOperation(this); + // Suppress optimizelegibility in Webkit, since it breaks text + // measuring on line wrapping boundaries. + if (webkit && options.lineWrapping && + getComputedStyle(display.lineDiv).textRendering == "optimizelegibility") + { display.lineDiv.style.textRendering = "auto"; } +} + +// The default configuration options. +CodeMirror$1.defaults = defaults; +// Functions to run when options are changed. +CodeMirror$1.optionHandlers = optionHandlers; + +// Attach the necessary event handlers when initializing the editor +function registerEventHandlers(cm) { + var d = cm.display; + on(d.scroller, "mousedown", operation(cm, onMouseDown)); + // Older IE's will not fire a second mousedown for a double click + if (ie && ie_version < 11) + { on(d.scroller, "dblclick", operation(cm, function (e) { + if (signalDOMEvent(cm, e)) { return } + var pos = posFromMouse(cm, e); + if (!pos || clickInGutter(cm, e) || eventInWidget(cm.display, e)) { return } + e_preventDefault(e); + var word = cm.findWordAt(pos); + extendSelection(cm.doc, word.anchor, word.head); + })); } + else + { on(d.scroller, "dblclick", function (e) { return signalDOMEvent(cm, e) || e_preventDefault(e); }); } + // Some browsers fire contextmenu *after* opening the menu, at + // which point we can't mess with it anymore. Context menu is + // handled in onMouseDown for these browsers. + if (!captureRightClick) { on(d.scroller, "contextmenu", function (e) { return onContextMenu(cm, e); }); } + + // Used to suppress mouse event handling when a touch happens + var touchFinished, prevTouch = {end: 0}; + function finishTouch() { + if (d.activeTouch) { + touchFinished = setTimeout(function () { return d.activeTouch = null; }, 1000); + prevTouch = d.activeTouch; + prevTouch.end = +new Date; + } + } + function isMouseLikeTouchEvent(e) { + if (e.touches.length != 1) { return false } + var touch = e.touches[0]; + return touch.radiusX <= 1 && touch.radiusY <= 1 + } + function farAway(touch, other) { + if (other.left == null) { return true } + var dx = other.left - touch.left, dy = other.top - touch.top; + return dx * dx + dy * dy > 20 * 20 + } + on(d.scroller, "touchstart", function (e) { + if (!signalDOMEvent(cm, e) && !isMouseLikeTouchEvent(e)) { + d.input.ensurePolled(); + clearTimeout(touchFinished); + var now = +new Date; + d.activeTouch = {start: now, moved: false, + prev: now - prevTouch.end <= 300 ? prevTouch : null}; + if (e.touches.length == 1) { + d.activeTouch.left = e.touches[0].pageX; + d.activeTouch.top = e.touches[0].pageY; + } + } + }); + on(d.scroller, "touchmove", function () { + if (d.activeTouch) { d.activeTouch.moved = true; } + }); + on(d.scroller, "touchend", function (e) { + var touch = d.activeTouch; + if (touch && !eventInWidget(d, e) && touch.left != null && + !touch.moved && new Date - touch.start < 300) { + var pos = cm.coordsChar(d.activeTouch, "page"), range; + if (!touch.prev || farAway(touch, touch.prev)) // Single tap + { range = new Range(pos, pos); } + else if (!touch.prev.prev || farAway(touch, touch.prev.prev)) // Double tap + { range = cm.findWordAt(pos); } + else // Triple tap + { range = new Range(Pos(pos.line, 0), clipPos(cm.doc, Pos(pos.line + 1, 0))); } + cm.setSelection(range.anchor, range.head); + cm.focus(); + e_preventDefault(e); + } + finishTouch(); + }); + on(d.scroller, "touchcancel", finishTouch); + + // Sync scrolling between fake scrollbars and real scrollable + // area, ensure viewport is updated when scrolling. + on(d.scroller, "scroll", function () { + if (d.scroller.clientHeight) { + updateScrollTop(cm, d.scroller.scrollTop); + setScrollLeft(cm, d.scroller.scrollLeft, true); + signal(cm, "scroll", cm); + } + }); + + // Listen to wheel events in order to try and update the viewport on time. + on(d.scroller, "mousewheel", function (e) { return onScrollWheel(cm, e); }); + on(d.scroller, "DOMMouseScroll", function (e) { return onScrollWheel(cm, e); }); + + // Prevent wrapper from ever scrolling + on(d.wrapper, "scroll", function () { return d.wrapper.scrollTop = d.wrapper.scrollLeft = 0; }); + + d.dragFunctions = { + enter: function (e) {if (!signalDOMEvent(cm, e)) { e_stop(e); }}, + over: function (e) {if (!signalDOMEvent(cm, e)) { onDragOver(cm, e); e_stop(e); }}, + start: function (e) { return onDragStart(cm, e); }, + drop: operation(cm, onDrop), + leave: function (e) {if (!signalDOMEvent(cm, e)) { clearDragCursor(cm); }} + }; + + var inp = d.input.getField(); + on(inp, "keyup", function (e) { return onKeyUp.call(cm, e); }); + on(inp, "keydown", operation(cm, onKeyDown)); + on(inp, "keypress", operation(cm, onKeyPress)); + on(inp, "focus", function (e) { return onFocus(cm, e); }); + on(inp, "blur", function (e) { return onBlur(cm, e); }); +} + +var initHooks = []; +CodeMirror$1.defineInitHook = function (f) { return initHooks.push(f); }; + +// Indent the given line. The how parameter can be "smart", +// "add"/null, "subtract", or "prev". When aggressive is false +// (typically set to true for forced single-line indents), empty +// lines are not indented, and places where the mode returns Pass +// are left alone. +function indentLine(cm, n, how, aggressive) { + var doc = cm.doc, state; + if (how == null) { how = "add"; } + if (how == "smart") { + // Fall back to "prev" when the mode doesn't have an indentation + // method. + if (!doc.mode.indent) { how = "prev"; } + else { state = getContextBefore(cm, n).state; } + } + + var tabSize = cm.options.tabSize; + var line = getLine(doc, n), curSpace = countColumn(line.text, null, tabSize); + if (line.stateAfter) { line.stateAfter = null; } + var curSpaceString = line.text.match(/^\s*/)[0], indentation; + if (!aggressive && !/\S/.test(line.text)) { + indentation = 0; + how = "not"; + } else if (how == "smart") { + indentation = doc.mode.indent(state, line.text.slice(curSpaceString.length), line.text); + if (indentation == Pass || indentation > 150) { + if (!aggressive) { return } + how = "prev"; + } + } + if (how == "prev") { + if (n > doc.first) { indentation = countColumn(getLine(doc, n-1).text, null, tabSize); } + else { indentation = 0; } + } else if (how == "add") { + indentation = curSpace + cm.options.indentUnit; + } else if (how == "subtract") { + indentation = curSpace - cm.options.indentUnit; + } else if (typeof how == "number") { + indentation = curSpace + how; + } + indentation = Math.max(0, indentation); + + var indentString = "", pos = 0; + if (cm.options.indentWithTabs) + { for (var i = Math.floor(indentation / tabSize); i; --i) {pos += tabSize; indentString += "\t";} } + if (pos < indentation) { indentString += spaceStr(indentation - pos); } + + if (indentString != curSpaceString) { + replaceRange(doc, indentString, Pos(n, 0), Pos(n, curSpaceString.length), "+input"); + line.stateAfter = null; + return true + } else { + // Ensure that, if the cursor was in the whitespace at the start + // of the line, it is moved to the end of that space. + for (var i$1 = 0; i$1 < doc.sel.ranges.length; i$1++) { + var range = doc.sel.ranges[i$1]; + if (range.head.line == n && range.head.ch < curSpaceString.length) { + var pos$1 = Pos(n, curSpaceString.length); + replaceOneSelection(doc, i$1, new Range(pos$1, pos$1)); + break + } + } + } +} + +// This will be set to a {lineWise: bool, text: [string]} object, so +// that, when pasting, we know what kind of selections the copied +// text was made out of. +var lastCopied = null; + +function setLastCopied(newLastCopied) { + lastCopied = newLastCopied; +} + +function applyTextInput(cm, inserted, deleted, sel, origin) { + var doc = cm.doc; + cm.display.shift = false; + if (!sel) { sel = doc.sel; } + + var paste = cm.state.pasteIncoming || origin == "paste"; + var textLines = splitLinesAuto(inserted), multiPaste = null; + // When pasing N lines into N selections, insert one line per selection + if (paste && sel.ranges.length > 1) { + if (lastCopied && lastCopied.text.join("\n") == inserted) { + if (sel.ranges.length % lastCopied.text.length == 0) { + multiPaste = []; + for (var i = 0; i < lastCopied.text.length; i++) + { multiPaste.push(doc.splitLines(lastCopied.text[i])); } + } + } else if (textLines.length == sel.ranges.length && cm.options.pasteLinesPerSelection) { + multiPaste = map(textLines, function (l) { return [l]; }); + } + } + + var updateInput; + // Normal behavior is to insert the new text into every selection + for (var i$1 = sel.ranges.length - 1; i$1 >= 0; i$1--) { + var range$$1 = sel.ranges[i$1]; + var from = range$$1.from(), to = range$$1.to(); + if (range$$1.empty()) { + if (deleted && deleted > 0) // Handle deletion + { from = Pos(from.line, from.ch - deleted); } + else if (cm.state.overwrite && !paste) // Handle overwrite + { to = Pos(to.line, Math.min(getLine(doc, to.line).text.length, to.ch + lst(textLines).length)); } + else if (lastCopied && lastCopied.lineWise && lastCopied.text.join("\n") == inserted) + { from = to = Pos(from.line, 0); } + } + updateInput = cm.curOp.updateInput; + var changeEvent = {from: from, to: to, text: multiPaste ? multiPaste[i$1 % multiPaste.length] : textLines, + origin: origin || (paste ? "paste" : cm.state.cutIncoming ? "cut" : "+input")}; + makeChange(cm.doc, changeEvent); + signalLater(cm, "inputRead", cm, changeEvent); + } + if (inserted && !paste) + { triggerElectric(cm, inserted); } + + ensureCursorVisible(cm); + cm.curOp.updateInput = updateInput; + cm.curOp.typing = true; + cm.state.pasteIncoming = cm.state.cutIncoming = false; +} + +function handlePaste(e, cm) { + var pasted = e.clipboardData && e.clipboardData.getData("Text"); + if (pasted) { + e.preventDefault(); + if (!cm.isReadOnly() && !cm.options.disableInput) + { runInOp(cm, function () { return applyTextInput(cm, pasted, 0, null, "paste"); }); } + return true + } +} + +function triggerElectric(cm, inserted) { + // When an 'electric' character is inserted, immediately trigger a reindent + if (!cm.options.electricChars || !cm.options.smartIndent) { return } + var sel = cm.doc.sel; + + for (var i = sel.ranges.length - 1; i >= 0; i--) { + var range$$1 = sel.ranges[i]; + if (range$$1.head.ch > 100 || (i && sel.ranges[i - 1].head.line == range$$1.head.line)) { continue } + var mode = cm.getModeAt(range$$1.head); + var indented = false; + if (mode.electricChars) { + for (var j = 0; j < mode.electricChars.length; j++) + { if (inserted.indexOf(mode.electricChars.charAt(j)) > -1) { + indented = indentLine(cm, range$$1.head.line, "smart"); + break + } } + } else if (mode.electricInput) { + if (mode.electricInput.test(getLine(cm.doc, range$$1.head.line).text.slice(0, range$$1.head.ch))) + { indented = indentLine(cm, range$$1.head.line, "smart"); } + } + if (indented) { signalLater(cm, "electricInput", cm, range$$1.head.line); } + } +} + +function copyableRanges(cm) { + var text = [], ranges = []; + for (var i = 0; i < cm.doc.sel.ranges.length; i++) { + var line = cm.doc.sel.ranges[i].head.line; + var lineRange = {anchor: Pos(line, 0), head: Pos(line + 1, 0)}; + ranges.push(lineRange); + text.push(cm.getRange(lineRange.anchor, lineRange.head)); + } + return {text: text, ranges: ranges} +} + +function disableBrowserMagic(field, spellcheck) { + field.setAttribute("autocorrect", "off"); + field.setAttribute("autocapitalize", "off"); + field.setAttribute("spellcheck", !!spellcheck); +} + +function hiddenTextarea() { + var te = elt("textarea", null, null, "position: absolute; bottom: -1em; padding: 0; width: 1px; height: 1em; outline: none"); + var div = elt("div", [te], null, "overflow: hidden; position: relative; width: 3px; height: 0px;"); + // The textarea is kept positioned near the cursor to prevent the + // fact that it'll be scrolled into view on input from scrolling + // our fake cursor out of view. On webkit, when wrap=off, paste is + // very slow. So make the area wide instead. + if (webkit) { te.style.width = "1000px"; } + else { te.setAttribute("wrap", "off"); } + // If border: 0; -- iOS fails to open keyboard (issue #1287) + if (ios) { te.style.border = "1px solid black"; } + disableBrowserMagic(te); + return div +} + +// The publicly visible API. Note that methodOp(f) means +// 'wrap f in an operation, performed on its `this` parameter'. + +// This is not the complete set of editor methods. Most of the +// methods defined on the Doc type are also injected into +// CodeMirror.prototype, for backwards compatibility and +// convenience. + +var addEditorMethods = function(CodeMirror) { + var optionHandlers = CodeMirror.optionHandlers; + + var helpers = CodeMirror.helpers = {}; + + CodeMirror.prototype = { + constructor: CodeMirror, + focus: function(){window.focus(); this.display.input.focus();}, + + setOption: function(option, value) { + var options = this.options, old = options[option]; + if (options[option] == value && option != "mode") { return } + options[option] = value; + if (optionHandlers.hasOwnProperty(option)) + { operation(this, optionHandlers[option])(this, value, old); } + signal(this, "optionChange", this, option); + }, + + getOption: function(option) {return this.options[option]}, + getDoc: function() {return this.doc}, + + addKeyMap: function(map$$1, bottom) { + this.state.keyMaps[bottom ? "push" : "unshift"](getKeyMap(map$$1)); + }, + removeKeyMap: function(map$$1) { + var maps = this.state.keyMaps; + for (var i = 0; i < maps.length; ++i) + { if (maps[i] == map$$1 || maps[i].name == map$$1) { + maps.splice(i, 1); + return true + } } + }, + + addOverlay: methodOp(function(spec, options) { + var mode = spec.token ? spec : CodeMirror.getMode(this.options, spec); + if (mode.startState) { throw new Error("Overlays may not be stateful.") } + insertSorted(this.state.overlays, + {mode: mode, modeSpec: spec, opaque: options && options.opaque, + priority: (options && options.priority) || 0}, + function (overlay) { return overlay.priority; }); + this.state.modeGen++; + regChange(this); + }), + removeOverlay: methodOp(function(spec) { + var this$1 = this; + + var overlays = this.state.overlays; + for (var i = 0; i < overlays.length; ++i) { + var cur = overlays[i].modeSpec; + if (cur == spec || typeof spec == "string" && cur.name == spec) { + overlays.splice(i, 1); + this$1.state.modeGen++; + regChange(this$1); + return + } + } + }), + + indentLine: methodOp(function(n, dir, aggressive) { + if (typeof dir != "string" && typeof dir != "number") { + if (dir == null) { dir = this.options.smartIndent ? "smart" : "prev"; } + else { dir = dir ? "add" : "subtract"; } + } + if (isLine(this.doc, n)) { indentLine(this, n, dir, aggressive); } + }), + indentSelection: methodOp(function(how) { + var this$1 = this; + + var ranges = this.doc.sel.ranges, end = -1; + for (var i = 0; i < ranges.length; i++) { + var range$$1 = ranges[i]; + if (!range$$1.empty()) { + var from = range$$1.from(), to = range$$1.to(); + var start = Math.max(end, from.line); + end = Math.min(this$1.lastLine(), to.line - (to.ch ? 0 : 1)) + 1; + for (var j = start; j < end; ++j) + { indentLine(this$1, j, how); } + var newRanges = this$1.doc.sel.ranges; + if (from.ch == 0 && ranges.length == newRanges.length && newRanges[i].from().ch > 0) + { replaceOneSelection(this$1.doc, i, new Range(from, newRanges[i].to()), sel_dontScroll); } + } else if (range$$1.head.line > end) { + indentLine(this$1, range$$1.head.line, how, true); + end = range$$1.head.line; + if (i == this$1.doc.sel.primIndex) { ensureCursorVisible(this$1); } + } + } + }), + + // Fetch the parser token for a given character. Useful for hacks + // that want to inspect the mode state (say, for completion). + getTokenAt: function(pos, precise) { + return takeToken(this, pos, precise) + }, + + getLineTokens: function(line, precise) { + return takeToken(this, Pos(line), precise, true) + }, + + getTokenTypeAt: function(pos) { + pos = clipPos(this.doc, pos); + var styles = getLineStyles(this, getLine(this.doc, pos.line)); + var before = 0, after = (styles.length - 1) / 2, ch = pos.ch; + var type; + if (ch == 0) { type = styles[2]; } + else { for (;;) { + var mid = (before + after) >> 1; + if ((mid ? styles[mid * 2 - 1] : 0) >= ch) { after = mid; } + else if (styles[mid * 2 + 1] < ch) { before = mid + 1; } + else { type = styles[mid * 2 + 2]; break } + } } + var cut = type ? type.indexOf("overlay ") : -1; + return cut < 0 ? type : cut == 0 ? null : type.slice(0, cut - 1) + }, + + getModeAt: function(pos) { + var mode = this.doc.mode; + if (!mode.innerMode) { return mode } + return CodeMirror.innerMode(mode, this.getTokenAt(pos).state).mode + }, + + getHelper: function(pos, type) { + return this.getHelpers(pos, type)[0] + }, + + getHelpers: function(pos, type) { + var this$1 = this; + + var found = []; + if (!helpers.hasOwnProperty(type)) { return found } + var help = helpers[type], mode = this.getModeAt(pos); + if (typeof mode[type] == "string") { + if (help[mode[type]]) { found.push(help[mode[type]]); } + } else if (mode[type]) { + for (var i = 0; i < mode[type].length; i++) { + var val = help[mode[type][i]]; + if (val) { found.push(val); } + } + } else if (mode.helperType && help[mode.helperType]) { + found.push(help[mode.helperType]); + } else if (help[mode.name]) { + found.push(help[mode.name]); + } + for (var i$1 = 0; i$1 < help._global.length; i$1++) { + var cur = help._global[i$1]; + if (cur.pred(mode, this$1) && indexOf(found, cur.val) == -1) + { found.push(cur.val); } + } + return found + }, + + getStateAfter: function(line, precise) { + var doc = this.doc; + line = clipLine(doc, line == null ? doc.first + doc.size - 1: line); + return getContextBefore(this, line + 1, precise).state + }, + + cursorCoords: function(start, mode) { + var pos, range$$1 = this.doc.sel.primary(); + if (start == null) { pos = range$$1.head; } + else if (typeof start == "object") { pos = clipPos(this.doc, start); } + else { pos = start ? range$$1.from() : range$$1.to(); } + return cursorCoords(this, pos, mode || "page") + }, + + charCoords: function(pos, mode) { + return charCoords(this, clipPos(this.doc, pos), mode || "page") + }, + + coordsChar: function(coords, mode) { + coords = fromCoordSystem(this, coords, mode || "page"); + return coordsChar(this, coords.left, coords.top) + }, + + lineAtHeight: function(height, mode) { + height = fromCoordSystem(this, {top: height, left: 0}, mode || "page").top; + return lineAtHeight(this.doc, height + this.display.viewOffset) + }, + heightAtLine: function(line, mode, includeWidgets) { + var end = false, lineObj; + if (typeof line == "number") { + var last = this.doc.first + this.doc.size - 1; + if (line < this.doc.first) { line = this.doc.first; } + else if (line > last) { line = last; end = true; } + lineObj = getLine(this.doc, line); + } else { + lineObj = line; + } + return intoCoordSystem(this, lineObj, {top: 0, left: 0}, mode || "page", includeWidgets || end).top + + (end ? this.doc.height - heightAtLine(lineObj) : 0) + }, + + defaultTextHeight: function() { return textHeight(this.display) }, + defaultCharWidth: function() { return charWidth(this.display) }, + + getViewport: function() { return {from: this.display.viewFrom, to: this.display.viewTo}}, + + addWidget: function(pos, node, scroll, vert, horiz) { + var display = this.display; + pos = cursorCoords(this, clipPos(this.doc, pos)); + var top = pos.bottom, left = pos.left; + node.style.position = "absolute"; + node.setAttribute("cm-ignore-events", "true"); + this.display.input.setUneditable(node); + display.sizer.appendChild(node); + if (vert == "over") { + top = pos.top; + } else if (vert == "above" || vert == "near") { + var vspace = Math.max(display.wrapper.clientHeight, this.doc.height), + hspace = Math.max(display.sizer.clientWidth, display.lineSpace.clientWidth); + // Default to positioning above (if specified and possible); otherwise default to positioning below + if ((vert == 'above' || pos.bottom + node.offsetHeight > vspace) && pos.top > node.offsetHeight) + { top = pos.top - node.offsetHeight; } + else if (pos.bottom + node.offsetHeight <= vspace) + { top = pos.bottom; } + if (left + node.offsetWidth > hspace) + { left = hspace - node.offsetWidth; } + } + node.style.top = top + "px"; + node.style.left = node.style.right = ""; + if (horiz == "right") { + left = display.sizer.clientWidth - node.offsetWidth; + node.style.right = "0px"; + } else { + if (horiz == "left") { left = 0; } + else if (horiz == "middle") { left = (display.sizer.clientWidth - node.offsetWidth) / 2; } + node.style.left = left + "px"; + } + if (scroll) + { scrollIntoView(this, {left: left, top: top, right: left + node.offsetWidth, bottom: top + node.offsetHeight}); } + }, + + triggerOnKeyDown: methodOp(onKeyDown), + triggerOnKeyPress: methodOp(onKeyPress), + triggerOnKeyUp: onKeyUp, + triggerOnMouseDown: methodOp(onMouseDown), + + execCommand: function(cmd) { + if (commands.hasOwnProperty(cmd)) + { return commands[cmd].call(null, this) } + }, + + triggerElectric: methodOp(function(text) { triggerElectric(this, text); }), + + findPosH: function(from, amount, unit, visually) { + var this$1 = this; + + var dir = 1; + if (amount < 0) { dir = -1; amount = -amount; } + var cur = clipPos(this.doc, from); + for (var i = 0; i < amount; ++i) { + cur = findPosH(this$1.doc, cur, dir, unit, visually); + if (cur.hitSide) { break } + } + return cur + }, + + moveH: methodOp(function(dir, unit) { + var this$1 = this; + + this.extendSelectionsBy(function (range$$1) { + if (this$1.display.shift || this$1.doc.extend || range$$1.empty()) + { return findPosH(this$1.doc, range$$1.head, dir, unit, this$1.options.rtlMoveVisually) } + else + { return dir < 0 ? range$$1.from() : range$$1.to() } + }, sel_move); + }), + + deleteH: methodOp(function(dir, unit) { + var sel = this.doc.sel, doc = this.doc; + if (sel.somethingSelected()) + { doc.replaceSelection("", null, "+delete"); } + else + { deleteNearSelection(this, function (range$$1) { + var other = findPosH(doc, range$$1.head, dir, unit, false); + return dir < 0 ? {from: other, to: range$$1.head} : {from: range$$1.head, to: other} + }); } + }), + + findPosV: function(from, amount, unit, goalColumn) { + var this$1 = this; + + var dir = 1, x = goalColumn; + if (amount < 0) { dir = -1; amount = -amount; } + var cur = clipPos(this.doc, from); + for (var i = 0; i < amount; ++i) { + var coords = cursorCoords(this$1, cur, "div"); + if (x == null) { x = coords.left; } + else { coords.left = x; } + cur = findPosV(this$1, coords, dir, unit); + if (cur.hitSide) { break } + } + return cur + }, + + moveV: methodOp(function(dir, unit) { + var this$1 = this; + + var doc = this.doc, goals = []; + var collapse = !this.display.shift && !doc.extend && doc.sel.somethingSelected(); + doc.extendSelectionsBy(function (range$$1) { + if (collapse) + { return dir < 0 ? range$$1.from() : range$$1.to() } + var headPos = cursorCoords(this$1, range$$1.head, "div"); + if (range$$1.goalColumn != null) { headPos.left = range$$1.goalColumn; } + goals.push(headPos.left); + var pos = findPosV(this$1, headPos, dir, unit); + if (unit == "page" && range$$1 == doc.sel.primary()) + { addToScrollTop(this$1, charCoords(this$1, pos, "div").top - headPos.top); } + return pos + }, sel_move); + if (goals.length) { for (var i = 0; i < doc.sel.ranges.length; i++) + { doc.sel.ranges[i].goalColumn = goals[i]; } } + }), + + // Find the word at the given position (as returned by coordsChar). + findWordAt: function(pos) { + var doc = this.doc, line = getLine(doc, pos.line).text; + var start = pos.ch, end = pos.ch; + if (line) { + var helper = this.getHelper(pos, "wordChars"); + if ((pos.sticky == "before" || end == line.length) && start) { --start; } else { ++end; } + var startChar = line.charAt(start); + var check = isWordChar(startChar, helper) + ? function (ch) { return isWordChar(ch, helper); } + : /\s/.test(startChar) ? function (ch) { return /\s/.test(ch); } + : function (ch) { return (!/\s/.test(ch) && !isWordChar(ch)); }; + while (start > 0 && check(line.charAt(start - 1))) { --start; } + while (end < line.length && check(line.charAt(end))) { ++end; } + } + return new Range(Pos(pos.line, start), Pos(pos.line, end)) + }, + + toggleOverwrite: function(value) { + if (value != null && value == this.state.overwrite) { return } + if (this.state.overwrite = !this.state.overwrite) + { addClass(this.display.cursorDiv, "CodeMirror-overwrite"); } + else + { rmClass(this.display.cursorDiv, "CodeMirror-overwrite"); } + + signal(this, "overwriteToggle", this, this.state.overwrite); + }, + hasFocus: function() { return this.display.input.getField() == activeElt() }, + isReadOnly: function() { return !!(this.options.readOnly || this.doc.cantEdit) }, + + scrollTo: methodOp(function (x, y) { scrollToCoords(this, x, y); }), + getScrollInfo: function() { + var scroller = this.display.scroller; + return {left: scroller.scrollLeft, top: scroller.scrollTop, + height: scroller.scrollHeight - scrollGap(this) - this.display.barHeight, + width: scroller.scrollWidth - scrollGap(this) - this.display.barWidth, + clientHeight: displayHeight(this), clientWidth: displayWidth(this)} + }, + + scrollIntoView: methodOp(function(range$$1, margin) { + if (range$$1 == null) { + range$$1 = {from: this.doc.sel.primary().head, to: null}; + if (margin == null) { margin = this.options.cursorScrollMargin; } + } else if (typeof range$$1 == "number") { + range$$1 = {from: Pos(range$$1, 0), to: null}; + } else if (range$$1.from == null) { + range$$1 = {from: range$$1, to: null}; + } + if (!range$$1.to) { range$$1.to = range$$1.from; } + range$$1.margin = margin || 0; + + if (range$$1.from.line != null) { + scrollToRange(this, range$$1); + } else { + scrollToCoordsRange(this, range$$1.from, range$$1.to, range$$1.margin); + } + }), + + setSize: methodOp(function(width, height) { + var this$1 = this; + + var interpret = function (val) { return typeof val == "number" || /^\d+$/.test(String(val)) ? val + "px" : val; }; + if (width != null) { this.display.wrapper.style.width = interpret(width); } + if (height != null) { this.display.wrapper.style.height = interpret(height); } + if (this.options.lineWrapping) { clearLineMeasurementCache(this); } + var lineNo$$1 = this.display.viewFrom; + this.doc.iter(lineNo$$1, this.display.viewTo, function (line) { + if (line.widgets) { for (var i = 0; i < line.widgets.length; i++) + { if (line.widgets[i].noHScroll) { regLineChange(this$1, lineNo$$1, "widget"); break } } } + ++lineNo$$1; + }); + this.curOp.forceUpdate = true; + signal(this, "refresh", this); + }), + + operation: function(f){return runInOp(this, f)}, + + refresh: methodOp(function() { + var oldHeight = this.display.cachedTextHeight; + regChange(this); + this.curOp.forceUpdate = true; + clearCaches(this); + scrollToCoords(this, this.doc.scrollLeft, this.doc.scrollTop); + updateGutterSpace(this); + if (oldHeight == null || Math.abs(oldHeight - textHeight(this.display)) > .5) + { estimateLineHeights(this); } + signal(this, "refresh", this); + }), + + swapDoc: methodOp(function(doc) { + var old = this.doc; + old.cm = null; + attachDoc(this, doc); + clearCaches(this); + this.display.input.reset(); + scrollToCoords(this, doc.scrollLeft, doc.scrollTop); + this.curOp.forceScroll = true; + signalLater(this, "swapDoc", this, old); + return old + }), + + getInputField: function(){return this.display.input.getField()}, + getWrapperElement: function(){return this.display.wrapper}, + getScrollerElement: function(){return this.display.scroller}, + getGutterElement: function(){return this.display.gutters} + }; + eventMixin(CodeMirror); + + CodeMirror.registerHelper = function(type, name, value) { + if (!helpers.hasOwnProperty(type)) { helpers[type] = CodeMirror[type] = {_global: []}; } + helpers[type][name] = value; + }; + CodeMirror.registerGlobalHelper = function(type, name, predicate, value) { + CodeMirror.registerHelper(type, name, value); + helpers[type]._global.push({pred: predicate, val: value}); + }; +}; + +// Used for horizontal relative motion. Dir is -1 or 1 (left or +// right), unit can be "char", "column" (like char, but doesn't +// cross line boundaries), "word" (across next word), or "group" (to +// the start of next group of word or non-word-non-whitespace +// chars). The visually param controls whether, in right-to-left +// text, direction 1 means to move towards the next index in the +// string, or towards the character to the right of the current +// position. The resulting position will have a hitSide=true +// property if it reached the end of the document. +function findPosH(doc, pos, dir, unit, visually) { + var oldPos = pos; + var origDir = dir; + var lineObj = getLine(doc, pos.line); + function findNextLine() { + var l = pos.line + dir; + if (l < doc.first || l >= doc.first + doc.size) { return false } + pos = new Pos(l, pos.ch, pos.sticky); + return lineObj = getLine(doc, l) + } + function moveOnce(boundToLine) { + var next; + if (visually) { + next = moveVisually(doc.cm, lineObj, pos, dir); + } else { + next = moveLogically(lineObj, pos, dir); + } + if (next == null) { + if (!boundToLine && findNextLine()) + { pos = endOfLine(visually, doc.cm, lineObj, pos.line, dir); } + else + { return false } + } else { + pos = next; + } + return true + } + + if (unit == "char") { + moveOnce(); + } else if (unit == "column") { + moveOnce(true); + } else if (unit == "word" || unit == "group") { + var sawType = null, group = unit == "group"; + var helper = doc.cm && doc.cm.getHelper(pos, "wordChars"); + for (var first = true;; first = false) { + if (dir < 0 && !moveOnce(!first)) { break } + var cur = lineObj.text.charAt(pos.ch) || "\n"; + var type = isWordChar(cur, helper) ? "w" + : group && cur == "\n" ? "n" + : !group || /\s/.test(cur) ? null + : "p"; + if (group && !first && !type) { type = "s"; } + if (sawType && sawType != type) { + if (dir < 0) {dir = 1; moveOnce(); pos.sticky = "after";} + break + } + + if (type) { sawType = type; } + if (dir > 0 && !moveOnce(!first)) { break } + } + } + var result = skipAtomic(doc, pos, oldPos, origDir, true); + if (equalCursorPos(oldPos, result)) { result.hitSide = true; } + return result +} + +// For relative vertical movement. Dir may be -1 or 1. Unit can be +// "page" or "line". The resulting position will have a hitSide=true +// property if it reached the end of the document. +function findPosV(cm, pos, dir, unit) { + var doc = cm.doc, x = pos.left, y; + if (unit == "page") { + var pageSize = Math.min(cm.display.wrapper.clientHeight, window.innerHeight || document.documentElement.clientHeight); + var moveAmount = Math.max(pageSize - .5 * textHeight(cm.display), 3); + y = (dir > 0 ? pos.bottom : pos.top) + dir * moveAmount; + + } else if (unit == "line") { + y = dir > 0 ? pos.bottom + 3 : pos.top - 3; + } + var target; + for (;;) { + target = coordsChar(cm, x, y); + if (!target.outside) { break } + if (dir < 0 ? y <= 0 : y >= doc.height) { target.hitSide = true; break } + y += dir * 5; + } + return target +} + +// CONTENTEDITABLE INPUT STYLE + +var ContentEditableInput = function(cm) { + this.cm = cm; + this.lastAnchorNode = this.lastAnchorOffset = this.lastFocusNode = this.lastFocusOffset = null; + this.polling = new Delayed(); + this.composing = null; + this.gracePeriod = false; + this.readDOMTimeout = null; +}; + +ContentEditableInput.prototype.init = function (display) { + var this$1 = this; + + var input = this, cm = input.cm; + var div = input.div = display.lineDiv; + disableBrowserMagic(div, cm.options.spellcheck); + + on(div, "paste", function (e) { + if (signalDOMEvent(cm, e) || handlePaste(e, cm)) { return } + // IE doesn't fire input events, so we schedule a read for the pasted content in this way + if (ie_version <= 11) { setTimeout(operation(cm, function () { return this$1.updateFromDOM(); }), 20); } + }); + + on(div, "compositionstart", function (e) { + this$1.composing = {data: e.data, done: false}; + }); + on(div, "compositionupdate", function (e) { + if (!this$1.composing) { this$1.composing = {data: e.data, done: false}; } + }); + on(div, "compositionend", function (e) { + if (this$1.composing) { + if (e.data != this$1.composing.data) { this$1.readFromDOMSoon(); } + this$1.composing.done = true; + } + }); + + on(div, "touchstart", function () { return input.forceCompositionEnd(); }); + + on(div, "input", function () { + if (!this$1.composing) { this$1.readFromDOMSoon(); } + }); + + function onCopyCut(e) { + if (signalDOMEvent(cm, e)) { return } + if (cm.somethingSelected()) { + setLastCopied({lineWise: false, text: cm.getSelections()}); + if (e.type == "cut") { cm.replaceSelection("", null, "cut"); } + } else if (!cm.options.lineWiseCopyCut) { + return + } else { + var ranges = copyableRanges(cm); + setLastCopied({lineWise: true, text: ranges.text}); + if (e.type == "cut") { + cm.operation(function () { + cm.setSelections(ranges.ranges, 0, sel_dontScroll); + cm.replaceSelection("", null, "cut"); + }); + } + } + if (e.clipboardData) { + e.clipboardData.clearData(); + var content = lastCopied.text.join("\n"); + // iOS exposes the clipboard API, but seems to discard content inserted into it + e.clipboardData.setData("Text", content); + if (e.clipboardData.getData("Text") == content) { + e.preventDefault(); + return + } + } + // Old-fashioned briefly-focus-a-textarea hack + var kludge = hiddenTextarea(), te = kludge.firstChild; + cm.display.lineSpace.insertBefore(kludge, cm.display.lineSpace.firstChild); + te.value = lastCopied.text.join("\n"); + var hadFocus = document.activeElement; + selectInput(te); + setTimeout(function () { + cm.display.lineSpace.removeChild(kludge); + hadFocus.focus(); + if (hadFocus == div) { input.showPrimarySelection(); } + }, 50); + } + on(div, "copy", onCopyCut); + on(div, "cut", onCopyCut); +}; + +ContentEditableInput.prototype.prepareSelection = function () { + var result = prepareSelection(this.cm, false); + result.focus = this.cm.state.focused; + return result +}; + +ContentEditableInput.prototype.showSelection = function (info, takeFocus) { + if (!info || !this.cm.display.view.length) { return } + if (info.focus || takeFocus) { this.showPrimarySelection(); } + this.showMultipleSelections(info); +}; + +ContentEditableInput.prototype.showPrimarySelection = function () { + var sel = window.getSelection(), cm = this.cm, prim = cm.doc.sel.primary(); + var from = prim.from(), to = prim.to(); + + if (cm.display.viewTo == cm.display.viewFrom || from.line >= cm.display.viewTo || to.line < cm.display.viewFrom) { + sel.removeAllRanges(); + return + } + + var curAnchor = domToPos(cm, sel.anchorNode, sel.anchorOffset); + var curFocus = domToPos(cm, sel.focusNode, sel.focusOffset); + if (curAnchor && !curAnchor.bad && curFocus && !curFocus.bad && + cmp(minPos(curAnchor, curFocus), from) == 0 && + cmp(maxPos(curAnchor, curFocus), to) == 0) + { return } + + var view = cm.display.view; + var start = (from.line >= cm.display.viewFrom && posToDOM(cm, from)) || + {node: view[0].measure.map[2], offset: 0}; + var end = to.line < cm.display.viewTo && posToDOM(cm, to); + if (!end) { + var measure = view[view.length - 1].measure; + var map$$1 = measure.maps ? measure.maps[measure.maps.length - 1] : measure.map; + end = {node: map$$1[map$$1.length - 1], offset: map$$1[map$$1.length - 2] - map$$1[map$$1.length - 3]}; + } + + if (!start || !end) { + sel.removeAllRanges(); + return + } + + var old = sel.rangeCount && sel.getRangeAt(0), rng; + try { rng = range(start.node, start.offset, end.offset, end.node); } + catch(e) {} // Our model of the DOM might be outdated, in which case the range we try to set can be impossible + if (rng) { + if (!gecko && cm.state.focused) { + sel.collapse(start.node, start.offset); + if (!rng.collapsed) { + sel.removeAllRanges(); + sel.addRange(rng); + } + } else { + sel.removeAllRanges(); + sel.addRange(rng); + } + if (old && sel.anchorNode == null) { sel.addRange(old); } + else if (gecko) { this.startGracePeriod(); } + } + this.rememberSelection(); +}; + +ContentEditableInput.prototype.startGracePeriod = function () { + var this$1 = this; + + clearTimeout(this.gracePeriod); + this.gracePeriod = setTimeout(function () { + this$1.gracePeriod = false; + if (this$1.selectionChanged()) + { this$1.cm.operation(function () { return this$1.cm.curOp.selectionChanged = true; }); } + }, 20); +}; + +ContentEditableInput.prototype.showMultipleSelections = function (info) { + removeChildrenAndAdd(this.cm.display.cursorDiv, info.cursors); + removeChildrenAndAdd(this.cm.display.selectionDiv, info.selection); +}; + +ContentEditableInput.prototype.rememberSelection = function () { + var sel = window.getSelection(); + this.lastAnchorNode = sel.anchorNode; this.lastAnchorOffset = sel.anchorOffset; + this.lastFocusNode = sel.focusNode; this.lastFocusOffset = sel.focusOffset; +}; + +ContentEditableInput.prototype.selectionInEditor = function () { + var sel = window.getSelection(); + if (!sel.rangeCount) { return false } + var node = sel.getRangeAt(0).commonAncestorContainer; + return contains(this.div, node) +}; + +ContentEditableInput.prototype.focus = function () { + if (this.cm.options.readOnly != "nocursor") { + if (!this.selectionInEditor()) + { this.showSelection(this.prepareSelection(), true); } + this.div.focus(); + } +}; +ContentEditableInput.prototype.blur = function () { this.div.blur(); }; +ContentEditableInput.prototype.getField = function () { return this.div }; + +ContentEditableInput.prototype.supportsTouch = function () { return true }; + +ContentEditableInput.prototype.receivedFocus = function () { + var input = this; + if (this.selectionInEditor()) + { this.pollSelection(); } + else + { runInOp(this.cm, function () { return input.cm.curOp.selectionChanged = true; }); } + + function poll() { + if (input.cm.state.focused) { + input.pollSelection(); + input.polling.set(input.cm.options.pollInterval, poll); + } + } + this.polling.set(this.cm.options.pollInterval, poll); +}; + +ContentEditableInput.prototype.selectionChanged = function () { + var sel = window.getSelection(); + return sel.anchorNode != this.lastAnchorNode || sel.anchorOffset != this.lastAnchorOffset || + sel.focusNode != this.lastFocusNode || sel.focusOffset != this.lastFocusOffset +}; + +ContentEditableInput.prototype.pollSelection = function () { + if (this.readDOMTimeout != null || this.gracePeriod || !this.selectionChanged()) { return } + var sel = window.getSelection(), cm = this.cm; + // On Android Chrome (version 56, at least), backspacing into an + // uneditable block element will put the cursor in that element, + // and then, because it's not editable, hide the virtual keyboard. + // Because Android doesn't allow us to actually detect backspace + // presses in a sane way, this code checks for when that happens + // and simulates a backspace press in this case. + if (android && chrome && this.cm.options.gutters.length && isInGutter(sel.anchorNode)) { + this.cm.triggerOnKeyDown({type: "keydown", keyCode: 8, preventDefault: Math.abs}); + this.blur(); + this.focus(); + return + } + if (this.composing) { return } + this.rememberSelection(); + var anchor = domToPos(cm, sel.anchorNode, sel.anchorOffset); + var head = domToPos(cm, sel.focusNode, sel.focusOffset); + if (anchor && head) { runInOp(cm, function () { + setSelection(cm.doc, simpleSelection(anchor, head), sel_dontScroll); + if (anchor.bad || head.bad) { cm.curOp.selectionChanged = true; } + }); } +}; + +ContentEditableInput.prototype.pollContent = function () { + if (this.readDOMTimeout != null) { + clearTimeout(this.readDOMTimeout); + this.readDOMTimeout = null; + } + + var cm = this.cm, display = cm.display, sel = cm.doc.sel.primary(); + var from = sel.from(), to = sel.to(); + if (from.ch == 0 && from.line > cm.firstLine()) + { from = Pos(from.line - 1, getLine(cm.doc, from.line - 1).length); } + if (to.ch == getLine(cm.doc, to.line).text.length && to.line < cm.lastLine()) + { to = Pos(to.line + 1, 0); } + if (from.line < display.viewFrom || to.line > display.viewTo - 1) { return false } + + var fromIndex, fromLine, fromNode; + if (from.line == display.viewFrom || (fromIndex = findViewIndex(cm, from.line)) == 0) { + fromLine = lineNo(display.view[0].line); + fromNode = display.view[0].node; + } else { + fromLine = lineNo(display.view[fromIndex].line); + fromNode = display.view[fromIndex - 1].node.nextSibling; + } + var toIndex = findViewIndex(cm, to.line); + var toLine, toNode; + if (toIndex == display.view.length - 1) { + toLine = display.viewTo - 1; + toNode = display.lineDiv.lastChild; + } else { + toLine = lineNo(display.view[toIndex + 1].line) - 1; + toNode = display.view[toIndex + 1].node.previousSibling; + } + + if (!fromNode) { return false } + var newText = cm.doc.splitLines(domTextBetween(cm, fromNode, toNode, fromLine, toLine)); + var oldText = getBetween(cm.doc, Pos(fromLine, 0), Pos(toLine, getLine(cm.doc, toLine).text.length)); + while (newText.length > 1 && oldText.length > 1) { + if (lst(newText) == lst(oldText)) { newText.pop(); oldText.pop(); toLine--; } + else if (newText[0] == oldText[0]) { newText.shift(); oldText.shift(); fromLine++; } + else { break } + } + + var cutFront = 0, cutEnd = 0; + var newTop = newText[0], oldTop = oldText[0], maxCutFront = Math.min(newTop.length, oldTop.length); + while (cutFront < maxCutFront && newTop.charCodeAt(cutFront) == oldTop.charCodeAt(cutFront)) + { ++cutFront; } + var newBot = lst(newText), oldBot = lst(oldText); + var maxCutEnd = Math.min(newBot.length - (newText.length == 1 ? cutFront : 0), + oldBot.length - (oldText.length == 1 ? cutFront : 0)); + while (cutEnd < maxCutEnd && + newBot.charCodeAt(newBot.length - cutEnd - 1) == oldBot.charCodeAt(oldBot.length - cutEnd - 1)) + { ++cutEnd; } + // Try to move start of change to start of selection if ambiguous + if (newText.length == 1 && oldText.length == 1 && fromLine == from.line) { + while (cutFront && cutFront > from.ch && + newBot.charCodeAt(newBot.length - cutEnd - 1) == oldBot.charCodeAt(oldBot.length - cutEnd - 1)) { + cutFront--; + cutEnd++; + } + } + + newText[newText.length - 1] = newBot.slice(0, newBot.length - cutEnd).replace(/^\u200b+/, ""); + newText[0] = newText[0].slice(cutFront).replace(/\u200b+$/, ""); + + var chFrom = Pos(fromLine, cutFront); + var chTo = Pos(toLine, oldText.length ? lst(oldText).length - cutEnd : 0); + if (newText.length > 1 || newText[0] || cmp(chFrom, chTo)) { + replaceRange(cm.doc, newText, chFrom, chTo, "+input"); + return true + } +}; + +ContentEditableInput.prototype.ensurePolled = function () { + this.forceCompositionEnd(); +}; +ContentEditableInput.prototype.reset = function () { + this.forceCompositionEnd(); +}; +ContentEditableInput.prototype.forceCompositionEnd = function () { + if (!this.composing) { return } + clearTimeout(this.readDOMTimeout); + this.composing = null; + this.updateFromDOM(); + this.div.blur(); + this.div.focus(); +}; +ContentEditableInput.prototype.readFromDOMSoon = function () { + var this$1 = this; + + if (this.readDOMTimeout != null) { return } + this.readDOMTimeout = setTimeout(function () { + this$1.readDOMTimeout = null; + if (this$1.composing) { + if (this$1.composing.done) { this$1.composing = null; } + else { return } + } + this$1.updateFromDOM(); + }, 80); +}; + +ContentEditableInput.prototype.updateFromDOM = function () { + var this$1 = this; + + if (this.cm.isReadOnly() || !this.pollContent()) + { runInOp(this.cm, function () { return regChange(this$1.cm); }); } +}; + +ContentEditableInput.prototype.setUneditable = function (node) { + node.contentEditable = "false"; +}; + +ContentEditableInput.prototype.onKeyPress = function (e) { + if (e.charCode == 0) { return } + e.preventDefault(); + if (!this.cm.isReadOnly()) + { operation(this.cm, applyTextInput)(this.cm, String.fromCharCode(e.charCode == null ? e.keyCode : e.charCode), 0); } +}; + +ContentEditableInput.prototype.readOnlyChanged = function (val) { + this.div.contentEditable = String(val != "nocursor"); +}; + +ContentEditableInput.prototype.onContextMenu = function () {}; +ContentEditableInput.prototype.resetPosition = function () {}; + +ContentEditableInput.prototype.needsContentAttribute = true; + +function posToDOM(cm, pos) { + var view = findViewForLine(cm, pos.line); + if (!view || view.hidden) { return null } + var line = getLine(cm.doc, pos.line); + var info = mapFromLineView(view, line, pos.line); + + var order = getOrder(line, cm.doc.direction), side = "left"; + if (order) { + var partPos = getBidiPartAt(order, pos.ch); + side = partPos % 2 ? "right" : "left"; + } + var result = nodeAndOffsetInLineMap(info.map, pos.ch, side); + result.offset = result.collapse == "right" ? result.end : result.start; + return result +} + +function isInGutter(node) { + for (var scan = node; scan; scan = scan.parentNode) + { if (/CodeMirror-gutter-wrapper/.test(scan.className)) { return true } } + return false +} + +function badPos(pos, bad) { if (bad) { pos.bad = true; } return pos } + +function domTextBetween(cm, from, to, fromLine, toLine) { + var text = "", closing = false, lineSep = cm.doc.lineSeparator(); + function recognizeMarker(id) { return function (marker) { return marker.id == id; } } + function close() { + if (closing) { + text += lineSep; + closing = false; + } + } + function addText(str) { + if (str) { + close(); + text += str; + } + } + function walk(node) { + if (node.nodeType == 1) { + var cmText = node.getAttribute("cm-text"); + if (cmText != null) { + addText(cmText || node.textContent.replace(/\u200b/g, "")); + return + } + var markerID = node.getAttribute("cm-marker"), range$$1; + if (markerID) { + var found = cm.findMarks(Pos(fromLine, 0), Pos(toLine + 1, 0), recognizeMarker(+markerID)); + if (found.length && (range$$1 = found[0].find())) + { addText(getBetween(cm.doc, range$$1.from, range$$1.to).join(lineSep)); } + return + } + if (node.getAttribute("contenteditable") == "false") { return } + var isBlock = /^(pre|div|p)$/i.test(node.nodeName); + if (isBlock) { close(); } + for (var i = 0; i < node.childNodes.length; i++) + { walk(node.childNodes[i]); } + if (isBlock) { closing = true; } + } else if (node.nodeType == 3) { + addText(node.nodeValue); + } + } + for (;;) { + walk(from); + if (from == to) { break } + from = from.nextSibling; + } + return text +} + +function domToPos(cm, node, offset) { + var lineNode; + if (node == cm.display.lineDiv) { + lineNode = cm.display.lineDiv.childNodes[offset]; + if (!lineNode) { return badPos(cm.clipPos(Pos(cm.display.viewTo - 1)), true) } + node = null; offset = 0; + } else { + for (lineNode = node;; lineNode = lineNode.parentNode) { + if (!lineNode || lineNode == cm.display.lineDiv) { return null } + if (lineNode.parentNode && lineNode.parentNode == cm.display.lineDiv) { break } + } + } + for (var i = 0; i < cm.display.view.length; i++) { + var lineView = cm.display.view[i]; + if (lineView.node == lineNode) + { return locateNodeInLineView(lineView, node, offset) } + } +} + +function locateNodeInLineView(lineView, node, offset) { + var wrapper = lineView.text.firstChild, bad = false; + if (!node || !contains(wrapper, node)) { return badPos(Pos(lineNo(lineView.line), 0), true) } + if (node == wrapper) { + bad = true; + node = wrapper.childNodes[offset]; + offset = 0; + if (!node) { + var line = lineView.rest ? lst(lineView.rest) : lineView.line; + return badPos(Pos(lineNo(line), line.text.length), bad) + } + } + + var textNode = node.nodeType == 3 ? node : null, topNode = node; + if (!textNode && node.childNodes.length == 1 && node.firstChild.nodeType == 3) { + textNode = node.firstChild; + if (offset) { offset = textNode.nodeValue.length; } + } + while (topNode.parentNode != wrapper) { topNode = topNode.parentNode; } + var measure = lineView.measure, maps = measure.maps; + + function find(textNode, topNode, offset) { + for (var i = -1; i < (maps ? maps.length : 0); i++) { + var map$$1 = i < 0 ? measure.map : maps[i]; + for (var j = 0; j < map$$1.length; j += 3) { + var curNode = map$$1[j + 2]; + if (curNode == textNode || curNode == topNode) { + var line = lineNo(i < 0 ? lineView.line : lineView.rest[i]); + var ch = map$$1[j] + offset; + if (offset < 0 || curNode != textNode) { ch = map$$1[j + (offset ? 1 : 0)]; } + return Pos(line, ch) + } + } + } + } + var found = find(textNode, topNode, offset); + if (found) { return badPos(found, bad) } + + // FIXME this is all really shaky. might handle the few cases it needs to handle, but likely to cause problems + for (var after = topNode.nextSibling, dist = textNode ? textNode.nodeValue.length - offset : 0; after; after = after.nextSibling) { + found = find(after, after.firstChild, 0); + if (found) + { return badPos(Pos(found.line, found.ch - dist), bad) } + else + { dist += after.textContent.length; } + } + for (var before = topNode.previousSibling, dist$1 = offset; before; before = before.previousSibling) { + found = find(before, before.firstChild, -1); + if (found) + { return badPos(Pos(found.line, found.ch + dist$1), bad) } + else + { dist$1 += before.textContent.length; } + } +} + +// TEXTAREA INPUT STYLE + +var TextareaInput = function(cm) { + this.cm = cm; + // See input.poll and input.reset + this.prevInput = ""; + + // Flag that indicates whether we expect input to appear real soon + // now (after some event like 'keypress' or 'input') and are + // polling intensively. + this.pollingFast = false; + // Self-resetting timeout for the poller + this.polling = new Delayed(); + // Tracks when input.reset has punted to just putting a short + // string into the textarea instead of the full selection. + this.inaccurateSelection = false; + // Used to work around IE issue with selection being forgotten when focus moves away from textarea + this.hasSelection = false; + this.composing = null; +}; + +TextareaInput.prototype.init = function (display) { + var this$1 = this; + + var input = this, cm = this.cm; + + // Wraps and hides input textarea + var div = this.wrapper = hiddenTextarea(); + // The semihidden textarea that is focused when the editor is + // focused, and receives input. + var te = this.textarea = div.firstChild; + display.wrapper.insertBefore(div, display.wrapper.firstChild); + + // Needed to hide big blue blinking cursor on Mobile Safari (doesn't seem to work in iOS 8 anymore) + if (ios) { te.style.width = "0px"; } + + on(te, "input", function () { + if (ie && ie_version >= 9 && this$1.hasSelection) { this$1.hasSelection = null; } + input.poll(); + }); + + on(te, "paste", function (e) { + if (signalDOMEvent(cm, e) || handlePaste(e, cm)) { return } + + cm.state.pasteIncoming = true; + input.fastPoll(); + }); + + function prepareCopyCut(e) { + if (signalDOMEvent(cm, e)) { return } + if (cm.somethingSelected()) { + setLastCopied({lineWise: false, text: cm.getSelections()}); + if (input.inaccurateSelection) { + input.prevInput = ""; + input.inaccurateSelection = false; + te.value = lastCopied.text.join("\n"); + selectInput(te); + } + } else if (!cm.options.lineWiseCopyCut) { + return + } else { + var ranges = copyableRanges(cm); + setLastCopied({lineWise: true, text: ranges.text}); + if (e.type == "cut") { + cm.setSelections(ranges.ranges, null, sel_dontScroll); + } else { + input.prevInput = ""; + te.value = ranges.text.join("\n"); + selectInput(te); + } + } + if (e.type == "cut") { cm.state.cutIncoming = true; } + } + on(te, "cut", prepareCopyCut); + on(te, "copy", prepareCopyCut); + + on(display.scroller, "paste", function (e) { + if (eventInWidget(display, e) || signalDOMEvent(cm, e)) { return } + cm.state.pasteIncoming = true; + input.focus(); + }); + + // Prevent normal selection in the editor (we handle our own) + on(display.lineSpace, "selectstart", function (e) { + if (!eventInWidget(display, e)) { e_preventDefault(e); } + }); + + on(te, "compositionstart", function () { + var start = cm.getCursor("from"); + if (input.composing) { input.composing.range.clear(); } + input.composing = { + start: start, + range: cm.markText(start, cm.getCursor("to"), {className: "CodeMirror-composing"}) + }; + }); + on(te, "compositionend", function () { + if (input.composing) { + input.poll(); + input.composing.range.clear(); + input.composing = null; + } + }); +}; + +TextareaInput.prototype.prepareSelection = function () { + // Redraw the selection and/or cursor + var cm = this.cm, display = cm.display, doc = cm.doc; + var result = prepareSelection(cm); + + // Move the hidden textarea near the cursor to prevent scrolling artifacts + if (cm.options.moveInputWithCursor) { + var headPos = cursorCoords(cm, doc.sel.primary().head, "div"); + var wrapOff = display.wrapper.getBoundingClientRect(), lineOff = display.lineDiv.getBoundingClientRect(); + result.teTop = Math.max(0, Math.min(display.wrapper.clientHeight - 10, + headPos.top + lineOff.top - wrapOff.top)); + result.teLeft = Math.max(0, Math.min(display.wrapper.clientWidth - 10, + headPos.left + lineOff.left - wrapOff.left)); + } + + return result +}; + +TextareaInput.prototype.showSelection = function (drawn) { + var cm = this.cm, display = cm.display; + removeChildrenAndAdd(display.cursorDiv, drawn.cursors); + removeChildrenAndAdd(display.selectionDiv, drawn.selection); + if (drawn.teTop != null) { + this.wrapper.style.top = drawn.teTop + "px"; + this.wrapper.style.left = drawn.teLeft + "px"; + } +}; + +// Reset the input to correspond to the selection (or to be empty, +// when not typing and nothing is selected) +TextareaInput.prototype.reset = function (typing) { + if (this.contextMenuPending || this.composing) { return } + var minimal, selected, cm = this.cm, doc = cm.doc; + if (cm.somethingSelected()) { + this.prevInput = ""; + var range$$1 = doc.sel.primary(); + minimal = hasCopyEvent && + (range$$1.to().line - range$$1.from().line > 100 || (selected = cm.getSelection()).length > 1000); + var content = minimal ? "-" : selected || cm.getSelection(); + this.textarea.value = content; + if (cm.state.focused) { selectInput(this.textarea); } + if (ie && ie_version >= 9) { this.hasSelection = content; } + } else if (!typing) { + this.prevInput = this.textarea.value = ""; + if (ie && ie_version >= 9) { this.hasSelection = null; } + } + this.inaccurateSelection = minimal; +}; + +TextareaInput.prototype.getField = function () { return this.textarea }; + +TextareaInput.prototype.supportsTouch = function () { return false }; + +TextareaInput.prototype.focus = function () { + if (this.cm.options.readOnly != "nocursor" && (!mobile || activeElt() != this.textarea)) { + try { this.textarea.focus(); } + catch (e) {} // IE8 will throw if the textarea is display: none or not in DOM + } +}; + +TextareaInput.prototype.blur = function () { this.textarea.blur(); }; + +TextareaInput.prototype.resetPosition = function () { + this.wrapper.style.top = this.wrapper.style.left = 0; +}; + +TextareaInput.prototype.receivedFocus = function () { this.slowPoll(); }; + +// Poll for input changes, using the normal rate of polling. This +// runs as long as the editor is focused. +TextareaInput.prototype.slowPoll = function () { + var this$1 = this; + + if (this.pollingFast) { return } + this.polling.set(this.cm.options.pollInterval, function () { + this$1.poll(); + if (this$1.cm.state.focused) { this$1.slowPoll(); } + }); +}; + +// When an event has just come in that is likely to add or change +// something in the input textarea, we poll faster, to ensure that +// the change appears on the screen quickly. +TextareaInput.prototype.fastPoll = function () { + var missed = false, input = this; + input.pollingFast = true; + function p() { + var changed = input.poll(); + if (!changed && !missed) {missed = true; input.polling.set(60, p);} + else {input.pollingFast = false; input.slowPoll();} + } + input.polling.set(20, p); +}; + +// Read input from the textarea, and update the document to match. +// When something is selected, it is present in the textarea, and +// selected (unless it is huge, in which case a placeholder is +// used). When nothing is selected, the cursor sits after previously +// seen text (can be empty), which is stored in prevInput (we must +// not reset the textarea when typing, because that breaks IME). +TextareaInput.prototype.poll = function () { + var this$1 = this; + + var cm = this.cm, input = this.textarea, prevInput = this.prevInput; + // Since this is called a *lot*, try to bail out as cheaply as + // possible when it is clear that nothing happened. hasSelection + // will be the case when there is a lot of text in the textarea, + // in which case reading its value would be expensive. + if (this.contextMenuPending || !cm.state.focused || + (hasSelection(input) && !prevInput && !this.composing) || + cm.isReadOnly() || cm.options.disableInput || cm.state.keySeq) + { return false } + + var text = input.value; + // If nothing changed, bail. + if (text == prevInput && !cm.somethingSelected()) { return false } + // Work around nonsensical selection resetting in IE9/10, and + // inexplicable appearance of private area unicode characters on + // some key combos in Mac (#2689). + if (ie && ie_version >= 9 && this.hasSelection === text || + mac && /[\uf700-\uf7ff]/.test(text)) { + cm.display.input.reset(); + return false + } + + if (cm.doc.sel == cm.display.selForContextMenu) { + var first = text.charCodeAt(0); + if (first == 0x200b && !prevInput) { prevInput = "\u200b"; } + if (first == 0x21da) { this.reset(); return this.cm.execCommand("undo") } + } + // Find the part of the input that is actually new + var same = 0, l = Math.min(prevInput.length, text.length); + while (same < l && prevInput.charCodeAt(same) == text.charCodeAt(same)) { ++same; } + + runInOp(cm, function () { + applyTextInput(cm, text.slice(same), prevInput.length - same, + null, this$1.composing ? "*compose" : null); + + // Don't leave long text in the textarea, since it makes further polling slow + if (text.length > 1000 || text.indexOf("\n") > -1) { input.value = this$1.prevInput = ""; } + else { this$1.prevInput = text; } + + if (this$1.composing) { + this$1.composing.range.clear(); + this$1.composing.range = cm.markText(this$1.composing.start, cm.getCursor("to"), + {className: "CodeMirror-composing"}); + } + }); + return true +}; + +TextareaInput.prototype.ensurePolled = function () { + if (this.pollingFast && this.poll()) { this.pollingFast = false; } +}; + +TextareaInput.prototype.onKeyPress = function () { + if (ie && ie_version >= 9) { this.hasSelection = null; } + this.fastPoll(); +}; + +TextareaInput.prototype.onContextMenu = function (e) { + var input = this, cm = input.cm, display = cm.display, te = input.textarea; + var pos = posFromMouse(cm, e), scrollPos = display.scroller.scrollTop; + if (!pos || presto) { return } // Opera is difficult. + + // Reset the current text selection only if the click is done outside of the selection + // and 'resetSelectionOnContextMenu' option is true. + var reset = cm.options.resetSelectionOnContextMenu; + if (reset && cm.doc.sel.contains(pos) == -1) + { operation(cm, setSelection)(cm.doc, simpleSelection(pos), sel_dontScroll); } + + var oldCSS = te.style.cssText, oldWrapperCSS = input.wrapper.style.cssText; + input.wrapper.style.cssText = "position: absolute"; + var wrapperBox = input.wrapper.getBoundingClientRect(); + te.style.cssText = "position: absolute; width: 30px; height: 30px;\n top: " + (e.clientY - wrapperBox.top - 5) + "px; left: " + (e.clientX - wrapperBox.left - 5) + "px;\n z-index: 1000; background: " + (ie ? "rgba(255, 255, 255, .05)" : "transparent") + ";\n outline: none; border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);"; + var oldScrollY; + if (webkit) { oldScrollY = window.scrollY; } // Work around Chrome issue (#2712) + display.input.focus(); + if (webkit) { window.scrollTo(null, oldScrollY); } + display.input.reset(); + // Adds "Select all" to context menu in FF + if (!cm.somethingSelected()) { te.value = input.prevInput = " "; } + input.contextMenuPending = true; + display.selForContextMenu = cm.doc.sel; + clearTimeout(display.detectingSelectAll); + + // Select-all will be greyed out if there's nothing to select, so + // this adds a zero-width space so that we can later check whether + // it got selected. + function prepareSelectAllHack() { + if (te.selectionStart != null) { + var selected = cm.somethingSelected(); + var extval = "\u200b" + (selected ? te.value : ""); + te.value = "\u21da"; // Used to catch context-menu undo + te.value = extval; + input.prevInput = selected ? "" : "\u200b"; + te.selectionStart = 1; te.selectionEnd = extval.length; + // Re-set this, in case some other handler touched the + // selection in the meantime. + display.selForContextMenu = cm.doc.sel; + } + } + function rehide() { + input.contextMenuPending = false; + input.wrapper.style.cssText = oldWrapperCSS; + te.style.cssText = oldCSS; + if (ie && ie_version < 9) { display.scrollbars.setScrollTop(display.scroller.scrollTop = scrollPos); } + + // Try to detect the user choosing select-all + if (te.selectionStart != null) { + if (!ie || (ie && ie_version < 9)) { prepareSelectAllHack(); } + var i = 0, poll = function () { + if (display.selForContextMenu == cm.doc.sel && te.selectionStart == 0 && + te.selectionEnd > 0 && input.prevInput == "\u200b") { + operation(cm, selectAll)(cm); + } else if (i++ < 10) { + display.detectingSelectAll = setTimeout(poll, 500); + } else { + display.selForContextMenu = null; + display.input.reset(); + } + }; + display.detectingSelectAll = setTimeout(poll, 200); + } + } + + if (ie && ie_version >= 9) { prepareSelectAllHack(); } + if (captureRightClick) { + e_stop(e); + var mouseup = function () { + off(window, "mouseup", mouseup); + setTimeout(rehide, 20); + }; + on(window, "mouseup", mouseup); + } else { + setTimeout(rehide, 50); + } +}; + +TextareaInput.prototype.readOnlyChanged = function (val) { + if (!val) { this.reset(); } + this.textarea.disabled = val == "nocursor"; +}; + +TextareaInput.prototype.setUneditable = function () {}; + +TextareaInput.prototype.needsContentAttribute = false; + +function fromTextArea(textarea, options) { + options = options ? copyObj(options) : {}; + options.value = textarea.value; + if (!options.tabindex && textarea.tabIndex) + { options.tabindex = textarea.tabIndex; } + if (!options.placeholder && textarea.placeholder) + { options.placeholder = textarea.placeholder; } + // Set autofocus to true if this textarea is focused, or if it has + // autofocus and no other element is focused. + if (options.autofocus == null) { + var hasFocus = activeElt(); + options.autofocus = hasFocus == textarea || + textarea.getAttribute("autofocus") != null && hasFocus == document.body; + } + + function save() {textarea.value = cm.getValue();} + + var realSubmit; + if (textarea.form) { + on(textarea.form, "submit", save); + // Deplorable hack to make the submit method do the right thing. + if (!options.leaveSubmitMethodAlone) { + var form = textarea.form; + realSubmit = form.submit; + try { + var wrappedSubmit = form.submit = function () { + save(); + form.submit = realSubmit; + form.submit(); + form.submit = wrappedSubmit; + }; + } catch(e) {} + } + } + + options.finishInit = function (cm) { + cm.save = save; + cm.getTextArea = function () { return textarea; }; + cm.toTextArea = function () { + cm.toTextArea = isNaN; // Prevent this from being ran twice + save(); + textarea.parentNode.removeChild(cm.getWrapperElement()); + textarea.style.display = ""; + if (textarea.form) { + off(textarea.form, "submit", save); + if (typeof textarea.form.submit == "function") + { textarea.form.submit = realSubmit; } + } + }; + }; + + textarea.style.display = "none"; + var cm = CodeMirror$1(function (node) { return textarea.parentNode.insertBefore(node, textarea.nextSibling); }, + options); + return cm +} + +function addLegacyProps(CodeMirror) { + CodeMirror.off = off; + CodeMirror.on = on; + CodeMirror.wheelEventPixels = wheelEventPixels; + CodeMirror.Doc = Doc; + CodeMirror.splitLines = splitLinesAuto; + CodeMirror.countColumn = countColumn; + CodeMirror.findColumn = findColumn; + CodeMirror.isWordChar = isWordCharBasic; + CodeMirror.Pass = Pass; + CodeMirror.signal = signal; + CodeMirror.Line = Line; + CodeMirror.changeEnd = changeEnd; + CodeMirror.scrollbarModel = scrollbarModel; + CodeMirror.Pos = Pos; + CodeMirror.cmpPos = cmp; + CodeMirror.modes = modes; + CodeMirror.mimeModes = mimeModes; + CodeMirror.resolveMode = resolveMode; + CodeMirror.getMode = getMode; + CodeMirror.modeExtensions = modeExtensions; + CodeMirror.extendMode = extendMode; + CodeMirror.copyState = copyState; + CodeMirror.startState = startState; + CodeMirror.innerMode = innerMode; + CodeMirror.commands = commands; + CodeMirror.keyMap = keyMap; + CodeMirror.keyName = keyName; + CodeMirror.isModifierKey = isModifierKey; + CodeMirror.lookupKey = lookupKey; + CodeMirror.normalizeKeyMap = normalizeKeyMap; + CodeMirror.StringStream = StringStream; + CodeMirror.SharedTextMarker = SharedTextMarker; + CodeMirror.TextMarker = TextMarker; + CodeMirror.LineWidget = LineWidget; + CodeMirror.e_preventDefault = e_preventDefault; + CodeMirror.e_stopPropagation = e_stopPropagation; + CodeMirror.e_stop = e_stop; + CodeMirror.addClass = addClass; + CodeMirror.contains = contains; + CodeMirror.rmClass = rmClass; + CodeMirror.keyNames = keyNames; +} + +// EDITOR CONSTRUCTOR + +defineOptions(CodeMirror$1); + +addEditorMethods(CodeMirror$1); + +// Set up methods on CodeMirror's prototype to redirect to the editor's document. +var dontDelegate = "iter insert remove copy getEditor constructor".split(" "); +for (var prop in Doc.prototype) { if (Doc.prototype.hasOwnProperty(prop) && indexOf(dontDelegate, prop) < 0) + { CodeMirror$1.prototype[prop] = (function(method) { + return function() {return method.apply(this.doc, arguments)} + })(Doc.prototype[prop]); } } + +eventMixin(Doc); + +// INPUT HANDLING + +CodeMirror$1.inputStyles = {"textarea": TextareaInput, "contenteditable": ContentEditableInput}; + +// MODE DEFINITION AND QUERYING + +// Extra arguments are stored as the mode's dependencies, which is +// used by (legacy) mechanisms like loadmode.js to automatically +// load a mode. (Preferred mechanism is the require/define calls.) +CodeMirror$1.defineMode = function(name/*, mode, …*/) { + if (!CodeMirror$1.defaults.mode && name != "null") { CodeMirror$1.defaults.mode = name; } + defineMode.apply(this, arguments); +}; + +CodeMirror$1.defineMIME = defineMIME; + +// Minimal default mode. +CodeMirror$1.defineMode("null", function () { return ({token: function (stream) { return stream.skipToEnd(); }}); }); +CodeMirror$1.defineMIME("text/plain", "null"); + +// EXTENSIONS + +CodeMirror$1.defineExtension = function (name, func) { + CodeMirror$1.prototype[name] = func; +}; +CodeMirror$1.defineDocExtension = function (name, func) { + Doc.prototype[name] = func; +}; + +CodeMirror$1.fromTextArea = fromTextArea; + +addLegacyProps(CodeMirror$1); + +CodeMirror$1.version = "5.27.4"; + +return CodeMirror$1; + +}))); diff --git a/pigx-register/src/main/resources/static/console-ui/public/js/codemirror.lib.clike-lint.js b/pigx-register/src/main/resources/static/console-ui/public/js/codemirror.lib.clike-lint.js new file mode 100644 index 0000000..2d177f1 --- /dev/null +++ b/pigx-register/src/main/resources/static/console-ui/public/js/codemirror.lib.clike-lint.js @@ -0,0 +1,802 @@ +/* + * Copyright 1999-2018 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +function Context(indented, column, type, info, align, prev) { + this.indented = indented; + this.column = column; + this.type = type; + this.info = info; + this.align = align; + this.prev = prev; +} +function pushContext(state, col, type, info) { + var indent = state.indented; + if (state.context && state.context.type == "statement" && type != "statement") + indent = state.context.indented; + return state.context = new Context(indent, col, type, info, null, state.context); +} +function popContext(state) { + var t = state.context.type; + if (t == ")" || t == "]" || t == "}") + state.indented = state.context.indented; + return state.context = state.context.prev; +} + +function typeBefore(stream, state, pos) { + if (state.prevToken == "variable" || state.prevToken == "type") return true; + if (/\S(?:[^- ]>|[*\]])\s*$|\*$/.test(stream.string.slice(0, pos))) return true; + if (state.typeAtEndOfLine && stream.column() == stream.indentation()) return true; +} + +function isTopScope(context) { + for (;;) { + if (!context || context.type == "top") return true; + if (context.type == "}" && context.prev.info != "namespace") return false; + context = context.prev; + } +} + +CodeMirror.defineMode("clike", function(config, parserConfig) { + var indentUnit = config.indentUnit, + statementIndentUnit = parserConfig.statementIndentUnit || indentUnit, + dontAlignCalls = parserConfig.dontAlignCalls, + keywords = parserConfig.keywords || {}, + types = parserConfig.types || {}, + builtin = parserConfig.builtin || {}, + blockKeywords = parserConfig.blockKeywords || {}, + defKeywords = parserConfig.defKeywords || {}, + atoms = parserConfig.atoms || {}, + hooks = parserConfig.hooks || {}, + multiLineStrings = parserConfig.multiLineStrings, + indentStatements = parserConfig.indentStatements !== false, + indentSwitch = parserConfig.indentSwitch !== false, + namespaceSeparator = parserConfig.namespaceSeparator, + isPunctuationChar = parserConfig.isPunctuationChar || /[\[\]{}\(\),;\:\.]/, + numberStart = parserConfig.numberStart || /[\d\.]/, + number = parserConfig.number || /^(?:0x[a-f\d]+|0b[01]+|(?:\d+\.?\d*|\.\d+)(?:e[-+]?\d+)?)(u|ll?|l|f)?/i, + isOperatorChar = parserConfig.isOperatorChar || /[+\-*&%=<>!?|\/]/, + isIdentifierChar = parserConfig.isIdentifierChar || /[\w\$_\xa1-\uffff]/; + + var curPunc, isDefKeyword; + + function tokenBase(stream, state) { + var ch = stream.next(); + if (hooks[ch]) { + var result = hooks[ch](stream, state); + if (result !== false) return result; + } + if (ch == '"' || ch == "'") { + state.tokenize = tokenString(ch); + return state.tokenize(stream, state); + } + if (isPunctuationChar.test(ch)) { + curPunc = ch; + return null; + } + if (numberStart.test(ch)) { + stream.backUp(1) + if (stream.match(number)) return "number" + stream.next() + } + if (ch == "/") { + if (stream.eat("*")) { + state.tokenize = tokenComment; + return tokenComment(stream, state); + } + if (stream.eat("/")) { + stream.skipToEnd(); + return "comment"; + } + } + if (isOperatorChar.test(ch)) { + while (!stream.match(/^\/[\/*]/, false) && stream.eat(isOperatorChar)) {} + return "operator"; + } + stream.eatWhile(isIdentifierChar); + if (namespaceSeparator) while (stream.match(namespaceSeparator)) + stream.eatWhile(isIdentifierChar); + + var cur = stream.current(); + if (contains(keywords, cur)) { + if (contains(blockKeywords, cur)) curPunc = "newstatement"; + if (contains(defKeywords, cur)) isDefKeyword = true; + return "keyword"; + } + if (contains(types, cur)) return "type"; + if (contains(builtin, cur)) { + if (contains(blockKeywords, cur)) curPunc = "newstatement"; + return "builtin"; + } + if (contains(atoms, cur)) return "atom"; + return "variable"; + } + + function tokenString(quote) { + return function(stream, state) { + var escaped = false, next, end = false; + while ((next = stream.next()) != null) { + if (next == quote && !escaped) {end = true; break;} + escaped = !escaped && next == "\\"; + } + if (end || !(escaped || multiLineStrings)) + state.tokenize = null; + return "string"; + }; + } + + function tokenComment(stream, state) { + var maybeEnd = false, ch; + while (ch = stream.next()) { + if (ch == "/" && maybeEnd) { + state.tokenize = null; + break; + } + maybeEnd = (ch == "*"); + } + return "comment"; + } + + function maybeEOL(stream, state) { + if (parserConfig.typeFirstDefinitions && stream.eol() && isTopScope(state.context)) + state.typeAtEndOfLine = typeBefore(stream, state, stream.pos) + } + + // Interface + + return { + startState: function(basecolumn) { + return { + tokenize: null, + context: new Context((basecolumn || 0) - indentUnit, 0, "top", null, false), + indented: 0, + startOfLine: true, + prevToken: null + }; + }, + + token: function(stream, state) { + var ctx = state.context; + if (stream.sol()) { + if (ctx.align == null) ctx.align = false; + state.indented = stream.indentation(); + state.startOfLine = true; + } + if (stream.eatSpace()) { maybeEOL(stream, state); return null; } + curPunc = isDefKeyword = null; + var style = (state.tokenize || tokenBase)(stream, state); + if (style == "comment" || style == "meta") return style; + if (ctx.align == null) ctx.align = true; + + if (curPunc == ";" || curPunc == ":" || (curPunc == "," && stream.match(/^\s*(?:\/\/.*)?$/, false))) + while (state.context.type == "statement") popContext(state); + else if (curPunc == "{") pushContext(state, stream.column(), "}"); + else if (curPunc == "[") pushContext(state, stream.column(), "]"); + else if (curPunc == "(") pushContext(state, stream.column(), ")"); + else if (curPunc == "}") { + while (ctx.type == "statement") ctx = popContext(state); + if (ctx.type == "}") ctx = popContext(state); + while (ctx.type == "statement") ctx = popContext(state); + } + else if (curPunc == ctx.type) popContext(state); + else if (indentStatements && + (((ctx.type == "}" || ctx.type == "top") && curPunc != ";") || + (ctx.type == "statement" && curPunc == "newstatement"))) { + pushContext(state, stream.column(), "statement", stream.current()); + } + + if (style == "variable" && + ((state.prevToken == "def" || + (parserConfig.typeFirstDefinitions && typeBefore(stream, state, stream.start) && + isTopScope(state.context) && stream.match(/^\s*\(/, false))))) + style = "def"; + + if (hooks.token) { + var result = hooks.token(stream, state, style); + if (result !== undefined) style = result; + } + + if (style == "def" && parserConfig.styleDefs === false) style = "variable"; + + state.startOfLine = false; + state.prevToken = isDefKeyword ? "def" : style || curPunc; + maybeEOL(stream, state); + return style; + }, + + indent: function(state, textAfter) { + if (state.tokenize != tokenBase && state.tokenize != null || state.typeAtEndOfLine) return CodeMirror.Pass; + var ctx = state.context, firstChar = textAfter && textAfter.charAt(0); + if (ctx.type == "statement" && firstChar == "}") ctx = ctx.prev; + if (parserConfig.dontIndentStatements) + while (ctx.type == "statement" && parserConfig.dontIndentStatements.test(ctx.info)) + ctx = ctx.prev + if (hooks.indent) { + var hook = hooks.indent(state, ctx, textAfter); + if (typeof hook == "number") return hook + } + var closing = firstChar == ctx.type; + var switchBlock = ctx.prev && ctx.prev.info == "switch"; + if (parserConfig.allmanIndentation && /[{(]/.test(firstChar)) { + while (ctx.type != "top" && ctx.type != "}") ctx = ctx.prev + return ctx.indented + } + if (ctx.type == "statement") + return ctx.indented + (firstChar == "{" ? 0 : statementIndentUnit); + if (ctx.align && (!dontAlignCalls || ctx.type != ")")) + return ctx.column + (closing ? 0 : 1); + if (ctx.type == ")" && !closing) + return ctx.indented + statementIndentUnit; + + return ctx.indented + (closing ? 0 : indentUnit) + + (!closing && switchBlock && !/^(?:case|default)\b/.test(textAfter) ? indentUnit : 0); + }, + + electricInput: indentSwitch ? /^\s*(?:case .*?:|default:|\{\}?|\})$/ : /^\s*[{}]$/, + blockCommentStart: "/*", + blockCommentEnd: "*/", + lineComment: "//", + fold: "brace" + }; +}); + + function words(str) { + var obj = {}, words = str.split(" "); + for (var i = 0; i < words.length; ++i) obj[words[i]] = true; + return obj; + } + function contains(words, word) { + if (typeof words === "function") { + return words(word); + } else { + return words.propertyIsEnumerable(word); + } + } + var cKeywords = "auto if break case register continue return default do sizeof " + + "static else struct switch extern typedef union for goto while enum const volatile"; + var cTypes = "int long char short double float unsigned signed void size_t ptrdiff_t"; + + function cppHook(stream, state) { + if (!state.startOfLine) return false + for (var ch, next = null; ch = stream.peek();) { + if (ch == "\\" && stream.match(/^.$/)) { + next = cppHook + break + } else if (ch == "/" && stream.match(/^\/[\/\*]/, false)) { + break + } + stream.next() + } + state.tokenize = next + return "meta" + } + + function pointerHook(_stream, state) { + if (state.prevToken == "type") return "type"; + return false; + } + + function cpp14Literal(stream) { + stream.eatWhile(/[\w\.']/); + return "number"; + } + + function cpp11StringHook(stream, state) { + stream.backUp(1); + // Raw strings. + if (stream.match(/(R|u8R|uR|UR|LR)/)) { + var match = stream.match(/"([^\s\\()]{0,16})\(/); + if (!match) { + return false; + } + state.cpp11RawStringDelim = match[1]; + state.tokenize = tokenRawString; + return tokenRawString(stream, state); + } + // Unicode strings/chars. + if (stream.match(/(u8|u|U|L)/)) { + if (stream.match(/["']/, /* eat */ false)) { + return "string"; + } + return false; + } + // Ignore this hook. + stream.next(); + return false; + } + + function cppLooksLikeConstructor(word) { + var lastTwo = /(\w+)::~?(\w+)$/.exec(word); + return lastTwo && lastTwo[1] == lastTwo[2]; + } + + // C#-style strings where "" escapes a quote. + function tokenAtString(stream, state) { + var next; + while ((next = stream.next()) != null) { + if (next == '"' && !stream.eat('"')) { + state.tokenize = null; + break; + } + } + return "string"; + } + + // C++11 raw string literal is "( anything )", where + // can be a string up to 16 characters long. + function tokenRawString(stream, state) { + // Escape characters that have special regex meanings. + var delim = state.cpp11RawStringDelim.replace(/[^\w\s]/g, '\\$&'); + var match = stream.match(new RegExp(".*?\\)" + delim + '"')); + if (match) + state.tokenize = null; + else + stream.skipToEnd(); + return "string"; + } + + function def(mimes, mode) { + if (typeof mimes == "string") mimes = [mimes]; + var words = []; + function add(obj) { + if (obj) for (var prop in obj) if (obj.hasOwnProperty(prop)) + words.push(prop); + } + add(mode.keywords); + add(mode.types); + add(mode.builtin); + add(mode.atoms); + if (words.length) { + mode.helperType = mimes[0]; + CodeMirror.registerHelper("hintWords", mimes[0], words); + } + + for (var i = 0; i < mimes.length; ++i) + CodeMirror.defineMIME(mimes[i], mode); + } + + def(["text/x-csrc", "text/x-c", "text/x-chdr"], { + name: "clike", + keywords: words(cKeywords), + types: words(cTypes + " bool _Complex _Bool float_t double_t intptr_t intmax_t " + + "int8_t int16_t int32_t int64_t uintptr_t uintmax_t uint8_t uint16_t " + + "uint32_t uint64_t"), + blockKeywords: words("case do else for if switch while struct"), + defKeywords: words("struct"), + typeFirstDefinitions: true, + atoms: words("null true false"), + hooks: {"#": cppHook, "*": pointerHook}, + modeProps: {fold: ["brace", "include"]} + }); + + def(["text/x-c++src", "text/x-c++hdr"], { + name: "clike", + keywords: words(cKeywords + " asm dynamic_cast namespace reinterpret_cast try explicit new " + + "static_cast typeid catch operator template typename class friend private " + + "this using const_cast inline public throw virtual delete mutable protected " + + "alignas alignof constexpr decltype nullptr noexcept thread_local final " + + "static_assert override"), + types: words(cTypes + " bool wchar_t"), + blockKeywords: words("catch class do else finally for if struct switch try while"), + defKeywords: words("class namespace struct enum union"), + typeFirstDefinitions: true, + atoms: words("true false null"), + dontIndentStatements: /^template$/, + isIdentifierChar: /[\w\$_~\xa1-\uffff]/, + hooks: { + "#": cppHook, + "*": pointerHook, + "u": cpp11StringHook, + "U": cpp11StringHook, + "L": cpp11StringHook, + "R": cpp11StringHook, + "0": cpp14Literal, + "1": cpp14Literal, + "2": cpp14Literal, + "3": cpp14Literal, + "4": cpp14Literal, + "5": cpp14Literal, + "6": cpp14Literal, + "7": cpp14Literal, + "8": cpp14Literal, + "9": cpp14Literal, + token: function(stream, state, style) { + if (style == "variable" && stream.peek() == "(" && + (state.prevToken == ";" || state.prevToken == null || + state.prevToken == "}") && + cppLooksLikeConstructor(stream.current())) + return "def"; + } + }, + namespaceSeparator: "::", + modeProps: {fold: ["brace", "include"]} + }); + + def("text/x-java", { + name: "clike", + keywords: words("abstract assert break case catch class const continue default " + + "do else enum extends final finally float for goto if implements import " + + "instanceof interface native new package private protected public " + + "return static strictfp super switch synchronized this throw throws transient " + + "try volatile while @interface"), + types: words("byte short int long float double boolean char void Boolean Byte Character Double Float " + + "Integer Long Number Object Short String StringBuffer StringBuilder Void"), + blockKeywords: words("catch class do else finally for if switch try while"), + defKeywords: words("class interface package enum @interface"), + typeFirstDefinitions: true, + atoms: words("true false null"), + number: /^(?:0x[a-f\d_]+|0b[01_]+|(?:[\d_]+\.?\d*|\.\d+)(?:e[-+]?[\d_]+)?)(u|ll?|l|f)?/i, + hooks: { + "@": function(stream) { + // Don't match the @interface keyword. + if (stream.match('interface', false)) return false; + + stream.eatWhile(/[\w\$_]/); + return "meta"; + } + }, + modeProps: {fold: ["brace", "import"]} + }); + + def("text/x-csharp", { + name: "clike", + keywords: words("abstract as async await base break case catch checked class const continue" + + " default delegate do else enum event explicit extern finally fixed for" + + " foreach goto if implicit in interface internal is lock namespace new" + + " operator out override params private protected public readonly ref return sealed" + + " sizeof stackalloc static struct switch this throw try typeof unchecked" + + " unsafe using virtual void volatile while add alias ascending descending dynamic from get" + + " global group into join let orderby partial remove select set value var yield"), + types: words("Action Boolean Byte Char DateTime DateTimeOffset Decimal Double Func" + + " Guid Int16 Int32 Int64 Object SByte Single String Task TimeSpan UInt16 UInt32" + + " UInt64 bool byte char decimal double short int long object" + + " sbyte float string ushort uint ulong"), + blockKeywords: words("catch class do else finally for foreach if struct switch try while"), + defKeywords: words("class interface namespace struct var"), + typeFirstDefinitions: true, + atoms: words("true false null"), + hooks: { + "@": function(stream, state) { + if (stream.eat('"')) { + state.tokenize = tokenAtString; + return tokenAtString(stream, state); + } + stream.eatWhile(/[\w\$_]/); + return "meta"; + } + } + }); + + function tokenTripleString(stream, state) { + var escaped = false; + while (!stream.eol()) { + if (!escaped && stream.match('"""')) { + state.tokenize = null; + break; + } + escaped = stream.next() == "\\" && !escaped; + } + return "string"; + } + + def("text/x-scala", { + name: "clike", + keywords: words( + + /* scala */ + "abstract case catch class def do else extends final finally for forSome if " + + "implicit import lazy match new null object override package private protected return " + + "sealed super this throw trait try type val var while with yield _ " + + + /* package scala */ + "assert assume require print println printf readLine readBoolean readByte readShort " + + "readChar readInt readLong readFloat readDouble" + ), + types: words( + "AnyVal App Application Array BufferedIterator BigDecimal BigInt Char Console Either " + + "Enumeration Equiv Error Exception Fractional Function IndexedSeq Int Integral Iterable " + + "Iterator List Map Numeric Nil NotNull Option Ordered Ordering PartialFunction PartialOrdering " + + "Product Proxy Range Responder Seq Serializable Set Specializable Stream StringBuilder " + + "StringContext Symbol Throwable Traversable TraversableOnce Tuple Unit Vector " + + + /* package java.lang */ + "Boolean Byte Character CharSequence Class ClassLoader Cloneable Comparable " + + "Compiler Double Exception Float Integer Long Math Number Object Package Pair Process " + + "Runtime Runnable SecurityManager Short StackTraceElement StrictMath String " + + "StringBuffer System Thread ThreadGroup ThreadLocal Throwable Triple Void" + ), + multiLineStrings: true, + blockKeywords: words("catch class enum do else finally for forSome if match switch try while"), + defKeywords: words("class enum def object package trait type val var"), + atoms: words("true false null"), + indentStatements: false, + indentSwitch: false, + isOperatorChar: /[+\-*&%=<>!?|\/#:@]/, + hooks: { + "@": function(stream) { + stream.eatWhile(/[\w\$_]/); + return "meta"; + }, + '"': function(stream, state) { + if (!stream.match('""')) return false; + state.tokenize = tokenTripleString; + return state.tokenize(stream, state); + }, + "'": function(stream) { + stream.eatWhile(/[\w\$_\xa1-\uffff]/); + return "atom"; + }, + "=": function(stream, state) { + var cx = state.context + if (cx.type == "}" && cx.align && stream.eat(">")) { + state.context = new Context(cx.indented, cx.column, cx.type, cx.info, null, cx.prev) + return "operator" + } else { + return false + } + } + }, + modeProps: {closeBrackets: {triples: '"'}} + }); + + function tokenKotlinString(tripleString){ + return function (stream, state) { + var escaped = false, next, end = false; + while (!stream.eol()) { + if (!tripleString && !escaped && stream.match('"') ) {end = true; break;} + if (tripleString && stream.match('"""')) {end = true; break;} + next = stream.next(); + if(!escaped && next == "$" && stream.match('{')) + stream.skipTo("}"); + escaped = !escaped && next == "\\" && !tripleString; + } + if (end || !tripleString) + state.tokenize = null; + return "string"; + } + } + + def("text/x-kotlin", { + name: "clike", + keywords: words( + /*keywords*/ + "package as typealias class interface this super val " + + "var fun for is in This throw return " + + "break continue object if else while do try when !in !is as? " + + + /*soft keywords*/ + "file import where by get set abstract enum open inner override private public internal " + + "protected catch finally out final vararg reified dynamic companion constructor init " + + "sealed field property receiver param sparam lateinit data inline noinline tailrec " + + "external annotation crossinline const operator infix suspend" + ), + types: words( + /* package java.lang */ + "Boolean Byte Character CharSequence Class ClassLoader Cloneable Comparable " + + "Compiler Double Exception Float Integer Long Math Number Object Package Pair Process " + + "Runtime Runnable SecurityManager Short StackTraceElement StrictMath String " + + "StringBuffer System Thread ThreadGroup ThreadLocal Throwable Triple Void" + ), + intendSwitch: false, + indentStatements: false, + multiLineStrings: true, + number: /^(?:0x[a-f\d_]+|0b[01_]+|(?:[\d_]+\.?\d*|\.\d+)(?:e[-+]?[\d_]+)?)(u|ll?|l|f)?/i, + blockKeywords: words("catch class do else finally for if where try while enum"), + defKeywords: words("class val var object package interface fun"), + atoms: words("true false null this"), + hooks: { + '"': function(stream, state) { + state.tokenize = tokenKotlinString(stream.match('""')); + return state.tokenize(stream, state); + } + }, + modeProps: {closeBrackets: {triples: '"'}} + }); + + def(["x-shader/x-vertex", "x-shader/x-fragment"], { + name: "clike", + keywords: words("sampler1D sampler2D sampler3D samplerCube " + + "sampler1DShadow sampler2DShadow " + + "const attribute uniform varying " + + "break continue discard return " + + "for while do if else struct " + + "in out inout"), + types: words("float int bool void " + + "vec2 vec3 vec4 ivec2 ivec3 ivec4 bvec2 bvec3 bvec4 " + + "mat2 mat3 mat4"), + blockKeywords: words("for while do if else struct"), + builtin: words("radians degrees sin cos tan asin acos atan " + + "pow exp log exp2 sqrt inversesqrt " + + "abs sign floor ceil fract mod min max clamp mix step smoothstep " + + "length distance dot cross normalize ftransform faceforward " + + "reflect refract matrixCompMult " + + "lessThan lessThanEqual greaterThan greaterThanEqual " + + "equal notEqual any all not " + + "texture1D texture1DProj texture1DLod texture1DProjLod " + + "texture2D texture2DProj texture2DLod texture2DProjLod " + + "texture3D texture3DProj texture3DLod texture3DProjLod " + + "textureCube textureCubeLod " + + "shadow1D shadow2D shadow1DProj shadow2DProj " + + "shadow1DLod shadow2DLod shadow1DProjLod shadow2DProjLod " + + "dFdx dFdy fwidth " + + "noise1 noise2 noise3 noise4"), + atoms: words("true false " + + "gl_FragColor gl_SecondaryColor gl_Normal gl_Vertex " + + "gl_MultiTexCoord0 gl_MultiTexCoord1 gl_MultiTexCoord2 gl_MultiTexCoord3 " + + "gl_MultiTexCoord4 gl_MultiTexCoord5 gl_MultiTexCoord6 gl_MultiTexCoord7 " + + "gl_FogCoord gl_PointCoord " + + "gl_Position gl_PointSize gl_ClipVertex " + + "gl_FrontColor gl_BackColor gl_FrontSecondaryColor gl_BackSecondaryColor " + + "gl_TexCoord gl_FogFragCoord " + + "gl_FragCoord gl_FrontFacing " + + "gl_FragData gl_FragDepth " + + "gl_ModelViewMatrix gl_ProjectionMatrix gl_ModelViewProjectionMatrix " + + "gl_TextureMatrix gl_NormalMatrix gl_ModelViewMatrixInverse " + + "gl_ProjectionMatrixInverse gl_ModelViewProjectionMatrixInverse " + + "gl_TexureMatrixTranspose gl_ModelViewMatrixInverseTranspose " + + "gl_ProjectionMatrixInverseTranspose " + + "gl_ModelViewProjectionMatrixInverseTranspose " + + "gl_TextureMatrixInverseTranspose " + + "gl_NormalScale gl_DepthRange gl_ClipPlane " + + "gl_Point gl_FrontMaterial gl_BackMaterial gl_LightSource gl_LightModel " + + "gl_FrontLightModelProduct gl_BackLightModelProduct " + + "gl_TextureColor gl_EyePlaneS gl_EyePlaneT gl_EyePlaneR gl_EyePlaneQ " + + "gl_FogParameters " + + "gl_MaxLights gl_MaxClipPlanes gl_MaxTextureUnits gl_MaxTextureCoords " + + "gl_MaxVertexAttribs gl_MaxVertexUniformComponents gl_MaxVaryingFloats " + + "gl_MaxVertexTextureImageUnits gl_MaxTextureImageUnits " + + "gl_MaxFragmentUniformComponents gl_MaxCombineTextureImageUnits " + + "gl_MaxDrawBuffers"), + indentSwitch: false, + hooks: {"#": cppHook}, + modeProps: {fold: ["brace", "include"]} + }); + + def("text/x-nesc", { + name: "clike", + keywords: words(cKeywords + "as atomic async call command component components configuration event generic " + + "implementation includes interface module new norace nx_struct nx_union post provides " + + "signal task uses abstract extends"), + types: words(cTypes), + blockKeywords: words("case do else for if switch while struct"), + atoms: words("null true false"), + hooks: {"#": cppHook}, + modeProps: {fold: ["brace", "include"]} + }); + + def("text/x-objectivec", { + name: "clike", + keywords: words(cKeywords + "inline restrict _Bool _Complex _Imaginary BOOL Class bycopy byref id IMP in " + + "inout nil oneway out Protocol SEL self super atomic nonatomic retain copy readwrite readonly"), + types: words(cTypes), + atoms: words("YES NO NULL NILL ON OFF true false"), + hooks: { + "@": function(stream) { + stream.eatWhile(/[\w\$]/); + return "keyword"; + }, + "#": cppHook, + indent: function(_state, ctx, textAfter) { + if (ctx.type == "statement" && /^@\w/.test(textAfter)) return ctx.indented + } + }, + modeProps: {fold: "brace"} + }); + + def("text/x-squirrel", { + name: "clike", + keywords: words("base break clone continue const default delete enum extends function in class" + + " foreach local resume return this throw typeof yield constructor instanceof static"), + types: words(cTypes), + blockKeywords: words("case catch class else for foreach if switch try while"), + defKeywords: words("function local class"), + typeFirstDefinitions: true, + atoms: words("true false null"), + hooks: {"#": cppHook}, + modeProps: {fold: ["brace", "include"]} + }); + + // Ceylon Strings need to deal with interpolation + var stringTokenizer = null; + function tokenCeylonString(type) { + return function(stream, state) { + var escaped = false, next, end = false; + while (!stream.eol()) { + if (!escaped && stream.match('"') && + (type == "single" || stream.match('""'))) { + end = true; + break; + } + if (!escaped && stream.match('``')) { + stringTokenizer = tokenCeylonString(type); + end = true; + break; + } + next = stream.next(); + escaped = type == "single" && !escaped && next == "\\"; + } + if (end) + state.tokenize = null; + return "string"; + } + } + + def("text/x-ceylon", { + name: "clike", + keywords: words("abstracts alias assembly assert assign break case catch class continue dynamic else" + + " exists extends finally for function given if import in interface is let module new" + + " nonempty object of out outer package return satisfies super switch then this throw" + + " try value void while"), + types: function(word) { + // In Ceylon all identifiers that start with an uppercase are types + var first = word.charAt(0); + return (first === first.toUpperCase() && first !== first.toLowerCase()); + }, + blockKeywords: words("case catch class dynamic else finally for function if interface module new object switch try while"), + defKeywords: words("class dynamic function interface module object package value"), + builtin: words("abstract actual aliased annotation by default deprecated doc final formal late license" + + " native optional sealed see serializable shared suppressWarnings tagged throws variable"), + isPunctuationChar: /[\[\]{}\(\),;\:\.`]/, + isOperatorChar: /[+\-*&%=<>!?|^~:\/]/, + numberStart: /[\d#$]/, + number: /^(?:#[\da-fA-F_]+|\$[01_]+|[\d_]+[kMGTPmunpf]?|[\d_]+\.[\d_]+(?:[eE][-+]?\d+|[kMGTPmunpf]|)|)/i, + multiLineStrings: true, + typeFirstDefinitions: true, + atoms: words("true false null larger smaller equal empty finished"), + indentSwitch: false, + styleDefs: false, + hooks: { + "@": function(stream) { + stream.eatWhile(/[\w\$_]/); + return "meta"; + }, + '"': function(stream, state) { + state.tokenize = tokenCeylonString(stream.match('""') ? "triple" : "single"); + return state.tokenize(stream, state); + }, + '`': function(stream, state) { + if (!stringTokenizer || !stream.match('`')) return false; + state.tokenize = stringTokenizer; + stringTokenizer = null; + return state.tokenize(stream, state); + }, + "'": function(stream) { + stream.eatWhile(/[\w\$_\xa1-\uffff]/); + return "atom"; + }, + token: function(_stream, state, style) { + if ((style == "variable" || style == "type") && + state.prevToken == ".") { + return "variable-2"; + } + } + }, + modeProps: { + fold: ["brace", "import"], + closeBrackets: {triples: '"'} + } + }); + +}); diff --git a/pigx-register/src/main/resources/static/console-ui/public/js/codemirror.lib.json-lint.js b/pigx-register/src/main/resources/static/console-ui/public/js/codemirror.lib.json-lint.js new file mode 100644 index 0000000..dc89bd8 --- /dev/null +++ b/pigx-register/src/main/resources/static/console-ui/public/js/codemirror.lib.json-lint.js @@ -0,0 +1,448 @@ +/* + * Copyright 1999-2018 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* Jison generated parser */ +var jsonlint = (function(){ +var parser = {trace: function trace() { }, +yy: {}, +symbols_: {"error":2,"JSONString":3,"STRING":4,"JSONNumber":5,"NUMBER":6,"JSONNullLiteral":7,"NULL":8,"JSONBooleanLiteral":9,"TRUE":10,"FALSE":11,"JSONText":12,"JSONValue":13,"EOF":14,"JSONObject":15,"JSONArray":16,"{":17,"}":18,"JSONMemberList":19,"JSONMember":20,":":21,",":22,"[":23,"]":24,"JSONElementList":25,"$accept":0,"$end":1}, +terminals_: {2:"error",4:"STRING",6:"NUMBER",8:"NULL",10:"TRUE",11:"FALSE",14:"EOF",17:"{",18:"}",21:":",22:",",23:"[",24:"]"}, +productions_: [0,[3,1],[5,1],[7,1],[9,1],[9,1],[12,2],[13,1],[13,1],[13,1],[13,1],[13,1],[13,1],[15,2],[15,3],[20,3],[19,1],[19,3],[16,2],[16,3],[25,1],[25,3]], +performAction: function anonymous(yytext,yyleng,yylineno,yy,yystate,$$,_$) { + +var $0 = $$.length - 1; +switch (yystate) { +case 1: // replace escaped characters with actual character + this.$ = yytext.replace(/\\(\\|")/g, "$"+"1") + .replace(/\\n/g,'\n') + .replace(/\\r/g,'\r') + .replace(/\\t/g,'\t') + .replace(/\\v/g,'\v') + .replace(/\\f/g,'\f') + .replace(/\\b/g,'\b'); + +break; +case 2:this.$ = Number(yytext); +break; +case 3:this.$ = null; +break; +case 4:this.$ = true; +break; +case 5:this.$ = false; +break; +case 6:return this.$ = $$[$0-1]; +break; +case 13:this.$ = {}; +break; +case 14:this.$ = $$[$0-1]; +break; +case 15:this.$ = [$$[$0-2], $$[$0]]; +break; +case 16:this.$ = {}; this.$[$$[$0][0]] = $$[$0][1]; +break; +case 17:this.$ = $$[$0-2]; $$[$0-2][$$[$0][0]] = $$[$0][1]; +break; +case 18:this.$ = []; +break; +case 19:this.$ = $$[$0-1]; +break; +case 20:this.$ = [$$[$0]]; +break; +case 21:this.$ = $$[$0-2]; $$[$0-2].push($$[$0]); +break; +} +}, +table: [{3:5,4:[1,12],5:6,6:[1,13],7:3,8:[1,9],9:4,10:[1,10],11:[1,11],12:1,13:2,15:7,16:8,17:[1,14],23:[1,15]},{1:[3]},{14:[1,16]},{14:[2,7],18:[2,7],22:[2,7],24:[2,7]},{14:[2,8],18:[2,8],22:[2,8],24:[2,8]},{14:[2,9],18:[2,9],22:[2,9],24:[2,9]},{14:[2,10],18:[2,10],22:[2,10],24:[2,10]},{14:[2,11],18:[2,11],22:[2,11],24:[2,11]},{14:[2,12],18:[2,12],22:[2,12],24:[2,12]},{14:[2,3],18:[2,3],22:[2,3],24:[2,3]},{14:[2,4],18:[2,4],22:[2,4],24:[2,4]},{14:[2,5],18:[2,5],22:[2,5],24:[2,5]},{14:[2,1],18:[2,1],21:[2,1],22:[2,1],24:[2,1]},{14:[2,2],18:[2,2],22:[2,2],24:[2,2]},{3:20,4:[1,12],18:[1,17],19:18,20:19},{3:5,4:[1,12],5:6,6:[1,13],7:3,8:[1,9],9:4,10:[1,10],11:[1,11],13:23,15:7,16:8,17:[1,14],23:[1,15],24:[1,21],25:22},{1:[2,6]},{14:[2,13],18:[2,13],22:[2,13],24:[2,13]},{18:[1,24],22:[1,25]},{18:[2,16],22:[2,16]},{21:[1,26]},{14:[2,18],18:[2,18],22:[2,18],24:[2,18]},{22:[1,28],24:[1,27]},{22:[2,20],24:[2,20]},{14:[2,14],18:[2,14],22:[2,14],24:[2,14]},{3:20,4:[1,12],20:29},{3:5,4:[1,12],5:6,6:[1,13],7:3,8:[1,9],9:4,10:[1,10],11:[1,11],13:30,15:7,16:8,17:[1,14],23:[1,15]},{14:[2,19],18:[2,19],22:[2,19],24:[2,19]},{3:5,4:[1,12],5:6,6:[1,13],7:3,8:[1,9],9:4,10:[1,10],11:[1,11],13:31,15:7,16:8,17:[1,14],23:[1,15]},{18:[2,17],22:[2,17]},{18:[2,15],22:[2,15]},{22:[2,21],24:[2,21]}], +defaultActions: {16:[2,6]}, +parseError: function parseError(str, hash) { + throw new Error(str); +}, +parse: function parse(input) { + var self = this, + stack = [0], + vstack = [null], // semantic value stack + lstack = [], // location stack + table = this.table, + yytext = '', + yylineno = 0, + yyleng = 0, + recovering = 0, + TERROR = 2, + EOF = 1; + + //this.reductionCount = this.shiftCount = 0; + + this.lexer.setInput(input); + this.lexer.yy = this.yy; + this.yy.lexer = this.lexer; + if (typeof this.lexer.yylloc == 'undefined') + this.lexer.yylloc = {}; + var yyloc = this.lexer.yylloc; + lstack.push(yyloc); + + if (typeof this.yy.parseError === 'function') + this.parseError = this.yy.parseError; + + function popStack (n) { + stack.length = stack.length - 2*n; + vstack.length = vstack.length - n; + lstack.length = lstack.length - n; + } + + function lex() { + var token; + token = self.lexer.lex() || 1; // $end = 1 + // if token isn't its numeric value, convert + if (typeof token !== 'number') { + token = self.symbols_[token] || token; + } + return token; + } + + var symbol, preErrorSymbol, state, action, a, r, yyval={},p,len,newState, expected; + while (true) { + // retreive state number from top of stack + state = stack[stack.length-1]; + + // use default actions if available + if (this.defaultActions[state]) { + action = this.defaultActions[state]; + } else { + if (symbol == null) + symbol = lex(); + // read action for current state and first input + action = table[state] && table[state][symbol]; + } + + // handle parse error + _handle_error: + if (typeof action === 'undefined' || !action.length || !action[0]) { + + if (!recovering) { + // Report error + expected = []; + for (p in table[state]) if (this.terminals_[p] && p > 2) { + expected.push("'"+this.terminals_[p]+"'"); + } + var errStr = ''; + if (this.lexer.showPosition) { + errStr = 'Parse error on line '+(yylineno+1)+":\n"+this.lexer.showPosition()+"\nExpecting "+expected.join(', ') + ", got '" + this.terminals_[symbol]+ "'"; + } else { + errStr = 'Parse error on line '+(yylineno+1)+": Unexpected " + + (symbol == 1 /*EOF*/ ? "end of input" : + ("'"+(this.terminals_[symbol] || symbol)+"'")); + } + this.parseError(errStr, + {text: this.lexer.match, token: this.terminals_[symbol] || symbol, line: this.lexer.yylineno, loc: yyloc, expected: expected}); + } + + // just recovered from another error + if (recovering == 3) { + if (symbol == EOF) { + throw new Error(errStr || 'Parsing halted.'); + } + + // discard current lookahead and grab another + yyleng = this.lexer.yyleng; + yytext = this.lexer.yytext; + yylineno = this.lexer.yylineno; + yyloc = this.lexer.yylloc; + symbol = lex(); + } + + // try to recover from error + while (1) { + // check for error recovery rule in this state + if ((TERROR.toString()) in table[state]) { + break; + } + if (state == 0) { + throw new Error(errStr || 'Parsing halted.'); + } + popStack(1); + state = stack[stack.length-1]; + } + + preErrorSymbol = symbol; // save the lookahead token + symbol = TERROR; // insert generic error symbol as new lookahead + state = stack[stack.length-1]; + action = table[state] && table[state][TERROR]; + recovering = 3; // allow 3 real symbols to be shifted before reporting a new error + } + + // this shouldn't happen, unless resolve defaults are off + if (action[0] instanceof Array && action.length > 1) { + throw new Error('Parse Error: multiple actions possible at state: '+state+', token: '+symbol); + } + + switch (action[0]) { + + case 1: // shift + //this.shiftCount++; + + stack.push(symbol); + vstack.push(this.lexer.yytext); + lstack.push(this.lexer.yylloc); + stack.push(action[1]); // push state + symbol = null; + if (!preErrorSymbol) { // normal execution/no error + yyleng = this.lexer.yyleng; + yytext = this.lexer.yytext; + yylineno = this.lexer.yylineno; + yyloc = this.lexer.yylloc; + if (recovering > 0) + recovering--; + } else { // error just occurred, resume old lookahead f/ before error + symbol = preErrorSymbol; + preErrorSymbol = null; + } + break; + + case 2: // reduce + //this.reductionCount++; + + len = this.productions_[action[1]][1]; + + // perform semantic action + yyval.$ = vstack[vstack.length-len]; // default to $$ = $1 + // default location, uses first token for firsts, last for lasts + yyval._$ = { + first_line: lstack[lstack.length-(len||1)].first_line, + last_line: lstack[lstack.length-1].last_line, + first_column: lstack[lstack.length-(len||1)].first_column, + last_column: lstack[lstack.length-1].last_column + }; + r = this.performAction.call(yyval, yytext, yyleng, yylineno, this.yy, action[1], vstack, lstack); + + if (typeof r !== 'undefined') { + return r; + } + + // pop off stack + if (len) { + stack = stack.slice(0,-1*len*2); + vstack = vstack.slice(0, -1*len); + lstack = lstack.slice(0, -1*len); + } + + stack.push(this.productions_[action[1]][0]); // push nonterminal (reduce) + vstack.push(yyval.$); + lstack.push(yyval._$); + // goto new state = table[STATE][NONTERMINAL] + newState = table[stack[stack.length-2]][stack[stack.length-1]]; + stack.push(newState); + break; + + case 3: // accept + return true; + } + + } + + return true; +}}; +/* Jison generated lexer */ +var lexer = (function(){ +var lexer = ({EOF:1, +parseError:function parseError(str, hash) { + if (this.yy.parseError) { + this.yy.parseError(str, hash); + } else { + throw new Error(str); + } + }, +setInput:function (input) { + this._input = input; + this._more = this._less = this.done = false; + this.yylineno = this.yyleng = 0; + this.yytext = this.matched = this.match = ''; + this.conditionStack = ['INITIAL']; + this.yylloc = {first_line:1,first_column:0,last_line:1,last_column:0}; + return this; + }, +input:function () { + var ch = this._input[0]; + this.yytext+=ch; + this.yyleng++; + this.match+=ch; + this.matched+=ch; + var lines = ch.match(/\n/); + if (lines) this.yylineno++; + this._input = this._input.slice(1); + return ch; + }, +unput:function (ch) { + this._input = ch + this._input; + return this; + }, +more:function () { + this._more = true; + return this; + }, +less:function (n) { + this._input = this.match.slice(n) + this._input; + }, +pastInput:function () { + var past = this.matched.substr(0, this.matched.length - this.match.length); + return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\n/g, ""); + }, +upcomingInput:function () { + var next = this.match; + if (next.length < 20) { + next += this._input.substr(0, 20-next.length); + } + return (next.substr(0,20)+(next.length > 20 ? '...':'')).replace(/\n/g, ""); + }, +showPosition:function () { + var pre = this.pastInput(); + var c = new Array(pre.length + 1).join("-"); + return pre + this.upcomingInput() + "\n" + c+"^"; + }, +next:function () { + if (this.done) { + return this.EOF; + } + if (!this._input) this.done = true; + + var token, + match, + tempMatch, + index, + col, + lines; + if (!this._more) { + this.yytext = ''; + this.match = ''; + } + var rules = this._currentRules(); + for (var i=0;i < rules.length; i++) { + tempMatch = this._input.match(this.rules[rules[i]]); + if (tempMatch && (!match || tempMatch[0].length > match[0].length)) { + match = tempMatch; + index = i; + if (!this.options.flex) break; + } + } + if (match) { + lines = match[0].match(/\n.*/g); + if (lines) this.yylineno += lines.length; + this.yylloc = {first_line: this.yylloc.last_line, + last_line: this.yylineno+1, + first_column: this.yylloc.last_column, + last_column: lines ? lines[lines.length-1].length-1 : this.yylloc.last_column + match[0].length} + this.yytext += match[0]; + this.match += match[0]; + this.yyleng = this.yytext.length; + this._more = false; + this._input = this._input.slice(match[0].length); + this.matched += match[0]; + token = this.performAction.call(this, this.yy, this, rules[index],this.conditionStack[this.conditionStack.length-1]); + if (this.done && this._input) this.done = false; + if (token) return token; + else return; + } + if (this._input === "") { + return this.EOF; + } else { + this.parseError('Lexical error on line '+(this.yylineno+1)+'. Unrecognized text.\n'+this.showPosition(), + {text: "", token: null, line: this.yylineno}); + } + }, +lex:function lex() { + var r = this.next(); + if (typeof r !== 'undefined') { + return r; + } else { + return this.lex(); + } + }, +begin:function begin(condition) { + this.conditionStack.push(condition); + }, +popState:function popState() { + return this.conditionStack.pop(); + }, +_currentRules:function _currentRules() { + return this.conditions[this.conditionStack[this.conditionStack.length-1]].rules; + }, +topState:function () { + return this.conditionStack[this.conditionStack.length-2]; + }, +pushState:function begin(condition) { + this.begin(condition); + }}); +lexer.options = {}; +lexer.performAction = function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) { + +var YYSTATE=YY_START +switch($avoiding_name_collisions) { +case 0:/* skip whitespace */ +break; +case 1:return 6 +break; +case 2:yy_.yytext = yy_.yytext.substr(1,yy_.yyleng-2); return 4 +break; +case 3:return 17 +break; +case 4:return 18 +break; +case 5:return 23 +break; +case 6:return 24 +break; +case 7:return 22 +break; +case 8:return 21 +break; +case 9:return 10 +break; +case 10:return 11 +break; +case 11:return 8 +break; +case 12:return 14 +break; +case 13:return 'INVALID' +break; +} +}; +lexer.rules = [/^(?:\s+)/,/^(?:(-?([0-9]|[1-9][0-9]+))(\.[0-9]+)?([eE][-+]?[0-9]+)?\b)/,/^(?:"(?:\\[\\"bfnrt/]|\\u[a-fA-F0-9]{4}|[^\\\0-\x09\x0a-\x1f"])*")/,/^(?:\{)/,/^(?:\})/,/^(?:\[)/,/^(?:\])/,/^(?:,)/,/^(?::)/,/^(?:true\b)/,/^(?:false\b)/,/^(?:null\b)/,/^(?:$)/,/^(?:.)/]; +lexer.conditions = {"INITIAL":{"rules":[0,1,2,3,4,5,6,7,8,9,10,11,12,13],"inclusive":true}}; + + +; +return lexer;})() +parser.lexer = lexer; +return parser; +})(); +if (typeof require !== 'undefined' && typeof exports !== 'undefined') { +exports.parser = jsonlint; +exports.parse = function () { return jsonlint.parse.apply(jsonlint, arguments); } +exports.main = function commonjsMain(args) { + if (!args[1]) + throw new Error('Usage: '+args[0]+' FILE'); + if (typeof process !== 'undefined') { + var source = require('fs').readFileSync(require('path').join(process.cwd(), args[1]), "utf8"); + } else { + var cwd = require("file").path(require("file").cwd()); + var source = cwd.join(args[1]).read({charset: "utf-8"}); + } + return exports.parser.parse(source); +} +if (typeof module !== 'undefined' && require.main === module) { + exports.main(typeof process !== 'undefined' ? process.argv.slice(1) : require("system").args); +} +} diff --git a/pigx-register/src/main/resources/static/console-ui/public/js/diff_match_patch.js b/pigx-register/src/main/resources/static/console-ui/public/js/diff_match_patch.js new file mode 100644 index 0000000..b57edaa --- /dev/null +++ b/pigx-register/src/main/resources/static/console-ui/public/js/diff_match_patch.js @@ -0,0 +1,49 @@ +(function(){function diff_match_patch(){this.Diff_Timeout=1;this.Diff_EditCost=4;this.Match_Threshold=0.5;this.Match_Distance=1E3;this.Patch_DeleteThreshold=0.5;this.Patch_Margin=4;this.Match_MaxBits=32} +diff_match_patch.prototype.diff_main=function(a,b,c,d){"undefined"==typeof d&&(d=0>=this.Diff_Timeout?Number.MAX_VALUE:(new Date).getTime()+1E3*this.Diff_Timeout);if(null==a||null==b)throw Error("Null input. (diff_main)");if(a==b)return a?[[0,a]]:[];"undefined"==typeof c&&(c=!0);var e=c,f=this.diff_commonPrefix(a,b);c=a.substring(0,f);a=a.substring(f);b=b.substring(f);var f=this.diff_commonSuffix(a,b),g=a.substring(a.length-f);a=a.substring(0,a.length-f);b=b.substring(0,b.length-f);a=this.diff_compute_(a, +b,e,d);c&&a.unshift([0,c]);g&&a.push([0,g]);this.diff_cleanupMerge(a);return a}; +diff_match_patch.prototype.diff_compute_=function(a,b,c,d){if(!a)return[[1,b]];if(!b)return[[-1,a]];var e=a.length>b.length?a:b,f=a.length>b.length?b:a,g=e.indexOf(f);return-1!=g?(c=[[1,e.substring(0,g)],[0,f],[1,e.substring(g+f.length)]],a.length>b.length&&(c[0][0]=c[2][0]=-1),c):1==f.length?[[-1,a],[1,b]]:(e=this.diff_halfMatch_(a,b))?(f=e[0],a=e[1],g=e[2],b=e[3],e=e[4],f=this.diff_main(f,g,c,d),c=this.diff_main(a,b,c,d),f.concat([[0,e]],c)):c&&100c);v++){for(var n=-v+r;n<=v-t;n+=2){var l=g+n,m;m=n==-v||n!=v&&j[l-1]d)t+=2;else if(s>e)r+=2;else if(q&&(l=g+k-n,0<=l&&l= +u)return this.diff_bisectSplit_(a,b,m,s,c)}}for(n=-v+p;n<=v-w;n+=2){l=g+n;u=n==-v||n!=v&&i[l-1]d)w+=2;else if(m>e)p+=2;else if(!q&&(l=g+k-n,0<=l&&(l=u)))return this.diff_bisectSplit_(a,b,m,s,c)}}return[[-1,a],[1,b]]}; +diff_match_patch.prototype.diff_bisectSplit_=function(a,b,c,d,e){var f=a.substring(0,c),g=b.substring(0,d);a=a.substring(c);b=b.substring(d);f=this.diff_main(f,g,!1,e);e=this.diff_main(a,b,!1,e);return f.concat(e)}; +diff_match_patch.prototype.diff_linesToChars_=function(a,b){function c(a){for(var b="",c=0,f=-1,g=d.length;fd?a=a.substring(c-d):c=a.length?[h,j,n,l,g]:null}if(0>=this.Diff_Timeout)return null; +var d=a.length>b.length?a:b,e=a.length>b.length?b:a;if(4>d.length||2*e.lengthd[4].length?g:d:d:g;var j;a.length>b.length?(g=h[0],d=h[1],e=h[2],j=h[3]):(e=h[0],j=h[1],g=h[2],d=h[3]);h=h[4];return[g,d,e,j,h]}; +diff_match_patch.prototype.diff_cleanupSemantic=function(a){for(var b=!1,c=[],d=0,e=null,f=0,g=0,h=0,j=0,i=0;f=e){if(d>=b.length/2||d>=c.length/2)a.splice(f,0,[0,c.substring(0,d)]),a[f-1][1]=b.substring(0,b.length-d),a[f+1][1]=c.substring(d),f++}else if(e>=b.length/2||e>=c.length/2)a.splice(f,0,[0,b.substring(0,e)]),a[f-1][0]=1,a[f-1][1]=c.substring(0,c.length-e),a[f+1][0]=-1,a[f+1][1]=b.substring(e),f++;f++}f++}}; +diff_match_patch.prototype.diff_cleanupSemanticLossless=function(a){function b(a,b){if(!a||!b)return 6;var c=a.charAt(a.length-1),d=b.charAt(0),e=c.match(diff_match_patch.nonAlphaNumericRegex_),f=d.match(diff_match_patch.nonAlphaNumericRegex_),g=e&&c.match(diff_match_patch.whitespaceRegex_),h=f&&d.match(diff_match_patch.whitespaceRegex_),c=g&&c.match(diff_match_patch.linebreakRegex_),d=h&&d.match(diff_match_patch.linebreakRegex_),i=c&&a.match(diff_match_patch.blanklineEndRegex_),j=d&&b.match(diff_match_patch.blanklineStartRegex_); +return i||j?5:c||d?4:e&&!g&&h?3:g||h?2:e||f?1:0}for(var c=1;c=i&&(i=k,g=d,h=e,j=f)}a[c-1][1]!=g&&(g?a[c-1][1]=g:(a.splice(c-1,1),c--),a[c][1]= +h,j?a[c+1][1]=j:(a.splice(c+1,1),c--))}c++}};diff_match_patch.nonAlphaNumericRegex_=/[^a-zA-Z0-9]/;diff_match_patch.whitespaceRegex_=/\s/;diff_match_patch.linebreakRegex_=/[\r\n]/;diff_match_patch.blanklineEndRegex_=/\n\r?\n$/;diff_match_patch.blanklineStartRegex_=/^\r?\n\r?\n/; +diff_match_patch.prototype.diff_cleanupEfficiency=function(a){for(var b=!1,c=[],d=0,e=null,f=0,g=!1,h=!1,j=!1,i=!1;fb)break;e=c;f=d}return a.length!=g&&-1===a[g][0]?f:f+(b-e)}; +diff_match_patch.prototype.diff_prettyHtml=function(a){for(var b=[],c=/&/g,d=//g,f=/\n/g,g=0;g");switch(h){case 1:b[g]=''+j+"";break;case -1:b[g]=''+j+"";break;case 0:b[g]=""+j+""}}return b.join("")}; +diff_match_patch.prototype.diff_text1=function(a){for(var b=[],c=0;cthis.Match_MaxBits)throw Error("Pattern too long for this browser.");var e=this.match_alphabet_(b),f=this,g=this.Match_Threshold,h=a.indexOf(b,c);-1!=h&&(g=Math.min(d(0,h),g),h=a.lastIndexOf(b,c+b.length),-1!=h&&(g=Math.min(d(0,h),g)));for(var j=1<=i;p--){var w=e[a.charAt(p-1)];k[p]=0===t?(k[p+1]<<1|1)&w:(k[p+1]<<1|1)&w|((r[p+1]|r[p])<<1|1)|r[p+1];if(k[p]&j&&(w=d(t,p-1),w<=g))if(g=w,h=p-1,h>c)i=Math.max(1,2*c-h);else break}if(d(t+1,c)>g)break;r=k}return h}; +diff_match_patch.prototype.match_alphabet_=function(a){for(var b={},c=0;c=2*this.Patch_Margin&& +e&&(this.patch_addContext_(a,h),c.push(a),a=new diff_match_patch.patch_obj,e=0,h=d,f=g)}1!==i&&(f+=k.length);-1!==i&&(g+=k.length)}e&&(this.patch_addContext_(a,h),c.push(a));return c};diff_match_patch.prototype.patch_deepCopy=function(a){for(var b=[],c=0;cthis.Match_MaxBits){if(j=this.match_main(b,h.substring(0,this.Match_MaxBits),g),-1!=j&&(i=this.match_main(b,h.substring(h.length-this.Match_MaxBits),g+h.length-this.Match_MaxBits),-1==i||j>=i))j=-1}else j=this.match_main(b,h,g); +if(-1==j)e[f]=!1,d-=a[f].length2-a[f].length1;else if(e[f]=!0,d=j-g,g=-1==i?b.substring(j,j+h.length):b.substring(j,i+this.Match_MaxBits),h==g)b=b.substring(0,j)+this.diff_text2(a[f].diffs)+b.substring(j+h.length);else if(g=this.diff_main(h,g,!1),h.length>this.Match_MaxBits&&this.diff_levenshtein(g)/h.length>this.Patch_DeleteThreshold)e[f]=!1;else{this.diff_cleanupSemanticLossless(g);for(var h=0,k,i=0;ie[0][1].length){var f=b-e[0][1].length;e[0][1]=c.substring(e[0][1].length)+e[0][1];d.start1-=f;d.start2-=f;d.length1+=f;d.length2+=f}d=a[a.length-1];e=d.diffs;0==e.length||0!=e[e.length-1][0]?(e.push([0, +c]),d.length1+=b,d.length2+=b):b>e[e.length-1][1].length&&(f=b-e[e.length-1][1].length,e[e.length-1][1]+=c.substring(0,f),d.length1+=f,d.length2+=f);return c}; +diff_match_patch.prototype.patch_splitMax=function(a){for(var b=this.Match_MaxBits,c=0;c2*b?(h.length1+=i.length,e+=i.length,j=!1,h.diffs.push([g,i]),d.diffs.shift()):(i=i.substring(0,b-h.length1-this.Patch_Margin),h.length1+=i.length,e+=i.length,0===g?(h.length2+=i.length,f+=i.length):j=!1,h.diffs.push([g,i]),i==d.diffs[0][1]?d.diffs.shift():d.diffs[0][1]=d.diffs[0][1].substring(i.length))}g=this.diff_text2(h.diffs);g=g.substring(g.length-this.Patch_Margin);i=this.diff_text1(d.diffs).substring(0,this.Patch_Margin);""!==i&& +(h.length1+=i.length,h.length2+=i.length,0!==h.diffs.length&&0===h.diffs[h.diffs.length-1][0]?h.diffs[h.diffs.length-1][1]+=i:h.diffs.push([0,i]));j||a.splice(++c,0,h)}}};diff_match_patch.prototype.patch_toText=function(a){for(var b=[],c=0;c)$/.test(state.lastType) || + (state.lastType == "quasi" && /\{\s*$/.test(stream.string.slice(0, stream.pos - (backUp || 0)))) +} + +CodeMirror.defineMode("javascript", function(config, parserConfig) { + var indentUnit = config.indentUnit; + var statementIndent = parserConfig.statementIndent; + var jsonldMode = parserConfig.jsonld; + var jsonMode = parserConfig.json || jsonldMode; + var isTS = parserConfig.typescript; + var wordRE = parserConfig.wordCharacters || /[\w$\xa1-\uffff]/; + + // Tokenizer + + var keywords = function(){ + function kw(type) {return {type: type, style: "keyword"};} + var A = kw("keyword a"), B = kw("keyword b"), C = kw("keyword c"); + var operator = kw("operator"), atom = {type: "atom", style: "atom"}; + + var jsKeywords = { + "if": kw("if"), "while": A, "with": A, "else": B, "do": B, "try": B, "finally": B, + "return": C, "break": C, "continue": C, "new": kw("new"), "delete": C, "throw": C, "debugger": C, + "var": kw("var"), "const": kw("var"), "let": kw("var"), + "function": kw("function"), "catch": kw("catch"), + "for": kw("for"), "switch": kw("switch"), "case": kw("case"), "default": kw("default"), + "in": operator, "typeof": operator, "instanceof": operator, + "true": atom, "false": atom, "null": atom, "undefined": atom, "NaN": atom, "Infinity": atom, + "this": kw("this"), "class": kw("class"), "super": kw("atom"), + "yield": C, "export": kw("export"), "import": kw("import"), "extends": C, + "await": C + }; + + // Extend the 'normal' keywords with the TypeScript language extensions + if (isTS) { + var type = {type: "variable", style: "type"}; + var tsKeywords = { + // object-like things + "interface": kw("class"), + "implements": C, + "namespace": C, + "module": kw("module"), + "enum": kw("module"), + + // scope modifiers + "public": kw("modifier"), + "private": kw("modifier"), + "protected": kw("modifier"), + "abstract": kw("modifier"), + + // types + "string": type, "number": type, "boolean": type, "any": type + }; + + for (var attr in tsKeywords) { + jsKeywords[attr] = tsKeywords[attr]; + } + } + + return jsKeywords; + }(); + + var isOperatorChar = /[+\-*&%=<>!?|~^@]/; + var isJsonldKeyword = /^@(context|id|value|language|type|container|list|set|reverse|index|base|vocab|graph)"/; + + function readRegexp(stream) { + var escaped = false, next, inSet = false; + while ((next = stream.next()) != null) { + if (!escaped) { + if (next == "/" && !inSet) return; + if (next == "[") inSet = true; + else if (inSet && next == "]") inSet = false; + } + escaped = !escaped && next == "\\"; + } + } + + // Used as scratch variables to communicate multiple values without + // consing up tons of objects. + var type, content; + function ret(tp, style, cont) { + type = tp; content = cont; + return style; + } + function tokenBase(stream, state) { + var ch = stream.next(); + if (ch == '"' || ch == "'") { + state.tokenize = tokenString(ch); + return state.tokenize(stream, state); + } else if (ch == "." && stream.match(/^\d+(?:[eE][+\-]?\d+)?/)) { + return ret("number", "number"); + } else if (ch == "." && stream.match("..")) { + return ret("spread", "meta"); + } else if (/[\[\]{}\(\),;\:\.]/.test(ch)) { + return ret(ch); + } else if (ch == "=" && stream.eat(">")) { + return ret("=>", "operator"); + } else if (ch == "0" && stream.eat(/x/i)) { + stream.eatWhile(/[\da-f]/i); + return ret("number", "number"); + } else if (ch == "0" && stream.eat(/o/i)) { + stream.eatWhile(/[0-7]/i); + return ret("number", "number"); + } else if (ch == "0" && stream.eat(/b/i)) { + stream.eatWhile(/[01]/i); + return ret("number", "number"); + } else if (/\d/.test(ch)) { + stream.match(/^\d*(?:\.\d*)?(?:[eE][+\-]?\d+)?/); + return ret("number", "number"); + } else if (ch == "/") { + if (stream.eat("*")) { + state.tokenize = tokenComment; + return tokenComment(stream, state); + } else if (stream.eat("/")) { + stream.skipToEnd(); + return ret("comment", "comment"); + } else if (expressionAllowed(stream, state, 1)) { + readRegexp(stream); + stream.match(/^\b(([gimyu])(?![gimyu]*\2))+\b/); + return ret("regexp", "string-2"); + } else { + stream.eatWhile(isOperatorChar); + return ret("operator", "operator", stream.current()); + } + } else if (ch == "`") { + state.tokenize = tokenQuasi; + return tokenQuasi(stream, state); + } else if (ch == "#") { + stream.skipToEnd(); + return ret("error", "error"); + } else if (isOperatorChar.test(ch)) { + if (ch != ">" || !state.lexical || state.lexical.type != ">") + stream.eatWhile(isOperatorChar); + return ret("operator", "operator", stream.current()); + } else if (wordRE.test(ch)) { + stream.eatWhile(wordRE); + var word = stream.current() + if (state.lastType != ".") { + if (keywords.propertyIsEnumerable(word)) { + var kw = keywords[word] + return ret(kw.type, kw.style, word) + } + if (word == "async" && stream.match(/^\s*[\(\w]/, false)) + return ret("async", "keyword", word) + } + return ret("variable", "variable", word) + } + } + + function tokenString(quote) { + return function(stream, state) { + var escaped = false, next; + if (jsonldMode && stream.peek() == "@" && stream.match(isJsonldKeyword)){ + state.tokenize = tokenBase; + return ret("jsonld-keyword", "meta"); + } + while ((next = stream.next()) != null) { + if (next == quote && !escaped) break; + escaped = !escaped && next == "\\"; + } + if (!escaped) state.tokenize = tokenBase; + return ret("string", "string"); + }; + } + + function tokenComment(stream, state) { + var maybeEnd = false, ch; + while (ch = stream.next()) { + if (ch == "/" && maybeEnd) { + state.tokenize = tokenBase; + break; + } + maybeEnd = (ch == "*"); + } + return ret("comment", "comment"); + } + + function tokenQuasi(stream, state) { + var escaped = false, next; + while ((next = stream.next()) != null) { + if (!escaped && (next == "`" || next == "$" && stream.eat("{"))) { + state.tokenize = tokenBase; + break; + } + escaped = !escaped && next == "\\"; + } + return ret("quasi", "string-2", stream.current()); + } + + var brackets = "([{}])"; + // This is a crude lookahead trick to try and notice that we're + // parsing the argument patterns for a fat-arrow function before we + // actually hit the arrow token. It only works if the arrow is on + // the same line as the arguments and there's no strange noise + // (comments) in between. Fallback is to only notice when we hit the + // arrow, and not declare the arguments as locals for the arrow + // body. + function findFatArrow(stream, state) { + if (state.fatArrowAt) state.fatArrowAt = null; + var arrow = stream.string.indexOf("=>", stream.start); + if (arrow < 0) return; + + if (isTS) { // Try to skip TypeScript return type declarations after the arguments + var m = /:\s*(?:\w+(?:<[^>]*>|\[\])?|\{[^}]*\})\s*$/.exec(stream.string.slice(stream.start, arrow)) + if (m) arrow = m.index + } + + var depth = 0, sawSomething = false; + for (var pos = arrow - 1; pos >= 0; --pos) { + var ch = stream.string.charAt(pos); + var bracket = brackets.indexOf(ch); + if (bracket >= 0 && bracket < 3) { + if (!depth) { ++pos; break; } + if (--depth == 0) { if (ch == "(") sawSomething = true; break; } + } else if (bracket >= 3 && bracket < 6) { + ++depth; + } else if (wordRE.test(ch)) { + sawSomething = true; + } else if (/["'\/]/.test(ch)) { + return; + } else if (sawSomething && !depth) { + ++pos; + break; + } + } + if (sawSomething && !depth) state.fatArrowAt = pos; + } + + // Parser + + var atomicTypes = {"atom": true, "number": true, "variable": true, "string": true, "regexp": true, "this": true, "jsonld-keyword": true}; + + function JSLexical(indented, column, type, align, prev, info) { + this.indented = indented; + this.column = column; + this.type = type; + this.prev = prev; + this.info = info; + if (align != null) this.align = align; + } + + function inScope(state, varname) { + for (var v = state.localVars; v; v = v.next) + if (v.name == varname) return true; + for (var cx = state.context; cx; cx = cx.prev) { + for (var v = cx.vars; v; v = v.next) + if (v.name == varname) return true; + } + } + + function parseJS(state, style, type, content, stream) { + var cc = state.cc; + // Communicate our context to the combinators. + // (Less wasteful than consing up a hundred closures on every call.) + cx.state = state; cx.stream = stream; cx.marked = null, cx.cc = cc; cx.style = style; + + if (!state.lexical.hasOwnProperty("align")) + state.lexical.align = true; + + while(true) { + var combinator = cc.length ? cc.pop() : jsonMode ? expression : statement; + if (combinator(type, content)) { + while(cc.length && cc[cc.length - 1].lex) + cc.pop()(); + if (cx.marked) return cx.marked; + if (type == "variable" && inScope(state, content)) return "variable-2"; + return style; + } + } + } + + // Combinator utils + + var cx = {state: null, column: null, marked: null, cc: null}; + function pass() { + for (var i = arguments.length - 1; i >= 0; i--) cx.cc.push(arguments[i]); + } + function cont() { + pass.apply(null, arguments); + return true; + } + function register(varname) { + function inList(list) { + for (var v = list; v; v = v.next) + if (v.name == varname) return true; + return false; + } + var state = cx.state; + cx.marked = "def"; + if (state.context) { + if (inList(state.localVars)) return; + state.localVars = {name: varname, next: state.localVars}; + } else { + if (inList(state.globalVars)) return; + if (parserConfig.globalVars) + state.globalVars = {name: varname, next: state.globalVars}; + } + } + + // Combinators + + var defaultVars = {name: "this", next: {name: "arguments"}}; + function pushcontext() { + cx.state.context = {prev: cx.state.context, vars: cx.state.localVars}; + cx.state.localVars = defaultVars; + } + function popcontext() { + cx.state.localVars = cx.state.context.vars; + cx.state.context = cx.state.context.prev; + } + function pushlex(type, info) { + var result = function() { + var state = cx.state, indent = state.indented; + if (state.lexical.type == "stat") indent = state.lexical.indented; + else for (var outer = state.lexical; outer && outer.type == ")" && outer.align; outer = outer.prev) + indent = outer.indented; + state.lexical = new JSLexical(indent, cx.stream.column(), type, null, state.lexical, info); + }; + result.lex = true; + return result; + } + function poplex() { + var state = cx.state; + if (state.lexical.prev) { + if (state.lexical.type == ")") + state.indented = state.lexical.indented; + state.lexical = state.lexical.prev; + } + } + poplex.lex = true; + + function expect(wanted) { + function exp(type) { + if (type == wanted) return cont(); + else if (wanted == ";") return pass(); + else return cont(exp); + }; + return exp; + } + + function statement(type, value) { + if (type == "var") return cont(pushlex("vardef", value.length), vardef, expect(";"), poplex); + if (type == "keyword a") return cont(pushlex("form"), parenExpr, statement, poplex); + if (type == "keyword b") return cont(pushlex("form"), statement, poplex); + if (type == "{") return cont(pushlex("}"), block, poplex); + if (type == ";") return cont(); + if (type == "if") { + if (cx.state.lexical.info == "else" && cx.state.cc[cx.state.cc.length - 1] == poplex) + cx.state.cc.pop()(); + return cont(pushlex("form"), parenExpr, statement, poplex, maybeelse); + } + if (type == "function") return cont(functiondef); + if (type == "for") return cont(pushlex("form"), forspec, statement, poplex); + if (type == "variable") { + if (isTS && value == "type") { + cx.marked = "keyword" + return cont(typeexpr, expect("operator"), typeexpr, expect(";")); + } else { + return cont(pushlex("stat"), maybelabel); + } + } + if (type == "switch") return cont(pushlex("form"), parenExpr, expect("{"), pushlex("}", "switch"), + block, poplex, poplex); + if (type == "case") return cont(expression, expect(":")); + if (type == "default") return cont(expect(":")); + if (type == "catch") return cont(pushlex("form"), pushcontext, expect("("), funarg, expect(")"), + statement, poplex, popcontext); + if (type == "class") return cont(pushlex("form"), className, poplex); + if (type == "export") return cont(pushlex("stat"), afterExport, poplex); + if (type == "import") return cont(pushlex("stat"), afterImport, poplex); + if (type == "module") return cont(pushlex("form"), pattern, expect("{"), pushlex("}"), block, poplex, poplex) + if (type == "async") return cont(statement) + if (value == "@") return cont(expression, statement) + return pass(pushlex("stat"), expression, expect(";"), poplex); + } + function expression(type) { + return expressionInner(type, false); + } + function expressionNoComma(type) { + return expressionInner(type, true); + } + function parenExpr(type) { + if (type != "(") return pass() + return cont(pushlex(")"), expression, expect(")"), poplex) + } + function expressionInner(type, noComma) { + if (cx.state.fatArrowAt == cx.stream.start) { + var body = noComma ? arrowBodyNoComma : arrowBody; + if (type == "(") return cont(pushcontext, pushlex(")"), commasep(pattern, ")"), poplex, expect("=>"), body, popcontext); + else if (type == "variable") return pass(pushcontext, pattern, expect("=>"), body, popcontext); + } + + var maybeop = noComma ? maybeoperatorNoComma : maybeoperatorComma; + if (atomicTypes.hasOwnProperty(type)) return cont(maybeop); + if (type == "function") return cont(functiondef, maybeop); + if (type == "class") return cont(pushlex("form"), classExpression, poplex); + if (type == "keyword c" || type == "async") return cont(noComma ? maybeexpressionNoComma : maybeexpression); + if (type == "(") return cont(pushlex(")"), maybeexpression, expect(")"), poplex, maybeop); + if (type == "operator" || type == "spread") return cont(noComma ? expressionNoComma : expression); + if (type == "[") return cont(pushlex("]"), arrayLiteral, poplex, maybeop); + if (type == "{") return contCommasep(objprop, "}", null, maybeop); + if (type == "quasi") return pass(quasi, maybeop); + if (type == "new") return cont(maybeTarget(noComma)); + return cont(); + } + function maybeexpression(type) { + if (type.match(/[;\}\)\],]/)) return pass(); + return pass(expression); + } + function maybeexpressionNoComma(type) { + if (type.match(/[;\}\)\],]/)) return pass(); + return pass(expressionNoComma); + } + + function maybeoperatorComma(type, value) { + if (type == ",") return cont(expression); + return maybeoperatorNoComma(type, value, false); + } + function maybeoperatorNoComma(type, value, noComma) { + var me = noComma == false ? maybeoperatorComma : maybeoperatorNoComma; + var expr = noComma == false ? expression : expressionNoComma; + if (type == "=>") return cont(pushcontext, noComma ? arrowBodyNoComma : arrowBody, popcontext); + if (type == "operator") { + if (/\+\+|--/.test(value)) return cont(me); + if (value == "?") return cont(expression, expect(":"), expr); + return cont(expr); + } + if (type == "quasi") { return pass(quasi, me); } + if (type == ";") return; + if (type == "(") return contCommasep(expressionNoComma, ")", "call", me); + if (type == ".") return cont(property, me); + if (type == "[") return cont(pushlex("]"), maybeexpression, expect("]"), poplex, me); + if (isTS && value == "as") { cx.marked = "keyword"; return cont(typeexpr, me) } + } + function quasi(type, value) { + if (type != "quasi") return pass(); + if (value.slice(value.length - 2) != "${") return cont(quasi); + return cont(expression, continueQuasi); + } + function continueQuasi(type) { + if (type == "}") { + cx.marked = "string-2"; + cx.state.tokenize = tokenQuasi; + return cont(quasi); + } + } + function arrowBody(type) { + findFatArrow(cx.stream, cx.state); + return pass(type == "{" ? statement : expression); + } + function arrowBodyNoComma(type) { + findFatArrow(cx.stream, cx.state); + return pass(type == "{" ? statement : expressionNoComma); + } + function maybeTarget(noComma) { + return function(type) { + if (type == ".") return cont(noComma ? targetNoComma : target); + else return pass(noComma ? expressionNoComma : expression); + }; + } + function target(_, value) { + if (value == "target") { cx.marked = "keyword"; return cont(maybeoperatorComma); } + } + function targetNoComma(_, value) { + if (value == "target") { cx.marked = "keyword"; return cont(maybeoperatorNoComma); } + } + function maybelabel(type) { + if (type == ":") return cont(poplex, statement); + return pass(maybeoperatorComma, expect(";"), poplex); + } + function property(type) { + if (type == "variable") {cx.marked = "property"; return cont();} + } + function objprop(type, value) { + if (type == "async") { + cx.marked = "property"; + return cont(objprop); + } else if (type == "variable" || cx.style == "keyword") { + cx.marked = "property"; + if (value == "get" || value == "set") return cont(getterSetter); + return cont(afterprop); + } else if (type == "number" || type == "string") { + cx.marked = jsonldMode ? "property" : (cx.style + " property"); + return cont(afterprop); + } else if (type == "jsonld-keyword") { + return cont(afterprop); + } else if (type == "modifier") { + return cont(objprop) + } else if (type == "[") { + return cont(expression, expect("]"), afterprop); + } else if (type == "spread") { + return cont(expression, afterprop); + } else if (type == ":") { + return pass(afterprop) + } + } + function getterSetter(type) { + if (type != "variable") return pass(afterprop); + cx.marked = "property"; + return cont(functiondef); + } + function afterprop(type) { + if (type == ":") return cont(expressionNoComma); + if (type == "(") return pass(functiondef); + } + function commasep(what, end, sep) { + function proceed(type, value) { + if (sep ? sep.indexOf(type) > -1 : type == ",") { + var lex = cx.state.lexical; + if (lex.info == "call") lex.pos = (lex.pos || 0) + 1; + return cont(function(type, value) { + if (type == end || value == end) return pass() + return pass(what) + }, proceed); + } + if (type == end || value == end) return cont(); + return cont(expect(end)); + } + return function(type, value) { + if (type == end || value == end) return cont(); + return pass(what, proceed); + }; + } + function contCommasep(what, end, info) { + for (var i = 3; i < arguments.length; i++) + cx.cc.push(arguments[i]); + return cont(pushlex(end, info), commasep(what, end), poplex); + } + function block(type) { + if (type == "}") return cont(); + return pass(statement, block); + } + function maybetype(type, value) { + if (isTS) { + if (type == ":") return cont(typeexpr); + if (value == "?") return cont(maybetype); + } + } + function typeexpr(type) { + if (type == "variable") {cx.marked = "type"; return cont(afterType);} + if (type == "string" || type == "number" || type == "atom") return cont(afterType); + if (type == "{") return cont(pushlex("}"), commasep(typeprop, "}", ",;"), poplex, afterType) + if (type == "(") return cont(commasep(typearg, ")"), maybeReturnType) + } + function maybeReturnType(type) { + if (type == "=>") return cont(typeexpr) + } + function typeprop(type, value) { + if (type == "variable" || cx.style == "keyword") { + cx.marked = "property" + return cont(typeprop) + } else if (value == "?") { + return cont(typeprop) + } else if (type == ":") { + return cont(typeexpr) + } else if (type == "[") { + return cont(expression, maybetype, expect("]"), typeprop) + } + } + function typearg(type) { + if (type == "variable") return cont(typearg) + else if (type == ":") return cont(typeexpr) + } + function afterType(type, value) { + if (value == "<") return cont(pushlex(">"), commasep(typeexpr, ">"), poplex, afterType) + if (value == "|" || type == ".") return cont(typeexpr) + if (type == "[") return cont(expect("]"), afterType) + if (value == "extends") return cont(typeexpr) + } + function vardef() { + return pass(pattern, maybetype, maybeAssign, vardefCont); + } + function pattern(type, value) { + if (type == "modifier") return cont(pattern) + if (type == "variable") { register(value); return cont(); } + if (type == "spread") return cont(pattern); + if (type == "[") return contCommasep(pattern, "]"); + if (type == "{") return contCommasep(proppattern, "}"); + } + function proppattern(type, value) { + if (type == "variable" && !cx.stream.match(/^\s*:/, false)) { + register(value); + return cont(maybeAssign); + } + if (type == "variable") cx.marked = "property"; + if (type == "spread") return cont(pattern); + if (type == "}") return pass(); + return cont(expect(":"), pattern, maybeAssign); + } + function maybeAssign(_type, value) { + if (value == "=") return cont(expressionNoComma); + } + function vardefCont(type) { + if (type == ",") return cont(vardef); + } + function maybeelse(type, value) { + if (type == "keyword b" && value == "else") return cont(pushlex("form", "else"), statement, poplex); + } + function forspec(type) { + if (type == "(") return cont(pushlex(")"), forspec1, expect(")"), poplex); + } + function forspec1(type) { + if (type == "var") return cont(vardef, expect(";"), forspec2); + if (type == ";") return cont(forspec2); + if (type == "variable") return cont(formaybeinof); + return pass(expression, expect(";"), forspec2); + } + function formaybeinof(_type, value) { + if (value == "in" || value == "of") { cx.marked = "keyword"; return cont(expression); } + return cont(maybeoperatorComma, forspec2); + } + function forspec2(type, value) { + if (type == ";") return cont(forspec3); + if (value == "in" || value == "of") { cx.marked = "keyword"; return cont(expression); } + return pass(expression, expect(";"), forspec3); + } + function forspec3(type) { + if (type != ")") cont(expression); + } + function functiondef(type, value) { + if (value == "*") {cx.marked = "keyword"; return cont(functiondef);} + if (type == "variable") {register(value); return cont(functiondef);} + if (type == "(") return cont(pushcontext, pushlex(")"), commasep(funarg, ")"), poplex, maybetype, statement, popcontext); + if (isTS && value == "<") return cont(pushlex(">"), commasep(typeexpr, ">"), poplex, functiondef) + } + function funarg(type) { + if (type == "spread") return cont(funarg); + return pass(pattern, maybetype, maybeAssign); + } + function classExpression(type, value) { + // Class expressions may have an optional name. + if (type == "variable") return className(type, value); + return classNameAfter(type, value); + } + function className(type, value) { + if (type == "variable") {register(value); return cont(classNameAfter);} + } + function classNameAfter(type, value) { + if (value == "<") return cont(pushlex(">"), commasep(typeexpr, ">"), poplex, classNameAfter) + if (value == "extends" || value == "implements" || (isTS && type == ",")) + return cont(isTS ? typeexpr : expression, classNameAfter); + if (type == "{") return cont(pushlex("}"), classBody, poplex); + } + function classBody(type, value) { + if (type == "variable" || cx.style == "keyword") { + if ((value == "async" || value == "static" || value == "get" || value == "set" || + (isTS && (value == "public" || value == "private" || value == "protected" || value == "readonly" || value == "abstract"))) && + cx.stream.match(/^\s+[\w$\xa1-\uffff]/, false)) { + cx.marked = "keyword"; + return cont(classBody); + } + cx.marked = "property"; + return cont(isTS ? classfield : functiondef, classBody); + } + if (type == "[") + return cont(expression, expect("]"), isTS ? classfield : functiondef, classBody) + if (value == "*") { + cx.marked = "keyword"; + return cont(classBody); + } + if (type == ";") return cont(classBody); + if (type == "}") return cont(); + if (value == "@") return cont(expression, classBody) + } + function classfield(type, value) { + if (value == "?") return cont(classfield) + if (type == ":") return cont(typeexpr, maybeAssign) + if (value == "=") return cont(expressionNoComma) + return pass(functiondef) + } + function afterExport(type, value) { + if (value == "*") { cx.marked = "keyword"; return cont(maybeFrom, expect(";")); } + if (value == "default") { cx.marked = "keyword"; return cont(expression, expect(";")); } + if (type == "{") return cont(commasep(exportField, "}"), maybeFrom, expect(";")); + return pass(statement); + } + function exportField(type, value) { + if (value == "as") { cx.marked = "keyword"; return cont(expect("variable")); } + if (type == "variable") return pass(expressionNoComma, exportField); + } + function afterImport(type) { + if (type == "string") return cont(); + return pass(importSpec, maybeMoreImports, maybeFrom); + } + function importSpec(type, value) { + if (type == "{") return contCommasep(importSpec, "}"); + if (type == "variable") register(value); + if (value == "*") cx.marked = "keyword"; + return cont(maybeAs); + } + function maybeMoreImports(type) { + if (type == ",") return cont(importSpec, maybeMoreImports) + } + function maybeAs(_type, value) { + if (value == "as") { cx.marked = "keyword"; return cont(importSpec); } + } + function maybeFrom(_type, value) { + if (value == "from") { cx.marked = "keyword"; return cont(expression); } + } + function arrayLiteral(type) { + if (type == "]") return cont(); + return pass(commasep(expressionNoComma, "]")); + } + + function isContinuedStatement(state, textAfter) { + return state.lastType == "operator" || state.lastType == "," || + isOperatorChar.test(textAfter.charAt(0)) || + /[,.]/.test(textAfter.charAt(0)); + } + + // Interface + + return { + startState: function(basecolumn) { + var state = { + tokenize: tokenBase, + lastType: "sof", + cc: [], + lexical: new JSLexical((basecolumn || 0) - indentUnit, 0, "block", false), + localVars: parserConfig.localVars, + context: parserConfig.localVars && {vars: parserConfig.localVars}, + indented: basecolumn || 0 + }; + if (parserConfig.globalVars && typeof parserConfig.globalVars == "object") + state.globalVars = parserConfig.globalVars; + return state; + }, + + token: function(stream, state) { + if (stream.sol()) { + if (!state.lexical.hasOwnProperty("align")) + state.lexical.align = false; + state.indented = stream.indentation(); + findFatArrow(stream, state); + } + if (state.tokenize != tokenComment && stream.eatSpace()) return null; + var style = state.tokenize(stream, state); + if (type == "comment") return style; + state.lastType = type == "operator" && (content == "++" || content == "--") ? "incdec" : type; + return parseJS(state, style, type, content, stream); + }, + + indent: function(state, textAfter) { + if (state.tokenize == tokenComment) return CodeMirror.Pass; + if (state.tokenize != tokenBase) return 0; + var firstChar = textAfter && textAfter.charAt(0), lexical = state.lexical, top + // Kludge to prevent 'maybelse' from blocking lexical scope pops + if (!/^\s*else\b/.test(textAfter)) for (var i = state.cc.length - 1; i >= 0; --i) { + var c = state.cc[i]; + if (c == poplex) lexical = lexical.prev; + else if (c != maybeelse) break; + } + while ((lexical.type == "stat" || lexical.type == "form") && + (firstChar == "}" || ((top = state.cc[state.cc.length - 1]) && + (top == maybeoperatorComma || top == maybeoperatorNoComma) && + !/^[,\.=+\-*:?[\(]/.test(textAfter)))) + lexical = lexical.prev; + if (statementIndent && lexical.type == ")" && lexical.prev.type == "stat") + lexical = lexical.prev; + var type = lexical.type, closing = firstChar == type; + + if (type == "vardef") return lexical.indented + (state.lastType == "operator" || state.lastType == "," ? lexical.info + 1 : 0); + else if (type == "form" && firstChar == "{") return lexical.indented; + else if (type == "form") return lexical.indented + indentUnit; + else if (type == "stat") + return lexical.indented + (isContinuedStatement(state, textAfter) ? statementIndent || indentUnit : 0); + else if (lexical.info == "switch" && !closing && parserConfig.doubleIndentSwitch != false) + return lexical.indented + (/^(?:case|default)\b/.test(textAfter) ? indentUnit : 2 * indentUnit); + else if (lexical.align) return lexical.column + (closing ? 0 : 1); + else return lexical.indented + (closing ? 0 : indentUnit); + }, + + electricInput: /^\s*(?:case .*?:|default:|\{|\})$/, + blockCommentStart: jsonMode ? null : "/*", + blockCommentEnd: jsonMode ? null : "*/", + lineComment: jsonMode ? null : "//", + fold: "brace", + closeBrackets: "()[]{}''\"\"``", + + helperType: jsonMode ? "json" : "javascript", + jsonldMode: jsonldMode, + jsonMode: jsonMode, + + expressionAllowed: expressionAllowed, + skipExpression: function(state) { + var top = state.cc[state.cc.length - 1] + if (top == expression || top == expressionNoComma) state.cc.pop() + } + }; +}); + +CodeMirror.registerHelper("wordChars", "javascript", /[\w$]/); + +CodeMirror.defineMIME("text/javascript", "javascript"); +CodeMirror.defineMIME("text/ecmascript", "javascript"); +CodeMirror.defineMIME("application/javascript", "javascript"); +CodeMirror.defineMIME("application/x-javascript", "javascript"); +CodeMirror.defineMIME("application/ecmascript", "javascript"); +CodeMirror.defineMIME("application/json", {name: "javascript", json: true}); +CodeMirror.defineMIME("application/x-json", {name: "javascript", json: true}); +CodeMirror.defineMIME("application/ld+json", {name: "javascript", jsonld: true}); +CodeMirror.defineMIME("text/typescript", { name: "javascript", typescript: true }); +CodeMirror.defineMIME("application/typescript", { name: "javascript", typescript: true }); + +}); diff --git a/pigx-register/src/main/resources/static/console-ui/public/js/jquery.js b/pigx-register/src/main/resources/static/console-ui/public/js/jquery.js new file mode 100644 index 0000000..c5e96cc --- /dev/null +++ b/pigx-register/src/main/resources/static/console-ui/public/js/jquery.js @@ -0,0 +1,2 @@ +/*! jQuery v3.5.1 | (c) JS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.5.1",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function D(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||j,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,j=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function qe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function Le(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function He(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Oe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Ut,Xt=[],Vt=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Xt.pop()||S.expando+"_"+Ct.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Vt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Vt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Vt,"$1"+r):!1!==e.jsonp&&(e.url+=(Et.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Xt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Ut=E.implementation.createHTMLDocument("").body).innerHTML="
",2===Ut.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):("number"==typeof f.top&&(f.top+="px"),"number"==typeof f.left&&(f.left+="px"),c.css(f))}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=$e(y.pixelPosition,function(e,t){if(t)return t=Be(e,n),Me.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0=0)||"undefined"!=typeof process&&"win32"===process.platform},t}();e.Environment=t}(AMDLoader||(AMDLoader={}));var AMDLoader;!function(e){var t;!function(e){e[e.LoaderAvailable=1]="LoaderAvailable",e[e.BeginLoadingScript=10]="BeginLoadingScript",e[e.EndLoadingScriptOK=11]="EndLoadingScriptOK",e[e.EndLoadingScriptError=12]="EndLoadingScriptError",e[e.BeginInvokeFactory=21]="BeginInvokeFactory",e[e.EndInvokeFactory=22]="EndInvokeFactory",e[e.NodeBeginEvaluatingScript=31]="NodeBeginEvaluatingScript",e[e.NodeEndEvaluatingScript=32]="NodeEndEvaluatingScript",e[e.NodeBeginNativeRequire=33]="NodeBeginNativeRequire",e[e.NodeEndNativeRequire=34]="NodeEndNativeRequire"}(t=e.LoaderEventType||(e.LoaderEventType={}));var r=function(){return function(e,t,r){this.type=e,this.detail=t,this.timestamp=r}}();e.LoaderEvent=r;var n=function(){function n(e){this._events=[new r(t.LoaderAvailable,"",e)]}return n.prototype.record=function(t,n){this._events.push(new r(t,n,e.Utilities.getHighPerformanceTimestamp()))},n.prototype.getEvents=function(){return this._events},n}();e.LoaderEventRecorder=n;var o=function(){function e(){}return e.prototype.record=function(e,t){},e.prototype.getEvents=function(){return[]},e}();o.INSTANCE=new o,e.NullLoaderEventRecorder=o}(AMDLoader||(AMDLoader={}));var AMDLoader;!function(e){var t=function(){function t(){}return t.fileUriToFilePath=function(e,t){if(t=decodeURI(t),e){if(/^file:\/\/\//.test(t))return t.substr(8);if(/^file:\/\//.test(t))return t.substr(5)}else if(/^file:\/\//.test(t))return t.substr(7);return t},t.startsWith=function(e,t){return e.length>=t.length&&e.substr(0,t.length)===t},t.endsWith=function(e,t){return e.length>=t.length&&e.substr(e.length-t.length)===t},t.containsQueryString=function(e){return/^[^\#]*\?/gi.test(e)},t.isAbsolutePath=function(e){return/^((http:\/\/)|(https:\/\/)|(file:\/\/)|(\/))/.test(e)},t.forEachProperty=function(e,t){if(e){var r=void 0;for(r in e)e.hasOwnProperty(r)&&t(r,e[r])}},t.isEmpty=function(e){var r=!0;return t.forEachProperty(e,function(){r=!1}),r},t.recursiveClone=function(e){if(!e||"object"!=typeof e)return e;var r=Array.isArray(e)?[]:{};return t.forEachProperty(e,function(e,n){r[e]=n&&"object"==typeof n?t.recursiveClone(n):n}),r},t.generateAnonymousModule=function(){return"===anonymous"+t.NEXT_ANONYMOUS_ID+++"==="},t.isAnonymousModule=function(e){return/^===anonymous/.test(e)},t.getHighPerformanceTimestamp=function(){return this.PERFORMANCE_NOW_PROBED||(this.PERFORMANCE_NOW_PROBED=!0,this.HAS_PERFORMANCE_NOW=e.global.performance&&"function"==typeof e.global.performance.now),this.HAS_PERFORMANCE_NOW?e.global.performance.now():Date.now()},t}();t.NEXT_ANONYMOUS_ID=1,t.PERFORMANCE_NOW_PROBED=!1,t.HAS_PERFORMANCE_NOW=!1,e.Utilities=t}(AMDLoader||(AMDLoader={}));var AMDLoader;!function(e){var t=function(){function t(){}return t.validateConfigurationOptions=function(t,r){return"string"!=typeof(r=r||{}).baseUrl&&(r.baseUrl=""),"boolean"!=typeof r.isBuild&&(r.isBuild=!1),"object"!=typeof r.paths&&(r.paths={}),"object"!=typeof r.config&&(r.config={}),void 0===r.catchError&&(r.catchError=t),"string"!=typeof r.urlArgs&&(r.urlArgs=""),"function"!=typeof r.onError&&(r.onError=function(e){return"load"===e.errorCode?(console.error('Loading "'+e.moduleId+'" failed'),console.error("Detail: ",e.detail),e.detail&&e.detail.stack&&console.error(e.detail.stack),console.error("Here are the modules that depend on it:"),void console.error(e.neededBy)):"factory"===e.errorCode?(console.error('The factory method of "'+e.moduleId+'" has thrown an exception'),console.error(e.detail),void(e.detail&&e.detail.stack&&console.error(e.detail.stack))):void 0}),"object"==typeof r.ignoreDuplicateModules&&Array.isArray(r.ignoreDuplicateModules)||(r.ignoreDuplicateModules=[]),r.baseUrl.length>0&&(e.Utilities.endsWith(r.baseUrl,"/")||(r.baseUrl+="/")),Array.isArray(r.nodeModules)||(r.nodeModules=[]),("number"!=typeof r.nodeCachedDataWriteDelay||r.nodeCachedDataWriteDelay<0)&&(r.nodeCachedDataWriteDelay=7e3),"function"!=typeof r.onNodeCachedData&&(r.onNodeCachedData=function(e,t){e&&("cachedDataRejected"===e.errorCode?console.warn("Rejected cached data from file: "+e.path):"unlink"===e.errorCode||"writeFile"===e.errorCode?(console.error("Problems writing cached data file: "+e.path),console.error(e.detail)):console.error(e))}),r},t.mergeConfigurationOptions=function(r,n,o){void 0===n&&(n=null),void 0===o&&(o=null);var i=e.Utilities.recursiveClone(o||{});return e.Utilities.forEachProperty(n,function(t,r){"ignoreDuplicateModules"===t&&void 0!==i.ignoreDuplicateModules?i.ignoreDuplicateModules=i.ignoreDuplicateModules.concat(r):"paths"===t&&void 0!==i.paths?e.Utilities.forEachProperty(r,function(e,t){return i.paths[e]=t}):"config"===t&&void 0!==i.config?e.Utilities.forEachProperty(r,function(e,t){return i.config[e]=t}):i[t]=e.Utilities.recursiveClone(r)}),t.validateConfigurationOptions(r,i)},t}();e.ConfigurationOptionsUtil=t;var r=function(){function r(e,r){if(this._env=e,this.options=t.mergeConfigurationOptions(this._env.isWebWorker,r),this._createIgnoreDuplicateModulesMap(),this._createNodeModulesMap(),this._createSortedPathsRules(),""===this.options.baseUrl){if(this._env.isNode&&this.options.nodeRequire&&this.options.nodeRequire.main&&this.options.nodeRequire.main.filename){var n=this.options.nodeRequire.main.filename,o=Math.max(n.lastIndexOf("/"),n.lastIndexOf("\\"));this.options.baseUrl=n.substring(0,o+1)}if(this._env.isNode&&this.options.nodeMain){var n=this.options.nodeMain,o=Math.max(n.lastIndexOf("/"),n.lastIndexOf("\\"));this.options.baseUrl=n.substring(0,o+1)}}}return r.prototype._createIgnoreDuplicateModulesMap=function(){this.ignoreDuplicateModulesMap={};for(var e=0;e=0){var n=t.resolveModule(e.substr(0,r)),s=t.resolveModule(e.substr(r+1)),a=this._moduleIdProvider.getModuleId(n+"!"+s),d=this._moduleIdProvider.getModuleId(n);return new i(a,d,s)}return new o(this._moduleIdProvider.getModuleId(t.resolveModule(e)))},s.prototype._normalizeDependencies=function(e,t){for(var r=[],n=0,o=0,i=e.length;o0;){var d=a.shift(),l=this._modules2[d];l&&(s=l.onDependencyError(r)||s);var u=this._inverseDependencies2[d];if(u)for(var o=0,i=u.length;o0;){var a=s.shift().dependencies;if(a)for(var o=0,i=a.length;o=o.length)r._onLoadError(t,n);else{var a=o[i],d=r.getRecorder();if(r._config.isBuild()&&"empty:"===a)return r._buildInfoPath[t]=a,r.defineModule(r._moduleIdProvider.getStrModuleId(t),[],null,null,null),void r._onLoad(t);d.record(e.LoaderEventType.BeginLoadingScript,a),r._scriptLoader.load(r,a,function(){r._config.isBuild()&&(r._buildInfoPath[t]=a),d.record(e.LoaderEventType.EndLoadingScriptOK,a),r._onLoad(t)},function(t){d.record(e.LoaderEventType.EndLoadingScriptError,a),s(t)})}};s(null)}},s.prototype._loadPluginDependency=function(e,r){var n=this;if(!this._modules2[r.id]&&!this._knownModules2[r.id]){this._knownModules2[r.id]=!0;var o=function(e){n.defineModule(n._moduleIdProvider.getStrModuleId(r.id),[],e,null,null)};o.error=function(e){n._config.onError(n._createLoadError(r.id,e))},e.load(r.pluginParam,this._createRequire(t.ROOT),o,this._config.getOptionsLiteral())}},s.prototype._resolve=function(e){for(var t=this,r=e.dependencies,n=0,s=r.length;n \n")),e.unresolvedDependenciesCount--}else if(this._inverseDependencies2[a.id]=this._inverseDependencies2[a.id]||[],this._inverseDependencies2[a.id].push(e.id),a instanceof i){var u=this._modules2[a.pluginId];if(u&&u.isComplete()){this._loadPluginDependency(u.exports,a);continue}var c=this._inversePluginDependencies2.get(a.pluginId);c||(c=[],this._inversePluginDependencies2.set(a.pluginId,c)),c.push(a),this._loadModule(a.pluginId)}else this._loadModule(a.id)}else e.unresolvedDependenciesCount--;else e.unresolvedDependenciesCount--;else e.exportsPassedIn=!0,e.unresolvedDependenciesCount--}0===e.unresolvedDependenciesCount&&this._onModuleComplete(e)},s.prototype._onModuleComplete=function(e){var t=this,r=this.getRecorder();if(!e.isComplete()){for(var n=e.dependencies,i=[],s=0,a=n.length;s now) return false; + + var sInfo = editor.getScrollInfo(); + if (dv.mv.options.connect == "align") { + targetPos = sInfo.top; + } else { + var halfScreen = .5 * sInfo.clientHeight, midY = sInfo.top + halfScreen; + var mid = editor.lineAtHeight(midY, "local"); + var around = chunkBoundariesAround(dv.chunks, mid, toOrig); + var off = getOffsets(editor, toOrig ? around.edit : around.orig); + var offOther = getOffsets(other, toOrig ? around.orig : around.edit); + var ratio = (midY - off.top) / (off.bot - off.top); + var targetPos = (offOther.top - halfScreen) + ratio * (offOther.bot - offOther.top); + + var botDist, mix; + // Some careful tweaking to make sure no space is left out of view + // when scrolling to top or bottom. + if (targetPos > sInfo.top && (mix = sInfo.top / halfScreen) < 1) { + targetPos = targetPos * mix + sInfo.top * (1 - mix); + } else if ((botDist = sInfo.height - sInfo.clientHeight - sInfo.top) < halfScreen) { + var otherInfo = other.getScrollInfo(); + var botDistOther = otherInfo.height - otherInfo.clientHeight - targetPos; + if (botDistOther > botDist && (mix = botDist / halfScreen) < 1) + targetPos = targetPos * mix + (otherInfo.height - otherInfo.clientHeight - botDist) * (1 - mix); + } + } + + other.scrollTo(sInfo.left, targetPos); + other.state.scrollSetAt = now; + other.state.scrollSetBy = dv; + return true; + } + + function getOffsets(editor, around) { + var bot = around.after; + if (bot == null) bot = editor.lastLine() + 1; + return {top: editor.heightAtLine(around.before || 0, "local"), + bot: editor.heightAtLine(bot, "local")}; + } + + function setScrollLock(dv, val, action) { + dv.lockScroll = val; + if (val && action != false) syncScroll(dv, DIFF_INSERT) && makeConnections(dv); + dv.lockButton.innerHTML = val ? "\u21db\u21da" : "\u21db  \u21da"; + } + + // Updating the marks for editor content + + function removeClass(editor, line, classes) { + var locs = classes.classLocation + for (var i = 0; i < locs.length; i++) { + editor.removeLineClass(line, locs[i], classes.chunk); + editor.removeLineClass(line, locs[i], classes.start); + editor.removeLineClass(line, locs[i], classes.end); + } + } + + function clearMarks(editor, arr, classes) { + for (var i = 0; i < arr.length; ++i) { + var mark = arr[i]; + if (mark instanceof CodeMirror.TextMarker) + mark.clear(); + else if (mark.parent) + removeClass(editor, mark, classes); + } + arr.length = 0; + } + + // FIXME maybe add a margin around viewport to prevent too many updates + function updateMarks(editor, diff, state, type, classes) { + var vp = editor.getViewport(); + editor.operation(function() { + if (state.from == state.to || vp.from - state.to > 20 || state.from - vp.to > 20) { + clearMarks(editor, state.marked, classes); + markChanges(editor, diff, type, state.marked, vp.from, vp.to, classes); + state.from = vp.from; state.to = vp.to; + } else { + if (vp.from < state.from) { + markChanges(editor, diff, type, state.marked, vp.from, state.from, classes); + state.from = vp.from; + } + if (vp.to > state.to) { + markChanges(editor, diff, type, state.marked, state.to, vp.to, classes); + state.to = vp.to; + } + } + }); + } + + function addClass(editor, lineNr, classes, main, start, end) { + var locs = classes.classLocation, line = editor.getLineHandle(lineNr); + for (var i = 0; i < locs.length; i++) { + if (main) editor.addLineClass(line, locs[i], classes.chunk); + if (start) editor.addLineClass(line, locs[i], classes.start); + if (end) editor.addLineClass(line, locs[i], classes.end); + } + return line; + } + + function markChanges(editor, diff, type, marks, from, to, classes) { + var pos = Pos(0, 0); + var top = Pos(from, 0), bot = editor.clipPos(Pos(to - 1)); + var cls = type == DIFF_DELETE ? classes.del : classes.insert; + function markChunk(start, end) { + var bfrom = Math.max(from, start), bto = Math.min(to, end); + for (var i = bfrom; i < bto; ++i) + marks.push(addClass(editor, i, classes, true, i == start, i == end - 1)); + // When the chunk is empty, make sure a horizontal line shows up + if (start == end && bfrom == end && bto == end) { + if (bfrom) + marks.push(addClass(editor, bfrom - 1, classes, false, false, true)); + else + marks.push(addClass(editor, bfrom, classes, false, true, false)); + } + } + + var chunkStart = 0, pending = false; + for (var i = 0; i < diff.length; ++i) { + var part = diff[i], tp = part[0], str = part[1]; + if (tp == DIFF_EQUAL) { + var cleanFrom = pos.line + (startOfLineClean(diff, i) ? 0 : 1); + moveOver(pos, str); + var cleanTo = pos.line + (endOfLineClean(diff, i) ? 1 : 0); + if (cleanTo > cleanFrom) { + if (pending) { markChunk(chunkStart, cleanFrom); pending = false } + chunkStart = cleanTo; + } + } else { + pending = true + if (tp == type) { + var end = moveOver(pos, str, true); + var a = posMax(top, pos), b = posMin(bot, end); + if (!posEq(a, b)) + marks.push(editor.markText(a, b, {className: cls})); + pos = end; + } + } + } + if (pending) markChunk(chunkStart, pos.line + 1); + } + + // Updating the gap between editor and original + + function makeConnections(dv) { + if (!dv.showDifferences) return; + + if (dv.svg) { + clear(dv.svg); + var w = dv.gap.offsetWidth; + attrs(dv.svg, "width", w, "height", dv.gap.offsetHeight); + } + if (dv.copyButtons) clear(dv.copyButtons); + + var vpEdit = dv.edit.getViewport(), vpOrig = dv.orig.getViewport(); + var outerTop = dv.mv.wrap.getBoundingClientRect().top + var sTopEdit = outerTop - dv.edit.getScrollerElement().getBoundingClientRect().top + dv.edit.getScrollInfo().top + var sTopOrig = outerTop - dv.orig.getScrollerElement().getBoundingClientRect().top + dv.orig.getScrollInfo().top; + for (var i = 0; i < dv.chunks.length; i++) { + var ch = dv.chunks[i]; + if (ch.editFrom <= vpEdit.to && ch.editTo >= vpEdit.from && + ch.origFrom <= vpOrig.to && ch.origTo >= vpOrig.from) + drawConnectorsForChunk(dv, ch, sTopOrig, sTopEdit, w); + } + } + + function getMatchingOrigLine(editLine, chunks) { + var editStart = 0, origStart = 0; + for (var i = 0; i < chunks.length; i++) { + var chunk = chunks[i]; + if (chunk.editTo > editLine && chunk.editFrom <= editLine) return null; + if (chunk.editFrom > editLine) break; + editStart = chunk.editTo; + origStart = chunk.origTo; + } + return origStart + (editLine - editStart); + } + + // Combines information about chunks and widgets/markers to return + // an array of lines, in a single editor, that probably need to be + // aligned with their counterparts in the editor next to it. + function alignableFor(cm, chunks, isOrig) { + var tracker = cm.state.trackAlignable + var start = cm.firstLine(), trackI = 0 + var result = [] + for (var i = 0;; i++) { + var chunk = chunks[i] + var chunkStart = !chunk ? 1e9 : isOrig ? chunk.origFrom : chunk.editFrom + for (; trackI < tracker.alignable.length; trackI += 2) { + var n = tracker.alignable[trackI] + 1 + if (n <= start) continue + if (n <= chunkStart) result.push(n) + else break + } + if (!chunk) break + result.push(start = isOrig ? chunk.origTo : chunk.editTo) + } + return result + } + + // Given information about alignable lines in two editors, fill in + // the result (an array of three-element arrays) to reflect the + // lines that need to be aligned with each other. + function mergeAlignable(result, origAlignable, chunks, setIndex) { + var rI = 0, origI = 0, chunkI = 0, diff = 0 + outer: for (;; rI++) { + var nextR = result[rI], nextO = origAlignable[origI] + if (!nextR && nextO == null) break + + var rLine = nextR ? nextR[0] : 1e9, oLine = nextO == null ? 1e9 : nextO + while (chunkI < chunks.length) { + var chunk = chunks[chunkI] + if (chunk.origFrom <= oLine && chunk.origTo > oLine) { + origI++ + rI-- + continue outer; + } + if (chunk.editTo > rLine) { + if (chunk.editFrom <= rLine) continue outer; + break + } + diff += (chunk.origTo - chunk.origFrom) - (chunk.editTo - chunk.editFrom) + chunkI++ + } + if (rLine == oLine - diff) { + nextR[setIndex] = oLine + origI++ + } else if (rLine < oLine - diff) { + nextR[setIndex] = rLine + diff + } else { + var record = [oLine - diff, null, null] + record[setIndex] = oLine + result.splice(rI, 0, record) + origI++ + } + } + } + + function findAlignedLines(dv, other) { + var alignable = alignableFor(dv.edit, dv.chunks, false), result = [] + if (other) for (var i = 0, j = 0; i < other.chunks.length; i++) { + var n = other.chunks[i].editTo + while (j < alignable.length && alignable[j] < n) j++ + if (j == alignable.length || alignable[j] != n) alignable.splice(j++, 0, n) + } + for (var i = 0; i < alignable.length; i++) + result.push([alignable[i], null, null]) + + mergeAlignable(result, alignableFor(dv.orig, dv.chunks, true), dv.chunks, 1) + if (other) + mergeAlignable(result, alignableFor(other.orig, other.chunks, true), other.chunks, 2) + + return result + } + + function alignChunks(dv, force) { + if (!dv.dealigned && !force) return; + if (!dv.orig.curOp) return dv.orig.operation(function() { + alignChunks(dv, force); + }); + + dv.dealigned = false; + var other = dv.mv.left == dv ? dv.mv.right : dv.mv.left; + if (other) { + ensureDiff(other); + other.dealigned = false; + } + var linesToAlign = findAlignedLines(dv, other); + + // Clear old aligners + var aligners = dv.mv.aligners; + for (var i = 0; i < aligners.length; i++) + aligners[i].clear(); + aligners.length = 0; + + var cm = [dv.edit, dv.orig], scroll = []; + if (other) cm.push(other.orig); + for (var i = 0; i < cm.length; i++) + scroll.push(cm[i].getScrollInfo().top); + + for (var ln = 0; ln < linesToAlign.length; ln++) + alignLines(cm, linesToAlign[ln], aligners); + + for (var i = 0; i < cm.length; i++) + cm[i].scrollTo(null, scroll[i]); + } + + function alignLines(cm, lines, aligners) { + var maxOffset = 0, offset = []; + for (var i = 0; i < cm.length; i++) if (lines[i] != null) { + var off = cm[i].heightAtLine(lines[i], "local"); + offset[i] = off; + maxOffset = Math.max(maxOffset, off); + } + for (var i = 0; i < cm.length; i++) if (lines[i] != null) { + var diff = maxOffset - offset[i]; + if (diff > 1) + aligners.push(padAbove(cm[i], lines[i], diff)); + } + } + + function padAbove(cm, line, size) { + var above = true; + if (line > cm.lastLine()) { + line--; + above = false; + } + var elt = document.createElement("div"); + elt.className = "CodeMirror-merge-spacer"; + elt.style.height = size + "px"; elt.style.minWidth = "1px"; + return cm.addLineWidget(line, elt, {height: size, above: above, mergeSpacer: true, handleMouseEvents: true}); + } + + function drawConnectorsForChunk(dv, chunk, sTopOrig, sTopEdit, w) { + var flip = dv.type == "left"; + var top = dv.orig.heightAtLine(chunk.origFrom, "local", true) - sTopOrig; + if (dv.svg) { + var topLpx = top; + var topRpx = dv.edit.heightAtLine(chunk.editFrom, "local", true) - sTopEdit; + if (flip) { var tmp = topLpx; topLpx = topRpx; topRpx = tmp; } + var botLpx = dv.orig.heightAtLine(chunk.origTo, "local", true) - sTopOrig; + var botRpx = dv.edit.heightAtLine(chunk.editTo, "local", true) - sTopEdit; + if (flip) { var tmp = botLpx; botLpx = botRpx; botRpx = tmp; } + var curveTop = " C " + w/2 + " " + topRpx + " " + w/2 + " " + topLpx + " " + (w + 2) + " " + topLpx; + var curveBot = " C " + w/2 + " " + botLpx + " " + w/2 + " " + botRpx + " -1 " + botRpx; + attrs(dv.svg.appendChild(document.createElementNS(svgNS, "path")), + "d", "M -1 " + topRpx + curveTop + " L " + (w + 2) + " " + botLpx + curveBot + " z", + "class", dv.classes.connect); + } + if (dv.copyButtons) { + var copy = dv.copyButtons.appendChild(elt("div", dv.type == "left" ? "\u21dd" : "\u21dc", + "CodeMirror-merge-copy")); + var editOriginals = dv.mv.options.allowEditingOriginals; + copy.title = editOriginals ? "Push to left" : "Revert chunk"; + copy.chunk = chunk; + copy.style.top = (chunk.origTo > chunk.origFrom ? top : dv.edit.heightAtLine(chunk.editFrom, "local") - sTopEdit) + "px"; + + if (editOriginals) { + var topReverse = dv.edit.heightAtLine(chunk.editFrom, "local") - sTopEdit; + var copyReverse = dv.copyButtons.appendChild(elt("div", dv.type == "right" ? "\u21dd" : "\u21dc", + "CodeMirror-merge-copy-reverse")); + copyReverse.title = "Push to right"; + copyReverse.chunk = {editFrom: chunk.origFrom, editTo: chunk.origTo, + origFrom: chunk.editFrom, origTo: chunk.editTo}; + copyReverse.style.top = topReverse + "px"; + dv.type == "right" ? copyReverse.style.left = "2px" : copyReverse.style.right = "2px"; + } + } + } + + function copyChunk(dv, to, from, chunk) { + if (dv.diffOutOfDate) return; + var origStart = chunk.origTo > from.lastLine() ? Pos(chunk.origFrom - 1) : Pos(chunk.origFrom, 0) + var origEnd = Pos(chunk.origTo, 0) + var editStart = chunk.editTo > to.lastLine() ? Pos(chunk.editFrom - 1) : Pos(chunk.editFrom, 0) + var editEnd = Pos(chunk.editTo, 0) + var handler = dv.mv.options.revertChunk + if (handler) + handler(dv.mv, from, origStart, origEnd, to, editStart, editEnd) + else + to.replaceRange(from.getRange(origStart, origEnd), editStart, editEnd) + } + + // Merge view, containing 0, 1, or 2 diff views. + + var MergeView = CodeMirror.MergeView = function(node, options) { + if (!(this instanceof MergeView)) return new MergeView(node, options); + + this.options = options; + var origLeft = options.origLeft, origRight = options.origRight == null ? options.orig : options.origRight; + + var hasLeft = origLeft != null, hasRight = origRight != null; + var panes = 1 + (hasLeft ? 1 : 0) + (hasRight ? 1 : 0); + var wrap = [], left = this.left = null, right = this.right = null; + var self = this; + + if (hasLeft) { + left = this.left = new DiffView(this, "left"); + var leftPane = elt("div", null, "CodeMirror-merge-pane CodeMirror-merge-left"); + wrap.push(leftPane); + wrap.push(buildGap(left)); + } + + var editPane = elt("div", null, "CodeMirror-merge-pane CodeMirror-merge-editor"); + wrap.push(editPane); + + if (hasRight) { + right = this.right = new DiffView(this, "right"); + wrap.push(buildGap(right)); + var rightPane = elt("div", null, "CodeMirror-merge-pane CodeMirror-merge-right"); + wrap.push(rightPane); + } + + (hasRight ? rightPane : editPane).className += " CodeMirror-merge-pane-rightmost"; + + wrap.push(elt("div", null, null, "height: 0; clear: both;")); + + var wrapElt = this.wrap = node.appendChild(elt("div", wrap, "CodeMirror-merge CodeMirror-merge-" + panes + "pane")); + this.edit = CodeMirror(editPane, copyObj(options)); + + if (left) left.init(leftPane, origLeft, options); + if (right) right.init(rightPane, origRight, options); + if (options.collapseIdentical) + this.editor().operation(function() { + collapseIdenticalStretches(self, options.collapseIdentical); + }); + if (options.connect == "align") { + this.aligners = []; + alignChunks(this.left || this.right, true); + } + if (left) left.registerEvents(right) + if (right) right.registerEvents(left) + + + var onResize = function() { + if (left) makeConnections(left); + if (right) makeConnections(right); + }; + CodeMirror.on(window, "resize", onResize); + var resizeInterval = setInterval(function() { + for (var p = wrapElt.parentNode; p && p != document.body; p = p.parentNode) {} + if (!p) { clearInterval(resizeInterval); CodeMirror.off(window, "resize", onResize); } + }, 5000); + }; + + function buildGap(dv) { + var lock = dv.lockButton = elt("div", null, "CodeMirror-merge-scrolllock"); + lock.title = "Toggle locked scrolling"; + var lockWrap = elt("div", [lock], "CodeMirror-merge-scrolllock-wrap"); + CodeMirror.on(lock, "click", function() { setScrollLock(dv, !dv.lockScroll); }); + var gapElts = [lockWrap]; + if (dv.mv.options.revertButtons !== false) { + dv.copyButtons = elt("div", null, "CodeMirror-merge-copybuttons-" + dv.type); + CodeMirror.on(dv.copyButtons, "click", function(e) { + var node = e.target || e.srcElement; + if (!node.chunk) return; + if (node.className == "CodeMirror-merge-copy-reverse") { + copyChunk(dv, dv.orig, dv.edit, node.chunk); + return; + } + copyChunk(dv, dv.edit, dv.orig, node.chunk); + }); + gapElts.unshift(dv.copyButtons); + } + if (dv.mv.options.connect != "align") { + var svg = document.createElementNS && document.createElementNS(svgNS, "svg"); + if (svg && !svg.createSVGRect) svg = null; + dv.svg = svg; + if (svg) gapElts.push(svg); + } + + return dv.gap = elt("div", gapElts, "CodeMirror-merge-gap"); + } + + MergeView.prototype = { + constructor: MergeView, + editor: function() { return this.edit; }, + rightOriginal: function() { return this.right && this.right.orig; }, + leftOriginal: function() { return this.left && this.left.orig; }, + setShowDifferences: function(val) { + if (this.right) this.right.setShowDifferences(val); + if (this.left) this.left.setShowDifferences(val); + }, + rightChunks: function() { + if (this.right) { ensureDiff(this.right); return this.right.chunks; } + }, + leftChunks: function() { + if (this.left) { ensureDiff(this.left); return this.left.chunks; } + } + }; + + function asString(obj) { + if (typeof obj == "string") return obj; + else return obj.getValue(); + } + + // Operations on diffs + + var dmp = new diff_match_patch(); + function getDiff(a, b, ignoreWhitespace) { + var diff = dmp.diff_main(a, b); + // The library sometimes leaves in empty parts, which confuse the algorithm + for (var i = 0; i < diff.length; ++i) { + var part = diff[i]; + if (ignoreWhitespace ? !/[^ \t]/.test(part[1]) : !part[1]) { + diff.splice(i--, 1); + } else if (i && diff[i - 1][0] == part[0]) { + diff.splice(i--, 1); + diff[i][1] += part[1]; + } + } + return diff; + } + + function getChunks(diff) { + var chunks = []; + var startEdit = 0, startOrig = 0; + var edit = Pos(0, 0), orig = Pos(0, 0); + for (var i = 0; i < diff.length; ++i) { + var part = diff[i], tp = part[0]; + if (tp == DIFF_EQUAL) { + var startOff = !startOfLineClean(diff, i) || edit.line < startEdit || orig.line < startOrig ? 1 : 0; + var cleanFromEdit = edit.line + startOff, cleanFromOrig = orig.line + startOff; + moveOver(edit, part[1], null, orig); + var endOff = endOfLineClean(diff, i) ? 1 : 0; + var cleanToEdit = edit.line + endOff, cleanToOrig = orig.line + endOff; + if (cleanToEdit > cleanFromEdit) { + if (i) chunks.push({origFrom: startOrig, origTo: cleanFromOrig, + editFrom: startEdit, editTo: cleanFromEdit}); + startEdit = cleanToEdit; startOrig = cleanToOrig; + } + } else { + moveOver(tp == DIFF_INSERT ? edit : orig, part[1]); + } + } + if (startEdit <= edit.line || startOrig <= orig.line) + chunks.push({origFrom: startOrig, origTo: orig.line + 1, + editFrom: startEdit, editTo: edit.line + 1}); + return chunks; + } + + function endOfLineClean(diff, i) { + if (i == diff.length - 1) return true; + var next = diff[i + 1][1]; + if ((next.length == 1 && i < diff.length - 2) || next.charCodeAt(0) != 10) return false; + if (i == diff.length - 2) return true; + next = diff[i + 2][1]; + return (next.length > 1 || i == diff.length - 3) && next.charCodeAt(0) == 10; + } + + function startOfLineClean(diff, i) { + if (i == 0) return true; + var last = diff[i - 1][1]; + if (last.charCodeAt(last.length - 1) != 10) return false; + if (i == 1) return true; + last = diff[i - 2][1]; + return last.charCodeAt(last.length - 1) == 10; + } + + function chunkBoundariesAround(chunks, n, nInEdit) { + var beforeE, afterE, beforeO, afterO; + for (var i = 0; i < chunks.length; i++) { + var chunk = chunks[i]; + var fromLocal = nInEdit ? chunk.editFrom : chunk.origFrom; + var toLocal = nInEdit ? chunk.editTo : chunk.origTo; + if (afterE == null) { + if (fromLocal > n) { afterE = chunk.editFrom; afterO = chunk.origFrom; } + else if (toLocal > n) { afterE = chunk.editTo; afterO = chunk.origTo; } + } + if (toLocal <= n) { beforeE = chunk.editTo; beforeO = chunk.origTo; } + else if (fromLocal <= n) { beforeE = chunk.editFrom; beforeO = chunk.origFrom; } + } + return {edit: {before: beforeE, after: afterE}, orig: {before: beforeO, after: afterO}}; + } + + function collapseSingle(cm, from, to) { + cm.addLineClass(from, "wrap", "CodeMirror-merge-collapsed-line"); + var widget = document.createElement("span"); + widget.className = "CodeMirror-merge-collapsed-widget"; + widget.title = "Identical text collapsed. Click to expand."; + var mark = cm.markText(Pos(from, 0), Pos(to - 1), { + inclusiveLeft: true, + inclusiveRight: true, + replacedWith: widget, + clearOnEnter: true + }); + function clear() { + mark.clear(); + cm.removeLineClass(from, "wrap", "CodeMirror-merge-collapsed-line"); + } + CodeMirror.on(widget, "click", clear); + return {mark: mark, clear: clear}; + } + + function collapseStretch(size, editors) { + var marks = []; + function clear() { + for (var i = 0; i < marks.length; i++) marks[i].clear(); + } + for (var i = 0; i < editors.length; i++) { + var editor = editors[i]; + var mark = collapseSingle(editor.cm, editor.line, editor.line + size); + marks.push(mark); + mark.mark.on("clear", clear); + } + return marks[0].mark; + } + + function unclearNearChunks(dv, margin, off, clear) { + for (var i = 0; i < dv.chunks.length; i++) { + var chunk = dv.chunks[i]; + for (var l = chunk.editFrom - margin; l < chunk.editTo + margin; l++) { + var pos = l + off; + if (pos >= 0 && pos < clear.length) clear[pos] = false; + } + } + } + + function collapseIdenticalStretches(mv, margin) { + if (typeof margin != "number") margin = 2; + var clear = [], edit = mv.editor(), off = edit.firstLine(); + for (var l = off, e = edit.lastLine(); l <= e; l++) clear.push(true); + if (mv.left) unclearNearChunks(mv.left, margin, off, clear); + if (mv.right) unclearNearChunks(mv.right, margin, off, clear); + + for (var i = 0; i < clear.length; i++) { + if (clear[i]) { + var line = i + off; + for (var size = 1; i < clear.length - 1 && clear[i + 1]; i++, size++) {} + if (size > margin) { + var editors = [{line: line, cm: edit}]; + if (mv.left) editors.push({line: getMatchingOrigLine(line, mv.left.chunks), cm: mv.left.orig}); + if (mv.right) editors.push({line: getMatchingOrigLine(line, mv.right.chunks), cm: mv.right.orig}); + var mark = collapseStretch(size, editors); + if (mv.options.onCollapse) mv.options.onCollapse(mv, line, size, mark); + } + } + } + } + + // General utilities + + function elt(tag, content, className, style) { + var e = document.createElement(tag); + if (className) e.className = className; + if (style) e.style.cssText = style; + if (typeof content == "string") e.appendChild(document.createTextNode(content)); + else if (content) for (var i = 0; i < content.length; ++i) e.appendChild(content[i]); + return e; + } + + function clear(node) { + for (var count = node.childNodes.length; count > 0; --count) + node.removeChild(node.firstChild); + } + + function attrs(elt) { + for (var i = 1; i < arguments.length; i += 2) + elt.setAttribute(arguments[i], arguments[i+1]); + } + + function copyObj(obj, target) { + if (!target) target = {}; + for (var prop in obj) if (obj.hasOwnProperty(prop)) target[prop] = obj[prop]; + return target; + } + + function moveOver(pos, str, copy, other) { + var out = copy ? Pos(pos.line, pos.ch) : pos, at = 0; + for (;;) { + var nl = str.indexOf("\n", at); + if (nl == -1) break; + ++out.line; + if (other) ++other.line; + at = nl + 1; + } + out.ch = (at ? 0 : out.ch) + (str.length - at); + if (other) other.ch = (at ? 0 : other.ch) + (str.length - at); + return out; + } + + // Tracks collapsed markers and line widgets, in order to be able to + // accurately align the content of two editors. + + var F_WIDGET = 1, F_WIDGET_BELOW = 2, F_MARKER = 4 + + function TrackAlignable(cm) { + this.cm = cm + this.alignable = [] + this.height = cm.doc.height + var self = this + cm.on("markerAdded", function(_, marker) { + if (!marker.collapsed) return + var found = marker.find(1) + if (found != null) self.set(found.line, F_MARKER) + }) + cm.on("markerCleared", function(_, marker, _min, max) { + if (max != null && marker.collapsed) + self.check(max, F_MARKER, self.hasMarker) + }) + cm.on("markerChanged", this.signal.bind(this)) + cm.on("lineWidgetAdded", function(_, widget, lineNo) { + if (widget.mergeSpacer) return + if (widget.above) self.set(lineNo - 1, F_WIDGET_BELOW) + else self.set(lineNo, F_WIDGET) + }) + cm.on("lineWidgetCleared", function(_, widget, lineNo) { + if (widget.mergeSpacer) return + if (widget.above) self.check(lineNo - 1, F_WIDGET_BELOW, self.hasWidgetBelow) + else self.check(lineNo, F_WIDGET, self.hasWidget) + }) + cm.on("lineWidgetChanged", this.signal.bind(this)) + cm.on("change", function(_, change) { + var start = change.from.line, nBefore = change.to.line - change.from.line + var nAfter = change.text.length - 1, end = start + nAfter + if (nBefore || nAfter) self.map(start, nBefore, nAfter) + self.check(end, F_MARKER, self.hasMarker) + if (nBefore || nAfter) self.check(change.from.line, F_MARKER, self.hasMarker) + }) + cm.on("viewportChange", function() { + if (self.cm.doc.height != self.height) self.signal() + }) + } + + TrackAlignable.prototype = { + signal: function() { + CodeMirror.signal(this, "realign") + this.height = this.cm.doc.height + }, + + set: function(n, flags) { + var pos = -1 + for (; pos < this.alignable.length; pos += 2) { + var diff = this.alignable[pos] - n + if (diff == 0) { + if ((this.alignable[pos + 1] & flags) == flags) return + this.alignable[pos + 1] |= flags + this.signal() + return + } + if (diff > 0) break + } + this.signal() + this.alignable.splice(pos, 0, n, flags) + }, + + find: function(n) { + for (var i = 0; i < this.alignable.length; i += 2) + if (this.alignable[i] == n) return i + return -1 + }, + + check: function(n, flag, pred) { + var found = this.find(n) + if (found == -1 || !(this.alignable[found + 1] & flag)) return + if (!pred.call(this, n)) { + this.signal() + var flags = this.alignable[found + 1] & ~flag + if (flags) this.alignable[found + 1] = flags + else this.alignable.splice(found, 2) + } + }, + + hasMarker: function(n) { + var handle = this.cm.getLineHandle(n) + if (handle.markedSpans) for (var i = 0; i < handle.markedSpans.length; i++) + if (handle.markedSpans[i].mark.collapsed && handle.markedSpans[i].to != null) + return true + return false + }, + + hasWidget: function(n) { + var handle = this.cm.getLineHandle(n) + if (handle.widgets) for (var i = 0; i < handle.widgets.length; i++) + if (!handle.widgets[i].above && !handle.widgets[i].mergeSpacer) return true + return false + }, + + hasWidgetBelow: function(n) { + if (n == this.cm.lastLine()) return false + var handle = this.cm.getLineHandle(n + 1) + if (handle.widgets) for (var i = 0; i < handle.widgets.length; i++) + if (handle.widgets[i].above && !handle.widgets[i].mergeSpacer) return true + return false + }, + + map: function(from, nBefore, nAfter) { + var diff = nAfter - nBefore, to = from + nBefore, widgetFrom = -1, widgetTo = -1 + for (var i = 0; i < this.alignable.length; i += 2) { + var n = this.alignable[i] + if (n == from && (this.alignable[i + 1] & F_WIDGET_BELOW)) widgetFrom = i + if (n == to && (this.alignable[i + 1] & F_WIDGET_BELOW)) widgetTo = i + if (n <= from) continue + else if (n < to) this.alignable.splice(i--, 2) + else this.alignable[i] += diff + } + if (widgetFrom > -1) { + var flags = this.alignable[widgetFrom + 1] + if (flags == F_WIDGET_BELOW) this.alignable.splice(widgetFrom, 2) + else this.alignable[widgetFrom + 1] = flags & ~F_WIDGET_BELOW + } + if (widgetTo > -1 && nAfter) + this.set(from + nAfter, F_WIDGET_BELOW) + } + } + + function posMin(a, b) { return (a.line - b.line || a.ch - b.ch) < 0 ? a : b; } + function posMax(a, b) { return (a.line - b.line || a.ch - b.ch) > 0 ? a : b; } + function posEq(a, b) { return a.line == b.line && a.ch == b.ch; } + + function findPrevDiff(chunks, start, isOrig) { + for (var i = chunks.length - 1; i >= 0; i--) { + var chunk = chunks[i]; + var to = (isOrig ? chunk.origTo : chunk.editTo) - 1; + if (to < start) return to; + } + } + + function findNextDiff(chunks, start, isOrig) { + for (var i = 0; i < chunks.length; i++) { + var chunk = chunks[i]; + var from = (isOrig ? chunk.origFrom : chunk.editFrom); + if (from > start) return from; + } + } + + function goNearbyDiff(cm, dir) { + var found = null, views = cm.state.diffViews, line = cm.getCursor().line; + if (views) for (var i = 0; i < views.length; i++) { + var dv = views[i], isOrig = cm == dv.orig; + ensureDiff(dv); + var pos = dir < 0 ? findPrevDiff(dv.chunks, line, isOrig) : findNextDiff(dv.chunks, line, isOrig); + if (pos != null && (found == null || (dir < 0 ? pos > found : pos < found))) + found = pos; + } + if (found != null) + cm.setCursor(found, 0); + else + return CodeMirror.Pass; + } + + CodeMirror.commands.goNextDiff = function(cm) { + return goNearbyDiff(cm, 1); + }; + CodeMirror.commands.goPrevDiff = function(cm) { + return goNearbyDiff(cm, -1); + }; +}); diff --git a/pigx-register/src/main/resources/static/console-ui/public/js/vs/base/worker/workerMain.js b/pigx-register/src/main/resources/static/console-ui/public/js/vs/base/worker/workerMain.js new file mode 100644 index 0000000..84daa48 --- /dev/null +++ b/pigx-register/src/main/resources/static/console-ui/public/js/vs/base/worker/workerMain.js @@ -0,0 +1,8 @@ +/*!----------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Version: 0.10.1(ebbf400719be21761361804bf63fb3916e64a845) + * Released under the MIT license + * https://github.com/Microsoft/vscode/blob/master/LICENSE.txt + *-----------------------------------------------------------*/ +(function(){var e=["exports","require","vs/base/common/winjs.base","vs/editor/common/core/position","vs/base/common/platform","vs/editor/common/core/range","vs/base/common/uri","vs/editor/common/core/uint","vs/base/common/errors","vs/base/common/event","vs/base/common/lifecycle","vs/base/common/functional","vs/base/common/diff/diff","vs/base/common/cancellation","vs/base/common/types","vs/base/common/callbackList","vs/base/common/diff/diffChange","vs/base/common/map","vs/base/common/async","vs/editor/common/viewModel/prefixSumComputer","vs/base/common/strings","vs/base/common/keyCodes","vs/editor/common/core/selection","vs/editor/common/core/token","vs/editor/common/model/mirrorModel","vs/editor/common/core/characterClassifier","vs/editor/common/diff/diffComputer","vs/editor/common/model/wordHelper","vs/editor/common/modes/linkComputer","vs/editor/common/modes/supports/inplaceReplaceSupport","vs/editor/common/standalone/standaloneBase","vs/base/common/worker/simpleWorker","vs/base/common/winjs.base.raw","vs/editor/common/services/editorSimpleWorker"],t=function(t){for(var n=[],r=0,i=t.length;r=0)||"undefined"!=typeof process&&"win32"===process.platform},t}();e.Environment=t}(i||(i={}));!function(e){var t;!function(e){e[e.LoaderAvailable=1]="LoaderAvailable",e[e.BeginLoadingScript=10]="BeginLoadingScript",e[e.EndLoadingScriptOK=11]="EndLoadingScriptOK",e[e.EndLoadingScriptError=12]="EndLoadingScriptError",e[e.BeginInvokeFactory=21]="BeginInvokeFactory",e[e.EndInvokeFactory=22]="EndInvokeFactory",e[e.NodeBeginEvaluatingScript=31]="NodeBeginEvaluatingScript",e[e.NodeEndEvaluatingScript=32]="NodeEndEvaluatingScript",e[e.NodeBeginNativeRequire=33]="NodeBeginNativeRequire",e[e.NodeEndNativeRequire=34]="NodeEndNativeRequire"}(t=e.LoaderEventType||(e.LoaderEventType={}));var n=function(){return function(e,t,n){this.type=e,this.detail=t,this.timestamp=n}}();e.LoaderEvent=n;var r=function(){function r(e){this._events=[new n(t.LoaderAvailable,"",e)]}return r.prototype.record=function(t,r){this._events.push(new n(t,r,e.Utilities.getHighPerformanceTimestamp()))},r.prototype.getEvents=function(){return this._events},r}();e.LoaderEventRecorder=r;var i=function(){function e(){}return e.prototype.record=function(e,t){},e.prototype.getEvents=function(){return[]},e}();i.INSTANCE=new i,e.NullLoaderEventRecorder=i}(i||(i={}));!function(e){var t=function(){function t(){}return t.fileUriToFilePath=function(e,t){if(t=decodeURI(t),e){if(/^file:\/\/\//.test(t))return t.substr(8);if(/^file:\/\//.test(t))return t.substr(5)}else if(/^file:\/\//.test(t))return t.substr(7);return t},t.startsWith=function(e,t){return e.length>=t.length&&e.substr(0,t.length)===t},t.endsWith=function(e,t){return e.length>=t.length&&e.substr(e.length-t.length)===t},t.containsQueryString=function(e){return/^[^\#]*\?/gi.test(e)},t.isAbsolutePath=function(e){return/^((http:\/\/)|(https:\/\/)|(file:\/\/)|(\/))/.test(e)},t.forEachProperty=function(e,t){if(e){var n=void 0;for(n in e)e.hasOwnProperty(n)&&t(n,e[n])}},t.isEmpty=function(e){var n=!0;return t.forEachProperty(e,function(){n=!1}),n},t.recursiveClone=function(e){if(!e||"object"!=typeof e)return e;var n=Array.isArray(e)?[]:{};return t.forEachProperty(e,function(e,r){n[e]=r&&"object"==typeof r?t.recursiveClone(r):r}),n},t.generateAnonymousModule=function(){return"===anonymous"+t.NEXT_ANONYMOUS_ID+++"==="},t.isAnonymousModule=function(e){return/^===anonymous/.test(e)},t.getHighPerformanceTimestamp=function(){return this.PERFORMANCE_NOW_PROBED||(this.PERFORMANCE_NOW_PROBED=!0,this.HAS_PERFORMANCE_NOW=e.global.performance&&"function"==typeof e.global.performance.now),this.HAS_PERFORMANCE_NOW?e.global.performance.now():Date.now()},t}();t.NEXT_ANONYMOUS_ID=1,t.PERFORMANCE_NOW_PROBED=!1,t.HAS_PERFORMANCE_NOW=!1,e.Utilities=t}(i||(i={}));!function(e){var t=function(){function t(){}return t.validateConfigurationOptions=function(t,n){return"string"!=typeof(n=n||{}).baseUrl&&(n.baseUrl=""),"boolean"!=typeof n.isBuild&&(n.isBuild=!1),"object"!=typeof n.paths&&(n.paths={}),"object"!=typeof n.config&&(n.config={}),void 0===n.catchError&&(n.catchError=t),"string"!=typeof n.urlArgs&&(n.urlArgs=""),"function"!=typeof n.onError&&(n.onError=function(e){return"load"===e.errorCode?(console.error('Loading "'+e.moduleId+'" failed'),console.error("Detail: ",e.detail),e.detail&&e.detail.stack&&console.error(e.detail.stack),console.error("Here are the modules that depend on it:"),void console.error(e.neededBy)):"factory"===e.errorCode?(console.error('The factory method of "'+e.moduleId+'" has thrown an exception'),console.error(e.detail),void(e.detail&&e.detail.stack&&console.error(e.detail.stack))):void 0}),"object"==typeof n.ignoreDuplicateModules&&Array.isArray(n.ignoreDuplicateModules)||(n.ignoreDuplicateModules=[]),n.baseUrl.length>0&&(e.Utilities.endsWith(n.baseUrl,"/")||(n.baseUrl+="/")),Array.isArray(n.nodeModules)||(n.nodeModules=[]),("number"!=typeof n.nodeCachedDataWriteDelay||n.nodeCachedDataWriteDelay<0)&&(n.nodeCachedDataWriteDelay=7e3),"function"!=typeof n.onNodeCachedData&&(n.onNodeCachedData=function(e,t){e&&("cachedDataRejected"===e.errorCode?console.warn("Rejected cached data from file: "+e.path):"unlink"===e.errorCode||"writeFile"===e.errorCode?(console.error("Problems writing cached data file: "+e.path),console.error(e.detail)):console.error(e))}),n},t.mergeConfigurationOptions=function(n,r,i){void 0===r&&(r=null),void 0===i&&(i=null);var o=e.Utilities.recursiveClone(i||{});return e.Utilities.forEachProperty(r,function(t,n){"ignoreDuplicateModules"===t&&void 0!==o.ignoreDuplicateModules?o.ignoreDuplicateModules=o.ignoreDuplicateModules.concat(n):"paths"===t&&void 0!==o.paths?e.Utilities.forEachProperty(n,function(e,t){return o.paths[e]=t}):"config"===t&&void 0!==o.config?e.Utilities.forEachProperty(n,function(e,t){return o.config[e]=t}):o[t]=e.Utilities.recursiveClone(n)}),t.validateConfigurationOptions(n,o)},t}();e.ConfigurationOptionsUtil=t;var n=function(){function n(e,n){if(this._env=e,this.options=t.mergeConfigurationOptions(this._env.isWebWorker,n),this._createIgnoreDuplicateModulesMap(),this._createNodeModulesMap(),this._createSortedPathsRules(),""===this.options.baseUrl){if(this._env.isNode&&this.options.nodeRequire&&this.options.nodeRequire.main&&this.options.nodeRequire.main.filename){var r=this.options.nodeRequire.main.filename,i=Math.max(r.lastIndexOf("/"),r.lastIndexOf("\\"));this.options.baseUrl=r.substring(0,i+1)}if(this._env.isNode&&this.options.nodeMain){var r=this.options.nodeMain,i=Math.max(r.lastIndexOf("/"),r.lastIndexOf("\\"));this.options.baseUrl=r.substring(0,i+1)}}}return n.prototype._createIgnoreDuplicateModulesMap=function(){this.ignoreDuplicateModulesMap={};for(var e=0;e=0){var r=t.resolveModule(e.substr(0,n)),s=t.resolveModule(e.substr(n+1)),u=this._moduleIdProvider.getModuleId(r+"!"+s),a=this._moduleIdProvider.getModuleId(r);return new o(u,a,s)}return new i(this._moduleIdProvider.getModuleId(t.resolveModule(e)))},s.prototype._normalizeDependencies=function(e,t){for(var n=[],r=0,i=0,o=e.length;i0;){var a=u.shift(),l=this._modules2[a];l&&(s=l.onDependencyError(n)||s);var c=this._inverseDependencies2[a];if(c)for(var i=0,o=c.length;i0;){var u=s.shift().dependencies;if(u)for(var i=0,o=u.length;i=i.length)n._onLoadError(t,r);else{var u=i[o],a=n.getRecorder();if(n._config.isBuild()&&"empty:"===u)return n._buildInfoPath[t]=u,n.defineModule(n._moduleIdProvider.getStrModuleId(t),[],null,null,null),void n._onLoad(t);a.record(e.LoaderEventType.BeginLoadingScript,u),n._scriptLoader.load(n,u,function(){n._config.isBuild()&&(n._buildInfoPath[t]=u),a.record(e.LoaderEventType.EndLoadingScriptOK,u),n._onLoad(t)},function(t){a.record(e.LoaderEventType.EndLoadingScriptError,u),s(t)})}};s(null)}},s.prototype._loadPluginDependency=function(e,n){var r=this;if(!this._modules2[n.id]&&!this._knownModules2[n.id]){this._knownModules2[n.id]=!0;var i=function(e){r.defineModule(r._moduleIdProvider.getStrModuleId(n.id),[],e,null,null)};i.error=function(e){r._config.onError(r._createLoadError(n.id,e))},e.load(n.pluginParam,this._createRequire(t.ROOT),i,this._config.getOptionsLiteral())}},s.prototype._resolve=function(e){for(var t=this,n=e.dependencies,r=0,s=n.length;r \n")),e.unresolvedDependenciesCount--}else if(this._inverseDependencies2[u.id]=this._inverseDependencies2[u.id]||[],this._inverseDependencies2[u.id].push(e.id),u instanceof o){var c=this._modules2[u.pluginId];if(c&&c.isComplete()){this._loadPluginDependency(c.exports,u);continue}var f=this._inversePluginDependencies2.get(u.pluginId);f||(f=[],this._inversePluginDependencies2.set(u.pluginId,f)),f.push(u),this._loadModule(u.pluginId)}else this._loadModule(u.id)}else e.unresolvedDependenciesCount--;else e.unresolvedDependenciesCount--;else e.exportsPassedIn=!0,e.unresolvedDependenciesCount--}0===e.unresolvedDependenciesCount&&this._onModuleComplete(e)},s.prototype._onModuleComplete=function(e){var t=this,n=this.getRecorder();if(!e.isComplete()){for(var r=e.dependencies,o=[],s=0,u=r.length;s0||this.m_modifiedCount>0)&&this.m_changes.push(new n.DiffChange(this.m_originalStart,this.m_originalCount,this.m_modifiedStart,this.m_modifiedCount)),this.m_originalCount=0,this.m_modifiedCount=0,this.m_originalStart=Number.MAX_VALUE,this.m_modifiedStart=Number.MAX_VALUE},e.prototype.AddOriginalElement=function(e,t){this.m_originalStart=Math.min(this.m_originalStart,e),this.m_modifiedStart=Math.min(this.m_modifiedStart,t),this.m_originalCount++},e.prototype.AddModifiedElement=function(e,t){this.m_originalStart=Math.min(this.m_originalStart,e),this.m_modifiedStart=Math.min(this.m_modifiedStart,t),this.m_modifiedCount++},e.prototype.getChanges=function(){return(this.m_originalCount>0||this.m_modifiedCount>0)&&this.MarkNextChange(),this.m_changes},e.prototype.getReverseChanges=function(){return(this.m_originalCount>0||this.m_modifiedCount>0)&&this.MarkNextChange(),this.m_changes.reverse(),this.m_changes},e}(),u=Object.prototype.hasOwnProperty,a=function(){function e(e,t,n){void 0===n&&(n=null),this.OriginalSequence=e,this.ModifiedSequence=t,this.ContinueProcessingPredicate=n,this.m_originalIds=[],this.m_modifiedIds=[],this.m_forwardHistory=[],this.m_reverseHistory=[],this.ComputeUniqueIdentifiers()}return e.prototype.ComputeUniqueIdentifiers=function(){var e=this.OriginalSequence.getLength(),t=this.ModifiedSequence.getLength();this.m_originalIds=new Array(e),this.m_modifiedIds=new Array(t);var n,r={},i=1;for(n=0;n=e&&o>=r&&this.ElementsAreEqual(t,o);)t--,o--;if(e>t||r>o){var u=void 0;return r<=o?(i.Assert(e===t+1,"originalStart should only be one more than originalEnd"),u=[new n.DiffChange(e,0,r,o-r+1)]):e<=t?(i.Assert(r===o+1,"modifiedStart should only be one more than modifiedEnd"),u=[new n.DiffChange(e,t-e+1,r,0)]):(i.Assert(e===t+1,"originalStart should only be one more than originalEnd"),i.Assert(r===o+1,"modifiedStart should only be one more than modifiedEnd"),u=[]),u}var a=[0],l=[0],c=this.ComputeRecursionPoint(e,t,r,o,a,l,s),f=a[0],h=l[0];if(null!==c)return c;if(!s[0]){var d=this.ComputeDiffRecursive(e,f,r,h,s),p=[];return p=s[0]?[new n.DiffChange(f+1,t-(f+1)+1,h+1,o-(h+1)+1)]:this.ComputeDiffRecursive(f+1,t,h+1,o,s),this.ConcatenateChanges(d,p)}return[new n.DiffChange(e,t-e+1,r,o-r+1)]},e.prototype.WALKTRACE=function(e,t,r,i,o,u,a,l,c,f,h,d,p,m,_,g,v,y){var b,C=null,E=null,S=new s,L=t,N=r,A=p[0]-g[0]-i,P=Number.MIN_VALUE,M=this.m_forwardHistory.length-1;do{(b=A+e)===L||b=0&&(e=(c=this.m_forwardHistory[M])[0],L=1,N=c.length-1)}while(--M>=-1);if(C=S.getReverseChanges(),y[0]){var w=p[0]+1,D=g[0]+1;if(null!==C&&C.length>0){var I=C[C.length-1];w=Math.max(w,I.getOriginalEnd()),D=Math.max(D,I.getModifiedEnd())}E=[new n.DiffChange(w,d-w+1,D,_-D+1)]}else{S=new s,L=u,N=a,A=p[0]-g[0]-l,P=Number.MAX_VALUE,M=v?this.m_reverseHistory.length-1:this.m_reverseHistory.length-2;do{(b=A+o)===L||b=f[b+1]?(m=(h=f[b+1]-1)-A-l,h>P&&S.MarkNextChange(),P=h+1,S.AddOriginalElement(h+1,m+1),A=b+1-o):(m=(h=f[b-1])-A-l,h>P&&S.MarkNextChange(),P=h,S.AddModifiedElement(h+1,m+1),A=b-1-o),M>=0&&(o=(f=this.m_reverseHistory[M])[0],L=1,N=f.length-1)}while(--M>=-1);E=S.getChanges()}return this.ConcatenateChanges(C,E)},e.prototype.ComputeRecursionPoint=function(e,t,r,i,s,u,a){var l,c,f,h=0,d=0,p=0,m=0;e--,r--,s[0]=0,u[0]=0,this.m_forwardHistory=[],this.m_reverseHistory=[];var _=t-e+(i-r),g=_+1,v=new Array(g),y=new Array(g),b=i-r,C=t-e,E=e-r,S=t-i,L=(C-b)%2==0;v[b]=e,y[C]=t,a[0]=!1;var N,A;for(f=1;f<=_/2+1;f++){var P=0,M=0;for(h=this.ClipDiagonalBound(b-f,f,b,g),d=this.ClipDiagonalBound(b+f,f,b,g),N=h;N<=d;N+=2){for(c=(l=N===h||NP+M&&(P=l,M=c),!L&&Math.abs(N-C)<=f-1&&l>=y[N])return s[0]=l,u[0]=c,A<=y[N]&&f<=1448?this.WALKTRACE(b,h,d,E,C,p,m,S,v,y,l,t,s,c,i,u,L,a):null}var w=(P-e+(M-r)-f)/2;if(null!==this.ContinueProcessingPredicate&&!this.ContinueProcessingPredicate(P,this.OriginalSequence,w))return a[0]=!0,s[0]=P,u[0]=M,w>0&&f<=1448?this.WALKTRACE(b,h,d,E,C,p,m,S,v,y,l,t,s,c,i,u,L,a):(e++,r++,[new n.DiffChange(e,t-e+1,r,i-r+1)]);for(p=this.ClipDiagonalBound(C-f,f,C,g),m=this.ClipDiagonalBound(C+f,f,C,g),N=p;N<=m;N+=2){for(c=(l=N===p||N=y[N+1]?y[N+1]-1:y[N-1])-(N-C)-S,A=l;l>e&&c>r&&this.ElementsAreEqual(l,c);)l--,c--;if(y[N]=l,L&&Math.abs(N-b)<=f&&l<=v[N])return s[0]=l,u[0]=c,A>=v[N]&&f<=1448?this.WALKTRACE(b,h,d,E,C,p,m,S,v,y,l,t,s,c,i,u,L,a):null}if(f<=1447){var D=new Array(d-h+2);D[0]=b-h+1,o.Copy(v,h,D,1,d-h+1),this.m_forwardHistory.push(D),(D=new Array(m-p+2))[0]=C-p+1,o.Copy(y,p,D,1,m-p+1),this.m_reverseHistory.push(D)}}return this.WALKTRACE(b,h,d,E,C,p,m,S,v,y,l,t,s,c,i,u,L,a)},e.prototype.ShiftChanges=function(e){var t;do{t=!1;for(l=0;l0,s=n.modifiedLength>0;n.originalStart+n.originalLength=0;l--){var n=e[l],r=0,i=0;if(l>0){var c=e[l-1];c.originalLength>0&&(r=c.originalStart+c.originalLength),c.modifiedLength>0&&(i=c.modifiedStart+c.modifiedLength)}for(var o=n.originalLength>0,s=n.modifiedLength>0,f=0,h=this._boundaryScore(n.originalStart,n.originalLength,n.modifiedStart,n.modifiedLength),d=1;;d++){var p=n.originalStart-d,m=n.modifiedStart-d;if(ph&&(h=_,f=d)}n.originalStart-=f,n.modifiedStart-=f}return e},e.prototype._OriginalIsBoundary=function(e){return e<=0||e>=this.OriginalSequence.getLength()-1||/^\s*$/.test(this.OriginalSequence.getElementHash(e))},e.prototype._OriginalRegionIsBoundary=function(e,t){if(this._OriginalIsBoundary(e)||this._OriginalIsBoundary(e-1))return!0;if(t>0){var n=e+t;if(this._OriginalIsBoundary(n-1)||this._OriginalIsBoundary(n))return!0}return!1},e.prototype._ModifiedIsBoundary=function(e){return e<=0||e>=this.ModifiedSequence.getLength()-1||/^\s*$/.test(this.ModifiedSequence.getElementHash(e))},e.prototype._ModifiedRegionIsBoundary=function(e,t){if(this._ModifiedIsBoundary(e)||this._ModifiedIsBoundary(e-1))return!0;if(t>0){var n=e+t;if(this._ModifiedIsBoundary(n-1)||this._ModifiedIsBoundary(n))return!0}return!1},e.prototype._boundaryScore=function(e,t,n,r){return(this._OriginalRegionIsBoundary(e,t)?1:0)+(this._ModifiedRegionIsBoundary(n,r)?1:0)},e.prototype.ConcatenateChanges=function(e,t){var n=[],r=null;return 0===e.length||0===t.length?t.length>0?t:e:this.ChangesOverlap(e[e.length-1],t[0],n)?(r=new Array(e.length+t.length-1),o.Copy(e,0,r,0,e.length-1),r[e.length-1]=n[0],o.Copy(t,1,r,e.length,t.length-1),r):(r=new Array(e.length+t.length),o.Copy(e,0,r,0,e.length),o.Copy(t,0,r,e.length,t.length),r)},e.prototype.ChangesOverlap=function(e,t,r){if(i.Assert(e.originalStart<=t.originalStart,"Left change is not less than or equal to right change"),i.Assert(e.modifiedStart<=t.modifiedStart,"Left change is not less than or equal to right change"),e.originalStart+e.originalLength>=t.originalStart||e.modifiedStart+e.modifiedLength>=t.modifiedStart){var o=e.originalStart,s=e.originalLength,u=e.modifiedStart,a=e.modifiedLength;return e.originalStart+e.originalLength>=t.originalStart&&(s=t.originalStart+t.originalLength-e.originalStart),e.modifiedStart+e.modifiedLength>=t.modifiedStart&&(a=t.modifiedStart+t.modifiedLength-e.modifiedStart),r[0]=new n.DiffChange(o,s,u,a),!0}return r[0]=null,!1},e.prototype.ClipDiagonalBound=function(e,t,n,r){if(e>=0&&e>>0)>>>0},t.createKeybinding=function(e,t){if(0===e)return null;var r=(65535&e)>>>0,i=(4294901760&e)>>>16;return 0!==i?new l(n(r,t),n(i,t)):n(r,t)},t.createSimpleKeybinding=n;!function(e){e[e.Simple=1]="Simple",e[e.Chord=2]="Chord"}(t.KeybindingType||(t.KeybindingType={}));var a=function(){function e(e,t,n,r,i){this.type=1,this.ctrlKey=e,this.shiftKey=t,this.altKey=n,this.metaKey=r,this.keyCode=i}return e.prototype.equals=function(e){return 1===e.type&&(this.ctrlKey===e.ctrlKey&&this.shiftKey===e.shiftKey&&this.altKey===e.altKey&&this.metaKey===e.metaKey&&this.keyCode===e.keyCode)},e.prototype.isModifierKey=function(){return 0===this.keyCode||5===this.keyCode||57===this.keyCode||6===this.keyCode||4===this.keyCode},e.prototype.isDuplicateModifierCase=function(){return this.ctrlKey&&5===this.keyCode||this.shiftKey&&4===this.keyCode||this.altKey&&6===this.keyCode||this.metaKey&&57===this.keyCode},e}();t.SimpleKeybinding=a;var l=function(){return function(e,t){this.type=2,this.firstPart=e,this.chordPart=t}}();t.ChordKeybinding=l;var c=function(){return function(e,t,n,r,i,o){this.ctrlKey=e,this.shiftKey=t,this.altKey=n,this.metaKey=r,this.keyLabel=i,this.keyAriaLabel=o}}();t.ResolvedKeybindingPart=c;var f=function(){return function(){}}();t.ResolvedKeybinding=f}),r(e[10],t([1,0,11]),function(e,t,n){"use strict";function r(e){for(var t=[],n=1;n=0,r=d.indexOf("Macintosh")>=0,i=d.indexOf("Linux")>=0,u=!0,l=a=navigator.language}var p;!function(e){e[e.Web=0]="Web",e[e.Mac=1]="Mac",e[e.Linux=2]="Linux",e[e.Windows=3]="Windows"}(p=t.Platform||(t.Platform={}));var m=p.Web;s&&(r?m=p.Mac:n?m=p.Windows:i&&(m=p.Linux)),t.isWindows=n,t.isMacintosh=r,t.isLinux=i,t.isRootUser=o,t.isNative=s,t.isWeb=u,t.platform=m,t.language=l,t.locale=a;var _="object"==typeof self?self:global;t.globals=_,t.hasWebWorkerSupport=function(){return void 0!==_.Worker},t.setTimeout=_.setTimeout.bind(_),t.clearTimeout=_.clearTimeout.bind(_),t.setInterval=_.setInterval.bind(_),t.clearInterval=_.clearInterval.bind(_);!function(e){e[e.Windows=1]="Windows",e[e.Macintosh=2]="Macintosh",e[e.Linux=3]="Linux"}(t.OperatingSystem||(t.OperatingSystem={})),t.OS=r?2:n?1:3;!function(e){e[e.Unknown=0]="Unknown",e[e.Disabled=1]="Disabled",e[e.Enabled=2]="Enabled"}(t.AccessibilitySupport||(t.AccessibilitySupport={}))}),r(e[14],t([1,0]),function(e,t){"use strict";function n(e){return Array.isArray?Array.isArray(e):!(!e||typeof e.length!==a.number||e.constructor!==Array)}function r(e){return typeof e===a.string||e instanceof String}function i(e){return!(typeof e!==a.object||null===e||Array.isArray(e)||e instanceof RegExp||e instanceof Date)}function o(e){return typeof e===a.undefined}function s(e){return typeof e===a.function}function u(e,t){if(r(t)){if(typeof e!==t)throw new Error("argument does not match constraint: typeof "+t)}else if(s(t)){if(e instanceof t)return;if(e&&e.constructor===t)return;if(1===t.length&&!0===t.call(void 0,e))return;throw new Error("argument does not match one of these constraints: arg instanceof constraint, arg.constructor === constraint, nor constraint(arg) === true")}}Object.defineProperty(t,"__esModule",{value:!0});var a={number:"number",string:"string",undefined:"undefined",object:"object",function:"function"};t.isArray=n,t.isString=r,t.isStringArray=function(e){return n(e)&&e.every(function(e){return r(e)})},t.isObject=i,t.isNumber=function(e){return(typeof e===a.number||e instanceof Number)&&!isNaN(e)},t.isBoolean=function(e){return!0===e||!1===e},t.isUndefined=o,t.isUndefinedOrNull=function(e){return o(e)||null===e};var l=Object.prototype.hasOwnProperty;t.isEmptyObject=function(e){if(!i(e))return!1;for(var t in e)if(l.call(e,t))return!1;return!0},t.isFunction=s,t.areFunctions=function(){for(var e=[],t=0;t0&&e.every(s)},t.validateConstraints=function(e,t){for(var n=Math.min(e.length,t.length),r=0;rthis.limit;)this.trim()},e.prototype.serialize=function(){var e={entries:[]};return this.map.forEach(function(t){e.entries.push({key:t.key,value:t.value})}),e},Object.defineProperty(e.prototype,"size",{get:function(){return this.map.size},enumerable:!0,configurable:!0}),e.prototype.set=function(e,t){if(this.map.has(e))return!1;var n={key:e,value:t};return this.push(n),this.size>this.limit&&this.trim(),!0},e.prototype.get=function(e){var t=this.map.get(e);return t?t.value:null},e.prototype.getOrSet=function(e,t){var n=this.get(e);return n||(this.set(e,t),t)},e.prototype.delete=function(e){var t=this.map.get(e);return t?(this.map.delete(e),t.next?t.next.prev=t.prev:this.head=t.prev,t.prev?t.prev.next=t.next:this.tail=t.next,t.value):null},e.prototype.has=function(e){return this.map.has(e)},e.prototype.clear=function(){this.map.clear(),this.head=null,this.tail=null},e.prototype.push=function(e){this.head&&(e.prev=this.head,this.head.next=e),this.tail||(this.tail=e),this.head=e,this.map.set(e.key,e)},e.prototype.trim=function(){if(this.tail)if(this.ratiot?1:0}function u(e){return e>=97&&e<=122}function a(e){return e>=65&&e<=90}function l(e){return u(e)||a(e)}function c(e,t,n){if(void 0===n&&(n=e.length),"string"!=typeof e||"string"!=typeof t)return!1;for(var r=0;r=11904&&e<=55215||e>=63744&&e<=64255||e>=65281&&e<=65374}Object.defineProperty(t,"__esModule",{value:!0}),t.empty="",t.isFalsyOrWhitespace=function(e){return!e||"string"!=typeof e||0===e.trim().length},t.pad=function(e,t,n){void 0===n&&(n="0");for(var r=""+e,i=[r],o=r.length;o=t.length?e:t[r]})},t.escape=function(e){return e.replace(/[<|>|&]/g,function(e){switch(e){case"<":return"<";case">":return">";case"&":return"&";default:return e}})},t.escapeRegExpCharacters=r,t.trim=function(e,t){return void 0===t&&(t=" "),o(i(e,t),t)},t.ltrim=i,t.rtrim=o,t.convertSimple2RegExpPattern=function(e){return e.replace(/[\-\\\{\}\+\?\|\^\$\.\,\[\]\(\)\#\s]/g,"\\$&").replace(/[\*]/g,".*")},t.stripWildcards=function(e){return e.replace(/\*/g,"")},t.startsWith=function(e,t){if(e.length0?e.indexOf(t,n)===n:0===n&&e===t},t.indexOfIgnoreCase=function(e,t,n){void 0===n&&(n=0);var i=e.indexOf(t,n);return i<0&&(n>0&&(e=e.substr(n)),t=r(t),i=e.search(new RegExp(t,"i"))),i},t.createRegExp=function(e,t,n){if(void 0===n&&(n={}),!e)throw new Error("Cannot create regex from empty string");t||(e=r(e)),n.wholeWord&&(/\B/.test(e.charAt(0))||(e="\\b"+e),/\B/.test(e.charAt(e.length-1))||(e+="\\b"));var i="";return n.global&&(i+="g"),n.matchCase||(i+="i"),n.multiline&&(i+="m"),new RegExp(e,i)},t.regExpLeadsToEndlessLoop=function(e){return"^"!==e.source&&"^$"!==e.source&&"$"!==e.source&&e.exec("")&&0===e.lastIndex},t.canNormalize="function"==typeof"".normalize;var p=/[^\u0000-\u0080]/,m=new n.BoundedMap(1e4);t.normalizeNFC=function(e){if(!t.canNormalize||!e)return e;var n=m.get(e);if(n)return n;var r;return r=p.test(e)?e.normalize("NFC"):e,m.set(e,r),r},t.firstNonWhitespaceIndex=function(e){for(var t=0,n=e.length;t=0;n--){var r=e.charCodeAt(n);if(32!==r&&9!==r)return n}return-1},t.compare=s,t.compareIgnoreCase=function(e,t){for(var n=Math.min(e.length,t.length),r=0;rt.length?1:0},t.equalsIgnoreCase=function(e,t){return(e?e.length:0)===(t?t.length:0)&&c(e,t)},t.beginsWithIgnoreCase=function(e,t){var n=t.length;return!(t.length>e.length)&&c(e,t,n)},t.commonPrefixLength=function(e,t){var n,r=Math.min(e.length,t.length);for(n=0;n0;){if(f(e,i,n,t,0,r))return r;r-=1,i+=1}return 0},t.isHighSurrogate=function(e){return 55296<=e&&e<=56319},t.isLowSurrogate=function(e){return 56320<=e&&e<=57343};var _=/(?:[\u05BE\u05C0\u05C3\u05C6\u05D0-\u05F4\u0608\u060B\u060D\u061B-\u064A\u066D-\u066F\u0671-\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u0710\u0712-\u072F\u074D-\u07A5\u07B1-\u07EA\u07F4\u07F5\u07FA-\u0815\u081A\u0824\u0828\u0830-\u0858\u085E-\u08BD\u200F\uFB1D\uFB1F-\uFB28\uFB2A-\uFD3D\uFD50-\uFDFC\uFE70-\uFEFC]|\uD802[\uDC00-\uDD1B\uDD20-\uDE00\uDE10-\uDE33\uDE40-\uDEE4\uDEEB-\uDF35\uDF40-\uDFFF]|\uD803[\uDC00-\uDCFF]|\uD83A[\uDC00-\uDCCF\uDD00-\uDD43\uDD50-\uDFFF]|\uD83B[\uDC00-\uDEBB])/;t.containsRTL=function(e){return _.test(e)};var g=/(?:[\u231A\u231B\u23F0\u23F3\u2600-\u27BF\u2B50\u2B55]|\uD83C[\uDDE6-\uDDFF\uDF00-\uDFFF]|\uD83D[\uDC00-\uDE4F\uDE80-\uDEF8]|\uD83E[\uDD00-\uDDE6])/;t.containsEmoji=function(e){return g.test(e)};var v=/^[\t\n\r\x20-\x7E]*$/;t.isBasicASCII=function(e){return v.test(e)},t.containsFullWidthCharacter=function(e){for(var t=0,n=e.length;tn)return 0;var i,o,s=[],u=[];for(i=0;i=0;o--)if((i+=r[o].length)>n){r.splice(0,o);break}return r.join(t.empty).replace(/^\s/,t.empty)};var y=/\x1B\x5B[12]?K/g,b=/\x1b\[\d+m/g,C=/\x1b\[0?m/g;t.removeAnsiEscapeCodes=function(e){return e&&(e=(e=(e=e.replace(y,"")).replace(b,"")).replace(C,"")),e},t.UTF8_BOM_CHARACTER=String.fromCharCode(65279),t.startsWithUTF8BOM=function(e){return e&&e.length>0&&65279===e.charCodeAt(0)},t.appendWithLimit=function(e,t,n){var r=e.length+t.length;return r>n&&(e="..."+e.substr(r-n)),t.length>n?e+=t.substr(t.length-n):e+=t,e},t.safeBtoa=function(e){return btoa(encodeURIComponent(e))},t.repeat=function(e,t){for(var n="",r=0;r"),o}var s=e;s.Namespace||(s.Namespace=Object.create(Object.prototype));var u={uninitialized:1,working:2,initialized:3};Object.defineProperties(s.Namespace,{defineWithParent:{value:o,writable:!0,enumerable:!0,configurable:!0},define:{value:function(e,n){return o(t,e,n)},writable:!0,enumerable:!0,configurable:!0},_lazy:{value:function(e){var t,n,i=u.uninitialized;return{setName:function(e){t=e},get:function(){switch(i){case u.initialized:return n;case u.uninitialized:i=u.working;try{r("WinJS.Namespace._lazy:"+t+",StartTM"),n=e()}finally{r("WinJS.Namespace._lazy:"+t+",StopTM"),i=u.uninitialized}return e=null,i=u.initialized,n;case u.working:throw"Illegal: reentrancy on initialization";default:throw"Illegal"}},set:function(e){switch(i){case u.working:throw"Illegal: reentrancy on initialization";default:i=u.initialized,n=e}},enumerable:!0,configurable:!0}},writable:!0,enumerable:!0,configurable:!0},_moduleDefine:{value:function(e,r,o){var s=[e],u=null;return r&&(u=n(t,r),s.push(u)),i(s,o,r||""),u},writable:!0,enumerable:!0,configurable:!0}})}(),function(){function t(e,t,r){return e=e||function(){},n.markSupportedForProcessing(e),t&&i(e.prototype,t),r&&i(e,r),e}e.Namespace.define("WinJS.Class",{define:t,derive:function(e,r,o,s){if(e){r=r||function(){};var u=e.prototype;return r.prototype=Object.create(u),n.markSupportedForProcessing(r),Object.defineProperty(r.prototype,"constructor",{value:r,writable:!0,configurable:!0,enumerable:!0}),o&&i(r.prototype,o),s&&i(r,s),r}return t(r,o,s)},mix:function(e){e=e||function(){};var t,n;for(t=1,n=arguments.length;t1)&&a.fire(e),s=null,u=0},n)})},onLastListenerRemove:function(){i.dispose()}});return a.event};var h=function(){function e(){this.buffers=[]}return e.prototype.wrapEvent=function(e){var t=this;return function(n,r,i){return e(function(e){var i=t.buffers[t.buffers.length-1];i?i.push(function(){return n.call(r,e)}):n.call(r,e)},void 0,i)}},e.prototype.bufferEvents=function(e){var t=[];this.buffers.push(t),e(),this.buffers.pop(),t.forEach(function(e){return e()})},e}();t.EventBufferer=h,t.mapEvent=u,t.filterEvent=a;var d=function(){function e(e){this._event=e}return Object.defineProperty(e.prototype,"event",{get:function(){return this._event},enumerable:!0,configurable:!0}),e.prototype.map=function(t){return new e(u(this._event,t))},e.prototype.filter=function(t){return new e(a(this._event,t))},e.prototype.on=function(e,t,n){return this._event(e,t,n)},e}();t.chain=function(e){return new d(e)},t.stopwatch=function(e){var t=(new Date).getTime();return u(s(e),function(e){return(new Date).getTime()-t})},t.buffer=function(e,t,n){void 0===t&&(t=!1),void 0===n&&(n=[]),n=n.slice();var r=e(function(e){n?n.push(e):o.fire(e)}),i=function(){n.forEach(function(e){return o.fire(e)}),n=null},o=new c({onFirstListenerAdd:function(){r||(r=e(function(e){return o.fire(e)}))},onFirstListenerDidAdd:function(){n&&(t?setTimeout(i):i())},onLastListenerRemove:function(){r.dispose(),r=null}});return o.event},t.echo=function(e,t,n){void 0===t&&(t=!1),void 0===n&&(n=[]),n=n.slice(),e(function(e){n.push(e),i.fire(e)});var r=function(e,t){return n.forEach(function(n){return e.call(t,n)})},i=new c({onListenerDidAdd:function(e,n,i){t?setTimeout(function(){return r(n,i)}):r(n,i)}});return i.event}}),r(e[13],t([1,0,9]),function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r,i=Object.freeze(function(e,t){var n=setTimeout(e.bind(t),0);return{dispose:function(){clearTimeout(n)}}});!function(e){e.None=Object.freeze({isCancellationRequested:!1,onCancellationRequested:n.default.None}),e.Cancelled=Object.freeze({isCancellationRequested:!0,onCancellationRequested:i})}(r=t.CancellationToken||(t.CancellationToken={}));var o=function(){function e(){this._isCancelled=!1}return e.prototype.cancel=function(){this._isCancelled||(this._isCancelled=!0,this._emitter&&(this._emitter.fire(void 0),this._emitter=void 0))},Object.defineProperty(e.prototype,"isCancellationRequested",{get:function(){return this._isCancelled},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"onCancellationRequested",{get:function(){return this._isCancelled?i:(this._emitter||(this._emitter=new n.Emitter),this._emitter.event)},enumerable:!0,configurable:!0}),e}(),s=function(){function e(){}return Object.defineProperty(e.prototype,"token",{get:function(){return this._token||(this._token=new o),this._token},enumerable:!0,configurable:!0}),e.prototype.cancel=function(){this._token?this._token.cancel():this._token=r.Cancelled},e.prototype.dispose=function(){this.cancel()},e}();t.CancellationTokenSource=s}),r(e[18],t([1,0,8,4,2,13,10,9]),function(e,t,n,r,i,s,u,a){"use strict";function l(e){return e&&"function"==typeof e.then}function c(e,t){return new i.TPromise(function(r,i,o){e.done(function(e){try{t(e)}catch(e){n.onUnexpectedError(e)}r(e)},function(e){try{t(e)}catch(e){n.onUnexpectedError(e)}i(e)},function(e){o(e)})},function(){e.cancel()})}Object.defineProperty(t,"__esModule",{value:!0}),t.toThenable=function(e){return l(e)?e:i.TPromise.as(e)},t.asWinJsPromise=function(e){var t=new s.CancellationTokenSource;return new i.TPromise(function(n,r,o){var s=e(t.token);s instanceof i.TPromise?s.then(n,r,o):l(s)?s.then(n,r):n(s)},function(){t.cancel()})},t.wireCancellationToken=function(e,t,r){var o=e.onCancellationRequested(function(){return t.cancel()});return r&&(t=t.then(void 0,function(e){if(!n.isPromiseCanceledError(e))return i.TPromise.wrapError(e)})),c(t,function(){return o.dispose()})};var f=function(){function e(){this.activePromise=null,this.queuedPromise=null,this.queuedPromiseFactory=null}return e.prototype.queue=function(e){var t=this;if(this.activePromise){if(this.queuedPromiseFactory=e,!this.queuedPromise){var n=function(){t.queuedPromise=null;var e=t.queue(t.queuedPromiseFactory);return t.queuedPromiseFactory=null,e};this.queuedPromise=new i.TPromise(function(e,r,i){t.activePromise.then(n,n,i).done(e)},function(){t.activePromise.cancel()})}return new i.TPromise(function(e,n,r){t.queuedPromise.then(e,n,r)},function(){})}return this.activePromise=e(),new i.TPromise(function(e,n,r){t.activePromise.done(function(n){t.activePromise=null,e(n)},function(e){t.activePromise=null,n(e)},r)},function(){t.activePromise.cancel()})},e}();t.Throttler=f;var h=function(){function e(){this.current=i.TPromise.as(null)}return e.prototype.queue=function(e){return this.current=this.current.then(function(){return e()})},e}();t.SimpleThrottler=h;var d=function(){function e(e){this.defaultDelay=e,this.timeout=null,this.completionPromise=null,this.onSuccess=null,this.task=null}return e.prototype.trigger=function(e,t){var n=this;return void 0===t&&(t=this.defaultDelay),this.task=e,this.cancelTimeout(),this.completionPromise||(this.completionPromise=new i.TPromise(function(e){n.onSuccess=e},function(){}).then(function(){n.completionPromise=null,n.onSuccess=null;var e=n.task;return n.task=null,e()})),this.timeout=setTimeout(function(){n.timeout=null,n.onSuccess(null)},t),this.completionPromise},e.prototype.isTriggered=function(){return null!==this.timeout},e.prototype.cancel=function(){this.cancelTimeout(),this.completionPromise&&(this.completionPromise.cancel(),this.completionPromise=null)},e.prototype.cancelTimeout=function(){null!==this.timeout&&(clearTimeout(this.timeout),this.timeout=null)},e}();t.Delayer=d;var p=function(e){function t(t){var n=e.call(this,t)||this;return n.throttler=new f,n}return o(t,e),t.prototype.trigger=function(t,n){var r=this;return e.prototype.trigger.call(this,function(){return r.throttler.queue(t)},n)},t}(d);t.ThrottledDelayer=p;var m=function(e){function t(t,n){void 0===n&&(n=0);var r=e.call(this,t)||this;return r.minimumPeriod=n,r.periodThrottler=new f,r}return o(t,e),t.prototype.trigger=function(t,n){var r=this;return e.prototype.trigger.call(this,function(){return r.periodThrottler.queue(function(){return i.Promise.join([i.TPromise.timeout(r.minimumPeriod),t()]).then(function(e){return e[1]})})},n)},t}(p);t.PeriodThrottledDelayer=m;var _=function(){function e(){var e=this;this._value=new i.TPromise(function(t,n){e._completeCallback=t,e._errorCallback=n})}return Object.defineProperty(e.prototype,"value",{get:function(){return this._value},enumerable:!0,configurable:!0}),e.prototype.complete=function(e){this._completeCallback(e)},e.prototype.error=function(e){this._errorCallback(e)},e}();t.PromiseSource=_;var g=function(e){function t(t){var r,i,o,s=this;return s=e.call(this,function(e,t,n){r=e,i=t,o=n},function(){i(n.canceled())})||this,t.then(r,i,o),s}return o(t,e),t}(i.TPromise);t.ShallowCancelThenPromise=g,t.always=c,t.sequence=function(e){function t(){return e.length?e.pop()():null}function n(e){void 0!==e&&null!==e&&r.push(e);var o=t();return o?o.then(n):i.TPromise.as(r)}var r=[];return e=e.reverse(),i.TPromise.as(null).then(n)},t.first=function(e,t){void 0===t&&(t=function(e){return!!e}),e=e.reverse().slice();var n=function(){return 0===e.length?i.TPromise.as(null):e.pop()().then(function(e){return t(e)?i.TPromise.as(e):n()})};return n()};var v=function(){function e(e){this.maxDegreeOfParalellism=e,this.outstandingPromises=[],this.runningPromises=0,this._onFinished=new a.Emitter}return Object.defineProperty(e.prototype,"onFinished",{get:function(){return this._onFinished.event},enumerable:!0,configurable:!0}),e.prototype.queue=function(e){var t=this;return new i.TPromise(function(n,r,i){t.outstandingPromises.push({factory:e,c:n,e:r,p:i}),t.consume()})},e.prototype.consume=function(){for(var e=this;this.outstandingPromises.length&&this.runningPromises0?this.consume():this._onFinished.fire()},e.prototype.dispose=function(){this._onFinished.dispose()},e}();t.Limiter=v;var y=function(e){function t(){return e.call(this,1)||this}return o(t,e),t}(v);t.Queue=y,t.setDisposableTimeout=function(e,t){for(var n=[],r=2;rn||e===n&&t>r?(this.startLineNumber=n,this.startColumn=r,this.endLineNumber=e,this.endColumn=t):(this.startLineNumber=e,this.startColumn=t,this.endLineNumber=n,this.endColumn=r)}return e.prototype.isEmpty=function(){return e.isEmpty(this)},e.isEmpty=function(e){return e.startLineNumber===e.endLineNumber&&e.startColumn===e.endColumn},e.prototype.containsPosition=function(t){return e.containsPosition(this,t)},e.containsPosition=function(e,t){return!(t.lineNumbere.endLineNumber)&&(!(t.lineNumber===e.startLineNumber&&t.columne.endColumn))},e.prototype.containsRange=function(t){return e.containsRange(this,t)},e.containsRange=function(e,t){return!(t.startLineNumbere.endLineNumber||t.endLineNumber>e.endLineNumber)&&(!(t.startLineNumber===e.startLineNumber&&t.startColumne.endColumn)))},e.prototype.plusRange=function(t){return e.plusRange(this,t)},e.plusRange=function(t,n){var r,i,o,s;return n.startLineNumbert.endLineNumber?(o=n.endLineNumber,s=n.endColumn):n.endLineNumber===t.endLineNumber?(o=n.endLineNumber,s=Math.max(n.endColumn,t.endColumn)):(o=t.endLineNumber,s=t.endColumn),new e(r,i,o,s)},e.prototype.intersectRanges=function(t){return e.intersectRanges(this,t)},e.intersectRanges=function(t,n){var r=t.startLineNumber,i=t.startColumn,o=t.endLineNumber,s=t.endColumn,u=n.startLineNumber,a=n.startColumn,l=n.endLineNumber,c=n.endColumn;return rl?(o=l,s=c):o===l&&(s=Math.min(s,c)),r>o?null:r===o&&i>s?null:new e(r,i,o,s)},e.prototype.equalsRange=function(t){return e.equalsRange(this,t)},e.equalsRange=function(e,t){return!!e&&!!t&&e.startLineNumber===t.startLineNumber&&e.startColumn===t.startColumn&&e.endLineNumber===t.endLineNumber&&e.endColumn===t.endColumn},e.prototype.getEndPosition=function(){return new n.Position(this.endLineNumber,this.endColumn)},e.prototype.getStartPosition=function(){return new n.Position(this.startLineNumber,this.startColumn)},e.prototype.cloneRange=function(){return new e(this.startLineNumber,this.startColumn,this.endLineNumber,this.endColumn)},e.prototype.toString=function(){return"["+this.startLineNumber+","+this.startColumn+" -> "+this.endLineNumber+","+this.endColumn+"]"},e.prototype.setEndPosition=function(t,n){return new e(this.startLineNumber,this.startColumn,t,n)},e.prototype.setStartPosition=function(t,n){return new e(t,n,this.endLineNumber,this.endColumn)},e.prototype.collapseToStart=function(){return e.collapseToStart(this)},e.collapseToStart=function(t){return new e(t.startLineNumber,t.startColumn,t.startLineNumber,t.startColumn)},e.fromPositions=function(t,n){return void 0===n&&(n=t),new e(t.lineNumber,t.column,n.lineNumber,n.column)},e.lift=function(t){return t?new e(t.startLineNumber,t.startColumn,t.endLineNumber,t.endColumn):null},e.isIRange=function(e){return e&&"number"==typeof e.startLineNumber&&"number"==typeof e.startColumn&&"number"==typeof e.endLineNumber&&"number"==typeof e.endColumn},e.areIntersectingOrTouching=function(e,t){return!(e.endLineNumbere.startLineNumber},e}();t.Range=r}),r(e[22],t([1,0,5,3]),function(e,t,n,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var i;!function(e){e[e.LTR=0]="LTR",e[e.RTL=1]="RTL"}(i=t.SelectionDirection||(t.SelectionDirection={}));var s=function(e){function t(t,n,r,i){var o=e.call(this,t,n,r,i)||this;return o.selectionStartLineNumber=t,o.selectionStartColumn=n,o.positionLineNumber=r,o.positionColumn=i,o}return o(t,e),t.prototype.clone=function(){return new t(this.selectionStartLineNumber,this.selectionStartColumn,this.positionLineNumber,this.positionColumn)},t.prototype.toString=function(){return"["+this.selectionStartLineNumber+","+this.selectionStartColumn+" -> "+this.positionLineNumber+","+this.positionColumn+"]"},t.prototype.equalsSelection=function(e){return t.selectionsEqual(this,e)},t.selectionsEqual=function(e,t){return e.selectionStartLineNumber===t.selectionStartLineNumber&&e.selectionStartColumn===t.selectionStartColumn&&e.positionLineNumber===t.positionLineNumber&&e.positionColumn===t.positionColumn},t.prototype.getDirection=function(){return this.selectionStartLineNumber===this.startLineNumber&&this.selectionStartColumn===this.startColumn?i.LTR:i.RTL},t.prototype.setEndPosition=function(e,n){return this.getDirection()===i.LTR?new t(this.startLineNumber,this.startColumn,e,n):new t(e,n,this.startLineNumber,this.startColumn)},t.prototype.getPosition=function(){return new r.Position(this.positionLineNumber,this.positionColumn)},t.prototype.setStartPosition=function(e,n){return this.getDirection()===i.LTR?new t(e,n,this.endLineNumber,this.endColumn):new t(this.endLineNumber,this.endColumn,e,n)},t.fromPositions=function(e,n){return void 0===n&&(n=e),new t(e.lineNumber,e.column,n.lineNumber,n.column)},t.liftSelection=function(e){return new t(e.selectionStartLineNumber,e.selectionStartColumn,e.positionLineNumber,e.positionColumn)},t.selectionsArrEqual=function(e,t){if(e&&!t||!e&&t)return!1;if(!e&&!t)return!0;if(e.length!==t.length)return!1;for(var n=0,r=e.length;n4294967295?4294967295:0|e}Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e,t,n){for(var r=new Uint8Array(e*t),i=0,o=e*t;i255?255:0|e},t.toUint32=n,t.toUint32Array=function(e){for(var t=e.length,r=new Uint32Array(t),i=0;i=0&&e<256?this._asciiMap[e]=r:this._map.set(e,r)},e.prototype.get=function(e){return e>=0&&e<256?this._asciiMap[e]:this._map.get(e)||this._defaultValue},e}();t.CharacterClassifier=r;var i;!function(e){e[e.False=0]="False",e[e.True=1]="True"}(i||(i={}));var o=function(){function e(){this._actual=new r(0)}return e.prototype.add=function(e){this._actual.set(e,1)},e.prototype.has=function(e){return 1===this._actual.get(e)},e}();t.CharacterSet=o}),r(e[26],t([1,0,12,20]),function(e,t,n,r){"use strict";function i(e,t,r,i){return new n.LcsDiff(e,t,r).ComputeDiff(i)}function s(e){if(e.length<=1)return e;for(var t=[e[0]],n=t[0],r=1,i=e.length;r1&&g>1&&(E=p.charCodeAt(_-2))===(S=m.charCodeAt(g-2));)_--,g--;(_>1||g>1)&&this._pushTrimWhitespaceCharChange(o,s+1,1,_,u+1,1,g);for(var v=c._getLastNonBlankColumn(p,1),y=c._getLastNonBlankColumn(m,1),b=p.length+1,C=m.length+1;v=i)return{word:u[0],startColumn:r+1+u.index,endColumn:r+1+t.lastIndex};return null}function r(e,t,n,r){var i=e-1-r;t.lastIndex=0;for(var o;o=t.exec(n);){if(o.index>i)return null;if(t.lastIndex>=i)return{word:o[0],startColumn:r+1+o.index,endColumn:r+1+t.lastIndex}}return null}Object.defineProperty(t,"__esModule",{value:!0}),t.USUAL_WORD_SEPARATORS="`~!@#$%^&*()-=+[{]}\\|;:'\",.<>/?",t.DEFAULT_WORD_REGEXP=function(e){void 0===e&&(e="");for(var n=t.USUAL_WORD_SEPARATORS,r="(-?\\d*\\.\\d\\w*)|([^",i=0;i=0||(r+="\\"+n[i]);return r+="\\s]+)",new RegExp(r,"g")}(),t.ensureValidWordDefinition=function(e){var n=t.DEFAULT_WORD_REGEXP;if(e&&e instanceof RegExp)if(e.global)n=e;else{var r="g";e.ignoreCase&&(r+="i"),e.multiline&&(r+="m"),n=new RegExp(e.source,r)}return n.lastIndex=0,n},t.getWordAtText=function(e,t,i,o){t.lastIndex=0;var s=t.exec(i);if(!s)return null;var u=s[0].indexOf(" ")>=0?r(e,t,i,o):n(e,t,i,o);return t.lastIndex=0,u}}),r(e[28],t([1,0,25,7]),function(e,t,n,r){"use strict";function i(){return null===l&&(l=new a([[1,104,2],[1,72,2],[1,102,6],[1,70,6],[2,116,3],[2,84,3],[3,116,4],[3,84,4],[4,112,5],[4,80,5],[5,115,9],[5,83,9],[5,58,10],[6,105,7],[6,73,7],[7,108,8],[7,76,8],[8,101,9],[8,69,9],[9,58,10],[10,47,11],[11,47,12]])),l}function o(){if(null===c){c=new n.CharacterClassifier(0);for(e=0;e<" \t<>'\"、。。、,.:;?!@#$%&*‘“〈《「『【〔([{「」}])〕】』」》〉”’`~…".length;e++)c.set(" \t<>'\"、。。、,.:;?!@#$%&*‘“〈《「『【〔([{「」}])〕】』」》〉”’`~…".charCodeAt(e),1);for(var e=0;e<".,;".length;e++)c.set(".,;".charCodeAt(e),2)}return c}Object.defineProperty(t,"__esModule",{value:!0});var s;!function(e){e[e.Invalid=0]="Invalid",e[e.Start=1]="Start",e[e.H=2]="H",e[e.HT=3]="HT",e[e.HTT=4]="HTT",e[e.HTTP=5]="HTTP",e[e.F=6]="F",e[e.FI=7]="FI",e[e.FIL=8]="FIL",e[e.BeforeColon=9]="BeforeColon",e[e.AfterColon=10]="AfterColon",e[e.AlmostThere=11]="AlmostThere",e[e.End=12]="End",e[e.Accept=13]="Accept"}(s||(s={}));var u,a=function(){function e(e){for(var t=0,n=0,i=0,o=e.length;it&&(t=a),u>n&&(n=u),l>n&&(n=l)}t++,n++;for(var c=new r.Uint8Matrix(n,t,0),i=0,o=e.length;i=this._maxCharCode?0:this._states.get(e,t)},e}(),l=null;!function(e){e[e.None=0]="None",e[e.ForceTermination=1]="ForceTermination",e[e.CannotEndIn=2]="CannotEndIn"}(u||(u={}));var c=null,f=function(){function e(){}return e._createLink=function(e,t,n,r,i){var o=i-1;do{var s=t.charCodeAt(o);if(2!==e.get(s))break;o--}while(o>r);return{range:{startLineNumber:n,startColumn:r+1,endLineNumber:n,endColumn:o+2},url:t.substring(r,o+1)}},e.computeLinks=function(t){for(var n=i(),r=o(),s=[],u=1,a=t.getLineCount();u<=a;u++){for(var l=t.getLineContent(u),c=l.length,f=0,h=0,d=0,p=1,m=!1,_=!1,g=!1;f=0?((r+=n?1:-1)<0?r=e.length-1:r%=e.length,e[r]):null},e.INSTANCE=new e,e}();t.BasicInplaceReplace=n}),r(e[30],t([1,0,9,21,3,5,22,2,13,23,6]),function(e,t,n,r,i,o,s,u,a,l,c){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var f;!function(e){e[e.Ignore=0]="Ignore",e[e.Info=1]="Info",e[e.Warning=2]="Warning",e[e.Error=3]="Error"}(f=t.Severity||(t.Severity={}));var h=function(){function e(){}return e.chord=function(e,t){return r.KeyChord(e,t)},e.CtrlCmd=2048,e.Shift=1024,e.Alt=512,e.WinCtrl=256,e}();t.KeyMod=h;var d;!function(e){e[e.Unknown=0]="Unknown",e[e.Backspace=1]="Backspace",e[e.Tab=2]="Tab",e[e.Enter=3]="Enter",e[e.Shift=4]="Shift",e[e.Ctrl=5]="Ctrl",e[e.Alt=6]="Alt",e[e.PauseBreak=7]="PauseBreak",e[e.CapsLock=8]="CapsLock",e[e.Escape=9]="Escape",e[e.Space=10]="Space",e[e.PageUp=11]="PageUp",e[e.PageDown=12]="PageDown",e[e.End=13]="End",e[e.Home=14]="Home",e[e.LeftArrow=15]="LeftArrow",e[e.UpArrow=16]="UpArrow",e[e.RightArrow=17]="RightArrow",e[e.DownArrow=18]="DownArrow",e[e.Insert=19]="Insert",e[e.Delete=20]="Delete",e[e.KEY_0=21]="KEY_0",e[e.KEY_1=22]="KEY_1",e[e.KEY_2=23]="KEY_2",e[e.KEY_3=24]="KEY_3",e[e.KEY_4=25]="KEY_4",e[e.KEY_5=26]="KEY_5",e[e.KEY_6=27]="KEY_6",e[e.KEY_7=28]="KEY_7",e[e.KEY_8=29]="KEY_8",e[e.KEY_9=30]="KEY_9",e[e.KEY_A=31]="KEY_A",e[e.KEY_B=32]="KEY_B",e[e.KEY_C=33]="KEY_C",e[e.KEY_D=34]="KEY_D",e[e.KEY_E=35]="KEY_E",e[e.KEY_F=36]="KEY_F",e[e.KEY_G=37]="KEY_G",e[e.KEY_H=38]="KEY_H",e[e.KEY_I=39]="KEY_I",e[e.KEY_J=40]="KEY_J",e[e.KEY_K=41]="KEY_K",e[e.KEY_L=42]="KEY_L",e[e.KEY_M=43]="KEY_M",e[e.KEY_N=44]="KEY_N",e[e.KEY_O=45]="KEY_O",e[e.KEY_P=46]="KEY_P",e[e.KEY_Q=47]="KEY_Q",e[e.KEY_R=48]="KEY_R",e[e.KEY_S=49]="KEY_S",e[e.KEY_T=50]="KEY_T",e[e.KEY_U=51]="KEY_U",e[e.KEY_V=52]="KEY_V",e[e.KEY_W=53]="KEY_W",e[e.KEY_X=54]="KEY_X",e[e.KEY_Y=55]="KEY_Y",e[e.KEY_Z=56]="KEY_Z",e[e.Meta=57]="Meta",e[e.ContextMenu=58]="ContextMenu",e[e.F1=59]="F1",e[e.F2=60]="F2",e[e.F3=61]="F3",e[e.F4=62]="F4",e[e.F5=63]="F5",e[e.F6=64]="F6",e[e.F7=65]="F7",e[e.F8=66]="F8",e[e.F9=67]="F9",e[e.F10=68]="F10",e[e.F11=69]="F11",e[e.F12=70]="F12",e[e.F13=71]="F13",e[e.F14=72]="F14",e[e.F15=73]="F15",e[e.F16=74]="F16",e[e.F17=75]="F17",e[e.F18=76]="F18",e[e.F19=77]="F19",e[e.NumLock=78]="NumLock",e[e.ScrollLock=79]="ScrollLock",e[e.US_SEMICOLON=80]="US_SEMICOLON",e[e.US_EQUAL=81]="US_EQUAL",e[e.US_COMMA=82]="US_COMMA",e[e.US_MINUS=83]="US_MINUS",e[e.US_DOT=84]="US_DOT",e[e.US_SLASH=85]="US_SLASH",e[e.US_BACKTICK=86]="US_BACKTICK",e[e.US_OPEN_SQUARE_BRACKET=87]="US_OPEN_SQUARE_BRACKET",e[e.US_BACKSLASH=88]="US_BACKSLASH",e[e.US_CLOSE_SQUARE_BRACKET=89]="US_CLOSE_SQUARE_BRACKET",e[e.US_QUOTE=90]="US_QUOTE",e[e.OEM_8=91]="OEM_8",e[e.OEM_102=92]="OEM_102",e[e.NUMPAD_0=93]="NUMPAD_0",e[e.NUMPAD_1=94]="NUMPAD_1",e[e.NUMPAD_2=95]="NUMPAD_2",e[e.NUMPAD_3=96]="NUMPAD_3",e[e.NUMPAD_4=97]="NUMPAD_4",e[e.NUMPAD_5=98]="NUMPAD_5",e[e.NUMPAD_6=99]="NUMPAD_6",e[e.NUMPAD_7=100]="NUMPAD_7",e[e.NUMPAD_8=101]="NUMPAD_8",e[e.NUMPAD_9=102]="NUMPAD_9",e[e.NUMPAD_MULTIPLY=103]="NUMPAD_MULTIPLY",e[e.NUMPAD_ADD=104]="NUMPAD_ADD",e[e.NUMPAD_SEPARATOR=105]="NUMPAD_SEPARATOR",e[e.NUMPAD_SUBTRACT=106]="NUMPAD_SUBTRACT",e[e.NUMPAD_DECIMAL=107]="NUMPAD_DECIMAL",e[e.NUMPAD_DIVIDE=108]="NUMPAD_DIVIDE",e[e.KEY_IN_COMPOSITION=109]="KEY_IN_COMPOSITION",e[e.ABNT_C1=110]="ABNT_C1",e[e.ABNT_C2=111]="ABNT_C2",e[e.MAX_VALUE=112]="MAX_VALUE"}(d=t.KeyCode||(t.KeyCode={})),t.createMonacoBaseAPI=function(){return{editor:void 0,languages:void 0,CancellationTokenSource:a.CancellationTokenSource,Emitter:n.Emitter,KeyCode:d,KeyMod:h,Position:i.Position,Range:o.Range,Selection:s.Selection,SelectionDirection:s.SelectionDirection,Severity:f,Promise:u.TPromise,Uri:c.default,Token:l.Token}}}),r(e[19],t([1,0,7]),function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){return function(e,t){this.index=e,this.remainder=t}}();t.PrefixSumIndexOfResult=r;var i=function(){function e(e){this.values=e,this.prefixSum=new Uint32Array(e.length),this.prefixSumValidIndex=new Int32Array(1),this.prefixSumValidIndex[0]=-1}return e.prototype.getCount=function(){return this.values.length},e.prototype.insertValues=function(e,t){e=n.toUint32(e);var r=this.values,i=this.prefixSum,o=t.length;return 0!==o&&(this.values=new Uint32Array(r.length+o),this.values.set(r.subarray(0,e),0),this.values.set(r.subarray(e),e+o),this.values.set(t,e),e-1=0&&this.prefixSum.set(i.subarray(0,this.prefixSumValidIndex[0]+1)),!0)},e.prototype.changeValue=function(e,t){return e=n.toUint32(e),t=n.toUint32(t),this.values[e]!==t&&(this.values[e]=t,e-1=r.length)return!1;var o=r.length-e;return t>=o&&(t=o),0!==t&&(this.values=new Uint32Array(r.length-t),this.values.set(r.subarray(0,e),0),this.values.set(r.subarray(e+t),e),this.prefixSum=new Uint32Array(this.values.length),e-1=0&&this.prefixSum.set(i.subarray(0,this.prefixSumValidIndex[0]+1)),!0)},e.prototype.getTotalValue=function(){return 0===this.values.length?0:this._getAccumulatedValue(this.values.length-1)},e.prototype.getAccumulatedValue=function(e){return e<0?0:(e=n.toUint32(e),this._getAccumulatedValue(e))},e.prototype._getAccumulatedValue=function(e){if(e<=this.prefixSumValidIndex[0])return this.prefixSum[e];var t=this.prefixSumValidIndex[0]+1;0===t&&(this.prefixSum[0]=this.values[0],t++),e>=this.values.length&&(e=this.values.length-1);for(var n=t;n<=e;n++)this.prefixSum[n]=this.prefixSum[n-1]+this.values[n];return this.prefixSumValidIndex[0]=Math.max(this.prefixSumValidIndex[0],e),this.prefixSum[e]},e.prototype.getIndexOf=function(e){e=Math.floor(e),this.getTotalValue();for(var t,n,i,o=0,s=this.values.length-1;o<=s;)if(t=o+(s-o)/2|0,n=this.prefixSum[t],i=n-this.values[t],e=n))break;o=t+1}return new r(t,e-i)},e}();t.PrefixSumComputer=i;var o=function(){function e(e){this._cacheAccumulatedValueStart=0,this._cache=null,this._actual=new i(e),this._bustCache()}return e.prototype._bustCache=function(){this._cacheAccumulatedValueStart=0,this._cache=null},e.prototype.getCount=function(){return this._actual.getCount()},e.prototype.insertValues=function(e,t){this._actual.insertValues(e,t)&&this._bustCache()},e.prototype.changeValue=function(e,t){this._actual.changeValue(e,t)&&this._bustCache()},e.prototype.removeValues=function(e,t){this._actual.removeValues(e,t)&&this._bustCache()},e.prototype.getTotalValue=function(){return this._actual.getTotalValue()},e.prototype.getAccumulatedValue=function(e){return this._actual.getAccumulatedValue(e)},e.prototype.getIndexOf=function(e){if(e=Math.floor(e),null!==this._cache){var t=e-this._cacheAccumulatedValueStart;if(t>=0&&tthis._lines.length)t=this._lines.length,n=this._lines[t-1].length+1,r=!0;else{var i=this._lines[t-1].length+1;n<1?(n=1,r=!0):n>i&&(n=i,r=!0)}return r?{lineNumber:t,column:n}:e},t}(l.MirrorModel),m=function(){function e(){this._foreignModule=null}return e.prototype.computeDiff=function(e,t,n){var i=this._getModel(e),o=this._getModel(t);if(!i||!o)return null;var u=i.getLinesContent(),a=o.getLinesContent(),l=new s.DiffComputer(u,a,{shouldPostProcessCharChanges:!0,shouldIgnoreTrimWhitespace:n,shouldConsiderTrimWhitespaceInEmptyCase:!0,shouldMakePrettyDiff:!0});return r.TPromise.as(l.computeDiff())},e.prototype.computeDirtyDiff=function(e,t,n){var i=this._getModel(e),o=this._getModel(t);if(!i||!o)return null;var u=i.getLinesContent(),a=o.getLinesContent(),l=new s.DiffComputer(u,a,{shouldPostProcessCharChanges:!1,shouldIgnoreTrimWhitespace:n,shouldConsiderTrimWhitespaceInEmptyCase:!1,shouldMakePrettyDiff:!0});return r.TPromise.as(l.computeDiff())},e.prototype.computeMoreMinimalEdits=function(t,n,o){var s=this._getModel(t);if(!s)return r.TPromise.as(n);for(var a,l=[],c=0,f=n;ce._diffLimit)l.push({range:d,text:p});else for(var g=u.stringDiff(_,p,!1),v=s.offsetAt(i.Range.lift(d).getStartPosition()),y=0,b=g;y0;)self.onmessage(i.shift())},0)})},r=!0,i=[];self.onmessage=function(e){r?(r=!1,n(e.data)):i.push(e)}}()}).call(this); +//# sourceMappingURL=../../../../min-maps/vs/base/worker/workerMain.js.map \ No newline at end of file diff --git a/pigx-register/src/main/resources/static/console-ui/public/js/vs/basic-languages/src/bat.js b/pigx-register/src/main/resources/static/console-ui/public/js/vs/basic-languages/src/bat.js new file mode 100644 index 0000000..7ca79e1 --- /dev/null +++ b/pigx-register/src/main/resources/static/console-ui/public/js/vs/basic-languages/src/bat.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 0.9.0(e162b4ba29044167bc7181c42b3270fa8a467424) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/src/bat",["require","exports"],function(e,s){"use strict";Object.defineProperty(s,"__esModule",{value:!0}),s.conf={comments:{lineComment:"REM"},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'}],surroundingPairs:[{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'}]},s.language={defaultToken:"",ignoreCase:!0,tokenPostfix:".bat",brackets:[{token:"delimiter.bracket",open:"{",close:"}"},{token:"delimiter.parenthesis",open:"(",close:")"},{token:"delimiter.square",open:"[",close:"]"}],keywords:/call|defined|echo|errorlevel|exist|for|goto|if|pause|set|shift|start|title|not|pushd|popd/,symbols:/[=>\/\?\s]+)/g,comments:{blockComment:["###","###"],lineComment:"#"},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}]},t.language={defaultToken:"",ignoreCase:!0,tokenPostfix:".coffee",brackets:[{open:"{",close:"}",token:"delimiter.curly"},{open:"[",close:"]",token:"delimiter.square"},{open:"(",close:")",token:"delimiter.parenthesis"}],regEx:/\/(?!\/\/)(?:[^\/\\]|\\.)*\/[igm]*/,keywords:["and","or","is","isnt","not","on","yes","@","no","off","true","false","null","this","new","delete","typeof","in","instanceof","return","throw","break","continue","debugger","if","else","switch","for","while","do","try","catch","finally","class","extends","super","undefined","then","unless","until","loop","of","by","when"],symbols:/[=>"}],keywords:["abstract","amp","array","auto","bool","break","case","catch","char","class","const","constexpr","const_cast","continue","cpu","decltype","default","delegate","delete","do","double","dynamic_cast","each","else","enum","event","explicit","export","extern","false","final","finally","float","for","friend","gcnew","generic","goto","if","in","initonly","inline","int","interface","interior_ptr","internal","literal","long","mutable","namespace","new","noexcept","nullptr","__nullptr","operator","override","partial","pascal","pin_ptr","private","property","protected","public","ref","register","reinterpret_cast","restrict","return","safe_cast","sealed","short","signed","sizeof","static","static_assert","static_cast","struct","switch","template","this","thread_local","throw","tile_static","true","try","typedef","typeid","typename","union","unsigned","using","virtual","void","volatile","wchar_t","where","while","_asm","_based","_cdecl","_declspec","_fastcall","_if_exists","_if_not_exists","_inline","_multiple_inheritance","_pascal","_single_inheritance","_stdcall","_virtual_inheritance","_w64","__abstract","__alignof","__asm","__assume","__based","__box","__builtin_alignof","__cdecl","__clrcall","__declspec","__delegate","__event","__except","__fastcall","__finally","__forceinline","__gc","__hook","__identifier","__if_exists","__if_not_exists","__inline","__int128","__int16","__int32","__int64","__int8","__interface","__leave","__m128","__m128d","__m128i","__m256","__m256d","__m256i","__m64","__multiple_inheritance","__newslot","__nogc","__noop","__nounwind","__novtordisp","__pascal","__pin","__pragma","__property","__ptr32","__ptr64","__raise","__restrict","__resume","__sealed","__single_inheritance","__stdcall","__super","__thiscall","__try","__try_cast","__typeof","__unaligned","__unhook","__uuidof","__value","__virtual_inheritance","__w64","__wchar_t"],operators:["=",">","<","!","~","?",":","==","<=",">=","!=","&&","||","++","--","+","-","*","/","&","|","^","%","<<",">>",">>>","+=","-=","*=","/=","&=","|=","^=","%=","<<=",">>=",">>>="],symbols:/[=>](?!@symbols)/,"@brackets"],[/@symbols/,{cases:{"@operators":"delimiter","@default":""}}],[/\d*\d+[eE]([\-+]?\d+)?(@floatsuffix)/,"number.float"],[/\d*\.\d+([eE][\-+]?\d+)?(@floatsuffix)/,"number.float"],[/0[xX][0-9a-fA-F']*[0-9a-fA-F](@integersuffix)/,"number.hex"],[/0[0-7']*[0-7](@integersuffix)/,"number.octal"],[/0[bB][0-1']*[0-1](@integersuffix)/,"number.binary"],[/\d[\d']*\d(@integersuffix)/,"number"],[/\d(@integersuffix)/,"number"],[/[;,.]/,"delimiter"],[/"([^"\\]|\\.)*$/,"string.invalid"],[/"/,"string","@string"],[/'[^\\']'/,"string"],[/(')(@escapes)(')/,["string","string.escape","string"]],[/'/,"string.invalid"]],whitespace:[[/[ \t\r\n]+/,""],[/\/\*\*(?!\/)/,"comment.doc","@doccomment"],[/\/\*/,"comment","@comment"],[/\/\/.*$/,"comment"]],comment:[[/[^\/*]+/,"comment"],[/\*\//,"comment","@pop"],[/[\/*]/,"comment"]],doccomment:[[/[^\/*]+/,"comment.doc"],[/\*\//,"comment.doc","@pop"],[/[\/*]/,"comment.doc"]],string:[[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"/,"string","@pop"]]}}}); \ No newline at end of file diff --git a/pigx-register/src/main/resources/static/console-ui/public/js/vs/basic-languages/src/csharp.js b/pigx-register/src/main/resources/static/console-ui/public/js/vs/basic-languages/src/csharp.js new file mode 100644 index 0000000..25fca8d --- /dev/null +++ b/pigx-register/src/main/resources/static/console-ui/public/js/vs/basic-languages/src/csharp.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 0.9.0(e162b4ba29044167bc7181c42b3270fa8a467424) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/src/csharp",["require","exports"],function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.conf={wordPattern:/(-?\d*\.\d\w*)|([^\`\~\!\#\$\%\^\&\*\(\)\-\=\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\?\s]+)/g,comments:{lineComment:"//",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:"'",close:"'",notIn:["string","comment"]},{open:'"',close:'"',notIn:["string","comment"]}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:"<",close:">"},{open:"'",close:"'"},{open:'"',close:'"'}]},t.language={defaultToken:"",tokenPostfix:".cs",brackets:[{open:"{",close:"}",token:"delimiter.curly"},{open:"[",close:"]",token:"delimiter.square"},{open:"(",close:")",token:"delimiter.parenthesis"},{open:"<",close:">",token:"delimiter.angle"}],keywords:["extern","alias","using","bool","decimal","sbyte","byte","short","ushort","int","uint","long","ulong","char","float","double","object","dynamic","string","assembly","is","as","ref","out","this","base","new","typeof","void","checked","unchecked","default","delegate","var","const","if","else","switch","case","while","do","for","foreach","in","break","continue","goto","return","throw","try","catch","finally","lock","yield","from","let","where","join","on","equals","into","orderby","ascending","descending","select","group","by","namespace","partial","class","field","event","method","param","property","public","protected","internal","private","abstract","sealed","static","struct","readonly","volatile","virtual","override","params","get","set","add","remove","operator","true","false","implicit","explicit","interface","enum","null","async","await","fixed","sizeof","stackalloc","unsafe","nameof","when"],namespaceFollows:["namespace","using"],parenFollows:["if","for","while","switch","foreach","using","catch","when"],operators:["=","??","||","&&","|","^","&","==","!=","<=",">=","<<","+","-","*","/","%","!","~","++","--","+=","-=","*=","/=","%=","&=","|=","^=","<<=",">>=",">>","=>"],symbols:/[=>](?!@symbols)/,"@brackets"],[/@symbols/,{cases:{"@operators":"delimiter","@default":""}}],[/[0-9_]*\.[0-9_]+([eE][\-+]?\d+)?[fFdD]?/,"number.float"],[/0[xX][0-9a-fA-F_]+/,"number.hex"],[/0[bB][01_]+/,"number.hex"],[/[0-9_]+/,"number"],[/[;,.]/,"delimiter"],[/"([^"\\]|\\.)*$/,"string.invalid"],[/"/,{token:"string.quote",next:"@string"}],[/\$\@"/,{token:"string.quote",next:"@litinterpstring"}],[/\@"/,{token:"string.quote",next:"@litstring"}],[/\$"/,{token:"string.quote",next:"@interpolatedstring"}],[/'[^\\']'/,"string"],[/(')(@escapes)(')/,["string","string.escape","string"]],[/'/,"string.invalid"]],qualified:[[/[a-zA-Z_][\w]*/,{cases:{"@keywords":{token:"keyword.$0"},"@default":"identifier"}}],[/\./,"delimiter"],["","","@pop"]],namespace:[{include:"@whitespace"},[/[A-Z]\w*/,"namespace"],[/[\.=]/,"delimiter"],["","","@pop"]],comment:[[/[^\/*]+/,"comment"],["\\*/","comment","@pop"],[/[\/*]/,"comment"]],string:[[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"/,{token:"string.quote",next:"@pop"}]],litstring:[[/[^"]+/,"string"],[/""/,"string.escape"],[/"/,{token:"string.quote",next:"@pop"}]],litinterpstring:[[/[^"{]+/,"string"],[/""/,"string.escape"],[/{{/,"string.escape"],[/}}/,"string.escape"],[/{/,{token:"string.quote",next:"root.litinterpstring"}],[/"/,{token:"string.quote",next:"@pop"}]],interpolatedstring:[[/[^\\"{]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/{{/,"string.escape"],[/}}/,"string.escape"],[/{/,{token:"string.quote",next:"root.interpolatedstring"}],[/"/,{token:"string.quote",next:"@pop"}]],whitespace:[[/^[ \t\v\f]*#((r)|(load))(?=\s)/,"directive.csx"],[/^[ \t\v\f]*#\w.*$/,"namespace.cpp"],[/[ \t\v\f\r\n]+/,""],[/\/\*/,"comment","@comment"],[/\/\/.*$/,"comment"]]}}}); \ No newline at end of file diff --git a/pigx-register/src/main/resources/static/console-ui/public/js/vs/basic-languages/src/css.js b/pigx-register/src/main/resources/static/console-ui/public/js/vs/basic-languages/src/css.js new file mode 100644 index 0000000..17148d2 --- /dev/null +++ b/pigx-register/src/main/resources/static/console-ui/public/js/vs/basic-languages/src/css.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 0.9.0(e162b4ba29044167bc7181c42b3270fa8a467424) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/src/css",["require","exports"],function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.conf={wordPattern:/(#?-?\d*\.\d\w*%?)|((::|[@#.!:])?[\w-?]+%?)|::|[@#.!:]/g,comments:{blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}",notIn:["string","comment"]},{open:"[",close:"]",notIn:["string","comment"]},{open:"(",close:")",notIn:["string","comment"]},{open:'"',close:'"',notIn:["string","comment"]},{open:"'",close:"'",notIn:["string","comment"]}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}]},t.language={defaultToken:"",tokenPostfix:".css",ws:"[ \t\n\r\f]*",identifier:"-?-?([a-zA-Z]|(\\\\(([0-9a-fA-F]{1,6}\\s?)|[^[0-9a-fA-F])))([\\w\\-]|(\\\\(([0-9a-fA-F]{1,6}\\s?)|[^[0-9a-fA-F])))*",brackets:[{open:"{",close:"}",token:"delimiter.bracket"},{open:"[",close:"]",token:"delimiter.bracket"},{open:"(",close:")",token:"delimiter.parenthesis"},{open:"<",close:">",token:"delimiter.angle"}],tokenizer:{root:[{include:"@selector"}],selector:[{include:"@comments"},{include:"@import"},{include:"@strings"},["[@](keyframes|-webkit-keyframes|-moz-keyframes|-o-keyframes)",{token:"keyword",next:"@keyframedeclaration"}],["[@](page|content|font-face|-moz-document)",{token:"keyword"}],["[@](charset|namespace)",{token:"keyword",next:"@declarationbody"}],["(url-prefix)(\\()",["attribute.value",{token:"delimiter.parenthesis",next:"@urldeclaration"}]],["(url)(\\()",["attribute.value",{token:"delimiter.parenthesis",next:"@urldeclaration"}]],{include:"@selectorname"},["[\\*]","tag"],["[>\\+,]","delimiter"],["\\[",{token:"delimiter.bracket",next:"@selectorattribute"}],["{",{token:"delimiter.bracket",next:"@selectorbody"}]],selectorbody:[{include:"@comments"},["[*_]?@identifier@ws:(?=(\\s|\\d|[^{;}]*[;}]))","attribute.name","@rulevalue"],["}",{token:"delimiter.bracket",next:"@pop"}]],selectorname:[["(\\.|#(?=[^{])|%|(@identifier)|:)+","tag"]],selectorattribute:[{include:"@term"},["]",{token:"delimiter.bracket",next:"@pop"}]],term:[{include:"@comments"},["(url-prefix)(\\()",["attribute.value",{token:"delimiter.parenthesis",next:"@urldeclaration"}]],["(url)(\\()",["attribute.value",{token:"delimiter.parenthesis",next:"@urldeclaration"}]],{include:"@functioninvocation"},{include:"@numbers"},{include:"@name"},["([<>=\\+\\-\\*\\/\\^\\|\\~,])","delimiter"],[",","delimiter"]],rulevalue:[{include:"@comments"},{include:"@strings"},{include:"@term"},["!important","keyword"],[";","delimiter","@pop"],["(?=})",{token:"",next:"@pop"}]],warndebug:[["[@](warn|debug)",{token:"keyword",next:"@declarationbody"}]],import:[["[@](import)",{token:"keyword",next:"@declarationbody"}]],urldeclaration:[{include:"@strings"},["[^)\r\n]+","string"],["\\)",{token:"delimiter.parenthesis",next:"@pop"}]],parenthizedterm:[{include:"@term"},["\\)",{token:"delimiter.parenthesis",next:"@pop"}]],declarationbody:[{include:"@term"},[";","delimiter","@pop"],["(?=})",{token:"",next:"@pop"}]],comments:[["\\/\\*","comment","@comment"],["\\/\\/+.*","comment"]],comment:[["\\*\\/","comment","@pop"],[/[^*/]+/,"comment"],[/./,"comment"]],name:[["@identifier","attribute.value"]],numbers:[["-?(\\d*\\.)?\\d+([eE][\\-+]?\\d+)?",{token:"attribute.value.number",next:"@units"}],["#[0-9a-fA-F_]+(?!\\w)","attribute.value.hex"]],units:[["(em|ex|ch|rem|vmin|vmax|vw|vh|vm|cm|mm|in|px|pt|pc|deg|grad|rad|turn|s|ms|Hz|kHz|%)?","attribute.value.unit","@pop"]],keyframedeclaration:[["@identifier","attribute.value"],["{",{token:"delimiter.bracket",switchTo:"@keyframebody"}]],keyframebody:[{include:"@term"},["{",{token:"delimiter.bracket",next:"@selectorbody"}],["}",{token:"delimiter.bracket",next:"@pop"}]],functioninvocation:[["@identifier\\(",{token:"attribute.value",next:"@functionarguments"}]],functionarguments:[["\\$@identifier@ws:","attribute.name"],["[,]","delimiter"],{include:"@term"},["\\)",{token:"attribute.value",next:"@pop"}]],strings:[['~?"',{token:"string",next:"@stringenddoublequote"}],["~?'",{token:"string",next:"@stringendquote"}]],stringenddoublequote:[["\\\\.","string"],['"',{token:"string",next:"@pop"}],[/[^\\"]+/,"string"],[".","string"]],stringendquote:[["\\\\.","string"],["'",{token:"string",next:"@pop"}],[/[^\\']+/,"string"],[".","string"]]}}}); \ No newline at end of file diff --git a/pigx-register/src/main/resources/static/console-ui/public/js/vs/basic-languages/src/dockerfile.js b/pigx-register/src/main/resources/static/console-ui/public/js/vs/basic-languages/src/dockerfile.js new file mode 100644 index 0000000..43b2e3b --- /dev/null +++ b/pigx-register/src/main/resources/static/console-ui/public/js/vs/basic-languages/src/dockerfile.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 0.9.0(e162b4ba29044167bc7181c42b3270fa8a467424) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/src/dockerfile",["require","exports"],function(e,s){"use strict";Object.defineProperty(s,"__esModule",{value:!0}),s.conf={brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}]},s.language={defaultToken:"",tokenPostfix:".dockerfile",instructions:/FROM|MAINTAINER|RUN|EXPOSE|ENV|ADD|VOLUME|LABEL|USER|WORKDIR|COPY|CMD|STOPSIGNAL|SHELL|ENTRYPOINT/,instructionAfter:/ONBUILD/,variableAfter:/ENV/,variable:/\${?[\w]+}?/,tokenizer:{root:[{include:"@whitespace"},{include:"@comment"},[/(@instructionAfter)(\s+)/,["keyword",{token:"",next:"@instructions"}]],["","keyword","@instructions"]],instructions:[[/(@variableAfter)(\s+)([\w]+)/,["keyword","",{token:"variable",next:"@arguments"}]],[/(@instructions)/,"keyword","@arguments"]],arguments:[{include:"@whitespace"},{include:"@strings"},[/(@variable)/,{cases:{"@eos":{token:"variable",next:"@popall"},"@default":"variable"}}],[/\\/,{cases:{"@eos":"","@default":""}}],[/./,{cases:{"@eos":{token:"",next:"@popall"},"@default":""}}]],whitespace:[[/\s+/,{cases:{"@eos":{token:"",next:"@popall"},"@default":""}}]],comment:[[/(^#.*$)/,"comment","@popall"]],strings:[[/'$/,"string","@popall"],[/'/,"string","@stringBody"],[/"$/,"string","@popall"],[/"/,"string","@dblStringBody"]],stringBody:[[/[^\\\$']/,{cases:{"@eos":{token:"string",next:"@popall"},"@default":"string"}}],[/\\./,"string.escape"],[/'$/,"string","@popall"],[/'/,"string","@pop"],[/(@variable)/,"variable"],[/\\$/,"string"],[/$/,"string","@popall"]],dblStringBody:[[/[^\\\$"]/,{cases:{"@eos":{token:"string",next:"@popall"},"@default":"string"}}],[/\\./,"string.escape"],[/"$/,"string","@popall"],[/"/,"string","@pop"],[/(@variable)/,"variable"],[/\\$/,"string"],[/$/,"string","@popall"]]}}}); \ No newline at end of file diff --git a/pigx-register/src/main/resources/static/console-ui/public/js/vs/basic-languages/src/fsharp.js b/pigx-register/src/main/resources/static/console-ui/public/js/vs/basic-languages/src/fsharp.js new file mode 100644 index 0000000..f4b1ec2 --- /dev/null +++ b/pigx-register/src/main/resources/static/console-ui/public/js/vs/basic-languages/src/fsharp.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 0.9.0(e162b4ba29044167bc7181c42b3270fa8a467424) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/src/fsharp",["require","exports"],function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.conf={comments:{lineComment:"//",blockComment:["(*","*)"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}]},t.language={defaultToken:"",tokenPostfix:".fs",keywords:["abstract","and","atomic","as","assert","asr","base","begin","break","checked","component","const","constraint","constructor","continue","class","default","delegate","do","done","downcast","downto","elif","else","end","exception","eager","event","external","extern","false","finally","for","fun","function","fixed","functor","global","if","in","include","inherit","inline","interface","internal","land","lor","lsl","lsr","lxor","lazy","let","match","member","mod","module","mutable","namespace","method","mixin","new","not","null","of","open","or","object","override","private","parallel","process","protected","pure","public","rec","return","static","sealed","struct","sig","then","to","true","tailcall","trait","try","type","upcast","use","val","void","virtual","volatile","when","while","with","yield"],symbols:/[=>\]/,"annotation"],[/^#(if|else|endif)/,"keyword"],[/[{}()\[\]]/,"@brackets"],[/[<>](?!@symbols)/,"@brackets"],[/@symbols/,"delimiter"],[/\d*\d+[eE]([\-+]?\d+)?(@floatsuffix)/,"number.float"],[/\d*\.\d+([eE][\-+]?\d+)?(@floatsuffix)/,"number.float"],[/0x[0-9a-fA-F]+LF/,"number.float"],[/0x[0-9a-fA-F]+(@integersuffix)/,"number.hex"],[/0b[0-1]+(@integersuffix)/,"number.bin"],[/\d+(@integersuffix)/,"number"],[/[;,.]/,"delimiter"],[/"([^"\\]|\\.)*$/,"string.invalid"],[/"""/,"string",'@string."""'],[/"/,"string",'@string."'],[/\@"/,{token:"string.quote",next:"@litstring"}],[/'[^\\']'B?/,"string"],[/(')(@escapes)(')/,["string","string.escape","string"]],[/'/,"string.invalid"]],whitespace:[[/[ \t\r\n]+/,""],[/\(\*/,"comment","@comment"],[/\/\/.*$/,"comment"]],comment:[[/[^\*]+/,"comment"],[/\*\)/,"comment","@pop"],[/\*/,"comment"]],string:[[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/("""|"B?)/,{cases:{"$#==$S2":{token:"string",next:"@pop"},"@default":"string"}}]],litstring:[[/[^"]+/,"string"],[/""/,"string.escape"],[/"/,{token:"string.quote",next:"@pop"}]]}}}); \ No newline at end of file diff --git a/pigx-register/src/main/resources/static/console-ui/public/js/vs/basic-languages/src/go.js b/pigx-register/src/main/resources/static/console-ui/public/js/vs/basic-languages/src/go.js new file mode 100644 index 0000000..5508337 --- /dev/null +++ b/pigx-register/src/main/resources/static/console-ui/public/js/vs/basic-languages/src/go.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 0.9.0(e162b4ba29044167bc7181c42b3270fa8a467424) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/src/go",["require","exports"],function(e,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.conf={comments:{lineComment:"//",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:"`",close:"`",notIn:["string"]},{open:'"',close:'"',notIn:["string"]},{open:"'",close:"'",notIn:["string","comment"]}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:"`",close:"`"},{open:'"',close:'"'},{open:"'",close:"'"}]},n.language={defaultToken:"",tokenPostfix:".go",keywords:["break","case","chan","const","continue","default","defer","else","fallthrough","for","func","go","goto","if","import","interface","map","package","range","return","select","struct","switch","type","var","bool","true","false","uint8","uint16","uint32","uint64","int8","int16","int32","int64","float32","float64","complex64","complex128","byte","rune","uint","int","uintptr","string","nil"],operators:["+","-","*","/","%","&","|","^","<<",">>","&^","+=","-=","*=","/=","%=","&=","|=","^=","<<=",">>=","&^=","&&","||","<-","++","--","==","<",">","=","!","!=","<=",">=",":=","...","(",")","","]","{","}",",",";",".",":"],symbols:/[=>](?!@symbols)/,"@brackets"],[/@symbols/,{cases:{"@operators":"delimiter","@default":""}}],[/\d*\d+[eE]([\-+]?\d+)?/,"number.float"],[/\d*\.\d+([eE][\-+]?\d+)?/,"number.float"],[/0[xX][0-9a-fA-F']*[0-9a-fA-F]/,"number.hex"],[/0[0-7']*[0-7]/,"number.octal"],[/0[bB][0-1']*[0-1]/,"number.binary"],[/\d[\d']*/,"number"],[/\d/,"number"],[/[;,.]/,"delimiter"],[/"([^"\\]|\\.)*$/,"string.invalid"],[/"/,"string","@string"],[/`/,"string","@rawstring"],[/'[^\\']'/,"string"],[/(')(@escapes)(')/,["string","string.escape","string"]],[/'/,"string.invalid"]],whitespace:[[/[ \t\r\n]+/,""],[/\/\*\*(?!\/)/,"comment.doc","@doccomment"],[/\/\*/,"comment","@comment"],[/\/\/.*$/,"comment"]],comment:[[/[^\/*]+/,"comment"],[/\*\//,"comment","@pop"],[/[\/*]/,"comment"]],doccomment:[[/[^\/*]+/,"comment.doc"],[/\/\*/,"comment.doc.invalid"],[/\*\//,"comment.doc","@pop"],[/[\/*]/,"comment.doc"]],string:[[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"/,"string","@pop"]],rawstring:[[/[^\`]/,"string"],[/`/,"string","@pop"]]}}}); \ No newline at end of file diff --git a/pigx-register/src/main/resources/static/console-ui/public/js/vs/basic-languages/src/handlebars.js b/pigx-register/src/main/resources/static/console-ui/public/js/vs/basic-languages/src/handlebars.js new file mode 100644 index 0000000..e4c4f0f --- /dev/null +++ b/pigx-register/src/main/resources/static/console-ui/public/js/vs/basic-languages/src/handlebars.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 0.9.0(e162b4ba29044167bc7181c42b3270fa8a467424) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/src/handlebars",["require","exports"],function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n="undefined"==typeof monaco?self.monaco:monaco,a=["area","base","br","col","embed","hr","img","input","keygen","link","menuitem","meta","param","source","track","wbr"];t.conf={wordPattern:/(-?\d*\.\d\w*)|([^\`\~\!\@\$\^\&\*\(\)\=\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\s]+)/g,comments:{blockComment:["{{!--","--}}"]},brackets:[["\x3c!--","--\x3e"],["<",">"],["{{","}}"],["{","}"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:"<",close:">"},{open:'"',close:'"'},{open:"'",close:"'"}],onEnterRules:[{beforeText:new RegExp("<(?!(?:"+a.join("|")+"))(\\w[\\w\\d]*)([^/>]*(?!/)>)[^<]*$","i"),afterText:/^<\/(\w[\w\d]*)\s*>$/i,action:{indentAction:n.languages.IndentAction.IndentOutdent}},{beforeText:new RegExp("<(?!(?:"+a.join("|")+"))(\\w[\\w\\d]*)([^/>]*(?!/)>)[^<]*$","i"),action:{indentAction:n.languages.IndentAction.Indent}}]},t.language={defaultToken:"",tokenPostfix:"",tokenizer:{root:[[/\{\{/,{token:"@rematch",switchTo:"@handlebarsInSimpleState.root"}],[/)/,["delimiter.html","tag.html","delimiter.html"]],[/(<)(script)/,["delimiter.html",{token:"tag.html",next:"@script"}]],[/(<)(style)/,["delimiter.html",{token:"tag.html",next:"@style"}]],[/(<)([:\w]+)/,["delimiter.html",{token:"tag.html",next:"@otherTag"}]],[/(<\/)(\w+)/,["delimiter.html",{token:"tag.html",next:"@otherTag"}]],[/]+/,"metatag.content.html"],[/>/,"metatag.html","@pop"]],comment:[[/\{\{/,{token:"@rematch",switchTo:"@handlebarsInSimpleState.comment"}],[/-->/,"comment.html","@pop"],[/[^-]+/,"comment.content.html"],[/./,"comment.content.html"]],otherTag:[[/\{\{/,{token:"@rematch",switchTo:"@handlebarsInSimpleState.otherTag"}],[/\/?>/,"delimiter.html","@pop"],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/[ \t\r\n]+/]],script:[[/\{\{/,{token:"@rematch",switchTo:"@handlebarsInSimpleState.script"}],[/type/,"attribute.name","@scriptAfterType"],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/>/,{token:"delimiter.html",next:"@scriptEmbedded.text/javascript",nextEmbedded:"text/javascript"}],[/[ \t\r\n]+/],[/(<\/)(script\s*)(>)/,["delimiter.html","tag.html",{token:"delimiter.html",next:"@pop"}]]],scriptAfterType:[[/\{\{/,{token:"@rematch",switchTo:"@handlebarsInSimpleState.scriptAfterType"}],[/=/,"delimiter","@scriptAfterTypeEquals"],[/>/,{token:"delimiter.html",next:"@scriptEmbedded.text/javascript",nextEmbedded:"text/javascript"}],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:"@rematch",next:"@pop"}]],scriptAfterTypeEquals:[[/\{\{/,{token:"@rematch",switchTo:"@handlebarsInSimpleState.scriptAfterTypeEquals"}],[/"([^"]*)"/,{token:"attribute.value",switchTo:"@scriptWithCustomType.$1"}],[/'([^']*)'/,{token:"attribute.value",switchTo:"@scriptWithCustomType.$1"}],[/>/,{token:"delimiter.html",next:"@scriptEmbedded.text/javascript",nextEmbedded:"text/javascript"}],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:"@rematch",next:"@pop"}]],scriptWithCustomType:[[/\{\{/,{token:"@rematch",switchTo:"@handlebarsInSimpleState.scriptWithCustomType.$S2"}],[/>/,{token:"delimiter.html",next:"@scriptEmbedded.$S2",nextEmbedded:"$S2"}],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:"@rematch",next:"@pop"}]],scriptEmbedded:[[/\{\{/,{token:"@rematch",switchTo:"@handlebarsInEmbeddedState.scriptEmbedded.$S2",nextEmbedded:"@pop"}],[/<\/script/,{token:"@rematch",next:"@pop",nextEmbedded:"@pop"}]],style:[[/\{\{/,{token:"@rematch",switchTo:"@handlebarsInSimpleState.style"}],[/type/,"attribute.name","@styleAfterType"],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/>/,{token:"delimiter.html",next:"@styleEmbedded.text/css",nextEmbedded:"text/css"}],[/[ \t\r\n]+/],[/(<\/)(style\s*)(>)/,["delimiter.html","tag.html",{token:"delimiter.html",next:"@pop"}]]],styleAfterType:[[/\{\{/,{token:"@rematch",switchTo:"@handlebarsInSimpleState.styleAfterType"}],[/=/,"delimiter","@styleAfterTypeEquals"],[/>/,{token:"delimiter.html",next:"@styleEmbedded.text/css",nextEmbedded:"text/css"}],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:"@rematch",next:"@pop"}]],styleAfterTypeEquals:[[/\{\{/,{token:"@rematch",switchTo:"@handlebarsInSimpleState.styleAfterTypeEquals"}],[/"([^"]*)"/,{token:"attribute.value",switchTo:"@styleWithCustomType.$1"}],[/'([^']*)'/,{token:"attribute.value",switchTo:"@styleWithCustomType.$1"}],[/>/,{token:"delimiter.html",next:"@styleEmbedded.text/css",nextEmbedded:"text/css"}],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:"@rematch",next:"@pop"}]],styleWithCustomType:[[/\{\{/,{token:"@rematch",switchTo:"@handlebarsInSimpleState.styleWithCustomType.$S2"}],[/>/,{token:"delimiter.html",next:"@styleEmbedded.$S2",nextEmbedded:"$S2"}],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:"@rematch",next:"@pop"}]],styleEmbedded:[[/\{\{/,{token:"@rematch",switchTo:"@handlebarsInEmbeddedState.styleEmbedded.$S2",nextEmbedded:"@pop"}],[/<\/style/,{token:"@rematch",next:"@pop",nextEmbedded:"@pop"}]],handlebarsInSimpleState:[[/\{\{\{?/,"delimiter.handlebars"],[/\}\}\}?/,{token:"delimiter.handlebars",switchTo:"@$S2.$S3"}],{include:"handlebarsRoot"}],handlebarsInEmbeddedState:[[/\{\{\{?/,"delimiter.handlebars"],[/\}\}\}?/,{token:"delimiter.handlebars",switchTo:"@$S2.$S3",nextEmbedded:"$S3"}],{include:"handlebarsRoot"}],handlebarsRoot:[[/[#/][^\s}]+/,"keyword.helper.handlebars"],[/else\b/,"keyword.helper.handlebars"],[/[\s]+/],[/[^}]/,"variable.parameter.handlebars"]]}}}); \ No newline at end of file diff --git a/pigx-register/src/main/resources/static/console-ui/public/js/vs/basic-languages/src/html.js b/pigx-register/src/main/resources/static/console-ui/public/js/vs/basic-languages/src/html.js new file mode 100644 index 0000000..63accee --- /dev/null +++ b/pigx-register/src/main/resources/static/console-ui/public/js/vs/basic-languages/src/html.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 0.9.0(e162b4ba29044167bc7181c42b3270fa8a467424) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/src/html",["require","exports"],function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n="undefined"==typeof monaco?self.monaco:monaco,i=["area","base","br","col","embed","hr","img","input","keygen","link","menuitem","meta","param","source","track","wbr"];t.conf={wordPattern:/(-?\d*\.\d\w*)|([^\`\~\!\@\$\^\&\*\(\)\=\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\s]+)/g,comments:{blockComment:["\x3c!--","--\x3e"]},brackets:[["\x3c!--","--\x3e"],["<",">"],["{","}"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:'"',close:'"'},{open:"'",close:"'"},{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:"<",close:">"}],onEnterRules:[{beforeText:new RegExp("<(?!(?:"+i.join("|")+"))([_:\\w][_:\\w-.\\d]*)([^/>]*(?!/)>)[^<]*$","i"),afterText:/^<\/([_:\w][_:\w-.\d]*)\s*>$/i,action:{indentAction:n.languages.IndentAction.IndentOutdent}},{beforeText:new RegExp("<(?!(?:"+i.join("|")+"))(\\w[\\w\\d]*)([^/>]*(?!/)>)[^<]*$","i"),action:{indentAction:n.languages.IndentAction.Indent}}]},t.language={defaultToken:"",tokenPostfix:".html",ignoreCase:!0,tokenizer:{root:[[/)/,["delimiter","tag","","delimiter"]],[/(<)(script)/,["delimiter",{token:"tag",next:"@script"}]],[/(<)(style)/,["delimiter",{token:"tag",next:"@style"}]],[/(<)((?:[\w\-]+:)?[\w\-]+)/,["delimiter",{token:"tag",next:"@otherTag"}]],[/(<\/)((?:[\w\-]+:)?[\w\-]+)/,["delimiter",{token:"tag",next:"@otherTag"}]],[/]+/,"metatag.content"],[/>/,"metatag","@pop"]],comment:[[/-->/,"comment","@pop"],[/[^-]+/,"comment.content"],[/./,"comment.content"]],otherTag:[[/\/?>/,"delimiter","@pop"],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/[ \t\r\n]+/]],script:[[/type/,"attribute.name","@scriptAfterType"],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/>/,{token:"delimiter",next:"@scriptEmbedded",nextEmbedded:"text/javascript"}],[/[ \t\r\n]+/],[/(<\/)(script\s*)(>)/,["delimiter","tag",{token:"delimiter",next:"@pop"}]]],scriptAfterType:[[/=/,"delimiter","@scriptAfterTypeEquals"],[/>/,{token:"delimiter",next:"@scriptEmbedded",nextEmbedded:"text/javascript"}],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:"@rematch",next:"@pop"}]],scriptAfterTypeEquals:[[/"([^"]*)"/,{token:"attribute.value",switchTo:"@scriptWithCustomType.$1"}],[/'([^']*)'/,{token:"attribute.value",switchTo:"@scriptWithCustomType.$1"}],[/>/,{token:"delimiter",next:"@scriptEmbedded",nextEmbedded:"text/javascript"}],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:"@rematch",next:"@pop"}]],scriptWithCustomType:[[/>/,{token:"delimiter",next:"@scriptEmbedded.$S2",nextEmbedded:"$S2"}],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:"@rematch",next:"@pop"}]],scriptEmbedded:[[/<\/script/,{token:"@rematch",next:"@pop",nextEmbedded:"@pop"}],[/[^<]+/,""]],style:[[/type/,"attribute.name","@styleAfterType"],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/>/,{token:"delimiter",next:"@styleEmbedded",nextEmbedded:"text/css"}],[/[ \t\r\n]+/],[/(<\/)(style\s*)(>)/,["delimiter","tag",{token:"delimiter",next:"@pop"}]]],styleAfterType:[[/=/,"delimiter","@styleAfterTypeEquals"],[/>/,{token:"delimiter",next:"@styleEmbedded",nextEmbedded:"text/css"}],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:"@rematch",next:"@pop"}]],styleAfterTypeEquals:[[/"([^"]*)"/,{token:"attribute.value",switchTo:"@styleWithCustomType.$1"}],[/'([^']*)'/,{token:"attribute.value",switchTo:"@styleWithCustomType.$1"}],[/>/,{token:"delimiter",next:"@styleEmbedded",nextEmbedded:"text/css"}],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:"@rematch",next:"@pop"}]],styleWithCustomType:[[/>/,{token:"delimiter",next:"@styleEmbedded.$S2",nextEmbedded:"$S2"}],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:"@rematch",next:"@pop"}]],styleEmbedded:[[/<\/style/,{token:"@rematch",next:"@pop",nextEmbedded:"@pop"}],[/[^<]+/,""]]}}}); \ No newline at end of file diff --git a/pigx-register/src/main/resources/static/console-ui/public/js/vs/basic-languages/src/ini.js b/pigx-register/src/main/resources/static/console-ui/public/js/vs/basic-languages/src/ini.js new file mode 100644 index 0000000..d56d2ba --- /dev/null +++ b/pigx-register/src/main/resources/static/console-ui/public/js/vs/basic-languages/src/ini.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 0.9.0(e162b4ba29044167bc7181c42b3270fa8a467424) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/src/ini",["require","exports"],function(e,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.conf={comments:{lineComment:"#"},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}]},n.language={defaultToken:"",tokenPostfix:".ini",escapes:/\\(?:[abfnrtv\\"']|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/,tokenizer:{root:[[/^\[[^\]]*\]/,"metatag"],[/(^\w+)(\s*)(\=)/,["key","","delimiter"]],{include:"@whitespace"},[/\d+/,"number"],[/"([^"\\]|\\.)*$/,"string.invalid"],[/'([^'\\]|\\.)*$/,"string.invalid"],[/"/,"string",'@string."'],[/'/,"string","@string.'"]],whitespace:[[/[ \t\r\n]+/,""],[/^\s*[#;].*$/,"comment"]],string:[[/[^\\"']+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/["']/,{cases:{"$#==$S2":{token:"string",next:"@pop"},"@default":"string"}}]]}}}); \ No newline at end of file diff --git a/pigx-register/src/main/resources/static/console-ui/public/js/vs/basic-languages/src/java.js b/pigx-register/src/main/resources/static/console-ui/public/js/vs/basic-languages/src/java.js new file mode 100644 index 0000000..a35a97f --- /dev/null +++ b/pigx-register/src/main/resources/static/console-ui/public/js/vs/basic-languages/src/java.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 0.9.0(e162b4ba29044167bc7181c42b3270fa8a467424) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/src/java",["require","exports"],function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.conf={wordPattern:/(-?\d*\.\d\w*)|([^\`\~\!\#\%\^\&\*\(\)\-\=\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\?\s]+)/g,comments:{lineComment:"//",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"},{open:"<",close:">"}]},t.language={defaultToken:"",tokenPostfix:".java",keywords:["abstract","continue","for","new","switch","assert","default","goto","package","synchronized","boolean","do","if","private","this","break","double","implements","protected","throw","byte","else","import","public","throws","case","enum","instanceof","return","transient","catch","extends","int","short","try","char","final","interface","static","void","class","finally","long","strictfp","volatile","const","float","native","super","while","true","false"],operators:["=",">","<","!","~","?",":","==","<=",">=","!=","&&","||","++","--","+","-","*","/","&","|","^","%","<<",">>",">>>","+=","-=","*=","/=","&=","|=","^=","%=","<<=",">>=",">>>="],symbols:/[=>](?!@symbols)/,"@brackets"],[/@symbols/,{cases:{"@operators":"delimiter","@default":""}}],[/@\s*[a-zA-Z_\$][\w\$]*/,"annotation"],[/(@digits)[eE]([\-+]?(@digits))?[fFdD]?/,"number.float"],[/(@digits)\.(@digits)([eE][\-+]?(@digits))?[fFdD]?/,"number.float"],[/0[xX](@hexdigits)[Ll]?/,"number.hex"],[/0(@octaldigits)[Ll]?/,"number.octal"],[/0[bB](@binarydigits)[Ll]?/,"number.binary"],[/(@digits)[fFdD]/,"number.float"],[/(@digits)[lL]?/,"number"],[/[;,.]/,"delimiter"],[/"([^"\\]|\\.)*$/,"string.invalid"],[/"/,"string","@string"],[/'[^\\']'/,"string"],[/(')(@escapes)(')/,["string","string.escape","string"]],[/'/,"string.invalid"]],whitespace:[[/[ \t\r\n]+/,""],[/\/\*\*(?!\/)/,"comment.doc","@javadoc"],[/\/\*/,"comment","@comment"],[/\/\/.*$/,"comment"]],comment:[[/[^\/*]+/,"comment"],[/\*\//,"comment","@pop"],[/[\/*]/,"comment"]],javadoc:[[/[^\/*]+/,"comment.doc"],[/\/\*/,"comment.doc.invalid"],[/\*\//,"comment.doc","@pop"],[/[\/*]/,"comment.doc"]],string:[[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"/,"string","@pop"]]}}}); \ No newline at end of file diff --git a/pigx-register/src/main/resources/static/console-ui/public/js/vs/basic-languages/src/less.js b/pigx-register/src/main/resources/static/console-ui/public/js/vs/basic-languages/src/less.js new file mode 100644 index 0000000..434c953 --- /dev/null +++ b/pigx-register/src/main/resources/static/console-ui/public/js/vs/basic-languages/src/less.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 0.9.0(e162b4ba29044167bc7181c42b3270fa8a467424) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/src/less",["require","exports"],function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.conf={wordPattern:/(#?-?\d*\.\d\w*%?)|([@#!.:]?[\w-?]+%?)|[@#!.]/g,comments:{blockComment:["/*","*/"],lineComment:"//"},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}",notIn:["string","comment"]},{open:"[",close:"]",notIn:["string","comment"]},{open:"(",close:")",notIn:["string","comment"]},{open:'"',close:'"',notIn:["string","comment"]},{open:"'",close:"'",notIn:["string","comment"]}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}]},t.language={defaultToken:"",tokenPostfix:".less",identifier:"-?-?([a-zA-Z]|(\\\\(([0-9a-fA-F]{1,6}\\s?)|[^[0-9a-fA-F])))([\\w\\-]|(\\\\(([0-9a-fA-F]{1,6}\\s?)|[^[0-9a-fA-F])))*",identifierPlus:"-?-?([a-zA-Z:.]|(\\\\(([0-9a-fA-F]{1,6}\\s?)|[^[0-9a-fA-F])))([\\w\\-:.]|(\\\\(([0-9a-fA-F]{1,6}\\s?)|[^[0-9a-fA-F])))*",brackets:[{open:"{",close:"}",token:"delimiter.curly"},{open:"[",close:"]",token:"delimiter.bracket"},{open:"(",close:")",token:"delimiter.parenthesis"},{open:"<",close:">",token:"delimiter.angle"}],tokenizer:{root:[{include:"@nestedJSBegin"},["[ \\t\\r\\n]+",""],{include:"@comments"},{include:"@keyword"},{include:"@strings"},{include:"@numbers"},["[*_]?[a-zA-Z\\-\\s]+(?=:.*(;|(\\\\$)))","attribute.name","@attribute"],["url(\\-prefix)?\\(",{token:"tag",next:"@urldeclaration"}],["[{}()\\[\\]]","@brackets"],["[,:;]","delimiter"],["#@identifierPlus","tag.id"],["&","tag"],["\\.@identifierPlus(?=\\()","tag.class","@attribute"],["\\.@identifierPlus","tag.class"],["@identifierPlus","tag"],{include:"@operators"},["@(@identifier(?=[:,\\)]))","variable","@attribute"],["@(@identifier)","variable"],["@","key","@atRules"]],nestedJSBegin:[["``","delimiter.backtick"],["`",{token:"delimiter.backtick",next:"@nestedJSEnd",nextEmbedded:"text/javascript"}]],nestedJSEnd:[["`",{token:"delimiter.backtick",next:"@pop",nextEmbedded:"@pop"}]],operators:[["[<>=\\+\\-\\*\\/\\^\\|\\~]","operator"]],keyword:[["(@[\\s]*import|![\\s]*important|true|false|when|iscolor|isnumber|isstring|iskeyword|isurl|ispixel|ispercentage|isem|hue|saturation|lightness|alpha|lighten|darken|saturate|desaturate|fadein|fadeout|fade|spin|mix|round|ceil|floor|percentage)\\b","keyword"]],urldeclaration:[{include:"@strings"},["[^)\r\n]+","string"],["\\)",{token:"tag",next:"@pop"}]],attribute:[{include:"@nestedJSBegin"},{include:"@comments"},{include:"@strings"},{include:"@numbers"},{include:"@keyword"},["[a-zA-Z\\-]+(?=\\()","attribute.value","@attribute"],[">","operator","@pop"],["@identifier","attribute.value"],{include:"@operators"},["@(@identifier)","variable"],["[)\\}]","@brackets","@pop"],["[{}()\\[\\]>]","@brackets"],["[;]","delimiter","@pop"],["[,=:]","delimiter"],["\\s",""],[".","attribute.value"]],comments:[["\\/\\*","comment","@comment"],["\\/\\/+.*","comment"]],comment:[["\\*\\/","comment","@pop"],[".","comment"]],numbers:[["(\\d*\\.)?\\d+([eE][\\-+]?\\d+)?",{token:"attribute.value.number",next:"@units"}],["#[0-9a-fA-F_]+(?!\\w)","attribute.value.hex"]],units:[["(em|ex|ch|rem|vmin|vmax|vw|vh|vm|cm|mm|in|px|pt|pc|deg|grad|rad|turn|s|ms|Hz|kHz|%)?","attribute.value.unit","@pop"]],strings:[['~?"',{token:"string.delimiter",next:"@stringsEndDoubleQuote"}],["~?'",{token:"string.delimiter",next:"@stringsEndQuote"}]],stringsEndDoubleQuote:[['\\\\"',"string"],['"',{token:"string.delimiter",next:"@popall"}],[".","string"]],stringsEndQuote:[["\\\\'","string"],["'",{token:"string.delimiter",next:"@popall"}],[".","string"]],atRules:[{include:"@comments"},{include:"@strings"},["[()]","delimiter"],["[\\{;]","delimiter","@pop"],[".","key"]]}}}); \ No newline at end of file diff --git a/pigx-register/src/main/resources/static/console-ui/public/js/vs/basic-languages/src/lua.js b/pigx-register/src/main/resources/static/console-ui/public/js/vs/basic-languages/src/lua.js new file mode 100644 index 0000000..a908ac1 --- /dev/null +++ b/pigx-register/src/main/resources/static/console-ui/public/js/vs/basic-languages/src/lua.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 0.9.0(e162b4ba29044167bc7181c42b3270fa8a467424) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/src/lua",["require","exports"],function(e,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.conf={comments:{lineComment:"--",blockComment:["--[[","]]"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}]},n.language={defaultToken:"",tokenPostfix:".lua",keywords:["and","break","do","else","elseif","end","false","for","function","goto","if","in","local","nil","not","or","repeat","return","then","true","until","while"],brackets:[{token:"delimiter.bracket",open:"{",close:"}"},{token:"delimiter.array",open:"[",close:"]"},{token:"delimiter.parenthesis",open:"(",close:")"}],operators:["+","-","*","/","%","^","#","==","~=","<=",">=","<",">","=",";",":",",",".","..","..."],symbols:/[=>",notIn:["string"]}],surroundingPairs:[{open:"(",close:")"},{open:"[",close:"]"},{open:"`",close:"`"}]},t.language={defaultToken:"",tokenPostfix:".md",control:/[\\`*_\[\]{}()#+\-\.!]/,noncontrol:/[^\\`*_\[\]{}()#+\-\.!]/,escapes:/\\(?:@control)/,jsescapes:/\\(?:[btnfr\\"']|[0-7][0-7]?|[0-3][0-7]{2})/,empty:["area","base","basefont","br","col","frame","hr","img","input","isindex","link","meta","param"],tokenizer:{root:[[/^(\s{0,3})(#+)((?:[^\\#]|@escapes)+)((?:#+)?)/,["white","keyword","keyword","keyword"]],[/^\s*(=+|\-+)\s*$/,"keyword"],[/^\s*((\*[ ]?)+)\s*$/,"meta.separator"],[/^\s*>+/,"comment"],[/^\s*([\*\-+:]|\d+\.)\s/,"keyword"],[/^(\t|[ ]{4})[^ ].*$/,"string"],[/^\s*~~~\s*((?:\w|[\/\-#])+)?\s*$/,{token:"string",next:"@codeblock"}],[/^\s*```\s*((?:\w|[\/\-#])+)\s*$/,{token:"string",next:"@codeblockgh",nextEmbedded:"$1"}],[/^\s*```\s*$/,{token:"string",next:"@codeblock"}],{include:"@linecontent"}],codeblock:[[/^\s*~~~\s*$/,{token:"string",next:"@pop"}],[/^\s*```\s*$/,{token:"string",next:"@pop"}],[/.*$/,"variable.source"]],codeblockgh:[[/```\s*$/,{token:"variable.source",next:"@pop",nextEmbedded:"@pop"}],[/[^`]+/,"variable.source"]],linecontent:[[/&\w+;/,"string.escape"],[/@escapes/,"escape"],[/\b__([^\\_]|@escapes|_(?!_))+__\b/,"strong"],[/\*\*([^\\*]|@escapes|\*(?!\*))+\*\*/,"strong"],[/\b_[^_]+_\b/,"emphasis"],[/\*([^\\*]|@escapes)+\*/,"emphasis"],[/`([^\\`]|@escapes)+`/,"variable"],[/\{[^}]+\}/,"string.target"],[/(!?\[)((?:[^\]\\]|@escapes)*)(\]\([^\)]+\))/,["string.link","","string.link"]],[/(!?\[)((?:[^\]\\]|@escapes)*)(\])/,"string.link"],{include:"html"}],html:[[/<(\w+)\/>/,"tag"],[/<(\w+)/,{cases:{"@empty":{token:"tag",next:"@tag.$1"},"@default":{token:"tag",next:"@tag.$1"}}}],[/<\/(\w+)\s*>/,{token:"tag"}],[//,"comment","@pop"],[//,"comment.html","@pop"],[/[^-]+/,"comment.content.html"],[/./,"comment.content.html"]],otherTag:[[/<\?((php)|=)?/,{token:"@rematch",switchTo:"@phpInSimpleState.otherTag"}],[/\/?>/,"delimiter.html","@pop"],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/[ \t\r\n]+/]],script:[[/<\?((php)|=)?/,{token:"@rematch",switchTo:"@phpInSimpleState.script"}],[/type/,"attribute.name","@scriptAfterType"],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/>/,{token:"delimiter.html",next:"@scriptEmbedded.text/javascript",nextEmbedded:"text/javascript"}],[/[ \t\r\n]+/],[/(<\/)(script\s*)(>)/,["delimiter.html","tag.html",{token:"delimiter.html",next:"@pop"}]]],scriptAfterType:[[/<\?((php)|=)?/,{token:"@rematch",switchTo:"@phpInSimpleState.scriptAfterType"}],[/=/,"delimiter","@scriptAfterTypeEquals"],[/>/,{token:"delimiter.html",next:"@scriptEmbedded.text/javascript",nextEmbedded:"text/javascript"}],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:"@rematch",next:"@pop"}]],scriptAfterTypeEquals:[[/<\?((php)|=)?/,{token:"@rematch",switchTo:"@phpInSimpleState.scriptAfterTypeEquals"}],[/"([^"]*)"/,{token:"attribute.value",switchTo:"@scriptWithCustomType.$1"}],[/'([^']*)'/,{token:"attribute.value",switchTo:"@scriptWithCustomType.$1"}],[/>/,{token:"delimiter.html",next:"@scriptEmbedded.text/javascript",nextEmbedded:"text/javascript"}],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:"@rematch",next:"@pop"}]],scriptWithCustomType:[[/<\?((php)|=)?/,{token:"@rematch",switchTo:"@phpInSimpleState.scriptWithCustomType.$S2"}],[/>/,{token:"delimiter.html",next:"@scriptEmbedded.$S2",nextEmbedded:"$S2"}],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:"@rematch",next:"@pop"}]],scriptEmbedded:[[/<\?((php)|=)?/,{token:"@rematch",switchTo:"@phpInEmbeddedState.scriptEmbedded.$S2",nextEmbedded:"@pop"}],[/<\/script/,{token:"@rematch",next:"@pop",nextEmbedded:"@pop"}]],style:[[/<\?((php)|=)?/,{token:"@rematch",switchTo:"@phpInSimpleState.style"}],[/type/,"attribute.name","@styleAfterType"],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/>/,{token:"delimiter.html",next:"@styleEmbedded.text/css",nextEmbedded:"text/css"}],[/[ \t\r\n]+/],[/(<\/)(style\s*)(>)/,["delimiter.html","tag.html",{token:"delimiter.html",next:"@pop"}]]],styleAfterType:[[/<\?((php)|=)?/,{token:"@rematch",switchTo:"@phpInSimpleState.styleAfterType"}],[/=/,"delimiter","@styleAfterTypeEquals"],[/>/,{token:"delimiter.html",next:"@styleEmbedded.text/css",nextEmbedded:"text/css"}],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:"@rematch",next:"@pop"}]],styleAfterTypeEquals:[[/<\?((php)|=)?/,{token:"@rematch",switchTo:"@phpInSimpleState.styleAfterTypeEquals"}],[/"([^"]*)"/,{token:"attribute.value",switchTo:"@styleWithCustomType.$1"}],[/'([^']*)'/,{token:"attribute.value",switchTo:"@styleWithCustomType.$1"}],[/>/,{token:"delimiter.html",next:"@styleEmbedded.text/css",nextEmbedded:"text/css"}],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:"@rematch",next:"@pop"}]],styleWithCustomType:[[/<\?((php)|=)?/,{token:"@rematch",switchTo:"@phpInSimpleState.styleWithCustomType.$S2"}],[/>/,{token:"delimiter.html",next:"@styleEmbedded.$S2",nextEmbedded:"$S2"}],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:"@rematch",next:"@pop"}]],styleEmbedded:[[/<\?((php)|=)?/,{token:"@rematch",switchTo:"@phpInEmbeddedState.styleEmbedded.$S2",nextEmbedded:"@pop"}],[/<\/style/,{token:"@rematch",next:"@pop",nextEmbedded:"@pop"}]],phpInSimpleState:[[/<\?((php)|=)?/,"metatag.php"],[/\?>/,{token:"metatag.php",switchTo:"@$S2.$S3"}],{include:"phpRoot"}],phpInEmbeddedState:[[/<\?((php)|=)?/,"metatag.php"],[/\?>/,{token:"metatag.php",switchTo:"@$S2.$S3",nextEmbedded:"$S3"}],{include:"phpRoot"}],phpRoot:[[/[a-zA-Z_]\w*/,{cases:{"@phpKeywords":{token:"keyword.php"},"@phpCompileTimeConstants":{token:"constant.php"},"@default":"identifier.php"}}],[/[$a-zA-Z_]\w*/,{cases:{"@phpPreDefinedVariables":{token:"variable.predefined.php"},"@default":"variable.php"}}],[/[{}]/,"delimiter.bracket.php"],[/[\[\]]/,"delimiter.array.php"],[/[()]/,"delimiter.parenthesis.php"],[/[ \t\r\n]+/],[/#/,"comment.php","@phpLineComment"],[/\/\//,"comment.php","@phpLineComment"],[/\/\*/,"comment.php","@phpComment"],[/"/,"string.php","@phpDoubleQuoteString"],[/'/,"string.php","@phpSingleQuoteString"],[/[\+\-\*\%\&\|\^\~\!\=\<\>\/\?\;\:\.\,\@]/,"delimiter.php"],[/\d*\d+[eE]([\-+]?\d+)?/,"number.float.php"],[/\d*\.\d+([eE][\-+]?\d+)?/,"number.float.php"],[/0[xX][0-9a-fA-F']*[0-9a-fA-F]/,"number.hex.php"],[/0[0-7']*[0-7]/,"number.octal.php"],[/0[bB][0-1']*[0-1]/,"number.binary.php"],[/\d[\d']*/,"number.php"],[/\d/,"number.php"]],phpComment:[[/\*\//,"comment.php","@pop"],[/[^*]+/,"comment.php"],[/./,"comment.php"]],phpLineComment:[[/\?>/,{token:"@rematch",next:"@pop"}],[/.$/,"comment.php","@pop"],[/[^?]+$/,"comment.php","@pop"],[/[^?]+/,"comment.php"],[/./,"comment.php"]],phpDoubleQuoteString:[[/[^\\"]+/,"string.php"],[/@escapes/,"string.escape.php"],[/\\./,"string.escape.invalid.php"],[/"/,"string.php","@pop"]],phpSingleQuoteString:[[/[^\\']+/,"string.php"],[/@escapes/,"string.escape.php"],[/\\./,"string.escape.invalid.php"],[/'/,"string.php","@pop"]]},phpKeywords:["abstract","and","array","as","break","callable","case","catch","cfunction","class","clone","const","continue","declare","default","do","else","elseif","enddeclare","endfor","endforeach","endif","endswitch","endwhile","extends","false","final","for","foreach","function","global","goto","if","implements","interface","instanceof","insteadof","namespace","new","null","object","old_function","or","private","protected","public","resource","static","switch","throw","trait","try","true","use","var","while","xor","die","echo","empty","exit","eval","include","include_once","isset","list","require","require_once","return","print","unset","yield","__construct"],phpCompileTimeConstants:["__CLASS__","__DIR__","__FILE__","__LINE__","__NAMESPACE__","__METHOD__","__FUNCTION__","__TRAIT__"],phpPreDefinedVariables:["$GLOBALS","$_SERVER","$_GET","$_POST","$_FILES","$_REQUEST","$_SESSION","$_ENV","$_COOKIE","$php_errormsg","$HTTP_RAW_POST_DATA","$http_response_header","$argc","$argv"],escapes:/\\(?:[abfnrtv\\"']|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/}}); \ No newline at end of file diff --git a/pigx-register/src/main/resources/static/console-ui/public/js/vs/basic-languages/src/postiats.js b/pigx-register/src/main/resources/static/console-ui/public/js/vs/basic-languages/src/postiats.js new file mode 100644 index 0000000..a223576 --- /dev/null +++ b/pigx-register/src/main/resources/static/console-ui/public/js/vs/basic-languages/src/postiats.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 0.9.0(e162b4ba29044167bc7181c42b3270fa8a467424) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/src/postiats",["require","exports"],function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.conf={comments:{lineComment:"//",blockComment:["(*","*)"]},brackets:[["{","}"],["[","]"],["(",")"],["<",">"]],autoClosingPairs:[{open:'"',close:'"',notIn:["string","comment"]},{open:"{",close:"}",notIn:["string","comment"]},{open:"[",close:"]",notIn:["string","comment"]},{open:"(",close:")",notIn:["string","comment"]}]},t.language={tokenPostfix:".pats",defaultToken:"invalid",keywords:["abstype","abst0ype","absprop","absview","absvtype","absviewtype","absvt0ype","absviewt0ype","as","and","assume","begin","classdec","datasort","datatype","dataprop","dataview","datavtype","dataviewtype","do","end","extern","extype","extvar","exception","fn","fnx","fun","prfn","prfun","praxi","castfn","if","then","else","ifcase","in","infix","infixl","infixr","prefix","postfix","implmnt","implement","primplmnt","primplement","import","let","local","macdef","macrodef","nonfix","symelim","symintr","overload","of","op","rec","sif","scase","sortdef","sta","stacst","stadef","static","staload","dynload","try","tkindef","typedef","propdef","viewdef","vtypedef","viewtypedef","prval","var","prvar","when","where","with","withtype","withprop","withview","withvtype","withviewtype"],keywords_dlr:["$delay","$ldelay","$arrpsz","$arrptrsize","$d2ctype","$effmask","$effmask_ntm","$effmask_exn","$effmask_ref","$effmask_wrt","$effmask_all","$extern","$extkind","$extype","$extype_struct","$extval","$extfcall","$extmcall","$literal","$myfilename","$mylocation","$myfunction","$lst","$lst_t","$lst_vt","$list","$list_t","$list_vt","$rec","$rec_t","$rec_vt","$record","$record_t","$record_vt","$tup","$tup_t","$tup_vt","$tuple","$tuple_t","$tuple_vt","$break","$continue","$raise","$showtype","$vcopyenv_v","$vcopyenv_vt","$tempenver","$solver_assert","$solver_verify"],keywords_srp:["#if","#ifdef","#ifndef","#then","#elif","#elifdef","#elifndef","#else","#endif","#error","#prerr","#print","#assert","#undef","#define","#include","#require","#pragma","#codegen2","#codegen3"],irregular_keyword_list:["val+","val-","val","case+","case-","case","addr@","addr","fold@","free@","fix@","fix","lam@","lam","llam@","llam","viewt@ype+","viewt@ype-","viewt@ype","viewtype+","viewtype-","viewtype","view+","view-","view@","view","type+","type-","type","vtype+","vtype-","vtype","vt@ype+","vt@ype-","vt@ype","viewt@ype+","viewt@ype-","viewt@ype","viewtype+","viewtype-","viewtype","prop+","prop-","prop","type+","type-","type","t@ype","t@ype+","t@ype-","abst@ype","abstype","absviewt@ype","absvt@ype","for*","for","while*","while"],keywords_types:["bool","double","byte","int","short","char","void","unit","long","float","string","strptr"],keywords_effects:["0","fun","clo","prf","funclo","cloptr","cloref","ref","ntm","1"],operators:["@","!","|","`",":","$",".","=","#","~","..","...","=>","=<>","=/=>","=>>","=/=>>","<",">","><",".<",">.",".<>.","->","-<>"],brackets:[{open:",(",close:")",token:"delimiter.parenthesis"},{open:"`(",close:")",token:"delimiter.parenthesis"},{open:"%(",close:")",token:"delimiter.parenthesis"},{open:"'(",close:")",token:"delimiter.parenthesis"},{open:"'{",close:"}",token:"delimiter.parenthesis"},{open:"@(",close:")",token:"delimiter.parenthesis"},{open:"@{",close:"}",token:"delimiter.brace"},{open:"@[",close:"]",token:"delimiter.square"},{open:"#[",close:"]",token:"delimiter.square"},{open:"{",close:"}",token:"delimiter.curly"},{open:"[",close:"]",token:"delimiter.square"},{open:"(",close:")",token:"delimiter.parenthesis"},{open:"<",close:">",token:"delimiter.angle"}],symbols:/[=>]/,digit:/[0-9]/,digitseq0:/@digit*/,xdigit:/[0-9A-Za-z]/,xdigitseq0:/@xdigit*/,INTSP:/[lLuU]/,FLOATSP:/[fFlL]/,fexponent:/[eE][+-]?[0-9]+/,fexponent_bin:/[pP][+-]?[0-9]+/,deciexp:/\.[0-9]*@fexponent?/,hexiexp:/\.[0-9a-zA-Z]*@fexponent_bin?/,irregular_keywords:/val[+-]?|case[+-]?|addr\@?|fold\@|free\@|fix\@?|lam\@?|llam\@?|prop[+-]?|type[+-]?|view[+-@]?|viewt@?ype[+-]?|t@?ype[+-]?|v(iew)?t@?ype[+-]?|abst@?ype|absv(iew)?t@?ype|for\*?|while\*?/,ESCHAR:/[ntvbrfa\\\?'"\(\[\{]/,start:"root",tokenizer:{root:[{regex:/[ \t\r\n]+/,action:{token:""}},{regex:/\(\*\)/,action:{token:"invalid"}},{regex:/\(\*/,action:{token:"comment",next:"lexing_COMMENT_block_ml"}},{regex:/\(/,action:"@brackets"},{regex:/\)/,action:"@brackets"},{regex:/\[/,action:"@brackets"},{regex:/\]/,action:"@brackets"},{regex:/\{/,action:"@brackets"},{regex:/\}/,action:"@brackets"},{regex:/,\(/,action:"@brackets"},{regex:/,/,action:{token:"delimiter.comma"}},{regex:/;/,action:{token:"delimiter.semicolon"}},{regex:/@\(/,action:"@brackets"},{regex:/@\[/,action:"@brackets"},{regex:/@\{/,action:"@brackets"},{regex:/:/,action:{token:"@rematch",next:"@pop"}}],lexing_EXTCODE:[{regex:/^%}/,action:{token:"@rematch",next:"@pop",nextEmbedded:"@pop"}},{regex:/[^%]+/,action:""}],lexing_DQUOTE:[{regex:/"/,action:{token:"string.quote",next:"@pop"}},{regex:/(\{\$)(@IDENTFST@IDENTRST*)(\})/,action:[{token:"string.escape"},{token:"identifier"},{token:"string.escape"}]},{regex:/\\$/,action:{token:"string.escape"}},{regex:/\\(@ESCHAR|[xX]@xdigit+|@digit+)/,action:{token:"string.escape"}},{regex:/[^\\"]+/,action:{token:"string"}}]}}}); \ No newline at end of file diff --git a/pigx-register/src/main/resources/static/console-ui/public/js/vs/basic-languages/src/powershell.js b/pigx-register/src/main/resources/static/console-ui/public/js/vs/basic-languages/src/powershell.js new file mode 100644 index 0000000..dc0b256 --- /dev/null +++ b/pigx-register/src/main/resources/static/console-ui/public/js/vs/basic-languages/src/powershell.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 0.9.0(e162b4ba29044167bc7181c42b3270fa8a467424) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/src/powershell",["require","exports"],function(e,s){"use strict";Object.defineProperty(s,"__esModule",{value:!0}),s.conf={wordPattern:/(-?\d*\.\d\w*)|([^\`\~\!\@\#%\^\&\*\(\)\=\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\?\s]+)/g,comments:{lineComment:"#",blockComment:["<#","#>"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"',notIn:["string"]},{open:"'",close:"'",notIn:["string","comment"]}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}]},s.language={defaultToken:"",ignoreCase:!0,tokenPostfix:".ps1",brackets:[{token:"delimiter.curly",open:"{",close:"}"},{token:"delimiter.square",open:"[",close:"]"},{token:"delimiter.parenthesis",open:"(",close:")"}],keywords:["begin","break","catch","class","continue","data","define","do","dynamicparam","else","elseif","end","exit","filter","finally","for","foreach","from","function","if","in","param","process","return","switch","throw","trap","try","until","using","var","while","workflow","parallel","sequence","inlinescript","configuration"],helpKeywords:/SYNOPSIS|DESCRIPTION|PARAMETER|EXAMPLE|INPUTS|OUTPUTS|NOTES|LINK|COMPONENT|ROLE|FUNCTIONALITY|FORWARDHELPTARGETNAME|FORWARDHELPCATEGORY|REMOTEHELPRUNSPACE|EXTERNALHELP/,symbols:/[=>/,"comment","@pop"],[/(\.)(@helpKeywords)(?!\w)/,{token:"comment.keyword.$2"}],[/[\.#]/,"comment"]]}}}); \ No newline at end of file diff --git a/pigx-register/src/main/resources/static/console-ui/public/js/vs/basic-languages/src/pug.js b/pigx-register/src/main/resources/static/console-ui/public/js/vs/basic-languages/src/pug.js new file mode 100644 index 0000000..bf3be01 --- /dev/null +++ b/pigx-register/src/main/resources/static/console-ui/public/js/vs/basic-languages/src/pug.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 0.9.0(e162b4ba29044167bc7181c42b3270fa8a467424) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/src/pug",["require","exports"],function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.conf={comments:{lineComment:"//"},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:'"',close:'"',notIn:["string","comment"]},{open:"'",close:"'",notIn:["string","comment"]},{open:"{",close:"}",notIn:["string","comment"]},{open:"[",close:"]",notIn:["string","comment"]},{open:"(",close:")",notIn:["string","comment"]}]},t.language={defaultToken:"",tokenPostfix:".pug",ignoreCase:!0,brackets:[{token:"delimiter.curly",open:"{",close:"}"},{token:"delimiter.array",open:"[",close:"]"},{token:"delimiter.parenthesis",open:"(",close:")"}],keywords:["append","block","case","default","doctype","each","else","extends","for","if","in","include","mixin","typeof","unless","var","when"],tags:["a","abbr","acronym","address","area","article","aside","audio","b","base","basefont","bdi","bdo","blockquote","body","br","button","canvas","caption","center","cite","code","col","colgroup","command","datalist","dd","del","details","dfn","div","dl","dt","em","embed","fieldset","figcaption","figure","font","footer","form","frame","frameset","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","iframe","img","input","ins","keygen","kbd","label","li","link","map","mark","menu","meta","meter","nav","noframes","noscript","object","ol","optgroup","option","output","p","param","pre","progress","q","rp","rt","ruby","s","samp","script","section","select","small","source","span","strike","strong","style","sub","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","title","tr","tracks","tt","u","ul","video","wbr"],symbols:/[\+\-\*\%\&\|\!\=\/\.\,\:]+/,escapes:/\\(?:[abfnrtv\\"']|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/,tokenizer:{root:[[/^(\s*)([a-zA-Z_-][\w-]*)/,{cases:{"$2@tags":{cases:{"@eos":["","tag"],"@default":["",{token:"tag",next:"@tag.$1"}]}},"$2@keywords":["",{token:"keyword.$2"}],"@default":["",""]}}],[/^(\s*)(#[a-zA-Z_-][\w-]*)/,{cases:{"@eos":["","tag.id"],"@default":["",{token:"tag.id",next:"@tag.$1"}]}}],[/^(\s*)(\.[a-zA-Z_-][\w-]*)/,{cases:{"@eos":["","tag.class"],"@default":["",{token:"tag.class",next:"@tag.$1"}]}}],[/^(\s*)(\|.*)$/,""],{include:"@whitespace"},[/[a-zA-Z_$][\w$]*/,{cases:{"@keywords":{token:"keyword.$0"},"@default":""}}],[/[{}()\[\]]/,"@brackets"],[/@symbols/,"delimiter"],[/\d+\.\d+([eE][\-+]?\d+)?/,"number.float"],[/\d+/,"number"],[/"/,"string",'@string."'],[/'/,"string","@string.'"]],tag:[[/(\.)(\s*$)/,[{token:"delimiter",next:"@blockText.$S2."},""]],[/\s+/,{token:"",next:"@simpleText"}],[/#[a-zA-Z_-][\w-]*/,{cases:{"@eos":{token:"tag.id",next:"@pop"},"@default":"tag.id"}}],[/\.[a-zA-Z_-][\w-]*/,{cases:{"@eos":{token:"tag.class",next:"@pop"},"@default":"tag.class"}}],[/\(/,{token:"delimiter.parenthesis",next:"@attributeList"}]],simpleText:[[/[^#]+$/,{token:"",next:"@popall"}],[/[^#]+/,{token:""}],[/(#{)([^}]*)(})/,{cases:{"@eos":["interpolation.delimiter","interpolation",{token:"interpolation.delimiter",next:"@popall"}],"@default":["interpolation.delimiter","interpolation","interpolation.delimiter"]}}],[/#$/,{token:"",next:"@popall"}],[/#/,""]],attributeList:[[/\s+/,""],[/(\w+)(\s*=\s*)("|')/,["attribute.name","delimiter",{token:"attribute.value",next:"@value.$3"}]],[/\w+/,"attribute.name"],[/,/,{cases:{"@eos":{token:"attribute.delimiter",next:"@popall"},"@default":"attribute.delimiter"}}],[/\)$/,{token:"delimiter.parenthesis",next:"@popall"}],[/\)/,{token:"delimiter.parenthesis",next:"@pop"}]],whitespace:[[/^(\s*)(\/\/.*)$/,{token:"comment",next:"@blockText.$1.comment"}],[/[ \t\r\n]+/,""],[//,{token:"comment",next:"@pop"}],[//,"comment.html","@pop"],[/[^-]+/,"comment.content.html"],[/./,"comment.content.html"]],otherTag:[[/@[^@]/,{token:"@rematch",switchTo:"@razorInSimpleState.otherTag"}],[/\/?>/,"delimiter.html","@pop"],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/[ \t\r\n]+/]],script:[[/@[^@]/,{token:"@rematch",switchTo:"@razorInSimpleState.script"}],[/type/,"attribute.name","@scriptAfterType"],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/>/,{token:"delimiter.html",next:"@scriptEmbedded.text/javascript",nextEmbedded:"text/javascript"}],[/[ \t\r\n]+/],[/(<\/)(script\s*)(>)/,["delimiter.html","tag.html",{token:"delimiter.html",next:"@pop"}]]],scriptAfterType:[[/@[^@]/,{token:"@rematch",switchTo:"@razorInSimpleState.scriptAfterType"}],[/=/,"delimiter","@scriptAfterTypeEquals"],[/>/,{token:"delimiter.html",next:"@scriptEmbedded.text/javascript",nextEmbedded:"text/javascript"}],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:"@rematch",next:"@pop"}]],scriptAfterTypeEquals:[[/@[^@]/,{token:"@rematch",switchTo:"@razorInSimpleState.scriptAfterTypeEquals"}],[/"([^"]*)"/,{token:"attribute.value",switchTo:"@scriptWithCustomType.$1"}],[/'([^']*)'/,{token:"attribute.value",switchTo:"@scriptWithCustomType.$1"}],[/>/,{token:"delimiter.html",next:"@scriptEmbedded.text/javascript",nextEmbedded:"text/javascript"}],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:"@rematch",next:"@pop"}]],scriptWithCustomType:[[/@[^@]/,{token:"@rematch",switchTo:"@razorInSimpleState.scriptWithCustomType.$S2"}],[/>/,{token:"delimiter.html",next:"@scriptEmbedded.$S2",nextEmbedded:"$S2"}],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:"@rematch",next:"@pop"}]],scriptEmbedded:[[/@[^@]/,{token:"@rematch",switchTo:"@razorInEmbeddedState.scriptEmbedded.$S2",nextEmbedded:"@pop"}],[/<\/script/,{token:"@rematch",next:"@pop",nextEmbedded:"@pop"}]],style:[[/@[^@]/,{token:"@rematch",switchTo:"@razorInSimpleState.style"}],[/type/,"attribute.name","@styleAfterType"],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/>/,{token:"delimiter.html",next:"@styleEmbedded.text/css",nextEmbedded:"text/css"}],[/[ \t\r\n]+/],[/(<\/)(style\s*)(>)/,["delimiter.html","tag.html",{token:"delimiter.html",next:"@pop"}]]],styleAfterType:[[/@[^@]/,{token:"@rematch",switchTo:"@razorInSimpleState.styleAfterType"}],[/=/,"delimiter","@styleAfterTypeEquals"],[/>/,{token:"delimiter.html",next:"@styleEmbedded.text/css",nextEmbedded:"text/css"}],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:"@rematch",next:"@pop"}]],styleAfterTypeEquals:[[/@[^@]/,{token:"@rematch",switchTo:"@razorInSimpleState.styleAfterTypeEquals"}],[/"([^"]*)"/,{token:"attribute.value",switchTo:"@styleWithCustomType.$1"}],[/'([^']*)'/,{token:"attribute.value",switchTo:"@styleWithCustomType.$1"}],[/>/,{token:"delimiter.html",next:"@styleEmbedded.text/css",nextEmbedded:"text/css"}],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:"@rematch",next:"@pop"}]],styleWithCustomType:[[/@[^@]/,{token:"@rematch",switchTo:"@razorInSimpleState.styleWithCustomType.$S2"}],[/>/,{token:"delimiter.html",next:"@styleEmbedded.$S2",nextEmbedded:"$S2"}],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:"@rematch",next:"@pop"}]],styleEmbedded:[[/@[^@]/,{token:"@rematch",switchTo:"@razorInEmbeddedState.styleEmbedded.$S2",nextEmbedded:"@pop"}],[/<\/style/,{token:"@rematch",next:"@pop",nextEmbedded:"@pop"}]],razorInSimpleState:[[/@\*/,"comment.cs","@razorBlockCommentTopLevel"],[/@[{(]/,"metatag.cs","@razorRootTopLevel"],[/(@)(\s*[\w]+)/,["metatag.cs",{token:"identifier.cs",switchTo:"@$S2.$S3"}]],[/[})]/,{token:"metatag.cs",switchTo:"@$S2.$S3"}],[/\*@/,{token:"comment.cs",switchTo:"@$S2.$S3"}]],razorInEmbeddedState:[[/@\*/,"comment.cs","@razorBlockCommentTopLevel"],[/@[{(]/,"metatag.cs","@razorRootTopLevel"],[/(@)(\s*[\w]+)/,["metatag.cs",{token:"identifier.cs",switchTo:"@$S2.$S3",nextEmbedded:"$S3"}]],[/[})]/,{token:"metatag.cs",switchTo:"@$S2.$S3",nextEmbedded:"$S3"}],[/\*@/,{token:"comment.cs",switchTo:"@$S2.$S3",nextEmbedded:"$S3"}]],razorBlockCommentTopLevel:[[/\*@/,"@rematch","@pop"],[/[^*]+/,"comment.cs"],[/./,"comment.cs"]],razorBlockComment:[[/\*@/,"comment.cs","@pop"],[/[^*]+/,"comment.cs"],[/./,"comment.cs"]],razorRootTopLevel:[[/\{/,"delimiter.bracket.cs","@razorRoot"],[/\(/,"delimiter.parenthesis.cs","@razorRoot"],[/[})]/,"@rematch","@pop"],{include:"razorCommon"}],razorRoot:[[/\{/,"delimiter.bracket.cs","@razorRoot"],[/\(/,"delimiter.parenthesis.cs","@razorRoot"],[/\}/,"delimiter.bracket.cs","@pop"],[/\)/,"delimiter.parenthesis.cs","@pop"],{include:"razorCommon"}],razorCommon:[[/[a-zA-Z_]\w*/,{cases:{"@razorKeywords":{token:"keyword.cs"},"@default":"identifier.cs"}}],[/[\[\]]/,"delimiter.array.cs"],[/[ \t\r\n]+/],[/\/\/.*$/,"comment.cs"],[/@\*/,"comment.cs","@razorBlockComment"],[/"([^"]*)"/,"string.cs"],[/'([^']*)'/,"string.cs"],[/(<)(\w+)(\/>)/,["delimiter.html","tag.html","delimiter.html"]],[/(<)(\w+)(>)/,["delimiter.html","tag.html","delimiter.html"]],[/(<\/)(\w+)(>)/,["delimiter.html","tag.html","delimiter.html"]],[/[\+\-\*\%\&\|\^\~\!\=\<\>\/\?\;\:\.\,]/,"delimiter.cs"],[/\d*\d+[eE]([\-+]?\d+)?/,"number.float.cs"],[/\d*\.\d+([eE][\-+]?\d+)?/,"number.float.cs"],[/0[xX][0-9a-fA-F']*[0-9a-fA-F]/,"number.hex.cs"],[/0[0-7']*[0-7]/,"number.octal.cs"],[/0[bB][0-1']*[0-1]/,"number.binary.cs"],[/\d[\d']*/,"number.cs"],[/\d/,"number.cs"]]},razorKeywords:["abstract","as","async","await","base","bool","break","by","byte","case","catch","char","checked","class","const","continue","decimal","default","delegate","do","double","descending","explicit","event","extern","else","enum","false","finally","fixed","float","for","foreach","from","goto","group","if","implicit","in","int","interface","internal","into","is","lock","long","nameof","new","null","namespace","object","operator","out","override","orderby","params","private","protected","public","readonly","ref","return","switch","struct","sbyte","sealed","short","sizeof","stackalloc","static","string","select","this","throw","true","try","typeof","uint","ulong","unchecked","unsafe","ushort","using","var","virtual","volatile","void","when","while","where","yield","model","inject"],escapes:/\\(?:[abfnrtv\\"']|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/}}); \ No newline at end of file diff --git a/pigx-register/src/main/resources/static/console-ui/public/js/vs/basic-languages/src/ruby.js b/pigx-register/src/main/resources/static/console-ui/public/js/vs/basic-languages/src/ruby.js new file mode 100644 index 0000000..54e461e --- /dev/null +++ b/pigx-register/src/main/resources/static/console-ui/public/js/vs/basic-languages/src/ruby.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 0.9.0(e162b4ba29044167bc7181c42b3270fa8a467424) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/src/ruby",["require","exports"],function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.conf={comments:{lineComment:"#",blockComment:["=begin","=end"]},brackets:[["(",")"],["{","}"],["[","]"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}]},t.language={tokenPostfix:".ruby",keywords:["__LINE__","__ENCODING__","__FILE__","BEGIN","END","alias","and","begin","break","case","class","def","defined?","do","else","elsif","end","ensure","for","false","if","in","module","next","nil","not","or","redo","rescue","retry","return","self","super","then","true","undef","unless","until","when","while","yield"],keywordops:["::","..","...","?",":","=>"],builtins:["require","public","private","include","extend","attr_reader","protected","private_class_method","protected_class_method","new"],declarations:["module","class","def","case","do","begin","for","if","while","until","unless"],linedecls:["def","case","do","begin","for","if","while","until","unless"],operators:["^","&","|","<=>","==","===","!~","=~",">",">=","<","<=","<<",">>","+","-","*","/","%","**","~","+@","-@","[]","[]=","`","+=","-=","*=","**=","/=","^=","%=","<<=",">>=","&=","&&=","||=","|="],brackets:[{open:"(",close:")",token:"delimiter.parenthesis"},{open:"{",close:"}",token:"delimiter.curly"},{open:"[",close:"]",token:"delimiter.square"}],symbols:/[=>"}],[/%([qws])(@delim)/,{token:"string.$1.delim",switchTo:"@qstring.$1.$2.$2"}],[/%r\(/,{token:"regexp.delim",switchTo:"@pregexp.(.)"}],[/%r\[/,{token:"regexp.delim",switchTo:"@pregexp.[.]"}],[/%r\{/,{token:"regexp.delim",switchTo:"@pregexp.{.}"}],[/%r"}],[/%r(@delim)/,{token:"regexp.delim",switchTo:"@pregexp.$1.$1"}],[/%(x|W|Q?)\(/,{token:"string.$1.delim",switchTo:"@qqstring.$1.(.)"}],[/%(x|W|Q?)\[/,{token:"string.$1.delim",switchTo:"@qqstring.$1.[.]"}],[/%(x|W|Q?)\{/,{token:"string.$1.delim",switchTo:"@qqstring.$1.{.}"}],[/%(x|W|Q?)"}],[/%(x|W|Q?)(@delim)/,{token:"string.$1.delim",switchTo:"@qqstring.$1.$2.$2"}],[/%([rqwsxW]|Q?)./,{token:"invalid",next:"@pop"}],[/./,{token:"invalid",next:"@pop"}]],qstring:[[/\\$/,"string.$S2.escape"],[/\\./,"string.$S2.escape"],[/./,{cases:{"$#==$S4":{token:"string.$S2.delim",next:"@pop"},"$#==$S3":{token:"string.$S2.delim",next:"@push"},"@default":"string.$S2"}}]],qqstring:[[/#/,"string.$S2.escape","@interpolated"],{include:"@qstring"}],whitespace:[[/[ \t\r\n]+/,""],[/^\s*=begin\b/,"comment","@comment"],[/#.*$/,"comment"]],comment:[[/[^=]+/,"comment"],[/^\s*=begin\b/,"comment.invalid"],[/^\s*=end\b.*/,"comment","@pop"],[/[=]/,"comment"]]}}}); \ No newline at end of file diff --git a/pigx-register/src/main/resources/static/console-ui/public/js/vs/basic-languages/src/sb.js b/pigx-register/src/main/resources/static/console-ui/public/js/vs/basic-languages/src/sb.js new file mode 100644 index 0000000..b7f69d6 --- /dev/null +++ b/pigx-register/src/main/resources/static/console-ui/public/js/vs/basic-languages/src/sb.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 0.9.0(e162b4ba29044167bc7181c42b3270fa8a467424) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/src/sb",["require","exports"],function(e,o){"use strict";Object.defineProperty(o,"__esModule",{value:!0}),o.conf={comments:{lineComment:"'"},brackets:[["(",")"],["[","]"],["If","EndIf"],["While","EndWhile"],["For","EndFor"],["Sub","EndSub"]],autoClosingPairs:[{open:'"',close:'"',notIn:["string","comment"]},{open:"(",close:")",notIn:["string","comment"]},{open:"[",close:"]",notIn:["string","comment"]}]},o.language={defaultToken:"",tokenPostfix:".sb",ignoreCase:!0,brackets:[{token:"delimiter.array",open:"[",close:"]"},{token:"delimiter.parenthesis",open:"(",close:")"},{token:"keyword.tag-if",open:"If",close:"EndIf"},{token:"keyword.tag-while",open:"While",close:"EndWhile"},{token:"keyword.tag-for",open:"For",close:"EndFor"},{token:"keyword.tag-sub",open:"Sub",close:"EndSub"}],keywords:["Else","ElseIf","EndFor","EndIf","EndSub","EndWhile","For","Goto","If","Step","Sub","Then","To","While"],tagwords:["If","Sub","While","For"],operators:[">","<","<>","<=",">=","And","Or","+","-","*","/","="],identifier:/[a-zA-Z_][\w]*/,symbols:/[=><:+\-*\/%\.,]+/,escapes:/\\(?:[abfnrtv\\"']|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/,tokenizer:{root:[{include:"@whitespace"},[/(@identifier)(?=[.])/,"type"],[/@identifier/,{cases:{"@keywords":{token:"keyword.$0"},"@operators":"operator","@default":"variable.name"}}],[/([.])(@identifier)/,{cases:{$2:["delimiter","type.member"],"@default":""}}],[/\d*\.\d+/,"number.float"],[/\d+/,"number"],[/[()\[\]]/,"@brackets"],[/@symbols/,{cases:{"@operators":"operator","@default":"delimiter"}}],[/"([^"\\]|\\.)*$/,"string.invalid"],[/"/,"string","@string"]],whitespace:[[/[ \t\r\n]+/,""],[/(\').*$/,"comment"]],string:[[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"C?/,"string","@pop"]]}}}); \ No newline at end of file diff --git a/pigx-register/src/main/resources/static/console-ui/public/js/vs/basic-languages/src/scss.js b/pigx-register/src/main/resources/static/console-ui/public/js/vs/basic-languages/src/scss.js new file mode 100644 index 0000000..cae57b3 --- /dev/null +++ b/pigx-register/src/main/resources/static/console-ui/public/js/vs/basic-languages/src/scss.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 0.9.0(e162b4ba29044167bc7181c42b3270fa8a467424) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/src/scss",["require","exports"],function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.conf={wordPattern:/(#?-?\d*\.\d\w*%?)|([@$#!.:]?[\w-?]+%?)|[@#!.]/g,comments:{blockComment:["/*","*/"],lineComment:"//"},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}",notIn:["string","comment"]},{open:"[",close:"]",notIn:["string","comment"]},{open:"(",close:")",notIn:["string","comment"]},{open:'"',close:'"',notIn:["string","comment"]},{open:"'",close:"'",notIn:["string","comment"]}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}]},t.language={defaultToken:"",tokenPostfix:".scss",ws:"[ \t\n\r\f]*",identifier:"-?-?([a-zA-Z]|(\\\\(([0-9a-fA-F]{1,6}\\s?)|[^[0-9a-fA-F])))([\\w\\-]|(\\\\(([0-9a-fA-F]{1,6}\\s?)|[^[0-9a-fA-F])))*",brackets:[{open:"{",close:"}",token:"delimiter.curly"},{open:"[",close:"]",token:"delimiter.bracket"},{open:"(",close:")",token:"delimiter.parenthesis"},{open:"<",close:">",token:"delimiter.angle"}],tokenizer:{root:[{include:"@selector"}],selector:[{include:"@comments"},{include:"@import"},{include:"@variabledeclaration"},{include:"@warndebug"},["[@](include)",{token:"keyword",next:"@includedeclaration"}],["[@](keyframes|-webkit-keyframes|-moz-keyframes|-o-keyframes)",{token:"keyword",next:"@keyframedeclaration"}],["[@](page|content|font-face|-moz-document)",{token:"keyword"}],["[@](charset|namespace)",{token:"keyword",next:"@declarationbody"}],["[@](function)",{token:"keyword",next:"@functiondeclaration"}],["[@](mixin)",{token:"keyword",next:"@mixindeclaration"}],["url(\\-prefix)?\\(",{token:"meta",next:"@urldeclaration"}],{include:"@controlstatement"},{include:"@selectorname"},["[&\\*]","tag"],["[>\\+,]","delimiter"],["\\[",{token:"delimiter.bracket",next:"@selectorattribute"}],["{",{token:"delimiter.curly",next:"@selectorbody"}]],selectorbody:[["[*_]?@identifier@ws:(?=(\\s|\\d|[^{;}]*[;}]))","attribute.name","@rulevalue"],{include:"@selector"},["[@](extend)",{token:"keyword",next:"@extendbody"}],["[@](return)",{token:"keyword",next:"@declarationbody"}],["}",{token:"delimiter.curly",next:"@pop"}]],selectorname:[["#{",{token:"meta",next:"@variableinterpolation"}],["(\\.|#(?=[^{])|%|(@identifier)|:)+","tag"]],selectorattribute:[{include:"@term"},["]",{token:"delimiter.bracket",next:"@pop"}]],term:[{include:"@comments"},["url(\\-prefix)?\\(",{token:"meta",next:"@urldeclaration"}],{include:"@functioninvocation"},{include:"@numbers"},{include:"@strings"},{include:"@variablereference"},["(and\\b|or\\b|not\\b)","operator"],{include:"@name"},["([<>=\\+\\-\\*\\/\\^\\|\\~,])","operator"],[",","delimiter"],["!default","literal"],["\\(",{token:"delimiter.parenthesis",next:"@parenthizedterm"}]],rulevalue:[{include:"@term"},["!important","literal"],[";","delimiter","@pop"],["{",{token:"delimiter.curly",switchTo:"@nestedproperty"}],["(?=})",{token:"",next:"@pop"}]],nestedproperty:[["[*_]?@identifier@ws:","attribute.name","@rulevalue"],{include:"@comments"},["}",{token:"delimiter.curly",next:"@pop"}]],warndebug:[["[@](warn|debug)",{token:"keyword",next:"@declarationbody"}]],import:[["[@](import)",{token:"keyword",next:"@declarationbody"}]],variabledeclaration:[["\\$@identifier@ws:","variable.decl","@declarationbody"]],urldeclaration:[{include:"@strings"},["[^)\r\n]+","string"],["\\)",{token:"meta",next:"@pop"}]],parenthizedterm:[{include:"@term"},["\\)",{token:"delimiter.parenthesis",next:"@pop"}]],declarationbody:[{include:"@term"},[";","delimiter","@pop"],["(?=})",{token:"",next:"@pop"}]],extendbody:[{include:"@selectorname"},["!optional","literal"],[";","delimiter","@pop"],["(?=})",{token:"",next:"@pop"}]],variablereference:[["\\$@identifier","variable.ref"],["\\.\\.\\.","operator"],["#{",{token:"meta",next:"@variableinterpolation"}]],variableinterpolation:[{include:"@variablereference"},["}",{token:"meta",next:"@pop"}]],comments:[["\\/\\*","comment","@comment"],["\\/\\/+.*","comment"]],comment:[["\\*\\/","comment","@pop"],[".","comment"]],name:[["@identifier","attribute.value"]],numbers:[["(\\d*\\.)?\\d+([eE][\\-+]?\\d+)?",{token:"number",next:"@units"}],["#[0-9a-fA-F_]+(?!\\w)","number.hex"]],units:[["(em|ex|ch|rem|vmin|vmax|vw|vh|vm|cm|mm|in|px|pt|pc|deg|grad|rad|turn|s|ms|Hz|kHz|%)?","number","@pop"]],functiondeclaration:[["@identifier@ws\\(",{token:"meta",next:"@parameterdeclaration"}],["{",{token:"delimiter.curly",switchTo:"@functionbody"}]],mixindeclaration:[["@identifier@ws\\(",{token:"meta",next:"@parameterdeclaration"}],["@identifier","meta"],["{",{token:"delimiter.curly",switchTo:"@selectorbody"}]],parameterdeclaration:[["\\$@identifier@ws:","variable.decl"],["\\.\\.\\.","operator"],[",","delimiter"],{include:"@term"},["\\)",{token:"meta",next:"@pop"}]],includedeclaration:[{include:"@functioninvocation"},["@identifier","meta"],[";","delimiter","@pop"],["(?=})",{token:"",next:"@pop"}],["{",{token:"delimiter.curly",switchTo:"@selectorbody"}]],keyframedeclaration:[["@identifier","meta"],["{",{token:"delimiter.curly",switchTo:"@keyframebody"}]],keyframebody:[{include:"@term"},["{",{token:"delimiter.curly",next:"@selectorbody"}],["}",{token:"delimiter.curly",next:"@pop"}]],controlstatement:[["[@](if|else|for|while|each|media)",{token:"keyword.flow",next:"@controlstatementdeclaration"}]],controlstatementdeclaration:[["(in|from|through|if|to)\\b",{token:"keyword.flow"}],{include:"@term"},["{",{token:"delimiter.curly",switchTo:"@selectorbody"}]],functionbody:[["[@](return)",{token:"keyword"}],{include:"@variabledeclaration"},{include:"@term"},{include:"@controlstatement"},[";","delimiter"],["}",{token:"delimiter.curly",next:"@pop"}]],functioninvocation:[["@identifier\\(",{token:"meta",next:"@functionarguments"}]],functionarguments:[["\\$@identifier@ws:","attribute.name"],["[,]","delimiter"],{include:"@term"},["\\)",{token:"meta",next:"@pop"}]],strings:[['~?"',{token:"string.delimiter",next:"@stringenddoublequote"}],["~?'",{token:"string.delimiter",next:"@stringendquote"}]],stringenddoublequote:[["\\\\.","string"],['"',{token:"string.delimiter",next:"@pop"}],[".","string"]],stringendquote:[["\\\\.","string"],["'",{token:"string.delimiter",next:"@pop"}],[".","string"]]}}}); \ No newline at end of file diff --git a/pigx-register/src/main/resources/static/console-ui/public/js/vs/basic-languages/src/solidity.js b/pigx-register/src/main/resources/static/console-ui/public/js/vs/basic-languages/src/solidity.js new file mode 100644 index 0000000..a075d79 --- /dev/null +++ b/pigx-register/src/main/resources/static/console-ui/public/js/vs/basic-languages/src/solidity.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 0.9.0(e162b4ba29044167bc7181c42b3270fa8a467424) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/src/solidity",["require","exports"],function(x,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.conf={comments:{lineComment:"//",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"],["<",">"]],autoClosingPairs:[{open:'"',close:'"',notIn:["string","comment"]},{open:"{",close:"}",notIn:["string","comment"]},{open:"[",close:"]",notIn:["string","comment"]},{open:"(",close:")",notIn:["string","comment"]}]},e.language={defaultToken:"",tokenPostfix:".sol",brackets:[{token:"delimiter.curly",open:"{",close:"}"},{token:"delimiter.parenthesis",open:"(",close:")"},{token:"delimiter.square",open:"[",close:"]"},{token:"delimiter.angle",open:"<",close:">"}],keywords:["pragma","solidity","contract","library","using","struct","function","modifier","address","string","bool","Int","Uint","Byte","Fixed","Ufixed","int","int8","int16","int24","int32","int40","int48","int56","int64","int72","int80","int88","int96","int104","int112","int120","int128","int136","int144","int152","int160","int168","int176","int184","int192","int200","int208","int216","int224","int232","int240","int248","int256","uint","uint8","uint16","uint24","uint32","uint40","uint48","uint56","uint64","uint72","uint80","uint88","uint96","uint104","uint112","uint120","uint128","uint136","uint144","uint152","uint160","uint168","uint176","uint184","uint192","uint200","uint208","uint216","uint224","uint232","uint240","uint248","uint256","byte","bytes","bytes1","bytes2","bytes3","bytes4","bytes5","bytes6","bytes7","bytes8","bytes9","bytes10","bytes11","bytes12","bytes13","bytes14","bytes15","bytes16","bytes17","bytes18","bytes19","bytes20","bytes21","bytes22","bytes23","bytes24","bytes25","bytes26","bytes27","bytes28","bytes29","bytes30","bytes31","bytes32","fixed","fixed0x8","fixed0x16","fixed0x24","fixed0x32","fixed0x40","fixed0x48","fixed0x56","fixed0x64","fixed0x72","fixed0x80","fixed0x88","fixed0x96","fixed0x104","fixed0x112","fixed0x120","fixed0x128","fixed0x136","fixed0x144","fixed0x152","fixed0x160","fixed0x168","fixed0x176","fixed0x184","fixed0x192","fixed0x200","fixed0x208","fixed0x216","fixed0x224","fixed0x232","fixed0x240","fixed0x248","fixed0x256","fixed8x8","fixed8x16","fixed8x24","fixed8x32","fixed8x40","fixed8x48","fixed8x56","fixed8x64","fixed8x72","fixed8x80","fixed8x88","fixed8x96","fixed8x104","fixed8x112","fixed8x120","fixed8x128","fixed8x136","fixed8x144","fixed8x152","fixed8x160","fixed8x168","fixed8x176","fixed8x184","fixed8x192","fixed8x200","fixed8x208","fixed8x216","fixed8x224","fixed8x232","fixed8x240","fixed8x248","fixed16x8","fixed16x16","fixed16x24","fixed16x32","fixed16x40","fixed16x48","fixed16x56","fixed16x64","fixed16x72","fixed16x80","fixed16x88","fixed16x96","fixed16x104","fixed16x112","fixed16x120","fixed16x128","fixed16x136","fixed16x144","fixed16x152","fixed16x160","fixed16x168","fixed16x176","fixed16x184","fixed16x192","fixed16x200","fixed16x208","fixed16x216","fixed16x224","fixed16x232","fixed16x240","fixed24x8","fixed24x16","fixed24x24","fixed24x32","fixed24x40","fixed24x48","fixed24x56","fixed24x64","fixed24x72","fixed24x80","fixed24x88","fixed24x96","fixed24x104","fixed24x112","fixed24x120","fixed24x128","fixed24x136","fixed24x144","fixed24x152","fixed24x160","fixed24x168","fixed24x176","fixed24x184","fixed24x192","fixed24x200","fixed24x208","fixed24x216","fixed24x224","fixed24x232","fixed32x8","fixed32x16","fixed32x24","fixed32x32","fixed32x40","fixed32x48","fixed32x56","fixed32x64","fixed32x72","fixed32x80","fixed32x88","fixed32x96","fixed32x104","fixed32x112","fixed32x120","fixed32x128","fixed32x136","fixed32x144","fixed32x152","fixed32x160","fixed32x168","fixed32x176","fixed32x184","fixed32x192","fixed32x200","fixed32x208","fixed32x216","fixed32x224","fixed40x8","fixed40x16","fixed40x24","fixed40x32","fixed40x40","fixed40x48","fixed40x56","fixed40x64","fixed40x72","fixed40x80","fixed40x88","fixed40x96","fixed40x104","fixed40x112","fixed40x120","fixed40x128","fixed40x136","fixed40x144","fixed40x152","fixed40x160","fixed40x168","fixed40x176","fixed40x184","fixed40x192","fixed40x200","fixed40x208","fixed40x216","fixed48x8","fixed48x16","fixed48x24","fixed48x32","fixed48x40","fixed48x48","fixed48x56","fixed48x64","fixed48x72","fixed48x80","fixed48x88","fixed48x96","fixed48x104","fixed48x112","fixed48x120","fixed48x128","fixed48x136","fixed48x144","fixed48x152","fixed48x160","fixed48x168","fixed48x176","fixed48x184","fixed48x192","fixed48x200","fixed48x208","fixed56x8","fixed56x16","fixed56x24","fixed56x32","fixed56x40","fixed56x48","fixed56x56","fixed56x64","fixed56x72","fixed56x80","fixed56x88","fixed56x96","fixed56x104","fixed56x112","fixed56x120","fixed56x128","fixed56x136","fixed56x144","fixed56x152","fixed56x160","fixed56x168","fixed56x176","fixed56x184","fixed56x192","fixed56x200","fixed64x8","fixed64x16","fixed64x24","fixed64x32","fixed64x40","fixed64x48","fixed64x56","fixed64x64","fixed64x72","fixed64x80","fixed64x88","fixed64x96","fixed64x104","fixed64x112","fixed64x120","fixed64x128","fixed64x136","fixed64x144","fixed64x152","fixed64x160","fixed64x168","fixed64x176","fixed64x184","fixed64x192","fixed72x8","fixed72x16","fixed72x24","fixed72x32","fixed72x40","fixed72x48","fixed72x56","fixed72x64","fixed72x72","fixed72x80","fixed72x88","fixed72x96","fixed72x104","fixed72x112","fixed72x120","fixed72x128","fixed72x136","fixed72x144","fixed72x152","fixed72x160","fixed72x168","fixed72x176","fixed72x184","fixed80x8","fixed80x16","fixed80x24","fixed80x32","fixed80x40","fixed80x48","fixed80x56","fixed80x64","fixed80x72","fixed80x80","fixed80x88","fixed80x96","fixed80x104","fixed80x112","fixed80x120","fixed80x128","fixed80x136","fixed80x144","fixed80x152","fixed80x160","fixed80x168","fixed80x176","fixed88x8","fixed88x16","fixed88x24","fixed88x32","fixed88x40","fixed88x48","fixed88x56","fixed88x64","fixed88x72","fixed88x80","fixed88x88","fixed88x96","fixed88x104","fixed88x112","fixed88x120","fixed88x128","fixed88x136","fixed88x144","fixed88x152","fixed88x160","fixed88x168","fixed96x8","fixed96x16","fixed96x24","fixed96x32","fixed96x40","fixed96x48","fixed96x56","fixed96x64","fixed96x72","fixed96x80","fixed96x88","fixed96x96","fixed96x104","fixed96x112","fixed96x120","fixed96x128","fixed96x136","fixed96x144","fixed96x152","fixed96x160","fixed104x8","fixed104x16","fixed104x24","fixed104x32","fixed104x40","fixed104x48","fixed104x56","fixed104x64","fixed104x72","fixed104x80","fixed104x88","fixed104x96","fixed104x104","fixed104x112","fixed104x120","fixed104x128","fixed104x136","fixed104x144","fixed104x152","fixed112x8","fixed112x16","fixed112x24","fixed112x32","fixed112x40","fixed112x48","fixed112x56","fixed112x64","fixed112x72","fixed112x80","fixed112x88","fixed112x96","fixed112x104","fixed112x112","fixed112x120","fixed112x128","fixed112x136","fixed112x144","fixed120x8","fixed120x16","fixed120x24","fixed120x32","fixed120x40","fixed120x48","fixed120x56","fixed120x64","fixed120x72","fixed120x80","fixed120x88","fixed120x96","fixed120x104","fixed120x112","fixed120x120","fixed120x128","fixed120x136","fixed128x8","fixed128x16","fixed128x24","fixed128x32","fixed128x40","fixed128x48","fixed128x56","fixed128x64","fixed128x72","fixed128x80","fixed128x88","fixed128x96","fixed128x104","fixed128x112","fixed128x120","fixed128x128","fixed136x8","fixed136x16","fixed136x24","fixed136x32","fixed136x40","fixed136x48","fixed136x56","fixed136x64","fixed136x72","fixed136x80","fixed136x88","fixed136x96","fixed136x104","fixed136x112","fixed136x120","fixed144x8","fixed144x16","fixed144x24","fixed144x32","fixed144x40","fixed144x48","fixed144x56","fixed144x64","fixed144x72","fixed144x80","fixed144x88","fixed144x96","fixed144x104","fixed144x112","fixed152x8","fixed152x16","fixed152x24","fixed152x32","fixed152x40","fixed152x48","fixed152x56","fixed152x64","fixed152x72","fixed152x80","fixed152x88","fixed152x96","fixed152x104","fixed160x8","fixed160x16","fixed160x24","fixed160x32","fixed160x40","fixed160x48","fixed160x56","fixed160x64","fixed160x72","fixed160x80","fixed160x88","fixed160x96","fixed168x8","fixed168x16","fixed168x24","fixed168x32","fixed168x40","fixed168x48","fixed168x56","fixed168x64","fixed168x72","fixed168x80","fixed168x88","fixed176x8","fixed176x16","fixed176x24","fixed176x32","fixed176x40","fixed176x48","fixed176x56","fixed176x64","fixed176x72","fixed176x80","fixed184x8","fixed184x16","fixed184x24","fixed184x32","fixed184x40","fixed184x48","fixed184x56","fixed184x64","fixed184x72","fixed192x8","fixed192x16","fixed192x24","fixed192x32","fixed192x40","fixed192x48","fixed192x56","fixed192x64","fixed200x8","fixed200x16","fixed200x24","fixed200x32","fixed200x40","fixed200x48","fixed200x56","fixed208x8","fixed208x16","fixed208x24","fixed208x32","fixed208x40","fixed208x48","fixed216x8","fixed216x16","fixed216x24","fixed216x32","fixed216x40","fixed224x8","fixed224x16","fixed224x24","fixed224x32","fixed232x8","fixed232x16","fixed232x24","fixed240x8","fixed240x16","fixed248x8","ufixed","ufixed0x8","ufixed0x16","ufixed0x24","ufixed0x32","ufixed0x40","ufixed0x48","ufixed0x56","ufixed0x64","ufixed0x72","ufixed0x80","ufixed0x88","ufixed0x96","ufixed0x104","ufixed0x112","ufixed0x120","ufixed0x128","ufixed0x136","ufixed0x144","ufixed0x152","ufixed0x160","ufixed0x168","ufixed0x176","ufixed0x184","ufixed0x192","ufixed0x200","ufixed0x208","ufixed0x216","ufixed0x224","ufixed0x232","ufixed0x240","ufixed0x248","ufixed0x256","ufixed8x8","ufixed8x16","ufixed8x24","ufixed8x32","ufixed8x40","ufixed8x48","ufixed8x56","ufixed8x64","ufixed8x72","ufixed8x80","ufixed8x88","ufixed8x96","ufixed8x104","ufixed8x112","ufixed8x120","ufixed8x128","ufixed8x136","ufixed8x144","ufixed8x152","ufixed8x160","ufixed8x168","ufixed8x176","ufixed8x184","ufixed8x192","ufixed8x200","ufixed8x208","ufixed8x216","ufixed8x224","ufixed8x232","ufixed8x240","ufixed8x248","ufixed16x8","ufixed16x16","ufixed16x24","ufixed16x32","ufixed16x40","ufixed16x48","ufixed16x56","ufixed16x64","ufixed16x72","ufixed16x80","ufixed16x88","ufixed16x96","ufixed16x104","ufixed16x112","ufixed16x120","ufixed16x128","ufixed16x136","ufixed16x144","ufixed16x152","ufixed16x160","ufixed16x168","ufixed16x176","ufixed16x184","ufixed16x192","ufixed16x200","ufixed16x208","ufixed16x216","ufixed16x224","ufixed16x232","ufixed16x240","ufixed24x8","ufixed24x16","ufixed24x24","ufixed24x32","ufixed24x40","ufixed24x48","ufixed24x56","ufixed24x64","ufixed24x72","ufixed24x80","ufixed24x88","ufixed24x96","ufixed24x104","ufixed24x112","ufixed24x120","ufixed24x128","ufixed24x136","ufixed24x144","ufixed24x152","ufixed24x160","ufixed24x168","ufixed24x176","ufixed24x184","ufixed24x192","ufixed24x200","ufixed24x208","ufixed24x216","ufixed24x224","ufixed24x232","ufixed32x8","ufixed32x16","ufixed32x24","ufixed32x32","ufixed32x40","ufixed32x48","ufixed32x56","ufixed32x64","ufixed32x72","ufixed32x80","ufixed32x88","ufixed32x96","ufixed32x104","ufixed32x112","ufixed32x120","ufixed32x128","ufixed32x136","ufixed32x144","ufixed32x152","ufixed32x160","ufixed32x168","ufixed32x176","ufixed32x184","ufixed32x192","ufixed32x200","ufixed32x208","ufixed32x216","ufixed32x224","ufixed40x8","ufixed40x16","ufixed40x24","ufixed40x32","ufixed40x40","ufixed40x48","ufixed40x56","ufixed40x64","ufixed40x72","ufixed40x80","ufixed40x88","ufixed40x96","ufixed40x104","ufixed40x112","ufixed40x120","ufixed40x128","ufixed40x136","ufixed40x144","ufixed40x152","ufixed40x160","ufixed40x168","ufixed40x176","ufixed40x184","ufixed40x192","ufixed40x200","ufixed40x208","ufixed40x216","ufixed48x8","ufixed48x16","ufixed48x24","ufixed48x32","ufixed48x40","ufixed48x48","ufixed48x56","ufixed48x64","ufixed48x72","ufixed48x80","ufixed48x88","ufixed48x96","ufixed48x104","ufixed48x112","ufixed48x120","ufixed48x128","ufixed48x136","ufixed48x144","ufixed48x152","ufixed48x160","ufixed48x168","ufixed48x176","ufixed48x184","ufixed48x192","ufixed48x200","ufixed48x208","ufixed56x8","ufixed56x16","ufixed56x24","ufixed56x32","ufixed56x40","ufixed56x48","ufixed56x56","ufixed56x64","ufixed56x72","ufixed56x80","ufixed56x88","ufixed56x96","ufixed56x104","ufixed56x112","ufixed56x120","ufixed56x128","ufixed56x136","ufixed56x144","ufixed56x152","ufixed56x160","ufixed56x168","ufixed56x176","ufixed56x184","ufixed56x192","ufixed56x200","ufixed64x8","ufixed64x16","ufixed64x24","ufixed64x32","ufixed64x40","ufixed64x48","ufixed64x56","ufixed64x64","ufixed64x72","ufixed64x80","ufixed64x88","ufixed64x96","ufixed64x104","ufixed64x112","ufixed64x120","ufixed64x128","ufixed64x136","ufixed64x144","ufixed64x152","ufixed64x160","ufixed64x168","ufixed64x176","ufixed64x184","ufixed64x192","ufixed72x8","ufixed72x16","ufixed72x24","ufixed72x32","ufixed72x40","ufixed72x48","ufixed72x56","ufixed72x64","ufixed72x72","ufixed72x80","ufixed72x88","ufixed72x96","ufixed72x104","ufixed72x112","ufixed72x120","ufixed72x128","ufixed72x136","ufixed72x144","ufixed72x152","ufixed72x160","ufixed72x168","ufixed72x176","ufixed72x184","ufixed80x8","ufixed80x16","ufixed80x24","ufixed80x32","ufixed80x40","ufixed80x48","ufixed80x56","ufixed80x64","ufixed80x72","ufixed80x80","ufixed80x88","ufixed80x96","ufixed80x104","ufixed80x112","ufixed80x120","ufixed80x128","ufixed80x136","ufixed80x144","ufixed80x152","ufixed80x160","ufixed80x168","ufixed80x176","ufixed88x8","ufixed88x16","ufixed88x24","ufixed88x32","ufixed88x40","ufixed88x48","ufixed88x56","ufixed88x64","ufixed88x72","ufixed88x80","ufixed88x88","ufixed88x96","ufixed88x104","ufixed88x112","ufixed88x120","ufixed88x128","ufixed88x136","ufixed88x144","ufixed88x152","ufixed88x160","ufixed88x168","ufixed96x8","ufixed96x16","ufixed96x24","ufixed96x32","ufixed96x40","ufixed96x48","ufixed96x56","ufixed96x64","ufixed96x72","ufixed96x80","ufixed96x88","ufixed96x96","ufixed96x104","ufixed96x112","ufixed96x120","ufixed96x128","ufixed96x136","ufixed96x144","ufixed96x152","ufixed96x160","ufixed104x8","ufixed104x16","ufixed104x24","ufixed104x32","ufixed104x40","ufixed104x48","ufixed104x56","ufixed104x64","ufixed104x72","ufixed104x80","ufixed104x88","ufixed104x96","ufixed104x104","ufixed104x112","ufixed104x120","ufixed104x128","ufixed104x136","ufixed104x144","ufixed104x152","ufixed112x8","ufixed112x16","ufixed112x24","ufixed112x32","ufixed112x40","ufixed112x48","ufixed112x56","ufixed112x64","ufixed112x72","ufixed112x80","ufixed112x88","ufixed112x96","ufixed112x104","ufixed112x112","ufixed112x120","ufixed112x128","ufixed112x136","ufixed112x144","ufixed120x8","ufixed120x16","ufixed120x24","ufixed120x32","ufixed120x40","ufixed120x48","ufixed120x56","ufixed120x64","ufixed120x72","ufixed120x80","ufixed120x88","ufixed120x96","ufixed120x104","ufixed120x112","ufixed120x120","ufixed120x128","ufixed120x136","ufixed128x8","ufixed128x16","ufixed128x24","ufixed128x32","ufixed128x40","ufixed128x48","ufixed128x56","ufixed128x64","ufixed128x72","ufixed128x80","ufixed128x88","ufixed128x96","ufixed128x104","ufixed128x112","ufixed128x120","ufixed128x128","ufixed136x8","ufixed136x16","ufixed136x24","ufixed136x32","ufixed136x40","ufixed136x48","ufixed136x56","ufixed136x64","ufixed136x72","ufixed136x80","ufixed136x88","ufixed136x96","ufixed136x104","ufixed136x112","ufixed136x120","ufixed144x8","ufixed144x16","ufixed144x24","ufixed144x32","ufixed144x40","ufixed144x48","ufixed144x56","ufixed144x64","ufixed144x72","ufixed144x80","ufixed144x88","ufixed144x96","ufixed144x104","ufixed144x112","ufixed152x8","ufixed152x16","ufixed152x24","ufixed152x32","ufixed152x40","ufixed152x48","ufixed152x56","ufixed152x64","ufixed152x72","ufixed152x80","ufixed152x88","ufixed152x96","ufixed152x104","ufixed160x8","ufixed160x16","ufixed160x24","ufixed160x32","ufixed160x40","ufixed160x48","ufixed160x56","ufixed160x64","ufixed160x72","ufixed160x80","ufixed160x88","ufixed160x96","ufixed168x8","ufixed168x16","ufixed168x24","ufixed168x32","ufixed168x40","ufixed168x48","ufixed168x56","ufixed168x64","ufixed168x72","ufixed168x80","ufixed168x88","ufixed176x8","ufixed176x16","ufixed176x24","ufixed176x32","ufixed176x40","ufixed176x48","ufixed176x56","ufixed176x64","ufixed176x72","ufixed176x80","ufixed184x8","ufixed184x16","ufixed184x24","ufixed184x32","ufixed184x40","ufixed184x48","ufixed184x56","ufixed184x64","ufixed184x72","ufixed192x8","ufixed192x16","ufixed192x24","ufixed192x32","ufixed192x40","ufixed192x48","ufixed192x56","ufixed192x64","ufixed200x8","ufixed200x16","ufixed200x24","ufixed200x32","ufixed200x40","ufixed200x48","ufixed200x56","ufixed208x8","ufixed208x16","ufixed208x24","ufixed208x32","ufixed208x40","ufixed208x48","ufixed216x8","ufixed216x16","ufixed216x24","ufixed216x32","ufixed216x40","ufixed224x8","ufixed224x16","ufixed224x24","ufixed224x32","ufixed232x8","ufixed232x16","ufixed232x24","ufixed240x8","ufixed240x16","ufixed248x8","event","enum","let","mapping","private","public","external","inherited","payable","true","false","var","import","constant","if","else","for","else","for","while","do","break","continue","throw","returns","return","suicide","new","is","this","super"],operators:["=",">","<","!","~","?",":","==","<=",">=","!=","&&","||","++","--","+","-","*","/","&","|","^","%","<<",">>",">>>","+=","-=","*=","/=","&=","|=","^=","%=","<<=",">>=",">>>="],symbols:/[=>](?!@symbols)/,"@brackets"],[/@symbols/,{cases:{"@operators":"delimiter","@default":""}}],[/\d*\d+[eE]([\-+]?\d+)?(@floatsuffix)/,"number.float"],[/\d*\.\d+([eE][\-+]?\d+)?(@floatsuffix)/,"number.float"],[/0[xX][0-9a-fA-F']*[0-9a-fA-F](@integersuffix)/,"number.hex"],[/0[0-7']*[0-7](@integersuffix)/,"number.octal"],[/0[bB][0-1']*[0-1](@integersuffix)/,"number.binary"],[/\d[\d']*\d(@integersuffix)/,"number"],[/\d(@integersuffix)/,"number"],[/[;,.]/,"delimiter"],[/"([^"\\]|\\.)*$/,"string.invalid"],[/"/,"string","@string"],[/'[^\\']'/,"string"],[/(')(@escapes)(')/,["string","string.escape","string"]],[/'/,"string.invalid"]],whitespace:[[/[ \t\r\n]+/,""],[/\/\*\*(?!\/)/,"comment.doc","@doccomment"],[/\/\*/,"comment","@comment"],[/\/\/.*$/,"comment"]],comment:[[/[^\/*]+/,"comment"],[/\*\//,"comment","@pop"],[/[\/*]/,"comment"]],doccomment:[[/[^\/*]+/,"comment.doc"],[/\*\//,"comment.doc","@pop"],[/[\/*]/,"comment.doc"]],string:[[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"/,"string","@pop"]]}}}); \ No newline at end of file diff --git a/pigx-register/src/main/resources/static/console-ui/public/js/vs/basic-languages/src/sql.js b/pigx-register/src/main/resources/static/console-ui/public/js/vs/basic-languages/src/sql.js new file mode 100644 index 0000000..d6fe239 --- /dev/null +++ b/pigx-register/src/main/resources/static/console-ui/public/js/vs/basic-languages/src/sql.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 0.9.0(e162b4ba29044167bc7181c42b3270fa8a467424) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/src/sql",["require","exports"],function(E,T){"use strict";Object.defineProperty(T,"__esModule",{value:!0}),T.conf={comments:{lineComment:"--",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}]},T.language={defaultToken:"",tokenPostfix:".sql",ignoreCase:!0,brackets:[{open:"[",close:"]",token:"delimiter.square"},{open:"(",close:")",token:"delimiter.parenthesis"}],keywords:["ABORT_AFTER_WAIT","ABSENT","ABSOLUTE","ACCENT_SENSITIVITY","ACTION","ACTIVATION","ACTIVE","ADD","ADDRESS","ADMIN","AES","AES_128","AES_192","AES_256","AFFINITY","AFTER","AGGREGATE","ALGORITHM","ALL_CONSTRAINTS","ALL_ERRORMSGS","ALL_INDEXES","ALL_LEVELS","ALL_SPARSE_COLUMNS","ALLOW_CONNECTIONS","ALLOW_MULTIPLE_EVENT_LOSS","ALLOW_PAGE_LOCKS","ALLOW_ROW_LOCKS","ALLOW_SINGLE_EVENT_LOSS","ALLOW_SNAPSHOT_ISOLATION","ALLOWED","ALTER","ANONYMOUS","ANSI_DEFAULTS","ANSI_NULL_DEFAULT","ANSI_NULL_DFLT_OFF","ANSI_NULL_DFLT_ON","ANSI_NULLS","ANSI_PADDING","ANSI_WARNINGS","APPEND","APPLICATION","APPLICATION_LOG","ARITHABORT","ARITHIGNORE","AS","ASC","ASSEMBLY","ASYMMETRIC","ASYNCHRONOUS_COMMIT","AT","ATOMIC","ATTACH","ATTACH_REBUILD_LOG","AUDIT","AUDIT_GUID","AUTHENTICATION","AUTHORIZATION","AUTO","AUTO_CLEANUP","AUTO_CLOSE","AUTO_CREATE_STATISTICS","AUTO_SHRINK","AUTO_UPDATE_STATISTICS","AUTO_UPDATE_STATISTICS_ASYNC","AUTOMATED_BACKUP_PREFERENCE","AUTOMATIC","AVAILABILITY","AVAILABILITY_MODE","BACKUP","BACKUP_PRIORITY","BASE64","BATCHSIZE","BEGIN","BEGIN_DIALOG","BIGINT","BINARY","BINDING","BIT","BLOCKERS","BLOCKSIZE","BOUNDING_BOX","BREAK","BROKER","BROKER_INSTANCE","BROWSE","BUCKET_COUNT","BUFFER","BUFFERCOUNT","BULK","BULK_LOGGED","BY","CACHE","CALL","CALLED","CALLER","CAP_CPU_PERCENT","CASCADE","CASE","CATALOG","CATCH","CELLS_PER_OBJECT","CERTIFICATE","CHANGE_RETENTION","CHANGE_TRACKING","CHANGES","CHAR","CHARACTER","CHECK","CHECK_CONSTRAINTS","CHECK_EXPIRATION","CHECK_POLICY","CHECKALLOC","CHECKCATALOG","CHECKCONSTRAINTS","CHECKDB","CHECKFILEGROUP","CHECKIDENT","CHECKPOINT","CHECKTABLE","CLASSIFIER_FUNCTION","CLEANTABLE","CLEANUP","CLEAR","CLOSE","CLUSTER","CLUSTERED","CODEPAGE","COLLATE","COLLECTION","COLUMN","COLUMN_SET","COLUMNS","COLUMNSTORE","COLUMNSTORE_ARCHIVE","COMMIT","COMMITTED","COMPATIBILITY_LEVEL","COMPRESSION","COMPUTE","CONCAT","CONCAT_NULL_YIELDS_NULL","CONFIGURATION","CONNECT","CONSTRAINT","CONTAINMENT","CONTENT","CONTEXT","CONTINUE","CONTINUE_AFTER_ERROR","CONTRACT","CONTRACT_NAME","CONTROL","CONVERSATION","COOKIE","COPY_ONLY","COUNTER","CPU","CREATE","CREATE_NEW","CREATION_DISPOSITION","CREDENTIAL","CRYPTOGRAPHIC","CUBE","CURRENT","CURRENT_DATE","CURSOR","CURSOR_CLOSE_ON_COMMIT","CURSOR_DEFAULT","CYCLE","DATA","DATA_COMPRESSION","DATA_PURITY","DATABASE","DATABASE_DEFAULT","DATABASE_MIRRORING","DATABASE_SNAPSHOT","DATAFILETYPE","DATE","DATE_CORRELATION_OPTIMIZATION","DATEFIRST","DATEFORMAT","DATETIME","DATETIME2","DATETIMEOFFSET","DAY","DAYOFYEAR","DAYS","DB_CHAINING","DBCC","DBREINDEX","DDL_DATABASE_LEVEL_EVENTS","DEADLOCK_PRIORITY","DEALLOCATE","DEC","DECIMAL","DECLARE","DECRYPTION","DEFAULT","DEFAULT_DATABASE","DEFAULT_FULLTEXT_LANGUAGE","DEFAULT_LANGUAGE","DEFAULT_SCHEMA","DEFINITION","DELAY","DELAYED_DURABILITY","DELETE","DELETED","DENSITY_VECTOR","DENY","DEPENDENTS","DES","DESC","DESCRIPTION","DESX","DHCP","DIAGNOSTICS","DIALOG","DIFFERENTIAL","DIRECTORY_NAME","DISABLE","DISABLE_BROKER","DISABLED","DISK","DISTINCT","DISTRIBUTED","DOCUMENT","DOUBLE","DROP","DROP_EXISTING","DROPCLEANBUFFERS","DUMP","DURABILITY","DYNAMIC","EDITION","ELEMENTS","ELSE","EMERGENCY","EMPTY","EMPTYFILE","ENABLE","ENABLE_BROKER","ENABLED","ENCRYPTION","END","ENDPOINT","ENDPOINT_URL","ERRLVL","ERROR","ERROR_BROKER_CONVERSATIONS","ERRORFILE","ESCAPE","ESTIMATEONLY","EVENT","EVENT_RETENTION_MODE","EXEC","EXECUTABLE","EXECUTE","EXIT","EXPAND","EXPIREDATE","EXPIRY_DATE","EXPLICIT","EXTENDED_LOGICAL_CHECKS","EXTENSION","EXTERNAL","EXTERNAL_ACCESS","FAIL_OPERATION","FAILOVER","FAILOVER_MODE","FAILURE_CONDITION_LEVEL","FALSE","FAN_IN","FAST","FAST_FORWARD","FETCH","FIELDTERMINATOR","FILE","FILEGROUP","FILEGROWTH","FILELISTONLY","FILENAME","FILEPATH","FILESTREAM","FILESTREAM_ON","FILETABLE_COLLATE_FILENAME","FILETABLE_DIRECTORY","FILETABLE_FULLPATH_UNIQUE_CONSTRAINT_NAME","FILETABLE_NAMESPACE","FILETABLE_PRIMARY_KEY_CONSTRAINT_NAME","FILETABLE_STREAMID_UNIQUE_CONSTRAINT_NAME","FILLFACTOR","FILTERING","FIRE_TRIGGERS","FIRST","FIRSTROW","FLOAT","FMTONLY","FOLLOWING","FOR","FORCE","FORCE_FAILOVER_ALLOW_DATA_LOSS","FORCE_SERVICE_ALLOW_DATA_LOSS","FORCED","FORCEPLAN","FORCESCAN","FORCESEEK","FOREIGN","FORMATFILE","FORMSOF","FORWARD_ONLY","FREE","FREEPROCCACHE","FREESESSIONCACHE","FREESYSTEMCACHE","FROM","FULL","FULLSCAN","FULLTEXT","FUNCTION","GB","GEOGRAPHY_AUTO_GRID","GEOGRAPHY_GRID","GEOMETRY_AUTO_GRID","GEOMETRY_GRID","GET","GLOBAL","GO","GOTO","GOVERNOR","GRANT","GRIDS","GROUP","GROUP_MAX_REQUESTS","HADR","HASH","HASHED","HAVING","HEADERONLY","HEALTH_CHECK_TIMEOUT","HELP","HIERARCHYID","HIGH","HINT","HISTOGRAM","HOLDLOCK","HONOR_BROKER_PRIORITY","HOUR","HOURS","IDENTITY","IDENTITY_INSERT","IDENTITY_VALUE","IDENTITYCOL","IF","IGNORE_CONSTRAINTS","IGNORE_DUP_KEY","IGNORE_NONCLUSTERED_COLUMNSTORE_INDEX","IGNORE_TRIGGERS","IMAGE","IMMEDIATE","IMPERSONATE","IMPLICIT_TRANSACTIONS","IMPORTANCE","INCLUDE","INCREMENT","INCREMENTAL","INDEX","INDEXDEFRAG","INFINITE","INFLECTIONAL","INIT","INITIATOR","INPUT","INPUTBUFFER","INSENSITIVE","INSERT","INSERTED","INSTEAD","INT","INTEGER","INTO","IO","IP","ISABOUT","ISOLATION","JOB","KB","KEEP","KEEP_CDC","KEEP_NULLS","KEEP_REPLICATION","KEEPDEFAULTS","KEEPFIXED","KEEPIDENTITY","KEEPNULLS","KERBEROS","KEY","KEY_SOURCE","KEYS","KEYSET","KILL","KILOBYTES_PER_BATCH","LABELONLY","LANGUAGE","LAST","LASTROW","LEVEL","LEVEL_1","LEVEL_2","LEVEL_3","LEVEL_4","LIFETIME","LIMIT","LINENO","LIST","LISTENER","LISTENER_IP","LISTENER_PORT","LOAD","LOADHISTORY","LOB_COMPACTION","LOCAL","LOCAL_SERVICE_NAME","LOCK_ESCALATION","LOCK_TIMEOUT","LOGIN","LOGSPACE","LOOP","LOW","MANUAL","MARK","MARK_IN_USE_FOR_REMOVAL","MASTER","MAX_CPU_PERCENT","MAX_DISPATCH_LATENCY","MAX_DOP","MAX_DURATION","MAX_EVENT_SIZE","MAX_FILES","MAX_IOPS_PER_VOLUME","MAX_MEMORY","MAX_MEMORY_PERCENT","MAX_QUEUE_READERS","MAX_ROLLOVER_FILES","MAX_SIZE","MAXDOP","MAXERRORS","MAXLENGTH","MAXRECURSION","MAXSIZE","MAXTRANSFERSIZE","MAXVALUE","MB","MEDIADESCRIPTION","MEDIANAME","MEDIAPASSWORD","MEDIUM","MEMBER","MEMORY_OPTIMIZED","MEMORY_OPTIMIZED_DATA","MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT","MEMORY_PARTITION_MODE","MERGE","MESSAGE","MESSAGE_FORWARD_SIZE","MESSAGE_FORWARDING","MICROSECOND","MILLISECOND","MIN_CPU_PERCENT","MIN_IOPS_PER_VOLUME","MIN_MEMORY_PERCENT","MINUTE","MINUTES","MINVALUE","MIRROR","MIRROR_ADDRESS","MODIFY","MONEY","MONTH","MOVE","MULTI_USER","MUST_CHANGE","NAME","NANOSECOND","NATIONAL","NATIVE_COMPILATION","NCHAR","NEGOTIATE","NESTED_TRIGGERS","NEW_ACCOUNT","NEW_BROKER","NEW_PASSWORD","NEWNAME","NEXT","NO","NO_BROWSETABLE","NO_CHECKSUM","NO_COMPRESSION","NO_EVENT_LOSS","NO_INFOMSGS","NO_TRUNCATE","NO_WAIT","NOCHECK","NOCOUNT","NOEXEC","NOEXPAND","NOFORMAT","NOINDEX","NOINIT","NOLOCK","NON","NON_TRANSACTED_ACCESS","NONCLUSTERED","NONE","NORECOMPUTE","NORECOVERY","NORESEED","NORESET","NOREWIND","NORMAL","NOSKIP","NOTIFICATION","NOTRUNCATE","NOUNLOAD","NOWAIT","NTEXT","NTLM","NUMANODE","NUMERIC","NUMERIC_ROUNDABORT","NVARCHAR","OBJECT","OF","OFF","OFFLINE","OFFSET","OFFSETS","OLD_ACCOUNT","OLD_PASSWORD","ON","ON_FAILURE","ONLINE","ONLY","OPEN","OPEN_EXISTING","OPENTRAN","OPTIMISTIC","OPTIMIZE","OPTION","ORDER","OUT","OUTPUT","OUTPUTBUFFER","OVER","OVERRIDE","OWNER","OWNERSHIP","PAD_INDEX","PAGE","PAGE_VERIFY","PAGECOUNT","PAGLOCK","PARAMETERIZATION","PARSEONLY","PARTIAL","PARTITION","PARTITIONS","PARTNER","PASSWORD","PATH","PER_CPU","PER_NODE","PERCENT","PERMISSION_SET","PERSISTED","PHYSICAL_ONLY","PLAN","POISON_MESSAGE_HANDLING","POOL","POPULATION","PORT","PRECEDING","PRECISION","PRIMARY","PRIMARY_ROLE","PRINT","PRIOR","PRIORITY","PRIORITY_LEVEL","PRIVATE","PRIVILEGES","PROC","PROCCACHE","PROCEDURE","PROCEDURE_NAME","PROCESS","PROFILE","PROPERTY","PROPERTY_DESCRIPTION","PROPERTY_INT_ID","PROPERTY_SET_GUID","PROVIDER","PROVIDER_KEY_NAME","PUBLIC","PUT","QUARTER","QUERY","QUERY_GOVERNOR_COST_LIMIT","QUEUE","QUEUE_DELAY","QUOTED_IDENTIFIER","RAISERROR","RANGE","RAW","RC2","RC4","RC4_128","READ","READ_COMMITTED_SNAPSHOT","READ_ONLY","READ_ONLY_ROUTING_LIST","READ_ONLY_ROUTING_URL","READ_WRITE","READ_WRITE_FILEGROUPS","READCOMMITTED","READCOMMITTEDLOCK","READONLY","READPAST","READTEXT","READUNCOMMITTED","READWRITE","REAL","REBUILD","RECEIVE","RECOMPILE","RECONFIGURE","RECOVERY","RECURSIVE","RECURSIVE_TRIGGERS","REFERENCES","REGENERATE","RELATED_CONVERSATION","RELATED_CONVERSATION_GROUP","RELATIVE","REMOTE","REMOTE_PROC_TRANSACTIONS","REMOTE_SERVICE_NAME","REMOVE","REORGANIZE","REPAIR_ALLOW_DATA_LOSS","REPAIR_FAST","REPAIR_REBUILD","REPEATABLE","REPEATABLEREAD","REPLICA","REPLICATION","REQUEST_MAX_CPU_TIME_SEC","REQUEST_MAX_MEMORY_GRANT_PERCENT","REQUEST_MEMORY_GRANT_TIMEOUT_SEC","REQUIRED","RESAMPLE","RESEED","RESERVE_DISK_SPACE","RESET","RESOURCE","RESTART","RESTORE","RESTRICT","RESTRICTED_USER","RESULT","RESUME","RETAINDAYS","RETENTION","RETURN","RETURNS","REVERT","REVOKE","REWIND","REWINDONLY","ROBUST","ROLE","ROLLBACK","ROLLUP","ROOT","ROUTE","ROW","ROWCOUNT","ROWGUIDCOL","ROWLOCK","ROWS","ROWS_PER_BATCH","ROWTERMINATOR","ROWVERSION","RSA_1024","RSA_2048","RSA_512","RULE","SAFE","SAFETY","SAMPLE","SAVE","SCHEDULER","SCHEMA","SCHEMA_AND_DATA","SCHEMA_ONLY","SCHEMABINDING","SCHEME","SCROLL","SCROLL_LOCKS","SEARCH","SECOND","SECONDARY","SECONDARY_ONLY","SECONDARY_ROLE","SECONDS","SECRET","SECURITY_LOG","SECURITYAUDIT","SELECT","SELECTIVE","SELF","SEND","SENT","SEQUENCE","SERIALIZABLE","SERVER","SERVICE","SERVICE_BROKER","SERVICE_NAME","SESSION","SESSION_TIMEOUT","SET","SETS","SETUSER","SHOW_STATISTICS","SHOWCONTIG","SHOWPLAN","SHOWPLAN_ALL","SHOWPLAN_TEXT","SHOWPLAN_XML","SHRINKDATABASE","SHRINKFILE","SHUTDOWN","SID","SIGNATURE","SIMPLE","SINGLE_BLOB","SINGLE_CLOB","SINGLE_NCLOB","SINGLE_USER","SINGLETON","SIZE","SKIP","SMALLDATETIME","SMALLINT","SMALLMONEY","SNAPSHOT","SORT_IN_TEMPDB","SOURCE","SPARSE","SPATIAL","SPATIAL_WINDOW_MAX_CELLS","SPECIFICATION","SPLIT","SQL","SQL_VARIANT","SQLPERF","STANDBY","START","START_DATE","STARTED","STARTUP_STATE","STAT_HEADER","STATE","STATEMENT","STATIC","STATISTICAL_SEMANTICS","STATISTICS","STATISTICS_INCREMENTAL","STATISTICS_NORECOMPUTE","STATS","STATS_STREAM","STATUS","STATUSONLY","STOP","STOP_ON_ERROR","STOPAT","STOPATMARK","STOPBEFOREMARK","STOPLIST","STOPPED","SUBJECT","SUBSCRIPTION","SUPPORTED","SUSPEND","SWITCH","SYMMETRIC","SYNCHRONOUS_COMMIT","SYNONYM","SYSNAME","SYSTEM","TABLE","TABLERESULTS","TABLESAMPLE","TABLOCK","TABLOCKX","TAKE","TAPE","TARGET","TARGET_RECOVERY_TIME","TB","TCP","TEXT","TEXTIMAGE_ON","TEXTSIZE","THEN","THESAURUS","THROW","TIES","TIME","TIMEOUT","TIMER","TIMESTAMP","TINYINT","TO","TOP","TORN_PAGE_DETECTION","TRACEOFF","TRACEON","TRACESTATUS","TRACK_CAUSALITY","TRACK_COLUMNS_UPDATED","TRAN","TRANSACTION","TRANSFER","TRANSFORM_NOISE_WORDS","TRIGGER","TRIPLE_DES","TRIPLE_DES_3KEY","TRUE","TRUNCATE","TRUNCATEONLY","TRUSTWORTHY","TRY","TSQL","TWO_DIGIT_YEAR_CUTOFF","TYPE","TYPE_WARNING","UNBOUNDED","UNCHECKED","UNCOMMITTED","UNDEFINED","UNIQUE","UNIQUEIDENTIFIER","UNKNOWN","UNLIMITED","UNLOAD","UNSAFE","UPDATE","UPDATETEXT","UPDATEUSAGE","UPDLOCK","URL","USE","USED","USER","USEROPTIONS","USING","VALID_XML","VALIDATION","VALUE","VALUES","VARBINARY","VARCHAR","VARYING","VERIFYONLY","VERSION","VIEW","VIEW_METADATA","VIEWS","VISIBILITY","WAIT_AT_LOW_PRIORITY","WAITFOR","WEEK","WEIGHT","WELL_FORMED_XML","WHEN","WHERE","WHILE","WINDOWS","WITH","WITHIN","WITHOUT","WITNESS","WORK","WORKLOAD","WRITETEXT","XACT_ABORT","XLOCK","XMAX","XMIN","XML","XMLDATA","XMLNAMESPACES","XMLSCHEMA","XQUERY","XSINIL","YEAR","YMAX","YMIN"],operators:["ALL","AND","ANY","BETWEEN","EXISTS","IN","LIKE","NOT","OR","SOME","EXCEPT","INTERSECT","UNION","APPLY","CROSS","FULL","INNER","JOIN","LEFT","OUTER","RIGHT","CONTAINS","FREETEXT","IS","NULL","PIVOT","UNPIVOT","MATCHED"],builtinFunctions:["AVG","CHECKSUM_AGG","COUNT","COUNT_BIG","GROUPING","GROUPING_ID","MAX","MIN","SUM","STDEV","STDEVP","VAR","VARP","CUME_DIST","FIRST_VALUE","LAG","LAST_VALUE","LEAD","PERCENTILE_CONT","PERCENTILE_DISC","PERCENT_RANK","COLLATE","COLLATIONPROPERTY","TERTIARY_WEIGHTS","FEDERATION_FILTERING_VALUE","CAST","CONVERT","PARSE","TRY_CAST","TRY_CONVERT","TRY_PARSE","ASYMKEY_ID","ASYMKEYPROPERTY","CERTPROPERTY","CERT_ID","CRYPT_GEN_RANDOM","DECRYPTBYASYMKEY","DECRYPTBYCERT","DECRYPTBYKEY","DECRYPTBYKEYAUTOASYMKEY","DECRYPTBYKEYAUTOCERT","DECRYPTBYPASSPHRASE","ENCRYPTBYASYMKEY","ENCRYPTBYCERT","ENCRYPTBYKEY","ENCRYPTBYPASSPHRASE","HASHBYTES","IS_OBJECTSIGNED","KEY_GUID","KEY_ID","KEY_NAME","SIGNBYASYMKEY","SIGNBYCERT","SYMKEYPROPERTY","VERIFYSIGNEDBYCERT","VERIFYSIGNEDBYASYMKEY","CURSOR_STATUS","DATALENGTH","IDENT_CURRENT","IDENT_INCR","IDENT_SEED","IDENTITY","SQL_VARIANT_PROPERTY","CURRENT_TIMESTAMP","DATEADD","DATEDIFF","DATEFROMPARTS","DATENAME","DATEPART","DATETIME2FROMPARTS","DATETIMEFROMPARTS","DATETIMEOFFSETFROMPARTS","DAY","EOMONTH","GETDATE","GETUTCDATE","ISDATE","MONTH","SMALLDATETIMEFROMPARTS","SWITCHOFFSET","SYSDATETIME","SYSDATETIMEOFFSET","SYSUTCDATETIME","TIMEFROMPARTS","TODATETIMEOFFSET","YEAR","CHOOSE","COALESCE","IIF","NULLIF","ABS","ACOS","ASIN","ATAN","ATN2","CEILING","COS","COT","DEGREES","EXP","FLOOR","LOG","LOG10","PI","POWER","RADIANS","RAND","ROUND","SIGN","SIN","SQRT","SQUARE","TAN","APP_NAME","APPLOCK_MODE","APPLOCK_TEST","ASSEMBLYPROPERTY","COL_LENGTH","COL_NAME","COLUMNPROPERTY","DATABASE_PRINCIPAL_ID","DATABASEPROPERTYEX","DB_ID","DB_NAME","FILE_ID","FILE_IDEX","FILE_NAME","FILEGROUP_ID","FILEGROUP_NAME","FILEGROUPPROPERTY","FILEPROPERTY","FULLTEXTCATALOGPROPERTY","FULLTEXTSERVICEPROPERTY","INDEX_COL","INDEXKEY_PROPERTY","INDEXPROPERTY","OBJECT_DEFINITION","OBJECT_ID","OBJECT_NAME","OBJECT_SCHEMA_NAME","OBJECTPROPERTY","OBJECTPROPERTYEX","ORIGINAL_DB_NAME","PARSENAME","SCHEMA_ID","SCHEMA_NAME","SCOPE_IDENTITY","SERVERPROPERTY","STATS_DATE","TYPE_ID","TYPE_NAME","TYPEPROPERTY","DENSE_RANK","NTILE","RANK","ROW_NUMBER","PUBLISHINGSERVERNAME","OPENDATASOURCE","OPENQUERY","OPENROWSET","OPENXML","CERTENCODED","CERTPRIVATEKEY","CURRENT_USER","HAS_DBACCESS","HAS_PERMS_BY_NAME","IS_MEMBER","IS_ROLEMEMBER","IS_SRVROLEMEMBER","LOGINPROPERTY","ORIGINAL_LOGIN","PERMISSIONS","PWDENCRYPT","PWDCOMPARE","SESSION_USER","SESSIONPROPERTY","SUSER_ID","SUSER_NAME","SUSER_SID","SUSER_SNAME","SYSTEM_USER","USER","USER_ID","USER_NAME","ASCII","CHAR","CHARINDEX","CONCAT","DIFFERENCE","FORMAT","LEFT","LEN","LOWER","LTRIM","NCHAR","PATINDEX","QUOTENAME","REPLACE","REPLICATE","REVERSE","RIGHT","RTRIM","SOUNDEX","SPACE","STR","STUFF","SUBSTRING","UNICODE","UPPER","BINARY_CHECKSUM","CHECKSUM","CONNECTIONPROPERTY","CONTEXT_INFO","CURRENT_REQUEST_ID","ERROR_LINE","ERROR_NUMBER","ERROR_MESSAGE","ERROR_PROCEDURE","ERROR_SEVERITY","ERROR_STATE","FORMATMESSAGE","GETANSINULL","GET_FILESTREAM_TRANSACTION_CONTEXT","HOST_ID","HOST_NAME","ISNULL","ISNUMERIC","MIN_ACTIVE_ROWVERSION","NEWID","NEWSEQUENTIALID","ROWCOUNT_BIG","XACT_STATE","TEXTPTR","TEXTVALID","COLUMNS_UPDATED","EVENTDATA","TRIGGER_NESTLEVEL","UPDATE","CHANGETABLE","CHANGE_TRACKING_CONTEXT","CHANGE_TRACKING_CURRENT_VERSION","CHANGE_TRACKING_IS_COLUMN_IN_MASK","CHANGE_TRACKING_MIN_VALID_VERSION","CONTAINSTABLE","FREETEXTTABLE","SEMANTICKEYPHRASETABLE","SEMANTICSIMILARITYDETAILSTABLE","SEMANTICSIMILARITYTABLE","FILETABLEROOTPATH","GETFILENAMESPACEPATH","GETPATHLOCATOR","PATHNAME","GET_TRANSMISSION_STATUS"],builtinVariables:["@@DATEFIRST","@@DBTS","@@LANGID","@@LANGUAGE","@@LOCK_TIMEOUT","@@MAX_CONNECTIONS","@@MAX_PRECISION","@@NESTLEVEL","@@OPTIONS","@@REMSERVER","@@SERVERNAME","@@SERVICENAME","@@SPID","@@TEXTSIZE","@@VERSION","@@CURSOR_ROWS","@@FETCH_STATUS","@@DATEFIRST","@@PROCID","@@ERROR","@@IDENTITY","@@ROWCOUNT","@@TRANCOUNT","@@CONNECTIONS","@@CPU_BUSY","@@IDLE","@@IO_BUSY","@@PACKET_ERRORS","@@PACK_RECEIVED","@@PACK_SENT","@@TIMETICKS","@@TOTAL_ERRORS","@@TOTAL_READ","@@TOTAL_WRITE"],pseudoColumns:["$ACTION","$IDENTITY","$ROWGUID","$PARTITION"],tokenizer:{root:[{include:"@comments"},{include:"@whitespace"},{include:"@pseudoColumns"},{include:"@numbers"},{include:"@strings"},{include:"@complexIdentifiers"},{include:"@scopes"},[/[;,.]/,"delimiter"],[/[()]/,"@brackets"],[/[\w@#$]+/,{cases:{"@keywords":"keyword","@operators":"operator","@builtinVariables":"predefined","@builtinFunctions":"predefined","@default":"identifier"}}],[/[<>=!%&+\-*/|~^]/,"operator"]],whitespace:[[/\s+/,"white"]],comments:[[/--+.*/,"comment"],[/\/\*/,{token:"comment.quote",next:"@comment"}]],comment:[[/[^*/]+/,"comment"],[/\*\//,{token:"comment.quote",next:"@pop"}],[/./,"comment"]],pseudoColumns:[[/[$][A-Za-z_][\w@#$]*/,{cases:{"@pseudoColumns":"predefined","@default":"identifier"}}]],numbers:[[/0[xX][0-9a-fA-F]*/,"number"],[/[$][+-]*\d*(\.\d*)?/,"number"],[/((\d+(\.\d*)?)|(\.\d+))([eE][\-+]?\d+)?/,"number"]],strings:[[/N'/,{token:"string",next:"@string"}],[/'/,{token:"string",next:"@string"}]],string:[[/[^']+/,"string"],[/''/,"string"],[/'/,{token:"string",next:"@pop"}]],complexIdentifiers:[[/\[/,{token:"identifier.quote",next:"@bracketedIdentifier"}],[/"/,{token:"identifier.quote",next:"@quotedIdentifier"}]],bracketedIdentifier:[[/[^\]]+/,"identifier"],[/]]/,"identifier"],[/]/,{token:"identifier.quote",next:"@pop"}]],quotedIdentifier:[[/[^"]+/,"identifier"],[/""/,"identifier"],[/"/,{token:"identifier.quote",next:"@pop"}]],scopes:[[/BEGIN\s+(DISTRIBUTED\s+)?TRAN(SACTION)?\b/i,"keyword"],[/BEGIN\s+TRY\b/i,{token:"keyword.try"}],[/END\s+TRY\b/i,{token:"keyword.try"}],[/BEGIN\s+CATCH\b/i,{token:"keyword.catch"}],[/END\s+CATCH\b/i,{token:"keyword.catch"}],[/(BEGIN|CASE)\b/i,{token:"keyword.block"}],[/END\b/i,{token:"keyword.block"}],[/WHEN\b/i,{token:"keyword.choice"}],[/THEN\b/i,{token:"keyword.choice"}]]}}}); \ No newline at end of file diff --git a/pigx-register/src/main/resources/static/console-ui/public/js/vs/basic-languages/src/swift.js b/pigx-register/src/main/resources/static/console-ui/public/js/vs/basic-languages/src/swift.js new file mode 100644 index 0000000..267a93e --- /dev/null +++ b/pigx-register/src/main/resources/static/console-ui/public/js/vs/basic-languages/src/swift.js @@ -0,0 +1,10 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 0.9.0(e162b4ba29044167bc7181c42b3270fa8a467424) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +/*!--------------------------------------------------------------------------------------------- + * Copyright (C) David Owens II, owensd.io. All rights reserved. + *--------------------------------------------------------------------------------------------*/ +define("vs/basic-languages/src/swift",["require","exports"],function(e,o){"use strict";Object.defineProperty(o,"__esModule",{value:!0}),o.conf={comments:{lineComment:"//",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"},{open:"`",close:"`"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"},{open:"`",close:"`"}]},o.language={defaultToken:"",tokenPostfix:".swift",identifier:/[a-zA-Z_][\w$]*/,attributes:["@autoclosure","@noescape","@noreturn","@NSApplicationMain","@NSCopying","@NSManaged","@objc","@UIApplicationMain","@noreturn","@availability","@IBAction","@IBDesignable","@IBInspectable","@IBOutlet"],accessmodifiers:["public","private","internal"],keywords:["__COLUMN__","__FILE__","__FUNCTION__","__LINE__","as","as!","as?","associativity","break","case","catch","class","continue","convenience","default","deinit","didSet","do","dynamic","dynamicType","else","enum","extension","fallthrough","final","for","func","get","guard","if","import","in","infix","init","inout","internal","is","lazy","left","let","mutating","nil","none","nonmutating","operator","optional","override","postfix","precedence","prefix","private","protocol","Protocol","public","repeat","required","return","right","self","Self","set","static","struct","subscript","super","switch","throw","throws","try","try!","Type","typealias","unowned","var","weak","where","while","willSet","FALSE","TRUE"],symbols:/[=(){}\[\].,:;@#\_&\-<>`?!+*\\\/]/,operatorstart:/[\/=\-+!*%<>&|^~?\u00A1-\u00A7\u00A9\u00AB\u00AC\u00AE\u00B0-\u00B1\u00B6\u00BB\u00BF\u00D7\u00F7\u2016-\u2017\u2020-\u2027\u2030-\u203E\u2041-\u2053\u2055-\u205E\u2190-\u23FF\u2500-\u2775\u2794-\u2BFF\u2E00-\u2E7F\u3001-\u3003\u3008-\u3030]/,operatorend:/[\u0300-\u036F\u1DC0-\u1DFF\u20D0-\u20FF\uFE00-\uFE0F\uFE20-\uFE2F\uE0100-\uE01EF]/,operators:/(@operatorstart)((@operatorstart)|(@operatorend))*/,escapes:/\\(?:[abfnrtv\\"']|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/,tokenizer:{root:[{include:"@comment"},{include:"@attribute"},{include:"@literal"},{include:"@keyword"},{include:"@invokedmethod"},{include:"@symbol"}],symbol:[[/[{}()\[\]]/,"@brackets"],[/[<>](?!@symbols)/,"@brackets"],[/[.]/,"delimiter"],[/@operators/,"operator"],[/@symbols/,"operator"]],comment:[[/\/\/\/.*$/,"comment.doc"],[/\/\*\*/,"comment.doc","@commentdocbody"],[/\/\/.*$/,"comment"],[/\/\*/,"comment","@commentbody"]],commentdocbody:[[/\/\*/,"comment","@commentbody"],[/\*\//,"comment.doc","@pop"],[/\:[a-zA-Z]+\:/,"comment.doc.param"],[/./,"comment.doc"]],commentbody:[[/\/\*/,"comment","@commentbody"],[/\*\//,"comment","@pop"],[/./,"comment"]],attribute:[[/\@@identifier/,{cases:{"@attributes":"keyword.control","@default":""}}]],literal:[[/"/,{token:"string.quote",next:"@stringlit"}],[/0[b]([01]_?)+/,"number.binary"],[/0[o]([0-7]_?)+/,"number.octal"],[/0[x]([0-9a-fA-F]_?)+([pP][\-+](\d_?)+)?/,"number.hex"],[/(\d_?)*\.(\d_?)+([eE][\-+]?(\d_?)+)?/,"number.float"],[/(\d_?)+/,"number"]],stringlit:[[/\\\(/,{token:"operator",next:"@interpolatedexpression"}],[/@escapes/,"string"],[/\\./,"string.escape.invalid"],[/"/,{token:"string.quote",next:"@pop"}],[/./,"string"]],interpolatedexpression:[[/\(/,{token:"operator",next:"@interpolatedexpression"}],[/\)/,{token:"operator",next:"@pop"}],{include:"@literal"},{include:"@keyword"},{include:"@symbol"}],keyword:[[/`/,{token:"operator",next:"@escapedkeyword"}],[/@identifier/,{cases:{"@keywords":"keyword","[A-Z][a-zA-Z0-9$]*":"type.identifier","@default":"identifier"}}]],escapedkeyword:[[/`/,{token:"operator",next:"@pop"}],[/./,"identifier"]],invokedmethod:[[/([.])(@identifier)/,{cases:{$2:["delimeter","type.identifier"],"@default":""}}]]}}}); \ No newline at end of file diff --git a/pigx-register/src/main/resources/static/console-ui/public/js/vs/basic-languages/src/vb.js b/pigx-register/src/main/resources/static/console-ui/public/js/vs/basic-languages/src/vb.js new file mode 100644 index 0000000..7f98f07 --- /dev/null +++ b/pigx-register/src/main/resources/static/console-ui/public/js/vs/basic-languages/src/vb.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 0.9.0(e162b4ba29044167bc7181c42b3270fa8a467424) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/src/vb",["require","exports"],function(e,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.conf={comments:{lineComment:"'",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"],["<",">"],["addhandler","end addhandler"],["class","end class"],["enum","end enum"],["event","end event"],["function","end function"],["get","end get"],["if","end if"],["interface","end interface"],["module","end module"],["namespace","end namespace"],["operator","end operator"],["property","end property"],["raiseevent","end raiseevent"],["removehandler","end removehandler"],["select","end select"],["set","end set"],["structure","end structure"],["sub","end sub"],["synclock","end synclock"],["try","end try"],["while","end while"],["with","end with"],["using","end using"],["do","loop"],["for","next"]],autoClosingPairs:[{open:"{",close:"}",notIn:["string","comment"]},{open:"[",close:"]",notIn:["string","comment"]},{open:"(",close:")",notIn:["string","comment"]},{open:'"',close:'"',notIn:["string","comment"]},{open:"<",close:">",notIn:["string","comment"]}]},n.language={defaultToken:"",tokenPostfix:".vb",ignoreCase:!0,brackets:[{token:"delimiter.bracket",open:"{",close:"}"},{token:"delimiter.array",open:"[",close:"]"},{token:"delimiter.parenthesis",open:"(",close:")"},{token:"delimiter.angle",open:"<",close:">"},{token:"keyword.tag-addhandler",open:"addhandler",close:"end addhandler"},{token:"keyword.tag-class",open:"class",close:"end class"},{token:"keyword.tag-enum",open:"enum",close:"end enum"},{token:"keyword.tag-event",open:"event",close:"end event"},{token:"keyword.tag-function",open:"function",close:"end function"},{token:"keyword.tag-get",open:"get",close:"end get"},{token:"keyword.tag-if",open:"if",close:"end if"},{token:"keyword.tag-interface",open:"interface",close:"end interface"},{token:"keyword.tag-module",open:"module",close:"end module"},{token:"keyword.tag-namespace",open:"namespace",close:"end namespace"},{token:"keyword.tag-operator",open:"operator",close:"end operator"},{token:"keyword.tag-property",open:"property",close:"end property"},{token:"keyword.tag-raiseevent",open:"raiseevent",close:"end raiseevent"},{token:"keyword.tag-removehandler",open:"removehandler",close:"end removehandler"},{token:"keyword.tag-select",open:"select",close:"end select"},{token:"keyword.tag-set",open:"set",close:"end set"},{token:"keyword.tag-structure",open:"structure",close:"end structure"},{token:"keyword.tag-sub",open:"sub",close:"end sub"},{token:"keyword.tag-synclock",open:"synclock",close:"end synclock"},{token:"keyword.tag-try",open:"try",close:"end try"},{token:"keyword.tag-while",open:"while",close:"end while"},{token:"keyword.tag-with",open:"with",close:"end with"},{token:"keyword.tag-using",open:"using",close:"end using"},{token:"keyword.tag-do",open:"do",close:"loop"},{token:"keyword.tag-for",open:"for",close:"next"}],keywords:["AddHandler","AddressOf","Alias","And","AndAlso","As","Async","Boolean","ByRef","Byte","ByVal","Call","Case","Catch","CBool","CByte","CChar","CDate","CDbl","CDec","Char","CInt","Class","CLng","CObj","Const","Continue","CSByte","CShort","CSng","CStr","CType","CUInt","CULng","CUShort","Date","Decimal","Declare","Default","Delegate","Dim","DirectCast","Do","Double","Each","Else","ElseIf","End","EndIf","Enum","Erase","Error","Event","Exit","False","Finally","For","Friend","Function","Get","GetType","GetXMLNamespace","Global","GoSub","GoTo","Handles","If","Implements","Imports","In","Inherits","Integer","Interface","Is","IsNot","Let","Lib","Like","Long","Loop","Me","Mod","Module","MustInherit","MustOverride","MyBase","MyClass","NameOf","Namespace","Narrowing","New","Next","Not","Nothing","NotInheritable","NotOverridable","Object","Of","On","Operator","Option","Optional","Or","OrElse","Out","Overloads","Overridable","Overrides","ParamArray","Partial","Private","Property","Protected","Public","RaiseEvent","ReadOnly","ReDim","RemoveHandler","Resume","Return","SByte","Select","Set","Shadows","Shared","Short","Single","Static","Step","Stop","String","Structure","Sub","SyncLock","Then","Throw","To","True","Try","TryCast","TypeOf","UInteger","ULong","UShort","Using","Variant","Wend","When","While","Widening","With","WithEvents","WriteOnly","Xor"],tagwords:["If","Sub","Select","Try","Class","Enum","Function","Get","Interface","Module","Namespace","Operator","Set","Structure","Using","While","With","Do","Loop","For","Next","Property","Continue","AddHandler","RemoveHandler","Event","RaiseEvent","SyncLock"],symbols:/[=>"]],autoClosingPairs:[{open:"<",close:">"},{open:"'",close:"'"},{open:'"',close:'"'}],surroundingPairs:[{open:"<",close:">"},{open:"'",close:"'"},{open:'"',close:'"'}]},t.language={defaultToken:"",tokenPostfix:".xml",ignoreCase:!0,qualifiedName:/(?:[\w\.\-]+:)?[\w\.\-]+/,tokenizer:{root:[[/[^<&]+/,""],{include:"@whitespace"},[/(<)(@qualifiedName)/,[{token:"delimiter"},{token:"tag",next:"@tag"}]],[/(<\/)(@qualifiedName)(\s*)(>)/,[{token:"delimiter"},{token:"tag"},"",{token:"delimiter"}]],[/(<\?)(@qualifiedName)/,[{token:"delimiter"},{token:"metatag",next:"@tag"}]],[/(<\!)(@qualifiedName)/,[{token:"delimiter"},{token:"metatag",next:"@tag"}]],[/<\!\[CDATA\[/,{token:"delimiter.cdata",next:"@cdata"}],[/&\w+;/,"string.escape"]],cdata:[[/[^\]]+/,""],[/\]\]>/,{token:"delimiter.cdata",next:"@pop"}],[/\]/,""]],tag:[[/[ \t\r\n]+/,""],[/(@qualifiedName)(\s*=\s*)("[^"]*"|'[^']*')/,["attribute.name","","attribute.value"]],[/(@qualifiedName)(\s*=\s*)("[^">?\/]*|'[^'>?\/]*)(?=[\?\/]\>)/,["attribute.name","","attribute.value"]],[/(@qualifiedName)(\s*=\s*)("[^">]*|'[^'>]*)/,["attribute.name","","attribute.value"]],[/@qualifiedName/,"attribute.name"],[/\?>/,{token:"delimiter",next:"@pop"}],[/(\/)(>)/,[{token:"tag"},{token:"delimiter",next:"@pop"}]],[/>/,{token:"delimiter",next:"@pop"}]],whitespace:[[/[ \t\r\n]+/,""],[//,{token:"comment",next:"@pop"}],[//)("closed",/<(tag)[\s\S]+?<\/\1>/)("closing",/])*?>/)(/tag/g,g._tag)(),g.paragraph=s(g.paragraph)("hr",g.hr)("heading",g.heading)("lheading",g.lheading)("blockquote",g.blockquote)("tag","<"+g._tag)("def",g.def)(),g.normal=u({},g),g.gfm=u({},g.normal,{fences:/^ *(`{3,}|~{3,})[ \.]*(\S+)? *\n([\s\S]*?)\s*\1 *(?:\n+|$)/,paragraph:/^/,heading:/^ *(#{1,6}) +([^\n]+?) *#* *(?:\n+|$)/}),g.gfm.paragraph=s(g.paragraph)("(?!","(?!"+g.gfm.fences.source.replace("\\1","\\2")+"|"+g.list.source.replace("\\1","\\3")+"|")(),g.tables=u({},g.gfm,{nptable:/^ *(\S.*\|.*)\n *([-:]+ *\|[-| :]*)\n((?:.*\|.*(?:\n|$))*)\n*/,table:/^ *\|(.+)\n *\|( *[-:]+[-| :]*)\n((?: *\|.*(?:\n|$))*)\n*/}),e.rules=g,e.lex=function(t,n){return new e(n).lex(t)},e.prototype.lex=function(e){return e=e.replace(/\r\n|\r/g,"\n").replace(/\t/g," ").replace(/\u00a0/g," ").replace(/\u2424/g,"\n"),this.token(e,!0)},e.prototype.token=function(e,t,n){for(var i,o,r,s,a,u,l,c,d,e=e.replace(/^ +$/gm,"");e;)if((r=this.rules.newline.exec(e))&&(e=e.substring(r[0].length),r[0].length>1&&this.tokens.push({type:"space"})),r=this.rules.code.exec(e))e=e.substring(r[0].length),r=r[0].replace(/^ {4}/gm,""),this.tokens.push({type:"code",text:this.options.pedantic?r:r.replace(/\n+$/,"")});else if(r=this.rules.fences.exec(e))e=e.substring(r[0].length),this.tokens.push({type:"code",lang:r[2],text:r[3]||""});else if(r=this.rules.heading.exec(e))e=e.substring(r[0].length),this.tokens.push({type:"heading",depth:r[1].length,text:r[2]});else if(t&&(r=this.rules.nptable.exec(e))){for(e=e.substring(r[0].length),u={type:"table",header:r[1].replace(/^ *| *\| *$/g,"").split(/ *\| */),align:r[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:r[3].replace(/\n$/,"").split("\n")},c=0;c ?/gm,""),this.token(r,t,!0),this.tokens.push({type:"blockquote_end"});else if(r=this.rules.list.exec(e)){for(e=e.substring(r[0].length),s=r[2],this.tokens.push({type:"list_start",ordered:s.length>1}),i=!1,d=(r=r[0].match(this.rules.item)).length,c=0;c1&&a.length>1||(e=r.slice(c+1).join("\n")+e,c=d-1)),o=i||/\n\n(?!\s*$)/.test(u),c!==d-1&&(i="\n"===u.charAt(u.length-1),o||(o=i)),this.tokens.push({type:o?"loose_item_start":"list_item_start"}),this.token(u,!1,n),this.tokens.push({type:"list_item_end"});this.tokens.push({type:"list_end"})}else if(r=this.rules.html.exec(e))e=e.substring(r[0].length),this.tokens.push({type:this.options.sanitize?"paragraph":"html",pre:!this.options.sanitizer&&("pre"===r[1]||"script"===r[1]||"style"===r[1]),text:r[0]});else if(!n&&t&&(r=this.rules.def.exec(e)))e=e.substring(r[0].length),this.tokens.links[r[1].toLowerCase()]={href:r[2],title:r[3]};else if(t&&(r=this.rules.table.exec(e))){for(e=e.substring(r[0].length),u={type:"table",header:r[1].replace(/^ *| *\| *$/g,"").split(/ *\| */),align:r[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:r[3].replace(/(?: *\| *)?\n$/,"").split("\n")},c=0;c])/,autolink:/^<([^ >]+(@|:\/)[^ >]+)>/,url:a,tag:/^|^<\/?\w+(?:"[^"]*"|'[^']*'|[^'">])*?>/,link:/^!?\[(inside)\]\(href\)/,reflink:/^!?\[(inside)\]\s*\[([^\]]*)\]/,nolink:/^!?\[((?:\[[^\]]*\]|[^\[\]])*)\]/,strong:/^__([\s\S]+?)__(?!_)|^\*\*([\s\S]+?)\*\*(?!\*)/,em:/^\b_((?:[^_]|__)+?)_\b|^\*((?:\*\*|[\s\S])+?)\*(?!\*)/,code:/^(`+)\s*([\s\S]*?[^`])\s*\1(?!`)/,br:/^ {2,}\n(?!\s*$)/,del:a,text:/^[\s\S]+?(?=[\\?(?:\s+['"]([\s\S]*?)['"])?\s*/,m.link=s(m.link)("inside",m._inside)("href",m._href)(),m.reflink=s(m.reflink)("inside",m._inside)(),m.normal=u({},m),m.pedantic=u({},m.normal,{strong:/^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,em:/^_(?=\S)([\s\S]*?\S)_(?!_)|^\*(?=\S)([\s\S]*?\S)\*(?!\*)/}),m.gfm=u({},m.normal,{escape:s(m.escape)("])","~|])")(),url:/^(https?:\/\/[^\s<]+[^<.,:;"')\]\s])/,del:/^~~(?=\S)([\s\S]*?\S)~~/,text:s(m.text)("]|","~]|")("|","|https?://|")()}),m.breaks=u({},m.gfm,{br:s(m.br)("{2,}","*")(),text:s(m.gfm.text)("{2,}","*")()}),t.rules=m,t.output=function(e,n,i){return new t(n,i).output(e)},t.prototype.output=function(e){for(var t,n,i,r,s="";e;)if(r=this.rules.escape.exec(e))e=e.substring(r[0].length),s+=r[1];else if(r=this.rules.autolink.exec(e))e=e.substring(r[0].length),"@"===r[2]?(n=":"===r[1].charAt(6)?this.mangle(r[1].substring(7)):this.mangle(r[1]),i=this.mangle("mailto:")+n):i=n=o(r[1]),s+=this.renderer.link(i,null,n);else if(this.inLink||!(r=this.rules.url.exec(e))){if(r=this.rules.tag.exec(e))!this.inLink&&/^/i.test(r[0])&&(this.inLink=!1),e=e.substring(r[0].length),s+=this.options.sanitize?this.options.sanitizer?this.options.sanitizer(r[0]):o(r[0]):r[0];else if(r=this.rules.link.exec(e))e=e.substring(r[0].length),this.inLink=!0,s+=this.outputLink(r,{href:r[2],title:r[3]}),this.inLink=!1;else if((r=this.rules.reflink.exec(e))||(r=this.rules.nolink.exec(e))){if(e=e.substring(r[0].length),t=(r[2]||r[1]).replace(/\s+/g," "),!(t=this.links[t.toLowerCase()])||!t.href){s+=r[0].charAt(0),e=r[0].substring(1)+e;continue}this.inLink=!0,s+=this.outputLink(r,t),this.inLink=!1}else if(r=this.rules.strong.exec(e))e=e.substring(r[0].length),s+=this.renderer.strong(this.output(r[2]||r[1]));else if(r=this.rules.em.exec(e))e=e.substring(r[0].length),s+=this.renderer.em(this.output(r[2]||r[1]));else if(r=this.rules.code.exec(e))e=e.substring(r[0].length),s+=this.renderer.codespan(o(r[2],!0));else if(r=this.rules.br.exec(e))e=e.substring(r[0].length),s+=this.renderer.br();else if(r=this.rules.del.exec(e))e=e.substring(r[0].length),s+=this.renderer.del(this.output(r[1]));else if(r=this.rules.text.exec(e))e=e.substring(r[0].length),s+=this.renderer.text(o(this.smartypants(r[0])));else if(e)throw new Error("Infinite loop on byte: "+e.charCodeAt(0))}else e=e.substring(r[0].length),i=n=o(r[1]),s+=this.renderer.link(i,null,n);return s},t.prototype.outputLink=function(e,t){var n=o(t.href),i=t.title?o(t.title):null;return"!"!==e[0].charAt(0)?this.renderer.link(n,i,this.output(e[1])):this.renderer.image(n,i,o(e[1]))},t.prototype.smartypants=function(e){return this.options.smartypants?e.replace(/---/g,"—").replace(/--/g,"–").replace(/(^|[-\u2014/(\[{"\s])'/g,"$1‘").replace(/'/g,"’").replace(/(^|[-\u2014/(\[{\u2018\s])"/g,"$1“").replace(/"/g,"”").replace(/\.{3}/g,"…"):e},t.prototype.mangle=function(e){if(!this.options.mangle)return e;for(var t,n="",i=e.length,o=0;o.5&&(t="x"+t.toString(16)),n+="&#"+t+";";return n},n.prototype.code=function(e,t,n){if(this.options.highlight){var i=this.options.highlight(e,t);null!=i&&i!==e&&(n=!0,e=i)}return t?'
'+(n?e:o(e,!0))+"\n
\n":"
"+(n?e:o(e,!0))+"\n
"},n.prototype.blockquote=function(e){return"
\n"+e+"
\n"},n.prototype.html=function(e){return e},n.prototype.heading=function(e,t,n){return"'+e+"\n"},n.prototype.hr=function(){return this.options.xhtml?"
\n":"
\n"},n.prototype.list=function(e,t){var n=t?"ol":"ul";return"<"+n+">\n"+e+"\n"},n.prototype.listitem=function(e){return"
  • "+e+"
  • \n"},n.prototype.paragraph=function(e){return"

    "+e+"

    \n"},n.prototype.table=function(e,t){return"\n\n"+e+"\n\n"+t+"\n
    \n"},n.prototype.tablerow=function(e){return"\n"+e+"\n"},n.prototype.tablecell=function(e,t){var n=t.header?"th":"td";return(t.align?"<"+n+' style="text-align:'+t.align+'">':"<"+n+">")+e+"\n"},n.prototype.strong=function(e){return""+e+""},n.prototype.em=function(e){return""+e+""},n.prototype.codespan=function(e){return""+e+""},n.prototype.br=function(){return this.options.xhtml?"
    ":"
    "},n.prototype.del=function(e){return""+e+""},n.prototype.link=function(e,t,n){if(this.options.sanitize){try{var i=decodeURIComponent(r(e)).replace(/[^\w:]/g,"").toLowerCase()}catch(e){return""}if(0===i.indexOf("javascript:")||0===i.indexOf("vbscript:")||0===i.indexOf("data:"))return""}var o='
    "},n.prototype.image=function(e,t,n){var i=''+n+'":">"},n.prototype.text=function(e){return e},i.parse=function(e,t,n){return new i(t,n).parse(e)},i.prototype.parse=function(e){this.inline=new t(e.links,this.options,this.renderer),this.tokens=e.reverse();for(var n="";this.next();)n+=this.tok();return n},i.prototype.next=function(){return this.token=this.tokens.pop()},i.prototype.peek=function(){return this.tokens[this.tokens.length-1]||0},i.prototype.parseText=function(){for(var e=this.token.text;"text"===this.peek().type;)e+="\n"+this.next().text;return this.inline.output(e)},i.prototype.tok=function(){switch(this.token.type){case"space":return"";case"hr":return this.renderer.hr();case"heading":return this.renderer.heading(this.inline.output(this.token.text),this.token.depth,this.token.text);case"code":return this.renderer.code(this.token.text,this.token.lang,this.token.escaped);case"table":var e,t,n,i,o="",r="";for(n="",e=0;e=0,i=p.indexOf("Macintosh")>=0,o=p.indexOf("Linux")>=0,a=!0,l=u=navigator.language}var f;!function(e){e[e.Web=0]="Web",e[e.Mac=1]="Mac",e[e.Linux=2]="Linux",e[e.Windows=3]="Windows"}(f=t.Platform||(t.Platform={}));var g=f.Web;s&&(i?g=f.Mac:n?g=f.Windows:o&&(g=f.Linux)),t.isWindows=n,t.isMacintosh=i,t.isLinux=o,t.isRootUser=r,t.isNative=s,t.isWeb=a,t.platform=g,t.language=l,t.locale=u;var m="object"==typeof self?self:global;t.globals=m,t.hasWebWorkerSupport=function(){return void 0!==m.Worker},t.setTimeout=m.setTimeout.bind(m),t.clearTimeout=m.clearTimeout.bind(m),t.setInterval=m.setInterval.bind(m),t.clearInterval=m.clearInterval.bind(m);!function(e){e[e.Windows=1]="Windows",e[e.Macintosh=2]="Macintosh",e[e.Linux=3]="Linux"}(t.OperatingSystem||(t.OperatingSystem={})),t.OS=i?2:n?1:3;!function(e){e[e.Unknown=0]="Unknown",e[e.Disabled=1]="Disabled",e[e.Enabled=2]="Enabled"}(t.AccessibilitySupport||(t.AccessibilitySupport={}))}),define(d[423],h([1,0]),function(e,t){"use strict";function n(e){return 65<=e&&e<=90}Object.defineProperty(t,"__esModule",{value:!0});/*! + BEGIN THIRD PARTY + */ +/*! + * string_score.js: String Scoring Algorithm 0.1.22 + * + * http://joshaven.com/string_score + * https://github.com/joshaven/string_score + * + * Copyright (C) 2009-2014 Joshaven Potter + * Special thanks to all of the contributors listed here https://github.com/joshaven/string_score + * MIT License: http://opensource.org/licenses/MIT + * + * Date: Tue Mar 1 2011 + * Updated: Tue Mar 10 2015 + */ +var i=["-","_"," ","/","\\","."];t.score=function(e,t,o){if(!e||!t)return 0;var r=e+t,s=o&&o[r];if("number"==typeof s)return s;for(var a=t.length,u=e.toLowerCase(),l=t.toLowerCase(),c=0,d=0,h=0;c0&&e.every(s)},t.validateConstraints=function(e,t){for(var n=Math.min(e.length,t.length),i=0;i=0)throw new Error("Cannot clone recursive data-structure");i.push(e);var u={};for(var l in e)c.call(e,l)&&(u[l]=r(e[l],t,i));return i.pop(),u}return e}function s(e,t,i){return void 0===i&&(i=!0),n.isObject(e)?(n.isObject(t)&&Object.keys(t).forEach(function(o){o in e?i&&(n.isObject(e[o])&&n.isObject(t[o])?s(e[o],t[o],i):e[o]=t[o]):e[o]=t[o]}),e):t}function a(e){for(var t=[],n=1;nthis.limit;)this.trim()},e.prototype.serialize=function(){var e={entries:[]};return this.map.forEach(function(t){e.entries.push({key:t.key,value:t.value})}),e},Object.defineProperty(e.prototype,"size",{get:function(){return this.map.size},enumerable:!0,configurable:!0}),e.prototype.set=function(e,t){if(this.map.has(e))return!1;var n={key:e,value:t};return this.push(n),this.size>this.limit&&this.trim(),!0},e.prototype.get=function(e){var t=this.map.get(e);return t?t.value:null},e.prototype.getOrSet=function(e,t){var n=this.get(e);return n||(this.set(e,t),t)},e.prototype.delete=function(e){var t=this.map.get(e);return t?(this.map.delete(e),t.next?t.next.prev=t.prev:this.head=t.prev,t.prev?t.prev.next=t.next:this.tail=t.next,t.value):null},e.prototype.has=function(e){return this.map.has(e)},e.prototype.clear=function(){this.map.clear(),this.head=null,this.tail=null},e.prototype.push=function(e){this.head&&(e.prev=this.head,this.head.next=e),this.tail||(this.tail=e),this.head=e,this.map.set(e.key,e)},e.prototype.trim=function(){if(this.tail)if(this.ratiot?1:0}function a(e){return e>=97&&e<=122}function u(e){return e>=65&&e<=90}function l(e){return a(e)||u(e)}function c(e,t,n){if(void 0===n&&(n=e.length),"string"!=typeof e||"string"!=typeof t)return!1;for(var i=0;i=11904&&e<=55215||e>=63744&&e<=64255||e>=65281&&e<=65374}Object.defineProperty(t,"__esModule",{value:!0}),t.empty="",t.isFalsyOrWhitespace=function(e){return!e||"string"!=typeof e||0===e.trim().length},t.pad=function(e,t,n){void 0===n&&(n="0");for(var i=""+e,o=[i],r=i.length;r=t.length?e:t[i]})},t.escape=function(e){return e.replace(/[<|>|&]/g,function(e){switch(e){case"<":return"<";case">":return">";case"&":return"&";default:return e}})},t.escapeRegExpCharacters=i,t.trim=function(e,t){return void 0===t&&(t=" "),r(o(e,t),t)},t.ltrim=o,t.rtrim=r,t.convertSimple2RegExpPattern=function(e){return e.replace(/[\-\\\{\}\+\?\|\^\$\.\,\[\]\(\)\#\s]/g,"\\$&").replace(/[\*]/g,".*")},t.stripWildcards=function(e){return e.replace(/\*/g,"")},t.startsWith=function(e,t){if(e.length0?e.indexOf(t,n)===n:0===n&&e===t},t.indexOfIgnoreCase=function(e,t,n){void 0===n&&(n=0);var o=e.indexOf(t,n);return o<0&&(n>0&&(e=e.substr(n)),t=i(t),o=e.search(new RegExp(t,"i"))),o},t.createRegExp=function(e,t,n){if(void 0===n&&(n={}),!e)throw new Error("Cannot create regex from empty string");t||(e=i(e)),n.wholeWord&&(/\B/.test(e.charAt(0))||(e="\\b"+e),/\B/.test(e.charAt(e.length-1))||(e+="\\b"));var o="";return n.global&&(o+="g"),n.matchCase||(o+="i"),n.multiline&&(o+="m"),new RegExp(e,o)},t.regExpLeadsToEndlessLoop=function(e){return"^"!==e.source&&"^$"!==e.source&&"$"!==e.source&&e.exec("")&&0===e.lastIndex},t.canNormalize="function"==typeof"".normalize;var f=/[^\u0000-\u0080]/,g=new n.BoundedMap(1e4);t.normalizeNFC=function(e){if(!t.canNormalize||!e)return e;var n=g.get(e);if(n)return n;var i;return i=f.test(e)?e.normalize("NFC"):e,g.set(e,i),i},t.firstNonWhitespaceIndex=function(e){for(var t=0,n=e.length;t=0;n--){var i=e.charCodeAt(n);if(32!==i&&9!==i)return n}return-1},t.compare=s,t.compareIgnoreCase=function(e,t){for(var n=Math.min(e.length,t.length),i=0;it.length?1:0},t.equalsIgnoreCase=function(e,t){return(e?e.length:0)===(t?t.length:0)&&c(e,t)},t.beginsWithIgnoreCase=function(e,t){var n=t.length;return!(t.length>e.length)&&c(e,t,n)},t.commonPrefixLength=function(e,t){var n,i=Math.min(e.length,t.length);for(n=0;n0;){if(d(e,o,n,t,0,i))return i;i-=1,o+=1}return 0},t.isHighSurrogate=function(e){return 55296<=e&&e<=56319},t.isLowSurrogate=function(e){return 56320<=e&&e<=57343};var m=/(?:[\u05BE\u05C0\u05C3\u05C6\u05D0-\u05F4\u0608\u060B\u060D\u061B-\u064A\u066D-\u066F\u0671-\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u0710\u0712-\u072F\u074D-\u07A5\u07B1-\u07EA\u07F4\u07F5\u07FA-\u0815\u081A\u0824\u0828\u0830-\u0858\u085E-\u08BD\u200F\uFB1D\uFB1F-\uFB28\uFB2A-\uFD3D\uFD50-\uFDFC\uFE70-\uFEFC]|\uD802[\uDC00-\uDD1B\uDD20-\uDE00\uDE10-\uDE33\uDE40-\uDEE4\uDEEB-\uDF35\uDF40-\uDFFF]|\uD803[\uDC00-\uDCFF]|\uD83A[\uDC00-\uDCCF\uDD00-\uDD43\uDD50-\uDFFF]|\uD83B[\uDC00-\uDEBB])/;t.containsRTL=function(e){return m.test(e)};var v=/(?:[\u231A\u231B\u23F0\u23F3\u2600-\u27BF\u2B50\u2B55]|\uD83C[\uDDE6-\uDDFF\uDF00-\uDFFF]|\uD83D[\uDC00-\uDE4F\uDE80-\uDEF8]|\uD83E[\uDD00-\uDDE6])/;t.containsEmoji=function(e){return v.test(e)};var _=/^[\t\n\r\x20-\x7E]*$/;t.isBasicASCII=function(e){return _.test(e)},t.containsFullWidthCharacter=function(e){for(var t=0,n=e.length;tn)return 0;var o,r,s=[],a=[];for(o=0;o=0;r--)if((o+=i[r].length)>n){i.splice(0,r);break}return i.join(t.empty).replace(/^\s/,t.empty)};var y=/\x1B\x5B[12]?K/g,C=/\x1b\[\d+m/g,b=/\x1b\[0?m/g;t.removeAnsiEscapeCodes=function(e){return e&&(e=(e=(e=e.replace(y,"")).replace(C,"")).replace(b,"")),e},t.UTF8_BOM_CHARACTER=String.fromCharCode(65279),t.startsWithUTF8BOM=function(e){return e&&e.length>0&&65279===e.charCodeAt(0)},t.appendWithLimit=function(e,t,n){var i=e.length+t.length;return i>n&&(e="..."+e.substr(i-n)),t.length>n?e+=t.substr(t.length-n):e+=t,e},t.safeBtoa=function(e){return btoa(encodeURIComponent(e))},t.repeat=function(e,t){for(var n="",i=0;i0?[{start:0,end:t.length}]:[]:null}function s(e,t){var n=t.toLowerCase().indexOf(e.toLowerCase());return-1===n?null:[{start:n,end:n+e.length}]}function a(e,t){return u(e.toLowerCase(),t.toLowerCase(),0,0)}function u(e,t,n,i){if(n===e.length)return[];if(i===t.length)return null;if(e[n]===t[i]){var o=null;if(o=u(e,t,n+1,i+1))return f({start:i,end:i+1},o)}return u(e,t,n,i+1)}function l(e){return 97<=e&&e<=122}function c(e){return 65<=e&&e<=90}function d(e){return 48<=e&&e<=57}function h(e){return 32===e||9===e||10===e||13===e}function p(e){return l(e)||c(e)||d(e)}function f(e,t){return 0===t.length?t=[e]:e.end===t[0].start?t[0].start=e.start:t.unshift(e),t}function g(e,t){for(var n=t;n0&&!p(e.charCodeAt(n-1)))return n}return e.length}function m(e,t,n,i){if(n===e.length)return[];if(i===t.length)return null;if(e[n]!==t[i].toLowerCase())return null;var o=null,r=i+1;for(o=m(e,t,n+1,i+1);!o&&(r=g(t,r)).6}function y(e){var t=e.upperPercent,n=e.lowerPercent,i=e.alphaPercent,o=e.numericPercent;return n>.2&&t<.8&&i>.6&&o<.2}function C(e){for(var t=0,n=0,i=0,o=0,r=0;r60)return null;var n=v(t);if(!y(n)){if(!_(n))return null;t=t.toLowerCase()}for(var i=null,o=0;o0&&h(e.charCodeAt(n-1)))return n;return e.length}function E(){for(var e=[],t=[0],n=1;n<=100;n++)t.push(-n);for(n=0;n<=100;n++){var i=t.slice(0);i[0]=-n,e.push(i)}return e}function L(e,t,n,i,o){function r(e,t,n){for(void 0===n&&(n=" ");e.length100?100:e.length,o=t.length>100?100:t.length,r=0;for(void 0===n&&(n=i);ro)){for(var s=e.toLowerCase(),a=t.toLowerCase(),u=r,l=0;u1?1:d),f=I[u-1][l]+-1,g=I[u][l-1]+-1;g>=f?g>p?(I[u][l]=g,O[u][l]=4):g===p?(I[u][l]=g,O[u][l]=6):(I[u][l]=p,O[u][l]=2):f>p?(I[u][l]=f,O[u][l]=1):f===p?(I[u][l]=f,O[u][l]=3):(I[u][l]=p,O[u][l]=2),c=h}}if(R&&(console.log(L(I,e,i,t,o)),console.log(L(O,e,i,t,o)),console.log(L(D,e,i,t,o))),W.length=0,B=-100,V=r,N(i,o,0,new H,!1),0!==W.length)return[B,W[0].toArray()]}}}function N(e,t,n,i,o){if(!(W.length>=10||n<-25)){for(var r=0;e>V&&t>0;){var s=D[e][t],a=O[e][t];if(4===a)t-=1,o?n-=5:i.isEmpty()||(n-=1),o=!1,r=0;else{if(!(2&a))return;if(4&a&&N(e,t-1,i.isEmpty()?n:n-1,i.slice(),o),n+=s,e-=1,t-=1,i.unshift(t),o=!0,1===s){if(r+=1,e===V)return}else n+=1+r*(s-1),r=0}}(n-=t>=3?9:3*t)>B?(B=n,W.unshift(i)):W.push(i)}}function M(e,t){if(!(t+1>=e.length))return e.slice(0,t)+e[t+1]+e[t]+e.slice(t+2)}Object.defineProperty(t,"__esModule",{value:!0}),t.or=o,t.and=function(){for(var e=[],t=0;t0)&&".."!==g&&(h=-1===f?"":h.slice(0,f),d=!0)}else u(e,c,p,".")&&(a||h||p=65&&i<=90||i>=97&&i<=122)&&58===e.charCodeAt(1))return 47===(i=e.charCodeAt(2))||92===i?e.slice(0,2)+t:e.slice(0,2);var s=e.indexOf("://");if(-1!==s)for(s+=3;s=65&&t<=90||t>=97&&t<=122)&&e.length>2&&58===e.charCodeAt(1)){var n=e.charCodeAt(2);if(47===n||92===n)return!0}return!1}function d(e){return e&&47===e.charCodeAt(0)}Object.defineProperty(t,"__esModule",{value:!0}),t.sep="/",t.nativeSep=n.isWindows?"\\":"/",t.relative=function(e,r){for(var s=o.rtrim(a(e),t.sep),u=o.rtrim(a(r),t.sep),l=n.isLinux?s:s.toLowerCase(),c=n.isLinux?u:u.toLowerCase(),d=l.split(t.sep),h=c.split(t.sep),p=0,f=Math.min(d.length,h.length);p0){var o=e.charCodeAt(e.length-1);if(47!==o&&92!==o){var r=i.charCodeAt(0);47!==r&&92!==r&&(e+=t.sep)}}e+=i}return a(e)},t.isUNC=function(e){if(!n.isWindows)return!1;if(!e||e.length<5)return!1;var t=e.charCodeAt(0);if(92!==t)return!1;if(92!==(t=e.charCodeAt(1)))return!1;for(var i=2,o=i;i\|]/g:/[\\/]/g,g=/^(con|prn|aux|clock\$|nul|lpt[0-9]|com[0-9])$/i;t.isValidBasename=function(e){return!(!e||0===e.length||/^\s+$/.test(e)||(f.lastIndex=0,f.test(e)||n.isWindows&&g.test(e)||"."===e||".."===e||n.isWindows&&"."===e[e.length-1]||n.isWindows&&e.length!==e.trim().length))},t.isEqual=function(e,t,n){var i=e===t;return!n||i?i:!(!e||!t)&&o.equalsIgnoreCase(e,t)},t.isEqualOrParent=function(e,n,i){if(e===n)return!0;if(!e||!n)return!1;if(n.length>e.length)return!1;if(i){if(!o.beginsWithIgnoreCase(e,n))return!1;if(n.length===e.length)return!0;var r=n.length;return n.charAt(n.length-1)===t.nativeSep&&r--,e.charAt(r)===t.nativeSep}return n.charAt(n.length-1)!==t.nativeSep&&(n+=t.nativeSep),0===e.indexOf(n)},t.isAbsolute=function(e){return n.isWindows?c(e):d(e)},t.isAbsolute_win32=c,t.isAbsolute_posix=d}),define(d[229],h([1,0,423,9,45]),function(e,t,n,i,o){"use strict";function r(e,t){if(c){var n=e||"",i=t||"",o=c.compare(n,i);return d&&0===o&&n!==i?nr.length)return 1}return 0}Object.defineProperty(t,"__esModule",{value:!0});var c,d;t.setFileNameComparer=function(e){c=e,d=e.resolvedOptions().numeric},t.compareFileNames=r;var h=/^(.*?)(\.([^.]*))?$/;t.noIntlCompareFileNames=s,t.compareFileExtensions=function(e,t){if(c){var n=e?h.exec(e):[],i=t?h.exec(t):[],o=n[1]||"",r=n[3]||"",s=i[1]||"",u=i[3]||"",l=c.compare(r,u);if(0===l){if(d&&r!==u)return rp?-1:1;var f=i.getResourcePath(e),g=i.getResourcePath(t);if(f&&g){var m=n.score(f,o,s),v=n.score(g,o,s);if(m!==v)return m>v?-1:1}return a.length!==c.length?a.length1,c=void 0;if(c=o.isEqual(u.fsPath,e.fsPath,!i.isLinux)?"":o.normalize(r.ltrim(e.fsPath.substr(u.fsPath.length),o.nativeSep),!0),l){var d=o.basename(u.fsPath);c=c?o.join(d,c):d}return c}if(i.isWindows&&e.fsPath&&":"===e.fsPath[1])return o.normalize(e.fsPath.charAt(0).toUpperCase()+e.fsPath.slice(1),!0);var h=o.normalize(e.fsPath,!0);return!i.isWindows&&a&&(h=s(h,a.userHome)),h},t.tildify=s;var a="…",u="\\\\";t.shorten=function(e){for(var t=new Array(e.length),n=!1,i=0;i=0;h--){n=!1;for(var p=c.slice(h,h+d).join(o.nativeSep),f=0;!n&&f-1){var g=h+d===c.length,m=h>0&&e[f].indexOf(o.nativeSep)>-1?o.nativeSep+p:p,v=r.endsWith(e[f],m);n=!g||v}if(!n){var _="";(r.endsWith(c[0],":")||""!==l)&&(1===h&&(h=0,d++,p=c[0]+o.nativeSep+p),h>0&&(_=c[0]+o.nativeSep),_=l+_),h>0&&(_=_+a+o.nativeSep),_+=p,h+d0})}).map(function(e){return e.value}).join("")},t.mnemonicButtonLabel=function(e){return i.isWindows?e.replace(/&&/g,"&"):e.replace(/\(&&\w\)|&&/g,"")}}),function(){var e={};e["WinJS/Core/_WinJS"]={};var t=function(t,n,i){var o={},r=!1,s=n.map(function(t){return"exports"===t?(r=!0,o):e[t]}),a=i.apply({},s);e[t]=r?o:a};t("WinJS/Core/_Global",[],function(){"use strict";return"undefined"!=typeof window?window:"undefined"!=typeof self?self:"undefined"!=typeof global?global:{}}),t("WinJS/Core/_BaseCoreUtils",["WinJS/Core/_Global"],function(e){"use strict";return{hasWinRT:!!e.Windows,markSupportedForProcessing:function(e){return e.supportedForProcessing=!0,e},_setImmediate:e.setImmediate?e.setImmediate.bind(e):function(t){e.setTimeout(t,0)}}}),t("WinJS/Core/_WriteProfilerMark",["WinJS/Core/_Global"],function(e){"use strict";return e.msWriteProfilerMark||function(){}}),t("WinJS/Core/_Base",["WinJS/Core/_WinJS","WinJS/Core/_Global","WinJS/Core/_BaseCoreUtils","WinJS/Core/_WriteProfilerMark"],function(e,t,n,i){"use strict";function o(e,t,n){var i,o,r,s=Object.keys(t),a=Array.isArray(e);for(o=0,r=s.length;o"),r}var s=e;s.Namespace||(s.Namespace=Object.create(Object.prototype));var a={uninitialized:1,working:2,initialized:3};Object.defineProperties(s.Namespace,{defineWithParent:{value:r,writable:!0,enumerable:!0,configurable:!0},define:{value:function(e,n){return r(t,e,n)},writable:!0,enumerable:!0,configurable:!0},_lazy:{value:function(e){var t,n,o=a.uninitialized;return{setName:function(e){t=e},get:function(){switch(o){case a.initialized:return n;case a.uninitialized:o=a.working;try{i("WinJS.Namespace._lazy:"+t+",StartTM"),n=e()}finally{i("WinJS.Namespace._lazy:"+t+",StopTM"),o=a.uninitialized}return e=null,o=a.initialized,n;case a.working:throw"Illegal: reentrancy on initialization";default:throw"Illegal"}},set:function(e){switch(o){case a.working:throw"Illegal: reentrancy on initialization";default:o=a.initialized,n=e}},enumerable:!0,configurable:!0}},writable:!0,enumerable:!0,configurable:!0},_moduleDefine:{value:function(e,i,r){var s=[e],a=null;return i&&(a=n(t,i),s.push(a)),o(s,r,i||""),a},writable:!0,enumerable:!0,configurable:!0}})}(),function(){function t(e,t,i){return e=e||function(){},n.markSupportedForProcessing(e),t&&o(e.prototype,t),i&&o(e,i),e}e.Namespace.define("WinJS.Class",{define:t,derive:function(e,i,r,s){if(e){i=i||function(){};var a=e.prototype;return i.prototype=Object.create(a),n.markSupportedForProcessing(i),Object.defineProperty(i.prototype,"constructor",{value:i,writable:!0,configurable:!0,enumerable:!0}),r&&o(i.prototype,r),s&&o(i,s),i}return t(i,r,s)},mix:function(e){e=e||function(){};var t,n;for(t=1,n=arguments.length;t1)&&u.fire(e),s=null,a=0},n)})},onLastListenerRemove:function(){o.dispose()}});return u.event};var h=function(){function e(){this.buffers=[]}return e.prototype.wrapEvent=function(e){var t=this;return function(n,i,o){return e(function(e){var o=t.buffers[t.buffers.length-1];o?o.push(function(){return n.call(i,e)}):n.call(i,e)},void 0,o)}},e.prototype.bufferEvents=function(e){var t=[];this.buffers.push(t),e(),this.buffers.pop(),t.forEach(function(e){return e()})},e}();t.EventBufferer=h,t.mapEvent=a,t.filterEvent=u;var p=function(){function e(e){this._event=e}return Object.defineProperty(e.prototype,"event",{get:function(){return this._event},enumerable:!0,configurable:!0}),e.prototype.map=function(t){return new e(a(this._event,t))},e.prototype.filter=function(t){return new e(u(this._event,t))},e.prototype.on=function(e,t,n){return this._event(e,t,n)},e}();t.chain=function(e){return new p(e)},t.stopwatch=function(e){var t=(new Date).getTime();return a(s(e),function(e){return(new Date).getTime()-t})},t.buffer=function(e,t,n){void 0===t&&(t=!1),void 0===n&&(n=[]),n=n.slice();var i=e(function(e){n?n.push(e):r.fire(e)}),o=function(){n.forEach(function(e){return r.fire(e)}),n=null},r=new c({onFirstListenerAdd:function(){i||(i=e(function(e){return r.fire(e)}))},onFirstListenerDidAdd:function(){n&&(t?setTimeout(o):o())},onLastListenerRemove:function(){i.dispose(),i=null}});return r.event},t.echo=function(e,t,n){void 0===t&&(t=!1),void 0===n&&(n=[]),n=n.slice(),e(function(e){n.push(e),o.fire(e)});var i=function(e,t){return n.forEach(function(n){return e.call(t,n)})},o=new c({onListenerDidAdd:function(e,n,o){t?setTimeout(function(){return i(n,o)}):i(n,o)}});return o.event}}),define(d[28],h([1,0,15,11]),function(e,t,n,i){"use strict";function o(){return s.INSTANCE.getZoomLevel()}function r(){return s.INSTANCE.getPixelRatio()}Object.defineProperty(t,"__esModule",{value:!0});var s=function(){function e(){this._zoomLevel=0,this._lastZoomLevelChangeTime=0,this._onDidChangeZoomLevel=new i.Emitter,this.onDidChangeZoomLevel=this._onDidChangeZoomLevel.event,this._zoomFactor=0,this._onDidChangeFullscreen=new i.Emitter,this.onDidChangeFullscreen=this._onDidChangeFullscreen.event,this._accessibilitySupport=0,this._onDidChangeAccessibilitySupport=new i.Emitter,this.onDidChangeAccessibilitySupport=this._onDidChangeAccessibilitySupport.event}return e.prototype.getZoomLevel=function(){return this._zoomLevel},e.prototype.getTimeSinceLastZoomLevelChanged=function(){return Date.now()-this._lastZoomLevelChangeTime},e.prototype.setZoomLevel=function(e,t){this._zoomLevel!==e&&(this._zoomLevel=e,this._lastZoomLevelChangeTime=t?0:Date.now(),this._onDidChangeZoomLevel.fire(this._zoomLevel))},e.prototype.getZoomFactor=function(){return this._zoomFactor},e.prototype.setZoomFactor=function(e){this._zoomFactor=e},e.prototype.getPixelRatio=function(){var e=document.createElement("canvas").getContext("2d");return(window.devicePixelRatio||1)/(e.webkitBackingStorePixelRatio||e.mozBackingStorePixelRatio||e.msBackingStorePixelRatio||e.oBackingStorePixelRatio||e.backingStorePixelRatio||1)},e.prototype.setFullscreen=function(e){this._fullscreen!==e&&(this._fullscreen=e,this._onDidChangeFullscreen.fire())},e.prototype.isFullscreen=function(){return this._fullscreen},e.prototype.setAccessibilitySupport=function(e){this._accessibilitySupport!==e&&(this._accessibilitySupport=e,this._onDidChangeAccessibilitySupport.fire())},e.prototype.getAccessibilitySupport=function(){return this._accessibilitySupport},e.INSTANCE=new e,e}();t.setZoomLevel=function(e,t){s.INSTANCE.setZoomLevel(e,t)},t.getZoomLevel=o,t.getTimeSinceLastZoomLevelChanged=function(){return s.INSTANCE.getTimeSinceLastZoomLevelChanged()},t.onDidChangeZoomLevel=function(e){return s.INSTANCE.onDidChangeZoomLevel(e)},t.getZoomFactor=function(){return s.INSTANCE.getZoomFactor()},t.setZoomFactor=function(e){s.INSTANCE.setZoomFactor(e)},t.getPixelRatio=r,t.setFullscreen=function(e){s.INSTANCE.setFullscreen(e)},t.isFullscreen=function(){return s.INSTANCE.isFullscreen()},t.onDidChangeFullscreen=function(e){return s.INSTANCE.onDidChangeFullscreen(e)},t.setAccessibilitySupport=function(e){s.INSTANCE.setAccessibilitySupport(e)},t.getAccessibilitySupport=function(){return s.INSTANCE.getAccessibilitySupport()},t.onDidChangeAccessibilitySupport=function(e){return s.INSTANCE.onDidChangeAccessibilitySupport(e)};var a=navigator.userAgent;t.isIE=a.indexOf("Trident")>=0,t.isEdge=a.indexOf("Edge/")>=0,t.isEdgeOrIE=t.isIE||t.isEdge,t.isOpera=a.indexOf("Opera")>=0,t.isFirefox=a.indexOf("Firefox")>=0,t.isWebKit=a.indexOf("AppleWebKit")>=0,t.isChrome=a.indexOf("Chrome")>=0,t.isSafari=-1===a.indexOf("Chrome")&&a.indexOf("Safari")>=0,t.isIPad=a.indexOf("iPad")>=0,t.isChromev56=a.indexOf("Chrome/56.")>=0&&-1===a.indexOf("Edge/"),t.supportsTranslate3d=!t.isFirefox,t.canUseTranslate3d=function(){if(!t.supportsTranslate3d)return!1;if(0!==o())return!1;if(t.isChromev56){var e=r();if(Math.floor(e)!==e)return!1}return!0}}),define(d[124],h([1,0,11]),function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.domEvent=function(e,t,i){var o=function(e){return r.fire(e)},r=new n.Emitter({onFirstListenerAdd:function(){e.addEventListener(t,o,i)},onLastListenerRemove:function(){e.removeEventListener(t,o,i)}});return r.event},t.stop=function(e){return n.mapEvent(e,function(e){return e.preventDefault(),e.stopPropagation(),e})}}),define(d[65],h([1,0,40,15,28]),function(e,t,n,i,o){"use strict";function r(e){if(e.charCode){var t=String.fromCharCode(e.charCode).toUpperCase();return n.KeyCodeUtils.fromString(t)}return s[e.keyCode]||0}Object.defineProperty(t,"__esModule",{value:!0});var s={};s[3]=7,s[8]=1,s[9]=2,s[13]=3,s[16]=4,s[17]=5,s[18]=6,s[19]=7,s[20]=8,s[27]=9,s[32]=10,s[33]=11,s[34]=12,s[35]=13,s[36]=14,s[37]=15,s[38]=16,s[39]=17,s[40]=18,s[45]=19,s[46]=20,s[48]=21,s[49]=22,s[50]=23,s[51]=24,s[52]=25,s[53]=26,s[54]=27,s[55]=28,s[56]=29,s[57]=30,s[65]=31,s[66]=32,s[67]=33,s[68]=34,s[69]=35,s[70]=36,s[71]=37,s[72]=38,s[73]=39,s[74]=40,s[75]=41,s[76]=42,s[77]=43,s[78]=44,s[79]=45,s[80]=46,s[81]=47,s[82]=48,s[83]=49,s[84]=50,s[85]=51,s[86]=52,s[87]=53,s[88]=54,s[89]=55,s[90]=56,s[93]=58,s[96]=93,s[97]=94,s[98]=95,s[99]=96,s[100]=97,s[101]=98,s[102]=99,s[103]=100,s[104]=101,s[105]=102,s[106]=103,s[107]=104,s[108]=105,s[109]=106,s[110]=107,s[111]=108,s[112]=59,s[113]=60,s[114]=61,s[115]=62,s[116]=63,s[117]=64,s[118]=65,s[119]=66,s[120]=67,s[121]=68,s[122]=69,s[123]=70,s[124]=71,s[125]=72,s[126]=73,s[127]=74,s[128]=75,s[129]=76,s[130]=77,s[144]=78,s[145]=79,s[186]=80,s[187]=81,s[188]=82,s[189]=83,s[190]=84,s[191]=85,s[192]=86,s[193]=110,s[194]=111,s[219]=87,s[220]=88,s[221]=89,s[222]=90,s[223]=91,s[226]=92,s[229]=109,o.isIE?s[91]=57:o.isFirefox?(s[59]=80,s[107]=81,s[109]=83,i.isMacintosh&&(s[224]=57)):o.isWebKit&&(s[91]=57,i.isMacintosh?s[93]=57:s[92]=57);var a=i.isMacintosh?256:2048,u=i.isMacintosh?2048:256,l=function(){function e(e){var t=e;this.browserEvent=t,this.target=t.target,this.ctrlKey=t.ctrlKey,this.shiftKey=t.shiftKey,this.altKey=t.altKey,this.metaKey=t.metaKey,this.keyCode=r(t),this.code=t.code,this.ctrlKey=this.ctrlKey||5===this.keyCode,this.altKey=this.altKey||6===this.keyCode,this.shiftKey=this.shiftKey||4===this.keyCode,this.metaKey=this.metaKey||57===this.keyCode,this._asKeybinding=this._computeKeybinding(),this._asRuntimeKeybinding=this._computeRuntimeKeybinding()}return e.prototype.preventDefault=function(){this.browserEvent&&this.browserEvent.preventDefault&&this.browserEvent.preventDefault()},e.prototype.stopPropagation=function(){this.browserEvent&&this.browserEvent.stopPropagation&&this.browserEvent.stopPropagation()},e.prototype.toKeybinding=function(){return this._asRuntimeKeybinding},e.prototype.equals=function(e){return this._asKeybinding===e},e.prototype._computeKeybinding=function(){var e=0;5!==this.keyCode&&4!==this.keyCode&&6!==this.keyCode&&57!==this.keyCode&&(e=this.keyCode);var t=0;return this.ctrlKey&&(t|=a),this.altKey&&(t|=512),this.shiftKey&&(t|=1024),this.metaKey&&(t|=u),t|=e},e.prototype._computeRuntimeKeybinding=function(){var e=0;return 5!==this.keyCode&&4!==this.keyCode&&6!==this.keyCode&&57!==this.keyCode&&(e=this.keyCode),new n.SimpleKeybinding(this.ctrlKey,this.shiftKey,this.altKey,this.metaKey,e)},e}();t.StandardKeyboardEvent=l}),define(d[47],h([1,0,15,28,148]),function(e,t,n,i,o){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e){this.timestamp=Date.now(),this.browserEvent=e,this.leftButton=0===e.button,this.middleButton=1===e.button,this.rightButton=2===e.button,this.target=e.target,this.detail=e.detail||1,"dblclick"===e.type&&(this.detail=2),this.ctrlKey=e.ctrlKey,this.shiftKey=e.shiftKey,this.altKey=e.altKey,this.metaKey=e.metaKey,"number"==typeof e.pageX?(this.posx=e.pageX,this.posy=e.pageY):(this.posx=e.clientX+document.body.scrollLeft+document.documentElement.scrollLeft,this.posy=e.clientY+document.body.scrollTop+document.documentElement.scrollTop);var t=o.IframeUtils.getPositionOfChildWindowRelativeToAncestorWindow(self,e.view);this.posx-=t.left,this.posy-=t.top}return e.prototype.preventDefault=function(){this.browserEvent.preventDefault&&this.browserEvent.preventDefault()},e.prototype.stopPropagation=function(){this.browserEvent.stopPropagation&&this.browserEvent.stopPropagation()},e}();t.StandardMouseEvent=r;var s=function(e){function t(t){var n=e.call(this,t)||this;return n.dataTransfer=t.dataTransfer,n}return f(t,e),t}(r);t.DragMouseEvent=s;var a=function(e){function t(t){return e.call(this,t)||this}return f(t,e),t}(s);t.DropMouseEvent=a;var u=function(){function e(e,t,o){if(void 0===t&&(t=0),void 0===o&&(o=0),this.browserEvent=e||null,this.target=e?e.target||e.targetNode||e.srcElement:null,this.deltaY=o,this.deltaX=t,e){var r=e,s=e;void 0!==r.wheelDeltaY?this.deltaY=r.wheelDeltaY/120:void 0!==s.VERTICAL_AXIS&&s.axis===s.VERTICAL_AXIS&&(this.deltaY=-s.detail/3),void 0!==r.wheelDeltaX?i.isSafari&&n.isWindows?this.deltaX=-r.wheelDeltaX/120:this.deltaX=r.wheelDeltaX/120:void 0!==s.HORIZONTAL_AXIS&&s.axis===s.HORIZONTAL_AXIS&&(this.deltaX=-e.detail/3),0===this.deltaY&&0===this.deltaX&&e.wheelDelta&&(this.deltaY=e.wheelDelta/120)}}return e.prototype.preventDefault=function(){this.browserEvent&&this.browserEvent.preventDefault&&this.browserEvent.preventDefault()},e.prototype.stopPropagation=function(){this.browserEvent&&this.browserEvent.stopPropagation&&this.browserEvent.stopPropagation()},e}();t.StandardMouseWheelEvent=u}),define(d[123],h([1,0,11]),function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var i,o=Object.freeze(function(e,t){var n=setTimeout(e.bind(t),0);return{dispose:function(){clearTimeout(n)}}});!function(e){e.None=Object.freeze({isCancellationRequested:!1,onCancellationRequested:n.default.None}),e.Cancelled=Object.freeze({isCancellationRequested:!0,onCancellationRequested:o})}(i=t.CancellationToken||(t.CancellationToken={}));var r=function(){function e(){this._isCancelled=!1}return e.prototype.cancel=function(){this._isCancelled||(this._isCancelled=!0,this._emitter&&(this._emitter.fire(void 0),this._emitter=void 0))},Object.defineProperty(e.prototype,"isCancellationRequested",{get:function(){return this._isCancelled},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"onCancellationRequested",{get:function(){return this._isCancelled?o:(this._emitter||(this._emitter=new n.Emitter),this._emitter.event)},enumerable:!0,configurable:!0}),e}(),s=function(){function e(){}return Object.defineProperty(e.prototype,"token",{get:function(){return this._token||(this._token=new r),this._token},enumerable:!0,configurable:!0}),e.prototype.cancel=function(){this._token?this._token.cancel():this._token=i.Cancelled},e.prototype.dispose=function(){this.cancel()},e}();t.CancellationTokenSource=s}),define(d[18],h([1,0,10,15,7,123,3,11]),function(e,t,n,i,o,r,s,a){"use strict";function u(e){return e&&"function"==typeof e.then}function l(e,t){return new o.TPromise(function(i,o,r){e.done(function(e){try{t(e)}catch(e){n.onUnexpectedError(e)}i(e)},function(e){try{t(e)}catch(e){n.onUnexpectedError(e)}o(e)},function(e){r(e)})},function(){e.cancel()})}Object.defineProperty(t,"__esModule",{value:!0}),t.toThenable=function(e){return u(e)?e:o.TPromise.as(e)},t.asWinJsPromise=function(e){var t=new r.CancellationTokenSource;return new o.TPromise(function(n,i,r){var s=e(t.token);s instanceof o.TPromise?s.then(n,i,r):u(s)?s.then(n,i):n(s)},function(){t.cancel()})},t.wireCancellationToken=function(e,t,i){var r=e.onCancellationRequested(function(){return t.cancel()});return i&&(t=t.then(void 0,function(e){if(!n.isPromiseCanceledError(e))return o.TPromise.wrapError(e)})),l(t,function(){return r.dispose()})};var c=function(){function e(){this.activePromise=null,this.queuedPromise=null,this.queuedPromiseFactory=null}return e.prototype.queue=function(e){var t=this;if(this.activePromise){if(this.queuedPromiseFactory=e,!this.queuedPromise){var n=function(){t.queuedPromise=null;var e=t.queue(t.queuedPromiseFactory);return t.queuedPromiseFactory=null,e};this.queuedPromise=new o.TPromise(function(e,i,o){t.activePromise.then(n,n,o).done(e)},function(){t.activePromise.cancel()})}return new o.TPromise(function(e,n,i){t.queuedPromise.then(e,n,i)},function(){})}return this.activePromise=e(),new o.TPromise(function(e,n,i){t.activePromise.done(function(n){t.activePromise=null,e(n)},function(e){t.activePromise=null,n(e)},i)},function(){t.activePromise.cancel()})},e}();t.Throttler=c;var d=function(){function e(){this.current=o.TPromise.as(null)}return e.prototype.queue=function(e){return this.current=this.current.then(function(){return e()})},e}();t.SimpleThrottler=d;var h=function(){function e(e){this.defaultDelay=e,this.timeout=null,this.completionPromise=null,this.onSuccess=null,this.task=null}return e.prototype.trigger=function(e,t){var n=this;return void 0===t&&(t=this.defaultDelay),this.task=e,this.cancelTimeout(),this.completionPromise||(this.completionPromise=new o.TPromise(function(e){n.onSuccess=e},function(){}).then(function(){n.completionPromise=null,n.onSuccess=null;var e=n.task;return n.task=null,e()})),this.timeout=setTimeout(function(){n.timeout=null,n.onSuccess(null)},t),this.completionPromise},e.prototype.isTriggered=function(){return null!==this.timeout},e.prototype.cancel=function(){this.cancelTimeout(),this.completionPromise&&(this.completionPromise.cancel(),this.completionPromise=null)},e.prototype.cancelTimeout=function(){null!==this.timeout&&(clearTimeout(this.timeout),this.timeout=null)},e}();t.Delayer=h;var p=function(e){function t(t){var n=e.call(this,t)||this;return n.throttler=new c,n}return f(t,e),t.prototype.trigger=function(t,n){var i=this;return e.prototype.trigger.call(this,function(){return i.throttler.queue(t)},n)},t}(h);t.ThrottledDelayer=p;var g=function(e){function t(t,n){void 0===n&&(n=0);var i=e.call(this,t)||this;return i.minimumPeriod=n,i.periodThrottler=new c,i}return f(t,e),t.prototype.trigger=function(t,n){var i=this;return e.prototype.trigger.call(this,function(){return i.periodThrottler.queue(function(){return o.Promise.join([o.TPromise.timeout(i.minimumPeriod),t()]).then(function(e){return e[1]})})},n)},t}(p);t.PeriodThrottledDelayer=g;var m=function(){function e(){var e=this;this._value=new o.TPromise(function(t,n){e._completeCallback=t,e._errorCallback=n})}return Object.defineProperty(e.prototype,"value",{get:function(){return this._value},enumerable:!0,configurable:!0}),e.prototype.complete=function(e){this._completeCallback(e)},e.prototype.error=function(e){this._errorCallback(e)},e}();t.PromiseSource=m;var v=function(e){function t(t){var i,o,r,s=this;return s=e.call(this,function(e,t,n){i=e,o=t,r=n},function(){o(n.canceled())})||this,t.then(i,o,r),s}return f(t,e),t}(o.TPromise);t.ShallowCancelThenPromise=v,t.always=l,t.sequence=function(e){function t(){return e.length?e.pop()():null}function n(e){void 0!==e&&null!==e&&i.push(e);var r=t();return r?r.then(n):o.TPromise.as(i)}var i=[];return e=e.reverse(),o.TPromise.as(null).then(n)},t.first=function(e,t){void 0===t&&(t=function(e){return!!e}),e=e.reverse().slice();var n=function(){return 0===e.length?o.TPromise.as(null):e.pop()().then(function(e){return t(e)?o.TPromise.as(e):n()})};return n()};var _=function(){function e(e){this.maxDegreeOfParalellism=e,this.outstandingPromises=[],this.runningPromises=0,this._onFinished=new a.Emitter}return Object.defineProperty(e.prototype,"onFinished",{get:function(){return this._onFinished.event},enumerable:!0,configurable:!0}),e.prototype.queue=function(e){var t=this;return new o.TPromise(function(n,i,o){t.outstandingPromises.push({factory:e,c:n,e:i,p:o}),t.consume()})},e.prototype.consume=function(){for(var e=this;this.outstandingPromises.length&&this.runningPromises0?this.consume():this._onFinished.fire()},e.prototype.dispose=function(){this._onFinished.dispose()},e}();t.Limiter=_;var y=function(e){function t(){return e.call(this,1)||this}return f(t,e),t}(_);t.Queue=y,t.setDisposableTimeout=function(e,t){for(var n=[],i=2;i0&&this._emitToBulkListeners(e);for(var t=0,n=e.length;t0;){var n=this._emitQueue.shift();o(n.target,n.arg)}},t}(s);t.OrderGuaranteeEventEmitter=u}),define(d[4],h([1,0,7,18,10,38,3,29,28,65,47]),function(e,t,n,i,o,r,s,a,u,l,c){"use strict";function d(e,t,n,i){return new N(e,t,n,i)}function h(e){return function(t){return e(new c.StandardMouseEvent(t))}}function p(e){return function(t){return e(new l.StandardKeyboardEvent(t))}}function g(e){return document.defaultView.getComputedStyle(e,null)}function m(e,t,n){var i=g(e),o="0";return i&&(o=i.getPropertyValue?i.getPropertyValue(t):i.getAttribute(n)),O(e,o)}function v(e){for(var t=e.offsetParent,n=e.offsetTop,i=e.offsetLeft;null!==(e=e.parentNode)&&e!==document.body&&e!==document.documentElement;){n-=e.scrollTop;var o=g(e);o&&(i-="rtl"!==o.direction?e.scrollLeft:-e.scrollLeft),e===t&&(i+=R.getBorderLeftWidth(e),n+=R.getBorderTopWidth(e),n+=e.offsetTop,i+=e.offsetLeft,t=e.offsetParent)}return{left:i,top:n}}function _(e){var t=R.getMarginLeft(e)+R.getMarginRight(e);return e.offsetWidth+t}function y(e){var t=R.getMarginLeft(e)+R.getMarginRight(e);return e.scrollWidth+t}function C(e,t){if(null===e)return 0;var n=v(e),i=v(t);return n.left-i.left}function b(e){void 0===e&&(e=document.getElementsByTagName("head")[0]);var t=document.createElement("style");return t.type="text/css",t.media="screen",e.appendChild(t),t}function w(e){return e&&e.sheet&&e.sheet.rules?e.sheet.rules:e&&e.sheet&&e.sheet.cssRules?e.sheet.cssRules:[]}function S(e,t){for(;e;){if(e instanceof HTMLElement&&e.hasAttribute(t))return e;e=e.parentNode}return null}Object.defineProperty(t,"__esModule",{value:!0}),t.clearNode=function(e){for(;e.firstChild;)e.removeChild(e.firstChild)},t.safeStringifyDOMAware=function(e){var t=[];return JSON.stringify(e,function(e,n){if(n instanceof Element)return"[Element]";if(a.isObject(n)||Array.isArray(n)){if(-1!==t.indexOf(n))return"[Circular]";t.push(n)}return n})},t.isInDOM=function(e){for(;e;){if(e===document.body)return!0;e=e.parentNode}return!1};var E=new(function(){function e(){}return e.prototype._findClassName=function(e,t){var n=e.className;if(n){t=t.trim();var i=n.length,o=t.length;if(0!==o)if(i=0;){if(r=s+o,(0===s||32===n.charCodeAt(s-1))&&32===n.charCodeAt(r))return this._lastStart=s,void(this._lastEnd=r+1);if(s>0&&32===n.charCodeAt(s-1)&&r===i)return this._lastStart=s-1,void(this._lastEnd=r);if(0===s&&r===i)return this._lastStart=0,void(this._lastEnd=r)}this._lastStart=-1}else this._lastStart=-1}else this._lastStart=-1},e.prototype.hasClass=function(e,t){return this._findClassName(e,t),-1!==this._lastStart},e.prototype.addClass=function(e,t){e.className?(this._findClassName(e,t),-1===this._lastStart&&(e.className=e.className+" "+t)):e.className=t},e.prototype.removeClass=function(e,t){this._findClassName(e,t),-1!==this._lastStart&&(e.className=e.className.substring(0,this._lastStart)+e.className.substring(this._lastEnd))},e.prototype.toggleClass=function(e,t,n){this._findClassName(e,t),-1===this._lastStart||void 0!==n&&n||this.removeClass(e,t),-1!==this._lastStart||void 0!==n&&!n||this.addClass(e,t)},e}()),L=new(function(){function e(){}return e.prototype.hasClass=function(e,t){return t&&e.classList&&e.classList.contains(t)},e.prototype.addClass=function(e,t){t&&e.classList&&e.classList.add(t)},e.prototype.removeClass=function(e,t){t&&e.classList&&e.classList.remove(t)},e.prototype.toggleClass=function(e,t,n){e.classList&&e.classList.toggle(t,n)},e}()),x=u.isIE?E:L;t.hasClass=x.hasClass.bind(x),t.addClass=x.addClass.bind(x),t.removeClass=x.removeClass.bind(x),t.toggleClass=x.toggleClass.bind(x);var N=function(){function e(e,t,n,i){this._node=e,this._type=t,this._handler=n,this._useCapture=i||!1,this._node.addEventListener(this._type,this._handler,this._useCapture)}return e.prototype.dispose=function(){this._handler&&(this._node.removeEventListener(this._type,this._handler,this._useCapture),this._node=null,this._handler=null)},e}();t.addDisposableListener=d,t.addStandardDisposableListener=function(e,t,n,i){var o=n;return"click"===t||"mousedown"===t?o=h(n):"keydown"!==t&&"keypress"!==t&&"keyup"!==t||(o=p(n)),d(e,t,o,i)},t.addDisposableNonBubblingMouseOutListener=function(e,t){return d(e,"mouseout",function(n){for(var i=n.relatedTarget||n.toElement;i&&i!==e;)i=i.parentNode;i!==e&&t(n)})};var M=function(){var e=self.requestAnimationFrame||self.msRequestAnimationFrame||self.webkitRequestAnimationFrame||self.mozRequestAnimationFrame||self.oRequestAnimationFrame,t=self.cancelAnimationFrame||self.cancelRequestAnimationFrame||self.msCancelAnimationFrame||self.msCancelRequestAnimationFrame||self.webkitCancelAnimationFrame||self.webkitCancelRequestAnimationFrame||self.mozCancelAnimationFrame||self.mozCancelRequestAnimationFrame||self.oCancelAnimationFrame||self.oCancelRequestAnimationFrame,n=!!e,i=e||function(e){return setTimeout(function(){return e((new Date).getTime())},0)},o=t||function(e){};return{isNative:n,request:function(e){return i(e)},cancel:function(e){return o(e)}}}(),T=function(){function e(e,t){this._runner=e,this.priority=t,this._canceled=!1}return e.prototype.dispose=function(){this._canceled=!0},e.prototype.execute=function(){if(!this._canceled)try{this._runner()}catch(e){o.onUnexpectedError(e)}},e.sort=function(e,t){return t.priority-e.priority},e}();!function(){var e=[],n=null,i=!1,o=!1,r=function(){for(i=!1,n=e,e=[],o=!0;n.length>0;)n.sort(T.sort),n.shift().execute();o=!1};t.scheduleAtNextAnimationFrame=function(t,n){void 0===n&&(n=0);var o=new T(t,n);return e.push(o),i||(i=!0,M.request(r)),o},t.runAtThisOrScheduleAtNextAnimationFrame=function(e,i){if(o){var r=new T(e,i);return n.push(r),r}return t.scheduleAtNextAnimationFrame(e,i)}}();var k=16,I=function(e,t){return t},D=function(e){function t(t,n,o,r,s){void 0===r&&(r=I),void 0===s&&(s=k);var a=e.call(this)||this,u=null,l=0,c=a._register(new i.TimeoutTimer),h=function(){l=(new Date).getTime(),o(u),u=null};return a._register(d(t,n,function(e){u=r(u,e);var t=(new Date).getTime()-l;t>=s?(c.cancel(),h()):c.setIfNotSet(h,s-t)})),a}return f(t,e),t}(s.Disposable);t.addDisposableThrottledListener=function(e,t,n,i,o){return new D(e,t,n,i,o)},t.getComputedStyle=g;var O=function(e,t){return parseFloat(t)||0},R={getBorderLeftWidth:function(e){return m(e,"border-left-width","borderLeftWidth")},getBorderTopWidth:function(e){return m(e,"border-top-width","borderTopWidth")},getBorderRightWidth:function(e){return m(e,"border-right-width","borderRightWidth")},getBorderBottomWidth:function(e){return m(e,"border-bottom-width","borderBottomWidth")},getPaddingLeft:function(e){return m(e,"padding-left","paddingLeft")},getPaddingTop:function(e){return m(e,"padding-top","paddingTop")},getPaddingRight:function(e){return m(e,"padding-right","paddingRight")},getPaddingBottom:function(e){return m(e,"padding-bottom","paddingBottom")},getMarginLeft:function(e){return m(e,"margin-left","marginLeft")},getMarginTop:function(e){return m(e,"margin-top","marginTop")},getMarginRight:function(e){return m(e,"margin-right","marginRight")},getMarginBottom:function(e){return m(e,"margin-bottom","marginBottom")},__commaSentinel:!1};t.getTopLeftOffset=v,t.getDomNodePagePosition=function(e){var n=e.getBoundingClientRect();return{left:n.left+t.StandardWindow.scrollX,top:n.top+t.StandardWindow.scrollY,width:n.width,height:n.height}},t.StandardWindow=new(function(){function e(){}return Object.defineProperty(e.prototype,"scrollX",{get:function(){return"number"==typeof window.scrollX?window.scrollX:document.body.scrollLeft+document.documentElement.scrollLeft},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"scrollY",{get:function(){return"number"==typeof window.scrollY?window.scrollY:document.body.scrollTop+document.documentElement.scrollTop},enumerable:!0,configurable:!0}),e}()),t.getContentWidth=function(e){var t=R.getBorderLeftWidth(e)+R.getBorderRightWidth(e),n=R.getPaddingLeft(e)+R.getPaddingRight(e);return e.offsetWidth-t-n},t.getTotalWidth=_,t.getTotalScrollWidth=y,t.getContentHeight=function(e){var t=R.getBorderTopWidth(e)+R.getBorderBottomWidth(e),n=R.getPaddingTop(e)+R.getPaddingBottom(e);return e.offsetHeight-t-n},t.getTotalHeight=function(e){var t=R.getMarginTop(e)+R.getMarginBottom(e);return e.offsetHeight+t},t.getLargestChildWidth=function(e,t){var n=t.map(function(t){return Math.max(y(t),_(t))+C(t,e)||0});return Math.max.apply(Math,n)},t.isAncestor=function(e,t){for(;e;){if(e===t)return!0;e=e.parentNode}return!1},t.findParentWithClass=function(e,n,i){for(;e;){if(t.hasClass(e,n))return e;if(i&&t.hasClass(e,i))return null;e=e.parentNode}return null},t.createStyleSheet=b;var P=b();t.createCSSRule=function(e,t,n){void 0===n&&(n=P),n&&t&&n.sheet.insertRule(e+"{"+t+"}",0)},t.getCSSRule=function(e,t){if(void 0===t&&(t=P),!t)return null;for(var n=w(t),i=0;i=0;o--)t.sheet.deleteRule(i[o])}},t.isHTMLElement=function(e){return"object"==typeof HTMLElement?e instanceof HTMLElement:e&&"object"==typeof e&&1===e.nodeType&&"string"==typeof e.nodeName},t.EventType={CLICK:"click",AUXCLICK:"auxclick",DBLCLICK:"dblclick",MOUSE_UP:"mouseup",MOUSE_DOWN:"mousedown",MOUSE_OVER:"mouseover",MOUSE_MOVE:"mousemove",MOUSE_OUT:"mouseout",CONTEXT_MENU:"contextmenu",WHEEL:"wheel",KEY_DOWN:"keydown",KEY_PRESS:"keypress",KEY_UP:"keyup",LOAD:"load",UNLOAD:"unload",ABORT:"abort",ERROR:"error",RESIZE:"resize",SCROLL:"scroll",SELECT:"select",CHANGE:"change",SUBMIT:"submit",RESET:"reset",FOCUS:"focus",BLUR:"blur",INPUT:"input",STORAGE:"storage",DRAG_START:"dragstart",DRAG:"drag",DRAG_ENTER:"dragenter",DRAG_LEAVE:"dragleave",DRAG_OVER:"dragover",DROP:"drop",DRAG_END:"dragend",ANIMATION_START:u.isWebKit?"webkitAnimationStart":"animationstart",ANIMATION_END:u.isWebKit?"webkitAnimationEnd":"animationend",ANIMATION_ITERATION:u.isWebKit?"webkitAnimationIteration":"animationiteration"},t.EventHelper={stop:function(e,t){e.preventDefault?e.preventDefault():e.returnValue=!1,t&&(e.stopPropagation?e.stopPropagation():e.cancelBubble=!0)}},t.saveParentsScrollTop=function(e){for(var t=[],n=0;e&&e.nodeType===e.ELEMENT_NODE;n++)t[n]=e.scrollTop,e=e.parentNode;return t},t.restoreParentsScrollTop=function(e,t){for(var n=0;e&&e.nodeType===e.ELEMENT_NODE;n++)e.scrollTop!==t[n]&&(e.scrollTop=t[n]),e=e.parentNode};var A=function(e){function n(n){var i=e.call(this)||this,o=!1,s=!1;i._eventEmitter=i._register(new r.EventEmitter);return i._register(d(n,t.EventType.FOCUS,function(e){s=!1,o||(o=!0,i._eventEmitter.emit("focus",{}))},!0)),i._register(d(n,t.EventType.BLUR,function(e){o&&(s=!0,window.setTimeout(function(){s&&(s=!1,o=!1,i._eventEmitter.emit("blur",{}))},0))},!0)),i}return f(n,e),n.prototype.addFocusListener=function(e){return this._eventEmitter.addListener("focus",e)},n.prototype.addBlurListener=function(e){return this._eventEmitter.addListener("blur",e)},n}(s.Disposable);t.trackFocus=function(e){return new A(e)},t.append=function(e){for(var t=[],n=1;n0&&(t instanceof Node?n.push(t.cloneNode()):n.push(document.createTextNode(t))),n.push(e)}),n},t.show=function(){for(var e=[],t=0;t0},t.prototype.startMonitoring=function(e,t,n){var s=this;if(!this.isMonitoring()){this.mouseMoveEventMerger=e,this.mouseMoveCallback=t,this.onStopCallback=n;for(var a=o.IframeUtils.getSameOriginWindowChain(),u=0;u"},h.link=function(e,t,n){return e===n&&(n=s.removeMarkdownEscapes(n)),t=s.removeMarkdownEscapes(t),!(e=s.removeMarkdownEscapes(e))||e.match(/^data:|javascript:/i)?n:''+n+""},h.paragraph=function(e){return"

    "+e+"

    "},t.codeBlockRenderer&&(h.code=function(e,n){var s=t.codeBlockRenderer(n,e);if("string"==typeof s)return s;if(r.TPromise.is(s)){var a=i.defaultGenerator.nextId();return r.TPromise.join([s,d]).done(function(e){var t=e[0],n=c.querySelector('div[data-code="'+a+'"]');n&&(n.innerHTML=t)},function(e){}),'
    '+o.escape(e)+"
    "}return e}),t.actionCallback&&n.addStandardDisposableListener(c,"click",function(e){if("A"===e.target.tagName){var n=e.target.dataset.href;n&&t.actionCallback(n,e)}}),c.innerHTML=a.marked(e,{sanitize:!0,renderer:h}),l(),c}function c(e,t,i){var o;if(2===t.type)o=document.createTextNode(t.content);else if(3===t.type)o=document.createElement("b");else if(4===t.type)o=document.createElement("i");else if(5===t.type){var r=document.createElement("a");r.href="#",n.addStandardDisposableListener(r,"click",function(e){i(String(t.index),e)}),o=r}else 7===t.type?o=document.createElement("br"):1===t.type&&(o=e);e!==o&&e.appendChild(o),Array.isArray(t.children)&&t.children.forEach(function(e){c(o,e,i)})}function d(e){for(var t={type:1,children:[]},n=0,i=t,o=[],r=new g(e);!r.eos();){var s=r.next(),a="\\"===s&&0!==p(r.peek());if(a&&(s=r.next()),!a&&h(s)&&s===r.peek()){r.advance(),2===i.type&&(i=o.pop());var u=p(s);if(i.type===u||5===i.type&&6===u)i=o.pop();else{var l={type:u,children:[]};5===u&&(l.index=n,n++),i.children.push(l),o.push(i),i=l}}else if("\n"===s)2===i.type&&(i=o.pop()),i.children.push({type:7});else if(2!==i.type){var c={type:2,content:s};i.children.push(c),o.push(i),i=c}else i.content+=s}return 2===i.type&&(i=o.pop()),o.length,t}function h(e){return 0!==p(e)}function p(e){switch(e){case"*":return 3;case"_":return 4;case"[":return 5;case"]":return 6;default:return 0}}Object.defineProperty(t,"__esModule",{value:!0}),t.renderMarkedString=function(e,t){void 0===t&&(t={});var n;return n="string"==typeof e?e:"```"+e.language+"\n"+e.value+"\n```",l(n,t)},t.renderText=function(e,t){void 0===t&&(t={});var n=u(t);return n.textContent=e,n},t.renderFormattedText=function(e,t){void 0===t&&(t={});var n=u(t);return c(n,d(e),t.actionCallback),n},t.renderMarkdown=l;var f,g=function(){function e(e){this.source=e,this.index=0}return e.prototype.eos=function(){return this.index>=this.source.length},e.prototype.next=function(){var e=this.peek();return this.advance(),e},e.prototype.peek=function(){return this.source[this.index]},e.prototype.advance=function(){this.index++},e}();!function(e){e[e.Invalid=0]="Invalid",e[e.Root=1]="Root",e[e.Text=2]="Text",e[e.Bold=3]="Bold",e[e.Italics=4]="Italics",e[e.Action=5]="Action",e[e.ActionClose=6]="ActionClose",e[e.NewLine=7]="NewLine"}(f||(f={}))}),define(d[74],h([1,0,33,3,4]),function(e,t,n,i,o){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r;!function(e){e.Tap="-monaco-gesturetap",e.Change="-monaco-gesturechange",e.Start="-monaco-gesturestart",e.End="-monaco-gesturesend",e.Contextmenu="-monaco-gesturecontextmenu"}(r=t.EventType||(t.EventType={}));var s=function(){function e(e){this.callOnTarget=[],this.activeTouches={},this.target=e,this.handle=null}return e.prototype.dispose=function(){this.target=null,this.handle&&(this.handle.dispose(),this.handle=null)},Object.defineProperty(e.prototype,"target",{set:function(e){var t=this;this.callOnTarget=i.dispose(this.callOnTarget),this.activeTouches={},this.targetElement=e,this.targetElement&&(this.callOnTarget.push(o.addDisposableListener(this.targetElement,"touchstart",function(e){return t.onTouchStart(e)})),this.callOnTarget.push(o.addDisposableListener(this.targetElement,"touchend",function(e){return t.onTouchEnd(e)})),this.callOnTarget.push(o.addDisposableListener(this.targetElement,"touchmove",function(e){return t.onTouchMove(e)})))},enumerable:!0,configurable:!0}),e.newGestureEvent=function(e){var t=document.createEvent("CustomEvent");return t.initEvent(e,!1,!0),t},e.prototype.onTouchStart=function(t){var n=Date.now();t.preventDefault(),this.handle&&(this.handle.dispose(),this.handle=null);for(var i=0,o=t.targetTouches.length;i=e.HOLD_DELAY&&Math.abs(l.initialPageX-n.tail(l.rollingPageX))<30&&Math.abs(l.initialPageY-n.tail(l.rollingPageY))<30){var d=e.newGestureEvent(r.Contextmenu);d.initialTarget=l.initialTarget,d.pageX=n.tail(l.rollingPageX),d.pageY=n.tail(l.rollingPageY),this.targetElement.dispatchEvent(d)}else if(1===o){var h=n.tail(l.rollingPageX),p=n.tail(l.rollingPageY),f=n.tail(l.rollingTimestamps)-l.rollingTimestamps[0],g=h-l.rollingPageX[0],m=p-l.rollingPageY[0];this.inertia(i,Math.abs(g)/f,g>0?1:-1,h,Math.abs(m)/f,m>0?1:-1,p)}delete this.activeTouches[u.identifier]}else console.warn("move of an UNKNOWN touch",u)}},e.prototype.inertia=function(t,n,i,s,a,u,l){var c=this;this.handle=o.scheduleAtNextAnimationFrame(function(){var o=Date.now(),d=o-t,h=0,p=0,f=!0;n+=e.SCROLL_FRICTION*d,a+=e.SCROLL_FRICTION*d,n>0&&(f=!1,h=i*n*d),a>0&&(f=!1,p=u*a*d);var g=e.newGestureEvent(r.Change);g.translationX=h,g.translationY=p,c.targetElement.dispatchEvent(g),f||c.inertia(o,n,i,s+h,a,u,l+p)})},e.prototype.onTouchMove=function(t){var i=Date.now();t.preventDefault(),t.stopPropagation();for(var o=0,s=t.changedTouches.length;o3&&(u.rollingPageX.shift(),u.rollingPageY.shift(),u.rollingTimestamps.shift()),u.rollingPageX.push(a.pageX),u.rollingPageY.push(a.pageY),u.rollingTimestamps.push(i)}else console.warn("end of an UNKNOWN touch",a)}},e.HOLD_DELAY=700,e.SCROLL_FRICTION=-.005,e}();t.Gesture=s}),define(d[110],h([1,0,9,4,26,512]),function(e,t,n,i,o,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var s=function(){function e(e){this.domNode=document.createElement("span"),this.domNode.className="monaco-highlighted-label",this.didEverRender=!1,e.appendChild(this.domNode)}return Object.defineProperty(e.prototype,"element",{get:function(){return this.domNode},enumerable:!0,configurable:!0}),e.prototype.set=function(e,t){void 0===t&&(t=[]),e||(e=""),this.didEverRender&&this.text===e&&o.equals(this.highlights,t)||(Array.isArray(t)||(t=[]),this.text=e,this.highlights=t,this.render())},e.prototype.render=function(){i.clearNode(this.domNode);for(var e,t=[],o=0,s=0;s"),t.push(r.expand(n.escape(this.text.substring(o,e.start)))),t.push(""),o=e.end),t.push(''),t.push(r.expand(n.escape(this.text.substring(e.start,e.end)))),t.push(""),o=e.end);o"),t.push(r.expand(n.escape(this.text.substring(o)))),t.push("")),this.domNode.innerHTML=t.join(""),this.didEverRender=!0},e.prototype.dispose=function(){this.text=null,this.highlights=null},e}();t.HighlightedLabel=s}),define(d[416],h([1,0,4]),function(e,t,n){"use strict";function i(e){try{e.parentElement.removeChild(e)}catch(e){}}Object.defineProperty(t,"__esModule",{value:!0});var o=function(){function e(e){this.renderers=e,this.cache=Object.create(null)}return e.prototype.alloc=function(e){var t=this.getTemplateCache(e).pop();if(!t){var i=n.$(".monaco-list-row");t={domNode:i,templateId:e,templateData:this.renderers[e].renderTemplate(i)}}return t},e.prototype.release=function(e){e&&this.releaseRow(e)},e.prototype.releaseRow=function(e){var t=e.domNode,o=e.templateId;n.removeClass(t,"scrolling"),i(t),this.getTemplateCache(o).push(e)},e.prototype.getTemplateCache=function(e){return this.cache[e]||(this.cache[e]=[])},e.prototype.garbageCollect=function(){var e=this;this.cache&&Object.keys(this.cache).forEach(function(t){e.cache[t].forEach(function(n){e.renderers[t].disposeTemplate(n.templateData),n.domNode=null,n.templateData=null}),delete e.cache[t]})},e.prototype.dispose=function(){this.garbageCollect(),this.cache=null,this.renderers=null},e}();t.RowCache=o}),define(d[41],h([1,0,3,47,65,4]),function(e,t,n,i,o,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var s=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return f(t,e),t.prototype.onclick=function(e,t){this._register(r.addDisposableListener(e,r.EventType.CLICK,function(e){return t(new i.StandardMouseEvent(e))}))},t.prototype.onmousedown=function(e,t){this._register(r.addDisposableListener(e,r.EventType.MOUSE_DOWN,function(e){return t(new i.StandardMouseEvent(e))}))},t.prototype.onmouseover=function(e,t){this._register(r.addDisposableListener(e,r.EventType.MOUSE_OVER,function(e){return t(new i.StandardMouseEvent(e))}))},t.prototype.onnonbubblingmouseout=function(e,t){this._register(r.addDisposableNonBubblingMouseOutListener(e,function(e){return t(new i.StandardMouseEvent(e))}))},t.prototype.onkeydown=function(e,t){this._register(r.addDisposableListener(e,r.EventType.KEY_DOWN,function(e){return t(new o.StandardKeyboardEvent(e))}))},t.prototype.onkeyup=function(e,t){this._register(r.addDisposableListener(e,r.EventType.KEY_UP,function(e){return t(new o.StandardKeyboardEvent(e))}))},t.prototype.oninput=function(e,t){this._register(r.addDisposableListener(e,r.EventType.INPUT,t))},t.prototype.onblur=function(e,t){this._register(r.addDisposableListener(e,r.EventType.BLUR,t))},t.prototype.onfocus=function(e,t){this._register(r.addDisposableListener(e,r.EventType.FOCUS,t))},t.prototype.onchange=function(e,t){this._register(r.addDisposableListener(e,r.EventType.CHANGE,t))},t}(n.Disposable);t.Widget=s}),define(d[117],h([1,0,83,41,18]),function(e,t,n,i,o){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ARROW_IMG_SIZE=11;var r=function(e){function i(i){var r=e.call(this)||this;return r._onActivate=i.onActivate,r.bgDomNode=document.createElement("div"),r.bgDomNode.className="arrow-background",r.bgDomNode.style.position="absolute",r.bgDomNode.style.width=i.bgWidth+"px",r.bgDomNode.style.height=i.bgHeight+"px",void 0!==i.top&&(r.bgDomNode.style.top="0px"),void 0!==i.left&&(r.bgDomNode.style.left="0px"),void 0!==i.bottom&&(r.bgDomNode.style.bottom="0px"),void 0!==i.right&&(r.bgDomNode.style.right="0px"),r.domNode=document.createElement("div"),r.domNode.className=i.className,r.domNode.style.position="absolute",r.domNode.style.width=t.ARROW_IMG_SIZE+"px",r.domNode.style.height=t.ARROW_IMG_SIZE+"px",void 0!==i.top&&(r.domNode.style.top=i.top+"px"),void 0!==i.left&&(r.domNode.style.left=i.left+"px"),void 0!==i.bottom&&(r.domNode.style.bottom=i.bottom+"px"),void 0!==i.right&&(r.domNode.style.right=i.right+"px"),r._mouseMoveMonitor=r._register(new n.GlobalMouseMoveMonitor),r.onmousedown(r.bgDomNode,function(e){return r._arrowMouseDown(e)}),r.onmousedown(r.domNode,function(e){return r._arrowMouseDown(e)}),r._mousedownRepeatTimer=r._register(new o.IntervalTimer),r._mousedownScheduleRepeatTimer=r._register(new o.TimeoutTimer),r}return f(i,e),i.prototype._arrowMouseDown=function(e){var t=this;this._onActivate(),this._mousedownRepeatTimer.cancel(),this._mousedownScheduleRepeatTimer.cancelAndSet(function(){t._mousedownRepeatTimer.cancelAndSet(function(){return t._onActivate()},1e3/24)},200),this._mouseMoveMonitor.startMonitoring(n.standardMouseMoveMerger,function(e){},function(){t._mousedownRepeatTimer.cancel(),t._mousedownScheduleRepeatTimer.cancel()}),e.preventDefault()},i}(i.Widget);t.ScrollbarArrow=r}),define(d[53],h([1,0,7,38,79,11]),function(e,t,n,i,o,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.isAction=function(e){return!!e&&(e instanceof s||"string"==typeof e.id&&"string"==typeof e.label&&"string"==typeof e.class&&"boolean"==typeof e.enabled&&"boolean"==typeof e.checked&&"function"==typeof e.run)};var s=function(){function e(e,t,n,i,o){void 0===t&&(t=""),void 0===n&&(n=""),void 0===i&&(i=!0),this._onDidChange=new r.Emitter,this._id=e,this._label=t,this._cssClass=n,this._enabled=i,this._actionCallback=o}return e.prototype.dispose=function(){this._onDidChange.dispose()},Object.defineProperty(e.prototype,"onDidChange",{get:function(){return this._onDidChange.event},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"id",{get:function(){return this._id},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"label",{get:function(){return this._label},set:function(e){this._setLabel(e)},enumerable:!0,configurable:!0}),e.prototype._setLabel=function(e){this._label!==e&&(this._label=e,this._onDidChange.fire({label:e}))},Object.defineProperty(e.prototype,"tooltip",{get:function(){return this._tooltip},set:function(e){this._setTooltip(e)},enumerable:!0,configurable:!0}),e.prototype._setTooltip=function(e){this._tooltip!==e&&(this._tooltip=e,this._onDidChange.fire({tooltip:e}))},Object.defineProperty(e.prototype,"class",{get:function(){return this._cssClass},set:function(e){this._setClass(e)},enumerable:!0,configurable:!0}),e.prototype._setClass=function(e){this._cssClass!==e&&(this._cssClass=e,this._onDidChange.fire({class:e}))},Object.defineProperty(e.prototype,"enabled",{get:function(){return this._enabled},set:function(e){this._setEnabled(e)},enumerable:!0,configurable:!0}),e.prototype._setEnabled=function(e){this._enabled!==e&&(this._enabled=e,this._onDidChange.fire({enabled:e}))},Object.defineProperty(e.prototype,"checked",{get:function(){return this._checked},set:function(e){this._setChecked(e)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"radio",{get:function(){return this._radio},set:function(e){this._setRadio(e)},enumerable:!0,configurable:!0}),e.prototype._setChecked=function(e){this._checked!==e&&(this._checked=e,this._onDidChange.fire({checked:e}))},e.prototype._setRadio=function(e){this._radio!==e&&(this._radio=e,this._onDidChange.fire({radio:e}))},Object.defineProperty(e.prototype,"order",{get:function(){return this._order},set:function(e){this._order=e},enumerable:!0,configurable:!0}),e.prototype.run=function(e,t){return void 0!==this._actionCallback?this._actionCallback(e):n.TPromise.as(!0)},e}();t.Action=s;var a=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return f(t,e),t.prototype.run=function(e,t){var i=this;return e.enabled?(this.emit(o.EventType.BEFORE_RUN,{action:e}),this.runAction(e,t).then(function(t){i.emit(o.EventType.RUN,{action:e,result:t})},function(t){i.emit(o.EventType.RUN,{action:e,error:t})})):n.TPromise.as(null)},t.prototype.runAction=function(e,t){return n.TPromise.as(t?e.run(t):e.run())},t}(i.EventEmitter);t.ActionRunner=a}),define(d[165],h([1,0,33,26,9,45,80,7]),function(e,t,n,i,o,r,s,a){"use strict";function u(){return Object.create(null)}function l(e){switch(e){case 0:return"";case 1:return S+"*?";default:return"(?:"+w+"|"+S+"+"+w+"|"+w+S+"+)*?"}}function c(e,t){if(!e)return[];for(var n,i=[],o=!1,r=!1,s="",a=0;a0;n--){var r=e.charCodeAt(n-1);if(47===r||92===r)break}t=e.substr(n)}var s=o.indexOf(t);return-1!==s?i[s]:null};a.basenames=o,a.patterns=i,a.allBasenames=o;var u=e.filter(function(e){return!e.basenames});return u.push(a),u}Object.defineProperty(t,"__esModule",{value:!0}),t.getEmptyExpression=u,t.mergeExpressions=function(){for(var e=[],t=0;t=0}}function a(e,t,n){for(var i,s,a,u=n.length-1;u>=0;u--){var l=n[u];if(t===l.filenameLowercase){i=l;break}if(l.filepattern&&(!s||l.filepattern.length>s.filepattern.length)){var c=l.filepatternOnPath?e:t;r.match(l.filepatternLowercase,c)&&(s=l)}l.extension&&(!a||l.extension.length>a.extension.length)&&o.endsWith(t,l.extensionLowercase)&&(a=l)}return i?i.mime:s?s.mime:a?a.mime:null}function u(e){if(o.startsWithUTF8BOM(e)&&(e=e.substr(1)),e.length>0)for(var t=0;t0)return n.mime}}return null}function l(e){return!e||("string"==typeof e?e===t.MIME_BINARY||e===t.MIME_TEXT||e===t.MIME_UNKNOWN:1===e.length&&l(e[0]))}Object.defineProperty(t,"__esModule",{value:!0}),t.MIME_TEXT="text/plain",t.MIME_BINARY="application/octet-stream",t.MIME_UNKNOWN="application/unknown";var c=[],d=[],h=[];t.registerTextMime=function(e){var t=s(e);c.push(t),t.userConfigured?h.push(t):d.push(t),t.userConfigured||c.forEach(function(e){e.mime===t.mime||e.userConfigured||(t.extension&&e.extension===t.extension&&console.warn("Overwriting extension <<"+t.extension+">> to now point to mime <<"+t.mime+">>"),t.filename&&e.filename===t.filename&&console.warn("Overwriting filename <<"+t.filename+">> to now point to mime <<"+t.mime+">>"),t.filepattern&&e.filepattern===t.filepattern&&console.warn("Overwriting filepattern <<"+t.filepattern+">> to now point to mime <<"+t.mime+">>"),t.firstline&&e.firstline===t.firstline&&console.warn("Overwriting firstline <<"+t.firstline+">> to now point to mime <<"+t.mime+">>"))})},t.clearTextMimes=function(e){e?(c=c.filter(function(e){return!e.userConfigured}),h=[]):(c=[],d=[],h=[])},t.guessMimeTypes=function(e,i){if(!e)return[t.MIME_UNKNOWN];e=e.toLowerCase();var o=n.basename(e),r=a(e,o,h);if(r)return[r,t.MIME_TEXT];var s=a(e,o,d);if(s)return[s,t.MIME_TEXT];if(i){var l=u(i);if(l)return[l,t.MIME_TEXT]}return[t.MIME_UNKNOWN]},t.isBinaryMime=function(e){if(!e)return!1;return(i.isArray(e)?e:e.split(",").map(function(e){return e.trim()})).indexOf(t.MIME_BINARY)>=0},t.isUnspecific=l,t.suggestFilename=function(e,t){for(var n=0;nt&&(n=t-e),n<0&&(n=0),i<0&&(i=0),r+i>o&&(r=o-i),r<0&&(r=0),this.width=e,this.scrollWidth=t,this.scrollLeft=n,this.height=i,this.scrollHeight=o,this.scrollTop=r}return e.prototype.equals=function(e){return this.width===e.width&&this.scrollWidth===e.scrollWidth&&this.scrollLeft===e.scrollLeft&&this.height===e.height&&this.scrollHeight===e.scrollHeight&&this.scrollTop===e.scrollTop},e.prototype.createScrollEvent=function(e){var t=this.width!==e.width,n=this.scrollWidth!==e.scrollWidth,i=this.scrollLeft!==e.scrollLeft,o=this.height!==e.height,r=this.scrollHeight!==e.scrollHeight,s=this.scrollTop!==e.scrollTop;return{width:this.width,scrollWidth:this.scrollWidth,scrollLeft:this.scrollLeft,height:this.height,scrollHeight:this.scrollHeight,scrollTop:this.scrollTop,widthChanged:t,scrollWidthChanged:n,scrollLeftChanged:i,heightChanged:o,scrollHeightChanged:r,scrollTopChanged:s}},e}();t.ScrollState=o;var r=function(e){function t(){var t=e.call(this)||this;return t._onScroll=t._register(new i.Emitter),t.onScroll=t._onScroll.event,t._state=new o(0,0,0,0,0,0),t}return f(t,e),t.prototype.getState=function(){return this._state},t.prototype.validateScrollTop=function(e){return e=Math.round(e),e=Math.max(e,0),e=Math.min(e,this._state.scrollHeight-this._state.height)},t.prototype.validateScrollLeft=function(e){return e=Math.round(e),e=Math.max(e,0),e=Math.min(e,this._state.scrollWidth-this._state.width)},t.prototype.updateState=function(e){var t=this._state,n=new o(void 0!==e.width?e.width:t.width,void 0!==e.scrollWidth?e.scrollWidth:t.scrollWidth,void 0!==e.scrollLeft?e.scrollLeft:t.scrollLeft,void 0!==e.height?e.height:t.height,void 0!==e.scrollHeight?e.scrollHeight:t.scrollHeight,void 0!==e.scrollTop?e.scrollTop:t.scrollTop);t.equals(n)||(this._state=n,this._onScroll.fire(this._state.createScrollEvent(t)))},t}(n.Disposable);t.Scrollable=r}),define(d[429],h([1,0,3,18,48]),function(e,t,n,i,o){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(e){function t(t,n,o){var r=e.call(this)||this;return r._visibility=t,r._visibleClassName=n,r._invisibleClassName=o,r._domNode=null,r._isVisible=!1,r._isNeeded=!1,r._shouldBeVisible=!1,r._revealTimer=r._register(new i.TimeoutTimer),r}return f(t,e),t.prototype.applyVisibilitySetting=function(e){return this._visibility!==o.ScrollbarVisibility.Hidden&&(this._visibility===o.ScrollbarVisibility.Visible||e)},t.prototype.setShouldBeVisible=function(e){var t=this.applyVisibilitySetting(e);this._shouldBeVisible!==t&&(this._shouldBeVisible=t,this.ensureVisibility())},t.prototype.setIsNeeded=function(e){this._isNeeded!==e&&(this._isNeeded=e,this.ensureVisibility())},t.prototype.setDomNode=function(e){this._domNode=e,this._domNode.setClassName(this._invisibleClassName),this.setShouldBeVisible(!1)},t.prototype.ensureVisibility=function(){this._isNeeded?this._shouldBeVisible?this._reveal():this._hide(!0):this._hide(!1)},t.prototype._reveal=function(){var e=this;this._isVisible||(this._isVisible=!0,this._revealTimer.setIfNotSet(function(){e._domNode.setClassName(e._visibleClassName)},0))},t.prototype._hide=function(e){this._revealTimer.cancel(),this._isVisible&&(this._isVisible=!1,this._domNode.setClassName(this._invisibleClassName+(e?" fade":"")))},t}(n.Disposable);t.ScrollbarVisibilityController=r}),define(d[184],h([1,0,15,4,83,41,27,117,429]),function(e,t,n,i,o,r,s,a,u){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var l=function(e){function t(t){var n=e.call(this)||this;return n._lazyRender=t.lazyRender,n._host=t.host,n._scrollable=t.scrollable,n._scrollbarState=t.scrollbarState,n._visibilityController=n._register(new u.ScrollbarVisibilityController(t.visibility,"visible scrollbar "+t.extraScrollbarClassName,"invisible scrollbar "+t.extraScrollbarClassName)),n._mouseMoveMonitor=n._register(new o.GlobalMouseMoveMonitor),n._shouldRender=!0,n.domNode=s.createFastDomNode(document.createElement("div")),n.domNode.setAttribute("role","presentation"),n.domNode.setAttribute("aria-hidden","true"),n._visibilityController.setDomNode(n.domNode),n.domNode.setPosition("absolute"),n.onmousedown(n.domNode.domNode,function(e){return n._domNodeMouseDown(e)}),n}return f(t,e),t.prototype._createArrow=function(e){var t=this._register(new a.ScrollbarArrow(e));this.domNode.domNode.appendChild(t.bgDomNode),this.domNode.domNode.appendChild(t.domNode)},t.prototype._createSlider=function(e,t,n,i){var o=this;this.slider=s.createFastDomNode(document.createElement("div")),this.slider.setClassName("slider"),this.slider.setPosition("absolute"),this.slider.setTop(e),this.slider.setLeft(t),this.slider.setWidth(n),this.slider.setHeight(i),this.slider.setLayerHinting(!0),this.domNode.domNode.appendChild(this.slider.domNode),this.onmousedown(this.slider.domNode,function(e){e.leftButton&&(e.preventDefault(),o._sliderMouseDown(e,function(){}))})},t.prototype._onElementSize=function(e){return this._scrollbarState.setVisibleSize(e)&&(this._visibilityController.setIsNeeded(this._scrollbarState.isNeeded()),this._shouldRender=!0,this._lazyRender||this.render()),this._shouldRender},t.prototype._onElementScrollSize=function(e){return this._scrollbarState.setScrollSize(e)&&(this._visibilityController.setIsNeeded(this._scrollbarState.isNeeded()),this._shouldRender=!0,this._lazyRender||this.render()),this._shouldRender},t.prototype._onElementScrollPosition=function(e){return this._scrollbarState.setScrollPosition(e)&&(this._visibilityController.setIsNeeded(this._scrollbarState.isNeeded()),this._shouldRender=!0,this._lazyRender||this.render()),this._shouldRender},t.prototype.beginReveal=function(){this._visibilityController.setShouldBeVisible(!0)},t.prototype.beginHide=function(){this._visibilityController.setShouldBeVisible(!1)},t.prototype.render=function(){this._shouldRender&&(this._shouldRender=!1,this._renderDomNode(this._scrollbarState.getRectangleLargeSize(),this._scrollbarState.getRectangleSmallSize()),this._updateSlider(this._scrollbarState.getSliderSize(),this._scrollbarState.getArrowSize()+this._scrollbarState.getSliderPosition()))},t.prototype._domNodeMouseDown=function(e){e.target===this.domNode.domNode&&this._onMouseDown(e)},t.prototype.delegateMouseDown=function(e){var t=this.domNode.domNode.getClientRects()[0].top,n=t+this._scrollbarState.getSliderPosition(),i=t+this._scrollbarState.getSliderPosition()+this._scrollbarState.getSliderSize(),o=this._sliderMousePosition(e);n<=o&&o<=i?e.leftButton&&(e.preventDefault(),this._sliderMouseDown(e,function(){})):this._onMouseDown(e)},t.prototype.delegateSliderMouseDown=function(e,t){this._sliderMouseDown(e,t)},t.prototype._onMouseDown=function(e){var t=i.getDomNodePagePosition(this.domNode.domNode);this.setDesiredScrollPosition(this._scrollbarState.getDesiredScrollPositionFromOffset(this._mouseDownRelativePosition(e,t))),e.leftButton&&(e.preventDefault(),this._sliderMouseDown(e,function(){}))},t.prototype._sliderMouseDown=function(e,t){var i=this,r=this._sliderMousePosition(e),s=this._sliderOrthogonalMousePosition(e),a=this._scrollbarState.clone();this.slider.toggleClassName("active",!0),this._mouseMoveMonitor.startMonitoring(o.standardMouseMoveMerger,function(e){var t=i._sliderOrthogonalMousePosition(e),o=Math.abs(t-s);if(n.isWindows&&o>140)i.setDesiredScrollPosition(a.getScrollPosition());else{var u=i._sliderMousePosition(e)-r;i.setDesiredScrollPosition(a.getDesiredScrollPositionFromDelta(u))}},function(){i.slider.toggleClassName("active",!1),i._host.onDragEnd(),t()}),this._host.onDragStart()},t.prototype.setDesiredScrollPosition=function(e){e=this.validateScrollPosition(e);var t=this._getScrollPosition();return this._setScrollPosition(e),t!==this._getScrollPosition()&&(this._onElementScrollPosition(this._getScrollPosition()),!0)},t}(r.Widget);t.AbstractScrollbar=l}),define(d[439],h([1,0,184,47,48,150,117]),function(e,t,n,i,o,r,s){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var a=function(e){function t(t,n,a){var u=e.call(this,{lazyRender:n.lazyRender,host:a,scrollbarState:new r.ScrollbarState(n.horizontalHasArrows?n.arrowSize:0,n.horizontal===o.ScrollbarVisibility.Hidden?0:n.horizontalScrollbarSize,n.vertical===o.ScrollbarVisibility.Hidden?0:n.verticalScrollbarSize),visibility:n.horizontal,extraScrollbarClassName:"horizontal",scrollable:t})||this;if(n.horizontalHasArrows){var l=(n.arrowSize-s.ARROW_IMG_SIZE)/2,c=(n.horizontalScrollbarSize-s.ARROW_IMG_SIZE)/2;u._createArrow({className:"left-arrow",top:c,left:l,bottom:void 0,right:void 0,bgWidth:n.arrowSize,bgHeight:n.horizontalScrollbarSize,onActivate:function(){return u._host.onMouseWheel(new i.StandardMouseWheelEvent(null,1,0))}}),u._createArrow({className:"right-arrow",top:c,left:void 0,bottom:void 0,right:l,bgWidth:n.arrowSize,bgHeight:n.horizontalScrollbarSize,onActivate:function(){return u._host.onMouseWheel(new i.StandardMouseWheelEvent(null,-1,0))}})}return u._createSlider(Math.floor((n.horizontalScrollbarSize-n.horizontalSliderSize)/2),0,null,n.horizontalSliderSize),u}return f(t,e),t.prototype._updateSlider=function(e,t){this.slider.setWidth(e),this.slider.setLeft(t)},t.prototype._renderDomNode=function(e,t){this.domNode.setWidth(e),this.domNode.setHeight(t),this.domNode.setLeft(0),this.domNode.setBottom(0)},t.prototype.onDidScroll=function(e){return this._shouldRender=this._onElementScrollSize(e.scrollWidth)||this._shouldRender,this._shouldRender=this._onElementScrollPosition(e.scrollLeft)||this._shouldRender,this._shouldRender=this._onElementSize(e.width)||this._shouldRender,this._shouldRender},t.prototype._mouseDownRelativePosition=function(e,t){return e.posx-t.left},t.prototype._sliderMousePosition=function(e){return e.posx},t.prototype._sliderOrthogonalMousePosition=function(e){return e.posy},t.prototype._getScrollPosition=function(){return this._scrollable.getState().scrollLeft},t.prototype._setScrollPosition=function(e){this._scrollable.updateState({scrollLeft:e})},t.prototype.validateScrollPosition=function(e){return this._scrollable.validateScrollLeft(e)},t}(n.AbstractScrollbar);t.HorizontalScrollbar=a}),define(d[440],h([1,0,184,47,48,150,117]),function(e,t,n,i,o,r,s){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var a=function(e){function t(t,n,a){var u=e.call(this,{lazyRender:n.lazyRender,host:a,scrollbarState:new r.ScrollbarState(n.verticalHasArrows?n.arrowSize:0,n.vertical===o.ScrollbarVisibility.Hidden?0:n.verticalScrollbarSize,0),visibility:n.vertical,extraScrollbarClassName:"vertical",scrollable:t})||this;if(n.verticalHasArrows){var l=(n.arrowSize-s.ARROW_IMG_SIZE)/2,c=(n.verticalScrollbarSize-s.ARROW_IMG_SIZE)/2;u._createArrow({className:"up-arrow",top:l,left:c,bottom:void 0,right:void 0,bgWidth:n.verticalScrollbarSize,bgHeight:n.arrowSize,onActivate:function(){return u._host.onMouseWheel(new i.StandardMouseWheelEvent(null,0,1))}}),u._createArrow({className:"down-arrow",top:void 0,left:c,bottom:l,right:void 0,bgWidth:n.verticalScrollbarSize,bgHeight:n.arrowSize,onActivate:function(){return u._host.onMouseWheel(new i.StandardMouseWheelEvent(null,0,-1))}})}return u._createSlider(0,Math.floor((n.verticalScrollbarSize-n.verticalSliderSize)/2),n.verticalSliderSize,null),u}return f(t,e),t.prototype._updateSlider=function(e,t){this.slider.setHeight(e),this.slider.setTop(t)},t.prototype._renderDomNode=function(e,t){this.domNode.setWidth(t),this.domNode.setHeight(e),this.domNode.setRight(0),this.domNode.setTop(0)},t.prototype.onDidScroll=function(e){return this._shouldRender=this._onElementScrollSize(e.scrollHeight)||this._shouldRender,this._shouldRender=this._onElementScrollPosition(e.scrollTop)||this._shouldRender,this._shouldRender=this._onElementSize(e.height)||this._shouldRender,this._shouldRender},t.prototype._mouseDownRelativePosition=function(e,t){return e.posy-t.top},t.prototype._sliderMousePosition=function(e){return e.posy},t.prototype._sliderOrthogonalMousePosition=function(e){return e.posx},t.prototype._getScrollPosition=function(){return this._scrollable.getState().scrollTop},t.prototype._setScrollPosition=function(e){this._scrollable.updateState({scrollTop:e})},t.prototype.validateScrollPosition=function(e){return this._scrollable.validateScrollTop(e)},t}(n.AbstractScrollbar);t.VerticalScrollbar=a}),define(d[197],h([1,0,10,3,7,18,15]),function(e,t,n,i,o,r,s){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var a="$initialize",u=!1;t.logOnceWebWorkerWarning=function(e){s.isWeb&&(u||(u=!0,console.warn("Could not create web worker(s). Falling back to loading web worker code in main thread, which might cause UI freezes. Please see https://github.com/Microsoft/monaco-editor#faq")),console.warn(e.message))};var l=function(){function e(e){this._workerId=-1,this._handler=e,this._lastSentReq=0,this._pendingReplies=Object.create(null)}return e.prototype.setWorkerId=function(e){this._workerId=e},e.prototype.sendMessage=function(e,t){var n=String(++this._lastSentReq),i={c:null,e:null},r=new o.TPromise(function(e,t,n){i.c=e,i.e=t},function(){});return this._pendingReplies[n]=i,this._send({vsWorker:this._workerId,req:n,method:e,args:t}),r},e.prototype.handleMessage=function(e){var t;try{t=JSON.parse(e)}catch(e){}t.vsWorker&&(-1!==this._workerId&&t.vsWorker!==this._workerId||this._handleMessage(t))},e.prototype._handleMessage=function(e){var t=this;if(e.seq){var i=e;if(!this._pendingReplies[i.seq])return void console.warn("Got reply to unknown seq");var o=this._pendingReplies[i.seq];if(delete this._pendingReplies[i.seq],i.err){var r=i.err;return i.err.$isError&&((r=new Error).name=i.err.name,r.message=i.err.message,r.stack=i.err.stack),void o.e(r)}o.c(i.res)}else{var s=e,a=s.req;this._handler.handleMessage(s.method,s.args).then(function(e){t._send({vsWorker:t._workerId,seq:a,res:e,err:void 0})},function(e){t._send({vsWorker:t._workerId,seq:a,res:void 0,err:n.transformErrorForSerialization(e)})})}},e.prototype._send=function(e){var t=JSON.stringify(e);this._handler.sendMessage(t)},e}(),c=function(e){function t(t,n){var i=e.call(this)||this;i._lastRequestTimestamp=-1;var r=null,s=null;i._worker=i._register(t.create("vs/base/common/worker/simpleWorker",function(e){i._protocol.handleMessage(e)},function(e){s(e)})),i._protocol=new l({sendMessage:function(e){i._worker.postMessage(e)},handleMessage:function(e,t){return o.TPromise.as(null)}}),i._protocol.setWorkerId(i._worker.getId());var u=null,c=self.require;"function"==typeof c.getConfig?u=c.getConfig():void 0!==self.requirejs&&(u=self.requirejs.s.contexts._.config),i._lazyProxy=new o.TPromise(function(e,t,n){r=e,s=t},function(){}),i._onModuleLoaded=i._protocol.sendMessage(a,[i._worker.getId(),n,u]),i._onModuleLoaded.then(function(e){for(var t={},n=0;n0},e.prototype.getChildren=function(e,t){var i=this.modelProvider.getModel();return n.TPromise.as(i===t?i.entries:[])},e.prototype.getParent=function(e,t){return n.TPromise.as(null)},e}();t.DataSource=o;var r=function(){function e(e){this.modelProvider=e}return e.prototype.getAriaLabel=function(e,t){var n=this.modelProvider.getModel();return n.accessibilityProvider&&n.accessibilityProvider.getAriaLabel(t)},e.prototype.getPosInSet=function(e,t){var n=this.modelProvider.getModel();return String(n.entries.indexOf(t)+1)},e.prototype.getSetSize=function(){var e=this.modelProvider.getModel();return String(e.entries.length)},e}();t.AccessibilityProvider=r;var s=function(){function e(e){this.modelProvider=e}return e.prototype.isVisible=function(e,t){var n=this.modelProvider.getModel();return!n.filter||n.filter.isVisible(t)},e}();t.Filter=s;var a=function(){function e(e,t){this.modelProvider=e,this.styles=t}return e.prototype.updateStyles=function(e){this.styles=e},e.prototype.getHeight=function(e,t){return this.modelProvider.getModel().renderer.getHeight(t)},e.prototype.getTemplateId=function(e,t){return this.modelProvider.getModel().renderer.getTemplateId(t)},e.prototype.renderTemplate=function(e,t,n){return this.modelProvider.getModel().renderer.renderTemplate(t,n,this.styles)},e.prototype.renderElement=function(e,t,n,i){this.modelProvider.getModel().renderer.renderElement(t,n,i,this.styles)},e.prototype.disposeTemplate=function(e,t,n){this.modelProvider.getModel().renderer.disposeTemplate(t,n)},e}();t.Renderer=a}),define(d[100],h([1,0]),function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0});!function(e){e[e.PREVIEW=0]="PREVIEW",e[e.OPEN=1]="OPEN",e[e.OPEN_IN_BACKGROUND=2]="OPEN_IN_BACKGROUND"}(t.Mode||(t.Mode={}))}),define(d[448],h([1,0]),function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=function(){function e(e,t,n){this._posx=e,this._posy=t,this._target=n}return e.prototype.preventDefault=function(){},e.prototype.stopPropagation=function(){},Object.defineProperty(e.prototype,"posx",{get:function(){return this._posx},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"posy",{get:function(){return this._posy},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"target",{get:function(){return this._target},enumerable:!0,configurable:!0}),e}();t.ContextMenuEvent=n;var i=function(e){function t(t){var n=e.call(this,t.posx,t.posy,t.target)||this;return n.originalEvent=t,n}return f(t,e),t.prototype.preventDefault=function(){this.originalEvent.preventDefault()},t.prototype.stopPropagation=function(){this.originalEvent.stopPropagation()},t}(n);t.MouseContextMenuEvent=i;var o=function(e){function t(t,n,i){var o=e.call(this,t,n,i.target)||this;return o.originalEvent=i,o}return f(t,e),t.prototype.preventDefault=function(){this.originalEvent.preventDefault()},t.prototype.stopPropagation=function(){this.originalEvent.stopPropagation()},t}(n);t.KeyboardContextMenuEvent=o;var r;!function(e){e[e.COPY=0]="COPY",e[e.MOVE=1]="MOVE"}(r=t.DragOverEffect||(t.DragOverEffect={}));var s;!function(e){e[e.BUBBLE_DOWN=0]="BUBBLE_DOWN",e[e.BUBBLE_UP=1]="BUBBLE_UP"}(s=t.DragOverBubble||(t.DragOverBubble={})),t.DRAG_OVER_REJECT={accept:!1},t.DRAG_OVER_ACCEPT={accept:!0},t.DRAG_OVER_ACCEPT_BUBBLE_UP={accept:!0,bubble:s.BUBBLE_UP},t.DRAG_OVER_ACCEPT_BUBBLE_DOWN=function(e){return void 0===e&&(e=!1),{accept:!0,bubble:s.BUBBLE_DOWN,autoExpand:e}},t.DRAG_OVER_ACCEPT_BUBBLE_UP_COPY={accept:!0,bubble:s.BUBBLE_UP,effect:r.COPY},t.DRAG_OVER_ACCEPT_BUBBLE_DOWN_COPY=function(e){return void 0===e&&(e=!1),{accept:!0,bubble:s.BUBBLE_DOWN,effect:r.COPY,autoExpand:e}}}),define(d[461],h([1,0]),function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=function(){function e(e){this.elements=e}return e.prototype.update=function(e){},e.prototype.getData=function(){return this.elements},e}();t.ElementsDragAndDropData=n;var i=function(){function e(e){this.elements=e}return e.prototype.update=function(e){},e.prototype.getData=function(){return this.elements},e}();t.ExternalElementsDragAndDropData=i;var o=function(){function e(){this.types=[],this.files=[]}return e.prototype.update=function(e){e.dataTransfer.types&&(this.types=[],Array.prototype.push.apply(this.types,e.dataTransfer.types)),e.dataTransfer.files&&(this.files=[],Array.prototype.push.apply(this.files,e.dataTransfer.files),this.files=this.files.filter(function(e){return e.size||e.type}))},e.prototype.getData=function(){return{types:this.types,files:this.files}},e}();t.DesktopDragAndDropData=o}),define(d[466],h([1,0,72,10,3,33,38,7]),function(e,t,n,i,o,r,s,a){"use strict";function u(e,t){for(var n=e.getHierarchy(),i=t.getHierarchy(),o=n[r.commonPrefixLength(n,i)-1],s=o.getNavigator(),a=null,u=null,l=0,c=[];o&&(null===a||null===u);)c.push(o),o===e&&(a=l),o===t&&(u=l),l++,o=s.next();if(null===a||null===u)return[];var d=Math.min(a,u),h=Math.max(a,u);return c.slice(d,h+1)}Object.defineProperty(t,"__esModule",{value:!0});var l=function(e){function t(t){var n=e.call(this)||this;return n._item=t,n}return f(t,e),Object.defineProperty(t.prototype,"item",{get:function(){return this._item},enumerable:!0,configurable:!0}),t.prototype.dispose=function(){this.emit("unlock"),e.prototype.dispose.call(this)},t}(s.EventEmitter);t.LockData=l;var c=function(){function e(){this.locks=Object.create({})}return e.prototype.isLocked=function(e){return!!this.locks[e.id]},e.prototype.run=function(e,t){var n=this,i=this.getLock(e);if(i){var o;return new a.TPromise(function(r,s){o=i.addOneTimeListener("unlock",function(){return n.run(e,t).then(r,s)})},function(){o.dispose()})}var r;return new a.TPromise(function(i,o){if(e.isDisposed())return o(new Error("Item is disposed."));var s=n.locks[e.id]=new l(e);return r=t().then(function(t){return delete n.locks[e.id],s.dispose(),t}).then(i,o)},function(){return r.cancel()})},e.prototype.getLock=function(e){var t;for(t in this.locks){var n=this.locks[t];if(e.intersects(n.item))return n}return null},e}();t.Lock=c;var d=function(e){function t(){var t=e.call(this)||this;return t._isDisposed=!1,t.items={},t}return f(t,e),t.prototype.register=function(e){n.ok(!this.isRegistered(e.id),"item already registered: "+e.id),this.items[e.id]={item:e,disposable:this.addEmitter(e)}},t.prototype.deregister=function(e){n.ok(this.isRegistered(e.id),"item not registered: "+e.id),this.items[e.id].disposable.dispose(),delete this.items[e.id]},t.prototype.isRegistered=function(e){return this.items.hasOwnProperty(e)},t.prototype.getItem=function(e){var t=this.items[e];return t?t.item:null},t.prototype.dispose=function(){e.prototype.dispose.call(this),this.items=null,this._isDisposed=!0},t.prototype.isDisposed=function(){return this._isDisposed},t}(s.EventEmitter);t.ItemRegistry=d;var h=function(e){function t(t,n,i,o,r){var s=e.call(this)||this;return s.registry=n,s.context=i,s.lock=o,s.element=r,s.id=t,s.registry.register(s),s.doesHaveChildren=s.context.dataSource.hasChildren(s.context.tree,s.element),s.needsChildrenRefresh=!0,s.parent=null,s.previous=null,s.next=null,s.firstChild=null,s.lastChild=null,s.userContent=null,s.traits={},s.depth=0,s.expanded=s.context.dataSource.shouldAutoexpand&&s.context.dataSource.shouldAutoexpand(s.context.tree,r),s.emit("item:create",{item:s}),s.visible=s._isVisible(),s.height=s._getHeight(),s._isDisposed=!1,s}return f(t,e),t.prototype.getElement=function(){return this.element},t.prototype.hasChildren=function(){return this.doesHaveChildren},t.prototype.getDepth=function(){return this.depth},t.prototype.isVisible=function(){return this.visible},t.prototype.setVisible=function(e){this.visible=e},t.prototype.isExpanded=function(){return this.expanded},t.prototype._setExpanded=function(e){this.expanded=e},t.prototype.reveal=function(e){void 0===e&&(e=null);var t={item:this,relativeTop:e};this.emit("item:reveal",t)},t.prototype.expand=function(){var e=this;return this.isExpanded()||!this.doesHaveChildren||this.lock.isLocked(this)?a.TPromise.as(!1):this.lock.run(this,function(){var t={item:e};return e.emit("item:expanding",t),(e.needsChildrenRefresh?e.refreshChildren(!1,!0,!0):a.TPromise.as(null)).then(function(){return e._setExpanded(!0),e.emit("item:expanded",t),!0})}).then(function(t){return!e.isDisposed()&&(e.context.options.autoExpandSingleChildren&&t&&null!==e.firstChild&&e.firstChild===e.lastChild&&e.firstChild.isVisible()?e.firstChild.expand().then(function(){return!0}):t)})},t.prototype.collapse=function(e){var t=this;if(void 0===e&&(e=!1),e){var n=a.TPromise.as(null);return this.forEachChild(function(e){n=n.then(function(){return e.collapse(!0)})}),n.then(function(){return t.collapse(!1)})}return!this.isExpanded()||this.lock.isLocked(this)?a.TPromise.as(!1):this.lock.run(this,function(){var e={item:t};return t.emit("item:collapsing",e),t._setExpanded(!1),t.emit("item:collapsed",e),a.TPromise.as(!0)})},t.prototype.addTrait=function(e){var t={item:this,trait:e};this.traits[e]=!0,this.emit("item:addTrait",t)},t.prototype.removeTrait=function(e){var t={item:this,trait:e};delete this.traits[e],this.emit("item:removeTrait",t)},t.prototype.hasTrait=function(e){return this.traits[e]||!1},t.prototype.getAllTraits=function(){var e,t=[];for(e in this.traits)this.traits.hasOwnProperty(e)&&this.traits[e]&&t.push(e);return t},t.prototype.getHeight=function(){return this.height},t.prototype.refreshChildren=function(e,n,o){var r=this;if(void 0===n&&(n=!1),void 0===o&&(o=!1),!o&&!this.isExpanded())return this.needsChildrenRefresh=!0,a.TPromise.as(this);this.needsChildrenRefresh=!1;var s=function(){var o={item:r,isNested:n};r.emit("item:childrenRefreshing",o);return(r.doesHaveChildren?r.context.dataSource.getChildren(r.context.tree,r.element):a.TPromise.as([])).then(function(n){if(r.isDisposed()||r.registry.isDisposed())return a.TPromise.as(null);if(!Array.isArray(n))return a.TPromise.wrapError(new Error("Please return an array of children."));n=n?n.slice(0):[],n=r.sort(n);for(var i={};null!==r.firstChild;)i[r.firstChild.id]=r.firstChild,r.removeChild(r.firstChild);for(var o=0,s=n.length;o0?o[0]:this.input,s=this.getNavigator(r,!1),a=0;a0?n[0]:this.input,o=this.getNavigator(i,!1).parent();o&&(t?this.setSelection([o],e):this.select(o,e))},t.prototype.setFocus=function(e,t){this.setTraits("focused",e?[e]:[]);var n={focus:this.getFocus(),payload:t};this.emit("focus",n)},t.prototype.isFocused=function(e){var t=this.getItem(e);return!!t&&t.hasTrait("focused")},t.prototype.getFocus=function(e){var t=this.getElementsWithTrait("focused",e);return 0===t.length?null:t[0]},t.prototype.focusNext=function(e,t){void 0===e&&(e=1);for(var n,i=this.getFocus()||this.input,o=this.getNavigator(i,!1),r=0;r=0;r--)this.onInsertItem(l[r]);for(r=this.heightMap.length-1;r>=o;r--)this.onRefreshItem(this.heightMap[r]);return a},t.prototype.onInsertItem=function(e){},t.prototype.onRemoveItems=function(e){for(var t,n,i,o=null,r=0;t=e.next();){if(i=this.indexes[t],!(n=this.heightMap[i]))return void console.error("view item doesnt exist");r-=n.height,delete this.indexes[t],this.onRemoveItem(n),null===o&&(o=i)}if(0!==r)for(this.heightMap.splice(o,i-o+1),i=o;i=n.top+n.height))return t;if(i===t)break;i=t}return this.heightMap.length},t.prototype.indexAfter=function(e){return Math.min(this.indexAt(e)+1,this.heightMap.length)},t.prototype.itemAtIndex=function(e){return this.heightMap[e]},t.prototype.itemAfter=function(e){return this.heightMap[this.indexes[e.model.id]+1]||null},t.prototype.createViewItem=function(e){throw new Error("not implemented")},t.prototype.dispose=function(){this.heightMap=null,this.indexes=null},t}(n.EventEmitter);t.HeightMap=o}),define(d[473],h([1,0,15,197]),function(e,t,n,i){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var o=function(e,t){return void 0===t&&(t=!1),n.globals.MonacoEnvironment&&n.globals.MonacoEnvironment.hasOwnProperty(e)?n.globals.MonacoEnvironment[e]:t}("getWorkerUrl",null)||function(t,n){return e.toUrl("./"+t)+"#"+n},r=function(){function e(e,t,n,i,r){this.id=t,this.worker=new Worker(o("workerMain.js",n)),this.postMessage(e),this.worker.onmessage=function(e){i(e.data)},"function"==typeof this.worker.addEventListener&&this.worker.addEventListener("error",r)}return e.prototype.getId=function(){return this.id},e.prototype.postMessage=function(e){this.worker&&this.worker.postMessage(e)},e.prototype.dispose=function(){this.worker.terminate(),this.worker=null},e}(),s=function(){function e(e){this._label=e,this._webWorkerFailedBeforeError=!1}return e.prototype.create=function(t,n,o){var s=this,a=++e.LAST_WORKER_ID;if(this._webWorkerFailedBeforeError)throw this._webWorkerFailedBeforeError;return new r(t,a,this._label||"anonymous"+a,n,function(e){i.logOnceWebWorkerWarning(e),s._webWorkerFailedBeforeError=e,o(e)})},e.LAST_WORKER_ID=0,e}();t.DefaultWorkerFactory=s}),define(d[484],h([5]),{}),define(d[52],h([1,0,7,29,3,9,72,4,484]),function(e,t,n,i,o,r,s,a){"use strict";function u(e,t){s.ok(i.isString(e),"Expected String as parameter");var n=document.getElementById(e);return n?new x(n,t):null}function l(e){return e[b]||(e[b]={}),e[b]}function c(e){return!!e[b]}function d(e,t){return e instanceof N?new N(e):new x(e.getHTMLElement(),t)}function h(e,t){return new x(e,t)}function p(){return new x(null,!0)}function g(e,t,n){l(e)[t]=n}function m(e,t,n){if(c(e)){var o=l(e)[t];if(!i.isUndefined(o))return o}return n}function v(e,t){c(e)&&delete l(e)[t]}function _(e,t){g(e,w,t)}function y(e){v(e,w)}function C(e){return m(e,w)}Object.defineProperty(t,"__esModule",{value:!0}),t.withElementById=u,t.Build={withElementById:u};var b="_msDataKey",w="__$binding",S=function(){return function(e,t){this.x=e,this.y=t}}();t.Position=S;var E=function(){return function(e,t,n,i){this.top=e,this.right=t,this.bottom=n,this.left=i}}();t.Box=E;var L=function(){function e(e,t){this.width=e,this.height=t}return e.prototype.substract=function(t){return new e(this.width-t.left-t.right,this.height-t.top-t.bottom)},e}();t.Dimension=L;var x=function(){function e(e,t){this.offdom=t,this.container=e,this.currentElement=e,this.createdElements=[],this.toUnbind={},this.captureToUnbind={}}return e.prototype.asContainer=function(){return d(this,this.offdom)},e.prototype.clone=function(){var t=new e(this.container,this.offdom);return t.currentElement=this.currentElement,t.createdElements=this.createdElements,t.captureToUnbind=this.captureToUnbind,t.toUnbind=this.toUnbind,t},e.prototype.and=function(t){t instanceof e||t instanceof N||(t=new e(t,this.offdom));var n=[this];if(t instanceof N)for(var i=0;i=0){var n=e.split("-");e=n[0];for(var i=1;i=0){var t=e.split("-");e=t[0];for(var n=1;n=0?this.padding.apply(this,e.split(" ")):(i.isUndefinedOrNull(e)||(this.currentElement.style.paddingTop=this.toPixel(e)),i.isUndefinedOrNull(t)||(this.currentElement.style.paddingRight=this.toPixel(t)),i.isUndefinedOrNull(n)||(this.currentElement.style.paddingBottom=this.toPixel(n)),i.isUndefinedOrNull(o)||(this.currentElement.style.paddingLeft=this.toPixel(o)),this)},e.prototype.margin=function(e,t,n,o){return i.isString(e)&&e.indexOf(" ")>=0?this.margin.apply(this,e.split(" ")):(i.isUndefinedOrNull(e)||(this.currentElement.style.marginTop=this.toPixel(e)),i.isUndefinedOrNull(t)||(this.currentElement.style.marginRight=this.toPixel(t)),i.isUndefinedOrNull(n)||(this.currentElement.style.marginBottom=this.toPixel(n)),i.isUndefinedOrNull(o)||(this.currentElement.style.marginLeft=this.toPixel(o)),this)},e.prototype.position=function(e,t,n,o,r){return i.isString(e)&&e.indexOf(" ")>=0?this.position.apply(this,e.split(" ")):(i.isUndefinedOrNull(e)||(this.currentElement.style.top=this.toPixel(e)),i.isUndefinedOrNull(t)||(this.currentElement.style.right=this.toPixel(t)),i.isUndefinedOrNull(n)||(this.currentElement.style.bottom=this.toPixel(n)),i.isUndefinedOrNull(o)||(this.currentElement.style.left=this.toPixel(o)),r||(r="absolute"),this.currentElement.style.position=r,this)},e.prototype.size=function(e,t){return i.isString(e)&&e.indexOf(" ")>=0?this.size.apply(this,e.split(" ")):(i.isUndefinedOrNull(e)||(this.currentElement.style.width=this.toPixel(e)),i.isUndefinedOrNull(t)||(this.currentElement.style.height=this.toPixel(t)),this)},e.prototype.minSize=function(e,t){return i.isString(e)&&e.indexOf(" ")>=0?this.minSize.apply(this,e.split(" ")):(i.isUndefinedOrNull(e)||(this.currentElement.style.minWidth=this.toPixel(e)),i.isUndefinedOrNull(t)||(this.currentElement.style.minHeight=this.toPixel(t)),this)},e.prototype.maxSize=function(e,t){return i.isString(e)&&e.indexOf(" ")>=0?this.maxSize.apply(this,e.split(" ")):(i.isUndefinedOrNull(e)||(this.currentElement.style.maxWidth=this.toPixel(e)),i.isUndefinedOrNull(t)||(this.currentElement.style.maxHeight=this.toPixel(t)),this)},e.prototype.float=function(e){return this.currentElement.style.cssFloat=e,this},e.prototype.clear=function(e){return this.currentElement.style.clear=e,this},e.prototype.normal=function(){return this.currentElement.style.fontStyle="normal",this.currentElement.style.fontWeight="normal",this.currentElement.style.textDecoration="none",this},e.prototype.italic=function(){return this.currentElement.style.fontStyle="italic",this},e.prototype.bold=function(){return this.currentElement.style.fontWeight="bold",this},e.prototype.underline=function(){return this.currentElement.style.textDecoration="underline",this},e.prototype.overflow=function(e){return this.currentElement.style.overflow=e,this},e.prototype.display=function(e){return this.currentElement.style.display=e,this},e.prototype.disable=function(){return this.currentElement.setAttribute("disabled","disabled"),this},e.prototype.enable=function(){return this.currentElement.removeAttribute("disabled"),this},e.prototype.show=function(){return this.hasClass("builder-hidden")&&this.removeClass("builder-hidden"),this.attr("aria-hidden","false"),this.cancelVisibilityPromise(),this},e.prototype.showDelayed=function(e){var t=this;this.cancelVisibilityPromise();var i=n.TPromise.timeout(e);return this.setProperty("__$visibility",i),i.done(function(){t.removeProperty("__$visibility"),t.show()}),this},e.prototype.hide=function(){return this.hasClass("builder-hidden")||this.addClass("builder-hidden"),this.attr("aria-hidden","true"),this.cancelVisibilityPromise(),this},e.prototype.isHidden=function(){return this.hasClass("builder-hidden")||"none"===this.currentElement.style.display},e.prototype.toggleVisibility=function(){return this.cancelVisibilityPromise(),this.swapClass("builder-visible","builder-hidden"),this.isHidden()?this.attr("aria-hidden","true"):this.attr("aria-hidden","false"),this},e.prototype.cancelVisibilityPromise=function(){var e=this.getProperty("__$visibility");e&&(e.cancel(),this.removeProperty("__$visibility"))},e.prototype.border=function(e,t,n){return i.isString(e)&&e.indexOf(" ")>=0?this.border.apply(this,e.split(" ")):(this.currentElement.style.borderWidth=this.toPixel(e),n&&(this.currentElement.style.borderColor=n),t&&(this.currentElement.style.borderStyle=t),this)},e.prototype.borderTop=function(e,t,n){return i.isString(e)&&e.indexOf(" ")>=0?this.borderTop.apply(this,e.split(" ")):(this.currentElement.style.borderTopWidth=this.toPixel(e),n&&(this.currentElement.style.borderTopColor=n),t&&(this.currentElement.style.borderTopStyle=t),this)},e.prototype.borderBottom=function(e,t,n){return i.isString(e)&&e.indexOf(" ")>=0?this.borderBottom.apply(this,e.split(" ")):(this.currentElement.style.borderBottomWidth=this.toPixel(e),n&&(this.currentElement.style.borderBottomColor=n),t&&(this.currentElement.style.borderBottomStyle=t),this)},e.prototype.borderLeft=function(e,t,n){return i.isString(e)&&e.indexOf(" ")>=0?this.borderLeft.apply(this,e.split(" ")):(this.currentElement.style.borderLeftWidth=this.toPixel(e),n&&(this.currentElement.style.borderLeftColor=n),t&&(this.currentElement.style.borderLeftStyle=t),this)},e.prototype.borderRight=function(e,t,n){return i.isString(e)&&e.indexOf(" ")>=0?this.borderRight.apply(this,e.split(" ")):(this.currentElement.style.borderRightWidth=this.toPixel(e),n&&(this.currentElement.style.borderRightColor=n),t&&(this.currentElement.style.borderRightStyle=t),this)},e.prototype.textAlign=function(e){return this.currentElement.style.textAlign=e,this},e.prototype.verticalAlign=function(e){return this.currentElement.style.verticalAlign=e,this},e.prototype.toPixel=function(e){return-1===e.toString().indexOf("px")?e.toString()+"px":e},e.prototype.innerHtml=function(e,t){return t?this.currentElement.innerHTML+=e:this.currentElement.innerHTML=e,this},e.prototype.text=function(e,t){return t?0===this.currentElement.children.length?this.currentElement.textContent+=e:this.currentElement.appendChild(document.createTextNode(e)):this.currentElement.textContent=e,this},e.prototype.safeInnerHtml=function(e,t){return this.innerHtml(r.escape(e),t)},e.prototype.bind=function(e){return _(this.currentElement,e),this},e.prototype.unbind=function(){return y(this.currentElement),this},e.prototype.getBinding=function(){return C(this.currentElement)},e.prototype.setProperty=function(e,t){return g(this.currentElement,e,t),this},e.prototype.getProperty=function(e,t){return m(this.currentElement,e,t)},e.prototype.removeProperty=function(e){return c(this.currentElement)&&delete l(this.currentElement)[e],this},e.prototype.parent=function(e){return s.ok(!this.offdom,"Builder was created with offdom = true and thus has no parent set"),h(this.currentElement.parentNode,e)},e.prototype.children=function(e){for(var t=this.currentElement.children,n=[],i=0;i=n.top&&o+e.height<=n.top+n.height,l=r>=n.top&&r+e.height<=n.top+n.height;return s(o,a,r,l,i===u.ABOVE)}(),left:function(){var i=t.left,r=t.left+t.width-e.width,u=i>=n.left&&i+e.width<=n.left+n.width,l=r>=n.left&&r+e.width<=n.left+n.width;return s(i,u,r,l,o===a.LEFT)}()}}Object.defineProperty(t,"__esModule",{value:!0});var a;!function(e){e[e.LEFT=0]="LEFT",e[e.RIGHT=1]="RIGHT"}(a=t.AnchorAlignment||(t.AnchorAlignment={}));var u;!function(e){e[e.BELOW=0]="BELOW",e[e.ABOVE=1]="ABOVE"}(u=t.AnchorPosition||(t.AnchorPosition={}));var l=function(e){function t(t){var i=e.call(this)||this;return i.$view=n.$(".context-view").hide(),i.setContainer(t),i.toDispose=[{dispose:function(){i.setContainer(null)}}],i.toDisposeOnClean=null,i}return f(t,e),t.prototype.setContainer=function(e){var i=this;this.$container&&(this.$container.off(t.BUBBLE_UP_EVENTS),this.$container.off(t.BUBBLE_DOWN_EVENTS,!0),this.$container=null),e&&(this.$container=n.$(e),this.$view.appendTo(this.$container),this.$container.on(t.BUBBLE_UP_EVENTS,function(e){i.onDOMEvent(e,document.activeElement,!1)}),this.$container.on(t.BUBBLE_DOWN_EVENTS,function(e){i.onDOMEvent(e,document.activeElement,!0)},null,!0))},t.prototype.show=function(e){this.isVisible()&&this.hide(),this.$view.setClass("context-view").empty().style({top:"0px",left:"0px"}).show(),this.toDisposeOnClean=e.render(this.$view.getHTMLElement()),this.delegate=e,this.doLayout()},t.prototype.layout=function(){this.isVisible()&&(!1!==this.delegate.canRelayout?(this.delegate.layout&&this.delegate.layout(),this.doLayout()):this.hide())},t.prototype.doLayout=function(){var e,t=this.delegate.getAnchor();if(i.isHTMLElement(t)){var n=i.getDomNodePagePosition(t);e={top:n.top,left:n.left,width:n.width,height:n.height}}else{var o=t;e={top:o.y,left:o.x,width:o.width||0,height:o.height||0}}var r={top:i.StandardWindow.scrollY,left:i.StandardWindow.scrollX,height:window.innerHeight,width:window.innerWidth},l=this.$view.getTotalSize(),c={width:l.width,height:l.height},d=this.delegate.anchorPosition||u.BELOW,h=this.delegate.anchorAlignment||a.LEFT,p=s(c,e,r,d,h),f=i.getDomNodePagePosition(this.$container.getHTMLElement());p.top-=f.top,p.left-=f.left,this.$view.removeClass("top","bottom","left","right"),this.$view.addClass(d===u.BELOW?"bottom":"top"),this.$view.addClass(h===a.LEFT?"left":"right"),this.$view.style({top:p.top+"px",left:p.left+"px",width:"initial"})},t.prototype.hide=function(e){this.delegate&&this.delegate.onHide&&this.delegate.onHide(e),this.delegate=null,this.toDisposeOnClean&&(this.toDisposeOnClean.dispose(),this.toDisposeOnClean=null),this.$view.hide()},t.prototype.isVisible=function(){return!!this.delegate},t.prototype.onDOMEvent=function(e,t,n){this.delegate&&(this.delegate.onDOMEvent?this.delegate.onDOMEvent(e,document.activeElement):n&&!i.isAncestor(e.target,this.$container.getHTMLElement())&&this.hide())},t.prototype.dispose=function(){e.prototype.dispose.call(this),this.hide(),this.toDispose=o.dispose(this.toDispose)},t.BUBBLE_UP_EVENTS=["click","keydown","focus","blur"],t.BUBBLE_DOWN_EVENTS=["click"],t}(r.EventEmitter);t.ContextView=l}),define(d[201],h([5]),{}),define(d[204],h([1,0,4,9,32,26,201]),function(e,t,n,i,o,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var s={badgeBackground:o.Color.fromHex("#4D4D4D"),badgeForeground:o.Color.fromHex("#FFFFFF")},a=function(){function e(e,t){this.options=t||Object.create(null),r.mixin(this.options,s,!1),this.badgeBackground=this.options.badgeBackground,this.badgeForeground=this.options.badgeForeground,this.badgeBorder=this.options.badgeBorder,this.element=n.append(e,n.$(".monaco-count-badge")),this.titleFormat=this.options.titleFormat||"",this.setCount(this.options.count||0)}return e.prototype.setCount=function(e){this.count=e,this.render()},e.prototype.setTitleFormat=function(e){this.titleFormat=e,this.render()},e.prototype.render=function(){this.element.textContent=""+this.count,this.element.title=i.format(this.titleFormat,this.count),this.applyStyles()},e.prototype.style=function(e){this.badgeBackground=e.badgeBackground,this.badgeForeground=e.badgeForeground,this.badgeBorder=e.badgeBorder,this.applyStyles()},e.prototype.applyStyles=function(){if(this.element){var e=this.badgeBackground?this.badgeBackground.toString():null,t=this.badgeForeground?this.badgeForeground.toString():null,n=this.badgeBorder?this.badgeBorder.toString():null;this.element.style.backgroundColor=e,this.element.style.color=t,this.element.style.borderWidth=n?"1px":null,this.element.style.borderStyle=n?"solid":null,this.element.style.borderColor=n}},e}();t.CountBadge=a}),define(d[205],h([5]),{}),define(d[206],h([5]),{}),define(d[208],h([5]),{}),define(d[162],h([1,0,4,110,45,174,208]),function(e,t,n,i,o,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var s=function(){function e(e,t){this.domNode=n.append(e,n.$(".monaco-icon-label")),t&&t.supportHighlights?this.labelNode=new i.HighlightedLabel(n.append(this.domNode,n.$("a.label-name"))):this.labelNode=n.append(this.domNode,n.$("a.label-name")),this.descriptionNode=n.append(this.domNode,n.$("span.label-description"))}return Object.defineProperty(e.prototype,"element",{get:function(){return this.domNode},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"labelElement",{get:function(){var e=this.labelNode;return e instanceof i.HighlightedLabel?e.element:e},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"descriptionElement",{get:function(){return this.descriptionNode},enumerable:!0,configurable:!0}),e.prototype.setValue=function(e,t,o){var r=this.labelNode;r instanceof i.HighlightedLabel?r.set(e||"",o?o.matches:void 0):r.textContent=e||"",this.descriptionNode.textContent=t||"",t?n.removeClass(this.descriptionNode,"empty"):n.addClass(this.descriptionNode,"empty"),this.domNode.title=o&&o.title?o.title:"";var s=["monaco-icon-label"];o&&(o.extraClasses&&s.push.apply(s,o.extraClasses),o.italic&&s.push("italic")),this.domNode.className=s.join(" ")},e.prototype.dispose=function(){var e=this.labelNode;e instanceof i.HighlightedLabel&&e.dispose()},e}();t.IconLabel=s;var a=function(e){function t(t,n,i,o){var r=e.call(this,t)||this;return r.setFile(n,i,o),r}return f(t,e),t.prototype.setFile=function(e,t,n){var i=o.dirname(e.fsPath);this.setValue(o.basename(e.fsPath),i&&"."!==i?r.getPathLabel(i,t,n):"",{title:e.fsPath})},t}(s);t.FileLabel=a}),define(d[211],h([5]),{}),define(d[212],h([5]),{}),define(d[213],h([5]),{}),define(d[218],h([5]),{}),define(d[219],h([5]),{}),define(d[220],h([1,0,7,72,52,4,3,32,26,219]),function(e,t,n,i,o,r,s,a,u){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var l={progressBarBackground:a.Color.fromHex("#0E70C0")},c=function(){function e(e,t){this.options=t||Object.create(null),u.mixin(this.options,l,!1),this.toUnbind=[],this.workedVal=0,this.progressBarBackground=this.options.progressBarBackground,this.create(e)}return e.prototype.create=function(e){var t=this;e.div({class:"progress-container"},function(e){t.element=e.clone(),e.div({class:"progress-bit"}).on([r.EventType.ANIMATION_START,r.EventType.ANIMATION_END,r.EventType.ANIMATION_ITERATION],function(e){switch(e.type){case r.EventType.ANIMATION_START:case r.EventType.ANIMATION_END:t.animationRunning=e.type===r.EventType.ANIMATION_START;break;case r.EventType.ANIMATION_ITERATION:t.animationStopToken&&t.animationStopToken(null)}},t.toUnbind),t.bit=e.getHTMLElement()}),this.applyStyles()},e.prototype.off=function(){this.bit.style.width="inherit",this.bit.style.opacity="1",this.element.removeClass("active"),this.element.removeClass("infinite"),this.element.removeClass("discrete"),this.workedVal=0,this.totalWork=void 0},e.prototype.done=function(){return this.doDone(!0)},e.prototype.stop=function(){return this.doDone(!1)},e.prototype.doDone=function(e){var t=this;return this.element.addClass("done"),this.element.hasClass("infinite")?(this.bit.style.opacity="0",e?n.TPromise.timeout(200).then(function(){return t.off()}):this.off()):(this.bit.style.width="inherit",e?n.TPromise.timeout(200).then(function(){return t.off()}):this.off()),this},e.prototype.infinite=function(){return this.bit.style.width="2%",this.bit.style.opacity="1",this.element.removeClass("discrete"),this.element.removeClass("done"),this.element.addClass("active"),this.element.addClass("infinite"),this},e.prototype.total=function(e){return this.workedVal=0,this.totalWork=e,this},e.prototype.hasTotal=function(){return!isNaN(this.totalWork)},e.prototype.worked=function(e){return i.ok(!isNaN(this.totalWork),"Total work not set"),e=Number(e),i.ok(!isNaN(e),"Value is not a number"),e=Math.max(1,e),this.workedVal+=e,this.workedVal=Math.min(this.totalWork,this.workedVal),this.element.hasClass("infinite")&&this.element.removeClass("infinite"),this.element.hasClass("done")&&this.element.removeClass("done"),this.element.hasClass("active")||this.element.addClass("active"),this.element.hasClass("discrete")||this.element.addClass("discrete"),this.bit.style.width=this.workedVal/this.totalWork*100+"%",this},e.prototype.getContainer=function(){return o.$(this.element)},e.prototype.style=function(e){this.progressBarBackground=e.progressBarBackground,this.applyStyles()},e.prototype.applyStyles=function(){if(this.bit){var e=this.progressBarBackground?this.progressBarBackground.toString():null;this.bit.style.backgroundColor=e}},e.prototype.dispose=function(){this.toUnbind=s.dispose(this.toUnbind)},e}();t.ProgressBar=c}),define(d[224],h([5]),{}),define(d[99],h([1,0,3,52,28,15,29,4,74,38,47,11,224]),function(e,t,n,i,o,r,s,a,u,l,c,d){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var h;!function(e){e[e.VERTICAL=0]="VERTICAL",e[e.HORIZONTAL=1]="HORIZONTAL"}(h=t.Orientation||(t.Orientation={}));var p=function(e){function t(t,n,s){void 0===s&&(s={});var l=e.call(this)||this;return l.$e=i.$(".monaco-sash").appendTo(t),r.isMacintosh&&l.$e.addClass("mac"),l.gesture=new u.Gesture(l.$e.getHTMLElement()),l.$e.on(a.EventType.MOUSE_DOWN,function(e){l.onMouseDown(e)}),l.$e.on(a.EventType.DBLCLICK,function(e){l.emit("reset",e)}),l.$e.on(u.EventType.Start,function(e){l.onTouchStart(e)}),l.size=s.baseSize||5,o.isIPad&&(l.size*=4,l.$e.addClass("touch")),l.setOrientation(s.orientation||h.VERTICAL),l.isDisabled=!1,l.hidden=!1,l.layoutProvider=n,l}return f(t,e),t.prototype.getHTMLElement=function(){return this.$e.getHTMLElement()},t.prototype.setOrientation=function(e){this.orientation=e,this.$e.removeClass("horizontal","vertical"),this.$e.addClass(this.getOrientation()),this.orientation===h.HORIZONTAL?this.$e.size(null,this.size):this.$e.size(this.size),this.layoutProvider&&this.layout()},t.prototype.getOrientation=function(){return this.orientation===h.HORIZONTAL?"horizontal":"vertical"},t.prototype.onMouseDown=function(e){var t=this;if(a.EventHelper.stop(e,!1),!this.isDisabled){var n=i.$(a.getElementsByTagName("iframe"));n&&n.style("pointer-events","none");var o=new c.StandardMouseEvent(e),s=o.posx,u=o.posy,l={startX:s,currentX:s,startY:u,currentY:u};this.$e.addClass("active"),this.emit("start",l);var d=i.$(window),h=this.getOrientation()+"-cursor-container"+(r.isMacintosh?"-mac":""),p=s,f=u;d.on("mousemove",function(e){a.EventHelper.stop(e,!1);var n=new c.StandardMouseEvent(e),i={startX:s,currentX:n.posx,startY:u,currentY:n.posy};p=n.posx,f=n.posy,t.emit("change",i)}).once("mouseup",function(e){a.EventHelper.stop(e,!1),t.$e.removeClass("active"),t.emit("end"),d.off("mousemove"),document.body.classList.remove(h);var n=i.$(a.getElementsByTagName("iframe"));n&&n.style("pointer-events","auto")}),document.body.classList.add(h)}},t.prototype.onTouchStart=function(e){var t=this;a.EventHelper.stop(e);var i=[],o=e.pageX,r=e.pageY;this.emit("start",{startX:o,currentX:o,startY:r,currentY:r});var l=o,c=r;i.push(a.addDisposableListener(this.$e.getHTMLElement(),u.EventType.Change,function(e){s.isNumber(e.pageX)&&s.isNumber(e.pageY)&&(t.emit("change",{startX:o,currentX:e.pageX,startY:r,currentY:e.pageY}),l=e.pageX,c=e.pageY)})),i.push(a.addDisposableListener(this.$e.getHTMLElement(),u.EventType.End,function(e){t.emit("end"),n.dispose(i)}))},t.prototype.layout=function(){var e;if(this.orientation===h.VERTICAL){var t=this.layoutProvider;e={left:t.getVerticalSashLeft(this)-this.size/2+"px"},t.getVerticalSashTop&&(e.top=t.getVerticalSashTop(this)+"px"),t.getVerticalSashHeight&&(e.height=t.getVerticalSashHeight(this)+"px")}else{var n=this.layoutProvider;e={top:n.getHorizontalSashTop(this)-this.size/2+"px"},n.getHorizontalSashLeft&&(e.left=n.getHorizontalSashLeft(this)+"px"),n.getHorizontalSashWidth&&(e.width=n.getHorizontalSashWidth(this)+"px")}this.$e.style(e)},t.prototype.show=function(){this.hidden=!1,this.$e.show()},t.prototype.hide=function(){this.hidden=!0,this.$e.hide()},t.prototype.isHidden=function(){return this.hidden},t.prototype.enable=function(){this.$e.removeClass("disabled"),this.isDisabled=!1},t.prototype.disable=function(){this.$e.addClass("disabled"),this.isDisabled=!0},t.prototype.dispose=function(){this.$e&&(this.$e.destroy(),this.$e=null),e.prototype.dispose.call(this)},t}(l.EventEmitter);t.Sash=p;var g=function(e){function t(t,n){var i=e.call(this)||this;return i.minWidth=n,i._onPositionChange=new d.Emitter,i.ratio=.5,i.sash=new p(t,i),i._register(i.sash.addListener("start",function(){return i.onSashDragStart()})),i._register(i.sash.addListener("change",function(e){return i.onSashDrag(e)})),i._register(i.sash.addListener("end",function(){return i.onSashDragEnd()})),i._register(i.sash.addListener("reset",function(){return i.onSashReset()})),i}return f(t,e),Object.defineProperty(t.prototype,"onPositionChange",{get:function(){return this._onPositionChange.event},enumerable:!0,configurable:!0}),t.prototype.getVerticalSashTop=function(){return 0},t.prototype.getVerticalSashLeft=function(){return this.position},t.prototype.getVerticalSashHeight=function(){return this.dimension.height},t.prototype.setDimenesion=function(e){this.dimension=e,this.compute(this.ratio)},t.prototype.onSashDragStart=function(){this.startPosition=this.position},t.prototype.onSashDrag=function(e){this.compute((this.startPosition+(e.currentX-e.startX))/this.dimension.width)},t.prototype.compute=function(e){this.computeSashPosition(e),this.ratio=this.position/this.dimension.width,this._onPositionChange.fire(this.position)},t.prototype.onSashDragEnd=function(){this.sash.layout()},t.prototype.onSashReset=function(){this.ratio=.5,this._onPositionChange.fire(this.position),this.sash.layout()},t.prototype.computeSashPosition=function(e){void 0===e&&(e=this.ratio);var t=this.dimension.width,n=Math.floor((e||.5)*t),i=Math.floor(.5*t);t>2*this.minWidth?(nt-this.minWidth&&(n=t-this.minWidth)):n=i,this.position!==n&&(this.position=n,this.sash.layout())},t}(n.Disposable);t.VSash=g}),define(d[228],h([5]),{}),define(d[63],h([1,0,4,15,47,439,440,3,48,41,18,27,11,228]),function(e,t,n,i,o,r,s,a,u,l,c,d,h){"use strict";function p(e){var t={lazyRender:void 0!==e.lazyRender&&e.lazyRender,className:void 0!==e.className?e.className:"",useShadows:void 0===e.useShadows||e.useShadows,handleMouseWheel:void 0===e.handleMouseWheel||e.handleMouseWheel,flipAxes:void 0!==e.flipAxes&&e.flipAxes,alwaysConsumeMouseWheel:void 0!==e.alwaysConsumeMouseWheel&&e.alwaysConsumeMouseWheel,scrollYToX:void 0!==e.scrollYToX&&e.scrollYToX,mouseWheelScrollSensitivity:void 0!==e.mouseWheelScrollSensitivity?e.mouseWheelScrollSensitivity:1,arrowSize:void 0!==e.arrowSize?e.arrowSize:11,listenOnDomNode:void 0!==e.listenOnDomNode?e.listenOnDomNode:null,horizontal:void 0!==e.horizontal?e.horizontal:u.ScrollbarVisibility.Auto,horizontalScrollbarSize:void 0!==e.horizontalScrollbarSize?e.horizontalScrollbarSize:10,horizontalSliderSize:void 0!==e.horizontalSliderSize?e.horizontalSliderSize:0,horizontalHasArrows:void 0!==e.horizontalHasArrows&&e.horizontalHasArrows,vertical:void 0!==e.vertical?e.vertical:u.ScrollbarVisibility.Auto,verticalScrollbarSize:void 0!==e.verticalScrollbarSize?e.verticalScrollbarSize:10,verticalHasArrows:void 0!==e.verticalHasArrows&&e.verticalHasArrows,verticalSliderSize:void 0!==e.verticalSliderSize?e.verticalSliderSize:0};return t.horizontalSliderSize=void 0!==e.horizontalSliderSize?e.horizontalSliderSize:t.horizontalScrollbarSize,t.verticalSliderSize=void 0!==e.verticalSliderSize?e.verticalSliderSize:t.verticalScrollbarSize,i.isMacintosh&&(t.className+=" mac"),t}Object.defineProperty(t,"__esModule",{value:!0});var g=function(e){function t(t,n,i){var o=e.call(this)||this;o._onScroll=o._register(new h.Emitter),o.onScroll=o._onScroll.event,t.style.overflow="hidden",o._options=p(n),o._scrollable=void 0===i?o._register(new u.Scrollable):i,o._register(o._scrollable.onScroll(function(e){o._onDidScroll(e),o._onScroll.fire(e)}));var a={onMouseWheel:function(e){return o._onMouseWheel(e)},onDragStart:function(){return o._onDragStart()},onDragEnd:function(){return o._onDragEnd()}};return o._verticalScrollbar=o._register(new s.VerticalScrollbar(o._scrollable,o._options,a)),o._horizontalScrollbar=o._register(new r.HorizontalScrollbar(o._scrollable,o._options,a)),o._domNode=document.createElement("div"),o._domNode.className="monaco-scrollable-element "+o._options.className,o._domNode.setAttribute("role","presentation"),o._domNode.style.position="relative",o._domNode.style.overflow="hidden",o._domNode.appendChild(t),o._domNode.appendChild(o._horizontalScrollbar.domNode.domNode),o._domNode.appendChild(o._verticalScrollbar.domNode.domNode),o._options.useShadows&&(o._leftShadowDomNode=d.createFastDomNode(document.createElement("div")),o._leftShadowDomNode.setClassName("shadow"),o._domNode.appendChild(o._leftShadowDomNode.domNode),o._topShadowDomNode=d.createFastDomNode(document.createElement("div")),o._topShadowDomNode.setClassName("shadow"),o._domNode.appendChild(o._topShadowDomNode.domNode),o._topLeftShadowDomNode=d.createFastDomNode(document.createElement("div")),o._topLeftShadowDomNode.setClassName("shadow top-left-corner"),o._domNode.appendChild(o._topLeftShadowDomNode.domNode)),o._listenOnDomNode=o._options.listenOnDomNode||o._domNode,o._mouseWheelToDispose=[],o._setListeningToMouseWheel(o._options.handleMouseWheel),o.onmouseover(o._listenOnDomNode,function(e){return o._onMouseOver(e)}),o.onnonbubblingmouseout(o._listenOnDomNode,function(e){return o._onMouseOut(e)}),o._hideTimeout=o._register(new c.TimeoutTimer),o._isDragging=!1,o._mouseIsOver=!1,o._shouldRender=!0,o}return f(t,e),t.prototype.dispose=function(){this._mouseWheelToDispose=a.dispose(this._mouseWheelToDispose),e.prototype.dispose.call(this)},t.prototype.getDomNode=function(){return this._domNode},t.prototype.getOverviewRulerLayoutInfo=function(){return{parent:this._domNode,insertBefore:this._verticalScrollbar.domNode.domNode}},t.prototype.delegateVerticalScrollbarMouseDown=function(e){this._verticalScrollbar.delegateMouseDown(e)},t.prototype.delegateSliderMouseDown=function(e,t){this._verticalScrollbar.delegateSliderMouseDown(e,t)},t.prototype.updateState=function(e){this._scrollable.updateState(e)},t.prototype.getScrollState=function(){return this._scrollable.getState()},t.prototype.updateClassName=function(e){this._options.className=e,i.isMacintosh&&(this._options.className+=" mac"),this._domNode.className="monaco-scrollable-element "+this._options.className},t.prototype.updateOptions=function(e){var t=p(e);this._options.handleMouseWheel=t.handleMouseWheel,this._options.mouseWheelScrollSensitivity=t.mouseWheelScrollSensitivity,this._setListeningToMouseWheel(this._options.handleMouseWheel),this._options.lazyRender||this._render()},t.prototype._setListeningToMouseWheel=function(e){var t=this;if(this._mouseWheelToDispose.length>0!==e&&(this._mouseWheelToDispose=a.dispose(this._mouseWheelToDispose),e)){var i=function(e){var n=new o.StandardMouseWheelEvent(e);t._onMouseWheel(n)};this._mouseWheelToDispose.push(n.addDisposableListener(this._listenOnDomNode,"mousewheel",i)),this._mouseWheelToDispose.push(n.addDisposableListener(this._listenOnDomNode,"DOMMouseScroll",i))}},t.prototype._onMouseWheel=function(e){var t=-1,n=-1;if(e.deltaY||e.deltaX){var o=e.deltaY*this._options.mouseWheelScrollSensitivity,r=e.deltaX*this._options.mouseWheelScrollSensitivity;this._options.flipAxes&&(o=(c=[r,o])[0],r=c[1]);var s=!i.isMacintosh&&e.browserEvent.shiftKey;!this._options.scrollYToX&&!s||r||(r=o,o=0),i.isMacintosh&&(o&&Math.abs(r)<.2&&(r=0),Math.abs(o)>.5*Math.abs(r)&&(r=0));var a=this._scrollable.getState();if(o){var u=a.scrollTop;(t=this._verticalScrollbar.validateScrollPosition((-1!==t?t:u)-50*o))===u&&(t=-1)}if(r){var l=a.scrollLeft;(n=this._horizontalScrollbar.validateScrollPosition((-1!==n?n:l)-50*r))===l&&(n=-1)}-1===t&&-1===n||(-1!==t&&(this._shouldRender=this._verticalScrollbar.setDesiredScrollPosition(t)||this._shouldRender,t=-1),-1!==n&&(this._shouldRender=this._horizontalScrollbar.setDesiredScrollPosition(n)||this._shouldRender,n=-1))}(this._options.alwaysConsumeMouseWheel||this._shouldRender)&&(e.preventDefault(),e.stopPropagation());var c},t.prototype._onDidScroll=function(e){this._shouldRender=this._horizontalScrollbar.onDidScroll(e)||this._shouldRender,this._shouldRender=this._verticalScrollbar.onDidScroll(e)||this._shouldRender,this._options.useShadows&&(this._shouldRender=!0),this._reveal(),this._options.lazyRender||this._render()},t.prototype.renderNow=function(){if(!this._options.lazyRender)throw new Error("Please use `lazyRender` together with `renderNow`!");this._render()},t.prototype._render=function(){if(this._shouldRender&&(this._shouldRender=!1,this._horizontalScrollbar.render(),this._verticalScrollbar.render(),this._options.useShadows)){var e=this._scrollable.getState(),t=e.scrollTop>0,n=e.scrollLeft>0;this._leftShadowDomNode.setClassName("shadow"+(n?" left":"")),this._topShadowDomNode.setClassName("shadow"+(t?" top":"")),this._topLeftShadowDomNode.setClassName("shadow top-left-corner"+(t?" top":"")+(n?" left":""))}},t.prototype._onDragStart=function(){this._isDragging=!0,this._reveal()},t.prototype._onDragEnd=function(){this._isDragging=!1,this._hide()},t.prototype._onMouseOut=function(e){this._mouseIsOver=!1,this._hide()},t.prototype._onMouseOver=function(e){this._mouseIsOver=!0,this._reveal()},t.prototype._reveal=function(){this._verticalScrollbar.beginReveal(),this._horizontalScrollbar.beginReveal(),this._scheduleHide()},t.prototype._hide=function(){this._mouseIsOver||this._isDragging||(this._verticalScrollbar.beginHide(),this._horizontalScrollbar.beginHide())},t.prototype._scheduleHide=function(){var e=this;this._mouseIsOver||this._isDragging||this._hideTimeout.cancelAndSet(function(){return e._hide()},500)},t}(l.Widget);t.ScrollableElement=g;var m=function(e){function t(t,n){var i=e.call(this,t,n)||this;return i._element=t,i.onScroll(function(e){e.scrollTopChanged&&(i._element.scrollTop=e.scrollTop),e.scrollLeftChanged&&(i._element.scrollLeft=e.scrollLeft)}),i.scanDomNode(),i}return f(t,e),t.prototype.scanDomNode=function(){this.updateState({width:this._element.clientWidth,scrollWidth:this._element.scrollWidth,scrollLeft:this._element.scrollLeft,height:this._element.clientHeight,scrollHeight:this._element.scrollHeight,scrollTop:this._element.scrollTop})},t}(g);t.DomScrollableElement=m}),define(d[232],h([1,0,26,3,74,4,124,63,48,415,416,15,28]),function(e,t,n,i,o,r,s,a,u,l,c,d,h){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var p=["click","dblclick","mouseup","mousedown","mouseover","mousemove","mouseout","contextmenu","touchstart"],f={useShadows:!0},g=function(){function e(e,t,i,r){void 0===r&&(r=f),this.delegate=t,this.items=[],this.itemId=0,this.rangeMap=new l.RangeMap,this.renderers=n.toObject(i,function(e){return e.templateId}),this.cache=new c.RowCache(this.renderers),this.lastRenderTop=0,this.lastRenderHeight=0,this._domNode=document.createElement("div"),this._domNode.className="monaco-list",this.rowsContainer=document.createElement("div"),this.rowsContainer.className="monaco-list-rows",this.gesture=new o.Gesture(this.rowsContainer),this.scrollableElement=new a.ScrollableElement(this.rowsContainer,{alwaysConsumeMouseWheel:!0,horizontal:u.ScrollbarVisibility.Hidden,vertical:u.ScrollbarVisibility.Auto,useShadows:n.getOrDefault(r,function(e){return e.useShadows},f.useShadows)}),this._domNode.appendChild(this.scrollableElement.getDomNode()),e.appendChild(this._domNode),this.disposables=[this.rangeMap,this.gesture,this.scrollableElement],this.scrollableElement.onScroll(this.onScroll,this,this.disposables),s.domEvent(this.rowsContainer,o.EventType.Change)(this.onTouchChange,this,this.disposables),this.layout()}return Object.defineProperty(e.prototype,"domNode",{get:function(){return this._domNode},enumerable:!0,configurable:!0}),e.prototype.splice=function(e,t,n){var i=this;void 0===n&&(n=[]);var o=this.getRenderRange(this.lastRenderTop,this.lastRenderHeight);l.each(o,function(e){return i.removeItemFromDOM(i.items[e])});var r=n.map(function(e){return{id:String(i.itemId++),element:e,size:i.delegate.getHeight(e),templateId:i.delegate.getTemplateId(e),row:null}});(c=this.rangeMap).splice.apply(c,[e,t].concat(r));var s=(d=this.items).splice.apply(d,[e,t].concat(r)),a=this.getRenderRange(this.lastRenderTop,this.lastRenderHeight);l.each(a,function(e){return i.insertItemInDOM(i.items[e],e)});var u=this.getContentHeight();return this.rowsContainer.style.height=u+"px",this.scrollableElement.updateState({scrollHeight:u}),s.map(function(e){return e.element});var c,d},Object.defineProperty(e.prototype,"length",{get:function(){return this.items.length},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"renderHeight",{get:function(){return this.scrollableElement.getScrollState().height},enumerable:!0,configurable:!0}),e.prototype.element=function(e){return this.items[e].element},e.prototype.domElement=function(e){var t=this.items[e].row;return t&&t.domNode},e.prototype.elementHeight=function(e){return this.items[e].size},e.prototype.elementTop=function(e){return this.rangeMap.positionAt(e)},e.prototype.indexAt=function(e){return this.rangeMap.indexAt(e)},e.prototype.indexAfter=function(e){return this.rangeMap.indexAfter(e)},e.prototype.layout=function(e){this.scrollableElement.updateState({height:e||r.getContentHeight(this._domNode)})},e.prototype.render=function(e,t){var n=this,i=this.getRenderRange(this.lastRenderTop,this.lastRenderHeight),o=this.getRenderRange(e,t),r=l.relativeComplement(o,i),s=l.relativeComplement(i,o);if(r.forEach(function(e){return l.each(e,function(e){return n.insertItemInDOM(n.items[e],e)})}),s.forEach(function(e){return l.each(e,function(e){return n.removeItemFromDOM(n.items[e])})}),h.canUseTranslate3d()&&!d.isWindows){var a="translate3d(0px, -"+e+"px, 0px)";this.rowsContainer.style.transform=a,this.rowsContainer.style.webkitTransform=a}else this.rowsContainer.style.top="-"+e+"px";this.lastRenderTop=e,this.lastRenderHeight=t},e.prototype.insertItemInDOM=function(e,t){e.row||(e.row=this.cache.alloc(e.templateId)),e.row.domNode.parentElement||this.rowsContainer.appendChild(e.row.domNode);var n=this.renderers[e.templateId];e.row.domNode.style.top=this.elementTop(t)+"px",e.row.domNode.style.height=e.size+"px",e.row.domNode.setAttribute("data-index",""+t),n.renderElement(e.element,t,e.row.templateData)},e.prototype.removeItemFromDOM=function(e){this.cache.release(e.row),e.row=null},e.prototype.getContentHeight=function(){return this.rangeMap.size},e.prototype.getScrollTop=function(){return this.scrollableElement.getScrollState().scrollTop},e.prototype.setScrollTop=function(e){this.scrollableElement.updateState({scrollTop:e})},Object.defineProperty(e.prototype,"scrollTop",{get:function(){return this.getScrollTop()},set:function(e){this.setScrollTop(e)},enumerable:!0,configurable:!0}),e.prototype.addListener=function(e,t,n){var i=this,s=t,a=this.domNode;return p.indexOf(e)>-1?t=function(e){return i.fireScopedEvent(e,s,i.getItemIndexFromMouseEvent(e))}:e===o.EventType.Tap&&(a=this.rowsContainer,t=function(e){return i.fireScopedEvent(e,s,i.getItemIndexFromGestureEvent(e))}),r.addDisposableListener(a,e,t,n)},e.prototype.fireScopedEvent=function(e,t,i){if(!(i<0)){var o=this.items[i].element;t(n.assign(e,{element:o,index:i}))}},e.prototype.onScroll=function(e){this.render(e.scrollTop,e.height)},e.prototype.onTouchChange=function(e){e.preventDefault(),e.stopPropagation(),this.scrollTop-=e.translationY},e.prototype.getItemIndexFromMouseEvent=function(e){return this.getItemIndexFromEventTarget(e.target)},e.prototype.getItemIndexFromGestureEvent=function(e){return this.getItemIndexFromEventTarget(e.initialTarget)},e.prototype.getItemIndexFromEventTarget=function(e){for(;e instanceof HTMLElement&&e!==this.rowsContainer;){var t=e,n=t.getAttribute("data-index");if(n){var i=Number(n);if(!isNaN(i))return i}e=t.parentElement}return-1},e.prototype.getRenderRange=function(e,t){return{start:this.rangeMap.indexAt(e),end:this.rangeMap.indexAfter(e+t-1)}},e.prototype.dispose=function(){this.items=null,this._domNode&&this._domNode.parentElement&&(this._domNode.parentNode.removeChild(this._domNode),this._domNode=null),this.disposables=i.dispose(this.disposables)},e}();t.ListView=g});var v=this&&this.__decorate||function(e,t,n,i){var o,r=arguments.length,s=r<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,n):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(e,t,n,i);else for(var a=e.length-1;a>=0;a--)(o=e[a])&&(s=(r<3?o(s):r>3?o(t,n,s):o(t,n))||s);return r>3&&s&&Object.defineProperty(t,n,s),s};define(d[234],h([1,0,3,29,33,136,446,4,15,74,65,11,124,232,32,26,213]),function(e,t,n,i,o,r,s,a,u,l,c,d,h,p,g,m){"use strict";function _(e){return u.isMacintosh?e.metaKey:e.ctrlKey}function y(e){return e.shiftKey}function C(e){return _(e)||y(e)}function b(e,t){var n=e.indexOf(t);if(-1===n)return[];for(var i=[],o=n-1;o>=0&&e[o]===t-(n-o);)i.push(e[o--]);for(i.reverse(),o=n;o=e.length)n.push(t[o++]);else if(o>=t.length)n.push(e[i++]);else{if(e[i]===t[o]){n.push(e[i]),i++,o++;continue}e[i]=e.length)n.push(t[o++]);else if(o>=t.length)n.push(e[i++]);else{if(e[i]===t[o]){i++,o++;continue}e[i]-1}).forEach(function(e){var n=e.index,i=e.templateData;return t.trait.renderIndex(n,i.container)})},e.prototype.splice=function(e,t){for(var n=0;n=o}).map(function(e){return e+i}));this.renderer.splice(e,t),this.set(r)},e.prototype.renderIndex=function(e,t){a.toggleClass(t,this._trait,this.contains(e))},e.prototype.set=function(e){var t=this.indexes;this.indexes=e;var n=w(t,e);return this.renderer.renderIndexes(n),this._onChange.fire({indexes:e}),t},e.prototype.get=function(){return this.indexes},e.prototype.contains=function(e){return this.indexes.some(function(t){return t===e})},e.prototype.dispose=function(){this.indexes=null,this._onChange=n.dispose(this._onChange)},v([s.memoize],e.prototype,"renderer",null),e}(),N=function(e){function t(t){var n=e.call(this,"focused")||this;return n.getDomId=t,n}return f(t,e),t.prototype.renderIndex=function(t,n){e.prototype.renderIndex.call(this,t,n),n.setAttribute("role","treeitem"),n.setAttribute("id",this.getDomId(t))},t}(x),M=function(){function e(){this.length=0}return Object.defineProperty(e.prototype,"templateId",{get:function(){return"aria"},enumerable:!0,configurable:!0}),e.prototype.splice=function(e,t,n){this.length+=n.length-t},e.prototype.renderTemplate=function(e){return e},e.prototype.renderElement=function(e,t,n){n.setAttribute("aria-setsize",""+this.length),n.setAttribute("aria-posinset",""+(t+1))},e.prototype.disposeTemplate=function(e){},e}(),T=function(){function e(e,t,n){this.trait=e,this.view=t,this.getId=n}return e.prototype.splice=function(e,t,n){var i=this;if(!this.getId)return this.trait.splice(e,t,n.map(function(e){return!1}));var o=this.trait.get().map(function(e){return i.getId(i.view.element(e))}),r=n.map(function(e){return o.indexOf(i.getId(e))>-1});this.trait.splice(e,t,r)},e}(),k=function(){function e(e,t){this.list=e,this.view=t,this.disposables=[];var n=d.chain(h.domEvent(t.domNode,"keydown")).map(function(e){return new c.StandardKeyboardEvent(e)});n.filter(function(e){return 3===e.keyCode}).on(this.onEnter,this,this.disposables),n.filter(function(e){return 16===e.keyCode}).on(this.onUpArrow,this,this.disposables),n.filter(function(e){return 18===e.keyCode}).on(this.onDownArrow,this,this.disposables),n.filter(function(e){return 11===e.keyCode}).on(this.onPageUpArrow,this,this.disposables),n.filter(function(e){return 12===e.keyCode}).on(this.onPageDownArrow,this,this.disposables)}return e.prototype.onEnter=function(e){e.preventDefault(),e.stopPropagation(),this.list.setSelection(this.list.getFocus()),this.list.open(this.list.getFocus())},e.prototype.onUpArrow=function(e){e.preventDefault(),e.stopPropagation(),this.list.focusPrevious(),this.list.reveal(this.list.getFocus()[0]),this.view.domNode.focus()},e.prototype.onDownArrow=function(e){e.preventDefault(),e.stopPropagation(),this.list.focusNext(),this.list.reveal(this.list.getFocus()[0]),this.view.domNode.focus()},e.prototype.onPageUpArrow=function(e){e.preventDefault(),e.stopPropagation(),this.list.focusPreviousPage(),this.list.reveal(this.list.getFocus()[0]),this.view.domNode.focus()},e.prototype.onPageDownArrow=function(e){e.preventDefault(),e.stopPropagation(),this.list.focusNextPage(),this.list.reveal(this.list.getFocus()[0]),this.view.domNode.focus()},e.prototype.dispose=function(){this.disposables=n.dispose(this.disposables)},e}(),I=function(){function e(e,t,n){void 0===n&&(n={});var i=this;this.list=e,this.view=t,this.options=n,this.disposables=[],this.disposables.push(t.addListener("mousedown",function(e){return i.onMouseDown(e)})),this.disposables.push(t.addListener("click",function(e){return i.onPointer(e)})),this.disposables.push(t.addListener("dblclick",function(e){return i.onDoubleClick(e)})),this.disposables.push(t.addListener("touchstart",function(e){return i.onMouseDown(e)})),this.disposables.push(t.addListener(l.EventType.Tap,function(e){return i.onPointer(e)}))}return Object.defineProperty(e.prototype,"onContextMenu",{get:function(){var e=this,t=d.chain(h.domEvent(this.view.domNode,"keydown")).map(function(e){return new c.StandardKeyboardEvent(e)}).filter(function(t){return e.list.getFocus().length>0}).filter(function(e){return 58===e.keyCode||e.shiftKey&&68===e.keyCode}).map(function(t){var n=e.list.getFocus()[0];return{index:n,element:e.view.element(n),anchor:e.view.domElement(n)}}).filter(function(e){return!!e.anchor}).event,n=d.chain(d.fromCallback(function(t){return e.view.addListener("contextmenu",t)})).map(function(e){return{element:e.element,index:e.index,anchor:{x:e.clientX+1,y:e.clientY}}}).event;return d.any(t,n)},enumerable:!0,configurable:!0}),e.prototype.onMouseDown=function(e){e.preventDefault(),e.stopPropagation(),this.view.domNode.focus();var t=this.list.getFocus()[0];if(t=void 0===t?this.list.getSelection()[0]:t,y(e))return this.changeSelection(e,t);var n=e.index;if(this.list.setFocus([n]),C(e))return this.changeSelection(e,t);this.options.selectOnMouseDown&&(this.list.setSelection([n]),this.list.open([n]))},e.prototype.onPointer=function(e){if(e.preventDefault(),e.stopPropagation(),!C(e)){var t=this.list.getFocus();this.list.setSelection(t),this.list.open(t)}},e.prototype.onDoubleClick=function(e){if(e.preventDefault(),e.stopPropagation(),!C(e)){var t=this.list.getFocus();this.list.setSelection(t),this.list.pin(t)}},e.prototype.changeSelection=function(e,t){var n=e.index;if(y(e)&&void 0!==t){var i=Math.min(t,n),r=Math.max(t,n),s=o.range(r+1,i),a=b(w(u=this.list.getSelection(),[t]),t);if(0===a.length)return;l=w(s,S(u,a));this.list.setSelection(l)}else if(_(e)){var u=this.list.getSelection(),l=u.filter(function(e){return e!==n});u.length===l.length?this.list.setSelection(l.concat([n])):this.list.setSelection(l)}},e.prototype.dispose=function(){this.disposables=n.dispose(this.disposables)},v([s.memoize],e.prototype,"onContextMenu",null),e}(),D={listFocusBackground:g.Color.fromHex("#073655"),listActiveSelectionBackground:g.Color.fromHex("#0E639C"),listActiveSelectionForeground:g.Color.fromHex("#FFFFFF"),listFocusAndSelectionBackground:g.Color.fromHex("#094771"),listFocusAndSelectionForeground:g.Color.fromHex("#FFFFFF"),listInactiveSelectionBackground:g.Color.fromHex("#3F3F46"),listHoverBackground:g.Color.fromHex("#2A2D2E"),listDropBackground:g.Color.fromHex("#383B3D")},O={keyboardSupport:!0,mouseSupport:!0},R=function(e,t){return e-t},P=function(){function e(e,t){this._templateId=e,this.renderers=t}return Object.defineProperty(e.prototype,"templateId",{get:function(){return this._templateId},enumerable:!0,configurable:!0}),e.prototype.renderTemplate=function(e){return this.renderers.map(function(t){return t.renderTemplate(e)})},e.prototype.renderElement=function(e,t,n){this.renderers.forEach(function(i,o){return i.renderElement(e,t,n[o])})},e.prototype.disposeTemplate=function(e){this.renderers.forEach(function(t,n){return t.disposeTemplate(e[n])})},e}(),A=function(){function e(t,n,i,o){void 0===o&&(o=O);var r=this;this.idPrefix="list_id_"+ ++e.InstanceCount,this._onContextMenu=d.default.None,this._onOpen=new d.Emitter,this._onPin=new d.Emitter,this._onDispose=new d.Emitter;var s=new M;if(this.focus=new N(function(e){return r.getElementDomId(e)}),this.selection=new x("selected"),this.eventBufferer=new d.EventBufferer,m.mixin(o,D,!1),i=i.map(function(e){return new P(e.templateId,[s,r.focus.renderer,r.selection.renderer,e])}),this.view=new p.ListView(t,n,i,o),this.view.domNode.setAttribute("role","tree"),a.addClass(this.view.domNode,this.idPrefix),this.view.domNode.tabIndex=0,this.styleElement=a.createStyleSheet(this.view.domNode),this.spliceable=new E([s,new T(this.focus,this.view,o.identityProvider),new T(this.selection,this.view,o.identityProvider),this.view]),this.disposables=[this.focus,this.selection,this.view,this._onDispose],this.onDOMFocus=d.mapEvent(h.domEvent(this.view.domNode,"focus",!0),function(){return null}),this.onDOMBlur=d.mapEvent(h.domEvent(this.view.domNode,"blur",!0),function(){return null}),"boolean"!=typeof o.keyboardSupport||o.keyboardSupport){u=new k(this,this.view);this.disposables.push(u)}if("boolean"!=typeof o.mouseSupport||o.mouseSupport){var u=new I(this,this.view,o);this.disposables.push(u),this._onContextMenu=u.onContextMenu}this.onFocusChange(this._onFocusChange,this,this.disposables),this.onSelectionChange(this._onSelectionChange,this,this.disposables),o.ariaLabel&&this.view.domNode.setAttribute("aria-label",o.ariaLabel),this.style(o)}return Object.defineProperty(e.prototype,"onFocusChange",{get:function(){var e=this;return d.mapEvent(this.eventBufferer.wrapEvent(this.focus.onChange),function(t){return e.toListEvent(t)})},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"onSelectionChange",{get:function(){var e=this;return d.mapEvent(this.eventBufferer.wrapEvent(this.selection.onChange),function(t){return e.toListEvent(t)})},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"onContextMenu",{get:function(){return this._onContextMenu},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"onOpen",{get:function(){var e=this;return d.mapEvent(this._onOpen.event,function(t){return e.toListEvent({indexes:t})})},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"onPin",{get:function(){var e=this;return d.mapEvent(this._onPin.event,function(t){return e.toListEvent({indexes:t})})},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"onDispose",{get:function(){return this._onDispose.event},enumerable:!0,configurable:!0}),e.prototype.splice=function(e,t,n){var i=this;void 0===n&&(n=[]),this.eventBufferer.bufferEvents(function(){return i.spliceable.splice(e,t,n)})},Object.defineProperty(e.prototype,"length",{get:function(){return this.view.length},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"contentHeight",{get:function(){return this.view.getContentHeight()},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"scrollTop",{get:function(){return this.view.getScrollTop()},set:function(e){this.view.setScrollTop(e)},enumerable:!0,configurable:!0}),e.prototype.layout=function(e){this.view.layout(e)},e.prototype.setSelection=function(e){e=e.sort(R),this.selection.set(e)},e.prototype.selectNext=function(e,t){if(void 0===e&&(e=1),void 0===t&&(t=!1),0!==this.length){var n=this.selection.get(),i=n.length>0?n[0]+e:0;this.setSelection(t?[i%this.length]:[Math.min(i,this.length-1)])}},e.prototype.selectPrevious=function(e,t){if(void 0===e&&(e=1),void 0===t&&(t=!1),0!==this.length){var n=this.selection.get(),i=n.length>0?n[0]-e:0;t&&i<0&&(i=this.length+i%this.length),this.setSelection([Math.max(i,0)])}},e.prototype.getSelection=function(){return this.selection.get()},e.prototype.getSelectedElements=function(){var e=this;return this.getSelection().map(function(t){return e.view.element(t)})},e.prototype.setFocus=function(e){e=e.sort(R),this.focus.set(e)},e.prototype.focusNext=function(e,t){if(void 0===e&&(e=1),void 0===t&&(t=!1),0!==this.length){var n=this.focus.get(),i=n.length>0?n[0]+e:0;this.setFocus(t?[i%this.length]:[Math.min(i,this.length-1)])}},e.prototype.focusPrevious=function(e,t){if(void 0===e&&(e=1),void 0===t&&(t=!1),0!==this.length){var n=this.focus.get(),i=n.length>0?n[0]-e:0;t&&i<0&&(i=(this.length+i%this.length)%this.length),this.setFocus([Math.max(i,0)])}},e.prototype.focusNextPage=function(){var e=this,t=this.view.indexAt(this.view.getScrollTop()+this.view.renderHeight);t=0===t?0:t-1;var n=this.view.element(t);if(this.getFocusedElements()[0]!==n)this.setFocus([t]);else{var i=this.view.getScrollTop();this.view.setScrollTop(i+this.view.renderHeight-this.view.elementHeight(t)),this.view.getScrollTop()!==i&&setTimeout(function(){return e.focusNextPage()},0)}},e.prototype.focusPreviousPage=function(){var e,t=this,n=this.view.getScrollTop();e=0===n?this.view.indexAt(n):this.view.indexAfter(n-1);var i=this.view.element(e);if(this.getFocusedElements()[0]!==i)this.setFocus([e]);else{var o=n;this.view.setScrollTop(n-this.view.renderHeight),this.view.getScrollTop()!==o&&setTimeout(function(){return t.focusPreviousPage()},0)}},e.prototype.focusLast=function(){0!==this.length&&this.setFocus([this.length-1])},e.prototype.focusFirst=function(){0!==this.length&&this.setFocus([0])},e.prototype.getFocus=function(){return this.focus.get()},e.prototype.getFocusedElements=function(){var e=this;return this.getFocus().map(function(t){return e.view.element(t)})},e.prototype.reveal=function(e,t){var n=this.view.getScrollTop(),o=this.view.elementTop(e),r=this.view.elementHeight(e);if(i.isNumber(t)){t=(t=t<0?0:t)>1?1:t;var s=r-this.view.renderHeight;this.view.setScrollTop(s*t+o)}else{var a=o+r,u=n+this.view.renderHeight;o=u&&this.view.setScrollTop(a-this.view.renderHeight)}},e.prototype.getElementDomId=function(e){return this.idPrefix+"_"+e},e.prototype.isDOMFocused=function(){return this.view.domNode===document.activeElement},e.prototype.getHTMLElement=function(){return this.view.domNode},e.prototype.open=function(e){this._onOpen.fire(e)},e.prototype.pin=function(e){this._onPin.fire(e)},e.prototype.style=function(e){var t=[];e.listFocusBackground&&t.push(".monaco-list."+this.idPrefix+":focus .monaco-list-row.focused { background-color: "+e.listFocusBackground+"; }"),e.listFocusForeground&&t.push(".monaco-list."+this.idPrefix+":focus .monaco-list-row.focused { color: "+e.listFocusForeground+"; }"),e.listActiveSelectionBackground&&(t.push(".monaco-list."+this.idPrefix+":focus .monaco-list-row.selected { background-color: "+e.listActiveSelectionBackground+"; }"),t.push(".monaco-list."+this.idPrefix+":focus .monaco-list-row.selected:hover { background-color: "+e.listActiveSelectionBackground+"; }")),e.listActiveSelectionForeground&&t.push(".monaco-list."+this.idPrefix+":focus .monaco-list-row.selected { color: "+e.listActiveSelectionForeground+"; }"),e.listFocusAndSelectionBackground&&t.push(".monaco-list."+this.idPrefix+":focus .monaco-list-row.selected.focused { background-color: "+e.listFocusAndSelectionBackground+"; }"),e.listFocusAndSelectionForeground&&t.push(".monaco-list."+this.idPrefix+":focus .monaco-list-row.selected.focused { color: "+e.listFocusAndSelectionForeground+"; }"),e.listInactiveFocusBackground&&(t.push(".monaco-list."+this.idPrefix+" .monaco-list-row.focused { background-color: "+e.listInactiveFocusBackground+"; }"),t.push(".monaco-list."+this.idPrefix+" .monaco-list-row.focused:hover { background-color: "+e.listInactiveFocusBackground+"; }")),e.listInactiveSelectionBackground&&(t.push(".monaco-list."+this.idPrefix+" .monaco-list-row.selected { background-color: "+e.listInactiveSelectionBackground+"; }"),t.push(".monaco-list."+this.idPrefix+" .monaco-list-row.selected:hover { background-color: "+e.listInactiveSelectionBackground+"; }")),e.listInactiveSelectionForeground&&t.push(".monaco-list."+this.idPrefix+" .monaco-list-row.selected { color: "+e.listInactiveSelectionForeground+"; }"),e.listHoverBackground&&t.push(".monaco-list."+this.idPrefix+" .monaco-list-row:hover { background-color: "+e.listHoverBackground+"; }"),e.listHoverForeground&&t.push(".monaco-list."+this.idPrefix+" .monaco-list-row:hover { color: "+e.listHoverForeground+"; }"),e.listSelectionOutline&&t.push(".monaco-list."+this.idPrefix+" .monaco-list-row.selected { outline: 1px dotted "+e.listSelectionOutline+"; outline-offset: -1px; }"),e.listFocusOutline&&t.push(".monaco-list."+this.idPrefix+":focus .monaco-list-row.focused { outline: 1px solid "+e.listFocusOutline+"; outline-offset: -1px; }"),e.listInactiveFocusOutline&&t.push(".monaco-list."+this.idPrefix+" .monaco-list-row.focused { outline: 1px dotted "+e.listInactiveFocusOutline+"; outline-offset: -1px; }"),e.listHoverOutline&&t.push(".monaco-list."+this.idPrefix+" .monaco-list-row:hover { outline: 1px dashed "+e.listHoverOutline+"; outline-offset: -1px; }"),this.styleElement.innerHTML=t.join("\n")},e.prototype.toListEvent=function(e){var t=this,n=e.indexes;return{indexes:n,elements:n.map(function(e){return t.view.element(e)})}},e.prototype._onFocusChange=function(){var e=this.focus.get();e.length>0?this.view.domNode.setAttribute("aria-activedescendant",this.getElementDomId(e[0])):this.view.domNode.removeAttribute("aria-activedescendant"),this.view.domNode.setAttribute("role","tree"),a.toggleClass(this.view.domNode,"element-focused",e.length>0)},e.prototype._onSelectionChange=function(){var e=this.selection.get();a.toggleClass(this.view.domNode,"selection-none",0===e.length),a.toggleClass(this.view.domNode,"selection-single",1===e.length),a.toggleClass(this.view.domNode,"selection-multiple",e.length>1)},e.prototype.dispose=function(){this._onDispose.fire(),this.disposables=n.dispose(this.disposables)},e.InstanceCount=0,v([s.memoize],e.prototype,"onFocusChange",null),v([s.memoize],e.prototype,"onSelectionChange",null),v([s.memoize],e.prototype,"onOpen",null),v([s.memoize],e.prototype,"onPin",null),e}();t.List=A}),define(d[238],h([1,0,15,28,7,3,4,139,74,9,47,65,461,107,63,48,472,448,11]),function(e,t,n,i,o,r,s,a,u,l,c,d,h,p,g,m,v,_,y){"use strict";function C(e){try{e.parentElement.removeChild(e)}catch(e){}}function b(e,t){return!e&&!t||!(!e||!t)&&(e.accept===t.accept&&(e.bubble===t.bubble&&e.effect===t.effect))}Object.defineProperty(t,"__esModule",{value:!0});var w=function(){function e(e){this.context=e,this._cache={"":[]}}return e.prototype.alloc=function(e){var t=this.cache(e).pop();if(!t){var n=document.createElement("div");n.className="content";var i=document.createElement("div");i.appendChild(n),t={element:i,templateId:e,templateData:this.context.renderer.renderTemplate(this.context.tree,e,n)}}return t},e.prototype.release=function(e,t){C(t.element),this.cache(e).push(t)},e.prototype.cache=function(e){return this._cache[e]||(this._cache[e]=[])},e.prototype.garbageCollect=function(){var e=this;this._cache&&Object.keys(this._cache).forEach(function(t){e._cache[t].forEach(function(n){e.context.renderer.disposeTemplate(e.context.tree,t,n.templateData),n.element=null,n.templateData=null}),delete e._cache[t]})},e.prototype.dispose=function(){this.garbageCollect(),this._cache=null,this.context=null},e}();t.RowCache=w;var S=function(){function e(e,t){var n=this;this.context=e,this.model=t,this.id=this.model.id,this.row=null,this.top=0,this.height=t.getHeight(),this._styles={},t.getAllTraits().forEach(function(e){return n._styles[e]=!0}),t.isExpanded()&&this.addClass("expanded")}return Object.defineProperty(e.prototype,"expanded",{set:function(e){e?this.addClass("expanded"):this.removeClass("expanded")},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"loading",{set:function(e){e?this.addClass("loading"):this.removeClass("loading")},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"draggable",{get:function(){return this._draggable},set:function(e){this._draggable=e,this.render(!0)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"dropTarget",{set:function(e){e?this.addClass("drop-target"):this.removeClass("drop-target")},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"element",{get:function(){return this.row&&this.row.element},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"templateId",{get:function(){return this._templateId||(this._templateId=this.context.renderer.getTemplateId&&this.context.renderer.getTemplateId(this.context.tree,this.model.getElement()))},enumerable:!0,configurable:!0}),e.prototype.addClass=function(e){this._styles[e]=!0,this.render(!0)},e.prototype.removeClass=function(e){delete this._styles[e],this.render(!0)},e.prototype.render=function(e){var t=this;if(void 0===e&&(e=!1),this.model&&this.element){var n=["monaco-tree-row"];n.push.apply(n,Object.keys(this._styles)),this.model.hasChildren()&&n.push("has-children"),this.element.className=n.join(" "),this.element.draggable=this.draggable,this.element.style.height=this.height+"px",this.element.setAttribute("role","treeitem");var i=this.context.accessibilityProvider,o=i.getAriaLabel(this.context.tree,this.model.getElement());if(o&&this.element.setAttribute("aria-label",o),i.getPosInSet&&i.getSetSize&&(this.element.setAttribute("aria-setsize",i.getSetSize()),this.element.setAttribute("aria-posinset",i.getPosInSet(this.context.tree,this.model.getElement()))),this.model.hasTrait("focused")){var r=l.safeBtoa(this.model.id);this.element.setAttribute("aria-selected","true"),this.element.setAttribute("id",r)}else this.element.setAttribute("aria-selected","false"),this.element.removeAttribute("id");this.model.hasChildren()?this.element.setAttribute("aria-expanded",String(!!this.model.isExpanded())):this.element.removeAttribute("aria-expanded"),this.element.setAttribute("aria-level",String(this.model.getDepth())),this.context.options.paddingOnRow?this.element.style.paddingLeft=this.context.options.twistiePixels+(this.model.getDepth()-1)*this.context.options.indentPixels+"px":(this.element.style.paddingLeft=(this.model.getDepth()-1)*this.context.options.indentPixels+"px",this.row.element.firstElementChild.style.paddingLeft=this.context.options.twistiePixels+"px");var a=this.context.dnd.getDragURI(this.context.tree,this.model.getElement());a!==this.uri&&(this.unbindDragStart&&(this.unbindDragStart.dispose(),this.unbindDragStart=null),a?(this.uri=a,this.draggable=!0,this.unbindDragStart=s.addDisposableListener(this.element,"dragstart",function(e){t.onDragStart(e)})):this.uri=null),e||this.context.renderer.renderElement(this.context.tree,this.model.getElement(),this.templateId,this.row.templateData)}},e.prototype.insertInDOM=function(e,t){if(this.row||(this.row=this.context.cache.alloc(this.templateId),this.element[L.BINDING]=this),!this.element.parentElement){if(null===t)e.appendChild(this.element);else try{e.insertBefore(this.element,t)}catch(t){console.warn("Failed to locate previous tree element"),e.appendChild(this.element)}this.render()}},e.prototype.removeFromDOM=function(){this.row&&(this.unbindDragStart&&(this.unbindDragStart.dispose(),this.unbindDragStart=null),this.uri=null,this.element[L.BINDING]=null,this.context.cache.release(this.templateId,this.row),this.row=null)},e.prototype.dispose=function(){this.row=null,this.model=null},e}();t.ViewItem=S;var E=function(e){function t(t,n,i){var o=e.call(this,t,n)||this;return o.row={element:i,templateData:null,templateId:null},o}return f(t,e),t.prototype.render=function(){if(this.model&&this.element){var e=["monaco-tree-wrapper"];e.push.apply(e,Object.keys(this._styles)),this.model.hasChildren()&&e.push("has-children"),this.element.className=e.join(" ")}},t.prototype.insertInDOM=function(e,t){},t.prototype.removeFromDOM=function(){},t}(S),L=function(e){function t(n,o){var r=e.call(this)||this;r.lastClickTimeStamp=0,r.isRefreshing=!1,r.refreshingPreviousChildrenIds={},r._onDOMFocus=new y.Emitter,r._onDOMBlur=new y.Emitter,t.counter++,r.instance=t.counter,r.context={dataSource:n.dataSource,renderer:n.renderer,controller:n.controller,dnd:n.dnd,filter:n.filter,sorter:n.sorter,tree:n.tree,accessibilityProvider:n.accessibilityProvider,options:n.options,cache:new w(n)},r.modelListeners=[],r.viewListeners=[],r.dragAndDropListeners=[],r.model=null,r.items={},r.domNode=document.createElement("div"),r.domNode.className="monaco-tree no-focused-item monaco-tree-instance-"+r.instance,r.domNode.tabIndex=0,r.styleElement=s.createStyleSheet(r.domNode),r.domNode.setAttribute("role","tree"),r.context.options.ariaLabel&&r.domNode.setAttribute("aria-label",r.context.options.ariaLabel),r.context.options.alwaysFocused&&s.addClass(r.domNode,"focused"),r.context.options.paddingOnRow||s.addClass(r.domNode,"no-row-padding"),r.wrapper=document.createElement("div"),r.wrapper.className="monaco-tree-wrapper",r.scrollableElement=new g.ScrollableElement(r.wrapper,{alwaysConsumeMouseWheel:!0,horizontal:m.ScrollbarVisibility.Hidden,vertical:void 0!==n.options.verticalScrollMode?n.options.verticalScrollMode:m.ScrollbarVisibility.Auto,useShadows:n.options.useShadows}),r.scrollableElement.onScroll(function(e){r.render(e.scrollTop,e.height),r.emit("scroll",e)}),i.isIE?(r.wrapper.style.msTouchAction="none",r.wrapper.style.msContentZooming="none"):r.wrapperGesture=new u.Gesture(r.wrapper),r.rowsContainer=document.createElement("div"),r.rowsContainer.className="monaco-tree-rows",n.options.showTwistie&&(r.rowsContainer.className+=" show-twisties");var a=s.trackFocus(r.domNode);return a.addFocusListener(function(){return r.onFocus()}),a.addBlurListener(function(){return r.onBlur()}),r.viewListeners.push(a),r.viewListeners.push(s.addDisposableListener(r.domNode,"keydown",function(e){return r.onKeyDown(e)})),r.viewListeners.push(s.addDisposableListener(r.domNode,"keyup",function(e){return r.onKeyUp(e)})),r.viewListeners.push(s.addDisposableListener(r.domNode,"mousedown",function(e){return r.onMouseDown(e)})),r.viewListeners.push(s.addDisposableListener(r.domNode,"mouseup",function(e){return r.onMouseUp(e)})),r.viewListeners.push(s.addDisposableListener(r.wrapper,"click",function(e){return r.onClick(e)})),r.viewListeners.push(s.addDisposableListener(r.wrapper,"auxclick",function(e){return r.onClick(e)})),r.viewListeners.push(s.addDisposableListener(r.domNode,"contextmenu",function(e){return r.onContextMenu(e)})),r.viewListeners.push(s.addDisposableListener(r.wrapper,u.EventType.Tap,function(e){return r.onTap(e)})),r.viewListeners.push(s.addDisposableListener(r.wrapper,u.EventType.Change,function(e){return r.onTouchChange(e)})),i.isIE&&(r.viewListeners.push(s.addDisposableListener(r.wrapper,"MSPointerDown",function(e){return r.onMsPointerDown(e)})),r.viewListeners.push(s.addDisposableListener(r.wrapper,"MSGestureTap",function(e){return r.onMsGestureTap(e)})),r.viewListeners.push(s.addDisposableThrottledListener(r.wrapper,"MSGestureChange",function(e){return r.onThrottledMsGestureChange(e)},function(e,t){t.stopPropagation(),t.preventDefault();var n={translationY:t.translationY,translationX:t.translationX};return e&&(n.translationY+=e.translationY,n.translationX+=e.translationX),n}))),r.viewListeners.push(s.addDisposableListener(window,"dragover",function(e){return r.onDragOver(e)})),r.viewListeners.push(s.addDisposableListener(r.wrapper,"drop",function(e){return r.onDrop(e)})),r.viewListeners.push(s.addDisposableListener(window,"dragend",function(e){return r.onDragEnd(e)})),r.viewListeners.push(s.addDisposableListener(window,"dragleave",function(e){return r.onDragOver(e)})),r.wrapper.appendChild(r.rowsContainer),r.domNode.appendChild(r.scrollableElement.getDomNode()),o.appendChild(r.domNode),r.lastRenderTop=0,r.lastRenderHeight=0,r.didJustPressContextMenuKey=!1,r.currentDropTarget=null,r.currentDropTargets=[],r.shouldInvalidateDropReaction=!1,r.dragAndDropScrollInterval=null,r.dragAndDropScrollTimeout=null,r.onHiddenScrollTop=null,r.onRowsChanged(),r.layout(),r.setupMSGesture(),r.applyStyles(n.options),r}return f(t,e),Object.defineProperty(t.prototype,"onDOMFocus",{get:function(){return this._onDOMFocus.event},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"onDOMBlur",{get:function(){return this._onDOMBlur.event},enumerable:!0,configurable:!0}),t.prototype.applyStyles=function(e){var t=[];e.listFocusBackground&&t.push(".monaco-tree.monaco-tree-instance-"+this.instance+".focused .monaco-tree-rows > .monaco-tree-row.focused:not(.highlighted) { background-color: "+e.listFocusBackground+"; }"),e.listFocusForeground&&t.push(".monaco-tree.monaco-tree-instance-"+this.instance+".focused .monaco-tree-rows > .monaco-tree-row.focused:not(.highlighted) { color: "+e.listFocusForeground+"; }"),e.listActiveSelectionBackground&&t.push(".monaco-tree.monaco-tree-instance-"+this.instance+".focused .monaco-tree-rows > .monaco-tree-row.selected:not(.highlighted) { background-color: "+e.listActiveSelectionBackground+"; }"),e.listActiveSelectionForeground&&t.push(".monaco-tree.monaco-tree-instance-"+this.instance+".focused .monaco-tree-rows > .monaco-tree-row.selected:not(.highlighted) { color: "+e.listActiveSelectionForeground+"; }"),e.listFocusAndSelectionBackground&&t.push("\n\t\t\t\t.monaco-tree-drag-image,\n\t\t\t\t.monaco-tree.monaco-tree-instance-"+this.instance+".focused .monaco-tree-rows > .monaco-tree-row.focused.selected:not(.highlighted) { background-color: "+e.listFocusAndSelectionBackground+"; }\n\t\t\t"),e.listFocusAndSelectionForeground&&t.push("\n\t\t\t\t.monaco-tree-drag-image,\n\t\t\t\t.monaco-tree.monaco-tree-instance-"+this.instance+".focused .monaco-tree-rows > .monaco-tree-row.focused.selected:not(.highlighted) { color: "+e.listFocusAndSelectionForeground+"; }\n\t\t\t"),e.listInactiveSelectionBackground&&t.push(".monaco-tree.monaco-tree-instance-"+this.instance+" .monaco-tree-rows > .monaco-tree-row.selected:not(.highlighted) { background-color: "+e.listInactiveSelectionBackground+"; }"),e.listInactiveSelectionForeground&&t.push(".monaco-tree.monaco-tree-instance-"+this.instance+" .monaco-tree-rows > .monaco-tree-row.selected:not(.highlighted) { color: "+e.listInactiveSelectionForeground+"; }"),e.listHoverBackground&&t.push(".monaco-tree.monaco-tree-instance-"+this.instance+" .monaco-tree-rows > .monaco-tree-row:hover:not(.highlighted):not(.selected):not(.focused) { background-color: "+e.listHoverBackground+"; }"),e.listHoverForeground&&t.push(".monaco-tree.monaco-tree-instance-"+this.instance+" .monaco-tree-rows > .monaco-tree-row:hover:not(.highlighted):not(.selected):not(.focused) { color: "+e.listHoverForeground+"; }"),e.listDropBackground&&t.push("\n\t\t\t\t.monaco-tree.monaco-tree-instance-"+this.instance+" .monaco-tree-wrapper.drop-target,\n\t\t\t\t.monaco-tree.monaco-tree-instance-"+this.instance+" .monaco-tree-rows > .monaco-tree-row.drop-target { background-color: "+e.listDropBackground+" !important; color: inherit !important; }\n\t\t\t"),e.listFocusOutline&&t.push("\n\t\t\t\t.monaco-tree-drag-image\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{ border: 1px solid "+e.listFocusOutline+"; background: #000; }\n\t\t\t\t.monaco-tree.monaco-tree-instance-"+this.instance+" .monaco-tree-rows > .monaco-tree-row \t\t\t\t\t\t\t\t\t\t\t\t\t\t{ border: 1px solid transparent; }\n\t\t\t\t.monaco-tree.monaco-tree-instance-"+this.instance+".focused .monaco-tree-rows > .monaco-tree-row.focused:not(.highlighted) \t\t\t\t\t\t{ border: 1px dotted "+e.listFocusOutline+"; }\n\t\t\t\t.monaco-tree.monaco-tree-instance-"+this.instance+".focused .monaco-tree-rows > .monaco-tree-row.selected:not(.highlighted) \t\t\t\t\t\t{ border: 1px solid "+e.listFocusOutline+"; }\n\t\t\t\t.monaco-tree.monaco-tree-instance-"+this.instance+" .monaco-tree-rows > .monaco-tree-row.selected:not(.highlighted) \t\t\t\t\t\t\t{ border: 1px solid "+e.listFocusOutline+"; }\n\t\t\t\t.monaco-tree.monaco-tree-instance-"+this.instance+" .monaco-tree-rows > .monaco-tree-row:hover:not(.highlighted):not(.selected):not(.focused) \t{ border: 1px dashed "+e.listFocusOutline+"; }\n\t\t\t\t.monaco-tree.monaco-tree-instance-"+this.instance+" .monaco-tree-wrapper.drop-target,\n\t\t\t\t.monaco-tree.monaco-tree-instance-"+this.instance+" .monaco-tree-rows > .monaco-tree-row.drop-target\t\t\t\t\t\t\t\t\t\t\t\t{ border: 1px dashed "+e.listFocusOutline+"; }\n\t\t\t"),this.styleElement.innerHTML=t.join("\n")},t.prototype.createViewItem=function(e){return new S(this.context,e)},t.prototype.getHTMLElement=function(){return this.domNode},t.prototype.focus=function(){this.domNode.focus()},t.prototype.isFocused=function(){return document.activeElement===this.domNode},t.prototype.blur=function(){this.domNode.blur()},t.prototype.onVisible=function(){this.scrollTop=this.onHiddenScrollTop,this.onHiddenScrollTop=null,this.setupMSGesture()},t.prototype.setupMSGesture=function(){var e=this;window.MSGesture&&(this.msGesture=new MSGesture,setTimeout(function(){return e.msGesture.target=e.wrapper},100))},t.prototype.onHidden=function(){this.onHiddenScrollTop=this.scrollTop},t.prototype.isTreeVisible=function(){return null===this.onHiddenScrollTop},t.prototype.layout=function(e){this.isTreeVisible()&&(this.viewHeight=e||s.getContentHeight(this.wrapper))},t.prototype.render=function(e,t){var n,i,o=e,r=e+t,s=this.lastRenderTop+this.lastRenderHeight;for(n=this.indexAfter(r)-1,i=this.indexAt(Math.max(s,o));n>=i;n--)this.insertItemInDOM(this.itemAtIndex(n));for(n=Math.min(this.indexAt(this.lastRenderTop),this.indexAfter(r))-1,i=this.indexAt(o);n>=i;n--)this.insertItemInDOM(this.itemAtIndex(n));for(n=this.indexAt(this.lastRenderTop),i=Math.min(this.indexAt(o),this.indexAfter(s));n0&&this.onItemsRefresh(t)},t.prototype.onRefreshing=function(){this.isRefreshing=!0},t.prototype.onRefreshed=function(){this.isRefreshing=!1,this.onRowsChanged()},t.prototype.onRowsChanged=function(e){void 0===e&&(e=this.scrollTop),this.isRefreshing||(this.scrollTop=e)},t.prototype.focusNextPage=function(e){var t=this,n=this.indexAt(this.scrollTop+this.viewHeight);n=0===n?0:n-1;var i=this.itemAtIndex(n).model.getElement();if(this.model.getFocus()!==i)this.model.setFocus(i,e);else{var o=this.scrollTop;this.scrollTop+=this.viewHeight,this.scrollTop!==o&&setTimeout(function(){t.focusNextPage(e)},0)}},t.prototype.focusPreviousPage=function(e){var t,n=this;t=0===this.scrollTop?this.indexAt(this.scrollTop):this.indexAfter(this.scrollTop-1);var i=this.itemAtIndex(t).model.getElement();if(this.model.getFocus()!==i)this.model.setFocus(i,e);else{var o=this.scrollTop;this.scrollTop-=this.viewHeight,this.scrollTop!==o&&setTimeout(function(){n.focusPreviousPage(e)},0)}},Object.defineProperty(t.prototype,"viewHeight",{get:function(){return this.scrollableElement.getScrollState().height},set:function(e){this.scrollableElement.updateState({height:e,scrollHeight:this.getTotalHeight()})},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"scrollTop",{get:function(){return this.scrollableElement.getScrollState().scrollTop},set:function(e){this.scrollableElement.updateState({scrollTop:e,scrollHeight:this.getTotalHeight()})},enumerable:!0,configurable:!0}),t.prototype.getScrollPosition=function(){var e=this.getTotalHeight()-this.viewHeight;return e<=0?0:this.scrollTop/e},t.prototype.setScrollPosition=function(e){var t=this.getTotalHeight()-this.viewHeight;this.scrollTop=t*e},t.prototype.onClearingInput=function(e){var t=e.item;t&&(this.onRemoveItems(new p.MappedIterator(t.getNavigator(),function(e){return e&&e.id})),this.onRowsChanged())},t.prototype.onSetInput=function(e){this.context.cache.garbageCollect(),this.inputItem=new E(this.context,e.item,this.wrapper),this.emit("viewItem:create",{item:this.inputItem.model})},t.prototype.onItemChildrenRefreshing=function(e){var n=e.item,i=this.items[n.id];if(i&&(i.loadingTimer=setTimeout(function(){i.loadingTimer=0,i.loading=!0},t.LOADING_DECORATION_DELAY)),!e.isNested){for(var o,r=[],s=n.getNavigator();o=s.next();)r.push(o.id);this.refreshingPreviousChildrenIds[n.id]=r}},t.prototype.onItemChildrenRefreshed=function(e){var t=this,n=e.item,i=this.items[n.id];if(i&&(i.loadingTimer&&(clearTimeout(i.loadingTimer),i.loadingTimer=0),i.loading=!1),!e.isNested){for(var o,r=this.refreshingPreviousChildrenIds[n.id],s=[],u=n.getNavigator();o=u.next();)s.push(o);var l=Math.abs(r.length-s.length)>1e3,c=void 0,d=void 0;if(l||(d=(c=new a.LcsDiff({getLength:function(){return r.length},getElementHash:function(e){return r[e]}},{getLength:function(){return s.length},getElementHash:function(e){return s[e].id}},null).ComputeDiff(!1)).some(function(e){if(e.modifiedLength>0)for(var n=e.modifiedStart,i=e.modifiedStart+e.modifiedLength;n0&&this.onRemoveItems(new p.ArrayIterator(r,g.originalStart,g.originalStart+g.originalLength)),g.modifiedLength>0){var m=s[g.modifiedStart-1]||n;m=m.getDepth()>0?m:null,this.onInsertItems(new p.ArrayIterator(s,g.modifiedStart,g.modifiedStart+g.modifiedLength),m?m.id:null)}}else(l||c.length)&&(this.onRemoveItems(new p.ArrayIterator(r)),this.onInsertItems(new p.ArrayIterator(s),n.getDepth()>0?n.id:null));(l||c.length)&&this.onRowsChanged()}},t.prototype.onItemsRefresh=function(e){var t=this;this.onRefreshItemSet(e.filter(function(e){return t.items.hasOwnProperty(e.id)})),this.onRowsChanged()},t.prototype.onItemExpanding=function(e){var t=this.items[e.item.id];t&&(t.expanded=!0)},t.prototype.onItemExpanded=function(e){var t=e.item,n=this.items[t.id];if(n){n.expanded=!0;var i=this.onInsertItems(t.getNavigator(),t.id),o=this.scrollTop;n.top+n.height<=this.scrollTop&&(o+=i),this.onRowsChanged(o)}},t.prototype.onItemCollapsing=function(e){var t=e.item,n=this.items[t.id];n&&(n.expanded=!1,this.onRemoveItems(new p.MappedIterator(t.getNavigator(),function(e){return e&&e.id})),this.onRowsChanged())},t.prototype.getRelativeTop=function(e){if(e&&e.isVisible()){var t=this.items[e.id];if(t)return(t.top-this.scrollTop)/(this.viewHeight-t.height)}return-1},t.prototype.onItemReveal=function(e){var t=e.item,n=e.relativeTop,i=this.items[t.id];if(i)if(null!==n){n=(n=n<0?0:n)>1?1:n;var o=i.height-this.viewHeight;this.scrollTop=o*n+i.top}else{var r=i.top+i.height,s=this.scrollTop+this.viewHeight;i.top=s&&(this.scrollTop=r-this.viewHeight)}},t.prototype.onItemAddTrait=function(e){var t=e.item,n=e.trait,i=this.items[t.id];i&&i.addClass(n),"highlighted"===n&&(s.addClass(this.domNode,n),i&&(this.highlightedItemWasDraggable=!!i.draggable,i.draggable&&(i.draggable=!1)))},t.prototype.onItemRemoveTrait=function(e){var t=e.item,n=e.trait,i=this.items[t.id];i&&i.removeClass(n),"highlighted"===n&&(s.removeClass(this.domNode,n),this.highlightedItemWasDraggable&&(i.draggable=!0),this.highlightedItemWasDraggable=!1)},t.prototype.onModelFocusChange=function(){var e=this.model&&this.model.getFocus();s.toggleClass(this.domNode,"no-focused-item",!e),e?this.domNode.setAttribute("aria-activedescendant",l.safeBtoa(this.context.dataSource.getId(this.context.tree,e))):this.domNode.removeAttribute("aria-activedescendant")},t.prototype.onInsertItem=function(e){var t=this;e.onDragStart=function(n){t.onDragStart(e,n)},e.needsRender=!0,this.refreshViewItem(e),this.items[e.id]=e},t.prototype.onRefreshItem=function(e,t){void 0===t&&(t=!1),e.needsRender=e.needsRender||t,this.refreshViewItem(e)},t.prototype.onRemoveItem=function(e){this.removeItemFromDOM(e),e.dispose(),this.emit("viewItem:dispose",{item:this.inputItem.model}),delete this.items[e.id]},t.prototype.refreshViewItem=function(e){e.render(),this.shouldBeRendered(e)?this.insertItemInDOM(e):this.removeItemFromDOM(e)},t.prototype.onClick=function(e){if(!this.lastPointerType||"mouse"===this.lastPointerType){var t=new c.StandardMouseEvent(e),n=this.getItemAround(t.target);n&&(i.isIE&&Date.now()-this.lastClickTimeStamp<300&&(t.detail=2),this.lastClickTimeStamp=Date.now(),this.context.controller.onClick(this.context.tree,n.model.getElement(),t))}},t.prototype.onMouseDown=function(e){if(this.didJustPressContextMenuKey=!1,this.context.controller.onMouseDown&&(!this.lastPointerType||"mouse"===this.lastPointerType)){var t=new c.StandardMouseEvent(e);if(!(t.ctrlKey&&n.isNative&&n.isMacintosh)){var i=this.getItemAround(t.target);i&&this.context.controller.onMouseDown(this.context.tree,i.model.getElement(),t)}}},t.prototype.onMouseUp=function(e){if(this.context.controller.onMouseUp&&(!this.lastPointerType||"mouse"===this.lastPointerType)){var t=new c.StandardMouseEvent(e);if(!(t.ctrlKey&&n.isNative&&n.isMacintosh)){var i=this.getItemAround(t.target);i&&this.context.controller.onMouseUp(this.context.tree,i.model.getElement(),t)}}},t.prototype.onTap=function(e){var t=this.getItemAround(e.initialTarget);t&&this.context.controller.onTap(this.context.tree,t.model.getElement(),e)},t.prototype.onTouchChange=function(e){e.preventDefault(),e.stopPropagation(),this.scrollTop-=e.translationY},t.prototype.onContextMenu=function(e){var t,n;if(e instanceof KeyboardEvent||this.didJustPressContextMenuKey){this.didJustPressContextMenuKey=!1;var i=new d.StandardKeyboardEvent(e);if(!(n=this.model.getFocus()))return;var o=this.context.dataSource.getId(this.context.tree,n),r=this.items[o],a=s.getDomNodePagePosition(r.element);t=new _.KeyboardContextMenuEvent(a.left+a.width,a.top,i)}else{var u=new c.StandardMouseEvent(e),l=this.getItemAround(u.target);if(!l)return;n=l.model.getElement(),t=new _.MouseContextMenuEvent(u)}this.context.controller.onContextMenu(this.context.tree,n,t)},t.prototype.onKeyDown=function(e){var t=new d.StandardKeyboardEvent(e);this.didJustPressContextMenuKey=58===t.keyCode||t.shiftKey&&68===t.keyCode,this.didJustPressContextMenuKey&&(t.preventDefault(),t.stopPropagation()),t.target&&t.target.tagName&&"input"===t.target.tagName.toLowerCase()||this.context.controller.onKeyDown(this.context.tree,t)},t.prototype.onKeyUp=function(e){this.didJustPressContextMenuKey&&this.onContextMenu(e),this.didJustPressContextMenuKey=!1,this.context.controller.onKeyUp(this.context.tree,new d.StandardKeyboardEvent(e))},t.prototype.onDragStart=function(e,n){if(!this.model.getHighlight()){var i,o=e.model.getElement(),r=this.model.getSelection();if(i=r.indexOf(o)>-1?r:[o],n.dataTransfer.effectAllowed="copyMove",n.dataTransfer.setData("URL",e.uri),n.dataTransfer.setDragImage){var s=void 0;s=this.context.dnd.getDragLabel?this.context.dnd.getDragLabel(this.context.tree,i):String(i.length);var a=document.createElement("div");a.className="monaco-tree-drag-image",a.textContent=s,document.body.appendChild(a),n.dataTransfer.setDragImage(a,-10,-10),setTimeout(function(){return document.body.removeChild(a)},0)}this.currentDragAndDropData=new h.ElementsDragAndDropData(i),t.currentExternalDragAndDropData=new h.ExternalElementsDragAndDropData(i),this.context.dnd.onDragStart(this.context.tree,this.currentDragAndDropData,new c.DragMouseEvent(n))}},t.prototype.setupDragAndDropScrollInterval=function(){var e=this,t=s.getTopLeftOffset(this.wrapper).top;this.dragAndDropScrollInterval||(this.dragAndDropScrollInterval=window.setInterval(function(){if(void 0!==e.dragAndDropMouseY){var n=e.dragAndDropMouseY-t,i=0,o=e.viewHeight-35;n<35?i=Math.max(-14,.2*(n-35)):n>o&&(i=Math.min(14,.2*(n-o))),e.scrollTop+=i}},10),this.cancelDragAndDropScrollTimeout(),this.dragAndDropScrollTimeout=window.setTimeout(function(){e.cancelDragAndDropScrollInterval(),e.dragAndDropScrollTimeout=null},1e3))},t.prototype.cancelDragAndDropScrollInterval=function(){this.dragAndDropScrollInterval&&(window.clearInterval(this.dragAndDropScrollInterval),this.dragAndDropScrollInterval=null),this.cancelDragAndDropScrollTimeout()},t.prototype.cancelDragAndDropScrollTimeout=function(){this.dragAndDropScrollTimeout&&(window.clearTimeout(this.dragAndDropScrollTimeout),this.dragAndDropScrollTimeout=null)},t.prototype.onDragOver=function(e){var n=this,i=new c.DragMouseEvent(e),r=this.getItemAround(i.target);if(!r||0===i.posx&&0===i.posy&&i.browserEvent.type===s.EventType.DRAG_LEAVE)return this.currentDropTarget&&(this.currentDropTargets.forEach(function(e){return e.dropTarget=!1}),this.currentDropTargets=[],this.currentDropPromise&&(this.currentDropPromise.cancel(),this.currentDropPromise=null)),this.cancelDragAndDropScrollInterval(),this.currentDropTarget=null,this.currentDropElement=null,this.dragAndDropMouseY=null,!1;if(this.setupDragAndDropScrollInterval(),this.dragAndDropMouseY=i.posy,!this.currentDragAndDropData)if(t.currentExternalDragAndDropData)this.currentDragAndDropData=t.currentExternalDragAndDropData;else{if(!i.dataTransfer.types)return!1;this.currentDragAndDropData=new h.DesktopDragAndDropData}this.currentDragAndDropData.update(i);var a,u,l=r.model;do{if(a=l?l.getElement():this.model.getInput(),!(u=this.context.dnd.onDragOver(this.context.tree,this.currentDragAndDropData,a,i))||u.bubble!==_.DragOverBubble.BUBBLE_UP)break;l=l&&l.parent}while(l);if(!l)return this.currentDropElement=null,!1;var d=u&&u.accept;d?(this.currentDropElement=l.getElement(),i.preventDefault(),i.dataTransfer.dropEffect=u.effect===_.DragOverEffect.COPY?"copy":"move"):this.currentDropElement=null;var p=l.id===this.inputItem.id?this.inputItem:this.items[l.id];if((this.shouldInvalidateDropReaction||this.currentDropTarget!==p||!b(this.currentDropElementReaction,u))&&(this.shouldInvalidateDropReaction=!1,this.currentDropTarget&&(this.currentDropTargets.forEach(function(e){return e.dropTarget=!1}),this.currentDropTargets=[],this.currentDropPromise&&(this.currentDropPromise.cancel(),this.currentDropPromise=null)),this.currentDropTarget=p,this.currentDropElementReaction=u,d)){if(this.currentDropTarget&&(this.currentDropTarget.dropTarget=!0,this.currentDropTargets.push(this.currentDropTarget)),u.bubble===_.DragOverBubble.BUBBLE_DOWN)for(var f,g=l.getNavigator();f=g.next();)(r=this.items[f.id])&&(r.dropTarget=!0,this.currentDropTargets.push(r));u.autoExpand&&(this.currentDropPromise=o.TPromise.timeout(500).then(function(){return n.context.tree.expand(n.currentDropElement)}).then(function(){return n.shouldInvalidateDropReaction=!0}))}return!0},t.prototype.onDrop=function(e){if(this.currentDropElement){var t=new c.DragMouseEvent(e);t.preventDefault(),this.currentDragAndDropData.update(t),this.context.dnd.drop(this.context.tree,this.currentDragAndDropData,this.currentDropElement,t),this.onDragEnd(e)}this.cancelDragAndDropScrollInterval()},t.prototype.onDragEnd=function(e){this.currentDropTarget&&(this.currentDropTargets.forEach(function(e){return e.dropTarget=!1}),this.currentDropTargets=[]),this.currentDropPromise&&(this.currentDropPromise.cancel(),this.currentDropPromise=null),this.cancelDragAndDropScrollInterval(),this.currentDragAndDropData=null,t.currentExternalDragAndDropData=null,this.currentDropElement=null,this.currentDropTarget=null,this.dragAndDropMouseY=null},t.prototype.onFocus=function(){this.context.options.alwaysFocused||s.addClass(this.domNode,"focused"),this._onDOMFocus.fire()},t.prototype.onBlur=function(){this.context.options.alwaysFocused||s.removeClass(this.domNode,"focused"),this.domNode.removeAttribute("aria-activedescendant"),this._onDOMBlur.fire()},t.prototype.onMsPointerDown=function(e){if(this.msGesture){var t=e.pointerType;t!==(e.MSPOINTER_TYPE_MOUSE||"mouse")?t===(e.MSPOINTER_TYPE_TOUCH||"touch")&&(this.lastPointerType="touch",e.stopPropagation(),e.preventDefault(),this.msGesture.addPointer(e.pointerId)):this.lastPointerType="mouse"}},t.prototype.onThrottledMsGestureChange=function(e){this.scrollTop-=e.translationY},t.prototype.onMsGestureTap=function(e){e.initialTarget=document.elementFromPoint(e.clientX,e.clientY),this.onTap(e)},t.prototype.insertItemInDOM=function(e){var t=null,n=this.itemAfter(e);n&&n.element&&(t=n.element),e.insertInDOM(this.rowsContainer,t)},t.prototype.removeItemFromDOM=function(e){e&&e.removeFromDOM()},t.prototype.shouldBeRendered=function(e){return e.topthis.lastRenderTop},t.prototype.getItemAround=function(e){var n=this.inputItem;do{if(e[t.BINDING]&&(n=e[t.BINDING]),e===this.wrapper||e===this.domNode)return n;if(e===document.body)return null}while(e=e.parentElement)},t.prototype.releaseModel=function(){this.model&&(this.modelListeners=r.dispose(this.modelListeners),this.model=null)},t.prototype.dispose=function(){this.scrollableElement.dispose(),this.releaseModel(),this.modelListeners=null,this.viewListeners=r.dispose(this.viewListeners),this._onDOMFocus.dispose(),this._onDOMBlur.dispose(),this.domNode.parentNode&&this.domNode.parentNode.removeChild(this.domNode),this.domNode=null,this.wrapperGesture&&(this.wrapperGesture.dispose(),this.wrapperGesture=null),this.context.cache&&(this.context.cache.dispose(),this.context.cache=null),e.prototype.dispose.call(this)},t.BINDING="monaco-tree-row",t.LOADING_DECORATION_DELAY=800,t.counter=0,t.currentExternalDragAndDropData=null,t}(v.HeightMap);t.TreeView=L}),define(d[249],h([5]),{}),define(d[259],h([1,0,3,11,41,4,33,32,26,249]),function(e,t,n,i,o,r,s,a,u){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.defaultStyles={selectBackground:a.Color.fromHex("#3C3C3C"),selectForeground:a.Color.fromHex("#F0F0F0"),selectBorder:a.Color.fromHex("#3C3C3C")};var l=function(e){function o(n,o,s){void 0===s&&(s=u.clone(t.defaultStyles));var a=e.call(this)||this;return a.selectElement=document.createElement("select"),a.selectElement.className="select-box",a.setOptions(n,o),a.toDispose=[],a._onDidSelect=new i.Emitter,a.selectBackground=s.selectBackground,a.selectForeground=s.selectForeground,a.selectBorder=s.selectBorder,a.toDispose.push(r.addStandardDisposableListener(a.selectElement,"change",function(e){a.selectElement.title=e.target.value,a._onDidSelect.fire({index:e.target.selectedIndex,selected:e.target.value})})),a.toDispose.push(r.addStandardDisposableListener(a.selectElement,"keydown",function(e){(e.equals(10)||e.equals(3))&&e.stopPropagation()})),a}return f(o,e),Object.defineProperty(o.prototype,"onDidSelect",{get:function(){return this._onDidSelect.event},enumerable:!0,configurable:!0}),o.prototype.setOptions=function(e,t,n){var i=this;if(!this.options||!s.equals(this.options,e)){this.options=e,this.selectElement.options.length=0;var o=0;this.options.forEach(function(e){i.selectElement.add(i.createOption(e,n===o++))})}this.select(t)},o.prototype.select=function(e){e>=0&&e=this._lines.length)throw new Error("Illegal value for lineNumber: "+e);return this._lines[t]},e.prototype.onLinesDeleted=function(e,t){if(0===this.getCount())return null;var n=this.getStartLineNumber(),i=this.getEndLineNumber();if(ti)return null;for(var r=0,s=0,a=n;a<=i;a++){var u=a-this._rendLineNumberStart;e<=a&&a<=t&&(0===s?(r=u,s=1):s++)}if(e=n&&r<=i&&(this._lines[r-this._rendLineNumberStart].onContentChanged(),o=!0);return o},e.prototype.onLinesInserted=function(e,t){if(0===this.getCount())return null;var n=t-e+1,i=this.getStartLineNumber(),o=this.getEndLineNumber();if(e<=i)return this._rendLineNumberStart+=n,null;if(e>o)return null;if(n+e>o)return this._lines.splice(e-this._rendLineNumberStart,o-e+1);for(var r=[],s=0;sn))for(var a=Math.max(t,s.fromLineNumber),u=Math.min(n,s.toLineNumber),l=a;l<=u;l++){var c=l-this._rendLineNumberStart;this._lines[c].onTokensChanged(),i=!0}}return i},e}();t.RenderedLinesCollection=i;var o=function(){function e(e){var t=this;this._host=e,this.domNode=this._createDomNode(),this._linesCollection=new i(function(){return t._host.createVisibleLine()})}return e.prototype._createDomNode=function(){var e=n.createFastDomNode(document.createElement("div"));return e.setClassName("view-layer"),e.setPosition("absolute"),e.domNode.setAttribute("role","presentation"),e.domNode.setAttribute("aria-hidden","true"),e},e.prototype.onConfigurationChanged=function(e){return e.layoutInfo},e.prototype.onFlushed=function(e){return this._linesCollection.flush(),!0},e.prototype.onLinesChanged=function(e){return this._linesCollection.onLinesChanged(e.fromLineNumber,e.toLineNumber)},e.prototype.onLinesDeleted=function(e){var t=this._linesCollection.onLinesDeleted(e.fromLineNumber,e.toLineNumber);if(t)for(var n=0,i=t.length;nt?(s=t)<=(a=Math.min(n,o.rendLineNumberStart-1))&&(this._insertLinesBefore(o,s,a,i,t),o.linesLength+=a-s+1):o.rendLineNumberStart0&&(this._removeLinesBefore(o,u),o.linesLength-=u),o.rendLineNumberStart=t,o.rendLineNumberStart+o.linesLength-1n){var s=Math.max(0,n-o.rendLineNumberStart+1),a=o.linesLength-1,u=a-s+1;u>0&&(this._removeLinesAfter(o,u),o.linesLength-=u)}return this._finishRendering(o,!1,i),o},e.prototype._renderUntouchedLines=function(e,t,n,i,o){for(var r=e.rendLineNumberStart,s=e.lines,a=t;a<=n;a++){var u=r+a;s[a].layoutLine(u,i[u-o])}},e.prototype._insertLinesBefore=function(e,t,n,i,o){for(var r=[],s=0,a=t;a<=n;a++)r[s++]=this.host.createVisibleLine();e.lines=r.concat(e.lines)},e.prototype._removeLinesBefore=function(e,t){for(var n=0;n=0;s--){var a=e.lines[s];i[s]&&(a.setDomNode(r),r=r.previousSibling)}},e.prototype._finishRenderingInvalidLines=function(e,t,n){var i=document.createElement("div");i.innerHTML=t.join("");for(var o=0;on||e===n&&t>i?(this.startLineNumber=n,this.startColumn=i,this.endLineNumber=e,this.endColumn=t):(this.startLineNumber=e,this.startColumn=t,this.endLineNumber=n,this.endColumn=i)}return e.prototype.isEmpty=function(){return e.isEmpty(this)},e.isEmpty=function(e){return e.startLineNumber===e.endLineNumber&&e.startColumn===e.endColumn},e.prototype.containsPosition=function(t){return e.containsPosition(this,t)},e.containsPosition=function(e,t){return!(t.lineNumbere.endLineNumber)&&(!(t.lineNumber===e.startLineNumber&&t.columne.endColumn))},e.prototype.containsRange=function(t){return e.containsRange(this,t)},e.containsRange=function(e,t){return!(t.startLineNumbere.endLineNumber||t.endLineNumber>e.endLineNumber)&&(!(t.startLineNumber===e.startLineNumber&&t.startColumne.endColumn)))},e.prototype.plusRange=function(t){return e.plusRange(this,t)},e.plusRange=function(t,n){var i,o,r,s;return n.startLineNumbert.endLineNumber?(r=n.endLineNumber,s=n.endColumn):n.endLineNumber===t.endLineNumber?(r=n.endLineNumber,s=Math.max(n.endColumn,t.endColumn)):(r=t.endLineNumber,s=t.endColumn),new e(i,o,r,s)},e.prototype.intersectRanges=function(t){return e.intersectRanges(this,t)},e.intersectRanges=function(t,n){var i=t.startLineNumber,o=t.startColumn,r=t.endLineNumber,s=t.endColumn,a=n.startLineNumber,u=n.startColumn,l=n.endLineNumber,c=n.endColumn;return il?(r=l,s=c):r===l&&(s=Math.min(s,c)),i>r?null:i===r&&o>s?null:new e(i,o,r,s)},e.prototype.equalsRange=function(t){return e.equalsRange(this,t)},e.equalsRange=function(e,t){return!!e&&!!t&&e.startLineNumber===t.startLineNumber&&e.startColumn===t.startColumn&&e.endLineNumber===t.endLineNumber&&e.endColumn===t.endColumn},e.prototype.getEndPosition=function(){return new n.Position(this.endLineNumber,this.endColumn)},e.prototype.getStartPosition=function(){return new n.Position(this.startLineNumber,this.startColumn)},e.prototype.cloneRange=function(){return new e(this.startLineNumber,this.startColumn,this.endLineNumber,this.endColumn)},e.prototype.toString=function(){return"["+this.startLineNumber+","+this.startColumn+" -> "+this.endLineNumber+","+this.endColumn+"]"},e.prototype.setEndPosition=function(t,n){return new e(this.startLineNumber,this.startColumn,t,n)},e.prototype.setStartPosition=function(t,n){return new e(t,n,this.endLineNumber,this.endColumn)},e.prototype.collapseToStart=function(){return e.collapseToStart(this)},e.collapseToStart=function(t){return new e(t.startLineNumber,t.startColumn,t.startLineNumber,t.startColumn)},e.fromPositions=function(t,n){return void 0===n&&(n=t),new e(t.lineNumber,t.column,n.lineNumber,n.column)},e.lift=function(t){return t?new e(t.startLineNumber,t.startColumn,t.endLineNumber,t.endColumn):null},e.isIRange=function(e){return e&&"number"==typeof e.startLineNumber&&"number"==typeof e.startColumn&&"number"==typeof e.endLineNumber&&"number"==typeof e.endColumn},e.areIntersectingOrTouching=function(e,t){return!(e.endLineNumbere.startLineNumber},e}();t.Range=i}),define(d[164],h([1,0,72,38,26,2,3]),function(e,t,n,i,o,r,s){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var a={followsCaret:!0,ignoreCharChanges:!0,alwaysRevealFirst:!0},u=function(e){function t(n,i){void 0===i&&(i={});var r=e.call(this,[t.Events.UPDATED])||this;return r.editor=n,r.options=o.mixin(i,a,!1),r.disposed=!1,r.toUnbind=[],r.nextIdx=-1,r.ranges=[],r.ignoreSelectionChange=!1,r.revealFirst=r.options.alwaysRevealFirst,r.toUnbind.push(r.editor.onDidDispose(function(){return r.dispose()})),r.toUnbind.push(r.editor.onDidUpdateDiff(function(){return r.onDiffUpdated()})),r.options.followsCaret&&r.toUnbind.push(r.editor.getModifiedEditor().onDidChangeCursorPosition(function(e){r.ignoreSelectionChange||(r.nextIdx=-1)})),r.options.alwaysRevealFirst&&r.toUnbind.push(r.editor.getModifiedEditor().onDidChangeModel(function(e){r.revealFirst=!0})),r.init(),r}return f(t,e),t.prototype.init=function(){this.editor.getLineChanges()},t.prototype.onDiffUpdated=function(){this.init(),this.compute(this.editor.getLineChanges()),this.revealFirst&&null!==this.editor.getLineChanges()&&(this.revealFirst=!1,this.nextIdx=-1,this.next())},t.prototype.compute=function(e){var n=this;this.ranges=[],e&&e.forEach(function(e){!n.options.ignoreCharChanges&&e.charChanges?e.charChanges.forEach(function(e){n.ranges.push({rhs:!0,range:new r.Range(e.modifiedStartLineNumber,e.modifiedStartColumn,e.modifiedEndLineNumber,e.modifiedEndColumn)})}):n.ranges.push({rhs:!0,range:new r.Range(e.modifiedStartLineNumber,1,e.modifiedStartLineNumber,1)})}),this.ranges.sort(function(e,t){return e.range.getStartPosition().isBeforeOrEqual(t.range.getStartPosition())?-1:t.range.getStartPosition().isBeforeOrEqual(e.range.getStartPosition())?1:0}),this.emit(t.Events.UPDATED,{})},t.prototype.initIdx=function(e){for(var t=!1,n=this.editor.getPosition(),i=0,o=this.ranges.length;i=this.ranges.length&&(this.nextIdx=0)):(this.nextIdx-=1,this.nextIdx<0&&(this.nextIdx=this.ranges.length-1));var t=this.ranges[this.nextIdx];this.ignoreSelectionChange=!0;try{var i=t.range.getStartPosition();this.editor.setPosition(i),this.editor.revealPositionInCenter(i)}finally{this.ignoreSelectionChange=!1}}},t.prototype.canNavigate=function(){return this.ranges&&this.ranges.length>0},t.prototype.next=function(){this.move(!0)},t.prototype.previous=function(){this.move(!1)},t.prototype.dispose=function(){this.toUnbind=s.dispose(this.toUnbind),this.ranges=null,this.disposed=!0,e.prototype.dispose.call(this)},t.Events={UPDATED:"navigation.updated"},t}(i.EventEmitter);t.DiffNavigator=u}),define(d[59],h([1,0,2]),function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(){}return e.insert=function(e,t){return{identifier:null,range:new n.Range(e.lineNumber,e.column,e.lineNumber,e.column),text:t,forceMoveMarkers:!0}},e.delete=function(e){return{identifier:null,range:e,text:null,forceMoveMarkers:!0}},e.replace=function(e,t){return{identifier:null,range:e,text:t,forceMoveMarkers:!1}},e.replaceMove=function(e,t){return{identifier:null,range:e,text:t,forceMoveMarkers:!0}},e}();t.EditOperation=i}),define(d[435],h([1,0,9,59,2]),function(e,t,n,i,o){"use strict";function r(e,t){t.sort(function(e,t){return e.lineNumber===t.lineNumber?e.column-t.column:e.lineNumber-t.lineNumber});for(var r=t.length-2;r>=0;r--)t[r].lineNumber===t[r+1].lineNumber&&t.splice(r,1);for(var s=[],a=0,u=0,l=t.length,c=1,d=e.getLineCount();c<=d;c++){var h=e.getLineContent(c),p=h.length+1,f=0;if(!(u "+this.positionLineNumber+","+this.positionColumn+"]"},t.prototype.equalsSelection=function(e){return t.selectionsEqual(this,e)},t.selectionsEqual=function(e,t){return e.selectionStartLineNumber===t.selectionStartLineNumber&&e.selectionStartColumn===t.selectionStartColumn&&e.positionLineNumber===t.positionLineNumber&&e.positionColumn===t.positionColumn},t.prototype.getDirection=function(){return this.selectionStartLineNumber===this.startLineNumber&&this.selectionStartColumn===this.startColumn?o.LTR:o.RTL},t.prototype.setEndPosition=function(e,n){return this.getDirection()===o.LTR?new t(this.startLineNumber,this.startColumn,e,n):new t(e,n,this.startLineNumber,this.startColumn)},t.prototype.getPosition=function(){return new i.Position(this.positionLineNumber,this.positionColumn)},t.prototype.setStartPosition=function(e,n){return this.getDirection()===o.LTR?new t(e,n,this.endLineNumber,this.endColumn):new t(this.endLineNumber,this.endColumn,e,n)},t.fromPositions=function(e,n){return void 0===n&&(n=e),new t(e.lineNumber,e.column,n.lineNumber,n.column)},t.liftSelection=function(e){return new t(e.selectionStartLineNumber,e.selectionStartColumn,e.positionLineNumber,e.positionColumn)},t.selectionsArrEqual=function(e,t){if(e&&!t||!e&&t)return!1;if(!e&&!t)return!0;if(e.length!==t.length)return!1;for(var n=0,i=e.length;n4294967295?4294967295:0|e}Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e,t,n){for(var i=new Uint8Array(e*t),o=0,r=e*t;o255?255:0|e},t.toUint32=n,t.toUint32Array=function(e){for(var t=e.length,i=new Uint32Array(t),o=0;o=0&&e<256?this._asciiMap[e]=i:this._map.set(e,i)},e.prototype.get=function(e){return e>=0&&e<256?this._asciiMap[e]:this._map.get(e)||this._defaultValue},e}();t.CharacterClassifier=i;var o;!function(e){e[e.False=0]="False",e[e.True=1]="True"}(o||(o={}));var r=function(){function e(){this._actual=new i(0)}return e.prototype.add=function(e){this._actual.set(e,1)},e.prototype.has=function(e){return 1===this._actual.get(e)},e}();t.CharacterSet=r}),define(d[94],h([1,0,89]),function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});!function(e){e[e.Regular=0]="Regular",e[e.Whitespace=1]="Whitespace",e[e.WordSeparator=2]="WordSeparator"}(t.WordCharacterClass||(t.WordCharacterClass={}));var i=function(e){function t(t){for(var n=e.call(this,0)||this,i=0,o=t.length;i1&&v>1&&(w=f.charCodeAt(m-2))===(S=g.charCodeAt(v-2));)m--,v--;(m>1||v>1)&&this._pushTrimWhitespaceCharChange(r,s+1,1,m,a+1,1,v);for(var _=l._getLastNonBlankColumn(f,1),y=l._getLastNonBlankColumn(g,1),C=f.length+1,b=g.length+1;_, selectionStart: "+this.selectionStart+", selectionEnd: "+this.selectionEnd+"]"},e.prototype.readFromTextArea=function(t){return new e(t.getValue(),t.getSelectionStart(),t.getSelectionEnd())},e.prototype.collapseSelection=function(){return new e(this.value,this.value.length,this.value.length)},e.prototype.writeToTextArea=function(e,t,n){t.setValue(e,this.value),n&&t.setSelectionRange(e,this.selectionStart,this.selectionEnd)},e.selectedText=function(t){return new e(t,0,t.length)},e.deduceInput=function(e,t,n){if(!e)return{text:"",replaceCharCnt:0};var i=e.value,r=e.selectionStart,s=e.selectionEnd,a=t.value,u=t.selectionStart,l=t.selectionEnd,c=i.substring(s),d=a.substring(l),h=o.commonSuffixLength(c,d);a=a.substring(0,a.length-h);var p=(i=i.substring(0,i.length-h)).substring(0,r),f=a.substring(0,u),g=o.commonPrefixLength(p,f);if(a=a.substring(g),i=i.substring(g),u-=g,r-=g,l-=g,s-=g,n&&u===l&&i.length>0){var m=null;if(u===a.length?o.startsWith(a,i)&&(m=a.substring(i.length)):o.endsWith(a,i)&&(m=a.substring(0,a.length-i.length)),null!==m&&m.length>0&&(/\uFE0F/.test(m)||o.containsEmoji(m)))return{text:m,replaceCharCnt:0}}return u===l?i===a&&0===r&&s===i.length&&u===a.length&&-1===a.indexOf("\n")&&o.containsFullWidthCharacter(a)?{text:"",replaceCharCnt:0}:{text:a,replaceCharCnt:p.length-g}:{text:a,replaceCharCnt:s-r}},e.EMPTY=new e("",0,0),e}();t.TextAreaState=r;var s=function(){function e(){}return e._getPageOfLine=function(t){return Math.floor((t-1)/e._LINES_PER_PAGE)},e._getRangeForPage=function(t){var i=t*e._LINES_PER_PAGE,o=i+1,r=i+e._LINES_PER_PAGE;return new n.Range(o,1,r+1,1)},e.fromEditorSelection=function(t,o,s){var a=e._getPageOfLine(s.startLineNumber),u=e._getRangeForPage(a),l=e._getPageOfLine(s.endLineNumber),c=e._getRangeForPage(l),d=u.intersectRanges(new n.Range(1,1,s.startLineNumber,s.startColumn)),h=o.getValueInRange(d,i.EndOfLinePreference.LF),p=o.getLineCount(),f=o.getLineMaxColumn(p),g=c.intersectRanges(new n.Range(s.endLineNumber,s.endColumn,p,f)),m=o.getValueInRange(g,i.EndOfLinePreference.LF),v=null;if(a===l||a+1===l)v=o.getValueInRange(s,i.EndOfLinePreference.LF);else{var _=u.intersectRanges(s),y=c.intersectRanges(s);v=o.getValueInRange(_,i.EndOfLinePreference.LF)+String.fromCharCode(8230)+o.getValueInRange(y,i.EndOfLinePreference.LF)}return h.length>500&&(h=h.substring(h.length-500,h.length)),m.length>500&&(m=m.substring(0,500)),v.length>1e3&&(v=v.substring(0,500)+String.fromCharCode(8230)+v.substring(v.length-500,v.length)),new r(h+v+m,h.length,h.length+v.length)},e._LINES_PER_PAGE=10,e}();t.PagedScreenReaderStrategy=s}),define(d[154],h([1,0,18,9,11,3,151,28,15,4]),function(e,t,n,i,o,r,s,a,u,l){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.CopyOptions={forceCopyWithSyntaxHighlighting:!1};var c;!function(e){e[e.Type=0]="Type",e[e.Paste=1]="Paste"}(c||(c={}));var d=function(e){function r(t,r){var c=e.call(this)||this;c._onFocus=c._register(new o.Emitter),c.onFocus=c._onFocus.event,c._onBlur=c._register(new o.Emitter),c.onBlur=c._onBlur.event,c._onKeyDown=c._register(new o.Emitter),c.onKeyDown=c._onKeyDown.event,c._onKeyUp=c._register(new o.Emitter),c.onKeyUp=c._onKeyUp.event,c._onCut=c._register(new o.Emitter),c.onCut=c._onCut.event,c._onPaste=c._register(new o.Emitter),c.onPaste=c._onPaste.event,c._onType=c._register(new o.Emitter),c.onType=c._onType.event,c._onCompositionStart=c._register(new o.Emitter),c.onCompositionStart=c._onCompositionStart.event,c._onCompositionUpdate=c._register(new o.Emitter),c.onCompositionUpdate=c._onCompositionUpdate.event,c._onCompositionEnd=c._register(new o.Emitter),c.onCompositionEnd=c._onCompositionEnd.event,c._host=t,c._textArea=c._register(new p(r)),c._asyncTriggerCut=c._register(new n.RunOnceScheduler(function(){return c._onCut.fire()},0)),c._textAreaState=s.TextAreaState.EMPTY,c.writeScreenReaderContent("ctor"),c._hasFocus=!1,c._isDoingComposition=!1,c._nextCommand=0,c._register(l.addStandardDisposableListener(r.domNode,"keydown",function(e){c._isDoingComposition&&e.equals(109)&&e.stopPropagation(),e.equals(9)&&e.preventDefault(),c._onKeyDown.fire(e)})),c._register(l.addStandardDisposableListener(r.domNode,"keyup",function(e){c._onKeyUp.fire(e)})),c._register(l.addDisposableListener(r.domNode,"compositionstart",function(e){c._isDoingComposition||(c._isDoingComposition=!0,a.isEdgeOrIE||c._setAndWriteTextAreaState("compositionstart",s.TextAreaState.EMPTY),c._onCompositionStart.fire())}));var d=function(e){var t=c._textAreaState,n=c._textAreaState.readFromTextArea(c._textArea);return[n,s.TextAreaState.deduceInput(t,n,e)]},f=function(e){var t=c._textAreaState,n=s.TextAreaState.selectedText(e);return[n,{text:n.value,replaceCharCnt:t.selectionEnd-t.selectionStart}]};return c._register(l.addDisposableListener(r.domNode,"compositionupdate",function(e){if(!a.isChromev56){if(a.isEdgeOrIE&&"ja"===e.locale){var t=d(!1),n=t[0],i=t[1];return c._textAreaState=n,c._onType.fire(i),void c._onCompositionUpdate.fire(e)}var o=f(e.data),r=o[0],s=o[1];c._textAreaState=r,c._onType.fire(s),c._onCompositionUpdate.fire(e)}})),c._register(l.addDisposableListener(r.domNode,"compositionend",function(e){if(a.isEdgeOrIE&&"ja"===e.locale){var t=d(!1),n=t[0],i=t[1];c._textAreaState=n,c._onType.fire(i)}else{var o=f(e.data),n=o[0],i=o[1];c._textAreaState=n,c._onType.fire(i)}(a.isEdgeOrIE||a.isChrome)&&(c._textAreaState=c._textAreaState.readFromTextArea(c._textArea)),c._isDoingComposition&&(c._isDoingComposition=!1,c._onCompositionEnd.fire())})),c._register(l.addDisposableListener(r.domNode,"input",function(){if(c._isDoingComposition){if(a.isChromev56){var e=f(c._textArea.getValue()),t=e[0],n=e[1];c._textAreaState=t,c._onType.fire(n);var o={data:n.text};c._onCompositionUpdate.fire(o)}}else{var r=d(u.isMacintosh),s=r[0],l=r[1];0===l.replaceCharCnt&&1===l.text.length&&i.isHighSurrogate(l.text.charCodeAt(0))||(c._textAreaState=s,0===c._nextCommand?""!==l.text&&c._onType.fire(l):(""!==l.text&&c._onPaste.fire({text:l.text}),c._nextCommand=0))}})),c._register(l.addDisposableListener(r.domNode,"cut",function(e){c._ensureClipboardGetsEditorSelection(e),c._asyncTriggerCut.schedule()})),c._register(l.addDisposableListener(r.domNode,"copy",function(e){c._ensureClipboardGetsEditorSelection(e)})),c._register(l.addDisposableListener(r.domNode,"paste",function(e){if(h.canUseTextData(e)){var t=h.getTextData(e);""!==t&&c._onPaste.fire({text:t})}else c._textArea.getSelectionStart()!==c._textArea.getSelectionEnd()&&c._setAndWriteTextAreaState("paste",s.TextAreaState.EMPTY),c._nextCommand=1})),c._register(l.addDisposableListener(r.domNode,"focus",function(){return c._setHasFocus(!0)})),c._register(l.addDisposableListener(r.domNode,"blur",function(){return c._setHasFocus(!1)})),c}return f(r,e),r.prototype.dispose=function(){e.prototype.dispose.call(this)},r.prototype.focusTextArea=function(){this._setHasFocus(!0)},r.prototype.isFocused=function(){return this._hasFocus},r.prototype._setHasFocus=function(e){this._hasFocus!==e&&(this._hasFocus=e,this._hasFocus&&(a.isEdge?this._setAndWriteTextAreaState("focusgain",s.TextAreaState.EMPTY):this.writeScreenReaderContent("focusgain")),this._hasFocus?this._onFocus.fire():this._onBlur.fire())},r.prototype._setAndWriteTextAreaState=function(e,t){this._hasFocus||(t=t.collapseSelection()),t.writeToTextArea(e,this._textArea,this._hasFocus),this._textAreaState=t},r.prototype.writeScreenReaderContent=function(e){this._isDoingComposition||this._setAndWriteTextAreaState(e,this._host.getScreenReaderContent(this._textAreaState))},r.prototype._ensureClipboardGetsEditorSelection=function(e){var n=this._host.getPlainTextToCopy();if(h.canUseTextData(e)){var i=null;!a.isEdgeOrIE&&(n.length<65536||t.CopyOptions.forceCopyWithSyntaxHighlighting)&&(i=this._host.getHTMLToCopy()),h.setTextData(e,n,i)}else this._setAndWriteTextAreaState("copy or cut",s.TextAreaState.selectedText(n))},r}(r.Disposable);t.TextAreaInput=d;var h=function(){function e(){}return e.canUseTextData=function(e){return!!e.clipboardData||!!window.clipboardData},e.getTextData=function(e){if(e.clipboardData)return e.preventDefault(),e.clipboardData.getData("text/plain");if(window.clipboardData)return e.preventDefault(),window.clipboardData.getData("Text");throw new Error("ClipboardEventUtils.getTextData: Cannot use text data!")},e.setTextData=function(e,t,n){if(e.clipboardData)return e.clipboardData.setData("text/plain",t),null!==n&&e.clipboardData.setData("text/html",n),void e.preventDefault();if(window.clipboardData)return window.clipboardData.setData("Text",t),void e.preventDefault();throw new Error("ClipboardEventUtils.setTextData: Cannot use text data!")},e}(),p=function(e){function t(t){var n=e.call(this)||this;return n._actual=t,n}return f(t,e),t.prototype.getValue=function(){return this._actual.domNode.value},t.prototype.setValue=function(e,t){var n=this._actual.domNode;n.value!==t&&(n.value=t)},t.prototype.getSelectionStart=function(){return this._actual.domNode.selectionStart},t.prototype.getSelectionEnd=function(){return this._actual.domNode.selectionEnd},t.prototype.setSelectionRange=function(e,t,n){var i=this._actual.domNode,o=document.activeElement===i,r=i.selectionStart,s=i.selectionEnd;if(!o||r!==t||s!==n)if(o)i.setSelectionRange(t,n);else try{var a=l.saveParentsScrollTop(i);i.focus(),i.setSelectionRange(t,n),l.restoreParentsScrollTop(i,a)}catch(e){}},t}(r.Disposable)}),define(d[475],h([1,0,10]),function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e){this.model=e,this.currentOpenStackElement=null,this.past=[],this.future=[]}return e.prototype.pushStackElement=function(){null!==this.currentOpenStackElement&&(this.past.push(this.currentOpenStackElement),this.currentOpenStackElement=null)},e.prototype.clear=function(){this.currentOpenStackElement=null,this.past=[],this.future=[]},e.prototype.pushEditOperation=function(e,t,i){this.future=[],this.currentOpenStackElement||(this.currentOpenStackElement={beforeVersionId:this.model.getAlternativeVersionId(),beforeCursorState:e,editOperations:[],afterCursorState:null,afterVersionId:-1});var o={operations:this.model.applyEdits(t)};this.currentOpenStackElement.editOperations.push(o);try{this.currentOpenStackElement.afterCursorState=i?i(o.operations):null}catch(e){n.onUnexpectedError(e),this.currentOpenStackElement.afterCursorState=null}return this.currentOpenStackElement.afterVersionId=this.model.getVersionId(),this.currentOpenStackElement.afterCursorState},e.prototype.undo=function(){if(this.pushStackElement(),this.past.length>0){var e=this.past.pop();try{for(var t=e.editOperations.length-1;t>=0;t--)e.editOperations[t]={operations:this.model.applyEdits(e.editOperations[t].operations)}}catch(e){return this.clear(),null}return this.future.push(e),{selections:e.beforeCursorState,recordedVersionId:e.beforeVersionId}}return null},e.prototype.redo=function(){if(this.future.length>0){if(this.currentOpenStackElement)throw new Error("How is this possible?");var e=this.future.pop();try{for(var t=0;t0;r--){var s=e.getIndentLevel(r);if(-1!==s){var a=o[o.length-1];if(a.indent>s){do{o.pop(),a=o[o.length-1]}while(a.indent>s);var u=a.line-1;u-r>=t&&i.push(new n(r,u,s))}a.indent===s?a.line=r:o.push({indent:s,line:r})}}return i.reverse()}}),define(d[482],h([1,0]),function(e,t){"use strict";function n(e,t,n,i){var o;for(o=0;o0&&s>0)return 0;if(l>0&&c>0)return 0;var h=Math.abs(s-c),p=Math.abs(r-l);return 0===h?p:p%h==0?p/h:0}Object.defineProperty(t,"__esModule",{value:!0}),t.guessIndentation=function(e,t,i){for(var o=Math.min(e.length,1e4),r=0,s=0,a="",u=0,l=[2,4,6,8],c=[0,0,0,0,0,0,0,0,0],d=0;d0?r++:g>1&&s++;var C=n(a,u,h,f);C<=8&&c[C]++,a=h,u=f}}var b=n(a,u,"",0);b<=8&&c[b]++;var w=i;r!==s&&(w=rE&&(E=t,S=e)}),{insertSpaces:w,tabSize:S}}}),define(d[55],h([1,0]),function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.TextModelEventType={ModelDispose:"modelDispose",ModelTokensChanged:"modelTokensChanged",ModelLanguageChanged:"modelLanguageChanged",ModelOptionsChanged:"modelOptionsChanged",ModelContentChanged:"contentChanged",ModelRawContentChanged2:"rawContentChanged2",ModelDecorationsChanged:"decorationsChanged"};!function(e){e[e.Flush=1]="Flush",e[e.LineChanged=2]="LineChanged",e[e.LinesDeleted=3]="LinesDeleted",e[e.LinesInserted=4]="LinesInserted",e[e.EOLChanged=5]="EOLChanged"}(t.RawContentChangedType||(t.RawContentChangedType={}));var n=function(){return function(){this.changeType=1}}();t.ModelRawFlush=n;var i=function(){return function(e,t){this.changeType=2,this.lineNumber=e,this.detail=t}}();t.ModelRawLineChanged=i;var o=function(){return function(e,t){this.changeType=3,this.fromLineNumber=e,this.toLineNumber=t}}();t.ModelRawLinesDeleted=o;var r=function(){return function(e,t,n){this.changeType=4,this.fromLineNumber=e,this.toLineNumber=t,this.detail=n}}();t.ModelRawLinesInserted=r;var s=function(){return function(){this.changeType=5}}();t.ModelRawEOLChanged=s;var a=function(){function e(e,t,n,i){this.changes=e,this.versionId=t,this.isUndoing=n,this.isRedoing=i}return e.prototype.containsEvent=function(e){for(var t=0,n=this.changes.length;t0){var s=t.charCodeAt(i);if(0!==e.get(s))return!0}return!1}function l(e,t,n,i,o){if(i+o===n)return!0;var r=t.charCodeAt(i+o);if(0!==e.get(r))return!0;if(o>0){var s=t.charCodeAt(i+o-1);if(0!==e.get(s))return!0}return!1}function c(e,t,n,i,o){return u(e,t,n,i,o)&&l(e,t,n,i,o)}Object.defineProperty(t,"__esModule",{value:!0});var d=function(){function e(e,t,n,i){this.searchString=e,this.isRegex=t,this.matchCase=n,this.wordSeparators=i}return e._isMultilineRegexSource=function(e){if(!e||0===e.length)return!1;for(var t=0,n=e.length;t=n)break;var i=e.charCodeAt(t);if(110===i||114===i)return!0}return!1},e.prototype.parseSearchRequest=function(){if(""===this.searchString)return null;var t;t=this.isRegex?e._isMultilineRegexSource(this.searchString):this.searchString.indexOf("\n")>=0;var i=null;try{i=n.createRegExp(this.searchString,this.isRegex,{matchCase:this.matchCase,wholeWord:!1,multiline:t,global:!0})}catch(e){return null}if(!i)return null;var o=!this.isRegex&&!t;return o&&this.searchString.toLowerCase()!==this.searchString.toUpperCase()&&(o=this.matchCase),new h(i,this.wordSeparators?s.getMapForWordSeparators(this.wordSeparators):null,o?this.searchString:null)},e}();t.SearchParams=d;var h=function(){return function(e,t,n){this.regex=e,this.wordSeparators=t,this.simpleSearch=n}}();t.SearchData=h;var p=function(){function e(){}return e.findMatches=function(e,t,n,i,o){var r=t.parseSearchRequest();return r?r.regex.multiline?this._doFindMatchesMultiline(e,n,new f(r.wordSeparators,r.regex),i,o):this._doFindMatchesLineByLine(e,n,r,i,o):[]},e._getMultilineMatchRange=function(e,t,n,i,r){var s;if("\r\n"===e.getEOL()){for(var a=0,u=0;u=o)return c;return c},e._doFindMatchesLineByLine=function(e,t,n,i,o){var r=[],s=0;if(t.startLineNumber===t.endLineNumber){var a=e.getLineContent(t.startLineNumber).substring(t.startColumn-1,t.endColumn-1);return s=this._findMatchesInLine(n,a,t.startLineNumber,t.startColumn-1,s,r,i,o),r}var u=e.getLineContent(t.startLineNumber).substring(t.startColumn-1);s=this._findMatchesInLine(n,u,t.startLineNumber,t.startColumn-1,s,r,i,o);for(var l=t.startLineNumber+1;l=d))return s;return s}var _,y=new f(e.wordSeparators,e.regex);y.reset(0);do{if((_=y.next(t))&&(u[s++]=a(new o.Range(n,_.index+1+i,n,_.index+1+_[0].length+i),_,l),s>=d))return s}while(_);return s},e.findNextMatch=function(e,t,n,i){var o=t.parseSearchRequest();if(!o)return null;var r=new f(o.wordSeparators,o.regex);return o.regex.multiline?this._doFindNextMatchMultiline(e,n,r,i):this._doFindNextMatchLineByLine(e,n,r,i)},e._doFindNextMatchMultiline=function(e,t,n,s){var u=new i.Position(t.lineNumber,1),l=e.getOffsetAt(u),c=e.getLineCount(),d=e.getValueInRange(new o.Range(u.lineNumber,u.column,c,e.getLineMaxColumn(c)),r.EndOfLinePreference.LF);n.reset(t.column-1);var h=n.next(d);return h?a(this._getMultilineMatchRange(e,l,d,h.index,h[0]),h,s):1!==t.lineNumber||1!==t.column?this._doFindNextMatchMultiline(e,new i.Position(1,1),n,s):null},e._doFindNextMatchLineByLine=function(e,t,n,i){var o=e.getLineCount(),r=t.lineNumber,s=e.getLineContent(r),a=this._findFirstMatchInLine(n,s,r,t.column,i);if(a)return a;for(var u=1;u<=o;u++){var l=(r+u-1)%o,c=e.getLineContent(l+1),d=this._findFirstMatchInLine(n,c,l+1,1,i);if(d)return d}return null},e._findFirstMatchInLine=function(e,t,n,i,r){e.reset(i-1);var s=e.next(t);return s?a(new o.Range(n,s.index+1,n,s.index+1+s[0].length),s,r):null},e.findPreviousMatch=function(e,t,n,i){var o=t.parseSearchRequest();if(!o)return null;var r=new f(o.wordSeparators,o.regex);return o.regex.multiline?this._doFindPreviousMatchMultiline(e,n,r,i):this._doFindPreviousMatchLineByLine(e,n,r,i)},e._doFindPreviousMatchMultiline=function(e,t,n,r){var s=this._doFindMatchesMultiline(e,new o.Range(1,1,t.lineNumber,t.column),n,r,9990);if(s.length>0)return s[s.length-1];var a=e.getLineCount();return t.lineNumber!==a||t.column!==e.getLineMaxColumn(a)?this._doFindPreviousMatchMultiline(e,new i.Position(a,e.getLineMaxColumn(a)),n,r):null},e._doFindPreviousMatchLineByLine=function(e,t,n,i){var o=e.getLineCount(),r=t.lineNumber,s=e.getLineContent(r).substring(0,t.column-1),a=this._findLastMatchInLine(n,s,r,i);if(a)return a;for(var u=1;u<=o;u++){var l=(o+r-u-1)%o,c=e.getLineContent(l+1),d=this._findLastMatchInLine(n,c,l+1,i);if(d)return d}return null},e._findLastMatchInLine=function(e,t,n,i){var r,s=null;for(e.reset(0);r=e.next(t);)s=a(new o.Range(n,r.index+1,n,r.index+1+r[0].length),r,i);return s},e}();t.TextModelSearch=p;var f=function(){function e(e,t){this._wordSeparators=e,this._searchRegex=t,this._prevMatchStartIndex=-1,this._prevMatchLength=0}return e.prototype.reset=function(e){this._searchRegex.lastIndex=e,this._prevMatchStartIndex=-1,this._prevMatchLength=0},e.prototype.next=function(e){var t,n=e.length;do{if(this._prevMatchStartIndex+this._prevMatchLength===n)return null;if(!(t=this._searchRegex.exec(e)))return null;var i=t.index,o=t[0].length;if(i===this._prevMatchStartIndex&&o===this._prevMatchLength)return null;if(this._prevMatchStartIndex=i,this._prevMatchLength=o,!this._wordSeparators||c(this._wordSeparators,e,n,i,o))return t}while(t);return null},e}()}),define(d[101],h([1,0,9,20]),function(e,t,n,i){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var o=function(){function e(){}return e.fromString=function(e){for(var t=0,i=-1;-1!==(i=e.indexOf("\r",i+1));)t++;var o=n.containsRTL(e),r=!o&&n.isBasicASCII(e),s=e.split(/\r\n|\r|\n/),a="";return n.startsWithUTF8BOM(s[0])&&(a=n.UTF8_BOM_CHARACTER,s[0]=s[0].substr(1)),{BOM:a,lines:s,length:e.length,containsRTL:o,isBasicASCII:r,totalCRCount:t}},e}();t.RawTextSource=o;var r=function(){function e(){}return e._getEOL=function(e,t){var n=e.lines.length-1;return 0===n?t===i.DefaultEndOfLine.LF?"\n":"\r\n":e.totalCRCount>n/2?"\r\n":"\n"},e.fromRawTextSource=function(e,t){return{length:e.length,lines:e.lines,BOM:e.BOM,EOL:this._getEOL(e,t),containsRTL:e.containsRTL,isBasicASCII:e.isBasicASCII}},e.fromString=function(e,t){return this.fromRawTextSource(o.fromString(e),t)},e.create=function(e,t){return"string"==typeof e?this.fromString(e,t):this.fromRawTextSource(e,t)},e}();t.TextSource=r}),define(d[116],h([1,0]),function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=function(){function e(){}return e.getLanguageId=function(e){return(255&e)>>>0},e.getTokenType=function(e){return(1792&e)>>>8},e.getFontStyle=function(e){return(14336&e)>>>11},e.getForeground=function(e){return(8372224&e)>>>14},e.getBackground=function(e){return(4286578688&e)>>>23},e.getClassNameFromMetadata=function(e){var t="mtk"+this.getForeground(e),n=this.getFontStyle(e);return 1&n&&(t+=" mtki"),2&n&&(t+=" mtkb"),4&n&&(t+=" mtku"),t},e.getInlineStyleFromMetadata=function(e,t){var n=this.getForeground(e),i=this.getFontStyle(e),o="color: "+t[n]+";";return 1&i&&(o+="font-style: italic;"),2&i&&(o+="font-weight: bold;"),4&i&&(o+="text-decoration: underline;"),o},e}();t.TokenMetadata=n}),define(d[90],h([1,0,116]),function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e,t){this.endIndex=e,this._metadata=t}return e.prototype.getForeground=function(){return n.TokenMetadata.getForeground(this._metadata)},e.prototype.getType=function(){return n.TokenMetadata.getClassNameFromMetadata(this._metadata)},e.prototype.getInlineStyle=function(e){return n.TokenMetadata.getInlineStyleFromMetadata(this._metadata,e)},e._equals=function(e,t){return e.endIndex===t.endIndex&&e._metadata===t._metadata},e.equalsArr=function(e,t){var n=e.length;if(n!==t.length)return!1;for(var i=0;i>>1;o>>1;l=n);l++){var d=l+1>>1)-1;nt?i=o-1:n=o}return n},e}();t.ViewLineTokenFactory=o}),define(d[130],h([1,0,116,90]),function(e,t,n,i){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var o=function(){function e(e,t,n,i,o,r){this._source=e,this._tokenIndex=t,this._metadata=r,this.startOffset=i,this.endOffset=o,this.hasPrev=this._tokenIndex>0,this.hasNext=this._tokenIndex+1>>1,this._text=t,this._textLength=this._text.length}return e.prototype.getTokenCount=function(){return this._tokensCount},e.prototype.getLineContent=function(){return this._text},e.prototype.getLineLength=function(){return this._textLength},e.prototype.getTokenStartOffset=function(e){return this._tokens[e<<1]},e.prototype.getLanguageId=function(e){var t=this._tokens[1+(e<<1)];return n.TokenMetadata.getLanguageId(t)},e.prototype.getStandardTokenType=function(e){var t=this._tokens[1+(e<<1)];return n.TokenMetadata.getTokenType(t)},e.prototype.getTokenEndOffset=function(e){return e+1>>0}Object.defineProperty(t,"__esModule",{value:!0});var s=function(){function e(e,t,n,i){this.id=e,this.internalDecorationId=t,this.position=n,this.stickToPreviousCharacter=i}return e.prototype.toString=function(){return"{'"+this.id+"';"+this.position.toString()+","+this.stickToPreviousCharacter+"}"},e.prototype.updateLineNumber=function(e,t){this.position.lineNumber!==t&&(e.addChangedMarker(this),this.position=new i.Position(t,this.position.column))},e.prototype.updateColumn=function(e,t){this.position.column!==t&&(e.addChangedMarker(this),this.position=new i.Position(this.position.lineNumber,t))},e.prototype.updatePosition=function(e,t){this.position.lineNumber===t.lineNumber&&this.position.column===t.column||(e.addChangedMarker(this),this.position=t)},e.prototype.setPosition=function(e){this.position=e},e.compareMarkers=function(e,t){return e.position.column===t.position.column?(e.stickToPreviousCharacter?0:1)-(t.stickToPreviousCharacter?0:1):e.position.column-t.position.column},e}();t.LineMarker=s;var a=function(){function e(){this._changedDecorations=[],this._changedDecorationsLen=0}return e.prototype.addChangedMarker=function(e){var t=e.internalDecorationId;0!==t&&(this._changedDecorations[this._changedDecorationsLen++]=t)},e.prototype.getDecorationIds=function(){return this._changedDecorations},e}();t.MarkersTracker=a;var u,l={adjust:function(){},finish:function(){}},c={adjustDelta:function(){},adjustSet:function(){},finish:function(){}};!function(e){e[e.MarkerDefined=0]="MarkerDefined",e[e.ForceMove=1]="ForceMove",e[e.ForceStay=2]="ForceStay"}(u||(u={}));var d=function(){function e(e){e&&(this._markers=null)}return e.prototype._createMarkersAdjuster=function(e){if(!this._markers)return c;if(0===this._markers.length)return c;this._markers.sort(s.compareMarkers);var t=this._markers,n=t.length,i=0,o=t[i],r=function(e,t){return o.position.columne)&&(1!==t&&(2===t||o.stickToPreviousCharacter))},a=function(s,a,u,l){for(;i0?2:0);var f=Math.min(h,p);f>0&&(r.adjust(l.startColumn-1+f,i,c),l.forceMoveMarkers||s.adjustDelta(l.startColumn+f,i,c,l.forceMoveMarkers?1:h>p?2:0)),o=o.substring(0,c-1)+l.text+o.substring(d-1),i+=p-h,r.adjust(l.endColumn,i,c),s.adjustSet(l.endColumn,c+p,l.forceMoveMarkers?1:0)}return r.finish(i,o.length),s.finish(i,o.length),this._setText(o,n),i},e.prototype.split=function(e,t,n,i){var o=this.text.substring(0,t-1),r=this.text.substring(t-1),a=null;if(this._markers){this._markers.sort(s.compareMarkers);for(var u=0,l=this._markers.length;ut||d.position.column===t&&(n||!d.stickToPreviousCharacter)){var c=this._markers.slice(0,u);a=this._markers.slice(u),this._markers=c;break}if(a)for(var u=0,l=a.length;u>1)-1},t.prototype._setPlusOneIndentLevel=function(e){this._metadata=1&this._metadata|(4026531839&e)<<1},t.prototype.updateTabSize=function(e){0===e?this._metadata=1&this._metadata:this._setPlusOneIndentLevel(o(this._text,e))},t.prototype._createModelLine=function(e,n){return new t(e,n)},t.prototype.split=function(t,n,i,o){var r=e.prototype.split.call(this,t,n,i,o);return this._deleteMarkedTokens(this._markOverflowingTokensForDeletion(0,this.text.length)),r},t.prototype.append=function(n,i,o,r){var s=this.text.length;if(e.prototype.append.call(this,n,i,o,r),o instanceof t){var a=o._lineTokens;if(a){var u=new Uint32Array(a);if(s>0)for(var l=0,c=u.length>>>1;l>>1,i=0,o=0,r=0,s=function(e,s,a){for(var u=a-1;o0&&0!==s){var l=Math.max(u,o+s);if(t[i<<1]=l,s<0)for(var c=i;c>0;){var d=t[c-1<<1];if(!(d>=l))break;4294967295!==d&&(t[c-1<<1]=4294967295,r++),c--}}++i>>1;if(e+1===i)return e;for(var o=i-1;o>0;o--){var r=n[o<<1];if(r>>1,i=new Uint32Array(n-e<<1),o=0,r=0;r=o)return{word:a[0],startColumn:i+1+a.index,endColumn:i+1+t.lastIndex};return null}function i(e,t,n,i){var o=e-1-i;t.lastIndex=0;for(var r;r=t.exec(n);){if(r.index>o)return null;if(t.lastIndex>=o)return{word:r[0],startColumn:i+1+r.index,endColumn:i+1+t.lastIndex}}return null}Object.defineProperty(t,"__esModule",{value:!0}),t.USUAL_WORD_SEPARATORS="`~!@#$%^&*()-=+[{]}\\|;:'\",.<>/?",t.DEFAULT_WORD_REGEXP=function(e){void 0===e&&(e="");for(var n=t.USUAL_WORD_SEPARATORS,i="(-?\\d*\\.\\d\\w*)|([^",o=0;o=0||(i+="\\"+n[o]);return i+="\\s]+)",new RegExp(i,"g")}(),t.ensureValidWordDefinition=function(e){var n=t.DEFAULT_WORD_REGEXP;if(e&&e instanceof RegExp)if(e.global)n=e;else{var i="g";e.ignoreCase&&(i+="i"),e.multiline&&(i+="m"),n=new RegExp(e.source,i)}return n.lastIndex=0,n},t.getWordAtText=function(e,t,o,r){t.lastIndex=0;var s=t.exec(o);if(!s)return null;var a=s[0].indexOf(" ")>=0?i(e,t,o,r):n(e,t,o,r);return t.lastIndex=0,a}}),define(d[511],h([1,0]),function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=function(){function e(e){this._languageIdentifier=e}return e.prototype.getId=function(){return this._languageIdentifier.language},e.prototype.getLanguageIdentifier=function(){return this._languageIdentifier},e}();t.FrankensteinMode=n}),define(d[60],h([1,0]),function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0});!function(e){e[e.None=0]="None",e[e.Indent=1]="Indent",e[e.IndentOutdent=2]="IndentOutdent",e[e.Outdent=3]="Outdent"}(t.IndentAction||(t.IndentAction={}));var n=function(){function e(e){if(this.open=e.open,this.close=e.close,this._standardTokenMask=0,Array.isArray(e.notIn))for(var t=0,n=e.notIn.length;tr&&(r=u)}return r}if("string"==typeof e)return"*"===e?5:e===o?10:0;if(e){var l=e.language,c=e.pattern,d=e.scheme,r=0;if(d)if(d===t.scheme)r=10;else{if("*"!==d)return 0;r=5}if(l)if(l===o)r=10;else{if("*"!==l)return 0;r=Math.max(r,5)}if(c){if(c!==t.fsPath&&!n.match(c,t.fsPath))return 0;r=10}return r}return 0}Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t,n){return i(e,t,n)>0},t.score=i}),define(d[533],h([1,0,11,513]),function(e,t,n,i){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var o=function(){function e(){this._clock=0,this._entries=[],this._onDidChange=new n.Emitter}return Object.defineProperty(e.prototype,"onDidChange",{get:function(){return this._onDidChange.event},enumerable:!0,configurable:!0}),e.prototype.register=function(e,t){var n=this,i={selector:e,provider:t,_score:-1,_time:this._clock++};return this._entries.push(i),this._lastCandidate=void 0,this._onDidChange.fire(this._entries.length),{dispose:function(){if(i){var e=n._entries.indexOf(i);e>=0&&(n._entries.splice(e,1),n._lastCandidate=void 0,n._onDidChange.fire(n._entries.length),i=void 0)}}}},e.prototype.has=function(e){return this.all(e).length>0},e.prototype.all=function(e){if(!e||e.isTooLargeForHavingARichMode())return[];this._updateScores(e);for(var t=[],n=0,i=this._entries;n0&&t.push(o.provider)}return t},e.prototype.ordered=function(e){var t=[];return this._orderedForEach(e,function(e){return t.push(e.provider)}),t},e.prototype.orderedGroups=function(e){var t,n,i=[];return this._orderedForEach(e,function(e){t&&n===e._score?t.push(e.provider):(n=e._score,t=[e.provider],i.push(t))}),i},e.prototype._orderedForEach=function(e,t){if(e&&!e.isTooLargeForHavingARichMode()){this._updateScores(e);for(var n=0;n0&&t(i)}}},e.prototype._updateScores=function(t){var n={uri:t.uri.toString(),language:t.getLanguageIdentifier().language};if(!this._lastCandidate||this._lastCandidate.language!==n.language||this._lastCandidate.uri!==n.uri){this._lastCandidate=n;for(var o=0,r=this._entries;ot._score?-1:e._timet._time?-1:0},e}();t.default=o}),define(d[536],h([1,0,89,96]),function(e,t,n,i){"use strict";function o(){return null===l&&(l=new u([[1,104,2],[1,72,2],[1,102,6],[1,70,6],[2,116,3],[2,84,3],[3,116,4],[3,84,4],[4,112,5],[4,80,5],[5,115,9],[5,83,9],[5,58,10],[6,105,7],[6,73,7],[7,108,8],[7,76,8],[8,101,9],[8,69,9],[9,58,10],[10,47,11],[11,47,12]])),l}function r(){if(null===c){c=new n.CharacterClassifier(0);for(e=0;e<" \t<>'\"、。。、,.:;?!@#$%&*‘“〈《「『【〔([{「」}])〕】』」》〉”’`~…".length;e++)c.set(" \t<>'\"、。。、,.:;?!@#$%&*‘“〈《「『【〔([{「」}])〕】』」》〉”’`~…".charCodeAt(e),1);for(var e=0;e<".,;".length;e++)c.set(".,;".charCodeAt(e),2)}return c}Object.defineProperty(t,"__esModule",{value:!0});var s;!function(e){e[e.Invalid=0]="Invalid",e[e.Start=1]="Start",e[e.H=2]="H",e[e.HT=3]="HT",e[e.HTT=4]="HTT",e[e.HTTP=5]="HTTP",e[e.F=6]="F",e[e.FI=7]="FI",e[e.FIL=8]="FIL",e[e.BeforeColon=9]="BeforeColon",e[e.AfterColon=10]="AfterColon",e[e.AlmostThere=11]="AlmostThere",e[e.End=12]="End",e[e.Accept=13]="Accept"}(s||(s={}));var a,u=function(){function e(e){for(var t=0,n=0,o=0,r=e.length;ot&&(t=u),a>n&&(n=a),l>n&&(n=l)}t++,n++;for(var c=new i.Uint8Matrix(n,t,0),o=0,r=e.length;o=this._maxCharCode?0:this._states.get(e,t)},e}(),l=null;!function(e){e[e.None=0]="None",e[e.ForceTermination=1]="ForceTermination",e[e.CannotEndIn=2]="CannotEndIn"}(a||(a={}));var c=null,d=function(){function e(){}return e._createLink=function(e,t,n,i,o){var r=o-1;do{var s=t.charCodeAt(r);if(2!==e.get(s))break;r--}while(r>i);return{range:{startLineNumber:n,startColumn:i+1,endLineNumber:n,endColumn:r+2},url:t.substring(i,r+1)}},e.computeLinks=function(t){for(var n=o(),i=r(),s=[],a=1,u=t.getLineCount();a<=u;a++){for(var l=t.getLineContent(a),c=l.length,d=0,h=0,p=0,f=1,g=!1,m=!1,v=!1;d=0},e.prototype.shouldIncrease=function(e){return!!(this._indentationRules&&this._indentationRules.increaseIndentPattern&&this._indentationRules.increaseIndentPattern.test(e))},e.prototype.shouldDecrease=function(e){return!!(this._indentationRules&&this._indentationRules.decreaseIndentPattern&&this._indentationRules.decreaseIndentPattern.test(e))},e.prototype.shouldIndentNextLine=function(e){return!!(this._indentationRules&&this._indentationRules.indentNextLinePattern&&this._indentationRules.indentNextLinePattern.test(e))},e.prototype.shouldIgnore=function(e){return!!(this._indentationRules&&this._indentationRules.unIndentedLinePattern&&this._indentationRules.unIndentedLinePattern.test(e))},e.prototype.getIndentMetadata=function(e){var t=0;return this.shouldIncrease(e)&&(t+=1),this.shouldDecrease(e)&&(t+=2),this.shouldIndentNextLine(e)&&(t+=4),this.shouldIgnore(e)&&(t+=8),t},e}();t.IndentRulesSupport=o}),define(d[546],h([1,0]),function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=function(){function e(){this._defaultValueSet=[["true","false"],["True","False"],["Private","Public","Friend","ReadOnly","Partial","Protected","WriteOnly"],["public","protected","private"]]}return e.prototype.navigateValueSet=function(e,t,n,i,o){if(e&&t&&(r=this.doNavigateValueSet(t,o)))return{range:e,value:r};if(n&&i){var r=this.doNavigateValueSet(i,o);if(r)return{range:n,value:r}}return null},e.prototype.doNavigateValueSet=function(e,t){var n=this.numberReplace(e,t);return null!==n?n:this.textReplace(e,t)},e.prototype.numberReplace=function(e,t){var n=Math.pow(10,e.length-(e.lastIndexOf(".")+1)),i=Number(e),o=parseFloat(e);return isNaN(i)||isNaN(o)||i!==o?null:0!==i||t?(i=Math.floor(i*n),i+=t?n:-n,String(i/n)):null},e.prototype.textReplace=function(e,t){return this.valueSetsReplace(this._defaultValueSet,e,t)},e.prototype.valueSetsReplace=function(e,t,n){for(var i=null,o=0,r=e.length;null===i&&o=0?((i+=n?1:-1)<0?i=e.length-1:i%=e.length,e[i]):null},e.INSTANCE=new e,e}();t.BasicInplaceReplace=n}),define(d[550],h([1,0,10,9,60]),function(e,t,n,i,o){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(t){(t=t||{}).brackets=t.brackets||[["(",")"],["{","}"],["[","]"]],this._brackets=t.brackets.map(function(t){return{open:t[0],openRegExp:e._createOpenBracketRegExp(t[0]),close:t[1],closeRegExp:e._createCloseBracketRegExp(t[1])}}),this._regExpRules=t.regExpRules||[],this._indentationRules=t.indentationRules}return e.prototype.onEnter=function(e,t,n){for(var i=0,r=this._regExpRules.length;i0&&n.length>0)for(var i=0,r=this._brackets.length;i0)for(var i=0,r=this._brackets.length;i=0;n--)t+=e.charAt(n);return t}var t=null,n=null;return function(i){return t!==i&&(n=e(t=i)),n}}(),p=function(){function e(){}return e._findPrevBracketInText=function(e,t,n,o){var r=n.match(e);if(!r)return null;var s=n.length-r.index,a=r[0].length,u=o+s;return new i.Range(t,u-a+1,t,u+1)},e.findPrevBracketInToken=function(e,t,n,i,o){var r=h(n).substring(n.length-o,n.length-i);return this._findPrevBracketInText(e,t,r,i)},e.findNextBracketInText=function(e,t,n,o){var r=n.match(e);if(!r)return null;var s=r.index,a=r[0].length,u=o+s;return new i.Range(t,u+1,t,u+1+a)},e.findNextBracketInToken=function(e,t,n,i,o){var r=n.substring(i,o);return this.findNextBracketInText(e,t,r,i)},e}();t.BracketsUtils=p}),define(d[202],h([1,0,32]),function(e,t,n){"use strict";function i(e){if(!e||!Array.isArray(e))return[];for(var t=[],n=0,i=0,o=e.length;i=1&&""===e[0].token;){var o=e.shift();-1!==o.fontStyle&&(t=o.fontStyle),null!==o.foreground&&(n=o.foreground),null!==o.background&&(i=o.background)}for(var r=new u,a=new d(t,r.getId(n),r.getId(i)),c=new p(a),h=0,f=e.length;ht?1:0}Object.defineProperty(t,"__esModule",{value:!0});var a=function(){return function(e,t,n,i,o){this.token=e,this.index=t,this.fontStyle=n,this.foreground=i,this.background=o}}();t.ParsedTokenThemeRule=a,t.parseTokenTheme=i;var u=function(){function e(){this._lastColorId=0,this._id2color=[],this._color2id=new Map}return e.prototype.getId=function(e){if(null===e)return 0;if(e=e.toUpperCase(),!/^[0-9A-F]{6}$/.test(e))throw new Error("Illegal color name: "+e);var t=this._color2id.get(e);return t||(t=++this._lastColorId,this._color2id.set(e,t),this._id2color[t]=n.Color.fromHex("#"+e),t)},e.prototype.getColorMap=function(){return this._id2color.slice(0)},e}();t.ColorMap=u;var l=function(){function e(e,t){this._colorMap=e,this._root=t,this._cache=new Map}return e.createFromRawTokenTheme=function(e){return this.createFromParsedTokenTheme(i(e))},e.createFromParsedTokenTheme=function(e){return o(e)},e.prototype.getColorMap=function(){return this._colorMap.getColorMap()},e.prototype.getThemeTrieElement=function(){return this._root.toExternalThemeTrieElement()},e.prototype._match=function(e){return this._root.match(e)},e.prototype.match=function(e,t){var n=this._cache.get(t);if(void 0===n){var i=this._match(t),o=r(t);n=(i.metadata|o<<8)>>>0,this._cache.set(t,n)}return(n|e<<0)>>>0},e}();t.TokenTheme=l;var c=/\b(comment|string|regex)\b/;t.toStandardTokenType=r,t.strcmp=s;var d=function(){function e(e,t,n){this._fontStyle=e,this._foreground=t,this._background=n,this.metadata=(this._fontStyle<<11|this._foreground<<14|this._background<<23)>>>0}return e.prototype.clone=function(){return new e(this._fontStyle,this._foreground,this._background)},e.cloneArr=function(e){for(var t=[],n=0,i=e.length;n>>0},e}();t.ThemeTrieElementRule=d;var h=function(){return function(e,t){this.mainRule=e,this.children=t||Object.create(null)}}();t.ExternalThemeTrieElement=h;var p=function(){function e(e){this._mainRule=e,this._children=new Map}return e.prototype.toExternalThemeTrieElement=function(){var e=Object.create(null);return this._children.forEach(function(t,n){e[n]=t.toExternalThemeTrieElement()}),new h(this._mainRule,e)},e.prototype.match=function(e){if(""===e)return this._mainRule;var t,n,i=e.indexOf(".");-1===i?(t=e,n=""):(t=e.substring(0,i),n=e.substring(i+1));var o=this._children.get(t);return void 0!==o?o.match(n):this._mainRule},e.prototype.insert=function(t,n,i,o){if(""!==t){var r,s,a=t.indexOf(".");-1===a?(r=t,s=""):(r=t.substring(0,a),s=t.substring(a+1));var u=this._children.get(r);void 0===u&&(u=new e(this._mainRule.clone()),this._children.set(r,u)),u.insert(s,n,i,o)}else this._mainRule.acceptOverwrite(n,i,o)},e}();t.ThemeTrieElement=p,t.generateTokensCSSForColorMap=function(e){for(var t=[],n=1,i=e.length;n>>0,new i.TokenizationResult2(r,n)}}),define(d[91],h([1,0,17]),function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.createScopedLineTokens=function(e,t){for(var n=e.getTokenCount(),o=e.findTokenIndexAtOffset(t),r=e.getLanguageId(o),s=o;s+10&&e.getLanguageId(a-1)===r;)a--;return new i(e,r,a,s+1,e.getTokenStartOffset(a),e.getTokenEndOffset(s))};var i=function(){function e(e,t,n,i,o,r){this._actual=e,this.languageId=t,this._firstTokenIndex=n,this._lastTokenIndex=i,this.firstCharOffset=o,this._lastCharOffset=r}return e.prototype.getLineContent=function(){return this._actual.getLineContent().substring(this.firstCharOffset,this._lastCharOffset)},e.prototype.getTokenCount=function(){return this._lastTokenIndex-this._firstTokenIndex},e.prototype.findTokenIndexAtOffset=function(e){return this._actual.findTokenIndexAtOffset(e+this.firstCharOffset)-this._firstTokenIndex},e.prototype.getTokenStartOffset=function(e){return this._actual.getTokenStartOffset(e+this._firstTokenIndex)-this.firstCharOffset},e.prototype.getStandardTokenType=function(e){return this._actual.getStandardTokenType(e+this._firstTokenIndex)},e}();t.ScopedLineTokens=i;var o;!function(e){e[e.value=7]="value"}(o||(o={})),t.ignoreBracketsInToken=function(e){return 0!=(7&e)}}),define(d[207],h([1,0,91,98,60]),function(e,t,n,i,o){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e,t,n){n=n||{},this._richEditBrackets=e,this._complexAutoClosePairs=t.filter(function(e){return e.open.length>1&&!!e.close}).map(function(e){return new o.StandardAutoClosingPairConditional(e)}),n.docComment&&this._complexAutoClosePairs.push(new o.StandardAutoClosingPairConditional({open:n.docComment.open,close:n.docComment.close}))}return e.prototype.getElectricCharacters=function(){var e=[];if(this._richEditBrackets)for(var t=0,n=this._richEditBrackets.brackets.length;t=0))return{appendText:s.close}}}return null},e}();t.BracketElectricCharacterSupport=r}),define(d[43],h([1,0,543,207,550,545,98,11,10,9,95,91,2,60]),function(e,t,n,i,o,r,s,a,u,l,c,d,h,p){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var f=function(){function e(t,o,a){var u=null;o&&(u=o._conf),this._conf=e._mergeConf(u,a),this._conf.brackets&&(this.brackets=new s.RichEditBrackets(t,this._conf.brackets)),this.onEnter=e._handleOnEnter(this._conf),this.comments=e._handleComments(this._conf),this.characterPair=new n.CharacterPairSupport(this._conf),this.electricCharacter=new i.BracketElectricCharacterSupport(this.brackets,this.characterPair.getAutoClosingPairs(),this._conf.__electricCharacterSupport),this.wordDefinition=this._conf.wordPattern||c.DEFAULT_WORD_REGEXP,this.indentationRules=this._conf.indentationRules,this._conf.indentationRules&&(this.indentRulesSupport=new r.IndentRulesSupport(this._conf.indentationRules))}return e._mergeConf=function(e,t){return{comments:e?t.comments||e.comments:t.comments,brackets:e?t.brackets||e.brackets:t.brackets,wordPattern:e?t.wordPattern||e.wordPattern:t.wordPattern,indentationRules:e?t.indentationRules||e.indentationRules:t.indentationRules,onEnterRules:e?t.onEnterRules||e.onEnterRules:t.onEnterRules,autoClosingPairs:e?t.autoClosingPairs||e.autoClosingPairs:t.autoClosingPairs,surroundingPairs:e?t.surroundingPairs||e.surroundingPairs:t.surroundingPairs,__electricCharacterSupport:e?t.__electricCharacterSupport||e.__electricCharacterSupport:t.__electricCharacterSupport}},e._handleOnEnter=function(e){var t={},n=!0;return e.brackets&&(n=!1,t.brackets=e.brackets),e.indentationRules&&(n=!1,t.indentationRules=e.indentationRules),e.onEnterRules&&(n=!1,t.regExpRules=e.onEnterRules),n?null:new o.OnEnterSupport(t)},e._handleComments=function(e){var t=e.comments;if(!t)return null;var n={};if(t.lineComment&&(n.lineCommentToken=t.lineComment),t.blockComment){var i=t.blockComment,o=i[0],r=i[1];n.blockCommentStartToken=o,n.blockCommentEndToken=r}return n},e}();t.RichEditSupport=f;var g=function(){function e(){this._onDidChange=new a.Emitter,this.onDidChange=this._onDidChange.event,this._entries=[]}return e.prototype.register=function(e,t){var n=this,i=this._getRichEditSupport(e.id),o=new f(e,i,t);return this._entries[e.id]=o,this._onDidChange.fire(void 0),{dispose:function(){n._entries[e.id]===o&&(n._entries[e.id]=i,n._onDidChange.fire(void 0))}}},e.prototype._getRichEditSupport=function(e){return this._entries[e]||null},e.prototype.getIndentationRules=function(e){var t=this._entries[e];return t?t.indentationRules||null:null},e.prototype._getElectricCharacterSupport=function(e){var t=this._getRichEditSupport(e);return t?t.electricCharacter||null:null},e.prototype.getElectricCharacters=function(e){var t=this._getElectricCharacterSupport(e);return t?t.getElectricCharacters():[]},e.prototype.onElectricCharacter=function(e,t,n){var i=d.createScopedLineTokens(t,n-1),o=this._getElectricCharacterSupport(i.languageId);return o?o.onElectricCharacter(e,i,n-i.firstCharOffset):null},e.prototype.getComments=function(e){var t=this._getRichEditSupport(e);return t?t.comments||null:null},e.prototype._getCharacterPairSupport=function(e){var t=this._getRichEditSupport(e);return t?t.characterPair||null:null},e.prototype.getAutoClosingPairs=function(e){var t=this._getCharacterPairSupport(e);return t?t.getAutoClosingPairs():[]},e.prototype.getSurroundingPairs=function(e){var t=this._getCharacterPairSupport(e);return t?t.getSurroundingPairs():[]},e.prototype.shouldAutoClosePair=function(e,t,n){var i=d.createScopedLineTokens(t,n-1),o=this._getCharacterPairSupport(i.languageId);return!!o&&o.shouldAutoClosePair(e,i,n-i.firstCharOffset)},e.prototype.getWordDefinition=function(e){var t=this._getRichEditSupport(e);return t?c.ensureValidWordDefinition(t.wordDefinition||null):c.ensureValidWordDefinition(null)},e.prototype.getIndentRulesSupport=function(e){var t=this._getRichEditSupport(e);return t?t.indentRulesSupport||null:null},e.prototype.getPrecedingValidLine=function(e,t,n){var i=e.getLanguageIdAtPosition(t,0);if(t>1){var o=t-1,r=-1;for(o=t-1;o>=1;o--){if(e.getLanguageIdAtPosition(o,0)!==i)return r;var s=e.getLineContent(o);if(!n.shouldIgnore(s)&&!/^\s+$/.test(s)&&""!==s)return o;r=o}}return-1},e.prototype.getInheritIndentForLine=function(e,t,n){void 0===n&&(n=!0);var i=this.getIndentRulesSupport(e.getLanguageIdentifier().id);if(!i)return null;if(t<=1)return{indentation:"",action:null};var o=this.getPrecedingValidLine(e,t,i);if(o<0)return null;if(o<1)return{indentation:"",action:null};var r=e.getLineContent(o);if(i.shouldIncrease(r)||i.shouldIndentNextLine(r))return{indentation:l.getLeadingWhitespace(r),action:p.IndentAction.Indent,line:o};if(i.shouldDecrease(r))return{indentation:l.getLeadingWhitespace(r),action:null,line:o};if(1===o)return{indentation:l.getLeadingWhitespace(e.getLineContent(o)),action:null,line:o};var s=o-1,a=i.getIndentMetadata(e.getLineContent(s));if(!(3&a)&&4&a){for(var u=0,c=s-1;c>0;c--)if(!i.shouldIndentNextLine(e.getLineContent(c))){u=c;break}return{indentation:l.getLeadingWhitespace(e.getLineContent(u+1)),action:null,line:u+1}}if(n)return{indentation:l.getLeadingWhitespace(e.getLineContent(o)),action:null,line:o};for(c=o;c>0;c--){var d=e.getLineContent(c);if(i.shouldIncrease(d))return{indentation:l.getLeadingWhitespace(d),action:p.IndentAction.Indent,line:c};if(i.shouldIndentNextLine(d)){for(var u=0,h=c-1;h>0;h--)if(!i.shouldIndentNextLine(e.getLineContent(c))){u=h;break}return{indentation:l.getLeadingWhitespace(e.getLineContent(u+1)),action:null,line:u+1}}if(i.shouldDecrease(d))return{indentation:l.getLeadingWhitespace(d),action:null,line:c}}return{indentation:l.getLeadingWhitespace(e.getLineContent(1)),action:null,line:1}},e.prototype.getGoodIndentForLine=function(e,t,n,i){var o=this.getIndentRulesSupport(t);if(!o)return null;var r=this.getInheritIndentForLine(e,n),s=e.getLineContent(n);if(r){var a=r.line;if(void 0!==a){var c=this._getOnEnterSupport(t),d=null;try{d=c.onEnter("",e.getLineContent(a),"")}catch(e){u.onUnexpectedError(e)}if(d){var h=l.getLeadingWhitespace(e.getLineContent(a));return d.removeText&&(h=h.substring(0,h.length-d.removeText)),d.indentAction===p.IndentAction.Indent||d.indentAction===p.IndentAction.IndentOutdent?h=i.shiftIndent(h):d.indentAction===p.IndentAction.Outdent&&(h=i.unshiftIndent(h)),o.shouldDecrease(s)&&(h=i.unshiftIndent(h)),d.appendText&&(h+=d.appendText),l.getLeadingWhitespace(h)}}return o.shouldDecrease(s)?r.action===p.IndentAction.Indent?r.indentation:i.unshiftIndent(r.indentation):r.action===p.IndentAction.Indent?i.shiftIndent(r.indentation):r.indentation}return null},e.prototype.getIndentForEnter=function(e,t,n,i){e.forceTokenization(t.startLineNumber);var o,r,s=e.getLineTokens(t.startLineNumber),a=d.createScopedLineTokens(s,t.startColumn-1),u=a.getLineContent(),c=!1;a.firstCharOffset>0&&s.getLanguageId(0)!==a.languageId?(c=!0,o=u.substr(0,t.startColumn-1-a.firstCharOffset)):o=s.getLineContent().substring(0,t.startColumn-1),r=t.isEmpty()?u.substr(t.startColumn-1-a.firstCharOffset):this.getScopedLineTokens(e,t.endLineNumber,t.endColumn).getLineContent().substr(t.endColumn-1-a.firstCharOffset);var h=this.getIndentRulesSupport(a.languageId);if(!h)return null;var f=o,g=l.getLeadingWhitespace(o);if(!i&&!c){var m=this.getInheritIndentForLine(e,t.startLineNumber);h.shouldDecrease(o)&&m&&(g=m.indentation,m.action!==p.IndentAction.Indent&&(g=n.unshiftIndent(g))),f=g+l.ltrim(l.ltrim(o," "),"\t")}var v={getLineTokens:function(t){return e.getLineTokens(t)},getLanguageIdentifier:function(){return e.getLanguageIdentifier()},getLanguageIdAtPosition:function(t,n){return e.getLanguageIdAtPosition(t,n)},getLineContent:function(n){return n===t.startLineNumber?f:e.getLineContent(n)}},_=l.getLeadingWhitespace(s.getLineContent()),y=this.getInheritIndentForLine(v,t.startLineNumber+1);if(!y){var C=c?_:g;return{beforeEnter:C,afterEnter:C}}var b=c?_:y.indentation;return y.action===p.IndentAction.Indent&&(b=n.shiftIndent(b)),h.shouldDecrease(r)&&(b=n.unshiftIndent(b)),{beforeEnter:c?_:g,afterEnter:b}},e.prototype.getIndentActionForType=function(e,t,n,i){var o=this.getScopedLineTokens(e,t.startLineNumber,t.startColumn),r=this.getIndentRulesSupport(o.languageId);if(!r)return null;var s,a=o.getLineContent(),u=a.substr(0,t.startColumn-1-o.firstCharOffset);if(s=t.isEmpty()?a.substr(t.startColumn-1-o.firstCharOffset):this.getScopedLineTokens(e,t.endLineNumber,t.endColumn).getLineContent().substr(t.endColumn-1-o.firstCharOffset),!r.shouldDecrease(u+s)&&r.shouldDecrease(u+n+s)){var l=this.getInheritIndentForLine(e,t.startLineNumber,!1);if(!l)return null;var c=l.indentation;return l.action!==p.IndentAction.Indent&&(c=i.unshiftIndent(c)),c}return null},e.prototype.getIndentMetadata=function(e,t){var n=this.getIndentRulesSupport(e.getLanguageIdentifier().id);return n?t<1||t>e.getLineCount()?null:n.getIndentMetadata(e.getLineContent(t)):null},e.prototype._getOnEnterSupport=function(e){var t=this._getRichEditSupport(e);return t?t.onEnter||null:null},e.prototype.getRawEnterActionAtPosition=function(e,t,n){var i=this.getEnterAction(e,new h.Range(t,n,t,n));return i?i.enterAction:null},e.prototype.getEnterAction=function(e,t){var n=this.getIndentationAtPosition(e,t.startLineNumber,t.startColumn),i=this.getScopedLineTokens(e,t.startLineNumber,t.startColumn),o=this._getOnEnterSupport(i.languageId);if(!o)return null;var r,s=i.getLineContent(),a=s.substr(0,t.startColumn-1-i.firstCharOffset);r=t.isEmpty()?s.substr(t.startColumn-1-i.firstCharOffset):this.getScopedLineTokens(e,t.endLineNumber,t.endColumn).getLineContent().substr(t.endColumn-1-i.firstCharOffset);var l=t.startLineNumber,c="";if(l>1&&0===i.firstCharOffset){var d=this.getScopedLineTokens(e,l-1);d.languageId===i.languageId&&(c=d.getLineContent())}var h=null;try{h=o.onEnter(c,a,r)}catch(e){u.onUnexpectedError(e)}return h?(h.appendText||(h.indentAction===p.IndentAction.Indent||h.indentAction===p.IndentAction.IndentOutdent?h.appendText="\t":h.appendText=""),h.removeText&&(n=n.substring(0,n.length-h.removeText)),{enterAction:h,indentation:n}):null},e.prototype.getIndentationAtPosition=function(e,t,n){var i=e.getLineContent(t),o=l.getLeadingWhitespace(i);return o.length>n-1&&(o=o.substring(0,n-1)),o},e.prototype.getScopedLineTokens=function(e,t,n){e.forceTokenization(t);var i=e.getLineTokens(t),o=isNaN(n)?e.getLineMaxColumn(t)-1:n-1;return d.createScopedLineTokens(i,o)},e.prototype.getBracketsSupport=function(e){var t=this._getRichEditSupport(e);return t?t.brackets||null:null},e}();t.LanguageConfigurationRegistryImpl=g,t.LanguageConfigurationRegistry=new g}),define(d[122],h([1,0,9,17,68,130]),function(e,t,n,i,o,r){"use strict";function s(e){var t=i.TokenizationRegistry.get(e);return t||{getInitialState:function(){return o.NULL_STATE},tokenize:void 0,tokenize2:function(e,t,n){return o.nullTokenize2(0,e,t,n)}}}function a(e,t){for(var i='
    ',o=e.split(/\r\n|\r|\n/),s=t.getInitialState(),a=0,u=o.length;a0&&(i+="
    ");for(var c=t.tokenize2(l,s,0),d=new r.LineTokens(c.tokens,l).inflate(),h=0,p=0,f=d.length;p'+n.escape(l.substring(h,g.endIndex))+"",h=g.endIndex}s=c.endState}return i+="
    "}Object.defineProperty(t,"__esModule",{value:!0}),t.tokenizeToString=function(e,t){return a(e,s(t))},t.tokenizeLineToHTML=function(e,t,n,i,o,r){for(var s="
    ",a=i,u=0,l=0,c=t.length;l0;)p+=" ",g--;break;case 60:p+="<";break;case 62:p+=">";break;case 38:p+="&";break;case 0:p+="�";break;case 65279:case 8232:p+="�";break;case 13:p+="​";break;default:p+=String.fromCharCode(f)}}if(s+=''+p+"",d.endIndex>o||a>=o)break}}return s+="
    "}}),define(d[210],h([1,0,11]),function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(){this._transientWatchers={},this._codeEditors=Object.create(null),this._diffEditors=Object.create(null),this._onCodeEditorAdd=new n.Emitter,this._onCodeEditorRemove=new n.Emitter,this._onDiffEditorAdd=new n.Emitter,this._onDiffEditorRemove=new n.Emitter}return e.prototype.addCodeEditor=function(e){this._codeEditors[e.getId()]=e,this._onCodeEditorAdd.fire(e)},Object.defineProperty(e.prototype,"onCodeEditorAdd",{get:function(){return this._onCodeEditorAdd.event},enumerable:!0,configurable:!0}),e.prototype.removeCodeEditor=function(e){delete this._codeEditors[e.getId()]&&this._onCodeEditorRemove.fire(e)},Object.defineProperty(e.prototype,"onCodeEditorRemove",{get:function(){return this._onCodeEditorRemove.event},enumerable:!0,configurable:!0}),e.prototype.getCodeEditor=function(e){return this._codeEditors[e]||null},e.prototype.listCodeEditors=function(){var e=this;return Object.keys(this._codeEditors).map(function(t){return e._codeEditors[t]})},e.prototype.addDiffEditor=function(e){this._diffEditors[e.getId()]=e,this._onDiffEditorAdd.fire(e)},Object.defineProperty(e.prototype,"onDiffEditorAdd",{get:function(){return this._onDiffEditorAdd.event},enumerable:!0,configurable:!0}),e.prototype.removeDiffEditor=function(e){delete this._diffEditors[e.getId()]&&this._onDiffEditorRemove.fire(e)},Object.defineProperty(e.prototype,"onDiffEditorRemove",{get:function(){return this._onDiffEditorRemove.event},enumerable:!0,configurable:!0}),e.prototype.getDiffEditor=function(e){return this._diffEditors[e]||null},e.prototype.listDiffEditors=function(){var e=this;return Object.keys(this._diffEditors).map(function(t){return e._diffEditors[t]})},e.prototype.getFocusedCodeEditor=function(){for(var e=null,t=this.listCodeEditors(),n=0;n=.5,this._onDidChange.fire(void 0)},e.prototype.getColor=function(e){return(e<1||e>=this._colors.length)&&(e=2),this._colors[e]},e.prototype.backgroundIsLight=function(){return this._backgroundIsLight},e._INSTANCE=null,e}();t.MinimapTokensColorTracker=o;!function(e){e[e.START_CH_CODE=32]="START_CH_CODE",e[e.END_CH_CODE=126]="END_CH_CODE",e[e.CHAR_COUNT=95]="CHAR_COUNT",e[e.SAMPLED_CHAR_HEIGHT=16]="SAMPLED_CHAR_HEIGHT",e[e.SAMPLED_CHAR_WIDTH=10]="SAMPLED_CHAR_WIDTH",e[e.SAMPLED_HALF_CHAR_WIDTH=5]="SAMPLED_HALF_CHAR_WIDTH",e[e.x2_CHAR_HEIGHT=4]="x2_CHAR_HEIGHT",e[e.x2_CHAR_WIDTH=2]="x2_CHAR_WIDTH",e[e.x1_CHAR_HEIGHT=2]="x1_CHAR_HEIGHT",e[e.x1_CHAR_WIDTH=1]="x1_CHAR_WIDTH",e[e.RGBA_CHANNELS_CNT=4]="RGBA_CHANNELS_CNT"}(t.Constants||(t.Constants={}));var r=function(){function e(t,n){if(760!==t.length)throw new Error("Invalid x2CharData");if(190!==n.length)throw new Error("Invalid x1CharData");this.x2charData=t,this.x1charData=n,this.x2charDataLight=e.soften(t,.8),this.x1charDataLight=e.soften(n,50/60)}return e.soften=function(e,t){for(var n=new Uint8ClampedArray(e.length),i=0,o=e.length;it.width||i+4>t.height)console.warn("bad render request outside image data");else{var u=a?this.x2charDataLight:this.x2charData,l=e._getChIndex(o),c=4*t.width,d=s.r,h=s.g,p=s.b,f=r.r-d,g=r.g-h,m=r.b-p,v=t.data,_=4*l*2,y=i*c+4*n,C=u[_]/255;v[y+0]=d+f*C,v[y+1]=h+g*C,v[y+2]=p+m*C;C=u[_+1]/255;v[y+4]=d+f*C,v[y+5]=h+g*C,v[y+6]=p+m*C,y+=c;C=u[_+2]/255;v[y+0]=d+f*C,v[y+1]=h+g*C,v[y+2]=p+m*C;C=u[_+3]/255;v[y+4]=d+f*C,v[y+5]=h+g*C,v[y+6]=p+m*C,y+=c;C=u[_+4]/255;v[y+0]=d+f*C,v[y+1]=h+g*C,v[y+2]=p+m*C;C=u[_+5]/255;v[y+4]=d+f*C,v[y+5]=h+g*C,v[y+6]=p+m*C,y+=c;C=u[_+6]/255;v[y+0]=d+f*C,v[y+1]=h+g*C,v[y+2]=p+m*C;C=u[_+7]/255;v[y+4]=d+f*C,v[y+5]=h+g*C,v[y+6]=p+m*C}},e.prototype.x1RenderChar=function(t,n,i,o,r,s,a){if(n+1>t.width||i+2>t.height)console.warn("bad render request outside image data");else{var u=a?this.x1charDataLight:this.x1charData,l=e._getChIndex(o),c=4*t.width,d=s.r,h=s.g,p=s.b,f=r.r-d,g=r.g-h,m=r.b-p,v=t.data,_=2*l*1,y=i*c+4*n,C=u[_]/255;v[y+0]=d+f*C,v[y+1]=h+g*C,v[y+2]=p+m*C,y+=c;C=u[_+1]/255;v[y+0]=d+f*C,v[y+1]=h+g*C,v[y+2]=p+m*C}},e.prototype.x2BlockRenderChar=function(e,t,n,i,o,r){if(t+2>e.width||n+4>e.height)console.warn("bad render request outside image data");else{var s=4*e.width,a=o.r,u=o.g,l=o.b,c=a+.5*(i.r-a),d=u+.5*(i.g-u),h=l+.5*(i.b-l),p=e.data,f=n*s+4*t;p[f+0]=c,p[f+1]=d,p[f+2]=h,p[f+4]=c,p[f+5]=d,p[f+6]=h,p[(f+=s)+0]=c,p[f+1]=d,p[f+2]=h,p[f+4]=c,p[f+5]=d,p[f+6]=h,p[(f+=s)+0]=c,p[f+1]=d,p[f+2]=h,p[f+4]=c,p[f+5]=d,p[f+6]=h,p[(f+=s)+0]=c,p[f+1]=d,p[f+2]=h,p[f+4]=c,p[f+5]=d,p[f+6]=h}},e.prototype.x1BlockRenderChar=function(e,t,n,i,o,r){if(t+1>e.width||n+2>e.height)console.warn("bad render request outside image data");else{var s=4*e.width,a=o.r,u=o.g,l=o.b,c=a+.5*(i.r-a),d=u+.5*(i.g-u),h=l+.5*(i.b-l),p=e.data,f=n*s+4*t;p[f+0]=c,p[f+1]=d,p[f+2]=h,p[(f+=s)+0]=c,p[f+1]=d,p[f+2]=h}},e}();t.MinimapCharRenderer=r}),define(d[78],h([1,0,2]),function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e,t){this._viewLayout=e,this.viewportData=t,this.scrollWidth=this._viewLayout.getScrollWidth(),this.scrollHeight=this._viewLayout.getScrollHeight(),this.visibleRange=this.viewportData.visibleRange,this.bigNumbersDelta=this.viewportData.bigNumbersDelta;var n=this._viewLayout.getCurrentViewport();this.scrollTop=n.top,this.scrollLeft=n.left,this.viewportWidth=n.width,this.viewportHeight=n.height}return e.prototype.getScrolledTopFromAbsoluteTop=function(e){return e-this.scrollTop},e.prototype.getVerticalOffsetForLineNumber=function(e){return this._viewLayout.getVerticalOffsetForLineNumber(e)},e.prototype.lineIsVisible=function(e){return this.visibleRange.startLineNumber<=e&&e<=this.visibleRange.endLineNumber},e.prototype.getDecorationsInViewport=function(){return this.viewportData.getDecorationsInViewport()},e}();t.RestrictedRenderingContext=i;var o=function(e){function t(t,n,i){var o=e.call(this,t,n)||this;return o._viewLines=i,o}return f(t,e),t.prototype.linesVisibleRangesForRange=function(e,t){return this._viewLines.linesVisibleRangesForRange(e,t)},t.prototype.visibleRangeForPosition=function(e){var t=this._viewLines.visibleRangesForRange2(new n.Range(e.lineNumber,e.column,e.lineNumber,e.column));return t?t[0]:null},t}(i);t.RenderingContext=o;var r=function(){return function(e,t){this.lineNumber=e,this.ranges=t}}();t.LineVisibleRanges=r;var s=function(){function e(e,t){this.left=Math.round(e),this.width=Math.round(t)}return e.prototype.toString=function(){return"["+this.left+","+this.width+"]"},e}();t.HorizontalRange=s}),define(d[214],h([1,0,78]),function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e,t){this.left=e,this.width=t}return e.prototype.toString=function(){return"["+this.left+","+this.width+"]"},e.compare=function(e,t){return e.left-t.left},e}(),o=function(){function e(){}return e._createRange=function(){return this._handyReadyRange||(this._handyReadyRange=document.createRange()),this._handyReadyRange},e._detachRange=function(e,t){e.selectNodeContents(t)},e._readClientRects=function(e,t,n,i,o){var r=this._createRange();try{return r.setStart(e,t),r.setEnd(n,i),r.getClientRects()}catch(e){return null}finally{this._detachRange(r,o)}},e._mergeAdjacentRanges=function(e){if(1===e.length)return[new n.HorizontalRange(e[0].left,e[0].width)];e.sort(i.compare);for(var t=[],o=0,r=e[0].left,s=e[0].width,a=1,u=e.length;a=c?s=Math.max(s,c+d-r):(t[o++]=new n.HorizontalRange(r,s),r=c,s=d)}return t[o++]=new n.HorizontalRange(r,s),t},e._createHorizontalRangesFromClientRects=function(e,t){if(!e||0===e.length)return null;for(var n=[],o=0,r=e.length;oa)return null;(t=Math.min(a,Math.max(0,t)))!==(i=Math.min(a,Math.max(0,i)))&&i>0&&0===o&&(i--,o=Number.MAX_VALUE);var u=e.children[t].firstChild,l=e.children[i].firstChild;if(!u||!l)return null;n=Math.min(u.textContent.length,Math.max(0,n)),o=Math.min(l.textContent.length,Math.max(0,o));var c=this._readClientRects(u,n,l,o,s);return this._createHorizontalRangesFromClientRects(c,r)},e}();t.RangeUtil=o}),define(d[215],h([1,0,111]),function(e,t,n){"use strict";function i(e){for(var t=new Uint8ClampedArray(e.length),n=0,i=e.length;nn)&&!c.isEmpty()){var d=c.startLineNumber===n?c.startColumn:i,h=c.endLineNumber===n?c.endColumn:o;h<=1||(r[s++]=new e(d,h,l.inlineClassName,l.insertsBeforeOrAfter))}}return r},e.compare=function(e,t){return e.startColumn===t.startColumn?e.endColumn===t.endColumn?e.classNamet.className?1:0:e.endColumn-t.endColumn:e.startColumn-t.startColumn},e}();t.LineDecoration=n;var i=function(){return function(e,t,n){this.startOffset=e,this.endOffset=t,this.className=n}}();t.DecorationSegment=i;var o=function(){function e(){this.stopOffsets=[],this.classNames=[],this.count=0}return e.prototype.consumeLowerThan=function(e,t,n){for(;this.count>0&&this.stopOffsets[0]0&&t=e){this.stopOffsets.splice(n,0,e),this.classNames.splice(n,0,t);break}this.count++},e}(),r=function(){function e(){}return e.normalize=function(e){if(0===e.length)return[];for(var t=[],n=new o,i=0,r=0,s=e.length;r0){for(var h=0,p=e.lineDecorations.length;h0&&(i[o++]=new d(t,""));for(var r=0,s=e.length;r=n){i[o++]=new d(n,l);break}i[o++]=new d(u,l)}}return i}function a(e,t){for(var n=0,i=[],r=0,s=0,a=t.length;s50){for(var h=u.type,p=Math.ceil(c/50),f=1;fu)C=!0;else if(9===y)C=!0;else if(32===y)if(a)if(_)C=!0;else{var b=v+1=r)&&(l[c++]=new d(v,"vs-whitespace"),m%=r):(v===f||C&&v>i)&&(l[c++]=new d(v,p),m%=r),9===y?m=r:m++,_=C,v===f&&(p=n[++h].type,f=n[h].endIndex)}return l[c++]=_?new d(t,"vs-whitespace"):new d(t,p),l}function l(e,t,n,o){o.sort(i.LineDecoration.compare);for(var r=i.LineDecorationsNormalizer.normalize(o),s=r.length,a=0,u=[],l=0,c=0,h=0,p=n.length;hc&&(c=v.startOffset,u[l++]=new d(c,m)),!(v.endOffset+1<=g)){c=g,u[l++]=new d(c,m+" "+v.className);break}c=v.endOffset+1,u[l++]=new d(c,m+" "+v.className),a++}g>c&&(c=g,u[l++]=new d(c,m))}return u}function c(e){for(var t=e.fontIsMonospace,n=e.containsForeignElements,i=e.lineContent,o=e.len,r=e.isOverflowing,s=e.parts,a=e.tabSize,u=e.containsRTL,l=e.spaceWidth,c=e.renderWhitespace,d=e.renderControlCharacters,h=new p(o+1,s.length),g=0,m=0,v=0,_="",y=0,C=s.length;y=0){for(var E=0,L="";g0&&(L+="→",E++,N--);N>0;)L+=" ",E++,N--;else L+="·",E++;v++}h.setPartLength(y,E),_+=t||n?''+L+"":''+L+""}else{for(var E=0,L="";g0;)L+=" ",E++,N--;break;case 32:L+=" ",E++;break;case 60:L+="<",E++;break;case 62:L+=">",E++;break;case 38:L+="&",E++;break;case 0:L+="�",E++;break;case 65279:case 8232:L+="�",E++;break;case 13:L+="​",E++;break;default:d&&x<32?(L+=String.fromCharCode(9216+x),E++):(L+=String.fromCharCode(x),E++)}v++}h.setPartLength(y,E),_+=u?''+L+"":''+L+""}}return h.setPartData(o,s.length-1,v),r&&(_+=""),_+="",new f(h,_,u,n)}Object.defineProperty(t,"__esModule",{value:!0});!function(e){e[e.None=0]="None",e[e.Boundary=1]="Boundary",e[e.All=2]="All"}(t.RenderWhitespace||(t.RenderWhitespace={}));var d=function(){return function(e,t){this.endIndex=e,this.type=t}}(),h=function(){function e(e,t,n,i,o,r,s,a,u,l,c,d){this.useMonospaceOptimizations=e,this.lineContent=t,this.mightContainRTL=n,this.fauxIndentLength=i,this.lineTokens=o,this.lineDecorations=r,this.tabSize=s,this.spaceWidth=a,this.stopRenderingLineAfter=u,this.renderWhitespace="all"===l?2:"boundary"===l?1:0,this.renderControlCharacters=c,this.fontLigatures=d}return e.prototype.equals=function(e){return this.useMonospaceOptimizations===e.useMonospaceOptimizations&&this.lineContent===e.lineContent&&this.mightContainRTL===e.mightContainRTL&&this.fauxIndentLength===e.fauxIndentLength&&this.tabSize===e.tabSize&&this.spaceWidth===e.spaceWidth&&this.stopRenderingLineAfter===e.stopRenderingLineAfter&&this.renderWhitespace===e.renderWhitespace&&this.renderControlCharacters===e.renderControlCharacters&&this.fontLigatures===e.fontLigatures&&i.LineDecoration.equalsArr(this.lineDecorations,e.lineDecorations)&&n.ViewLineToken.equalsArr(this.lineTokens,e.lineTokens)},e}();t.RenderLineInput=h;!function(e){e[e.PART_INDEX_MASK=4294901760]="PART_INDEX_MASK",e[e.CHAR_INDEX_MASK=65535]="CHAR_INDEX_MASK",e[e.CHAR_INDEX_OFFSET=0]="CHAR_INDEX_OFFSET",e[e.PART_INDEX_OFFSET=16]="PART_INDEX_OFFSET"}(t.CharacterMappingConstants||(t.CharacterMappingConstants={}));var p=function(){function e(e,t){this.length=e,this._data=new Uint32Array(this.length),this._partLengths=new Uint16Array(t)}return e.getPartIndex=function(e){return(4294901760&e)>>>16},e.getCharIndex=function(e){return(65535&e)>>>0},e.prototype.setPartData=function(e,t,n){var i=(t<<16|n<<0)>>>0;this._data[e]=i},e.prototype.setPartLength=function(e,t){this._partLengths[e]=t},e.prototype.getPartLengths=function(){return this._partLengths},e.prototype.charOffsetToPartData=function(e){return 0===this.length?0:e<0?this._data[0]:e>=this.length?this._data[this.length-1]:this._data[e]},e.prototype.partDataToCharOffset=function(t,n,i){if(0===this.length)return 0;for(var o=(t<<16|i<<0)>>>0,r=0,s=this.length-1;r+1>>1,u=this._data[a];if(u===o)return a;u>o?s=a:r=a}if(r===s)return r;var l=this._data[r],c=this._data[s];if(l===o)return r;if(c===o)return s;var d=e.getPartIndex(l);return i-e.getCharIndex(l)<=(d!==e.getPartIndex(c)?n:e.getCharIndex(c))-i?r:s},e}();t.CharacterMapping=p;var f=function(){return function(e,t,n,i){this.characterMapping=e,this.html=t,this.containsRTL=n,this.containsForeignElements=i}}();t.RenderLineOutput=f,t.renderViewLine=function(e){if(0===e.lineContent.length){var t=!1,n=" ";if(e.lineDecorations.length>0){for(var i=[],o=0,s=e.lineDecorations.length;o ')}return new f(new p(0,0),n,!1,t)}return c(r(e))};var g,m=function(){return function(e,t,n,i,o,r,s,a,u,l,c){this.fontIsMonospace=e,this.lineContent=t,this.len=n,this.isOverflowing=i,this.parts=o,this.containsForeignElements=r,this.tabSize=s,this.containsRTL=a,this.spaceWidth=u,this.renderWhitespace=l,this.renderControlCharacters=c}}();!function(e){e[e.LongToken=50]="LongToken"}(g||(g={}))}),define(d[221],h([1,0,2]),function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e,t,i,o){this.selections=e,this.startLineNumber=0|t.startLineNumber,this.endLineNumber=0|t.endLineNumber,this.relativeVerticalOffset=t.relativeVerticalOffset,this.bigNumbersDelta=0|t.bigNumbersDelta,this.whitespaceViewportData=i,this._model=o,this.visibleRange=new n.Range(t.startLineNumber,this._model.getLineMinColumn(t.startLineNumber),t.endLineNumber,this._model.getLineMaxColumn(t.endLineNumber))}return e.prototype.getViewLineRenderingData=function(e){return this._model.getViewLineRenderingData(this.visibleRange,e)},e.prototype.getDecorationsInViewport=function(){return this._model.getDecorationsInViewport(this.visibleRange)},e}();t.ViewportData=i}),define(d[222],h([1,0]),function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=function(){function e(){this._heights=[],this._ids=[],this._afterLineNumbers=[],this._ordinals=[],this._prefixSum=[],this._prefixSumValidIndex=-1,this._whitespaceId2Index={},this._lastWhitespaceId=0}return e.findInsertionIndex=function(e,t,n,i){for(var o=0,r=e.length;o>>1;t===e[s]?i=t&&(this._whitespaceId2Index[u]=l+1)}this._whitespaceId2Index[e.toString()]=t,this._prefixSumValidIndex=Math.min(this._prefixSumValidIndex,t-1)},e.prototype.changeWhitespace=function(e,t,n){e|=0,t|=0,n|=0;var i=!1;return i=this.changeWhitespaceHeight(e,n)||i,i=this.changeWhitespaceAfterLineNumber(e,t)||i},e.prototype.changeWhitespaceHeight=function(e,t){t|=0;var n=(e|=0).toString();if(this._whitespaceId2Index.hasOwnProperty(n)){var i=this._whitespaceId2Index[n];if(this._heights[i]!==t)return this._heights[i]=t,this._prefixSumValidIndex=Math.min(this._prefixSumValidIndex,i-1),!0}return!1},e.prototype.changeWhitespaceAfterLineNumber=function(t,n){n|=0;var i=(t|=0).toString();if(this._whitespaceId2Index.hasOwnProperty(i)){var o=this._whitespaceId2Index[i];if(this._afterLineNumbers[o]!==n){var r=this._ordinals[o],s=this._heights[o];this.removeWhitespace(t);var a=e.findInsertionIndex(this._afterLineNumbers,n,this._ordinals,r);return this._insertWhitespaceAtIndex(t,a,n,r,s),!0}}return!1},e.prototype.removeWhitespace=function(e){var t=(e|=0).toString();if(this._whitespaceId2Index.hasOwnProperty(t)){var n=this._whitespaceId2Index[t];return delete this._whitespaceId2Index[t],this._removeWhitespaceAtIndex(n),!0}return!1},e.prototype._removeWhitespaceAtIndex=function(e){e|=0,this._heights.splice(e,1),this._ids.splice(e,1),this._afterLineNumbers.splice(e,1),this._ordinals.splice(e,1),this._prefixSum.splice(e,1),this._prefixSumValidIndex=Math.min(this._prefixSumValidIndex,e-1);for(var t=Object.keys(this._whitespaceId2Index),n=0,i=t.length;n=e&&(this._whitespaceId2Index[o]=r-1)}},e.prototype.onLinesDeleted=function(e,t){e|=0,t|=0;for(var n=0,i=this._afterLineNumbers.length;nt&&(this._afterLineNumbers[n]-=t-e+1)}},e.prototype.onLinesInserted=function(e,t){e|=0,t|=0;for(var n=0,i=this._afterLineNumbers.length;n=t.length||t[o+1]>=e)return o;n=o+1|0}else i=o-1|0}return-1},e.prototype._findFirstWhitespaceAfterLineNumber=function(e){e|=0;var t=this._findLastWhitespaceBeforeLineNumber(e)+1;return t1?this._lineHeight*(e-1):0)+this._whitespaces.getAccumulatedHeightBeforeLineNumber(e)},e.prototype.getWhitespaceAccumulatedHeightBeforeLineNumber=function(e){return this._whitespaces.getAccumulatedHeightBeforeLineNumber(e)},e.prototype.hasWhitespace=function(){return this._whitespaces.getCount()>0},e.prototype.isAfterLines=function(e){return e>this.getLinesTotalHeight()},e.prototype.getLineNumberAtOrAfterVerticalOffset=function(e){if((e|=0)<0)return 1;for(var t=0|this._lineCount,n=this._lineHeight,i=1,o=t;i=s+n)i=r+1;else{if(e>=s)return r;o=r}}return i>t?t:i},e.prototype.getLinesViewportData=function(e,t){e|=0,t|=0;var n,i,o=this._lineHeight,r=0|this.getLineNumberAtOrAfterVerticalOffset(e),s=0|this.getVerticalOffsetForLineNumber(r),a=0|this._lineCount,u=0|this._whitespaces.getFirstWhitespaceIndexAfterLineNumber(r),l=0|this._whitespaces.getCount();-1===u?(u=l,i=a+1,n=0):(i=0|this._whitespaces.getAfterLineNumberForWhitespaceIndex(u),n=0|this._whitespaces.getHeightForWhitespaceIndex(u));var c=s,d=c,h=0;s>=5e5&&(h=5e5*Math.floor(s/5e5),d-=h=Math.floor(h/o)*o);for(var p=[],f=e+(t-e)/2,g=-1,m=r;m<=a;m++){if(-1===g){var v=c,_=c+o;(v<=f&&f<_||v>f)&&(g=m)}for(c+=o,p[m-r]=d,d+=o;i===m;)d+=n,c+=n,++u>=l?i=a+1:(i=0|this._whitespaces.getAfterLineNumberForWhitespaceIndex(u),n=0|this._whitespaces.getHeightForWhitespaceIndex(u));if(c>=t){a=m;break}}-1===g&&(g=a);var y=0|this.getVerticalOffsetForLineNumber(a),C=r,b=a;return Ct&&b--,{bigNumbersDelta:h,startLineNumber:r,endLineNumber:a,relativeVerticalOffset:p,centeredLineNumber:g,completelyVisibleStartLineNumber:C,completelyVisibleEndLineNumber:b}},e.prototype.getVerticalOffsetForWhitespaceIndex=function(e){e|=0;var t,n=this._whitespaces.getAfterLineNumberForWhitespaceIndex(e);t=n>=1?this._lineHeight*n:0;var i;return i=e>0?this._whitespaces.getAccumulatedHeight(e-1):0,t+i},e.prototype.getWhitespaceIndexAtOrAfterVerticallOffset=function(e){e|=0;var t,n,i,o=0,r=this._whitespaces.getCount()-1;if(r<0)return-1;if(e>=this.getVerticalOffsetForWhitespaceIndex(r)+this._whitespaces.getHeightForWhitespaceIndex(r))return-1;for(;o=n+i)o=t+1;else{if(e>=n)return t;r=t}return o},e.prototype.getWhitespaceAtVerticalOffset=function(e){e|=0;var t=this.getWhitespaceIndexAtOrAfterVerticallOffset(e);if(t<0)return null;if(t>=this._whitespaces.getCount())return null;var n=this.getVerticalOffsetForWhitespaceIndex(t);if(n>e)return null;var i=this._whitespaces.getHeightForWhitespaceIndex(t);return{id:this._whitespaces.getIdForWhitespaceIndex(t),afterLineNumber:this._whitespaces.getAfterLineNumberForWhitespaceIndex(t),verticalOffset:n,height:i}},e.prototype.getWhitespaceViewportData=function(e,t){e|=0,t|=0;var n=this.getWhitespaceIndexAtOrAfterVerticallOffset(e),i=this._whitespaces.getCount()-1;if(n<0)return[];for(var o=[],r=n;r<=i;r++){var s=this.getVerticalOffsetForWhitespaceIndex(r),a=this._whitespaces.getHeightForWhitespaceIndex(r);if(s>=t)break;o.push({id:this._whitespaces.getIdForWhitespaceIndex(r),afterLineNumber:this._whitespaces.getAfterLineNumberForWhitespaceIndex(r),verticalOffset:s,height:a})}return o},e.prototype.getWhitespaces=function(){return this._whitespaces.getWhitespaces(this._lineHeight)},e}();t.LinesLayout=i}),define(d[104],h([1,0,96]),function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var i=function(){return function(e,t){this.index=e,this.remainder=t}}();t.PrefixSumIndexOfResult=i;var o=function(){function e(e){this.values=e,this.prefixSum=new Uint32Array(e.length),this.prefixSumValidIndex=new Int32Array(1),this.prefixSumValidIndex[0]=-1}return e.prototype.getCount=function(){return this.values.length},e.prototype.insertValues=function(e,t){e=n.toUint32(e);var i=this.values,o=this.prefixSum,r=t.length;return 0!==r&&(this.values=new Uint32Array(i.length+r),this.values.set(i.subarray(0,e),0),this.values.set(i.subarray(e),e+r),this.values.set(t,e),e-1=0&&this.prefixSum.set(o.subarray(0,this.prefixSumValidIndex[0]+1)),!0)},e.prototype.changeValue=function(e,t){return e=n.toUint32(e),t=n.toUint32(t),this.values[e]!==t&&(this.values[e]=t,e-1=i.length)return!1;var r=i.length-e;return t>=r&&(t=r),0!==t&&(this.values=new Uint32Array(i.length-t),this.values.set(i.subarray(0,e),0),this.values.set(i.subarray(e+t),e),this.prefixSum=new Uint32Array(this.values.length),e-1=0&&this.prefixSum.set(o.subarray(0,this.prefixSumValidIndex[0]+1)),!0)},e.prototype.getTotalValue=function(){return 0===this.values.length?0:this._getAccumulatedValue(this.values.length-1)},e.prototype.getAccumulatedValue=function(e){return e<0?0:(e=n.toUint32(e),this._getAccumulatedValue(e))},e.prototype._getAccumulatedValue=function(e){if(e<=this.prefixSumValidIndex[0])return this.prefixSum[e];var t=this.prefixSumValidIndex[0]+1;0===t&&(this.prefixSum[0]=this.values[0],t++),e>=this.values.length&&(e=this.values.length-1);for(var n=t;n<=e;n++)this.prefixSum[n]=this.prefixSum[n-1]+this.values[n];return this.prefixSumValidIndex[0]=Math.max(this.prefixSumValidIndex[0],e),this.prefixSum[e]},e.prototype.getIndexOf=function(e){e=Math.floor(e),this.getTotalValue();for(var t,n,o,r=0,s=this.values.length-1;r<=s;)if(t=r+(s-r)/2|0,n=this.prefixSum[t],o=n-this.values[t],e=n))break;r=t+1}return new i(t,e-o)},e}();t.PrefixSumComputer=o;var r=function(){function e(e){this._cacheAccumulatedValueStart=0,this._cache=null,this._actual=new o(e),this._bustCache()}return e.prototype._bustCache=function(){this._cacheAccumulatedValueStart=0,this._cache=null},e.prototype.getCount=function(){return this._actual.getCount()},e.prototype.insertValues=function(e,t){this._actual.insertValues(e,t)&&this._bustCache()},e.prototype.changeValue=function(e,t){this._actual.changeValue(e,t)&&this._bustCache()},e.prototype.removeValues=function(e,t){this._actual.removeValues(e,t)&&this._bustCache()},e.prototype.getTotalValue=function(){return this._actual.getTotalValue()},e.prototype.getAccumulatedValue=function(e){return this._actual.getAccumulatedValue(e)},e.prototype.getIndexOf=function(e){if(e=Math.floor(e),null!==this._cache){var t=e-this._cacheAccumulatedValueStart;if(t>=0&&tthis._lines.length)t=this._lines.length,n=this._lines[t-1].length+1,i=!0;else{var o=this._lines[t-1].length+1;n<1?(n=1,i=!0):n>o&&(n=o,i=!0)}return i?{lineNumber:t,column:n}:e},t}(u.MirrorModel),g=function(){function e(){this._foreignModule=null}return e.prototype.computeDiff=function(e,t,n){var o=this._getModel(e),s=this._getModel(t);if(!o||!s)return null;var a=o.getLinesContent(),u=s.getLinesContent(),l=new r.DiffComputer(a,u,{shouldPostProcessCharChanges:!0,shouldIgnoreTrimWhitespace:n,shouldConsiderTrimWhitespaceInEmptyCase:!0,shouldMakePrettyDiff:!0});return i.TPromise.as(l.computeDiff())},e.prototype.computeDirtyDiff=function(e,t,n){var o=this._getModel(e),s=this._getModel(t);if(!o||!s)return null;var a=o.getLinesContent(),u=s.getLinesContent(),l=new r.DiffComputer(a,u,{shouldPostProcessCharChanges:!1,shouldIgnoreTrimWhitespace:n,shouldConsiderTrimWhitespaceInEmptyCase:!1,shouldMakePrettyDiff:!0});return i.TPromise.as(l.computeDiff())},e.prototype.computeMoreMinimalEdits=function(t,n,r){var a=this._getModel(t);if(!a)return i.TPromise.as(n);for(var u,l=[],c=0,d=n;ce._diffLimit)l.push({range:p,text:f});else for(var v=s.stringDiff(m,f,!1),_=a.offsetAt(o.Range.lift(p).getStartPosition()),y=0,C=v;y=n,l=s,c=i.viewportHeight-s>=n,d=e.left;return d+t>i.scrollLeft+i.viewportWidth&&(d=i.scrollLeft+i.viewportWidth-t),dthis._contentWidth)return null;var s=e.top-i,a=e.top+this._lineHeight,u=r+this._contentLeft,l=n.getDomNodePagePosition(this._viewDomNode.domNode),c=l.top+s-n.StandardWindow.scrollY,d=l.top+a-n.StandardWindow.scrollY,h=l.left+u-n.StandardWindow.scrollX,p=window.innerWidth||document.documentElement.clientWidth||document.body.clientWidth,f=c>=22,g=d+i<=(window.innerHeight||document.documentElement.clientHeight||document.body.clientHeight)-22;if(h+t+20>p&&(h-=m=h-(p-t-20),u-=m),h<0){var m=h;h-=m,u-=m}return this._fixedOverflowWidgets&&(s=c,a=d,u=h),{aboveTop:s,fitsAbove:f,belowTop:a,fitsBelow:g,left:u}},e.prototype._prepareRenderWidgetAtExactPositionOverflowing=function(e){return new s(e.top,e.left+this._contentLeft)},e.prototype._getTopLeft=function(e,t){var n=e.visibleRangeForPosition(t);if(!n)return null;var i=e.getVerticalOffsetForLineNumber(t.lineNumber)-e.scrollTop;return new s(i,n.left)},e.prototype._prepareRenderWidget=function(e){var t=this;if(!this._position||!this._preference)return null;var n=this._context.model.validateModelPosition(this._position);if(!this._context.model.coordinatesConverter.modelPositionIsVisible(n))return null;for(var i=this._context.model.coordinatesConverter.convertModelPositionToViewPosition(n),r=null,a=function(){if(!r){var n=t._getTopLeft(e,i);if(n){var o=t.domNode.domNode,s=o.clientWidth,a=o.clientHeight;r=t.allowEditorOverflow?t._layoutBoxInPage(n,s,a,e):t._layoutBoxInViewport(n,s,a,e)}}},u=1;u<=2;u++)for(var l=0;lo?1:i.Range.compareRangesUsingStarts(e.range,t.range)});for(var u=e.visibleRange.startLineNumber,l=e.visibleRange.endLineNumber,c=[],d=u;d<=l;d++)c[d-u]="";this._renderWholeLineDecorations(e,n,c),this._renderNormalDecorations(e,n,c),this._renderResult=c},t.prototype._renderWholeLineDecorations=function(e,t,n){for(var i=String(this._lineHeight),o=e.visibleRange.startLineNumber,r=e.visibleRange.endLineNumber,s=0,a=t.length;s',c=Math.max(u.range.startLineNumber,o),d=Math.min(u.range.endLineNumber,r),h=c;h<=d;h++)n[h-o]+=l}},t.prototype._renderNormalDecorations=function(e,t,n){for(var r=String(this._lineHeight),s=e.visibleRange.startLineNumber,a=0,u=t.length;a';n[v]+=w}}}}},t.prototype.render=function(e,t){if(!this._renderResult)return"";var n=t-e;if(n<0||n>=this._renderResult.length)throw new Error("Unexpected render request");return this._renderResult[n]},t}(n.DynamicViewOverlay);t.DecorationsOverlay=r}),define(d[113],h([1,0,67,279]),function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var i=function(){return function(e,t,n){this.startLineNumber=+e,this.endLineNumber=+t,this.className=String(n)}}();t.DecorationToRender=i;var o=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return f(t,e),t.prototype._render=function(e,t,n){for(var i=[],o=e;o<=t;o++)i[o-e]=[];if(0===n.length)return i;n.sort(function(e,t){return e.className===t.className?e.startLineNumber===t.startLineNumber?e.endLineNumber-t.endLineNumber:e.startLineNumber-t.startLineNumber:e.className',s=[],a=t;a<=n;a++){var u=a-t,l=i[u];0===l.length?s[u]="":s[u]='
    =this._renderResult.length)throw new Error("Unexpected render request");return this._renderResult[n]},t}(o);t.GlyphMarginOverlay=r}),define(d[233],h([1,0,113,288]),function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var i=function(e){function t(t){var n=e.call(this)||this;return n._context=t,n._decorationsLeft=n._context.configuration.editor.layoutInfo.decorationsLeft,n._decorationsWidth=n._context.configuration.editor.layoutInfo.decorationsWidth,n._renderResult=null,n._context.addEventHandler(n),n}return f(t,e),t.prototype.dispose=function(){this._context.removeEventHandler(this),this._context=null,this._renderResult=null,e.prototype.dispose.call(this)},t.prototype.onConfigurationChanged=function(e){return e.layoutInfo&&(this._decorationsLeft=this._context.configuration.editor.layoutInfo.decorationsLeft,this._decorationsWidth=this._context.configuration.editor.layoutInfo.decorationsWidth),!0},t.prototype.onDecorationsChanged=function(e){return!0},t.prototype.onFlushed=function(e){return!0},t.prototype.onLinesChanged=function(e){return!0},t.prototype.onLinesDeleted=function(e){return!0},t.prototype.onLinesInserted=function(e){return!0},t.prototype.onScrollChanged=function(e){return e.scrollTopChanged},t.prototype.onZonesChanged=function(e){return!0},t.prototype._getDecorations=function(e){for(var t=e.getDecorationsInViewport(),i=[],o=0,r=t.length;o
    ',r=[],s=t;s<=n;s++){for(var a=s-t,u=i[a],l="",c=0,d=u.length;c';o[s]=u}this._renderResult=o},t.prototype.render=function(e,t){return this._renderResult?this._renderResult[t-e]:""},t}(n.DedupOverlay);t.MarginViewLineDecorationsOverlay=i}),define(d[236],h([1,0,27,25,35,296]),function(e,t,n,i,o){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(e){function t(t){var i=e.call(this,t)||this;return i._widgets={},i._verticalScrollbarWidth=i._context.configuration.editor.layoutInfo.verticalScrollbarWidth,i._minimapWidth=i._context.configuration.editor.layoutInfo.minimapWidth,i._horizontalScrollbarHeight=i._context.configuration.editor.layoutInfo.horizontalScrollbarHeight,i._editorHeight=i._context.configuration.editor.layoutInfo.height,i._editorWidth=i._context.configuration.editor.layoutInfo.width,i._domNode=n.createFastDomNode(document.createElement("div")),o.PartFingerprints.write(i._domNode,4),i._domNode.setClassName("overlayWidgets"),i}return f(t,e),t.prototype.dispose=function(){e.prototype.dispose.call(this),this._widgets=null},t.prototype.getDomNode=function(){return this._domNode},t.prototype.onConfigurationChanged=function(e){return!!e.layoutInfo&&(this._verticalScrollbarWidth=this._context.configuration.editor.layoutInfo.verticalScrollbarWidth,this._minimapWidth=this._context.configuration.editor.layoutInfo.minimapWidth,this._horizontalScrollbarHeight=this._context.configuration.editor.layoutInfo.horizontalScrollbarHeight,this._editorHeight=this._context.configuration.editor.layoutInfo.height,this._editorWidth=this._context.configuration.editor.layoutInfo.width,!0)},t.prototype.addWidget=function(e){var t=n.createFastDomNode(e.getDomNode());this._widgets[e.getId()]={widget:e,preference:null,domNode:t},t.setPosition("absolute"),t.setAttribute("widgetId",e.getId()),this._domNode.appendChild(t),this.setShouldRender()},t.prototype.setWidgetPosition=function(e,t){var n=this._widgets[e.getId()];return n.preference!==t&&(n.preference=t,this.setShouldRender(),!0)},t.prototype.removeWidget=function(e){var t=e.getId();if(this._widgets.hasOwnProperty(t)){var n=this._widgets[t].domNode.domNode;delete this._widgets[t],n.parentNode.removeChild(n),this.setShouldRender()}},t.prototype._renderWidget=function(e){var t=e.domNode;if(null!==e.preference)if(e.preference===i.OverlayWidgetPositionPreference.TOP_RIGHT_CORNER)t.setTop(0),t.setRight(2*this._verticalScrollbarWidth+this._minimapWidth);else if(e.preference===i.OverlayWidgetPositionPreference.BOTTOM_RIGHT_CORNER){var n=t.domNode.clientHeight;t.setTop(this._editorHeight-n-2*this._horizontalScrollbarHeight),t.setRight(2*this._verticalScrollbarWidth+this._minimapWidth)}else e.preference===i.OverlayWidgetPositionPreference.TOP_CENTER&&(t.setTop(0),t.domNode.style.right="50%");else t.unsetTop()},t.prototype.prepareRender=function(e){},t.prototype.render=function(e){this._domNode.setWidth(this._editorWidth);for(var t=Object.keys(this._widgets),n=0,i=t.length;n=e.scrollWidth?0:this._configuration.editor.viewInfo.scrollbar.horizontalScrollbarSize},t.prototype._getTotalHeight=function(){var e=this.scrollable.getState(),t=this._linesLayout.getLinesTotalHeight();return this._configuration.editor.viewInfo.scrollBeyondLastLine?t+=e.height-this._configuration.editor.lineHeight:t+=this._getHorizontalScrollbarHeight(e),Math.max(e.height,t)},t.prototype._updateHeight=function(){this.scrollable.updateState({scrollHeight:this._getTotalHeight()})},t.prototype.getCurrentViewport=function(){var e=this.scrollable.getState();return new r.Viewport(e.scrollTop,e.scrollLeft,e.width,e.height)},t.prototype._computeScrollWidth=function(e,n){return this._configuration.editor.wrappingInfo.isViewportWrapping?Math.max(e,n):Math.max(e+t.LINES_HORIZONTAL_EXTRA_PX,n)},t.prototype.onMaxLineWidthChanged=function(e){var t=this._computeScrollWidth(e,this.getCurrentViewport().width);this.scrollable.updateState({scrollWidth:t}),this._updateHeight()},t.prototype.saveState=function(){var e=this.scrollable.getState(),t=e.scrollTop,n=this._linesLayout.getLineNumberAtOrAfterVerticalOffset(t);return{scrollTop:t,scrollTopWithoutViewZones:t-this._linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(n),scrollLeft:e.scrollLeft}},t.prototype.restoreState=function(e){var t=e.scrollTop;"number"!=typeof e.scrollTopWithoutViewZones||this._linesLayout.hasWhitespace()||(t=e.scrollTopWithoutViewZones),this.scrollable.updateState({scrollLeft:e.scrollLeft,scrollTop:t})},t.prototype.addWhitespace=function(e,t,n){return this._linesLayout.insertWhitespace(e,t,n)},t.prototype.changeWhitespace=function(e,t,n){return this._linesLayout.changeWhitespace(e,t,n)},t.prototype.removeWhitespace=function(e){return this._linesLayout.removeWhitespace(e)},t.prototype.getVerticalOffsetForLineNumber=function(e){return this._linesLayout.getVerticalOffsetForLineNumber(e)},t.prototype.isAfterLines=function(e){return this._linesLayout.isAfterLines(e)},t.prototype.getLineNumberAtVerticalOffset=function(e){return this._linesLayout.getLineNumberAtOrAfterVerticalOffset(e)},t.prototype.getWhitespaceAtVerticalOffset=function(e){return this._linesLayout.getWhitespaceAtVerticalOffset(e)},t.prototype.getLinesViewportData=function(){var e=this.getCurrentViewport();return this._linesLayout.getLinesViewportData(e.top,e.top+e.height)},t.prototype.getLinesViewportDataAtScrollTop=function(e){var t=this.scrollable.getState();return e+t.height>t.scrollHeight&&(e=t.scrollHeight-t.height),e<0&&(e=0),this._linesLayout.getLinesViewportData(e,e+t.height)},t.prototype.getWhitespaceViewportData=function(){var e=this.getCurrentViewport();return this._linesLayout.getWhitespaceViewportData(e.top,e.top+e.height)},t.prototype.getWhitespaces=function(){return this._linesLayout.getWhitespaces()},t.prototype.getScrollWidth=function(){return this.scrollable.getState().scrollWidth},t.prototype.getScrollLeft=function(){return this.scrollable.getState().scrollLeft},t.prototype.getScrollHeight=function(){return this.scrollable.getState().scrollHeight},t.prototype.getScrollTop=function(){return this.scrollable.getState().scrollTop},t.prototype.setScrollPosition=function(e){this.scrollable.updateState(e)},t.LINES_HORIZONTAL_EXTRA_PX=30,t}(n.Disposable);t.ViewLayout=s}),define(d[240],h([1,0,2,12,86]),function(e,t,n,i,o){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e,t,n,i){this.editorId=e,this.model=t,this.configuration=n,this._coordinatesConverter=i,this._decorationsCache=Object.create(null),this._clearCachedModelDecorationsResolver()}return e.prototype._clearCachedModelDecorationsResolver=function(){this._cachedModelDecorationsResolver=null,this._cachedModelDecorationsResolverViewRange=null},e.prototype.dispose=function(){this._decorationsCache=null,this._clearCachedModelDecorationsResolver()},e.prototype.reset=function(){this._decorationsCache=Object.create(null),this._clearCachedModelDecorationsResolver()},e.prototype.onModelDecorationsChanged=function(e){for(var t=e.changedDecorations,n=0,i=t.length;n1){v=new o.InlineDecoration(new n.Range(m.endLineNumber,m.endColumn-1,m.endLineNumber,m.endColumn),f.afterContentClassName,!0);l[m.endLineNumber-i].push(v)}}return{decorations:a,inlineDecorations:l}},e}();t.ViewModelDecorations=r}),define(d[241],h([1,0,2]),function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e,t){this._selection=e,this._isMovingLeft=t}return e.prototype.getEditOperations=function(e,t){var i=this._selection;if(this._selectionId=t.trackSelection(i),i.startLineNumber===i.endLineNumber&&(!this._isMovingLeft||0!==i.startColumn)&&(this._isMovingLeft||i.endColumn!==e.getLineMaxColumn(i.startLineNumber))){var o,r,s,a=i.selectionStartLineNumber,u=e.getLineContent(a);this._isMovingLeft?(o=u.substring(0,i.startColumn-2),r=u.substring(i.startColumn-1,i.endColumn-1),s=u.substring(i.startColumn-2,i.startColumn-1)+u.substring(i.endColumn-1)):(o=u.substring(0,i.startColumn-1)+u.substring(i.endColumn-1,i.endColumn),r=u.substring(i.startColumn-1,i.endColumn-1),s=u.substring(i.endColumn));var l=o+r+s;t.addEditOperation(new n.Range(a,1,a,e.getLineMaxColumn(a)),null),t.addEditOperation(new n.Range(a,1,a,1),l),this._cutStartIndex=i.startColumn+(this._isMovingLeft?-1:1),this._cutEndIndex=this._cutStartIndex+i.endColumn-i.startColumn,this._moved=!0}},e.prototype.computeCursorState=function(e,t){var n=t.getTrackedSelection(this._selectionId);return this._moved&&(n=(n=n.setStartPosition(n.startLineNumber,this._cutStartIndex)).setEndPosition(n.startLineNumber,this._cutEndIndex)),n},e}();t.MoveCaretCommand=i}),define(d[242],h([1,0,32,2]),function(e,t,n,i){"use strict";function o(e){return!!e.transparentFormatter}Object.defineProperty(t,"__esModule",{value:!0}),t.isAdvancedFormatter=o;var r=function(){function e(e,t,n,o,r,s,a){this.editorModel=s,this.colorFormatters=[],this._colorModelIndex=0,this.originalColor=e,this._opaqueFormatter=n,this.colorFormatters=r,this.color=t,this.hue=t.getHue(),this.saturation=t.getSaturation(),this.value=t.getValue(),this._colorRange=new i.Range(a.startLineNumber,a.startColumn,a.endLineNumber,a.endColumn)}return Object.defineProperty(e.prototype,"color",{get:function(){return this._color},set:function(e){this._color=e;var t=e.toRGBA().a;this._opacity||(this._opacity=t/255),this.saturation=e.getSaturation(),this.value=e.getValue(),1===this._opacity?this.selectedColorString=this._opaqueFormatter.toString(this._color):this._transparentFormatter?this.selectedColorString=this._transparentFormatter.toString(this._color):this.nextColorMode()},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"selectedColorString",{get:function(){return this._selectedColor},set:function(e){this._selectedColor!==e&&(this._selectedColor=e,this.widget&&this.widget.header&&this.widget.body&&(this.widget.header.updatePickedColor(),this.widget.body.fillOpacityOverlay(this._color),this.editorModel.pushEditOperations([],[{identifier:null,range:this._colorRange,text:e,forceMoveMarkers:!1}],function(){return[]}),this._colorRange=this._colorRange.setEndPosition(this._colorRange.endLineNumber,this._colorRange.startColumn+e.length)))},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"hue",{get:function(){return this._hue},set:function(e){this._hue=e,this.widget&&this.widget.body&&this.widget.body.saturationBox.fillSaturationBox()},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"opacity",{get:function(){return this._opacity},set:function(e){this._opacity=e;var t=this._color.toRGBA();this.color=n.Color.fromRGBA(new n.RGBA(t.r,t.g,t.b,255*e)),this.widget.header&&this.widget.header.updatePickedColor()},enumerable:!0,configurable:!0}),e.prototype.nextColorMode=function(){this._colorModelIndex++,this._colorModelIndex===this.colorFormatters.length&&(this._colorModelIndex=0);var e=this.colorFormatters[this._colorModelIndex];o(e)?(this._transparentFormatter=e.transparentFormatter,this._opaqueFormatter=e.opaqueFormatter,this.selectedColorString=1===this._opacity?this._opaqueFormatter.toString(this._color):this._transparentFormatter.toString(this._color)):this._transparentFormatter&&1!==this._opacity?this.nextColorMode():(this._transparentFormatter=null,this._opaqueFormatter=e,this.selectedColorString=this._opaqueFormatter.toString(this._color))},e.prototype.getHueColor=function(e){var t=e/60,i=1-Math.abs(t%2-1),o=0,r=0,s=0;return t>=0&&t<1?(o=1,r=i):t>=1&&t<2?(o=i,r=1):t>=2&&t<3?(r=1,s=i):t>=3&&t<4?(r=i,s=1):t>=4&&t<5?(o=i,s=1):(o=1,s=i),o=Math.round(255*o),r=Math.round(255*r),s=Math.round(255*s),n.Color.fromRGBA(new n.RGBA(o,r,s))},e}();t.ColorPickerModel=r;var s=function(){return function(){}}();t.ISaturationState=s}),define(d[243],h([1,0,4,3,83,15,32]),function(e,t,n,i,o,r,s){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var a=n.$,u=function(e){function t(t,i){var o=e.call(this)||this;return o.widget=t,o.model=i,o.pixelRatio=o.widget.editor.getConfiguration().pixelRatio,o.domNode=a(".colorpicker-body"),n.append(t.getDomNode(),o.domNode),o.drawSaturationBox(),o.drawOpacityStrip(),o.drawHueStrip(),o.registerListeners(),o}return f(t,e),t.prototype.fillOpacityOverlay=function(e){var t=e.toRGBA(),n=t.r,i=t.g,o=t.b;this.opacityOverlay.style.background="linear-gradient(to bottom, rgba("+n+", "+i+", "+o+", 1) 0%, rgba("+n+", "+i+", "+o+", 0) 100%)"},t.prototype.registerListeners=function(){var e=this,t=this._register(new o.GlobalMouseMoveMonitor);this._register(n.addDisposableListener(this.saturationBox.domNode,n.EventType.MOUSE_DOWN,function(n){e.saturationListener(n,t)})),this._register(n.addDisposableListener(this.hueStrip,n.EventType.MOUSE_DOWN,function(n){e.stripListener(e.hueStrip,n,t)})),this._register(n.addDisposableListener(this.opacityStrip,n.EventType.MOUSE_DOWN,function(n){e.stripListener(e.opacityStrip,n,t)}))},t.prototype.saturationListener=function(e,t){var n=this;if(0===e.button){var i,r,a=function(e,t){var i=n.saturationBox.extractColor(e,t).toRGBA();n.widget.model.color=s.Color.fromRGBA(new s.RGBA(i.r,i.g,i.b,255*n.widget.model.opacity)),n.saturationBox.focusSaturationSelection({x:e,y:t})};e.target!==this.saturationBox.saturationSelection?(i=e.offsetX,r=e.offsetY,a(i,r)):(i=this.widget.model.saturationSelection.x,r=this.widget.model.saturationSelection.y);var u=e.clientY,l=e.clientX;t.startMonitoring(o.standardMouseMoveMerger,function(e){var t=e.posx-l,n=e.posy-u;a(i+t,r+n)},function(){return null})}},t.prototype.stripListener=function(e,t,n){var i=this;if(0===t.button){var s=e===this.hueStrip?this.hueSlider:this.opacitySlider,a=e===this.hueStrip?this.hueStrip:this.opacityStrip;t.target!==this.hueStrip&&t.target!==this.opacityStrip||(s.top=t.offsetY);var u=function(){s===i.hueSlider?i.widget.model.hue=i.calculateSliderHue(s):s===i.opacitySlider&&(i.widget.model.opacity=i.calculateOpacity(s))};u();var l=t.clientY,c=t.clientX,d=s.top;n.startMonitoring(o.standardMouseMoveMerger,function(e){a.style.cursor="-webkit-grabbing";var t=Math.abs(e.posx-c);if(r.isWindows&&t>140)return s.top=0,void(s===i.hueSlider?i.widget.model.hue=0:s===i.opacitySlider&&(i.widget.model.opacity=1));var n=e.posy-l;s.top=d+n,u()},function(){a.style.cursor="-webkit-grab"})}},t.prototype.drawSaturationBox=function(){this.saturationBox=new l(this.model,this.domNode,this.pixelRatio)},t.prototype.drawOpacityStrip=function(){this.opacityStrip=a(".strip.opacity-strip"),n.append(this.domNode,this.opacityStrip),this.opacityOverlay=a(".opacity-overlay"),this.fillOpacityOverlay(this.model.color),n.append(this.opacityStrip,this.opacityOverlay),this.opacitySlider=new c(this.opacityStrip),this.opacitySlider.top=1===this.model.opacity?0:this.opacityStrip.offsetHeight*(1-this.model.opacity),n.append(this.opacityStrip,this.opacitySlider.domNode)},t.prototype.drawHueStrip=function(){this.hueStrip=a(".strip.hue-strip"),n.append(this.domNode,this.hueStrip),this.hueSlider=new c(this.hueStrip),n.append(this.hueStrip,this.hueSlider.domNode),this.hueSlider.top=(this.hueStrip.offsetHeight-this.hueSlider.domNode.offsetHeight)*(this.model.color.getHue()/359)},t.prototype.calculateSliderHue=function(e){var t=this.hueStrip.offsetHeight-e.domNode.offsetHeight;return 359*(1-(t-e.top)/t)},t.prototype.calculateOpacity=function(e){var t=this.opacityStrip.offsetHeight-e.domNode.offsetHeight;return(t-e.top)/t},t}(i.Disposable);t.ColorPickerBody=u;var l=function(){function e(e,t,i){this.model=e,this.pixelRatio=i,this.domNode=a(".saturation-wrap"),n.append(t,this.domNode),this.saturationCanvas=document.createElement("canvas"),this.saturationCanvas.className="saturation-box",n.append(this.domNode,this.saturationCanvas),this.saturationSelection=a(".saturation-selection"),n.append(this.domNode,this.saturationSelection)}return e.prototype.layout=function(){var e=this.domNode.offsetWidth*this.pixelRatio,t=this.domNode.offsetHeight*this.pixelRatio;this.saturationCanvas.width=e,this.saturationCanvas.height=t,this.saturationCtx=this.saturationCanvas.getContext("2d"),this.saturationCtx.rect(0,0,e,t);var n=document.createElement("canvas").getContext("2d");this.whiteGradient=n.createLinearGradient(0,0,e,0),this.whiteGradient.addColorStop(0,"rgba(255, 255, 255, 1)"),this.whiteGradient.addColorStop(1,"rgba(255, 255, 255, 0)"),this.blackGradient=n.createLinearGradient(0,0,0,t),this.blackGradient.addColorStop(0,"rgba(0, 0, 0, 0)"),this.blackGradient.addColorStop(1,"rgba(0, 0, 0, 1)"),this.fillSaturationBox();var i=this.model.saturation*this.saturationCanvas.clientWidth,o=this.model.value*this.saturationCanvas.clientHeight,r=0===o?this.saturationCanvas.clientHeight:this.saturationCanvas.clientHeight-o;this.focusSaturationSelection({x:i,y:r})},e.prototype.fillSaturationBox=function(){if(this.saturationCtx.fillStyle=this.calculateHueColor(this.model.hue).toString(),this.saturationCtx.fill(),this.saturationCtx.fillStyle=this.whiteGradient,this.saturationCtx.fill(),this.saturationCtx.fillStyle=this.blackGradient,this.saturationCtx.fill(),this.model.saturationSelection){var e=s.Color.fromHSV(this.model.hue,this.model.saturation,this.model.value,255*this.model.opacity);this.model.color=e}},e.prototype.focusSaturationSelection=function(e){var t=e.x,n=e.y;t<0?t=0:t>this.domNode.offsetWidth&&(t=this.domNode.offsetWidth),n<0?n=0:n>this.domNode.offsetHeight&&(n=this.domNode.offsetHeight),this.saturationSelection.style.left=t+"px",this.saturationSelection.style.top=n+"px",this.model.saturationSelection={x:t,y:n}},e.prototype.extractColor=function(e,t){var n=1-e/this.domNode.offsetWidth,i=t/this.domNode.offsetHeight,o=s.Color.fromRGBA(new s.RGBA(255,255,255,255*n));return s.Color.fromRGBA(new s.RGBA(0,0,0,255*i)).blend(o).blend(this.calculateHueColor(this.model.hue))},e.prototype.calculateHueColor=function(e){var t=e/60,n=1-Math.abs(t%2-1),i=0,o=0,r=0;return t>=0&&t<1?(i=1,o=n):t>=1&&t<2?(i=n,o=1):t>=2&&t<3?(o=1,r=n):t>=3&&t<4?(o=n,r=1):t>=4&&t<5?(i=n,r=1):(i=1,r=n),i=Math.round(255*i),o=Math.round(255*o),r=Math.round(255*r),s.Color.fromRGBA(new s.RGBA(i,o,r))},e}();t.SaturationBox=l;var c=function(){function e(e){this.strip=e,this.domNode=a(".slider"),this._top=0}return Object.defineProperty(e.prototype,"top",{get:function(){return this._top},set:function(e){e<0?e=0:e>this.strip.offsetHeight-this.domNode.offsetHeight&&(e=this.strip.offsetHeight-this.domNode.offsetHeight),this.domNode.style.top=e+"px",this._top=e},enumerable:!0,configurable:!0}),e}()}),define(d[244],h([1,0,4,3]),function(e,t,n,i){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var o=n.$,r=function(e){function t(t,i){var r=e.call(this)||this;return r.widget=t,r.model=i,r.domNode=o(".colorpicker-header"),n.append(t.getDomNode(),r.domNode),r.drawPickedColorBox(),r.drawOriginalColorBox(),n.addDisposableListener(r.pickedColorNode,n.EventType.CLICK,function(){0!==r.model.colorFormatters.length&&r.model.nextColorMode()}),r}return f(t,e),t.prototype.updatePickedColor=function(){this.pickedColorNode.textContent=this.model.selectedColorString,this.pickedColorNode.style.backgroundColor=this.model.color.toString()},t.prototype.drawPickedColorBox=function(){this.pickedColorNode=o(".picked-color"),this.pickedColorNode.style.backgroundColor=this.model.color.toString(),this.pickedColorNode.textContent=this.model.selectedColorString,n.append(this.domNode,this.pickedColorNode)},t.prototype.drawOriginalColorBox=function(){var e=o(".original-color");e.style.backgroundColor=this.model.originalColor,n.append(this.domNode,e)},t}(i.Disposable);t.ColorPickerHeader=r}),define(d[245],h([1,0,41,4,28,244,243,316]),function(e,t,n,i,o,r,s){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var a=i.$,u=function(e){function t(t,n){var i=e.call(this)||this;return i.model=t,i.editor=n,i.visible=!1,i._register(o.onDidChangeZoomLevel(function(){return i.layout()})),i.domNode=a(".editor-widget.colorpicker-widget"),i}return f(t,e),t.prototype.layout=function(){this.visible||(this.header=new r.ColorPickerHeader(this,this.model),this.body=new s.ColorPickerBody(this,this.model),this.visible=!0)},t.prototype.layoutSaturationBox=function(){this.body.saturationBox.layout()},t.prototype.dispose=function(){this.visible=!1,this.domNode=null,e.prototype.dispose.call(this)},t.prototype.getId=function(){return t.ID},t.prototype.getDomNode=function(){return this.domNode},t.ID="editor.contrib.colorPickerWidget",t}(n.Widget);t.ColorPickerWidget=u}),define(d[246],h([1,0]),function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.isColorDecorationOptions=function(e){return!(!e||!e.color)}}),define(d[247],h([1,0]),function(e,t){"use strict";function n(e){return function(){return e}}function i(e,t,n,i){var o=e;if(t||n){if(t>n)throw new Error("Color format range defined is not correct. Range start is bigger than end.");if(t===n)throw new Error("Color format range defined is not correct. Range start is the same as end.");o=o/i*(n-t)+t}return o}function o(e,t,n,o,u){return function(l){var c;switch(e){case"red":c=i(l.toRGBA().r,o,u,r);break;case"green":c=i(l.toRGBA().g,o,u,r);break;case"blue":c=i(l.toRGBA().b,o,u,r);break;case"alpha":c=i(l.toRGBA().a,o,u,r);break;case"hue":c=i(l.toHSLA().h,o,u,s);break;case"saturation":c=i(l.toHSLA().s,o,u,a);break;case"luminosity":c=i(l.toHSLA().l,o,u,a)}if(void 0===c)throw new Error(e+" is not supported as a color format.");var d;return"f"===n?(t=t||2,d=c.toFixed(t)):"x"===n||"X"===n?(2!==(d=i(c,o,u,r).toString(16)).length&&(d="0"+d),"X"===n&&(d=d.toUpperCase())):d=c.toFixed(0),d.toString()}}Object.defineProperty(t,"__esModule",{value:!0});var r=255,s=360,a=1,u=function(){function e(e){this.tree=[],this.parse(e)}return e.prototype.parse=function(t){for(var i=e.PATTERN.exec(t),r=0;null!==i;){var s=i.index;re.length)return!1;for(var o=0;od?u-1:u}},e}();t.LineCommentCommand=l}),define(d[251],h([1,0,22,2]),function(e,t,n,i){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var o=function(){function e(e,t,n){this.selection=e,this.targetPosition=t,this.copy=n}return e.prototype.getEditOperations=function(e,t){var o=e.getValueInRange(this.selection);this.copy||t.addEditOperation(this.selection,null),t.addEditOperation(new i.Range(this.targetPosition.lineNumber,this.targetPosition.column,this.targetPosition.lineNumber,this.targetPosition.column),o),!this.selection.containsPosition(this.targetPosition)||this.copy&&(this.selection.getEndPosition().equals(this.targetPosition)||this.selection.getStartPosition().equals(this.targetPosition))?this.copy?this.targetSelection=new n.Selection(this.targetPosition.lineNumber,this.targetPosition.column,this.selection.endLineNumber-this.selection.startLineNumber+this.targetPosition.lineNumber,this.selection.startLineNumber===this.selection.endLineNumber?this.targetPosition.column+this.selection.endColumn-this.selection.startColumn:this.selection.endColumn):this.targetPosition.lineNumber>this.selection.endLineNumber?this.targetSelection=new n.Selection(this.targetPosition.lineNumber-this.selection.endLineNumber+this.selection.startLineNumber,this.targetPosition.column,this.targetPosition.lineNumber,this.selection.startLineNumber===this.selection.endLineNumber?this.targetPosition.column+this.selection.endColumn-this.selection.startColumn:this.selection.endColumn):this.targetPosition.lineNumbern&&(t=n),this._matchesPosition!==t&&(this._matchesPosition=t,r.matchesPosition=!0,s=!0),this._matchesCount!==n&&(this._matchesCount=n,r.matchesCount=!0,s=!0),void 0!==o&&(i.Range.equalsRange(this._currentMatch,o)||(this._currentMatch=o,r.currentMatch=!0,s=!0)),s&&this._eventEmitter.emit(e._CHANGED_EVENT,r)},e.prototype.change=function(t,n,o){void 0===o&&(o=!0);var r={moveCursor:n,updateHistory:o,searchString:!1,replaceString:!1,isRevealed:!1,isReplaceRevealed:!1,isRegex:!1,wholeWord:!1,matchCase:!1,searchScope:!1,matchesPosition:!1,matchesCount:!1,currentMatch:!1},s=!1;void 0!==t.searchString&&this._searchString!==t.searchString&&(this._searchString=t.searchString,r.searchString=!0,s=!0),void 0!==t.replaceString&&this._replaceString!==t.replaceString&&(this._replaceString=t.replaceString,r.replaceString=!0,s=!0),void 0!==t.isRevealed&&this._isRevealed!==t.isRevealed&&(this._isRevealed=t.isRevealed,r.isRevealed=!0,s=!0),void 0!==t.isReplaceRevealed&&this._isReplaceRevealed!==t.isReplaceRevealed&&(this._isReplaceRevealed=t.isReplaceRevealed,r.isReplaceRevealed=!0,s=!0),void 0!==t.isRegex&&this._isRegex!==t.isRegex&&(this._isRegex=t.isRegex,r.isRegex=!0,s=!0),void 0!==t.wholeWord&&this._wholeWord!==t.wholeWord&&(this._wholeWord=t.wholeWord,r.wholeWord=!0,s=!0),void 0!==t.matchCase&&this._matchCase!==t.matchCase&&(this._matchCase=t.matchCase,r.matchCase=!0,s=!0),void 0!==t.searchScope&&(i.Range.equalsRange(this._searchScope,t.searchScope)||(this._searchScope=t.searchScope,r.searchScope=!0,s=!0)),s&&this._eventEmitter.emit(e._CHANGED_EVENT,r)},e._CHANGED_EVENT="changed",e}();t.FindReplaceState=o}),define(d[254],h([1,0,2]),function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e,t,n){this._editorSelection=e,this._ranges=t,this._replaceStrings=n}return e.prototype.getEditOperations=function(e,t){if(this._ranges.length>0){for(var i=[],o=0;o0;){if(e=r)break;var a=e.charCodeAt(i);if(36===a){t.emitUnchanged(i-1),t.emitStatic("$",i+1);continue}if(48===a||38===a){t.emitUnchanged(i-1),t.emitMatchIndex(0,i+1);continue}if(49<=a&&a<=57){var u=a-48;if(i+1=r)break;switch(a=e.charCodeAt(i)){case 92:t.emitUnchanged(i-1),t.emitStatic("\\",i+1);break;case 110:t.emitUnchanged(i-1),t.emitStatic("\n",i+1);break;case 116:t.emitUnchanged(i-1),t.emitStatic("\t",i+1)}}}return t.finalize()}}),define(d[256],h([1,0]),function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ID="editor.contrib.folding"}),define(d[257],h([1,0]),function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.computeRanges=function(e){return e.getIndentRanges()},t.limitByIndent=function(e,t){if(e.length<=t)return e;var n=[];e.forEach(function(e){e.indent<1e3&&(n[e.indent]=(n[e.indent]||0)+1)});for(var i=n.length,o=0;o0){var u=r.modifyPosition(e.getStartPosition(),a);e=new i.Range(u.lineNumber,u.column,e.endLineNumber,e.endColumn),t=t.substring(a),s=s.substr(a)}var l=n.commonSuffixLength(t,s);if(l>0){var c=r.modifyPosition(e.getEndPosition(),-l);e=new i.Range(e.startLineNumber,e.startColumn,c.lineNumber,c.column),t=t.substring(0,t.length-l),s=s.substring(0,s.length-l)}return{text:t,range:e,forceMoveMarkers:o}},e}();t.EditOperationsCommand=o}),define(d[192],h([1,0,28,3,11,15,171]),function(e,t,n,i,o,r){"use strict";function s(e,t){return!!e[t]}function a(e){return"altKey"===e?r.isMacintosh?new c(57,"metaKey",6,"altKey"):new c(5,"ctrlKey",6,"altKey"):r.isMacintosh?new c(6,"altKey",57,"metaKey"):new c(6,"altKey",5,"ctrlKey")}Object.defineProperty(t,"__esModule",{value:!0});var u=function(){return function(e,t){this.target=e.target,this.hasTriggerModifier=s(e.event,t.triggerModifier),this.hasSideBySideModifier=s(e.event,t.triggerSideBySideModifier),this.isNoneOrSingleMouseDown=n.isIE||e.event.detail<=1}}();t.ClickLinkMouseEvent=u;var l=function(){return function(e,t){this.keyCodeIsTriggerKey=e.keyCode===t.triggerKey,this.keyCodeIsSideBySideKey=e.keyCode===t.triggerSideBySideKey,this.hasTriggerModifier=s(e,t.triggerModifier)}}();t.ClickLinkKeyboardEvent=l;var c=function(){function e(e,t,n,i){this.triggerKey=e,this.triggerModifier=t,this.triggerSideBySideKey=n,this.triggerSideBySideModifier=i}return e.prototype.equals=function(e){return this.triggerKey===e.triggerKey&&this.triggerModifier===e.triggerModifier&&this.triggerSideBySideKey===e.triggerSideBySideKey&&this.triggerSideBySideModifier===e.triggerSideBySideModifier},e}();t.ClickLinkOptions=c;var d=function(e){function t(t){var n=e.call(this)||this;return n._onMouseMoveOrRelevantKeyDown=n._register(new o.Emitter),n.onMouseMoveOrRelevantKeyDown=n._onMouseMoveOrRelevantKeyDown.event,n._onExecute=n._register(new o.Emitter),n.onExecute=n._onExecute.event,n._onCancel=n._register(new o.Emitter),n.onCancel=n._onCancel.event,n._editor=t,n._opts=a(n._editor.getConfiguration().multiCursorModifier),n.lastMouseMoveEvent=null,n.hasTriggerKeyOnMouseDown=!1,n._register(n._editor.onDidChangeConfiguration(function(e){if(e.multiCursorModifier){var t=a(n._editor.getConfiguration().multiCursorModifier);if(n._opts.equals(t))return;n._opts=t,n.lastMouseMoveEvent=null,n.hasTriggerKeyOnMouseDown=!1,n._onCancel.fire()}})),n._register(n._editor.onMouseMove(function(e){return n.onEditorMouseMove(new u(e,n._opts))})),n._register(n._editor.onMouseDown(function(e){return n.onEditorMouseDown(new u(e,n._opts))})),n._register(n._editor.onMouseUp(function(e){return n.onEditorMouseUp(new u(e,n._opts))})),n._register(n._editor.onKeyDown(function(e){return n.onEditorKeyDown(new l(e,n._opts))})),n._register(n._editor.onKeyUp(function(e){return n.onEditorKeyUp(new l(e,n._opts))})),n._register(n._editor.onMouseDrag(function(){return n.resetHandler()})),n._register(n._editor.onDidChangeCursorSelection(function(e){return n.onDidChangeCursorSelection(e)})),n._register(n._editor.onDidChangeModel(function(e){return n.resetHandler()})),n._register(n._editor.onDidChangeModelContent(function(){return n.resetHandler()})),n._register(n._editor.onDidScrollChange(function(e){(e.scrollTopChanged||e.scrollLeftChanged)&&n.resetHandler()})),n}return f(t,e),t.prototype.onDidChangeCursorSelection=function(e){e.selection&&e.selection.startColumn!==e.selection.endColumn&&this.resetHandler()},t.prototype.onEditorMouseMove=function(e){this.lastMouseMoveEvent=e,this._onMouseMoveOrRelevantKeyDown.fire([e,null])},t.prototype.onEditorMouseDown=function(e){this.hasTriggerKeyOnMouseDown=e.hasTriggerModifier},t.prototype.onEditorMouseUp=function(e){this.hasTriggerKeyOnMouseDown&&this._onExecute.fire(e)},t.prototype.onEditorKeyDown=function(e){this.lastMouseMoveEvent&&(e.keyCodeIsTriggerKey||e.keyCodeIsSideBySideKey&&e.hasTriggerModifier)?this._onMouseMoveOrRelevantKeyDown.fire([this.lastMouseMoveEvent,e]):e.hasTriggerModifier&&this._onCancel.fire()},t.prototype.onEditorKeyUp=function(e){e.keyCodeIsTriggerKey&&this._onCancel.fire()},t.prototype.resetHandler=function(){this.lastMouseMoveEvent=null,this.hasTriggerKeyOnMouseDown=!1,this._onCancel.fire()},t}(i.Disposable);t.ClickLinkGesture=d}),define(d[195],h([1,0,18,10]),function(e,t,n,i){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var o;!function(e){e[e.IDLE=0]="IDLE",e[e.FIRST_WAIT=1]="FIRST_WAIT",e[e.SECOND_WAIT=2]="SECOND_WAIT",e[e.WAITING_FOR_ASYNC_COMPUTATION=3]="WAITING_FOR_ASYNC_COMPUTATION"}(o||(o={}));var r=function(){function e(e,t,i,o){var r=this;this._computer=e,this._state=0,this._firstWaitScheduler=new n.RunOnceScheduler(function(){return r._triggerAsyncComputation()},this._getHoverTimeMillis()/2),this._secondWaitScheduler=new n.RunOnceScheduler(function(){return r._triggerSyncComputation()},this._getHoverTimeMillis()/2),this._loadingMessageScheduler=new n.RunOnceScheduler(function(){return r._showLoadingMessage()},3*this._getHoverTimeMillis()),this._asyncComputationPromise=null,this._asyncComputationPromiseDone=!1,this._completeCallback=t,this._errorCallback=i,this._progressCallback=o}return e.prototype.getComputer=function(){return this._computer},e.prototype._getHoverTimeMillis=function(){return this._computer.getHoverTimeMillis?this._computer.getHoverTimeMillis():e.HOVER_TIME},e.prototype._triggerAsyncComputation=function(){var e=this;this._state=2,this._secondWaitScheduler.schedule(),this._computer.computeAsync?(this._asyncComputationPromiseDone=!1,this._asyncComputationPromise=this._computer.computeAsync().then(function(t){e._asyncComputationPromiseDone=!0,e._withAsyncResult(t)},function(){return e._onError})):this._asyncComputationPromiseDone=!0},e.prototype._triggerSyncComputation=function(){this._computer.computeSync&&this._computer.onResult(this._computer.computeSync(),!0),this._asyncComputationPromiseDone?(this._state=0,this._onComplete(this._computer.getResult())):(this._state=3,this._onProgress(this._computer.getResult()))},e.prototype._showLoadingMessage=function(){3===this._state&&this._onProgress(this._computer.getResultWithLoadingMessage())},e.prototype._withAsyncResult=function(e){e&&this._computer.onResult(e,!1),3===this._state&&(this._state=0,this._onComplete(this._computer.getResult()))},e.prototype._onComplete=function(e){this._completeCallback&&this._completeCallback(e)},e.prototype._onError=function(e){this._errorCallback?this._errorCallback(e):i.onUnexpectedError(e)},e.prototype._onProgress=function(e){this._progressCallback&&this._progressCallback(e)},e.prototype.start=function(){0===this._state&&(this._state=1,this._firstWaitScheduler.schedule(),this._loadingMessageScheduler.schedule())},e.prototype.cancel=function(){this._loadingMessageScheduler.cancel(),1===this._state&&this._firstWaitScheduler.cancel(),2===this._state&&(this._secondWaitScheduler.cancel(),this._asyncComputationPromise&&(this._asyncComputationPromise.cancel(),this._asyncComputationPromise=null)),3===this._state&&this._asyncComputationPromise&&(this._asyncComputationPromise.cancel(),this._asyncComputationPromise=null),this._state=0},e.HOVER_TIME=300,e}();t.HoverOperation=r}),define(d[196],h([1,0,4,12,25,41,63,3]),function(e,t,n,i,o,r,s,a){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var u=function(e){function t(t,n){var i=e.call(this)||this;return i.disposables=[],i.allowEditorOverflow=!0,i._id=t,i._editor=n,i._isVisible=!1,i._containerDomNode=document.createElement("div"),i._containerDomNode.className="monaco-editor-hover hidden",i._containerDomNode.tabIndex=0,i._domNode=document.createElement("div"),i._domNode.className="monaco-editor-hover-content",i.scrollbar=new s.DomScrollableElement(i._domNode,{}),i.disposables.push(i.scrollbar),i._containerDomNode.appendChild(i.scrollbar.getDomNode()),i.onkeydown(i._containerDomNode,function(e){e.equals(9)&&i.hide()}),i._register(i._editor.onDidChangeConfiguration(function(e){e.fontInfo&&i.updateFont()})),i._editor.onDidLayoutChange(function(e){return i.updateMaxHeight()}),i.updateMaxHeight(),i._editor.addContentWidget(i),i._showAtPosition=null,i}return f(t,e),Object.defineProperty(t.prototype,"isVisible",{get:function(){return this._isVisible},set:function(e){this._isVisible=e,n.toggleClass(this._containerDomNode,"hidden",!this._isVisible)},enumerable:!0,configurable:!0}),t.prototype.getId=function(){return this._id},t.prototype.getDomNode=function(){return this._containerDomNode},t.prototype.showAt=function(e,t){this._showAtPosition=new i.Position(e.lineNumber,e.column),this.isVisible=!0,this._editor.layoutContentWidget(this),this._editor.render(),this._stoleFocus=t,t&&this._containerDomNode.focus()},t.prototype.hide=function(){this.isVisible&&(this.isVisible=!1,this._editor.layoutContentWidget(this),this._stoleFocus&&this._editor.focus())},t.prototype.getPosition=function(){return this.isVisible?{position:this._showAtPosition,preference:[o.ContentWidgetPositionPreference.ABOVE,o.ContentWidgetPositionPreference.BELOW]}:null},t.prototype.dispose=function(){this._editor.removeContentWidget(this),this.disposables=a.dispose(this.disposables),e.prototype.dispose.call(this)},t.prototype.updateFont=function(){var e=this,t=Array.prototype.slice.call(this._domNode.getElementsByTagName("code")),n=Array.prototype.slice.call(this._domNode.getElementsByClassName("code"));t.concat(n).forEach(function(t){return e._editor.applyFontInfo(t)})},t.prototype.updateContents=function(e){this._domNode.textContent="",this._domNode.appendChild(e),this.updateFont(),this._editor.layoutContentWidget(this),this.scrollbar.scanDomNode()},t.prototype.updateMaxHeight=function(){var e=Math.max(this._editor.getLayoutInfo().height/4,250),t=this._editor.getConfiguration().fontInfo,n=t.fontSize,i=t.lineHeight;this._domNode.style.fontSize=n+"px",this._domNode.style.lineHeight=i+"px",this._domNode.style.maxHeight=e+"px"},t}(r.Widget);t.ContentHoverWidget=u;var l=function(e){function t(t,n){var i=e.call(this)||this;return i._id=t,i._editor=n,i._isVisible=!1,i._domNode=document.createElement("div"),i._domNode.className="monaco-editor-hover hidden",i._domNode.setAttribute("aria-hidden","true"),i._domNode.setAttribute("role","presentation"),i._showAtLineNumber=-1,i._register(i._editor.onDidChangeConfiguration(function(e){e.fontInfo&&i.updateFont()})),i._editor.addOverlayWidget(i),i}return f(t,e),Object.defineProperty(t.prototype,"isVisible",{get:function(){return this._isVisible},set:function(e){this._isVisible=e,n.toggleClass(this._domNode,"hidden",!this._isVisible)},enumerable:!0,configurable:!0}),t.prototype.getId=function(){return this._id},t.prototype.getDomNode=function(){return this._domNode},t.prototype.showAt=function(e){this._showAtLineNumber=e,this.isVisible||(this.isVisible=!0);var t=this._editor.getLayoutInfo(),n=this._editor.getTopForLineNumber(this._showAtLineNumber),i=this._editor.getScrollTop(),o=this._editor.getConfiguration().lineHeight,r=n-i-(this._domNode.clientHeight-o)/2;this._domNode.style.left=t.glyphMarginLeft+t.glyphMarginWidth+"px",this._domNode.style.top=Math.max(Math.round(r),0)+"px"},t.prototype.hide=function(){this.isVisible&&(this.isVisible=!1)},t.prototype.getPosition=function(){return null},t.prototype.dispose=function(){this._editor.removeOverlayWidget(this),e.prototype.dispose.call(this)},t.prototype.updateFont=function(){var e=this,t=Array.prototype.slice.call(this._domNode.getElementsByTagName("code")),n=Array.prototype.slice.call(this._domNode.getElementsByClassName("code"));t.concat(n).forEach(function(t){return e._editor.applyFontInfo(t)})},t.prototype.updateContents=function(e){this._domNode.textContent="",this._domNode.appendChild(e),this.updateFont()},t}(r.Widget);t.GlyphHoverWidget=l}),define(d[262],h([1,0,22]),function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e,t,n){this._editRange=e,this._originalSelection=t,this._text=n}return e.prototype.getEditOperations=function(e,t){t.addTrackedEditOperation(this._editRange,this._text)},e.prototype.computeCursorState=function(e,t){var i=t.getInverseEditOperations()[0].range;return this._originalSelection.isEmpty()?new n.Selection(i.endLineNumber,Math.min(this._originalSelection.positionColumn,i.endColumn),i.endLineNumber,Math.min(this._originalSelection.positionColumn,i.endColumn)):new n.Selection(i.endLineNumber,i.endColumn-this._text.length,i.endLineNumber,i.endColumn)},e}();t.InPlaceReplaceCommand=i}),define(d[263],h([1,0]),function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getSpaceCnt=function(e,t){for(var n=0,i=0;i1&&(i-=1,r=e.getLineMaxColumn(i)),t.addTrackedEditOperation(new n.Range(i,r,o,s),null)}},e.prototype.computeCursorState=function(e,t){var n=t.getInverseEditOperations()[0].range;return new i.Selection(n.endLineNumber,this.restoreCursorToColumn,n.endLineNumber,this.restoreCursorToColumn)},e}();t.DeleteLinesCommand=o}),define(d[266],h([1,0,59,2]),function(e,t,n,i){"use strict";function o(e,t,n){var i=t.startLineNumber,o=t.endLineNumber;if(1===t.endColumn&&o--,i>=o)return null;for(var r=[],s=i;s<=o;s++)r.push(e.getLineContent(s));var a=r.slice(0);return a.sort(function(e,t){return e.toLowerCase().localeCompare(t.toLowerCase())}),!0===n&&(a=a.reverse()),{startLineNumber:i,endLineNumber:o,before:r,after:a}}function r(e,t,r){var s=o(e,t,r);return s?n.EditOperation.replace(new i.Range(s.startLineNumber,1,s.endLineNumber,e.getLineMaxColumn(s.endLineNumber)),s.after.join("\n")):null}Object.defineProperty(t,"__esModule",{value:!0});var s=function(){function e(e,t){this.selection=e,this.descending=t}return e.prototype.getEditOperations=function(e,t){var n=r(e,this.selection,this.descending);n&&t.addEditOperation(n.range,n.text),this.selectionId=t.trackSelection(this.selection)},e.prototype.computeCursorState=function(e,t){return t.getTrackedSelection(this.selectionId)},e.canRun=function(e,t,n){var i=o(e,t,n);if(!i)return!1;for(var r=0,s=i.before.length;r0?t.show(e):t.hide()},function(e){t.hide()})},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"title",{get:function(){return this._options.glyphMarginHoverMessage},set:function(e){},enumerable:!0,configurable:!0}),e.prototype.show=function(e){this._currentLine=e.range.startLineNumber,this._decorationIds=this._editor.deltaDecorations(this._decorationIds,[{options:this._options,range:_({},e.range,{endLineNumber:e.range.startLineNumber})}])},e.prototype.hide=function(){this._decorationIds=this._editor.deltaDecorations(this._decorationIds,[]),this._futureFixes.cancel(),this._currentLine=void 0},e}();t.LightBulbWidget=a}),define(d[268],h([1,0,18,4,12,53,11]),function(e,t,n,i,o,r,s){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var a=function(){function e(e,t,n){this._onDidExecuteCodeAction=new s.Emitter,this.onDidExecuteCodeAction=this._onDidExecuteCodeAction.event,this._editor=e,this._contextMenuService=t,this._commandService=n}return e.prototype.show=function(e,t){var i=this,s=e.then(function(e){return e.map(function(e){return new r.Action(e.id,e.title,void 0,!0,function(){return n.always((t=i._commandService).executeCommand.apply(t,[e.id].concat(e.arguments)),function(){return i._onDidExecuteCodeAction.fire(void 0)});var t})})});this._contextMenuService.showContextMenu({getAnchor:function(){return o.Position.isIPosition(t)&&(t=i._toCoords(t)),t},getActions:function(){return s},onHide:function(){i._visible=!1}})},Object.defineProperty(e.prototype,"isVisible",{get:function(){return this._visible},enumerable:!0,configurable:!0}),e.prototype._toCoords=function(e){this._editor.revealPosition(e),this._editor.render();var t=this._editor.getScrolledVisiblePosition(this._editor.getPosition()),n=i.getDomNodePagePosition(this._editor.getDomNode());return{x:n.left+t.left,y:n.top+t.top+t.height}},e}();t.QuickFixContextMenu=a}),define(d[269],h([1,0,2,91,98,43]),function(e,t,n,i,o,r){"use strict";function s(e){var t=new u;return t.start=e.range.getStartPosition(),t.end=e.range.getEndPosition(),t}function a(e,t){if(e instanceof l&&e.isEmpty)return null;if(!n.Range.containsPosition(e.range,t))return null;var i;if(e instanceof l){if(e.hasChildren)for(var o=0,r=e.children.length;o0},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"isEmpty",{get:function(){return!this.hasChildren&&!this.parent},enumerable:!0,configurable:!0}),t.prototype.append=function(e){return!!e&&(e.parent=this,this.children||(this.children=[]),e instanceof t?e.children&&this.children.push.apply(this.children,e.children):this.children.push(e),!0)},t}(u);t.NodeList=l;var c=function(e){function t(){var t=e.call(this)||this;return t.elements=new l,t.elements.parent=t,t}return f(t,e),Object.defineProperty(t.prototype,"start",{get:function(){return this.open.start},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"end",{get:function(){return this.close.end},enumerable:!0,configurable:!0}),t}(u);t.Block=c;var d=function(){return function(e,t,n){this.range=e,this.bracket=t,this.bracketType=n}}(),h=function(){return function(e,t,n){this.lineNumber=t,this.lineText=n,this.startOffset=e.startOffset,this.endOffset=e.endOffset,this.type=e.tokenType,this.languageId=e.languageId}}(),p=function(){function e(e){this._model=e,this._lineCount=this._model.getLineCount(),this._versionId=this._model.getVersionId(),this._lineNumber=0,this._lineText=null,this._advance()}return e.prototype._advance=function(){for(this._next=this._next?this._next.next():null;!this._next&&this._lineNumber0)return this._nextBuff.shift();var e=this._rawTokenScanner.next();if(!e)return null;var t=e.lineNumber,s=e.lineText,a=e.type,u=e.startOffset,l=e.endOffset;this._cachedLanguageId!==e.languageId&&(this._cachedLanguageId=e.languageId,this._cachedLanguageBrackets=r.LanguageConfigurationRegistry.getBracketsSupport(this._cachedLanguageId));var c=this._cachedLanguageBrackets;if(!c||i.ignoreBracketsInToken(a))return new d(new n.Range(t,u+1,t,l+1),0,null);var h;do{if(h=o.BracketsUtils.findNextBracketInToken(c.forwardRegex,t,s,u,l)){var p=h.startColumn-1,f=h.endColumn-1;u0;){var i=n.shift();if(!t(i))break;n.unshift.apply(n,i.children)}}Object.defineProperty(t,"__esModule",{value:!0});var i;!function(e){e[e.Dollar=0]="Dollar",e[e.Colon=1]="Colon",e[e.Comma=2]="Comma",e[e.CurlyOpen=3]="CurlyOpen",e[e.CurlyClose=4]="CurlyClose",e[e.Backslash=5]="Backslash",e[e.Forwardslash=6]="Forwardslash",e[e.Pipe=7]="Pipe",e[e.Int=8]="Int",e[e.VariableName=9]="VariableName",e[e.Format=10]="Format",e[e.EOF=11]="EOF"}(i=t.TokenType||(t.TokenType={}));var o=function(){function e(){this.text("")}return e.isDigitCharacter=function(e){return e>=48&&e<=57},e.isVariableCharacter=function(e){return 95===e||e>=97&&e<=122||e>=65&&e<=90},e.prototype.text=function(e){this.value=e,this.pos=0},e.prototype.tokenText=function(e){return this.value.substr(e.pos,e.len)},e.prototype.next=function(){if(this.pos>=this.value.length)return{type:i.EOF,pos:this.pos,len:0};var t,n=this.pos,o=0,r=this.value.charCodeAt(n);if("number"==typeof(t=e._table[r]))return this.pos+=1,{type:t,pos:n,len:1};if(e.isDigitCharacter(r)){t=i.Int;do{o+=1,r=this.value.charCodeAt(n+o)}while(e.isDigitCharacter(r));return this.pos+=o,{type:t,pos:n,len:o}}if(e.isVariableCharacter(r)){t=i.VariableName;do{r=this.value.charCodeAt(n+ ++o)}while(e.isVariableCharacter(r)||e.isDigitCharacter(r));return this.pos+=o,{type:t,pos:n,len:o}}t=i.Format;do{o+=1,r=this.value.charCodeAt(n+o)}while(!isNaN(r)&&void 0===e._table[r]&&!e.isDigitCharacter(r)&&!e.isVariableCharacter(r));return this.pos+=o,{type:t,pos:n,len:o}},e._table=(h={},h[36]=i.Dollar,h[58]=i.Colon,h[44]=i.Comma,h[123]=i.CurlyOpen,h[125]=i.CurlyClose,h[92]=i.Backslash,h[47]=i.Forwardslash,h[124]=i.Pipe,h),e}();t.Scanner=o;var r=function(){function e(){this._children=[]}return e.prototype.appendChild=function(e){return e instanceof s&&this._children[this._children.length-1]instanceof s?this._children[this._children.length-1].value+=e.value:(e.parent=this,this._children.push(e)),this},e.prototype.replace=function(e,t){var n=e.parent,i=n.children.indexOf(e),o=n.children.slice(0);o.splice.apply(o,[i,1].concat(t)),n._children=o,t.forEach(function(e){return e.parent=n})},Object.defineProperty(e.prototype,"children",{get:function(){return this._children},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"snippet",{get:function(){for(var e=this;;){if(!e)return;if(e instanceof c)return e;e=e.parent}},enumerable:!0,configurable:!0}),e.prototype.toString=function(){return this.children.reduce(function(e,t){return e+t.toString()},"")},e.prototype.len=function(){return 0},e}();t.Marker=r;var s=function(e){function t(t){var n=e.call(this)||this;return n.value=t,n}return f(t,e),t.prototype.toString=function(){return this.value},t.prototype.toTextmateString=function(){return this.value.replace(/\$|}|\\/g,"\\$&")},t.prototype.len=function(){return this.value.length},t.prototype.clone=function(){return new t(this.value)},t}(r);t.Text=s;var a=function(e){function t(t){var n=e.call(this)||this;return n.index=t,n}return f(t,e),t.compareByIndex=function(e,t){return e.index===t.index?0:e.isFinalTabstop?1:t.isFinalTabstop?-1:e.indext.index?1:0},Object.defineProperty(t.prototype,"isFinalTabstop",{get:function(){return 0===this.index},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"choice",{get:function(){return 1===this._children.length&&this._children[0]instanceof u?this._children[0]:void 0},enumerable:!0,configurable:!0}),t.prototype.toTextmateString=function(){return 0===this.children.length?"$"+this.index:this.choice?"${"+this.index+"|"+this.choice.toTextmateString()+"|}":"${"+this.index+":"+this.children.map(function(e){return e.toTextmateString()}).join("")+"}"},t.prototype.clone=function(){var e=new t(this.index);return e._children=this.children.map(function(e){return e.clone()}),e},t}(r);t.Placeholder=a;var u=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.options=[],t}return f(t,e),t.prototype.appendChild=function(e){return e instanceof s&&(e.parent=this,this.options.push(e)),this},t.prototype.toString=function(){return this.options[0].value},t.prototype.toTextmateString=function(){return this.options.map(function(e){return e.value.replace(/\||,/g,"\\$&")}).join(",")},t.prototype.len=function(){return this.options[0].len()},t.prototype.clone=function(){var e=new t;return this.options.forEach(e.appendChild,e),e},t}(r);t.Choice=u;var l=function(e){function t(t){var n=e.call(this)||this;return n.name=t,n}return f(t,e),t.prototype.resolve=function(e){var t=e.resolve(this);return void 0!==t&&(this._children=[new s(t)],!0)},t.prototype.toTextmateString=function(){return 0===this.children.length?"${"+this.name+"}":"${"+this.name+":"+this.children.map(function(e){return e.toTextmateString()}).join("")+"}"},t.prototype.clone=function(){var e=new t(this.name);return e._children=this.children.map(function(e){return e.clone()}),e},t}(r);t.Variable=l;var c=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return f(t,e),Object.defineProperty(t.prototype,"placeholders",{get:function(){var e=this;return this._placeholders||(this._placeholders=[],this.walk(function(t){return t instanceof a&&e.placeholders.push(t),!0})),this._placeholders},enumerable:!0,configurable:!0}),t.prototype.offset=function(e){var t=0,n=!1;return this.walk(function(i){return i===e?(n=!0,!1):(t+=i.len(),!0)}),n?t:-1},t.prototype.fullLen=function(e){var t=0;return n([e],function(e){return t+=e.len(),!0}),t},t.prototype.enclosingPlaceholders=function(e){for(var t=[],n=e.parent;n;)n instanceof a&&t.push(n),n=n.parent;return t},t.prototype.resolveVariables=function(e){var t=this;return this.walk(function(n){return n instanceof l&&n.resolve(e)&&(t._placeholders=void 0),!0}),this},t.prototype.appendChild=function(t){return this._placeholders=void 0,e.prototype.appendChild.call(this,t)},t.prototype.replace=function(t,n){return this._placeholders=void 0,e.prototype.replace.call(this,t,n)},t.prototype.toTextmateString=function(){return this.children.reduce(function(e,t){return e+t.toTextmateString()},"")},t.prototype.clone=function(){var e=new t;return this._children=this.children.map(function(e){return e.clone()}),e},t.prototype.walk=function(e){n(this.children,e)},t}(r);t.TextmateSnippet=c;var d=function(){function e(){this._scanner=new o}return e.escape=function(e){return e.replace(/\$|}|\\/g,"\\$&")},e.prototype.text=function(e){return this.parse(e).toString()},e.prototype.parse=function(e,t,n){this._scanner.text(e),this._token=this._scanner.next();for(var i=new c;this._parse(i););var o=new Map,r=[];i.walk(function(e){return e instanceof a&&(e.isFinalTabstop?o.set(0):!o.has(e.index)&&e.children.length>0?o.set(e.index,e.children):r.push(e)),!0});for(var s=0,u=r;s0||n)&&i.appendChild(new a(0)),i},e.prototype._accept=function(e,t){if(void 0===e||this._token.type===e){var n=!t||this._scanner.tokenText(this._token);return this._token=this._scanner.next(),n}return!1},e.prototype._backTo=function(e){return this._scanner.pos=e.pos+e.len,this._token=e,!1},e.prototype._parse=function(e){return this._parseEscaped(e)||this._parseTabstopOrVariableName(e)||this._parseComplexPlaceholder(e)||this._parseComplexVariable(e)||this._parseAnything(e)},e.prototype._parseEscaped=function(e){var t;return!!(t=this._accept(i.Backslash,!0))&&(t=this._accept(i.Dollar,!0)||this._accept(i.CurlyClose,!0)||this._accept(i.Backslash,!0)||t,e.appendChild(new s(t)),!0)},e.prototype._parseTabstopOrVariableName=function(e){var t,n=this._token;return this._accept(i.Dollar)&&(t=this._accept(i.VariableName,!0)||this._accept(i.Int,!0))?(e.appendChild(/^\d+$/.test(t)?new a(Number(t)):new l(t)),!0):this._backTo(n)},e.prototype._parseComplexPlaceholder=function(e){var t,n=this._token;if(!(this._accept(i.Dollar)&&this._accept(i.CurlyOpen)&&(t=this._accept(i.Int,!0))))return this._backTo(n);var o=new a(Number(t));if(this._accept(i.Colon))for(;;){if(this._accept(i.CurlyClose))return e.appendChild(o),!0;if(!this._parse(o))return e.appendChild(new s("${"+t+":")),o.children.forEach(e.appendChild,e),!0}else{if(!this._accept(i.Pipe))return this._accept(i.CurlyClose)?(e.appendChild(o),!0):this._backTo(n);for(var r=new u;;){if(this._parseChoiceElement(r)){if(this._accept(i.Comma))continue;if(this._accept(i.Pipe)&&this._accept(i.CurlyClose))return o.appendChild(r),e.appendChild(o),!0}return this._backTo(n),!1}}},e.prototype._parseChoiceElement=function(e){for(var t=this._token,n=[];;){if(this._token.type===i.Comma||this._token.type===i.Pipe)break;var o=void 0;if(!(o=(o=this._accept(i.Backslash,!0))?this._accept(i.Comma,!0)||this._accept(i.Pipe,!0)||o:this._accept(void 0,!0)))return this._backTo(t),!1;n.push(o)}return 0===n.length?(this._backTo(t),!1):(e.appendChild(new s(n.join(""))),!0)},e.prototype._parseComplexVariable=function(e){var t,n=this._token;if(!(this._accept(i.Dollar)&&this._accept(i.CurlyOpen)&&(t=this._accept(i.VariableName,!0))))return this._backTo(n);var o=new l(t);if(!this._accept(i.Colon))return this._accept(i.CurlyClose)?(e.appendChild(o),!0):this._backTo(n);for(;;){if(this._accept(i.CurlyClose))return e.appendChild(o),!0;if(!this._parse(o))return e.appendChild(new s("${"+t+":")),o.children.forEach(e.appendChild,e),!0}},e.prototype._parseAnything=function(e){return this._token.type!==i.EOF&&(e.appendChild(new s(this._scanner.tokenText(this._token))),this._accept(void 0),!0)},e}();t.SnippetParser=d;var h}),define(d[271],h([1,0,45,142,9]),function(e,t,n,i,o){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e,t){this._model=e,this._selection=t}return e.prototype.resolve=function(e){var t=e.name;if("SELECTION"===t||"TM_SELECTED_TEXT"===t){var r=this._model.getValueInRange(this._selection)||void 0;if(r&&this._selection.startLineNumber!==this._selection.endLineNumber){var s=this._model.getLineContent(this._selection.startLineNumber),a=o.getLeadingWhitespace(s,0,this._selection.startColumn-1),u=a;e.snippet.walk(function(t){return t!==e&&(t instanceof i.Text&&(u=o.getLeadingWhitespace(t.value.split(/\r\n|\r|\n/).pop())),!0)});var l=o.commonPrefixLength(u,a);r=r.replace(/(\r\n|\r|\n)(.*)/g,function(e,t,n){return""+t+u.substr(l)+n})}return r}if("TM_CURRENT_LINE"===t)return this._model.getLineContent(this._selection.positionLineNumber);if("TM_CURRENT_WORD"===t){var c=this._model.getWordAtPosition({lineNumber:this._selection.positionLineNumber,column:this._selection.positionColumn});return c&&c.word||void 0}if("TM_LINE_INDEX"===t)return String(this._selection.positionLineNumber-1);if("TM_LINE_NUMBER"===t)return String(this._selection.positionLineNumber);if("TM_FILENAME"===t)return n.basename(this._model.uri.fsPath);if("TM_DIRECTORY"===t){var d=n.dirname(this._model.uri.fsPath);return"."!==d?d:""}return"TM_FILEPATH"===t?this._model.uri.fsPath:void 0},e.VariableNames=Object.freeze({SELECTION:!0,TM_SELECTED_TEXT:!0,TM_CURRENT_LINE:!0,TM_CURRENT_WORD:!0,TM_LINE_INDEX:!0,TM_LINE_NUMBER:!0,TM_FILENAME:!0,TM_DIRECTORY:!0,TM_FILEPATH:!0}),e}();t.EditorSnippetVariableResolver=r}),define(d[272],h([1,0,81]),function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var i=function(){return function(){}}();t.LineContext=i;var o=function(){function e(t,n,i,o){this._snippetCompareFn=e._compareCompletionItems,this._items=t,this._column=n,this._lineContext=i,"top"===o?this._snippetCompareFn=e._compareCompletionItemsSnippetsUp:"bottom"===o&&(this._snippetCompareFn=e._compareCompletionItemsSnippetsDown)}return Object.defineProperty(e.prototype,"lineContext",{get:function(){return this._lineContext},set:function(e){this._lineContext.leadingLineContent===e.leadingLineContent&&this._lineContext.characterCountDelta===e.characterCountDelta||(this._lineContext=e,this._filteredItems=void 0)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"items",{get:function(){return this._ensureCachedState(),this._filteredItems},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"incomplete",{get:function(){return this._ensureCachedState(),this._isIncomplete},enumerable:!0,configurable:!0}),e.prototype.resolveIncompleteInfo=function(){for(var e=[],t=[],n=0,i=this._items;nt.score?-1:e.scoret.idx?1:0},e._compareCompletionItemsSnippetsDown=function(t,n){if(t.suggestion.type!==n.suggestion.type){if("snippet"===t.suggestion.type)return 1;if("snippet"===n.suggestion.type)return-1}return e._compareCompletionItems(t,n)},e._compareCompletionItemsSnippetsUp=function(t,n){if(t.suggestion.type!==n.suggestion.type){if("snippet"===t.suggestion.type)return-1;if("snippet"===n.suggestion.type)return 1}return e._compareCompletionItems(t,n)},e}();t.CompletionModel=o}),define(d[273],h([1,0,7,17,106,90,130,9]),function(e,t,n,i,o,r,s,a){"use strict";function u(e,t,n){return c(e,t,n)}function l(e,t){for(var n=[],i=0,s=e.length;i")}return n.join("")}function c(e,t,n){for(var i=[],r=n.getInitialState(),a=0,u=e.length;a"),r=c.endState}return i.join("")}Object.defineProperty(t,"__esModule",{value:!0});var d=function(){function e(){}return e.colorizeElement=function(e,t,n,i){var o=(i=i||{}).theme||"vs",r=i.mimeType||n.getAttribute("lang")||n.getAttribute("data-lang");if(r){e.setTheme(o);var s=n.firstChild.nodeValue;n.className+="monaco-editor "+o;var a=function(e){n.innerHTML=e};return this.colorize(t,s,r,i).then(a,function(e){return console.error(e)},a)}console.error("Mode not detected")},e._tokenizationSupportChangedPromise=function(e){var t=null,o=function(){t&&(t.dispose(),t=null)};return new n.TPromise(function(n,r,s){t=i.TokenizationRegistry.onDidChange(function(t){t.changedLanguages.indexOf(e)>=0&&(o(),n(void 0))})},o)},e.colorize=function(e,t,o,r){a.startsWithUTF8BOM(t)&&(t=t.substr(1));var s=t.split(/\r\n|\r|\n/),c=e.getModeId(o);void 0===(r=r||{}).tabSize&&(r.tabSize=4),e.getOrCreateMode(c);var d=i.TokenizationRegistry.get(c);return d?n.TPromise.as(u(s,r.tabSize,d)):n.TPromise.any([this._tokenizationSupportChangedPromise(c),n.TPromise.timeout(500)]).then(function(e){var t=i.TokenizationRegistry.get(c);return t?u(s,r.tabSize,t):l(s,r.tabSize)})},e.colorizeLine=function(e,t,n,i){return void 0===i&&(i=4),o.renderViewLine(new o.RenderLineInput(!1,e,t,0,n,[],i,0,-1,"none",!1,!1)).html},e.colorizeModelLine=function(e,t,n){void 0===n&&(n=4);var i=e.getLineContent(t);e.forceTokenization(t);var o=e.getLineTokens(t).inflate();return this.colorizeLine(i,e.mightContainRTL(),o,n)},e}();t.Colorizer=d}),define(d[145],h([1,0]),function(e,t){"use strict";function n(e){return Array.isArray(e)}function i(e){return"string"==typeof e}function o(e){return!e}function r(e,t){return e.ignoreCase&&t?t.toLowerCase():t}Object.defineProperty(t,"__esModule",{value:!0});!function(e){e[e.None=0]="None",e[e.Open=1]="Open",e[e.Close=-1]="Close"}(t.MonarchBracket||(t.MonarchBracket={})),t.isFuzzyActionArr=n,t.isFuzzyAction=function(e){return!n(e)},t.isString=i,t.isIAction=function(e){return!i(e)},t.empty=o,t.fixCase=r,t.sanitize=function(e){return e.replace(/[&<>'"_]/g,"-")},t.log=function(e,t){console.log(e.languageId+": "+t)},t.throwError=function(e,t){throw new Error(e.languageId+": "+t)},t.substituteMatches=function(e,t,n,i,s){var a=/\$((\$)|(#)|(\d\d?)|[sS](\d\d?)|@(\w+))/g,u=null;return t.replace(a,function(t,a,l,c,d,h,p,f,g){return o(l)?o(c)?!o(d)&&d0;){var n=e.tokenizer[t];if(n)return n;var i=t.lastIndexOf(".");t=i<0?null:t.substr(0,i)}return null},t.stateExists=function(e,t){for(;t&&t.length>0;){if(e.stateNames[t])return!0;var n=t.lastIndexOf(".");t=n<0?null:t.substr(0,n)}return!1}}),define(d[275],h([1,0,26,145]),function(e,t,n,i){"use strict";function o(e,t){if(!t)return!1;if(!Array.isArray(t))return!1;var n;for(n in t)if(t.hasOwnProperty(n)&&!e(t[n]))return!1;return!0}function r(e,t,n){return"boolean"==typeof e?e:(n&&(e||void 0===t)&&n(),void 0===t?null:t)}function s(e,t,n){return"string"==typeof e?e:(n&&(e||void 0===t)&&n(),void 0===t?null:t)}function a(e,t){if("string"!=typeof t)return null;for(var n=0;t.indexOf("@")>=0&&n<5;)n++,t=t.replace(/@(\w+)/g,function(n,o){var r="";return"string"==typeof e[o]?r=e[o]:e[o]&&e[o]instanceof RegExp?r=e[o].source:void 0===e[o]?i.throwError(e,"language definition does not contain attribute '"+o+"', used at: "+t):i.throwError(e,"attribute reference '"+o+"' must be a string, used at: "+t),i.empty(r)?"":"(?:"+r+")"});return new RegExp(t,e.ignoreCase?"i":"")}function u(e,t,n,i){if(i<0)return e;if(i=100){i-=100;var o=n.split(".");if(o.unshift(n),i=0&&(o.tokenSubst=!0),"string"==typeof n.bracket&&("@open"===n.bracket?o.bracket=1:"@close"===n.bracket?o.bracket=-1:i.throwError(e,"a 'bracket' attribute must be either '@open' or '@close', in rule: "+t)),n.next)if("string"!=typeof n.next)i.throwError(e,"the next state must be a string value in rule: "+t);else{var r=n.next;/^(@pop|@push|@popall)$/.test(r)||("@"===r[0]&&(r=r.substr(1)),r.indexOf("$")<0&&(i.stateExists(e,i.substituteMatches(e,r,"",[],""))||i.throwError(e,"the next state '"+n.next+"' is not defined in rule: "+t))),o.next=r}return"number"==typeof n.goBack&&(o.goBack=n.goBack),"string"==typeof n.switchTo&&(o.switchTo=n.switchTo),"string"==typeof n.log&&(o.log=n.log),"string"==typeof n.nextEmbedded&&(o.nextEmbedded=n.nextEmbedded,e.usesEmbedded=!0),o}if(Array.isArray(n)){var s,a=[];for(s in n)n.hasOwnProperty(s)&&(a[s]=c(e,t,n[s]));return{group:a}}if(n.cases){var u,d=[];for(u in n.cases)if(n.cases.hasOwnProperty(u)){var h=c(e,t,n.cases[u]);"@default"===u||"@"===u||""===u?d.push({test:null,value:h,name:u}):"@eos"===u?d.push({test:function(e,t,n,i){return i},value:h,name:u}):d.push(l(e,t,u,h))}var p=e.defaultToken;return{test:function(e,t,n,i){var o;for(o in d)if(d.hasOwnProperty(o)&&(!d[o].test||d[o].test(e,t,n,i)))return d[o].value;return p}}}return i.throwError(e,"an action must be a string, an object with a 'token' or 'cases' attribute, or an array of actions; in rule: "+t),""}return{token:""}}Object.defineProperty(t,"__esModule",{value:!0});var d=function(){function e(e){this.regex=new RegExp(""),this.action={token:""},this.matchOnlyAtLineStart=!1,this.name="",this.name=e}return e.prototype.setRegex=function(e,t){var n;"string"==typeof t?n=t:t instanceof RegExp?n=t.source:i.throwError(e,"rules must start with a match string or regular expression: "+this.name),this.matchOnlyAtLineStart=n.length>0&&"^"===n[0],this.name=this.name+": "+n,this.regex=a(e,"^(?:"+(this.matchOnlyAtLineStart?n.substr(1):n)+")")},e.prototype.setAction=function(e,t){this.action=c(e,this.name,t)},e}();t.compile=function(e,t){function n(e,u,l){var c;for(c in l)if(l.hasOwnProperty(c)){var h=l[c],p=h.include;if(p)"string"!=typeof p&&i.throwError(o,"an 'include' attribute must be a string at: "+e),"@"===p[0]&&(p=p.substr(1)),t.tokenizer[p]||i.throwError(o,"include target '"+p+"' is not defined at: "+e),n(e+"."+p,u,t.tokenizer[p]);else{var f=new d(e);if(Array.isArray(h)&&h.length>=1&&h.length<=3)if(f.setRegex(a,h[0]),h.length>=3)if("string"==typeof h[1])f.setAction(a,{token:h[1],next:h[2]});else if("object"==typeof h[1]){var g=h[1];g.next=h[2],f.setAction(a,g)}else i.throwError(o,"a next state as the last element of a rule can only be given if the action is either an object or a string, at: "+e);else f.setAction(a,h[1]);else h.regex||i.throwError(o,"a rule must either be an array, or an object with a 'regex' or 'include' field at: "+e),h.name&&(f.name=s(h.name)),h.matchOnlyAtStart&&(f.matchOnlyAtLineStart=r(h.matchOnlyAtLineStart)),f.setRegex(a,h.regex),f.setAction(a,h.action);u.push(f)}}}if(!t||"object"!=typeof t)throw new Error("Monarch: expecting a language definition object");var o={};o.languageId=e,o.noThrow=!1,o.maxStack=100,o.start=s(t.start),o.ignoreCase=r(t.ignoreCase,!1),o.tokenPostfix=s(t.tokenPostfix,"."+o.languageId),o.defaultToken=s(t.defaultToken,"source",function(){i.throwError(o,"the 'defaultToken' must be a string")}),o.usesEmbedded=!1;var a=t;a.languageId=e,a.ignoreCase=o.ignoreCase,a.noThrow=o.noThrow,a.usesEmbedded=o.usesEmbedded,a.stateNames=t.tokenizer,a.defaultToken=o.defaultToken,t.tokenizer&&"object"==typeof t.tokenizer||i.throwError(o,"a language definition must define the 'tokenizer' attribute as an object"),o.tokenizer=[];var u;for(u in t.tokenizer)if(t.tokenizer.hasOwnProperty(u)){o.start||(o.start=u);var l=t.tokenizer[u];o.tokenizer[u]=new Array,n("tokenizer."+u,o.tokenizer[u],l)}o.usesEmbedded=a.usesEmbedded,t.brackets?Array.isArray(t.brackets)||i.throwError(o,"the 'brackets' attribute must be defined as an array"):t.brackets=[{open:"{",close:"}",token:"delimiter.curly"},{open:"[",close:"]",token:"delimiter.square"},{open:"(",close:")",token:"delimiter.parenthesis"},{open:"<",close:">",token:"delimiter.angle"}];var c=[];for(var h in t.brackets)if(t.brackets.hasOwnProperty(h)){var p=t.brackets[h];p&&Array.isArray(p)&&3===p.length&&(p={token:p[2],open:p[0],close:p[1]}),p.open===p.close&&i.throwError(o,"open and close brackets in a 'brackets' attribute must be different: "+p.open+"\n hint: use the 'bracket' attribute if matching on equal brackets is required."),"string"==typeof p.open&&"string"==typeof p.token?c.push({token:s(p.token)+o.tokenPostfix,open:i.fixCase(o,s(p.open)),close:i.fixCase(o,s(p.close))}):i.throwError(o,"every element in the 'brackets' array must be a '{open,close,token}' object or array")}return o.brackets=c,o.noThrow=!0,o}}),define(d[276],h([1,0,17,145,97,68]),function(e,t,n,i,o,r){"use strict";function s(e,t){if(!t)return null;t=i.fixCase(e,t);for(var n=e.brackets,o=0;o=this._maxCacheDepth)return new u(e,t);var n=u.getStackElementId(e);n.length>0&&(n+="|"),n+=t;var i=this._entries[n];return i||(i=new u(e,t),this._entries[n]=i,i)},e._INSTANCE=new e(5),e}(),u=function(){function e(e,t){this.parent=e,this.state=t,this.depth=(this.parent?this.parent.depth:0)+1}return e.getStackElementId=function(e){for(var t="";null!==e;)t.length>0&&(t+="|"),t+=e.state,e=e.parent;return t},e._equals=function(e,t){for(;null!==e&&null!==t;){if(e===t)return!0;if(e.state!==t.state)return!1;e=e.parent,t=t.parent}return null===e&&null===t},e.prototype.equals=function(t){return e._equals(this,t)},e.prototype.push=function(e){return a.create(this,e)},e.prototype.pop=function(){return this.parent},e.prototype.popall=function(){for(var e=this;e.parent;)e=e.parent;return e},e.prototype.switchTo=function(e){return a.create(this.parent,e)},e}(),l=function(){function e(e,t){this.modeId=e,this.state=t}return e.prototype.equals=function(e){return this.modeId===e.modeId&&this.state.equals(e.state)},e.prototype.clone=function(){return this.state.clone()===this.state?this:new e(this.modeId,this.state)},e}(),c=function(){function e(e){this._maxCacheDepth=e,this._entries=Object.create(null)}return e.create=function(e,t){return this._INSTANCE.create(e,t)},e.prototype.create=function(e,t){if(null!==t)return new d(e,t);if(null!==e&&e.depth>=this._maxCacheDepth)return new d(e,t);var n=u.getStackElementId(e),i=this._entries[n];return i||(i=new d(e,null),this._entries[n]=i,i)},e._INSTANCE=new e(5),e}(),d=function(){function e(e,t){this.stack=e,this.embeddedModeData=t}return e.prototype.clone=function(){return(this.embeddedModeData?this.embeddedModeData.clone():null)===this.embeddedModeData?this:c.create(this.stack,this.embeddedModeData)},e.prototype.equals=function(t){return t instanceof e&&(!!this.stack.equals(t.stack)&&(null===this.embeddedModeData&&null===t.embeddedModeData||null!==this.embeddedModeData&&null!==t.embeddedModeData&&this.embeddedModeData.equals(t.embeddedModeData)))},e}(),h=Object.hasOwnProperty,p=function(){function e(){this._tokens=[],this._language=null,this._lastTokenType=null,this._lastTokenLanguage=null}return e.prototype.enterMode=function(e,t){this._language=t},e.prototype.emit=function(e,t){this._lastTokenType===t&&this._lastTokenLanguage===this._language||(this._lastTokenType=t,this._lastTokenLanguage=this._language,this._tokens.push(new o.Token(e,t,this._language)))},e.prototype.nestedModeTokenize=function(e,t,i){var o=t.modeId,r=t.state,s=n.TokenizationRegistry.get(o);if(!s)return this.enterMode(i,o),this.emit(i,""),r;var a=s.tokenize(e,r,i);return this._tokens=this._tokens.concat(a.tokens),this._lastTokenType=null,this._lastTokenLanguage=null,this._language=null,a.endState},e.prototype.finalize=function(e){return new o.TokenizationResult(this._tokens,e)},e}(),f=function(){function e(e,t){this._modeService=e,this._theme=t,this._prependTokens=null,this._tokens=[],this._currentLanguageId=0,this._lastTokenMetadata=0}return e.prototype.enterMode=function(e,t){this._currentLanguageId=this._modeService.getLanguageIdentifier(t).id},e.prototype.emit=function(e,t){var n=this._theme.match(this._currentLanguageId,t);this._lastTokenMetadata!==n&&(this._lastTokenMetadata=n,this._tokens.push(e),this._tokens.push(n))},e._merge=function(e,t,n){var i=null!==e?e.length:0,o=t.length,r=null!==n?n.length:0;if(0===i&&0===o&&0===r)return new Uint32Array(0);if(0===i&&0===o)return n;if(0===o&&0===r)return e;var s=new Uint32Array(i+o+r);null!==e&&s.set(e);for(var a=0;a0&&i.nestedModeTokenize(s,t.embeddedModeData,n);var a=e.substring(o);return this._myTokenize(a,t,n+o,i)},e.prototype._myTokenize=function(e,t,n,o){o.enterMode(n,this._modeId);for(var r=e.length,a=t.embeddedModeData,u=t.stack,l=0,d=null,p=null,f=null,g=null;l=r)break;var L=this._lexer.tokenizer[y];L||(L=i.findRules(this._lexer,y))||i.throwError(this._lexer,"tokenizer state is not defined: "+y);W=e.substr(l);for(var x in L)if(h.call(L,x)){var N=L[x];if((0===l||!N.matchOnlyAtLineStart)&&(C=W.match(N.regex))){b=C[0],w=N.action;break}}}for(C||(C=[""],b=""),w||(l=this._lexer.maxStack?i.throwError(this._lexer,"maximum tokenizer stack size reached: ["+u.state+","+u.parent.state+",...]"):u=u.push(y);else if("@pop"===w.next)u.depth<=1?i.throwError(this._lexer,"trying to pop an empty stack in rule: "+S.name):u=u.pop();else if("@popall"===w.next)u=u.popall();else{var T=i.substituteMatches(this._lexer,w.next,b,C,y);"@"===T[0]&&(T=T.substr(1)),i.findRules(this._lexer,T)?u=u.push(T):i.throwError(this._lexer,"trying to set a next state '"+T+"' that is undefined in rule: "+S.name)}w.log&&"string"==typeof w.log&&i.log(this._lexer,this._lexer.languageId+": "+i.substituteMatches(this._lexer,w.log,b,C,y))}if(null===M&&i.throwError(this._lexer,"lexer rule has no well-defined action in rule: "+S.name),Array.isArray(M)){d&&d.length>0&&i.throwError(this._lexer,"groups cannot be nested: "+S.name),C.length!==M.length+1&&i.throwError(this._lexer,"matched number of groups does not match the number of actions in rule: "+S.name);for(var k=0,I=1;I=n.actionsList.children.length?n.actionsList.appendChild(i):n.actionsList.insertBefore(i,n.actionsList.children[r++]),n.items.push(s)})},t.prototype.pull=function(e){e>=0&&e=0){var n=void 0;e.equals(17)?n=(t+1)%s.length:e.equals(15)&&(n=0===t?s.length-1:t-1),e.equals(9)?s[t].blur():n>=0&&s[n].focus(),i.EventHelper.stop(e,!0)}}}),this.setInputWidth();var u=document.createElement("div");u.className="controls",u.appendChild(this.caseSensitive.domNode),u.appendChild(this.wholeWords.domNode),u.appendChild(this.regex.domNode),this.domNode.appendChild(u)},t.prototype.validate=function(){this.inputBox.validate()},t.prototype.showMessage=function(e){this.inputBox.showMessage(e)},t.prototype.clearMessage=function(){this.inputBox.hideMessage()},t.prototype.clearValidation=function(){this.inputBox.hideMessage()},t.prototype.dispose=function(){e.prototype.dispose.call(this)},t.OPTION_CHANGE="optionChange",t}(r.Widget);t.FindInput=l}),define(d[290],h([6,8]),function(e,t){return e.create("vs/base/common/keybindingLabels",t)}),define(d[155],h([1,0,290]),function(e,t,n){"use strict";function i(e,t,n){if(null===t)return"";var i=[];return e.ctrlKey&&i.push(n.ctrlKey),e.shiftKey&&i.push(n.shiftKey),e.altKey&&i.push(n.altKey),e.metaKey&&i.push(n.metaKey),i.push(t),i.join(n.separator)}function o(e,t,n,o,r){var s=i(e,t,r);return null!==o&&(s+=" ",s+=i(n,o,r)),s}Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e,t,n){void 0===n&&(n=t),this.modifierLabels=[null],this.modifierLabels[2]=e,this.modifierLabels[1]=t,this.modifierLabels[3]=n}return e.prototype.toLabel=function(e,t,n,i,r){return null===t&&null===i?null:o(e,t,n,i,this.modifierLabels[r])},e}();t.ModifierLabelProvider=r,t.UILabelProvider=new r({ctrlKey:"⌃",shiftKey:"⇧",altKey:"⌥",metaKey:"⌘",separator:""},{ctrlKey:n.localize(0,null),shiftKey:n.localize(1,null),altKey:n.localize(2,null),metaKey:n.localize(3,null),separator:"+"}),t.AriaLabelProvider=new r({ctrlKey:n.localize(4,null),shiftKey:n.localize(5,null),altKey:n.localize(6,null),metaKey:n.localize(7,null),separator:"+"},{ctrlKey:n.localize(8,null),shiftKey:n.localize(9,null),altKey:n.localize(10,null),metaKey:n.localize(11,null),separator:"+"}),t.ElectronAcceleratorLabelProvider=new r({ctrlKey:"Ctrl",shiftKey:"Shift",altKey:"Alt",metaKey:"Cmd",separator:"+"},{ctrlKey:"Ctrl",shiftKey:"Shift",altKey:"Alt",metaKey:"Super",separator:"+"}),t.UserSettingsLabelProvider=new r({ctrlKey:"ctrl",shiftKey:"shift",altKey:"alt",metaKey:"cmd",separator:"+"},{ctrlKey:"ctrl",shiftKey:"shift",altKey:"alt",metaKey:"win",separator:"+"},{ctrlKey:"ctrl",shiftKey:"shift",altKey:"alt",metaKey:"meta",separator:"+"})}),define(d[292],h([1,0,26,155,4,212]),function(e,t,n,i,o){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=o.$,s=function(){function e(e,t){this.os=t,this.domNode=o.append(e,r(".monaco-keybinding")),this.didEverRender=!1,e.appendChild(this.domNode)}return Object.defineProperty(e.prototype,"element",{get:function(){return this.domNode},enumerable:!0,configurable:!0}),e.prototype.set=function(t,n){this.didEverRender&&this.keybinding===t&&e.areSame(this.matches,n)||(this.keybinding=t,this.matches=n,this.render())},e.prototype.render=function(){if(o.clearNode(this.domNode),this.keybinding){var e=this.keybinding.getParts(),t=e[0],n=e[1];t&&this.renderPart(this.domNode,t,this.matches?this.matches.firstPart:null),n&&(o.append(this.domNode,r("span.monaco-keybinding-key-chord-separator",null," ")),this.renderPart(this.domNode,n,this.matches?this.matches.chordPart:null)),this.domNode.title=this.keybinding.getAriaLabel()}this.didEverRender=!0},e.prototype.renderPart=function(e,t,n){var o=i.UILabelProvider.modifierLabels[this.os];t.ctrlKey&&this.renderKey(e,o.ctrlKey,n&&n.ctrlKey,o.separator),t.shiftKey&&this.renderKey(e,o.shiftKey,n&&n.shiftKey,o.separator),t.altKey&&this.renderKey(e,o.altKey,n&&n.altKey,o.separator),t.metaKey&&this.renderKey(e,o.metaKey,n&&n.metaKey,o.separator);var r=t.keyLabel;r&&this.renderKey(e,r,n&&n.keyCode,"")},e.prototype.renderKey=function(e,t,n,i){o.append(e,r("span.monaco-keybinding-key"+(n?".highlight":""),null,t)),i&&o.append(e,r("span.monaco-keybinding-key-separator",null,i))},e.prototype.dispose=function(){this.keybinding=null},e.areSame=function(e,t){return e===t||!e&&!t||!!e&&!!t&&n.equals(e.firstPart,t.firstPart)&&n.equals(e.chordPart,t.chordPart)},e}();t.KeybindingLabel=s}),define(d[293],h([6,8]),function(e,t){return e.create("vs/base/common/severity",t)}),define(d[36],h([1,0,293,9]),function(e,t,n,i){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var o;!function(e){e[e.Ignore=0]="Ignore",e[e.Info=1]="Info",e[e.Warning=2]="Warning",e[e.Error=3]="Error"}(o||(o={})),function(e){var t="error",o="warning",r="warn",s="info",a=Object.create(null);a[e.Error]=n.localize(0,null),a[e.Warning]=n.localize(1,null),a[e.Info]=n.localize(2,null),e.fromValue=function(n){return n?i.equalsIgnoreCase(t,n)?e.Error:i.equalsIgnoreCase(o,n)||i.equalsIgnoreCase(r,n)?e.Warning:i.equalsIgnoreCase(s,n)?e.Info:e.Ignore:e.Ignore},e.toString=function(e){return a[e]||i.empty},e.compare=function(e,t){return t-e}}(o||(o={})),t.default=o}),define(d[295],h([6,8]),function(e,t){return e.create("vs/base/parts/quickopen/browser/quickOpenModel",t)}),define(d[120],h([1,0,295,7,29,81,9,45,162,229,75,110,4,292,15]),function(e,t,n,i,o,r,s,a,u,l,c,d,h,p,g){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var m=0,v=function(){function e(){}return e.getLabel=function(e){return e.getLabel()},e.getResourcePath=function(e){var t=e.getResource();return t&&t.fsPath},e}(),_=function(){function e(e){void 0===e&&(e=[]),this.id=(m++).toString(),this.labelHighlights=e,this.descriptionHighlights=[]}return e.prototype.getId=function(){return this.id},e.prototype.getLabel=function(){return null},e.prototype.getLabelOptions=function(){return null},e.prototype.getAriaLabel=function(){return this.getLabel()},e.prototype.getDetail=function(){return null},e.prototype.getIcon=function(){return null},e.prototype.getDescription=function(){return null},e.prototype.getKeybinding=function(){return null},e.prototype.getResource=function(){return null},e.prototype.isHidden=function(){return this.hidden},e.prototype.setHidden=function(e){this.hidden=e},e.prototype.setHighlights=function(e,t,n){this.labelHighlights=e,this.descriptionHighlights=t,this.detailHighlights=n},e.prototype.getHighlights=function(){return[this.labelHighlights,this.descriptionHighlights,this.detailHighlights]},e.prototype.run=function(e,t){return!1},e.compare=function(e,t,n){var i=e.getHighlights()[0]||[],o=t.getHighlights()[0]||[];if(i.length&&!o.length)return-1;if(!i.length&&o.length)return 1;var r=e.getLabel(),s=t.getLabel();if(r===s){var a=e.getResource(),u=t.getResource();a&&u&&(r=a.fsPath,s=u.fsPath)}return l.compareAnything(r,s,n)},e.compareByScore=function(e,t,n,i,o){return l.compareByScore(e,t,v,n,i,o)},e.highlight=function(e,t,n){void 0===n&&(n=!1);var i=[],o=[],u=s.stripWildcards(t),l=e.getLabel(),c=e.getDescription();if(e.getResource()){var d=e.getResource().fsPath;if(t.length===d.length&&t.toLowerCase()===d.toLowerCase())i.push({start:0,end:l.length}),o.push({start:0,end:c.length});else if(n||t.indexOf(a.nativeSep)>=0){var h=r.matchesFuzzy(t,l,n);if(h)i=h;else{var p=c?c+a.nativeSep:"",f=p.length,g=r.matchesFuzzy(t,p+l,n);g||t===u||(g=r.matchesFuzzy(u,p+l,n)),g&&g.forEach(function(e){e.startf?(i.push({start:0,end:e.end-f}),o.push({start:e.start,end:f})):e.start>=f?i.push({start:e.start-f,end:e.end-f}):o.push(e)})}}else i=r.matchesFuzzy(t,l)}else i=r.matchesFuzzy(t,l);return{labelHighlights:i,descriptionHighlights:o}},e.prototype.isFile=function(){return!1},e}();t.QuickOpenEntry=_;var y=function(e){function t(t,n,i){var o=e.call(this)||this;return o.entry=t,o.groupLabel=n,o.withBorder=i,o}return f(t,e),t.prototype.getGroupLabel=function(){return this.groupLabel},t.prototype.setGroupLabel=function(e){this.groupLabel=e},t.prototype.showBorder=function(){return this.withBorder},t.prototype.setShowBorder=function(e){this.withBorder=e},t.prototype.getLabel=function(){return this.entry?this.entry.getLabel():e.prototype.getLabel.call(this)},t.prototype.getLabelOptions=function(){return this.entry?this.entry.getLabelOptions():e.prototype.getLabelOptions.call(this)},t.prototype.getAriaLabel=function(){return this.entry?this.entry.getAriaLabel():e.prototype.getAriaLabel.call(this)},t.prototype.getDetail=function(){return this.entry?this.entry.getDetail():e.prototype.getDetail.call(this)},t.prototype.getResource=function(){return this.entry?this.entry.getResource():e.prototype.getResource.call(this)},t.prototype.getIcon=function(){return this.entry?this.entry.getIcon():e.prototype.getIcon.call(this)},t.prototype.getDescription=function(){return this.entry?this.entry.getDescription():e.prototype.getDescription.call(this)},t.prototype.getEntry=function(){return this.entry},t.prototype.getHighlights=function(){return this.entry?this.entry.getHighlights():e.prototype.getHighlights.call(this)},t.prototype.isHidden=function(){return this.entry?this.entry.isHidden():e.prototype.isHidden.call(this)},t.prototype.setHighlights=function(t,n,i){this.entry?this.entry.setHighlights(t,n,i):e.prototype.setHighlights.call(this,t,n,i)},t.prototype.setHidden=function(t){this.entry?this.entry.setHidden(t):e.prototype.setHidden.call(this,t)},t.prototype.run=function(t,n){return this.entry?this.entry.run(t,n):e.prototype.run.call(this,t,n)},t}(_);t.QuickOpenEntryGroup=y;var C=function(){function e(){}return e.prototype.hasActions=function(e,t){return!1},e.prototype.getActions=function(e,t){return i.TPromise.as(null)},e.prototype.hasSecondaryActions=function(e,t){return!1},e.prototype.getSecondaryActions=function(e,t){return i.TPromise.as(null)},e.prototype.getActionItem=function(e,t,n){return null},e}(),b=function(){function e(e,t){void 0===e&&(e=new C),void 0===t&&(t=null),this.actionProvider=e,this.actionRunner=t}return e.prototype.getHeight=function(e){return e.getDetail()?44:22},e.prototype.getTemplateId=function(e){return e instanceof y?"quickOpenEntryGroup":"quickOpenEntry"},e.prototype.renderTemplate=function(e,t,n){var i=document.createElement("div");h.addClass(i,"sub-content"),t.appendChild(i);var o=h.$(".quick-open-row"),r=h.$(".quick-open-row"),s=h.$(".quick-open-entry",null,o,r);i.appendChild(s);var a=document.createElement("span");o.appendChild(a);var l=new u.IconLabel(o,{supportHighlights:!0}),f=document.createElement("span");o.appendChild(f),h.addClass(f,"quick-open-entry-description");var m=new d.HighlightedLabel(f),v=document.createElement("span");o.appendChild(v),h.addClass(v,"quick-open-entry-keybinding");var _=new p.KeybindingLabel(v,g.OS),y=document.createElement("div");r.appendChild(y),h.addClass(y,"quick-open-entry-meta");var C,b=new d.HighlightedLabel(y);"quickOpenEntryGroup"===e&&(C=document.createElement("div"),h.addClass(C,"results-group"),t.appendChild(C)),h.addClass(t,"actions");var w=document.createElement("div");return h.addClass(w,"primary-action-bar"),t.appendChild(w),{container:t,entry:s,icon:a,label:l,detail:b,description:m,keybinding:_,group:C,actionBar:new c.ActionBar(w,{actionRunner:this.actionRunner})}},e.prototype.renderElement=function(e,t,n,i){var o=n;if(this.actionProvider.hasActions(null,e)?h.addClass(o.container,"has-actions"):h.removeClass(o.container,"has-actions"),o.actionBar.context=e,this.actionProvider.getActions(null,e).then(function(e){o.actionBar.isEmpty()&&e&&e.length>0?o.actionBar.push(e,{icon:!0,label:!1}):o.actionBar.isEmpty()||e&&0!==e.length||o.actionBar.clear()}),e instanceof y&&e.getGroupLabel()?h.addClass(o.container,"has-group-label"):h.removeClass(o.container,"has-group-label"),e instanceof y){var r=e,s=n;r.showBorder()?(h.addClass(s.container,"results-group-separator"),s.container.style.borderTopColor=i.pickerGroupBorder.toString()):(h.removeClass(s.container,"results-group-separator"),s.container.style.borderTopColor=null);var a=r.getGroupLabel()||"";s.group.textContent=a,s.group.style.color=i.pickerGroupForeground.toString()}if(e instanceof _){var u=e.getHighlights(),l=u[0],c=u[1],d=u[2],p=e.getIcon()?"quick-open-entry-icon "+e.getIcon():"";o.icon.className=p;var f=e.getLabelOptions()||Object.create(null);f.matches=l||[],o.label.setValue(e.getLabel(),null,f),o.detail.set(e.getDetail(),d),o.description.set(e.getDescription(),c||[]),o.description.element.title=e.getDescription(),o.keybinding.set(e.getKeybinding(),null)}},e.prototype.disposeTemplate=function(e,t){var n=t;n.actionBar.dispose(),n.actionBar=null,n.container=null,n.entry=null,n.description.dispose(),n.description=null,n.keybinding.dispose(),n.keybinding=null,n.detail.dispose(),n.detail=null,n.group=null,n.icon=null,n.label.dispose(),n.label=null},e}(),w=function(){function e(e,t){void 0===e&&(e=[]),void 0===t&&(t=new C),this._entries=e,this._dataSource=this,this._renderer=new b(t),this._filter=this,this._runner=this,this._accessibilityProvider=this}return Object.defineProperty(e.prototype,"entries",{get:function(){return this._entries},set:function(e){this._entries=e},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"dataSource",{get:function(){return this._dataSource},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"renderer",{get:function(){return this._renderer},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"filter",{get:function(){return this._filter},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"runner",{get:function(){return this._runner},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"accessibilityProvider",{get:function(){return this._accessibilityProvider},enumerable:!0,configurable:!0}),e.prototype.addEntries=function(e){o.isArray(e)&&(this._entries=this._entries.concat(e))},e.prototype.setEntries=function(e){o.isArray(e)&&(this._entries=e)},e.prototype.getEntries=function(e){return e?this._entries.filter(function(e){return!e.isHidden()}):this._entries},e.prototype.getId=function(e){return e.getId()},e.prototype.getLabel=function(e){return e.getLabel()},e.prototype.getAriaLabel=function(e){return e.getAriaLabel()?n.localize(0,null,e.getAriaLabel()):n.localize(1,null)},e.prototype.isVisible=function(e){return!e.isHidden()},e.prototype.run=function(e,t,n){return e.run(t,n)},e}();t.QuickOpenModel=w}),define(d[297],h([6,8]),function(e,t){return e.create("vs/base/parts/quickopen/browser/quickOpenWidget",t)}),define(d[298],h([6,8]),function(e,t){return e.create("vs/base/parts/tree/browser/treeDefaults",t)}),define(d[128],h([1,0,298,7,53,15,10,4,40]),function(e,t,n,i,o,r,s,a,u){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var l;!function(e){e[e.ON_MOUSE_DOWN=0]="ON_MOUSE_DOWN",e[e.ON_MOUSE_UP=1]="ON_MOUSE_UP"}(l=t.ClickBehavior||(t.ClickBehavior={}));var c=function(){function e(){this._arr=[]}return e.prototype.set=function(e,t){this._arr.push({keybinding:u.createKeybinding(e,r.OS),callback:t})},e.prototype.dispatch=function(e){for(var t=this._arr.length-1;t>=0;t--){var n=this._arr[t];if(e.equals(n.keybinding))return n.callback}return null},e}();t.KeybindingDispatcher=c;var d=function(){function e(e){void 0===e&&(e={clickBehavior:l.ON_MOUSE_UP,keyboardSupport:!0});var t=this;this.options=e,this.downKeyBindingDispatcher=new c,this.upKeyBindingDispatcher=new c,("boolean"!=typeof e.keyboardSupport||e.keyboardSupport)&&(this.downKeyBindingDispatcher.set(16,function(e,n){return t.onUp(e,n)}),this.downKeyBindingDispatcher.set(18,function(e,n){return t.onDown(e,n)}),this.downKeyBindingDispatcher.set(15,function(e,n){return t.onLeft(e,n)}),this.downKeyBindingDispatcher.set(17,function(e,n){return t.onRight(e,n)}),r.isMacintosh&&(this.downKeyBindingDispatcher.set(2064,function(e,n){return t.onLeft(e,n)}),this.downKeyBindingDispatcher.set(300,function(e,n){return t.onDown(e,n)}),this.downKeyBindingDispatcher.set(302,function(e,n){return t.onUp(e,n)})),this.downKeyBindingDispatcher.set(11,function(e,n){return t.onPageUp(e,n)}),this.downKeyBindingDispatcher.set(12,function(e,n){return t.onPageDown(e,n)}),this.downKeyBindingDispatcher.set(14,function(e,n){return t.onHome(e,n)}),this.downKeyBindingDispatcher.set(13,function(e,n){return t.onEnd(e,n)}),this.downKeyBindingDispatcher.set(10,function(e,n){return t.onSpace(e,n)}),this.downKeyBindingDispatcher.set(9,function(e,n){return t.onEscape(e,n)}),this.upKeyBindingDispatcher.set(3,this.onEnter.bind(this)),this.upKeyBindingDispatcher.set(2051,this.onEnter.bind(this)))}return e.prototype.onMouseDown=function(e,t,n,i){if(void 0===i&&(i="mouse"),this.options.clickBehavior===l.ON_MOUSE_DOWN&&(n.leftButton||n.middleButton)){if(n.target){if(n.target.tagName&&"input"===n.target.tagName.toLowerCase())return!1;if(a.findParentWithClass(n.target,"monaco-action-bar","row"))return!1}return this.onLeftClick(e,t,n,i)}return!1},e.prototype.onClick=function(e,t,n){return r.isMacintosh&&n.ctrlKey?(n.preventDefault(),n.stopPropagation(),!1):(!n.target||!n.target.tagName||"input"!==n.target.tagName.toLowerCase())&&((this.options.clickBehavior!==l.ON_MOUSE_DOWN||!n.leftButton&&!n.middleButton)&&this.onLeftClick(e,t,n))},e.prototype.onLeftClick=function(e,t,n,i){void 0===i&&(i="mouse");var o={origin:i,originalEvent:n};return e.getInput()===t?(e.clearFocus(o),e.clearSelection(o)):(n&&n.browserEvent&&"mousedown"===n.browserEvent.type||n.preventDefault(),n.stopPropagation(),e.DOMFocus(),e.setSelection([t],o),e.setFocus(t,o),e.isExpanded(t)?e.collapse(t).done(null,s.onUnexpectedError):e.expand(t).done(null,s.onUnexpectedError)),!0},e.prototype.onContextMenu=function(e,t,n){return(!n.target||!n.target.tagName||"input"!==n.target.tagName.toLowerCase())&&(n&&(n.preventDefault(),n.stopPropagation()),!1)},e.prototype.onTap=function(e,t,n){var i=n.initialTarget;return(!i||!i.tagName||"input"!==i.tagName.toLowerCase())&&this.onLeftClick(e,t,n,"touch")},e.prototype.onKeyDown=function(e,t){return this.onKey(this.downKeyBindingDispatcher,e,t)},e.prototype.onKeyUp=function(e,t){return this.onKey(this.upKeyBindingDispatcher,e,t)},e.prototype.onKey=function(e,t,n){var i=e.dispatch(n.toKeybinding());return!(!i||!i(t,n))&&(n.preventDefault(),n.stopPropagation(),!0)},e.prototype.onUp=function(e,t){var n={origin:"keyboard",originalEvent:t};return e.getHighlight()?e.clearHighlight(n):(e.focusPrevious(1,n),e.reveal(e.getFocus()).done(null,s.onUnexpectedError)),!0},e.prototype.onPageUp=function(e,t){var n={origin:"keyboard",originalEvent:t};return e.getHighlight()?e.clearHighlight(n):(e.focusPreviousPage(n),e.reveal(e.getFocus()).done(null,s.onUnexpectedError)),!0},e.prototype.onDown=function(e,t){var n={origin:"keyboard",originalEvent:t};return e.getHighlight()?e.clearHighlight(n):(e.focusNext(1,n),e.reveal(e.getFocus()).done(null,s.onUnexpectedError)),!0},e.prototype.onPageDown=function(e,t){var n={origin:"keyboard",originalEvent:t};return e.getHighlight()?e.clearHighlight(n):(e.focusNextPage(n),e.reveal(e.getFocus()).done(null,s.onUnexpectedError)),!0},e.prototype.onHome=function(e,t){var n={origin:"keyboard",originalEvent:t};return e.getHighlight()?e.clearHighlight(n):(e.focusFirst(n),e.reveal(e.getFocus()).done(null,s.onUnexpectedError)),!0},e.prototype.onEnd=function(e,t){var n={origin:"keyboard",originalEvent:t};return e.getHighlight()?e.clearHighlight(n):(e.focusLast(n),e.reveal(e.getFocus()).done(null,s.onUnexpectedError)),!0},e.prototype.onLeft=function(e,t){var n={origin:"keyboard",originalEvent:t};if(e.getHighlight())e.clearHighlight(n);else{var i=e.getFocus();e.collapse(i).then(function(t){if(i&&!t)return e.focusParent(n),e.reveal(e.getFocus())}).done(null,s.onUnexpectedError)}return!0},e.prototype.onRight=function(e,t){var n={origin:"keyboard",originalEvent:t};if(e.getHighlight())e.clearHighlight(n);else{var i=e.getFocus();e.expand(i).then(function(t){if(i&&!t)return e.focusFirstChild(n),e.reveal(e.getFocus())}).done(null,s.onUnexpectedError)}return!0},e.prototype.onEnter=function(e,t){var n={origin:"keyboard",originalEvent:t};if(e.getHighlight())return!1;var i=e.getFocus();return i&&e.setSelection([i],n),!0},e.prototype.onSpace=function(e,t){if(e.getHighlight())return!1;var n=e.getFocus();return n&&e.toggleExpansion(n),!0},e.prototype.onEscape=function(e,t){var n={origin:"keyboard",originalEvent:t};return e.getHighlight()?(e.clearHighlight(n),!0):e.getSelection().length?(e.clearSelection(n),!0):!!e.getFocus()&&(e.clearFocus(n),!0)},e}();t.DefaultController=d;var h=function(){function e(){}return e.prototype.getDragURI=function(e,t){return null},e.prototype.onDragStart=function(e,t,n){},e.prototype.onDragOver=function(e,t,n,i){return null},e.prototype.drop=function(e,t,n,i){},e}();t.DefaultDragAndDrop=h;var p=function(){function e(){}return e.prototype.isVisible=function(e,t){return!0},e}();t.DefaultFilter=p;var g=function(){function e(){}return e.prototype.compare=function(e,t,n){return 0},e}();t.DefaultSorter=g;var m=function(){function e(){}return e.prototype.getAriaLabel=function(e,t){return null},e}();t.DefaultAccessibilityProvider=m;var v=function(e){function t(t,i){var o=e.call(this,"vs.tree.collapse",n.localize(0,null),"monaco-tree-action collapse-all",i)||this;return o.viewer=t,o}return f(t,e),t.prototype.run=function(e){return this.viewer.getHighlight()?i.TPromise.as(null):(this.viewer.collapseAll(),this.viewer.clearSelection(),this.viewer.clearFocus(),this.viewer.DOMFocus(),this.viewer.focusFirst(),i.TPromise.as(null))},t}(o.Action);t.CollapseAllAction=v}),define(d[161],h([1,0,128,38,466,238,107,11,3,32,26,261]),function(e,t,n,i,o,r,s,a,u,l,c){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var d=function(){return function(e,t,i){if(void 0===i&&(i={}),this.tree=e,this.configuration=t,this.options=i,!t.dataSource)throw new Error("You must provide a Data Source to the tree.");this.dataSource=t.dataSource,this.renderer=t.renderer,this.controller=t.controller||new n.DefaultController({clickBehavior:n.ClickBehavior.ON_MOUSE_UP,keyboardSupport:"boolean"!=typeof i.keyboardSupport||i.keyboardSupport}),this.dnd=t.dnd||new n.DefaultDragAndDrop,this.filter=t.filter||new n.DefaultFilter,this.sorter=t.sorter||null,this.accessibilityProvider=t.accessibilityProvider||new n.DefaultAccessibilityProvider}}();t.TreeContext=d;var h={listFocusBackground:l.Color.fromHex("#073655"),listActiveSelectionBackground:l.Color.fromHex("#0E639C"),listActiveSelectionForeground:l.Color.fromHex("#FFFFFF"),listFocusAndSelectionBackground:l.Color.fromHex("#094771"),listFocusAndSelectionForeground:l.Color.fromHex("#FFFFFF"),listInactiveSelectionBackground:l.Color.fromHex("#3F3F46"),listHoverBackground:l.Color.fromHex("#2A2D2E"),listDropBackground:l.Color.fromHex("#383B3D")},p=function(e){function t(t,n,i){void 0===i&&(i={});var s=e.call(this)||this;return s.toDispose=[],s._onDispose=new a.Emitter,s._onHighlightChange=new a.Emitter,s.toDispose.push(s._onDispose,s._onHighlightChange),s.container=t,s.configuration=n,s.options=i,c.mixin(s.options,h,!1),s.options.twistiePixels="number"==typeof s.options.twistiePixels?s.options.twistiePixels:32,s.options.showTwistie=!1!==s.options.showTwistie,s.options.indentPixels="number"==typeof s.options.indentPixels?s.options.indentPixels:12,s.options.alwaysFocused=!0===s.options.alwaysFocused,s.options.useShadows=!1!==s.options.useShadows,s.options.paddingOnRow=!1!==s.options.paddingOnRow,s.context=new d(s,n,i),s.model=new o.TreeModel(s.context),s.view=new r.TreeView(s.context,s.container),s.view.setModel(s.model),s.addEmitter(s.model),s.addEmitter(s.view),s.toDispose.push(s.model.addListener("highlight",function(){return s._onHighlightChange.fire()})),s}return f(t,e),t.prototype.style=function(e){this.view.applyStyles(e)},Object.defineProperty(t.prototype,"onDOMFocus",{get:function(){return this.view&&this.view.onDOMFocus},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"onDOMBlur",{get:function(){return this.view&&this.view.onDOMBlur},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"onHighlightChange",{get:function(){return this._onHighlightChange&&this._onHighlightChange.event},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"onDispose",{get:function(){return this._onDispose&&this._onDispose.event},enumerable:!0,configurable:!0}),t.prototype.getHTMLElement=function(){return this.view.getHTMLElement()},t.prototype.layout=function(e){this.view.layout(e)},t.prototype.DOMFocus=function(){this.view.focus()},t.prototype.isDOMFocused=function(){return this.view.isFocused()},t.prototype.DOMBlur=function(){this.view.blur()},t.prototype.onVisible=function(){this.view.onVisible()},t.prototype.onHidden=function(){this.view.onHidden()},t.prototype.setInput=function(e){return this.model.setInput(e)},t.prototype.getInput=function(){return this.model.getInput()},t.prototype.refresh=function(e,t){return void 0===e&&(e=null),void 0===t&&(t=!0),this.model.refresh(e,t)},t.prototype.expand=function(e){return this.model.expand(e)},t.prototype.expandAll=function(e){return this.model.expandAll(e)},t.prototype.collapse=function(e,t){return void 0===t&&(t=!1),this.model.collapse(e,t)},t.prototype.collapseAll=function(e,t){return void 0===e&&(e=null),void 0===t&&(t=!1),this.model.collapseAll(e,t)},t.prototype.toggleExpansion=function(e){return this.model.toggleExpansion(e)},t.prototype.toggleExpansionAll=function(e){return this.model.toggleExpansionAll(e)},t.prototype.isExpanded=function(e){return this.model.isExpanded(e)},t.prototype.getExpandedElements=function(){return this.model.getExpandedElements()},t.prototype.reveal=function(e,t){return void 0===t&&(t=null),this.model.reveal(e,t)},t.prototype.getRelativeTop=function(e){var t=this.model.getItem(e);return this.view.getRelativeTop(t)},t.prototype.getScrollPosition=function(){return this.view.getScrollPosition()},t.prototype.setScrollPosition=function(e){this.view.setScrollPosition(e)},t.prototype.getContentHeight=function(){return this.view.getTotalHeight()},t.prototype.setHighlight=function(e,t){this.model.setHighlight(e,t)},t.prototype.getHighlight=function(){return this.model.getHighlight()},t.prototype.isHighlighted=function(e){return this.model.isFocused(e)},t.prototype.clearHighlight=function(e){this.model.setHighlight(null,e)},t.prototype.select=function(e,t){this.model.select(e,t)},t.prototype.selectRange=function(e,t,n){this.model.selectRange(e,t,n)},t.prototype.deselectRange=function(e,t,n){this.model.deselectRange(e,t,n)},t.prototype.selectAll=function(e,t){this.model.selectAll(e,t)},t.prototype.deselect=function(e,t){this.model.deselect(e,t)},t.prototype.deselectAll=function(e,t){this.model.deselectAll(e,t)},t.prototype.setSelection=function(e,t){this.model.setSelection(e,t)},t.prototype.toggleSelection=function(e,t){this.model.toggleSelection(e,t)},t.prototype.isSelected=function(e){return this.model.isSelected(e)},t.prototype.getSelection=function(){return this.model.getSelection()},t.prototype.clearSelection=function(e){this.model.setSelection([],e)},t.prototype.selectNext=function(e,t,n){this.model.selectNext(e,t,n)},t.prototype.selectPrevious=function(e,t,n){this.model.selectPrevious(e,t,n)},t.prototype.selectParent=function(e,t){this.model.selectParent(e,t)},t.prototype.setFocus=function(e,t){this.model.setFocus(e,t)},t.prototype.isFocused=function(e){return this.model.isFocused(e)},t.prototype.getFocus=function(){return this.model.getFocus()},t.prototype.focusNext=function(e,t){this.model.focusNext(e,t)},t.prototype.focusPrevious=function(e,t){this.model.focusPrevious(e,t)},t.prototype.focusParent=function(e){this.model.focusParent(e)},t.prototype.focusFirstChild=function(e){this.model.focusFirstChild(e)},t.prototype.focusFirst=function(e,t){this.model.focusFirst(e,t)},t.prototype.focusNth=function(e,t){this.model.focusNth(e,t)},t.prototype.focusLast=function(e,t){this.model.focusLast(e,t)},t.prototype.focusNextPage=function(e){this.view.focusNextPage(e)},t.prototype.focusPreviousPage=function(e){this.view.focusPreviousPage(e)},t.prototype.clearFocus=function(e){this.model.setFocus(null,e)},t.prototype.addTraits=function(e,t){this.model.addTraits(e,t)},t.prototype.removeTraits=function(e,t){this.model.removeTraits(e,t)},t.prototype.toggleTrait=function(e,t){this.model.hasTrait(e,t)?this.model.removeTraits(e,[t]):this.model.addTraits(e,[t])},t.prototype.hasTrait=function(e,t){return this.model.hasTrait(e,t)},t.prototype.getNavigator=function(e,t){return new s.MappedNavigator(this.model.getNavigator(e,t),function(e){return e&&e.getElement()})},t.prototype.dispose=function(){this._onDispose.fire(),null!==this.model&&(this.model.dispose(),this.model=null),null!==this.view&&(this.view.dispose(),this.view=null),this.toDispose=u.dispose(this.toDispose),e.prototype.dispose.call(this)},t}(i.EventEmitter);t.Tree=p}),define(d[301],h([1,0,297,7,15,79,29,10,100,445,52,115,36,161,220,65,128,4,3,48,32,26,260]),function(e,t,n,i,o,r,s,a,u,l,c,d,h,p,g,m,v,_,y,C,b,w){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var S=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return f(t,e),t.prototype.onContextMenu=function(t,n,i){return o.isMacintosh?this.onLeftClick(t,n,i):e.prototype.onContextMenu.call(this,t,n,i)},t}(v.DefaultController);t.QuickOpenController=S;var E;!function(e){e[e.ELEMENT_SELECTED=0]="ELEMENT_SELECTED",e[e.FOCUS_LOST=1]="FOCUS_LOST",e[e.CANCELED=2]="CANCELED"}(E=t.HideReason||(t.HideReason={}));var L={background:b.Color.fromHex("#1E1E1E"),foreground:b.Color.fromHex("#CCCCCC"),pickerGroupForeground:b.Color.fromHex("#0097FB"),pickerGroupBorder:b.Color.fromHex("#3F3F46"),widgetShadow:b.Color.fromHex("#000000"),progressBarBackground:b.Color.fromHex("#0E70C0")},x=n.localize(0,null),N=function(){function e(e,t,n,i){this.isDisposed=!1,this.toUnbind=[],this.container=e,this.callbacks=t,this.options=n,this.styles=n||Object.create(null),w.mixin(this.styles,L,!1),this.usageLogger=i,this.model=null}return e.prototype.getElement=function(){return c.$(this.builder)},e.prototype.getModel=function(){return this.model},e.prototype.setCallbacks=function(e){this.callbacks=e},e.prototype.create=function(){var e=this;return this.builder=c.$().div(function(t){t.on(_.EventType.KEY_DOWN,function(t){9===new m.StandardKeyboardEvent(t).keyCode&&(_.EventHelper.stop(t,!0),e.hide(E.CANCELED))}).on(_.EventType.CONTEXT_MENU,function(e){return _.EventHelper.stop(e,!0)}).on(_.EventType.FOCUS,function(t){return e.gainingFocus()},null,!0).on(_.EventType.BLUR,function(t){return e.loosingFocus(t)},null,!0),e.progressBar=new g.ProgressBar(t.clone(),{progressBarBackground:e.styles.progressBarBackground}),e.progressBar.getContainer().hide(),t.div({class:"quick-open-input"},function(t){e.inputContainer=t,e.inputBox=new d.InputBox(t.getHTMLElement(),null,{placeholder:e.options.inputPlaceHolder||"",ariaLabel:x,inputBackground:e.styles.inputBackground,inputForeground:e.styles.inputForeground,inputBorder:e.styles.inputBorder,inputValidationInfoBackground:e.styles.inputValidationInfoBackground,inputValidationInfoBorder:e.styles.inputValidationInfoBorder,inputValidationWarningBackground:e.styles.inputValidationWarningBackground,inputValidationWarningBorder:e.styles.inputValidationWarningBorder,inputValidationErrorBackground:e.styles.inputValidationErrorBackground,inputValidationErrorBorder:e.styles.inputValidationErrorBorder}),e.inputElement=e.inputBox.inputElement,e.inputElement.setAttribute("role","combobox"),e.inputElement.setAttribute("aria-haspopup","false"),e.inputElement.setAttribute("aria-autocomplete","list"),_.addDisposableListener(e.inputBox.inputElement,_.EventType.KEY_DOWN,function(t){var n=new m.StandardKeyboardEvent(t),i=e.shouldOpenInBackground(n);if(2!==n.keyCode)if(18===n.keyCode||16===n.keyCode||12===n.keyCode||11===n.keyCode)_.EventHelper.stop(t,!0),e.navigateInTree(n.keyCode,n.shiftKey),e.inputBox.inputElement.selectionStart===e.inputBox.inputElement.selectionEnd&&(e.inputBox.inputElement.selectionStart=e.inputBox.value.length);else if(3===n.keyCode||i){_.EventHelper.stop(t,!0);var o=e.tree.getFocus();o&&e.elementSelected(o,t,i?u.Mode.OPEN_IN_BACKGROUND:u.Mode.OPEN)}}),_.addDisposableListener(e.inputBox.inputElement,_.EventType.INPUT,function(t){e.onType()})}),e.treeContainer=t.div({class:"quick-open-tree"},function(t){e.tree=new p.Tree(t.getHTMLElement(),{dataSource:new l.DataSource(e),controller:new S({clickBehavior:v.ClickBehavior.ON_MOUSE_UP,keyboardSupport:e.options.keyboardSupport}),renderer:e.renderer=new l.Renderer(e,e.styles),filter:new l.Filter(e),accessibilityProvider:new l.AccessibilityProvider(e)},{twistiePixels:11,indentPixels:0,alwaysFocused:!0,verticalScrollMode:C.ScrollbarVisibility.Visible,ariaLabel:n.localize(1,null),keyboardSupport:e.options.keyboardSupport}),e.treeElement=e.tree.getHTMLElement(),e.toUnbind.push(e.tree.addListener(r.EventType.FOCUS,function(t){e.elementFocused(t.focus,t)})),e.toUnbind.push(e.tree.addListener(r.EventType.SELECTION,function(t){t.selection&&t.selection.length>0&&e.elementSelected(t.selection[0],t)}))}).on(_.EventType.KEY_DOWN,function(t){var n=new m.StandardKeyboardEvent(t);e.quickNavigateConfiguration&&(18!==n.keyCode&&16!==n.keyCode&&12!==n.keyCode&&11!==n.keyCode||(_.EventHelper.stop(t,!0),e.navigateInTree(n.keyCode)))}).on(_.EventType.KEY_UP,function(t){var n=new m.StandardKeyboardEvent(t),i=n.keyCode;if(e.quickNavigateConfiguration){var o=e.quickNavigateConfiguration.keybindings;if(3===i||o.some(function(e){var t=e.getParts(),o=t[0];return!t[1]&&(o.shiftKey&&4===i?!(n.ctrlKey||n.altKey||n.metaKey):!(!o.altKey||6!==i)||(!(!o.ctrlKey||5!==i)||!(!o.metaKey||57!==i)))})){var r=e.tree.getFocus();r&&e.elementSelected(r,t)}}}).clone()}).addClass("quick-open-widget").build(this.container),this.layoutDimensions&&this.layout(this.layoutDimensions),this.applyStyles(),this.builder.getHTMLElement()},e.prototype.style=function(e){this.styles=e,this.applyStyles()},e.prototype.applyStyles=function(){if(this.builder){var e=this.styles.foreground?this.styles.foreground.toString():null,t=this.styles.background?this.styles.background.toString():null,n=this.styles.borderColor?this.styles.borderColor.toString():null,i=this.styles.widgetShadow?this.styles.widgetShadow.toString():null;this.builder.style("color",e),this.builder.style("background-color",t),this.builder.style("border-color",n),this.builder.style("border-width",n?"1px":null),this.builder.style("border-style",n?"solid":null),this.builder.style("box-shadow",i?"0 5px 8px "+i:null)}this.progressBar&&this.progressBar.style({progressBarBackground:this.styles.progressBarBackground}),this.inputBox&&this.inputBox.style({inputBackground:this.styles.inputBackground,inputForeground:this.styles.inputForeground,inputBorder:this.styles.inputBorder,inputValidationInfoBackground:this.styles.inputValidationInfoBackground,inputValidationInfoBorder:this.styles.inputValidationInfoBorder,inputValidationWarningBackground:this.styles.inputValidationWarningBackground,inputValidationWarningBorder:this.styles.inputValidationWarningBorder,inputValidationErrorBackground:this.styles.inputValidationErrorBackground,inputValidationErrorBorder:this.styles.inputValidationErrorBorder}),this.tree&&this.tree.style(this.styles),this.renderer&&this.renderer.updateStyles(this.styles)},e.prototype.shouldOpenInBackground=function(e){return 17===e.keyCode&&(!(e.metaKey||e.ctrlKey||e.shiftKey||e.altKey)&&this.inputBox.inputElement.selectionEnd===this.inputBox.value.length)},e.prototype.onType=function(){var e=this.inputBox.value;this.helpText&&(e?this.helpText.hide():this.helpText.show()),this.callbacks.onType(e)},e.prototype.navigate=function(e,t){this.isVisible()&&(!this.quickNavigateConfiguration&&t&&(this.quickNavigateConfiguration=t,this.tree.DOMFocus()),this.navigateInTree(e?18:16))},e.prototype.navigateInTree=function(e,t){var n=this.tree.getInput(),i=n?n.entries:[],o=this.tree.getFocus();switch(e){case 18:this.tree.focusNext();break;case 16:this.tree.focusPrevious();break;case 12:this.tree.focusNextPage();break;case 11:this.tree.focusPreviousPage();break;case 2:t?this.tree.focusPrevious():this.tree.focusNext()}var r=this.tree.getFocus();i.length>1&&o===r&&(16===e||2===e&&t?this.tree.focusLast():(18===e||2===e&&!t)&&this.tree.focusFirst()),(r=this.tree.getFocus())&&this.tree.reveal(r).done(null,a.onUnexpectedError)},e.prototype.elementFocused=function(e,t){if(e&&this.isVisible()){this.inputElement.setAttribute("aria-activedescendant",this.treeElement.getAttribute("aria-activedescendant"));var n={event:t,keymods:this.extractKeyMods(t),quickNavigateConfiguration:this.quickNavigateConfiguration};this.model.runner.run(e,u.Mode.PREVIEW,n)}},e.prototype.elementSelected=function(e,t,n){var i=!0;if(this.isVisible()){var o=n||u.Mode.OPEN,r={event:t,keymods:this.extractKeyMods(t),quickNavigateConfiguration:this.quickNavigateConfiguration};i=this.model.runner.run(e,o,r)}if(this.usageLogger){var s=this.model.entries.indexOf(e),a=this.model.entries.length;this.usageLogger.publicLog("quickOpenWidgetItemAccepted",{index:s,count:a,isQuickNavigate:!!this.quickNavigateConfiguration})}i&&this.hide(E.ELEMENT_SELECTED)},e.prototype.extractKeyMods=function(e){return e&&(e.ctrlKey||e.metaKey||e.payload&&e.payload.originalEvent&&(e.payload.originalEvent.ctrlKey||e.payload.originalEvent.metaKey))?[2048]:[]},e.prototype.show=function(e,t){this.visible=!0,this.isLoosingFocus=!1,this.quickNavigateConfiguration=t?t.quickNavigateConfiguration:void 0,this.quickNavigateConfiguration?(this.inputContainer.hide(),this.builder.show(),this.tree.DOMFocus()):(this.inputContainer.show(),this.builder.show(),this.inputBox.focus()),this.helpText&&(this.quickNavigateConfiguration||s.isString(e)?this.helpText.hide():this.helpText.show()),s.isString(e)?this.doShowWithPrefix(e):this.doShowWithInput(e,t&&t.autoFocus?t.autoFocus:{}),t&&t.inputSelection&&!this.quickNavigateConfiguration&&this.inputBox.select(t.inputSelection),this.callbacks.onShow&&this.callbacks.onShow()},e.prototype.doShowWithPrefix=function(e){this.inputBox.value=e,this.callbacks.onType(e)},e.prototype.doShowWithInput=function(e,t){this.setInput(e,t)},e.prototype.setInputAndLayout=function(e,t){var n=this;this.treeContainer.style({height:this.getHeight(e)+"px"}),this.tree.setInput(null).then(function(){return n.model=e,n.inputElement.setAttribute("aria-haspopup",String(e&&e.entries&&e.entries.length>0)),n.tree.setInput(e)}).done(function(){n.tree.layout(),e&&e.entries.some(function(t){return n.isElementVisible(e,t)})&&n.autoFocus(e,t)},a.onUnexpectedError)},e.prototype.isElementVisible=function(e,t){return!e.filter||e.filter.isVisible(t)},e.prototype.autoFocus=function(e,t){var n=this;void 0===t&&(t={});var i=e.entries.filter(function(t){return n.isElementVisible(e,t)});if(t.autoFocusPrefixMatch){for(var o=void 0,r=void 0,s=t.autoFocusPrefixMatch,u=s.toLowerCase(),l=0;lt.autoFocusIndex&&(this.tree.focusNth(t.autoFocusIndex),this.tree.reveal(this.tree.getFocus()).done(null,a.onUnexpectedError)):t.autoFocusSecondEntry?i.length>1&&this.tree.focusNth(1):t.autoFocusLastEntry&&i.length>1&&this.tree.focusLast()},e.prototype.refresh=function(e,t){var n=this;this.isVisible()&&(e||(e=this.tree.getInput()),e&&(this.treeContainer.style({height:this.getHeight(e)+"px"}),this.tree.refresh().done(function(){n.tree.layout(),t&&t&&e&&e.entries.some(function(t){return n.isElementVisible(e,t)})&&n.autoFocus(e,t)},a.onUnexpectedError)))},e.prototype.getHeight=function(t){var n=this,i=t.renderer;if(!t){var o=i.getHeight(null);return this.options.minItemsToShow?this.options.minItemsToShow*o:0}var r,s=0;this.layoutDimensions&&this.layoutDimensions.height&&(r=.4*(this.layoutDimensions.height-50)),(!r||r>e.MAX_ITEMS_HEIGHT)&&(r=e.MAX_ITEMS_HEIGHT);for(var a=t.entries.filter(function(e){return n.isElementVisible(t,e)}),u=this.options.maxItemsToShow||a.length,l=0;l=2?(S=v?g.Large:g.LargeBlocks,k=2/y):(S=v?g.Small:g.SmallBlocks,k=1/y),(E=Math.max(0,Math.floor((T-d)*k/(l+k))))/k>_&&(E=Math.floor(_*k)),L=T-E}else E=0,S=g.None,L=T;var I=Math.max(1,Math.floor((L-d)/l)),D=h?p:0;return{width:t,height:n,glyphMarginLeft:0,glyphMarginWidth:w,glyphMarginHeight:n,lineNumbersLeft:x,lineNumbersWidth:C,lineNumbersHeight:n,decorationsLeft:N,decorationsWidth:u,decorationsHeight:n,contentLeft:M,contentWidth:L,contentHeight:n,renderMinimap:S,minimapWidth:E,viewportColumn:I,verticalScrollbarWidth:d,horizontalScrollbarHeight:f,overviewRuler:{top:D,width:d,height:n-2*D,right:0}}},e}();t.EditorLayoutProvider=S;t.EDITOR_FONT_DEFAULTS={fontFamily:i.isMacintosh?"Menlo, Monaco, 'Courier New', monospace":i.isLinux?"'Droid Sans Mono', 'Courier New', monospace, 'Droid Sans Fallback'":"Consolas, 'Courier New', monospace",fontWeight:"normal",fontSize:i.isMacintosh?12:14,lineHeight:0,letterSpacing:0},t.EDITOR_MODEL_DEFAULTS={tabSize:4,insertSpaces:!0,detectIndentation:!0,trimAutoWhitespace:!0},t.EDITOR_DEFAULTS={inDiffEditor:!1,wordSeparators:r.USUAL_WORD_SEPARATORS,lineNumbersMinChars:5,lineDecorationsWidth:10,readOnly:!1,mouseStyle:"text",disableLayerHinting:!1,automaticLayout:!1,wordWrap:"off",wordWrapColumn:80,wordWrapMinified:!0,wrappingIndent:m.Same,wordWrapBreakBeforeCharacters:"([{‘“〈《「『【〔([{「£¥$£¥++",wordWrapBreakAfterCharacters:" \t})]?|&,;¢°′″‰℃、。。、¢,.:;?!%・・ゝゞヽヾーァィゥェォッャュョヮヵヶぁぃぅぇぉっゃゅょゎゕゖㇰㇱㇲㇳㇴㇵㇶㇷㇸㇹㇺㇻㇼㇽㇾㇿ々〻ァィゥェォャュョッー”〉》」』】〕)]}」",wordWrapBreakObtrusiveCharacters:".",autoClosingBrackets:!0,autoIndent:!0,dragAndDrop:!0,emptySelectionClipboard:!0,useTabStops:!0,multiCursorModifier:"altKey",accessibilitySupport:"auto",viewInfo:{extraEditorClassName:"",disableMonospaceOptimizations:!1,rulers:[],ariaLabel:n.localize(1,null),renderLineNumbers:!0,renderCustomLineNumbers:null,renderRelativeLineNumbers:!1,selectOnLineNumbers:!0,glyphMargin:!0,revealHorizontalRightPadding:30,roundedSelection:!0,overviewRulerLanes:2,overviewRulerBorder:!0,cursorBlinking:v.Blink,mouseWheelZoom:!1,cursorStyle:y.Line,hideCursorInOverviewRuler:!1,scrollBeyondLastLine:!0,stopRenderingLineAfter:1e4,renderWhitespace:"none",renderControlCharacters:!1,fontLigatures:!1,renderIndentGuides:!0,renderLineHighlight:"line",scrollbar:{vertical:o.ScrollbarVisibility.Auto,horizontal:o.ScrollbarVisibility.Auto,arrowSize:11,useShadows:!0,verticalHasArrows:!1,horizontalHasArrows:!1,horizontalScrollbarSize:10,horizontalSliderSize:10,verticalScrollbarSize:14,verticalSliderSize:14,handleMouseWheel:!0,mouseWheelScrollSensitivity:1},minimap:{enabled:!0,showSlider:"mouseover",renderCharacters:!0,maxColumn:120},fixedOverflowWidgets:!1},contribInfo:{selectionClipboard:!0,hover:!0,links:!0,contextmenu:!0,quickSuggestions:{other:!0,comments:!1,strings:!1},quickSuggestionsDelay:10,parameterHints:!0,iconsInSuggestions:!0,formatOnType:!1,formatOnPaste:!1,suggestOnTriggerCharacters:!0,acceptSuggestionOnEnter:"on",acceptSuggestionOnCommitCharacter:!0,snippetSuggestions:"inline",wordBasedSuggestions:!0,suggestFontSize:0,suggestLineHeight:0,selectionHighlight:!0,occurrencesHighlight:!0,codeLens:!0,folding:!0,showFoldingControls:"mouseover",matchBrackets:!0,find:{seedSearchStringFromSelection:!0,autoFindInSelection:!1}}}}),define(d[132],h([1,0,15,135,49]),function(e,t,n,i,o){"use strict";function r(e,t){if("number"==typeof e)return e;var n=parseFloat(e);return isNaN(n)?t:n}function s(e,t){if("number"==typeof e)return Math.round(e);var n=parseInt(e);return isNaN(n)?t:n}function a(e,t,n){return en?n:e}function u(e,t){return"string"!=typeof e?t:e}Object.defineProperty(t,"__esModule",{value:!0});var l=n.isMacintosh?1.5:1.35,c=function(){function e(e){this.zoomLevel=e.zoomLevel,this.fontFamily=String(e.fontFamily),this.fontWeight=String(e.fontWeight),this.fontSize=e.fontSize,this.lineHeight=0|e.lineHeight,this.letterSpacing=e.letterSpacing}return e.createFromRawSettings=function(t,n){var c=u(t.fontFamily,o.EDITOR_FONT_DEFAULTS.fontFamily),d=u(t.fontWeight,o.EDITOR_FONT_DEFAULTS.fontWeight),h=r(t.fontSize,o.EDITOR_FONT_DEFAULTS.fontSize);0===(h=a(h,0,100))?h=o.EDITOR_FONT_DEFAULTS.fontSize:h<8&&(h=8);var p=s(t.lineHeight,0);0===(p=a(p,0,150))?p=Math.round(l*h):p<8&&(p=8);var f=r(t.letterSpacing,0);f=a(f,-20,20);var g=1+.1*i.EditorZoom.getZoomLevel();return h*=g,p*=g,new e({zoomLevel:n,fontFamily:c,fontWeight:d,fontSize:h,lineHeight:p,letterSpacing:f})},e.prototype.getId=function(){return this.zoomLevel+"-"+this.fontFamily+"-"+this.fontWeight+"-"+this.fontSize+"-"+this.lineHeight+"-"+this.letterSpacing},e}();t.BareFontInfo=c;var d=function(e){function t(t,n){var i=e.call(this,t)||this;return i.isTrusted=n,i.isMonospace=t.isMonospace,i.typicalHalfwidthCharacterWidth=t.typicalHalfwidthCharacterWidth,i.typicalFullwidthCharacterWidth=t.typicalFullwidthCharacterWidth,i.spaceWidth=t.spaceWidth,i.maxDigitWidth=t.maxDigitWidth,i}return f(t,e),t.prototype.equals=function(e){return this.fontFamily===e.fontFamily&&this.fontWeight===e.fontWeight&&this.fontSize===e.fontSize&&this.lineHeight===e.lineHeight&&this.letterSpacing===e.letterSpacing&&this.typicalHalfwidthCharacterWidth===e.typicalHalfwidthCharacterWidth&&this.typicalFullwidthCharacterWidth===e.typicalFullwidthCharacterWidth&&this.spaceWidth===e.spaceWidth&&this.maxDigitWidth===e.maxDigitWidth},t}(c);t.FontInfo=d}),define(d[93],h([1,0,38,9,12,2,20,118,482,49,104,481,158,101,55]),function(e,t,n,i,o,r,s,a,u,l,c,d,h,p,f){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.LONG_LINE_BOUNDARY=1e4;var g=function(){function e(t,i){this._eventEmitter=new n.OrderGuaranteeEventEmitter;var o=e.resolveCreationData(t,i);this._isTooLargeForTokenization=o.text.length>e.MODEL_TOKENIZATION_LIMIT||o.text.lines.length>e.MANY_MANY_LINES,this._shouldSimplifyMode=this._isTooLargeForTokenization||o.text.length>e.MODEL_SYNC_LIMIT,this._options=new s.TextModelResolvedOptions(o.options),this._constructLines(o.text),this._setVersionId(1),this._isDisposed=!1,this._isDisposing=!1}return e.createFromString=function(t,n){return void 0===n&&(n=e.DEFAULT_CREATION_OPTIONS),new e(p.RawTextSource.fromString(t),n)},e.resolveCreationData=function(e,t){var n,i=p.TextSource.fromRawTextSource(e,t.defaultEOL);if(t.detectIndentation){var o=u.guessIndentation(i.lines,t.tabSize,t.insertSpaces);n=new s.TextModelResolvedOptions({tabSize:o.tabSize,insertSpaces:o.insertSpaces,trimAutoWhitespace:t.trimAutoWhitespace,defaultEOL:t.defaultEOL})}else n=new s.TextModelResolvedOptions({tabSize:t.tabSize,insertSpaces:t.insertSpaces,trimAutoWhitespace:t.trimAutoWhitespace,defaultEOL:t.defaultEOL});return{text:i,options:n}},e.prototype.addBulkListener=function(e){return this._eventEmitter.addBulkListener(e)},e.prototype._createModelLine=function(e,t){return this._isTooLargeForTokenization?new a.MinimalModelLine(e,t):new a.ModelLine(e,t)},e.prototype._assertNotDisposed=function(){if(this._isDisposed)throw new Error("Model is disposed!")},e.prototype.isTooLargeForHavingARichMode=function(){return this._shouldSimplifyMode},e.prototype.isTooLargeForTokenization=function(){return this._isTooLargeForTokenization},e.prototype.getOptions=function(){return this._assertNotDisposed(),this._options},e.prototype.updateOptions=function(e){this._assertNotDisposed();var t=void 0!==e.tabSize?e.tabSize:this._options.tabSize,n=void 0!==e.insertSpaces?e.insertSpaces:this._options.insertSpaces,i=void 0!==e.trimAutoWhitespace?e.trimAutoWhitespace:this._options.trimAutoWhitespace,o=new s.TextModelResolvedOptions({tabSize:t,insertSpaces:n,defaultEOL:this._options.defaultEOL,trimAutoWhitespace:i});if(!this._options.equals(o)){var r=this._options.createChangeEvent(o);if(this._options=o,r.tabSize)for(var a=this._options.tabSize,u=0,l=this._lines.length;u=t.LONG_LINE_BOUNDARY?r+=i:o+=i;return r>o},e.prototype.getLineCount=function(){return this._assertNotDisposed(),this._lines.length},e.prototype.getLineContent=function(e){if(this._assertNotDisposed(),e<1||e>this.getLineCount())throw new Error("Illegal value "+e+" for `lineNumber`");return this._lines[e-1].text},e.prototype.getIndentLevel=function(e){if(this._assertNotDisposed(),e<1||e>this.getLineCount())throw new Error("Illegal value "+e+" for `lineNumber`");return this._lines[e-1].getIndentLevel()},e.prototype._resetIndentRanges=function(){this._indentRanges=null},e.prototype._getIndentRanges=function(){return this._indentRanges||(this._indentRanges=d.computeRanges(this)),this._indentRanges},e.prototype.getIndentRanges=function(){this._assertNotDisposed();var e=this._getIndentRanges();return d.IndentRange.deepCloneArr(e)},e.prototype._toValidLineIndentGuide=function(e,t){var n=this._lines[e-1].getIndentLevel();if(-1===n)return t;var i=Math.ceil(n/this._options.tabSize);return Math.min(i,t)},e.prototype.getLineIndentGuide=function(e){if(this._assertNotDisposed(),e<1||e>this.getLineCount())throw new Error("Illegal value "+e+" for `lineNumber`");for(var t=this._getIndentRanges(),n=t.length-1;n>=0;n--){var i=t[n];if(i.startLineNumber===e)return this._toValidLineIndentGuide(e,Math.ceil(i.indent/this._options.tabSize));if(i.startLineNumber0;)(i=t[--n]).endLineNumber+1===e&&(o=i.indent);return this._toValidLineIndentGuide(e,Math.ceil(o/this._options.tabSize))}}return 0},e.prototype.getLinesContent=function(){this._assertNotDisposed();for(var e=[],t=0,n=this._lines.length;tthis.getLineCount())throw new Error("Illegal value "+e+" for `lineNumber`");return this._lines[e-1].text.length+1},e.prototype.getLineFirstNonWhitespaceColumn=function(e){if(this._assertNotDisposed(),e<1||e>this.getLineCount())throw new Error("Illegal value "+e+" for `lineNumber`");var t=i.firstNonWhitespaceIndex(this._lines[e-1].text);return-1===t?0:t+1},e.prototype.getLineLastNonWhitespaceColumn=function(e){if(this._assertNotDisposed(),e<1||e>this.getLineCount())throw new Error("Illegal value "+e+" for `lineNumber`");var t=i.lastNonWhitespaceIndex(this._lines[e-1].text);return-1===t?0:t+2},e.prototype.validateLineNumber=function(e){return this._assertNotDisposed(),e<1&&(e=1),e>this._lines.length&&(e=this._lines.length),e},e.prototype._validatePosition=function(e,t,n){var r=Math.floor("number"==typeof e?e:1),s=Math.floor("number"==typeof t?t:1);if(r<1)return new o.Position(1,1);if(r>this._lines.length)return new o.Position(this._lines.length,this.getLineMaxColumn(this._lines.length));if(s<=1)return new o.Position(r,1);var a=this.getLineMaxColumn(r);if(s>=a)return new o.Position(r,a);if(n){var u=this._lines[r-1].text.charCodeAt(s-2);if(i.isHighSurrogate(u))return new o.Position(r,s-1)}return new o.Position(r,s)},e.prototype.validatePosition=function(e){return this._assertNotDisposed(),this._validatePosition(e.lineNumber,e.column,!0)},e.prototype.validateRange=function(e){this._assertNotDisposed();var t=this._validatePosition(e.startLineNumber,e.startColumn,!1),n=this._validatePosition(e.endLineNumber,e.endColumn,!1),o=t.lineNumber,s=t.column,a=n.lineNumber,u=n.column,l=this._lines[o-1].text,c=this._lines[a-1].text,d=s>1?l.charCodeAt(s-2):0,h=u>1&&u<=c.length?c.charCodeAt(u-2):0,p=i.isHighSurrogate(d),f=i.isHighSurrogate(h);return p||f?o===a&&s===u?new r.Range(o,s-1,a,u-1):p&&f?new r.Range(o,s-1,a,u+1):p?new r.Range(o,s-1,a,u):new r.Range(o,s,a,u+1):new r.Range(o,s,a,u)},e.prototype.modifyPosition=function(e,t){return this._assertNotDisposed(),this.getPositionAt(this.getOffsetAt(e)+t)},e.prototype.getFullModelRange=function(){this._assertNotDisposed();var e=this.getLineCount();return new r.Range(1,1,e,this.getLineMaxColumn(e))},e.prototype._emitModelRawContentChangedEvent=function(e){this._isDisposing||this._eventEmitter.emit(f.TextModelEventType.ModelRawContentChanged2,e)},e.prototype._constructLines=function(e){for(var t=this._options.tabSize,n=e.lines,i=new Array(n.length),o=0,r=n.length;ot.endLineNumber||i.lineNumber===t.endLineNumber&&i.column>t.endColumn?new c(e.selectionStart,e.selectionStartLeftoverVisibleColumns,new n.Position(t.endLineNumber,t.endColumn),0):null},e.prototype.equals=function(e){return this.viewState.equals(e.viewState)&&this.modelState.equals(e.viewState)},e}();t.CursorState=h;var p=function(){return function(e,t){this.commands=e,this.shouldPushStackElementBefore=t.shouldPushStackElementBefore,this.shouldPushStackElementAfter=t.shouldPushStackElementAfter}}();t.EditOperationResult=p;var f=function(){function e(){}return e.isLowSurrogate=function(e,t,n){var o=e.getLineContent(t);return!(n<0||n>=o.length)&&i.isLowSurrogate(o.charCodeAt(n))},e.isHighSurrogate=function(e,t,n){var o=e.getLineContent(t);return!(n<0||n>=o.length)&&i.isHighSurrogate(o.charCodeAt(n))},e.isInsideSurrogatePair=function(e,t,n){return this.isHighSurrogate(e,t,n-2)},e.visibleColumnFromColumn=function(e,t,n){var i=e.length;i>t-1&&(i=t-1);for(var o=0,r=0;r=t)return s-ts?s:o},e.nextTabStop=function(e,t){return e+t-e%t},e.prevTabStop=function(e,t){return e-1-(e-1)%t},e}();t.CursorColumns=f}),define(d[167],h([1,0,9,39,2,22,43]),function(e,t,n,i,o,r,s){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var a=function(){function e(e,t){this._opts=t,this._selection=e,this._useLastEditRangeForCursorEndPosition=!1,this._selectionStartColumnStaysPut=!1}return e.unshiftIndentCount=function(e,t,n){var o=i.CursorColumns.visibleColumnFromColumn(e,t,n);return i.CursorColumns.prevTabStop(o,n)/n},e.shiftIndentCount=function(e,t,n){var o=i.CursorColumns.visibleColumnFromColumn(e,t,n);return i.CursorColumns.nextTabStop(o,n)/n},e.prototype._addEditOperation=function(e,t,n){this._useLastEditRangeForCursorEndPosition?e.addTrackedEditOperation(t,n):e.addEditOperation(t,n)},e.prototype.getEditOperations=function(t,r){var a=this._selection.startLineNumber,u=this._selection.endLineNumber;1===this._selection.endColumn&&a!==u&&(u-=1);var l=this._opts.tabSize,c=this._opts.oneIndent,d=a===u;if(this._selection.isEmpty()&&/^\s*$/.test(t.getLineContent(a))&&(this._useLastEditRangeForCursorEndPosition=!0),this._opts.useTabStops)for(var h=["",c],p=0,f=0,g=a;g<=u;g++,p=f){f=0;var m=t.getLineContent(g),v=n.firstNonWhitespaceIndex(m);if((!this._opts.isUnshift||0!==m.length&&0!==v)&&(d||this._opts.isUnshift||0!==m.length)){if(-1===v&&(v=m.length),g>1&&i.CursorColumns.visibleColumnFromColumn(m,v+1,l)%l!=0){var _=s.LanguageConfigurationRegistry.getRawEnterActionAtPosition(t,g-1,t.getLineMaxColumn(g-1));if(_){if(f=p,_.appendText)for(var y=0,C=_.appendText.length;ya,d=s>u,h=su)continue;if(ys)continue;if(_1&&o--,this.columnSelect(e,t,n.selection,i,o)},e.columnSelectRight=function(e,t,i,r,s){for(var a=0,u=Math.min(i.position.lineNumber,r),l=Math.max(i.position.lineNumber,r),c=u;c<=l;c++){var d=t.getLineMaxColumn(c),h=o.CursorColumns.visibleColumnFromColumn2(e,t,new n.Position(c,d));a=Math.max(a,h)}return st.getLineCount()&&(o=t.getLineCount()),this.columnSelect(e,t,n.selection,o,r)},e}();t.ColumnSelection=r}),define(d[169],h([1,0,39,12,2]),function(e,t,n,i,o){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){return function(e,t,n){this.lineNumber=e,this.column=t,this.leftoverVisibleColumns=n}}();t.CursorPosition=r;var s=function(){function e(){}return e.left=function(e,t,i,o){return o>t.getLineMinColumn(i)?n.CursorColumns.isLowSurrogate(t,i,o-2)?o-=2:o-=1:i>1&&(i-=1,o=t.getLineMaxColumn(i)),new r(i,o,0)},e.moveLeft=function(t,n,i,o,r){var s,a;if(i.hasSelection()&&!o)s=i.selection.startLineNumber,a=i.selection.startColumn;else{var u=e.left(t,n,i.position.lineNumber,i.position.column-(r-1));s=u.lineNumber,a=u.column}return i.move(o,s,a,0)},e.right=function(e,t,i,o){return oc?(i=c,u?o=t.getLineMaxColumn(i):(o=Math.min(t.getLineMaxColumn(i),o),n.CursorColumns.isInsideSurrogatePair(t,i,o)&&(o-=1))):(o=n.CursorColumns.columnFromVisibleColumn2(e,t,i,l),n.CursorColumns.isInsideSurrogatePair(t,i,o)&&(o-=1)),s=l-n.CursorColumns.visibleColumnFromColumn(t.getLineContent(i),o,e.tabSize),new r(i,o,s)},e.moveDown=function(t,n,i,o,r){var s,a;i.hasSelection()&&!o?(s=i.selection.endLineNumber,a=i.selection.endColumn):(s=i.position.lineNumber,a=i.position.column);var u=e.down(t,n,s,a,i.leftoverVisibleColumns,r,!0);return i.move(o,u.lineNumber,u.column,u.leftoverVisibleColumns)},e.translateDown=function(t,r,s){var a=s.selection,u=e.down(t,r,a.selectionStartLineNumber,a.selectionStartColumn,s.selectionStartLeftoverVisibleColumns,1,!1),l=e.down(t,r,a.positionLineNumber,a.positionColumn,s.leftoverVisibleColumns,1,!1);return new n.SingleCursorState(new o.Range(u.lineNumber,u.column,u.lineNumber,u.column),u.leftoverVisibleColumns,new i.Position(l.lineNumber,l.column),l.leftoverVisibleColumns)},e.up=function(e,t,i,o,s,a,u){var l=n.CursorColumns.visibleColumnFromColumn(t.getLineContent(i),o,e.tabSize)+s;return(i-=a)<1?(i=1,u?o=t.getLineMinColumn(i):(o=Math.min(t.getLineMaxColumn(i),o),n.CursorColumns.isInsideSurrogatePair(t,i,o)&&(o-=1))):(o=n.CursorColumns.columnFromVisibleColumn2(e,t,i,l),n.CursorColumns.isInsideSurrogatePair(t,i,o)&&(o-=1)),s=l-n.CursorColumns.visibleColumnFromColumn(t.getLineContent(i),o,e.tabSize),new r(i,o,s)},e.moveUp=function(t,n,i,o,r){var s,a;i.hasSelection()&&!o?(s=i.selection.startLineNumber,a=i.selection.startColumn):(s=i.position.lineNumber,a=i.position.column);var u=e.up(t,n,s,a,i.leftoverVisibleColumns,r,!0);return i.move(o,u.lineNumber,u.column,u.leftoverVisibleColumns)},e.translateUp=function(t,r,s){var a=s.selection,u=e.up(t,r,a.selectionStartLineNumber,a.selectionStartColumn,s.selectionStartLeftoverVisibleColumns,1,!1),l=e.up(t,r,a.positionLineNumber,a.positionColumn,s.leftoverVisibleColumns,1,!1);return new n.SingleCursorState(new o.Range(u.lineNumber,u.column,u.lineNumber,u.column),u.leftoverVisibleColumns,new i.Position(l.lineNumber,l.column),l.leftoverVisibleColumns)},e.moveToBeginningOfLine=function(e,t,n,i){var o,r=n.position.lineNumber,s=t.getLineMinColumn(r),a=t.getLineFirstNonWhitespaceColumn(r)||s;return o=n.position.column===a?s:a,n.move(i,r,o,0)},e.moveToEndOfLine=function(e,t,n,i){var o=n.position.lineNumber,r=t.getLineMaxColumn(o);return n.move(i,o,r,0)},e.moveToBeginningOfBuffer=function(e,t,n,i){return n.move(i,1,1,0)},e.moveToEndOfBuffer=function(e,t,n,i){var o=t.getLineCount(),r=t.getLineMaxColumn(o);return n.move(i,o,r,0)},e}();t.MoveOperations=s}),define(d[170],h([1,0,73,39,2,169,9]),function(e,t,n,i,o,r,s){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var a=function(){function e(){}return e.deleteRight=function(e,t,i){for(var s=[],a=!1,u=0,l=i.length;u1){var g=t.getLineContent(f.lineNumber),m=s.firstNonWhitespaceIndex(g),v=-1===m?g.length+1:m+1;if(f.column<=v){var _=i.CursorColumns.visibleColumnFromColumn2(e,t,f),y=i.CursorColumns.prevTabStop(_,e.tabSize),C=i.CursorColumns.columnFromVisibleColumn2(e,t,f.lineNumber,y);p=new o.Range(f.lineNumber,C,f.lineNumber,f.column)}else p=new o.Range(f.lineNumber,f.column-1,f.lineNumber,f.column)}else{var b=r.MoveOperations.left(e,t,f.lineNumber,f.column);p=new o.Range(b.lineNumber,b.column,f.lineNumber,f.column)}}p.isEmpty()?u[c]=null:(p.startLineNumber!==p.endLineNumber&&(l=!0),u[c]=new n.ReplaceCommand(p,""))}return[l,u]},e.cut=function(e,t,r){for(var s=[],a=0,u=r.length;a1?(d=c.lineNumber-1,h=t.getLineMaxColumn(c.lineNumber-1),p=c.lineNumber,f=t.getLineMaxColumn(c.lineNumber)):(d=c.lineNumber,h=1,p=c.lineNumber,f=t.getLineMaxColumn(c.lineNumber));var g=new o.Range(d,h,p,f);g.isEmpty()?s[a]=null:s[a]=new n.ReplaceCommand(g,"")}else s[a]=null;else s[a]=new n.ReplaceCommand(l,"")}return new i.EditOperationResult(s,{shouldPushStackElementBefore:!0,shouldPushStackElementAfter:!0})},e}();t.DeleteOperations=a}),define(d[119],h([1,0,10,73,39,2,9,167,43,60,441,94]),function(e,t,n,i,o,r,s,a,u,l,c,d){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var h=function(){function e(){}return e.indent=function(e,t,n){for(var i=[],o=0,r=n.length;o1){var d=i-1;for(d=i-1;d>=1;d--){var h=n.getLineContent(d);if(s.lastNonWhitespaceIndex(h)>=0)break}if(d<1)return null;var p=n.getLineMaxColumn(d),f=u.LanguageConfigurationRegistry.getEnterAction(n,new r.Range(d,p,d,p));f&&(a=f.indentation,(o=f.enterAction)&&(a+=o.appendText))}return o&&(o===l.IndentAction.Indent&&(a=e.shiftIndent(t,a)),o===l.IndentAction.Outdent&&(a=e.unshiftIndent(t,a)),a=t.normalizeIndentation(a)),a||null},e._replaceJumpToNextIndent=function(e,t,n,r){var s="",a=n.getStartPosition();if(e.insertSpaces)for(var u=o.CursorColumns.visibleColumnFromColumn2(e,t,a),l=e.tabSize,c=l-u%l,d=0;d=0?c.setEndPosition(c.endLineNumber,Math.max(c.endColumn,L+1)):c.setEndPosition(c.endLineNumber,n.getLineMaxColumn(c.endLineNumber)),a)return new i.ReplaceCommandWithoutChangingPosition(c,S+t.normalizeIndentation(_.afterEnter),!0);var x=0;return w<=L+1&&(t.insertSpaces||(b=Math.ceil(b/t.tabSize)),x=Math.min(b+1-t.normalizeIndentation(_.afterEnter).length-1,0)),new i.ReplaceCommandWithOffsetCursorState(c,S+t.normalizeIndentation(_.afterEnter),0,x,!0)}return e._typeCommand(c,"\n"+t.normalizeIndentation(C),a)},e._runAutoIndentType=function(t,n,i,o){var s=u.LanguageConfigurationRegistry.getIndentationAtPosition(n,i.startLineNumber,i.startColumn),a=u.LanguageConfigurationRegistry.getIndentActionForType(n,i,o,{shiftIndent:function(n){return e.shiftIndent(t,n)},unshiftIndent:function(n){return e.unshiftIndent(t,n)}});if(null===a)return null;if(a!==t.normalizeIndentation(s)){var l=n.getLineFirstNonWhitespaceColumn(i.startLineNumber);return 0===l?e._typeCommand(new r.Range(i.startLineNumber,0,i.endLineNumber,i.endColumn),t.normalizeIndentation(a)+o,!1):e._typeCommand(new r.Range(i.startLineNumber,0,i.endLineNumber,i.endColumn),t.normalizeIndentation(a)+n.getLineContent(i.startLineNumber).substring(l-1,i.startColumn-1)+o,!1)}return null},e._isAutoClosingCloseCharType=function(e,t,n,i){if(!e.autoClosingBrackets||!e.autoClosingPairsClose.hasOwnProperty(i))return!1;for(var o=0,r=n.length;o1){var h=d.getMapForWordSeparators(e.wordSeparators),p=c.charCodeAt(l.column-2);if(0===h.get(p))return!1}var f=c.charAt(l.column-1);if(f){var g=e.autoClosingPairsOpen[o]===o,m=!1;for(var v in e.autoClosingPairsClose){var _=e.autoClosingPairsOpen[v]===v;if((g||!_)&&f===v){m=!0;break}}if(!m&&!/\s/.test(f))return!1}t.forceTokenization(l.lineNumber);var y=t.getLineTokens(l.lineNumber),C=!1;try{C=u.LanguageConfigurationRegistry.shouldAutoClosePair(o,y,l.column)}catch(e){n.onUnexpectedError(e)}if(!C)return!1}return!0},e._runAutoClosingOpenCharType=function(e,t,n,r){for(var s=[],a=0,u=n.length;a=0;o--){var r=e.charCodeAt(o),s=t.get(r);if(0===s){if(2===i)return this._createWord(e,i,o+1,this._findEndOfWord(e,t,i,o+1));i=1}else if(2===s){if(1===i)return this._createWord(e,i,o+1,this._findEndOfWord(e,t,i,o+1));i=2}else if(1===s&&0!==i)return this._createWord(e,i,o+1,this._findEndOfWord(e,t,i,o+1))}return 0!==i?this._createWord(e,i,0,this._findEndOfWord(e,t,i,0)):null},e._findEndOfWord=function(e,t,n,i){for(var o=e.length,r=i;r=0;o--){var r=e.charCodeAt(o),s=t.get(r);if(1===s)return o+1;if(1===n&&2===s)return o+1;if(2===n&&0===s)return o+1}return 0},e.moveWordLeft=function(t,n,o,r){var s=o.lineNumber,a=o.column;1===a&&s>1&&(s-=1,a=n.getLineMaxColumn(s));var u=e._findPreviousWordOnLine(t,n,new i.Position(s,a));return 0===r?a=u?u.start+1:1:(u&&a<=u.end+1&&(u=e._findPreviousWordOnLine(t,n,new i.Position(s,u.start+1))),a=u?u.end+1:1),new i.Position(s,a)},e.moveWordRight=function(t,n,o,r){var s=o.lineNumber,a=o.column;a===n.getLineMaxColumn(s)&&s=u.start+1&&(u=e._findNextWordOnLine(t,n,new i.Position(s,u.end+1))),a=u?u.start+1:n.getLineMaxColumn(s)),new i.Position(s,a)},e._deleteWordLeftWhitespace=function(e,t){var n=e.getLineContent(t.lineNumber),i=t.column-2,o=r.lastNonWhitespaceIndex(n,i);return o+11?c=1:(l--,c=n.getLineMaxColumn(l)):(h&&c<=h.end+1&&(h=e._findPreviousWordOnLine(t,n,new i.Position(l,h.start+1))),h?c=h.end+1:c>1?c=1:(l--,c=n.getLineMaxColumn(l))),new s.Range(l,c,u.lineNumber,u.column)},e._findFirstNonWhitespaceChar=function(e,t){for(var n=e.length,i=t;i=f.start+1&&(f=e._findNextWordOnLine(t,n,new i.Position(l,f.end+1))),f?c=f.start+1:cc&&(d=c,h=e.model.getLineMaxColumn(d)),n.CursorState.fromModelState(new n.SingleCursorState(new o.Range(u.lineNumber,1,d,h),0,new i.Position(d,h),0))}var p=t.modelState.selectionStart.getStartPosition().lineNumber;if(u.lineNumberp){var c=e.viewModel.getLineCount(),f=l.lineNumber+1,g=1;return f>c&&(f=c,g=e.viewModel.getLineMaxColumn(f)),n.CursorState.fromViewState(t.viewState.move(t.modelState.hasSelection(),f,g,0))}var m=t.modelState.selectionStart.getEndPosition();return n.CursorState.fromModelState(t.modelState.move(t.modelState.hasSelection(),m.lineNumber,m.column,0))},e.word=function(e,t,i,o){var r=e.model.validatePosition(o);return n.CursorState.fromModelState(s.WordOperations.word(e.config,e.model,t.modelState,i,r))},e.cancelSelection=function(e,t){if(!t.modelState.hasSelection())return new n.CursorState(t.modelState,t.viewState);var r=t.viewState.position.lineNumber,s=t.viewState.position.column;return n.CursorState.fromViewState(new n.SingleCursorState(new o.Range(r,s,r,s),0,new i.Position(r,s),0))},e.moveTo=function(e,t,o,r,s){var a=e.model.validatePosition(r),u=s?e.validateViewPosition(new i.Position(s.lineNumber,s.column),a):e.convertModelPositionToViewPosition(a);return n.CursorState.fromViewState(t.viewState.move(o,u.lineNumber,u.column,0))},e.move=function(e,t,n){var i=n.select,o=n.value;switch(n.direction){case 0:return 4===n.unit?this._moveHalfLineLeft(e,t,i):this._moveLeft(e,t,i,o);case 1:return 4===n.unit?this._moveHalfLineRight(e,t,i):this._moveRight(e,t,i,o);case 2:return 2===n.unit?this._moveUpByViewLines(e,t,i,o):this._moveUpByModelLines(e,t,i,o);case 3:return 2===n.unit?this._moveDownByViewLines(e,t,i,o):this._moveDownByModelLines(e,t,i,o);case 4:return this._moveToViewMinColumn(e,t,i);case 5:return this._moveToViewFirstNonWhitespaceColumn(e,t,i);case 6:return this._moveToViewCenterColumn(e,t,i);case 7:return this._moveToViewMaxColumn(e,t,i);case 8:return this._moveToViewLastNonWhitespaceColumn(e,t,i);case 9:var r=t[0],s=e.getCompletelyVisibleModelRange(),a=this._firstLineNumberInRange(e.model,s,o),u=e.model.getLineFirstNonWhitespaceColumn(a);return[this._moveToModelPosition(e,r,i,a,u)];case 11:var r=t[0],s=e.getCompletelyVisibleModelRange(),a=this._lastLineNumberInRange(e.model,s,o),u=e.model.getLineFirstNonWhitespaceColumn(a);return[this._moveToModelPosition(e,r,i,a,u)];case 10:var r=t[0],s=e.getCompletelyVisibleModelRange(),a=Math.round((s.startLineNumber+s.endLineNumber)/2),u=e.model.getLineFirstNonWhitespaceColumn(a);return[this._moveToModelPosition(e,r,i,a,u)];case 12:for(var l=e.getCompletelyVisibleViewRange(),c=[],d=0,h=t.length;di.endLineNumber-1&&(r=i.endLineNumber-1),rn)for(var r=t-n,o=0;o=e+1&&this.lastAddedCursorIndex--,this.secondaryCursors[e].dispose(this.context),this.secondaryCursors.splice(e,1)},e.prototype._getAll=function(){var e=[];e[0]=this.primaryCursor;for(var t=0,n=this.secondaryCursors.length;tp&&t[S].index--;e.splice(p,1),t.splice(h,1),this._removeSecondaryCursor(p-1),s--}}}},e}();t.CursorCollection=r}),define(d[319],h([1,0,9,2,22,43,167,263,60]),function(e,t,n,i,o,r,s,a,u){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var l=function(){function e(e,t,n){this._selection=e,this._isMovingDown=t,this._autoIndent=n,this._moveEndLineSelectionShrink=!1}return e.prototype.getEditOperations=function(e,t){var s=e.getLineCount();if((!this._isMovingDown||this._selection.endLineNumber!==s)&&(this._isMovingDown||1!==this._selection.startLineNumber)){this._moveEndPositionDown=!1;var u=this._selection;u.startLineNumber=u.startLineNumber+1&&t<=u.endLineNumber+1?e.getLineContent(t-1):e.getLineContent(t)};var S=r.LanguageConfigurationRegistry.getGoodIndentForLine(h,e.getLanguageIdAtPosition(g,1),u.startLineNumber+1,d);if(null!==S){y=n.getLeadingWhitespace(e.getLineContent(u.startLineNumber));if((C=a.getSpaceCnt(S,l))!==(N=a.getSpaceCnt(y,l))){M=C-N;this.getIndentEditsOfMovingBlock(e,t,u,l,c,M)}}}}else t.addEditOperation(new i.Range(u.startLineNumber,1,u.startLineNumber,1),v+"\n")}else if(g=u.startLineNumber-1,m=e.getLineContent(g),t.addEditOperation(new i.Range(g,1,g+1,1),null),t.addEditOperation(new i.Range(u.endLineNumber,e.getLineMaxColumn(u.endLineNumber),u.endLineNumber,e.getLineMaxColumn(u.endLineNumber)),"\n"+m),this.isAutoIndent(e,u)){h.getLineContent=function(t){return t===g?e.getLineContent(u.startLineNumber):e.getLineContent(t)};var E=this.matchEnterRule(e,d,l,u.startLineNumber,u.startLineNumber-2);if(null!==E)0!==E&&this.getIndentEditsOfMovingBlock(e,t,u,l,c,E);else{var L=r.LanguageConfigurationRegistry.getGoodIndentForLine(h,e.getLanguageIdAtPosition(u.startLineNumber,1),g,d);if(null!==L){var x=n.getLeadingWhitespace(e.getLineContent(u.startLineNumber)),C=a.getSpaceCnt(L,l),N=a.getSpaceCnt(x,l);if(C!==N){var M=C-N;this.getIndentEditsOfMovingBlock(e,t,u,l,c,M)}}}}}this._selectionId=t.trackSelection(u)}},e.prototype.buildIndentConverter=function(e){return{shiftIndent:function(t){for(var n=s.ShiftCommand.shiftIndentCount(t,t.length+1,e),i="",o=0;o=1;){var h=void 0;if(h=d===l&&void 0!==c?c:e.getLineContent(d),n.lastNonWhitespaceIndex(h)>=0)break;d--}if(d<1||s>e.getLineCount())return null;var p=e.getLineMaxColumn(d),f=r.LanguageConfigurationRegistry.getEnterAction(e,new i.Range(d,p,d,p));if(f){var g=f.indentation,m=f.enterAction;m.indentAction===u.IndentAction.None?g=f.indentation+m.appendText:m.indentAction===u.IndentAction.Indent?g=f.indentation+m.appendText:m.indentAction===u.IndentAction.IndentOutdent?g=f.indentation:m.indentAction===u.IndentAction.Outdent&&(g=t.unshiftIndent(f.indentation)+m.appendText);var v=e.getLineContent(s);if(this.trimLeft(v).indexOf(this.trimLeft(g))>=0){var _=n.getLeadingWhitespace(e.getLineContent(s)),y=n.getLeadingWhitespace(g);return 2&r.LanguageConfigurationRegistry.getIndentMetadata(e,s)&&(y=t.unshiftIndent(y)),a.getSpaceCnt(y,o)-a.getSpaceCnt(_,o)}}return null},e.prototype.trimLeft=function(e){return e.replace(/^\s+/,"")},e.prototype.isAutoIndent=function(e,t){if(!this._autoIndent)return!1;var n=e.getLanguageIdAtPosition(t.startLineNumber,1);return n===e.getLanguageIdAtPosition(t.endLineNumber,1)&&null!==r.LanguageConfigurationRegistry.getIndentRulesSupport(n)},e.prototype.getIndentEditsOfMovingBlock=function(e,t,o,r,s,u){for(var l=o.startLineNumber;l<=o.endLineNumber;l++){var c=e.getLineContent(l),d=n.getLeadingWhitespace(c),h=a.getSpaceCnt(d,r)+u,p=a.generateIndent(h,r,s);p!==d&&(t.addEditOperation(new i.Range(l,1,l,d.length+1),p),l===o.endLineNumber&&o.endColumn<=d.length+1&&""===p&&(this._moveEndLineSelectionShrink=!0))}},e.prototype.computeCursorState=function(e,t){var n=t.getTrackedSelection(this._selectionId);return this._moveEndPositionDown&&(n=n.setEndPosition(n.endLineNumber+1,1)),this._moveEndLineSelectionShrink&&n.startLineNumber1)return;var a=new s.Range(o.lineNumber,o.column,o.lineNumber,o.column);this.emitCursorRevealRange(a,t,n)},t.prototype.emitCursorRevealRange=function(e,t,n){this._emit([new m.ViewRevealRangeRequestEvent(e,t,n)])},t.prototype.trigger=function(e,t,n){var i=u.Handler;if(t!==i.CompositionStart)if(t!==i.CompositionEnd){var r=new C(this._model,this),s=g.CursorChangeReason.NotSet;this._cursors.ensureValidState(),this._isHandling=!0;try{switch(t){case i.Type:this._type(e,n.text);break;case i.ReplacePreviousChar:this._replacePreviousChar(n.text,n.replaceCharCnt);break;case i.Paste:s=g.CursorChangeReason.Paste,this._paste(n.text,n.pasteOnNewLine);break;case i.Cut:this._cut();break;case i.Undo:s=g.CursorChangeReason.Undo,this._interpretCommandResult(this._model.undo());break;case i.Redo:s=g.CursorChangeReason.Redo,this._interpretCommandResult(this._model.redo());break;case i.ExecuteCommand:this._externalExecuteCommand(n);break;case i.ExecuteCommands:this._externalExecuteCommands(n)}}catch(e){o.onUnexpectedError(e)}this._isHandling=!1,this._emitStateChangedIfNecessary(e,s,r)&&this._revealRange(0,0,!0)}else this._isDoingComposition=!1;else this._isDoingComposition=!0},t.prototype._type=function(e,t){if(this._isDoingComposition||"keyboard"!==e)this._executeEditOperation(h.TypeOperations.typeWithoutInterceptors(this.context.config,this.context.model,this.getSelections(),t));else for(var n=0,o=t.length;n0&&(h[0]._isTracked=!0);var p=e.model.pushEditOperations(e.selectionsBefore,h,function(n){for(var i=[],o=0;o0?(i[n].sort(s),u[n]=t[n].computeCursorState(e.model,{getInverseEditOperations:function(){return i[n]},getTrackedSelection:function(t){var n=parseInt(t,10),i=e.model._getMarker(e.selectionStartMarkers[n]),o=e.model._getMarker(e.positionMarkers[n]);return new a.Selection(i.lineNumber,i.column,o.lineNumber,o.column)}})):u[n]=e.selectionsBefore[n]}(o);return u}),f=[];for(var g in d)d.hasOwnProperty(g)&&f.push(parseInt(g,10));f.sort(function(e,t){return t-e});for(u=0;uo.identifier.major?i.identifier.major:o.identifier.major).toString()]=!0;for(var a=0;a0&&n--}}return t},e}()}),define(d[322],h([6,8]),function(e,t){return e.create("vs/editor/common/model/textModelWithTokens",t)}),define(d[323],h([1,0,322,10,426,93,17,68,91,98,43,95,55]),function(e,t,n,i,o,r,s,a,u,l,c,d,h){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var p=function(){function e(){this._ranges=[]}return e.prototype.registerChangedTokens=function(e){var t=this._ranges,n=t.length,i=n>0?t[n-1]:null;i&&i.toLineNumber===e-1?i.toLineNumber++:t[n]={fromLineNumber:e,toLineNumber:e}},e.prototype.build=function(){return 0===this._ranges.length?null:{ranges:this._ranges}},e}(),g=function(e){function t(t,n,i){var o=e.call(this,t,n)||this;return o._languageIdentifier=i||a.NULL_LANGUAGE_IDENTIFIER,o._tokenizationListener=s.TokenizationRegistry.onDidChange(function(e){-1!==e.changedLanguages.indexOf(o._languageIdentifier.language)&&(o._resetTokenizationState(),o.emitModelTokensChangedEvent({ranges:[{fromLineNumber:1,toLineNumber:o.getLineCount()}]}))}),o._revalidateTokensTimeout=-1,o._resetTokenizationState(),o}return f(t,e),t.prototype.dispose=function(){this._tokenizationListener.dispose(),this._clearTimers(),this._lastState=null,e.prototype.dispose.call(this)},t.prototype._shouldAutoTokenize=function(){return!1},t.prototype._resetValue=function(t){e.prototype._resetValue.call(this,t),this._resetTokenizationState()},t.prototype._resetTokenizationState=function(){this._clearTimers();for(var e=0;ethis.getLineCount())throw new Error("Illegal value "+e+" for `lineNumber`");this._withModelTokensChangedEventBuilder(function(n){t._updateTokensUntilLine(n,e)})},t.prototype.getLineTokens=function(e){if(e<1||e>this.getLineCount())throw new Error("Illegal value "+e+" for `lineNumber`");return this._getLineTokens(e)},t.prototype._getLineTokens=function(e){return this._lines[e-1].getTokens(this._languageIdentifier.id)},t.prototype.getLanguageIdentifier=function(){return this._languageIdentifier},t.prototype.getModeId=function(){return this._languageIdentifier.language},t.prototype.setMode=function(e){if(this._languageIdentifier.id!==e.id){var t={oldLanguage:this._languageIdentifier.language,newLanguage:e.language};this._languageIdentifier=e,this._resetTokenizationState(),this.emitModelTokensChangedEvent({ranges:[{fromLineNumber:1,toLineNumber:this.getLineCount()}]}),this._emitModelModeChangedEvent(t)}},t.prototype.getLanguageIdAtPosition=function(e,t){if(!this._tokenizationSupport)return this._languageIdentifier.id;var n=this.validatePosition({lineNumber:e,column:t}),i=n.lineNumber,o=n.column;return this._getLineTokens(i).findTokenAtOffset(o-1).languageId},t.prototype._invalidateLine=function(e){this._lines[e].setIsInvalid(!0),e=200){t=n-1;break}this._revalidateTokensNow(t),this._invalidLineStartIndex20){e=c-1;break}if(a=t._lines[c-1].text.length,s>0&&(u=i/s*a,i+u>20)){e=c-1;break}t._updateTokensUntilLine(n,c),s+=a,c=Math.max(c,t._invalidLineStartIndex+1)}i=l.elapsed(),t._invalidLineStartIndex=1;r--){var s=this._getLineTokens(r),a=this._lines[r-1].text,c=void 0,d=void 0;for(r===t.lineNumber?(c=s.findTokenAtOffset(t.column-1),d=t.column-1):(c=s.lastToken())&&(d=c.endOffset);c;){if(c.languageId===n&&!u.ignoreBracketsInToken(c.tokenType))for(;;){var h=l.BracketsUtils.findPrevBracketInToken(i,r,a,c.startOffset,d);if(!h)break;var p=a.substring(h.startColumn-1,h.endColumn-1);if((p=p.toLowerCase())===e.open?o++:p===e.close&&o--,0===o)return h;d=h.startColumn-1}(c=c.prev())&&(d=c.endOffset)}}return null},t.prototype._findMatchingBracketDown=function(e,t){for(var n=e.languageIdentifier.id,i=e.forwardRegex,o=1,r=t.lineNumber,s=this.getLineCount();r<=s;r++){var a=this._getLineTokens(r),c=this._lines[r-1].text,d=void 0,h=void 0;for(r===t.lineNumber?(d=a.findTokenAtOffset(t.column-1),h=t.column-1):(d=a.firstToken())&&(h=d.startOffset);d;){if(d.languageId===n&&!u.ignoreBracketsInToken(d.tokenType))for(;;){var p=l.BracketsUtils.findNextBracketInToken(i,r,c,h,d.endOffset);if(!p)break;var f=c.substring(p.startColumn-1,p.endColumn-1);if((f=f.toLowerCase())===e.open?o++:f===e.close&&o--,0===o)return p;h=p.endColumn-1}(d=d.next())&&(h=d.startOffset)}}return null},t.prototype.findPrevBracket=function(e){for(var t=this.validatePosition(e),n=-1,i=null,o=t.lineNumber;o>=1;o--){var r=this._getLineTokens(o),s=this._lines[o-1].text,a=void 0,d=void 0;for(o===t.lineNumber?(a=r.findTokenAtOffset(t.column-1),d=t.column-1):(a=r.lastToken())&&(d=a.endOffset);a;){if(n!==a.languageId&&(n=a.languageId,i=c.LanguageConfigurationRegistry.getBracketsSupport(n)),i&&!u.ignoreBracketsInToken(a.tokenType)){var h=l.BracketsUtils.findPrevBracketInToken(i.reversedRegex,o,s,a.startOffset,d);if(h)return this._toFoundBracket(i,h)}(a=a.prev())&&(d=a.endOffset)}}return null},t.prototype.findNextBracket=function(e){for(var t=this.validatePosition(e),n=-1,i=null,o=t.lineNumber,r=this.getLineCount();o<=r;o++){var s=this._getLineTokens(o),a=this._lines[o-1].text,d=void 0,h=void 0;for(o===t.lineNumber?(d=s.findTokenAtOffset(t.column-1),h=t.column-1):(d=s.firstToken())&&(h=d.startOffset);d;){if(n!==d.languageId&&(n=d.languageId,i=c.LanguageConfigurationRegistry.getBracketsSupport(n)),i&&!u.ignoreBracketsInToken(d.tokenType)){var p=l.BracketsUtils.findNextBracketInToken(i.forwardRegex,o,a,h,d.endOffset);if(p)return this._toFoundBracket(i,p)}(d=d.next())&&(h=d.startOffset)}}return null},t.prototype._toFoundBracket=function(e,t){if(!t)return null;var n=this.getValueInRange(t);n=n.toLowerCase();var i=e.textIsBracket[n];return i?{range:t,open:i.open,close:i.close,isOpen:e.textIsOpenBracket[n]}:null},t.MODE_TOKENIZATION_FAILED_MSG=n.localize(0,null),t}(r.TextModel);t.TextModelWithTokens=g}),define(d[324],h([1,0,108,12,118,323]),function(e,t,n,i,o,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var s=0,a=function(e){function t(t,i,o){var r=e.call(this,t,i,o)||this;return r._markerIdGenerator=new n.IdGenerator(++s+";"),r._markerIdToMarker=Object.create(null),r}return f(t,e),t.prototype.dispose=function(){this._markerIdToMarker=null,e.prototype.dispose.call(this)},t.prototype._resetValue=function(t){e.prototype._resetValue.call(this,t),this._markerIdToMarker=Object.create(null)},t.prototype._addMarker=function(e,t,n,r){var s=this.validatePosition(new i.Position(t,n)),a=new o.LineMarker(this._markerIdGenerator.nextId(),e,s,r);return this._markerIdToMarker[a.id]=a,this._lines[s.lineNumber-1].addMarker(a),a.id},t.prototype._addMarkers=function(e){if(0===e.length)return[];for(var t=[],n=0,i=e.length;nthis.getLineCount()?[]:this.getLinesDecorations(e,e,t,n)},t.prototype._getMultiLineDecorations=function(e,t,n){var i=e.startLineNumber,o=e.startColumn,r=e.endLineNumber,s=e.endColumn,a=[];for(var u in this._multiLineDecorationsMap){var l=this._multiLineDecorationsMap[u];if((!t||!l.ownerId||l.ownerId===t)&&(!n||!l.isForValidation)){var c=l.range;c.startLineNumber>r||c.startLineNumber===r&&c.startColumn>s||c.endLineNumberr||g.startLineNumber===r&&g.startColumn>s||g.endLineNumber0){var p={addedDecorations:[],changedDecorations:i,removedDecorations:[]};this.emitModelDecorationsChangedEvent(p)}}},t._createRangeFromMarkers=function(e,t){return t.isBefore(e)?new r.Range(e.lineNumber,e.column,e.lineNumber,e.column):new r.Range(e.lineNumber,e.column,t.lineNumber,t.column)},t.prototype._acquireDecorationsTracker=function(){return 0===this._currentDecorationsTrackerCnt&&(this._currentDecorationsTracker=new g),this._currentDecorationsTrackerCnt++,this._currentDecorationsTracker},t.prototype._releaseDecorationsTracker=function(){if(this._currentDecorationsTrackerCnt--,0===this._currentDecorationsTrackerCnt){var e=this._currentDecorationsTracker;this._currentDecorationsTracker=null,this._handleTrackedDecorations(e)}},t.prototype._handleTrackedDecorations=function(e){if(0!==e.addedDecorationsLen||0!==e.changedDecorationsLen||0!==e.removedDecorationsLen){var t={addedDecorations:e.addedDecorations,changedDecorations:e.changedDecorations,removedDecorations:e.removedDecorations};this.emitModelDecorationsChangedEvent(t)}},t.prototype.emitModelDecorationsChangedEvent=function(e){this._isDisposing||this._eventEmitter.emit(c.TextModelEventType.ModelDecorationsChanged,e)},t.prototype._normalizeDeltaDecorations=function(e){for(var t=[],n=0,i=e.length;n0&&this._removeMarkers(n)},t.prototype._resolveOldDecorations=function(e){for(var t=[],n=0,i=e.length;n0?(d.push(f),l++):p.options.equals(f.options)?(s[f.index]=p.id,a++,l++):(h.push(p.id),a++)}for(;a0&&this._removeDecorationsImpl(e,h),d.length>0)for(var m=this._addDecorationsImpl(e,t,d),v=0,_=d.length;v<_;v++)s[d[v].index]=m[v];return s},t}(l.TextModelWithMarkers);t.TextModelWithDecorations=_;var y=function(){function e(e){this.color=o.empty,this.darkColor=o.empty,this.hcColor=o.empty,this.position=s.OverviewRulerLane.Center,e&&e.color&&(this.color=e.color),e&&e.darkColor&&(this.darkColor=e.darkColor,this.hcColor=e.darkColor),e&&e.hcColor&&(this.hcColor=e.hcColor),e&&e.hasOwnProperty("position")&&(this.position=e.position)}return e.prototype.equals=function(e){return this.color===e.color&&this.darkColor===e.darkColor&&this.hcColor===e.hcColor&&this.position===e.position},e}();t.ModelDecorationOverviewRulerOptions=y;var C=0,b=function(){function e(e,t){this.staticId=e,this.stickiness=t.stickiness||s.TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges,this.className=t.className?h(t.className):o.empty,this.hoverMessage=t.hoverMessage||[],this.glyphMarginHoverMessage=t.glyphMarginHoverMessage||o.empty,this.isWholeLine=t.isWholeLine||!1,this.showIfCollapsed=t.showIfCollapsed||!1,this.overviewRuler=new y(t.overviewRuler),this.glyphMarginClassName=t.glyphMarginClassName?h(t.glyphMarginClassName):o.empty,this.linesDecorationsClassName=t.linesDecorationsClassName?h(t.linesDecorationsClassName):o.empty,this.marginClassName=t.marginClassName?h(t.marginClassName):o.empty,this.inlineClassName=t.inlineClassName?h(t.inlineClassName):o.empty,this.beforeContentClassName=t.beforeContentClassName?h(t.beforeContentClassName):o.empty,this.afterContentClassName=t.afterContentClassName?h(t.afterContentClassName):o.empty,t.__extraOptions&&(this.extraOptions=t.__extraOptions)}return e.register=function(t){return new e(++C,t)},e.createDynamic=function(t){return new e(0,t)},e.prototype.equals=function(e){return this.staticId>0||e.staticId>0?this.staticId===e.staticId:this.stickiness===e.stickiness&&this.className===e.className&&this.isWholeLine===e.isWholeLine&&this.showIfCollapsed===e.showIfCollapsed&&this.glyphMarginClassName===e.glyphMarginClassName&&this.linesDecorationsClassName===e.linesDecorationsClassName&&this.marginClassName===e.marginClassName&&this.inlineClassName===e.inlineClassName&&this.beforeContentClassName===e.beforeContentClassName&&this.afterContentClassName===e.afterContentClassName&&i.markedStringsEquals(this.hoverMessage,e.hoverMessage)&&i.markedStringsEquals(this.glyphMarginHoverMessage,e.glyphMarginHoverMessage)&&this.overviewRuler.equals(e.overviewRuler)&&this.extraOptions===e.extraOptions},e}();t.ModelDecorationOptions=b,b.EMPTY=b.register({});var w=function(){return function(e,t,n){this.index=e,this.range=t,this.options=n}}()}),define(d[326],h([1,0,2,20,475,34,9,33,12,101,93,55]),function(e,t,n,i,o,r,s,a,u,l,c,d){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var h=function(e){function t(t,n,i){var r=e.call(this,t,n,i)||this;return r._commandManager=new o.EditStack(r),r._isUndoing=!1,r._isRedoing=!1,r._hasEditableRange=!1,r._editableRangeId=null,r._trimAutoWhitespaceLines=null,r}return f(t,e),t.createFromString=function(e,n,i){return void 0===n&&(n=c.TextModel.DEFAULT_CREATION_OPTIONS),void 0===i&&(i=null),new t(l.RawTextSource.fromString(e),n,i)},t.prototype.onDidChangeRawContent=function(e){return this._eventEmitter.addListener(d.TextModelEventType.ModelRawContentChanged2,e)},t.prototype.onDidChangeContent=function(e){return this._eventEmitter.addListener(d.TextModelEventType.ModelContentChanged,e)},t.prototype.dispose=function(){this._commandManager=null,e.prototype.dispose.call(this)},t.prototype._resetValue=function(t){e.prototype._resetValue.call(this,t),this._commandManager=new o.EditStack(this),this._hasEditableRange=!1,this._editableRangeId=null,this._trimAutoWhitespaceLines=null},t.prototype.pushStackElement=function(){this._commandManager.pushStackElement()},t.prototype.pushEditOperations=function(e,t,n){try{return this._eventEmitter.beginDeferredEmit(),this._pushEditOperations(e,t,n)}finally{this._eventEmitter.endDeferredEmit()}},t.prototype._pushEditOperations=function(e,t,i){var o=this;if(this._options.trimAutoWhitespace&&this._trimAutoWhitespaceLines){for(var r=t.map(function(e){return{range:o.validateRange(e.range),text:e.text}}),s=!0,a=0,u=e.length;al.endLineNumber,f=l.startLineNumber>_.endLineNumber;if(!p&&!f){c=!0;break}}if(!c){s=!1;break}}if(s)for(var a=0,u=this._trimAutoWhitespaceLines.length;a_.endLineNumber)&&!(g===_.startLineNumber&&_.startColumn===m&&_.isEmpty()&&y&&y.length>0&&"\n"===y.charAt(0))){v=!1;break}}v&&t.push({identifier:null,range:new n.Range(g,1,g,m),text:null,forceMoveMarkers:!1,isAutoWhitespaceEdit:!1})}this._trimAutoWhitespaceLines=null}return this._commandManager.pushEditOperation(e,t,i)},t.prototype._reduceOperations=function(e){return e.length<1e3?e:[this._toSingleEditOperation(e)]},t.prototype._toSingleEditOperation=function(e){for(var t=!1,i=e[0].range,o=e[e.length-1].range,r=new n.Range(i.startLineNumber,i.startColumn,o.endLineNumber,o.endColumn),s=i.startLineNumber,a=i.startColumn,u=[],l=0,c=e.length;l0){_.sort(function(e,t){return t.lineNumber-e.lineNumber}),this._trimAutoWhitespaceLines=[];for(var u=0,w=_.length;u0&&_[u-1].lineNumber===S)){var E=_[u].oldContent,L=this.getLineContent(S);0!==L.length&&L!==E&&-1===s.firstNonWhitespaceIndex(L)&&this._trimAutoWhitespaceLines.push(S)}}}return v},t._getInverseEditRanges=function(e){for(var t,i,o=[],r=null,s=0,a=e.length;s0){var h=u.lines.length,p=u.lines[0],f=u.lines[h-1];d=1===h?new n.Range(l,c,l,c+p.length):new n.Range(l,c,l+h-1,f.length+1)}else d=new n.Range(l,c,l,c);t=d.endLineNumber,i=d.endColumn,o.push(d),r=u}return o},t.prototype._doApplyEdits=function(e,i){var o=this,r=this._options.tabSize;i.sort(t._sortOpsDescending);for(var s=[],l=[],c=[],h=function(){if(0!==c.length){c.reverse();for(var t=c[0].lineNumber,n=0,i=1,a=c.length;i=0;D--){var x=y+D;!function(e){e.startColumn===e.endColumn&&0===e.text.length||c.push(e)}({lineNumber:x,startColumn:x===y?C:1,endColumn:x===b?w:this.getLineMaxColumn(x),text:_.lines?_.lines[D]:"",forceMoveMarkers:_.forceMoveMarkers})}if(L0},Object.defineProperty(t.prototype,"uri",{get:function(){return this._associatedResource},enumerable:!0,configurable:!0}),t}(i.EditableTextModel);t.Model=u}),define(d[179],h([1,0,12,22,2,104,86,57,34]),function(e,t,n,i,o,r,s,a,u){"use strict";function l(e,t,n,i,o,r,s){var a=e.createLineMapping(t,n,i,o,r);return null===a?s?p.INSTANCE:f.INSTANCE:new g(a,s)}Object.defineProperty(t,"__esModule",{value:!0});var c=function(){return function(e,t){this.outputLineIndex=e,this.outputOffset=t}}();t.OutputPosition=c;var d=function(){function e(e){this._lines=e}return e.prototype.convertViewPositionToModelPosition=function(e){return this._lines.convertViewPositionToModelPosition(e.lineNumber,e.column)},e.prototype.convertViewRangeToModelRange=function(e){var t=this._lines.convertViewPositionToModelPosition(e.startLineNumber,e.startColumn),n=this._lines.convertViewPositionToModelPosition(e.endLineNumber,e.endColumn);return new o.Range(t.lineNumber,t.column,n.lineNumber,n.column)},e.prototype.convertViewSelectionToModelSelection=function(e){var t=this._lines.convertViewPositionToModelPosition(e.selectionStartLineNumber,e.selectionStartColumn),n=this._lines.convertViewPositionToModelPosition(e.positionLineNumber,e.positionColumn);return new i.Selection(t.lineNumber,t.column,n.lineNumber,n.column)},e.prototype.validateViewPosition=function(e,t){return this._lines.validateViewPosition(e.lineNumber,e.column,t)},e.prototype.validateViewRange=function(e,t){var n=this._lines.validateViewPosition(e.startLineNumber,e.startColumn,t.getStartPosition()),i=this._lines.validateViewPosition(e.endLineNumber,e.endColumn,t.getEndPosition());return new o.Range(n.lineNumber,n.column,i.lineNumber,i.column)},e.prototype.convertModelPositionToViewPosition=function(e){return this._lines.convertModelPositionToViewPosition(e.lineNumber,e.column)},e.prototype.convertModelRangeToViewRange=function(e){var t=this._lines.convertModelPositionToViewPosition(e.startLineNumber,e.startColumn),n=this._lines.convertModelPositionToViewPosition(e.endLineNumber,e.endColumn);return new o.Range(t.lineNumber,t.column,n.lineNumber,n.column)},e.prototype.convertModelSelectionToViewSelection=function(e){var t=this._lines.convertModelPositionToViewPosition(e.selectionStartLineNumber,e.selectionStartColumn),n=this._lines.convertModelPositionToViewPosition(e.positionLineNumber,e.positionColumn);return new i.Selection(t.lineNumber,t.column,n.lineNumber,n.column)},e.prototype.modelPositionIsVisible=function(e){return this._lines.modelPositionIsVisible(e.lineNumber,e.column)},e}();t.CoordinatesConverter=d;var h=function(){function e(e,t,n,i,o,r){this.model=e,this._validModelVersionId=-1,this.tabSize=n,this.wrappingColumn=i,this.columnsForFullWidthChar=o,this.wrappingIndent=r,this.linePositionMapperFactory=t,this._constructLines(!0)}return e.prototype.dispose=function(){this.hiddenAreasIds=this.model.deltaDecorations(this.hiddenAreasIds,[])},e.prototype.createCoordinatesConverter=function(){return new d(this)},e.prototype._ensureValidState=function(){if(this.model.getVersionId()!==this._validModelVersionId)throw new Error("SplitLinesCollection: attempt to access a 'newer' model")},e.prototype._constructLines=function(e){var t=this;this.lines=[],e&&(this.hiddenAreasIds=[]);for(var n=this.model.getLinesContent(),i=n.length,s=new Uint32Array(i),a=this.hiddenAreasIds.map(function(e){return t.model.getDecorationRange(e)}).sort(o.Range.compareRangesUsingStarts),u=1,c=0,d=-1,h=d+1=u&&f<=c,m=l(this.linePositionMapperFactory,n[p],this.tabSize,this.wrappingColumn,this.columnsForFullWidthChar,this.wrappingIndent,!g);s[p]=m.getViewLineCount(),this.lines[p]=m}this._validModelVersionId=this.model.getVersionId(),this.prefixSumComputer=new r.PrefixSumComputerWithCache(s)},e.prototype.getHiddenAreas=function(){var e=this;return this.hiddenAreasIds.map(function(t){return e.model.getDecorationRange(t)}).sort(o.Range.compareRangesUsingStarts)},e.prototype._reduceRanges=function(e){var t=this;if(0===e.length)return[];for(var n=e.map(function(e){return t.model.validateRange(e)}).sort(o.Range.compareRangesUsingStarts),i=[],r=n[0].startLineNumber,s=n[0].endLineNumber,a=1,u=n.length;as+1?(i.push(new o.Range(r,1,s,1)),r=l.startLineNumber,s=l.endLineNumber):l.endLineNumber>s&&(s=l.endLineNumber)}return i.push(new o.Range(r,1,s,1)),i},e.prototype.setHiddenAreas=function(e){var t=this,n=this._reduceRanges(e),i=this.hiddenAreasIds.map(function(e){return t.model.getDecorationRange(e)}).sort(o.Range.compareRangesUsingStarts);if(n.length===i.length){for(var r=!1,s=0;s=c&&f<=d?this.lines[s].isVisible()&&(this.lines[s]=this.lines[s].setVisible(!1),g=!0):this.lines[s].isVisible()||(this.lines[s]=this.lines[s].setVisible(!0),g=!0),g){var m=this.lines[s].getViewLineCount();this.prefixSumComputer.changeValue(s,m)}}return!0},e.prototype.modelPositionIsVisible=function(e,t){return!(e<1||e>this.lines.length)&&this.lines[e-1].isVisible()},e.prototype.setTabSize=function(e){return this.tabSize!==e&&(this.tabSize=e,this._constructLines(!1),!0)},e.prototype.setWrappingSettings=function(e,t,n){return(this.wrappingIndent!==e||this.wrappingColumn!==t||this.columnsForFullWidthChar!==n)&&(this.wrappingIndent=e,this.wrappingColumn=t,this.columnsForFullWidthChar=n,this._constructLines(!1),!0)},e.prototype.onModelFlushed=function(){this._constructLines(!0)},e.prototype.onModelLinesDeleted=function(e,t,n){if(e<=this._validModelVersionId)return null;var i=1===t?1:this.prefixSumComputer.getAccumulatedValue(t-2)+1,o=this.prefixSumComputer.getAccumulatedValue(n-1);return this.lines.splice(t-1,n-t+1),this.prefixSumComputer.removeValues(t-1,n-t+1),new a.ViewLinesDeletedEvent(i,o)},e.prototype.onModelLinesInserted=function(e,t,i,o){if(e<=this._validModelVersionId)return null;for(var r=this.getHiddenAreas(),s=!1,u=new n.Position(t,1),c=0;cu?(m=(g=(h=(d=1===t?1:this.prefixSumComputer.getAccumulatedValue(t-2)+1)+u-1)+1)+(o-u)-1,c=!0):ot?t:e},e.prototype.warmUpLookupCache=function(e,t){this.prefixSumComputer.warmUpCache(e-1,t-1)},e.prototype.getViewLineIndentGuide=function(e){this._ensureValidState(),e=this._toValidViewLineNumber(e);var t=this.prefixSumComputer.getIndexOf(e-1);return this.model.getLineIndentGuide(t.index+1)},e.prototype.getViewLineContent=function(e){this._ensureValidState(),e=this._toValidViewLineNumber(e);var t=this.prefixSumComputer.getIndexOf(e-1),n=t.index,i=t.remainder;return this.lines[n].getViewLineContent(this.model,n+1,i)},e.prototype.getViewLineMinColumn=function(e){this._ensureValidState(),e=this._toValidViewLineNumber(e);var t=this.prefixSumComputer.getIndexOf(e-1),n=t.index,i=t.remainder;return this.lines[n].getViewLineMinColumn(this.model,n+1,i)},e.prototype.getViewLineMaxColumn=function(e){this._ensureValidState(),e=this._toValidViewLineNumber(e);var t=this.prefixSumComputer.getIndexOf(e-1),n=t.index,i=t.remainder;return this.lines[n].getViewLineMaxColumn(this.model,n+1,i)},e.prototype.getViewLineData=function(e){this._ensureValidState(),e=this._toValidViewLineNumber(e);var t=this.prefixSumComputer.getIndexOf(e-1),n=t.index,i=t.remainder;return this.lines[n].getViewLineData(this.model,n+1,i)},e.prototype.getViewLinesData=function(e,t,n){this._ensureValidState(),e=this._toValidViewLineNumber(e),t=this._toValidViewLineNumber(t);for(var i=this.prefixSumComputer.getIndexOf(e-1),o=e,r=i.index,s=i.remainder,a=[],u=r,l=this.model.getLineCount();ut&&(p=!0,h=t-o+1);var f=d+h;if(c.getViewLinesData(this.model,u+1,d,f,o-e,n,a),o+=h,p)break}}return a},e.prototype.validateViewPosition=function(e,t,i){this._ensureValidState(),e=this._toValidViewLineNumber(e);var o=this.prefixSumComputer.getIndexOf(e-1),r=o.index,s=o.remainder,a=this.lines[r],u=a.getViewLineMinColumn(this.model,r+1,s),l=a.getViewLineMaxColumn(this.model,r+1,s);tl&&(t=l);var c=a.getModelColumnOfViewPosition(s,t);return this.model.validatePosition(new n.Position(r+1,c)).equals(i)?new n.Position(e,t):this.convertModelPositionToViewPosition(i.lineNumber,i.column)},e.prototype.convertViewPositionToModelPosition=function(e,t){this._ensureValidState(),e=this._toValidViewLineNumber(e);var i=this.prefixSumComputer.getIndexOf(e-1),o=i.index,r=i.remainder,s=this.lines[o].getModelColumnOfViewPosition(r,t);return this.model.validatePosition(new n.Position(o+1,s))},e.prototype.convertModelPositionToViewPosition=function(e,t){this._ensureValidState();for(var i=this.model.validatePosition(new n.Position(e,t)),o=i.lineNumber,r=i.column,s=o-1,a=!1;s>0&&!this.lines[s].isVisible();)s--,a=!0;if(0===s&&!this.lines[s].isVisible())return new n.Position(1,1);var u=1+(0===s?0:this.prefixSumComputer.getAccumulatedValue(s-1));return a?this.lines[s].getViewPositionOfModelPosition(u,this.model.getLineMaxColumn(s+1)):this.lines[o-1].getViewPositionOfModelPosition(u,r)},e}();t.SplitLinesCollection=h;var p=function(){function e(){}return e.prototype.isVisible=function(){return!0},e.prototype.setVisible=function(e){return e?this:f.INSTANCE},e.prototype.getViewLineCount=function(){return 1},e.prototype.getViewLineContent=function(e,t,n){return e.getLineContent(t)},e.prototype.getViewLineMinColumn=function(e,t,n){return e.getLineMinColumn(t)},e.prototype.getViewLineMaxColumn=function(e,t,n){return e.getLineMaxColumn(t)},e.prototype.getViewLineData=function(e,t,n){var i=e.getLineTokens(t),o=i.getLineContent();return new s.ViewLineData(o,1,o.length+1,i.inflate())},e.prototype.getViewLinesData=function(e,t,n,i,o,r,s){r[o]?s[o]=this.getViewLineData(e,t,0):s[o]=null},e.prototype.getModelColumnOfViewPosition=function(e,t){return t},e.prototype.getViewPositionOfModelPosition=function(e,t){return new n.Position(e,t)},e.INSTANCE=new e,e}(),f=function(){function e(){}return e.prototype.isVisible=function(){return!1},e.prototype.setVisible=function(e){return e?p.INSTANCE:this},e.prototype.getViewLineCount=function(){return 0},e.prototype.getViewLineContent=function(e,t,n){throw new Error("Not supported")},e.prototype.getViewLineMinColumn=function(e,t,n){throw new Error("Not supported")},e.prototype.getViewLineMaxColumn=function(e,t,n){throw new Error("Not supported")},e.prototype.getViewLineData=function(e,t,n){throw new Error("Not supported")},e.prototype.getViewLinesData=function(e,t,n,i,o,r,s){throw new Error("Not supported")},e.prototype.getModelColumnOfViewPosition=function(e,t){throw new Error("Not supported")},e.prototype.getViewPositionOfModelPosition=function(e,t){throw new Error("Not supported")},e.INSTANCE=new e,e}(),g=function(){function e(e,t){this.positionMapper=e,this.wrappedIndent=this.positionMapper.getWrappedLinesIndent(),this.wrappedIndentLength=this.wrappedIndent.length,this.outputLineCount=this.positionMapper.getOutputLineCount(),this._isVisible=t}return e.prototype.isVisible=function(){return this._isVisible},e.prototype.setVisible=function(e){return this._isVisible=e,this},e.prototype.getViewLineCount=function(){return this._isVisible?this.outputLineCount:0},e.prototype.getInputStartOffsetOfOutputLineIndex=function(e){return this.positionMapper.getInputOffsetOfOutputPosition(e,0)},e.prototype.getInputEndOffsetOfOutputLineIndex=function(e,t,n){return n+1===this.outputLineCount?e.getLineMaxColumn(t)-1:this.positionMapper.getInputOffsetOfOutputPosition(n+1,0)},e.prototype.getViewLineContent=function(e,t,n){if(!this._isVisible)throw new Error("Not supported");var i=this.getInputStartOffsetOfOutputLineIndex(n),o=this.getInputEndOffsetOfOutputLineIndex(e,t,n),r=e.getLineContent(t).substring(i,o);return n>0&&(r=this.wrappedIndent+r),r},e.prototype.getViewLineMinColumn=function(e,t,n){if(!this._isVisible)throw new Error("Not supported");return n>0?this.wrappedIndentLength+1:1},e.prototype.getViewLineMaxColumn=function(e,t,n){if(!this._isVisible)throw new Error("Not supported");return this.getViewLineContent(e,t,n).length+1},e.prototype.getViewLineData=function(e,t,n){if(!this._isVisible)throw new Error("Not supported");var i=this.getInputStartOffsetOfOutputLineIndex(n),o=this.getInputEndOffsetOfOutputLineIndex(e,t,n),r=e.getLineContent(t).substring(i,o);n>0&&(r=this.wrappedIndent+r);var a=n>0?this.wrappedIndentLength+1:1,u=r.length+1,l=0;n>0&&(l=this.wrappedIndentLength);var c=e.getLineTokens(t);return new s.ViewLineData(r,a,u,c.sliceAndInflate(i,o,l))},e.prototype.getViewLinesData=function(e,t,n,i,o,r,s){if(!this._isVisible)throw new Error("Not supported");for(var a=n;a0&&(n0&&(r+=this.wrappedIndentLength),new n.Position(e+o,r)},e}();t.SplitLine=g;var m=function(){function e(e){this._lines=e}return e.prototype._validPosition=function(e){return this._lines.model.validatePosition(e)},e.prototype._validRange=function(e){return this._lines.model.validateRange(e)},e.prototype._validSelection=function(e){var t=this._validPosition(new n.Position(e.selectionStartLineNumber,e.selectionStartColumn)),o=this._validPosition(new n.Position(e.positionLineNumber,e.positionColumn));return new i.Selection(t.lineNumber,t.column,o.lineNumber,o.column)},e.prototype.convertViewPositionToModelPosition=function(e){return this._validPosition(e)},e.prototype.convertViewRangeToModelRange=function(e){return this._validRange(e)},e.prototype.convertViewSelectionToModelSelection=function(e){return this._validSelection(e)},e.prototype.validateViewPosition=function(e,t){return this._validPosition(t)},e.prototype.validateViewRange=function(e,t){return this._validRange(t)},e.prototype.convertModelPositionToViewPosition=function(e){return this._validPosition(e)},e.prototype.convertModelRangeToViewRange=function(e){return this._validRange(e)},e.prototype.convertModelSelectionToViewSelection=function(e){return this._validSelection(e)},e.prototype.modelPositionIsVisible=function(e){var t=this._lines.model.getLineCount();return!(e.lineNumber<1||e.lineNumber>t)},e}();t.IdentityCoordinatesConverter=m;var v=function(){function e(e){this.model=e}return e.prototype.dispose=function(){},e.prototype.createCoordinatesConverter=function(){return new m(this)},e.prototype.setHiddenAreas=function(e){return!1},e.prototype.setTabSize=function(e){return!1},e.prototype.setWrappingSettings=function(e,t,n){return!1},e.prototype.onModelFlushed=function(){},e.prototype.onModelLinesDeleted=function(e,t,n){return new a.ViewLinesDeletedEvent(t,n)},e.prototype.onModelLinesInserted=function(e,t,n,i){return new a.ViewLinesInsertedEvent(t,n)},e.prototype.onModelLineChanged=function(e,t,n){return[!1,new a.ViewLinesChangedEvent(t,t),null,null]},e.prototype.acceptVersionId=function(e){},e.prototype.getViewLineCount=function(){return this.model.getLineCount()},e.prototype.warmUpLookupCache=function(e,t){},e.prototype.getViewLineIndentGuide=function(e){return 0},e.prototype.getViewLineContent=function(e){return this.model.getLineContent(e)},e.prototype.getViewLineMinColumn=function(e){return this.model.getLineMinColumn(e)},e.prototype.getViewLineMaxColumn=function(e){return this.model.getLineMaxColumn(e)},e.prototype.getViewLineData=function(e){var t=this.model.getLineTokens(e),n=t.getLineContent();return new s.ViewLineData(n,1,n.length+1,t.inflate())},e.prototype.getViewLinesData=function(e,t,n){var i=this.model.getLineCount();e=Math.min(Math.max(1,e),i),t=Math.min(Math.max(1,t),i);for(var o=[],r=e;r<=t;r++){var s=r-e;n[s]||(o[s]=null),o[s]=this.getViewLineData(r)}return o},e}();t.IdentityLinesCollection=v}),define(d[329],h([1,0,9,104,179,89,96,49]),function(e,t,n,i,o,r,s,a){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var u;!function(e){e[e.NONE=0]="NONE",e[e.BREAK_BEFORE=1]="BREAK_BEFORE",e[e.BREAK_AFTER=2]="BREAK_AFTER",e[e.BREAK_OBTRUSIVE=3]="BREAK_OBTRUSIVE",e[e.BREAK_IDEOGRAPHIC=4]="BREAK_IDEOGRAPHIC"}(u||(u={}));var l=function(e){function t(t,n,i){for(var o=e.call(this,0)||this,r=0;r=12352&&t<=12543||t>=13312&&t<=19903||t>=19968&&t<=40959?4:e.prototype.get.call(this,t)},t}(r.CharacterClassifier),c=function(){function e(e,t,n){this.classifier=new l(e,t,n)}return e.nextVisibleColumn=function(e,t,n,i){return e=+e,t=+t,i=+i,n?e+(t-e%t):e+i},e.prototype.createLineMapping=function(t,o,r,u,l){if(-1===r)return null;o=+o,r=+r,u=+u;var c=0,h="",p=-1;if((l=+l)!==a.WrappingIndent.None&&-1!==(p=n.firstNonWhitespaceIndex(t))){h=t.substring(0,p);for(E=0;E.5*r&&(h="",c=0)}for(var f=this.classifier,g=0,m=[],v=0,_=0,y=-1,C=0,b=-1,w=0,S=t.length,E=0;E0){var M=t.charCodeAt(E-1);1!==f.get(M)&&(y=E,C=c)}var T=1;if(n.isFullWidthCharacter(L)&&(T=u),(_=e.nextVisibleColumn(_,o,x,T))>r&&0!==E){var k=void 0,I=void 0;-1!==y&&C<=r?(k=y,I=C):-1!==b&&w<=r?(k=b,I=w):(k=E,I=c),m[v++]=k-g,g=k,_=e.nextVisibleColumn(I,o,x,T),y=-1,C=0,b=-1,w=0}if(-1!==y&&(C=e.nextVisibleColumn(C,o,x,T)),-1!==b&&(w=e.nextVisibleColumn(w,o,x,T)),2===N&&(l===a.WrappingIndent.None||E>=p)&&(y=E+1,C=c),4===N&&E'+this._getHTMLToCopy(n,s)+""},t.prototype._getHTMLToCopy=function(e,t){for(var n=e.startLineNumber,i=e.startColumn,o=e.endLineNumber,r=e.endColumn,s=this.getTabSize(),u="",l=n;l<=o;l++){var c=this.model.getLineTokens(l),d=c.getLineContent(),h=l===n?i-1:0,p=l===o?r-1:d.length;u+=""===d?"
    ":a.tokenizeLineToHTML(d,c.inflate(),t,h,p,s)}return u},t.prototype._getColorMap=function(){for(var e=s.TokenizationRegistry.getColorMap(),t=[null],n=1,i=e.length;n0},e.prototype._cannotFind=function(){if(!this._hasMatches()){var e=this._decorations.getFindScope();return e&&this._editor.revealRangeInCenterIfOutsideViewport(e),!0}return!1},e.prototype._setCurrentFindMatch=function(e){var t=this._decorations.setCurrentFindMatch(e);this._state.changeMatchInfo(t,this._decorations.getCount(),e),this._editor.setSelection(e),this._editor.revealRangeInCenterIfOutsideViewport(e)},e.prototype._moveToPrevMatch=function(t,n){if(void 0===n&&(n=!1),!this._cannotFind()){var i=this._decorations.getFindScope(),o=e._getSearchRange(this._editor.getModel(),this._state.isReplaceRevealed,i);o.getEndPosition().isBefore(t)&&(t=o.getEndPosition()),t.isBefore(o.getStartPosition())&&(t=o.getEndPosition());var r=t.lineNumber,a=t.column,u=this._editor.getModel(),l=new s.Position(r,a),c=u.findPreviousMatch(this._state.searchString,l,this._state.isRegex,this._state.matchCase,this._state.wholeWord?this._editor.getConfiguration().wordSeparators:null,!1);return c&&c.range.isEmpty()&&c.range.getStartPosition().equals(l)&&(this._state.isRegex&&(this._state.searchString.indexOf("^")>=0||this._state.searchString.indexOf("$")>=0)||1===a?(1===r?r=u.getLineCount():r--,a=u.getLineMaxColumn(r)):a--,l=new s.Position(r,a),c=u.findPreviousMatch(this._state.searchString,l,this._state.isRegex,this._state.matchCase,this._state.wholeWord?this._editor.getConfiguration().wordSeparators:null,!1)),c?n||o.containsRange(c.range)?void this._setCurrentFindMatch(c.range):this._moveToPrevMatch(c.range.getStartPosition(),!0):null}},e.prototype.moveToPrevMatch=function(){this._moveToPrevMatch(this._editor.getSelection().getStartPosition())},e.prototype._moveToNextMatch=function(e){var t=this._getNextMatch(e,!1,!0);t&&this._setCurrentFindMatch(t.range)},e.prototype._getNextMatch=function(t,n,i,o){if(void 0===o&&(o=!1),this._cannotFind())return null;var r=this._decorations.getFindScope(),a=e._getSearchRange(this._editor.getModel(),this._state.isReplaceRevealed,r);a.getEndPosition().isBefore(t)&&(t=a.getStartPosition()),t.isBefore(a.getStartPosition())&&(t=a.getStartPosition());var u=t.lineNumber,l=t.column,c=this._editor.getModel(),d=new s.Position(u,l),h=c.findNextMatch(this._state.searchString,d,this._state.isRegex,this._state.matchCase,this._state.wholeWord?this._editor.getConfiguration().wordSeparators:null,n);return i&&h&&h.range.isEmpty()&&h.range.getStartPosition().equals(d)&&(this._state.isRegex&&(this._state.searchString.indexOf("^")>=0||this._state.searchString.indexOf("$")>=0)||l===c.getLineMaxColumn(u)?(u===c.getLineCount()?u=1:u++,l=1):l++,d=new s.Position(u,l),h=c.findNextMatch(this._state.searchString,d,this._state.isRegex,this._state.matchCase,this._state.wholeWord?this._editor.getConfiguration().wordSeparators:null,n)),h?o||a.containsRange(h.range)?h:this._getNextMatch(h.range.getEndPosition(),n,i,!0):null},e.prototype.moveToNextMatch=function(){this._moveToNextMatch(this._editor.getSelection().getEndPosition())},e.prototype._getReplacePattern=function(){return this._state.isRegex?o.parseReplaceString(this._state.replaceString):o.ReplacePattern.fromStaticValue(this._state.replaceString)},e.prototype.replace=function(){if(this._hasMatches()){var e=this._getReplacePattern(),t=this._editor.getSelection(),n=this._getNextMatch(t.getStartPosition(),e.hasReplacementPatterns,!1);if(n)if(t.equalsRange(n.range)){var i=e.buildReplaceString(n.matches),o=new r.ReplaceCommand(t,i);this._executeEditorCommand("replace",o),this._decorations.setStartPosition(new s.Position(t.startLineNumber,t.startColumn+i.length)),this.research(!0)}else this._decorations.setStartPosition(this._editor.getPosition()),this._setCurrentFindMatch(n.range)}},e.prototype._findMatches=function(t,n,i){var o=e._getSearchRange(this._editor.getModel(),this._state.isReplaceRevealed,t);return this._editor.getModel().findMatches(this._state.searchString,o,this._state.isRegex,this._state.matchCase,this._state.wholeWord?this._editor.getConfiguration().wordSeparators:null,n,i)},e.prototype.replaceAll=function(){if(this._hasMatches()){var e=this._decorations.getFindScope();null===e&&this._state.matchesCount>=t.MATCHES_LIMIT?this._largeReplaceAll():this._regularReplaceAll(e),this.research(!1)}},e.prototype._largeReplaceAll=function(){var e=new h.SearchParams(this._state.searchString,this._state.isRegex,this._state.matchCase,this._state.wholeWord?this._editor.getConfiguration().wordSeparators:null).parseSearchRequest();if(e){var t,n=this._editor.getModel(),i=n.getValue(u.EndOfLinePreference.LF),o=n.getFullModelRange(),s=this._getReplacePattern();t=s.hasReplacementPatterns?i.replace(e.regex,function(){return s.buildReplaceString(arguments)}):i.replace(e.regex,s.buildReplaceString(null));var a=new r.ReplaceCommandThatPreservesSelection(o,t,this._editor.getSelection());this._executeEditorCommand("replaceAll",a)}},e.prototype._regularReplaceAll=function(e){for(var t=this._getReplacePattern(),n=this._findMatches(e,t.hasReplacementPatterns,1073741824),i=[],o=0,r=n.length;o=e.startLineNumber&&t<=e.endLineNumber}function u(e,t){return te.endLineNumber}function c(e,t){return e instanceof i.Range&&t instanceof i.Range?e.containsRange(t):e.startLineNumber<=t.startLineNumber&&e.endLineNumber>=t.endLineNumber}function d(e,t,n,i,o){return(o?new f(e,t,n):new p(e,t,n)).getRegionsTill(i)}Object.defineProperty(t,"__esModule",{value:!0}),t.toString=function(e){return(e?e.startLineNumber+"/"+e.endLineNumber:"null")+(e.isCollapsed?" (collapsed)":"")+" - "+e.indent};var h=function(){function e(e,t,n){this.decorationIds=[],this.update(e,t,n)}return Object.defineProperty(e.prototype,"isCollapsed",{get:function(){return this._isCollapsed},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isExpanded",{get:function(){return!this._isCollapsed},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"indent",{get:function(){return this._indent},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"foldingRange",{get:function(){return this._lastRange},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"startLineNumber",{get:function(){return this._lastRange?this._lastRange.startLineNumber:void 0},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"endLineNumber",{get:function(){return this._lastRange?this._lastRange.endLineNumber:void 0},enumerable:!0,configurable:!0}),e.prototype.setCollapsed=function(e,t){this._isCollapsed=e,this.decorationIds.length>0&&t.changeDecorationOptions(this.decorationIds[0],this.getVisualDecorationOptions())},e.prototype.getDecorationRange=function(e){return this.decorationIds.length>0?e.getDecorationRange(this.decorationIds[1]):null},e.prototype.getVisualDecorationOptions=function(){return this._isCollapsed?e._COLLAPSED_VISUAL_DECORATION:e._EXPANDED_VISUAL_DECORATION},e.prototype.getRangeDecorationOptions=function(){return e._RANGE_DECORATION},e.prototype.update=function(e,t,n){this._lastRange=e,this._isCollapsed=!!e.isCollapsed,this._indent=e.indent;var i=[],o=t.getLineMaxColumn(e.startLineNumber),r={startLineNumber:e.startLineNumber,startColumn:o-1,endLineNumber:e.startLineNumber,endColumn:o};i.push({range:r,options:this.getVisualDecorationOptions()});var s={startLineNumber:e.startLineNumber,startColumn:1,endLineNumber:e.endLineNumber,endColumn:t.getLineMaxColumn(e.endLineNumber)};i.push({range:s,options:this.getRangeDecorationOptions()}),this.decorationIds=n.deltaDecorations(this.decorationIds,i)},e.prototype.dispose=function(e){this._lastRange=null,this.decorationIds=e.deltaDecorations(this.decorationIds,[])},e.prototype.toString=function(){var e=this.isCollapsed?"collapsed ":"expanded ";return this._lastRange?e+=this._lastRange.startLineNumber+"/"+this._lastRange.endLineNumber:e+="no range",e},e._COLLAPSED_VISUAL_DECORATION=o.ModelDecorationOptions.register({stickiness:n.TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges,afterContentClassName:"inline-folded",linesDecorationsClassName:"folding collapsed"}),e._EXPANDED_VISUAL_DECORATION=o.ModelDecorationOptions.register({stickiness:n.TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges,linesDecorationsClassName:"folding"}),e._RANGE_DECORATION=o.ModelDecorationOptions.register({stickiness:n.TrackedRangeStickiness.GrowsOnlyWhenTypingBefore}),e}();t.CollapsibleRegion=h,t.getCollapsibleRegionsToFoldAtLine=function(e,t,n,i,o){var s=r(e,t,n);return s?1===i?[s]:d(s,e,t,i,o).filter(function(e){return!e.isCollapsed}):[]},t.getCollapsibleRegionsToUnfoldAtLine=function(e,t,n,i){var o=r(e,t,n);if(!o)return[];if(1===i){var a=o.isCollapsed?o:s(e,t,o,n);return a?[a]:[]}return d(o,e,t,i,!1).filter(function(e){return e.isCollapsed})},t.doesLineBelongsToCollapsibleRegion=a;var p=function(){function e(e,t,n){this.region=e,this.children=[];for(var i=t.indexOf(e)+1;i0?r.lastChildIndex:o},e.prototype.getRegionsTill=function(e){var t=[this.region];return e>1&&this.children.forEach(function(n){return t=t.concat(n.getRegionsTill(e-1))}),t},e}(),f=function(){function e(t,n,i){this.region=t;for(var o=n.indexOf(t)-1;o>=0;o--){var r=n[o],s=r.getDecorationRange(i);if(s){if(c(s,t.foldingRange)){this.parent=new e(r,n,i);break}if(l(s,t.foldingRange.endLineNumber))break}}}return e.prototype.getRegionsTill=function(e){var t=[this.region];return this.parent&&e>1&&(t=t.concat(this.parent.getRegionsTill(e-1))),t},e}()}),define(d[334],h([1,0,9,20,59,142,22,2,33,3,271,34,394]),function(e,t,n,i,o,r,s,a,u,l,c,d){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var h=function(){function e(e,t,n){this._nestingLevel=1,this._editor=e,this._snippet=t,this._offset=n,this._placeholderGroups=u.groupBy(t.placeholders,r.Placeholder.compareByIndex),this._placeholderGroupsIdx=-1}return e.prototype.dispose=function(){var e=this;this._placeholderDecorations&&this._editor.changeDecorations(function(t){return e._placeholderDecorations.forEach(function(e){return t.removeDecoration(e)})}),this._placeholderGroups.length=0},e.prototype._initDecorations=function(){var t=this;if(!this._placeholderDecorations){this._placeholderDecorations=new Map;var n=this._editor.getModel();this._editor.changeDecorations(function(i){for(var o=0,r=t._snippet.placeholders;o0&&(this._placeholderGroupsIdx-=1),this._editor.getModel().changeDecorations(function(t){for(var i=new Set,o=[],r=0,a=n._placeholderGroups[n._placeholderGroupsIdx];r0},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"placeholderRanges",{get:function(){var e=this,t=[];return this._placeholderDecorations.forEach(function(n,i){if(!i.isFinalTabstop){var o=e._editor.getModel().getDecorationRange(n);o&&t.push(o)}}),t},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"choice",{get:function(){return this._placeholderGroups[this._placeholderGroupsIdx][0].choice},enumerable:!0,configurable:!0}),e.prototype.merge=function(t){var n=this,i=this._editor.getModel();this._nestingLevel*=10,this._editor.changeDecorations(function(o){for(var s=0,l=n._placeholderGroups[n._placeholderGroupsIdx];st.length)return!1;e.sort(a.Range.compareRangesUsingStarts),t.sort(a.Range.compareRangesUsingStarts);e:for(var r=0,s=e;r=a&&(t=a);var u=0,l=0;if(this.options.showArrow&&(u=Math.round(s/3),this._arrow.height=u,this._arrow.show(i)),this.options.showFrame&&(l=Math.round(s/9)),this.editor.changeViewZones(function(e){n._viewZone&&e.removeZone(n._viewZone.id),n._overlayWidget&&(n.editor.removeOverlayWidget(n._overlayWidget),n._overlayWidget=null),n.domNode.style.top="-1000px",n._viewZone=new p(r,i.lineNumber,i.column,t,function(e){return n._onViewZoneTop(e)},function(e){return n._onViewZoneHeight(e)}),n._viewZone.id=e.addZone(n._viewZone),n._overlayWidget=new g("vs.editor.contrib.zoneWidget"+n._viewZone.id,n.domNode),n.editor.addOverlayWidget(n._overlayWidget)}),this.options.showFrame){var c=this.options.frameWidth?this.options.frameWidth:l;this.container.style.borderTopWidth=c+"px",this.container.style.borderBottomWidth=c+"px"}var d=t*s-this._decoratingElementsHeight();this.container.style.top=u+"px",this.container.style.height=d+"px",this.container.style.overflow="hidden",this._doLayout(d,o),this.editor.setSelection(e);var h=Math.min(this.editor.getModel().getLineCount(),Math.max(1,e.endLineNumber+1));this.editor.revealLine(h)},t.prototype.setCssClass=function(e,t){t&&this.container.classList.remove(t),r.addClass(this.container,e)},t.prototype._onWidth=function(e){},t.prototype._doLayout=function(e,t){},t.prototype._relayout=function(e){var t=this;this._viewZone.heightInLines!==e&&this.editor.changeViewZones(function(n){t._viewZone.heightInLines=e,n.layoutZone(t._viewZone.id)})},t.prototype._initSash=function(){var e=this;this._resizeSash=new s.Sash(this.domNode,this,{orientation:s.Orientation.HORIZONTAL}),this.options.isResizeable||(this._resizeSash.hide(),this._resizeSash.disable());var t;this._disposables.push(this._resizeSash.addListener("start",function(n){e._viewZone&&(t={startY:n.startY,heightInLines:e._viewZone.heightInLines})})),this._disposables.push(this._resizeSash.addListener("end",function(){t=void 0})),this._disposables.push(this._resizeSash.addListener("change",function(n){if(t){var i=(n.currentY-t.startY)/e.editor.getConfiguration().lineHeight,o=i<0?Math.ceil(i):Math.floor(i),r=t.heightInLines+o;r>5&&r<35&&e._relayout(r)}}))},t.prototype.getHorizontalSashLeft=function(){return 0},t.prototype.getHorizontalSashTop=function(){return parseInt(this.domNode.style.height)-this._decoratingElementsHeight()/2},t.prototype.getHorizontalSashWidth=function(){var e=this.editor.getLayoutInfo();return e.width-e.minimapWidth},t}(i.Widget);t.ZoneWidget=v}),define(d[336],h([6,8]),function(e,t){return e.create("vs/editor/common/modes/modesRegistry",t)}),define(d[337],h([6,8]),function(e,t){return e.create("vs/editor/common/services/bulkEdit",t)}),define(d[338],h([1,0,337,33,157,3,24,7,59,2,22]),function(e,t,n,i,o,r,s,a,u,l,c){"use strict";function d(e,t,i){function r(){for(var e,t=0,i=u;t1&&t>1?n.localize(2,null,e,t):n.localize(3,null,e,t)}}}Object.defineProperty(t,"__esModule",{value:!0});var h=function(){function e(e){this._fileService=e}return e.prototype.start=function(){var e,t=Object.create(null);return this._fileService&&(e=this._fileService.onFileChanges(function(e){e.changes.forEach(function(e){var n=String(e.resource),i=t[n];i||(t[n]=i=[]),i.push(e)})})),{stop:function(){return e&&e.dispose()},hasChanged:function(e){return!!t[e.toString()]},allChanges:function(){return i.flatten(o.values(t))}}},e}(),p=function(){function e(e){this._endCursorSelection=null,this._modelReference=e,this._edits=[]}return Object.defineProperty(e.prototype,"_model",{get:function(){return this._modelReference.object.textEditorModel},enumerable:!0,configurable:!0}),e.prototype.addEdit=function(e){if("number"==typeof e.newEol&&(this._newEol=e.newEol),e.range||e.newText){var t=void 0;t=e.range?l.Range.lift(e.range):this._model.getFullModelRange(),this._edits.push(u.EditOperation.replaceMove(t,e.newText))}},e.prototype.apply=function(){var e=this;this._edits.length>0&&(this._edits=this._edits.map(function(e,t){return{value:e,index:t}}).sort(function(e,t){var n=l.Range.compareRangesUsingStarts(e.value.range,t.value.range);return 0===n&&(n=e.index-t.index),n}).map(function(e){return e.value}),this._initialSelections=this._getInitialSelections(),this._model.pushEditOperations(this._initialSelections,this._edits,function(t){return e._getEndCursorSelections(t)})),void 0!==this._newEol&&this._model.setEOL(this._newEol)},e.prototype._getInitialSelections=function(){var e=this._edits[0].range;return[new c.Selection(e.startLineNumber,e.startColumn,e.endLineNumber,e.endColumn)]},e.prototype._getEndCursorSelections=function(e){for(var t=0,n=0;nt.prefixLen?-1:e.prefixLent.offsetDist?1:0})[0];if(n)return this._references[n.idx]},e.prototype.dispose=function(){this._groups=s.dispose(this._groups)},e._compareReferences=function(e,t){var n=e.uri.toString(),i=t.uri.toString();return ni?1:c.Range.compareRangesUsingStarts(e.range,t.range)},e}();t.ReferencesModel=f}),define(d[367],h([6,8]),function(e,t){return e.create("vs/editor/contrib/referenceSearch/browser/referencesWidget",t)}),define(d[368],h([6,8]),function(e,t){return e.create("vs/editor/contrib/rename/browser/rename",t)}),define(d[369],h([6,8]),function(e,t){return e.create("vs/editor/contrib/rename/browser/renameInputField",t)}),define(d[370],h([6,8]),function(e,t){return e.create("vs/editor/contrib/smartSelect/common/smartSelect",t)}),define(d[371],h([6,8]),function(e,t){return e.create("vs/editor/contrib/suggest/browser/suggestController",t)}),define(d[372],h([6,8]),function(e,t){return e.create("vs/editor/contrib/suggest/browser/suggestWidget",t)}),define(d[373],h([6,8]),function(e,t){return e.create("vs/editor/contrib/toggleTabFocusMode/common/toggleTabFocusMode",t)}),define(d[374],h([6,8]),function(e,t){return e.create("vs/editor/contrib/wordHighlighter/common/wordHighlighter",t)}),define(d[375],h([6,8]),function(e,t){return e.create("vs/editor/contrib/zoneWidget/browser/peekViewWidget",t)}),define(d[376],h([6,8]),function(e,t){return e.create("vs/editor/standalone/browser/inspectTokens/inspectTokens",t)}),define(d[377],h([6,8]),function(e,t){return e.create("vs/editor/standalone/browser/quickOpen/gotoLine",t)}),define(d[378],h([6,8]),function(e,t){return e.create("vs/editor/standalone/browser/quickOpen/quickCommand",t)}),define(d[379],h([6,8]),function(e,t){return e.create("vs/editor/standalone/browser/quickOpen/quickOutline",t)}),define(d[380],h([6,8]),function(e,t){return e.create("vs/editor/standalone/browser/standaloneCodeEditor",t)}),define(d[381],h([6,8]),function(e,t){return e.create("vs/editor/standalone/browser/toggleHighContrast/toggleHighContrast",t)}),define(d[382],h([6,8]),function(e,t){return e.create("vs/platform/configuration/common/configurationRegistry",t)}),define(d[383],h([6,8]),function(e,t){return e.create("vs/platform/keybinding/common/abstractKeybindingService",t)}),define(d[384],h([6,8]),function(e,t){return e.create("vs/platform/message/common/message",t)}),define(d[385],h([6,8]),function(e,t){return e.create("vs/platform/theme/common/colorRegistry",t)}),define(d[386],h([1,0,52,3,47,53,281,79,36,409]),function(e,t,n,i,o,r,s,a,u){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var l=function(){function e(e,t,n,i){var o=this;this.setContainer(e),this.contextViewService=t,this.telemetryService=n,this.messageService=i,this.actionRunner=new r.ActionRunner,this.menuContainerElement=null,this.toDispose=[];var s=!1;this.toDispose.push(this.actionRunner.addListener(a.EventType.BEFORE_RUN,function(e){o.telemetryService&&o.telemetryService.publicLog("workbenchActionExecuted",{id:e.action.id,from:"contextMenu"}),(s=!!e.retainActionItem)||o.contextViewService.hideContextView(!1)})),this.toDispose.push(this.actionRunner.addListener(a.EventType.RUN,function(e){s&&o.contextViewService.hideContextView(!1),s=!1,e.error&&o.messageService&&o.messageService.show(u.default.Error,e.error)}))}return e.prototype.setContainer=function(e){var t=this;this.$el&&(this.$el.off(["click","mousedown"]),this.$el=null),e&&(this.$el=n.$(e),this.$el.on("mousedown",function(e){return t.onMouseDown(e)}))},e.prototype.showContextMenu=function(e){var t=this;e.getActions().done(function(n){t.contextViewService.showContextView({getAnchor:function(){return e.getAnchor()},canRelayout:!1,render:function(o){t.menuContainerElement=o;var r=e.getMenuClassName?e.getMenuClassName():"";r&&(o.className+=" "+r);var u=new s.Menu(o,n,{actionItemProvider:e.getActionItem,context:e.getActionsContext?e.getActionsContext():null,actionRunner:t.actionRunner}),l=u.addListener(a.EventType.CANCEL,function(e){t.contextViewService.hideContextView(!0)}),c=u.addListener(a.EventType.BLUR,function(e){t.contextViewService.hideContextView(!0)});return u.focus(),i.combinedDisposable([l,c,u])},onHide:function(n){e.onHide&&e.onHide(n),t.menuContainerElement=null}})})},e.prototype.onMouseDown=function(e){if(this.menuContainerElement){for(var t=new o.StandardMouseEvent(e).target;t;){if(t===this.menuContainerElement)return;t=t.parentElement}this.contextViewService.hideContextView()}},e.prototype.dispose=function(){this.setContainer(null)},e}();t.ContextMenuHandler=l}),define(d[387],h([1,0,386]),function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e,t,i,o){this.contextMenuHandler=new n.ContextMenuHandler(e,o,t,i)}return e.prototype.dispose=function(){this.contextMenuHandler.dispose()},e.prototype.setContainer=function(e){this.contextMenuHandler.setContainer(e)},e.prototype.showContextMenu=function(e){this.contextMenuHandler.showContextMenu(e)},e}();t.ContextMenuService=i}),define(d[187],h([1,0,10]),function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e){this._staticArguments=e}return e.prototype.appendStaticArguments=function(e){this._staticArguments.push.apply(this._staticArguments,e)},e.prototype.staticArguments=function(e){return isNaN(e)?this._staticArguments.slice(0):this._staticArguments[e]},e.prototype._validate=function(e){if(!e)throw n.illegalArgument("can not be falsy")},e}();t.AbstractDescriptor=i;var o=function(e){function t(t){for(var n=[],i=1;im&&(this._editorWorkerClient.dispose(),this._editorWorkerClient=null)},t.prototype.withWorker=function(){return this._lastWorkerUsedTime=(new Date).getTime(),this._editorWorkerClient||(this._editorWorkerClient=new E(this._modelService,"editorWorkerService")),o.TPromise.as(this._editorWorkerClient)},t}(i.Disposable),w=function(e){function t(t,i,o){var r=e.call(this)||this;if(r._syncedModels=Object.create(null),r._syncedModelsLastUsedTime=Object.create(null),r._proxy=t,r._modelService=i,!o){var s=new n.IntervalTimer;s.cancelAndSet(function(){return r._checkStopModelSync()},Math.round(g/2)),r._register(s)}return r}return f(t,e),t.prototype.dispose=function(){for(var t in this._syncedModels)i.dispose(this._syncedModels[t]);this._syncedModels=Object.create(null),this._syncedModelsLastUsedTime=Object.create(null),e.prototype.dispose.call(this)},t.prototype.esureSyncedResources=function(e){for(var t=0;tg&&t.push(n);for(var i=0;i=0&&(t.splice(i,1),0===t.length&&n._commands.delete(e))}else r(t)&&n._commands.delete(e)}}},e.prototype.getCommand=function(e){var t=this._commands.get(e);return Array.isArray(t)?t[0]:t},e.prototype.getCommands=function(){var e=this,t=Object.create(null);return this._commands.forEach(function(n,i){t[i]=e.getCommand(i)}),t},e}()),t.NullCommandService={_serviceBrand:void 0,onWillExecuteCommand:function(){return{dispose:function(){}}},executeCommand:function(){return n.TPromise.as(void 0)}}}),define(d[401],h([1,0,10,24,7,2,17,18,31,56]),function(e,t,n,i,o,r,s,a,u,l){"use strict";function c(e){var t=[],i=s.LinkProviderRegistry.ordered(e).reverse().map(function(i){return a.asWinJsPromise(function(t){return i.provideLinks(e,t)}).then(function(e){if(Array.isArray(e)){var n=e.map(function(e){return new h(e,i)});t=d(t,n)}},n.onUnexpectedExternalError)});return o.TPromise.join(i).then(function(){return t})}function d(e,t){var n,i,o,s,a,u,l=[];for(n=0,o=0,i=e.length,s=t.length;n=0&&i.splice(e,1)}}},e.prototype.getMenuItems=function(e){var t=e.id,n=this._menuItems[t]||[];return t===s.CommandPalette.id&&this._appendImplicitItems(n),n},e.prototype._appendImplicitItems=function(e){for(var t=new Set,n=0,i=e;n=0){t=e.split("!=");return new u(t[0].trim(),this._deserializeValue(t[1]))}if(e.indexOf("==")>=0){var t=e.split("==");return new a(t[0].trim(),this._deserializeValue(t[1]))}return/^\!\s*/.test(e)?new l(e.substr(1).trim()):new s(e)},e._deserializeValue=function(e){if("true"===(e=e.trim()))return!0;if("false"===e)return!1;var t=/^'([^']*)'$/.exec(e);return t?t[1].trim():e},e}();t.ContextKeyExpr=r;var s=function(){function e(e){this.key=e}return e.prototype.getType=function(){return o.Defined},e.prototype.cmp=function(e){return this.keye.key?1:0},e.prototype.equals=function(t){return t instanceof e&&this.key===t.key},e.prototype.evaluate=function(e){return!!e.getValue(this.key)},e.prototype.normalize=function(){return this},e.prototype.serialize=function(){return this.key},e.prototype.keys=function(){return[this.key]},e}();t.ContextKeyDefinedExpr=s;var a=function(){function e(e,t){this.key=e,this.value=t}return e.prototype.getType=function(){return o.Equals},e.prototype.cmp=function(e){return this.keye.key?1:this.valuee.value?1:0},e.prototype.equals=function(t){return t instanceof e&&(this.key===t.key&&this.value===t.value)},e.prototype.evaluate=function(e){return e.getValue(this.key)==this.value},e.prototype.normalize=function(){return"boolean"==typeof this.value?this.value?new s(this.key):new l(this.key):this},e.prototype.serialize=function(){return"boolean"==typeof this.value?this.normalize().serialize():this.key+" == '"+this.value+"'"},e.prototype.keys=function(){return[this.key]},e}();t.ContextKeyEqualsExpr=a;var u=function(){function e(e,t){this.key=e,this.value=t}return e.prototype.getType=function(){return o.NotEquals},e.prototype.cmp=function(e){return this.keye.key?1:this.valuee.value?1:0},e.prototype.equals=function(t){return t instanceof e&&(this.key===t.key&&this.value===t.value)},e.prototype.evaluate=function(e){return e.getValue(this.key)!=this.value},e.prototype.normalize=function(){return"boolean"==typeof this.value?this.value?new l(this.key):new s(this.key):this},e.prototype.serialize=function(){return"boolean"==typeof this.value?this.normalize().serialize():this.key+" != '"+this.value+"'"},e.prototype.keys=function(){return[this.key]},e}();t.ContextKeyNotEqualsExpr=u;var l=function(){function e(e){this.key=e}return e.prototype.getType=function(){return o.Not},e.prototype.cmp=function(e){return this.keye.key?1:0},e.prototype.equals=function(t){return t instanceof e&&this.key===t.key},e.prototype.evaluate=function(e){return!e.getValue(this.key)},e.prototype.normalize=function(){return this},e.prototype.serialize=function(){return"!"+this.key},e.prototype.keys=function(){return[this.key]},e}();t.ContextKeyNotExpr=l;var c=function(){function e(t){this.expr=e._normalizeArr(t)}return e.prototype.getType=function(){return o.And},e.prototype.equals=function(t){if(t instanceof e){if(this.expr.length!==t.expr.length)return!1;for(var n=0,i=this.expr.length;n0&&t.push([s,a])}return t},e._fillInKbExprKeys=function(e,t){if(e)for(var n=0,i=e.keys();ns)return 1;var a="string"==typeof e.command.title?e.command.title:e.command.title.value,u="string"==typeof t.command.title?t.command.title:t.command.title.value;return a.localeCompare(u)},e=v([y(2,s.ICommandService),y(3,o.IContextKeyService)],e)}();t.Menu=a}),define(d[69],h([1,0,53,16]),function(e,t,n,i){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.IContextViewService=i.createDecorator("contextViewService"),t.IContextMenuService=i.createDecorator("contextMenuService");var o=function(e){function t(t,n){var i=e.call(this,"contextsubmenu",t,"",!0)||this;return i.entries=n,i}return f(t,e),t}(n.Action);t.ContextSubMenu=o}),define(d[64],h([1,0,16]),function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.IEditorService=n.createDecorator("editorService");var i;!function(e){e[e.ONE=0]="ONE",e[e.TWO=1]="TWO",e[e.THREE=2]="THREE"}(i=t.Position||(t.Position={})),t.POSITIONS=[i.ONE,i.TWO,i.THREE];!function(e){e[e.LEFT=0]="LEFT",e[e.RIGHT=1]="RIGHT"}(t.Direction||(t.Direction={}));!function(e){e[e.SHORT=0]="SHORT",e[e.MEDIUM=1]="MEDIUM",e[e.LONG=2]="LONG"}(t.Verbosity||(t.Verbosity={}))}),define(d[156],h([1,0,16]),function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.IEnvironmentService=n.createDecorator("environmentService")}),define(d[411],h([1,0,45,79,15,16,9]),function(e,t,n,i,o,r,s){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.IFileService=r.createDecorator("fileService");!function(e){e[e.CREATE=0]="CREATE",e[e.DELETE=1]="DELETE",e[e.MOVE=2]="MOVE",e[e.COPY=3]="COPY",e[e.IMPORT=4]="IMPORT"}(t.FileOperation||(t.FileOperation={}));var a=function(){function e(e,t,n){this._resource=e,this._operation=t,this._target=n}return Object.defineProperty(e.prototype,"resource",{get:function(){return this._resource},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"target",{get:function(){return this._target},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"operation",{get:function(){return this._operation},enumerable:!0,configurable:!0}),e}();t.FileOperationEvent=a;var u;!function(e){e[e.UPDATED=0]="UPDATED",e[e.ADDED=1]="ADDED",e[e.DELETED=2]="DELETED"}(u=t.FileChangeType||(t.FileChangeType={}));var l=function(e){function t(t){var n=e.call(this)||this;return n._changes=t,n}return f(t,e),Object.defineProperty(t.prototype,"changes",{get:function(){return this._changes},enumerable:!0,configurable:!0}),t.prototype.contains=function(e,t){return!!e&&this._changes.some(function(i){return i.type===t&&(t===u.DELETED?n.isEqualOrParent(e.fsPath,i.resource.fsPath,!o.isLinux):n.isEqual(e.fsPath,i.resource.fsPath,!o.isLinux))})},t.prototype.getAdded=function(){return this.getOfType(u.ADDED)},t.prototype.gotAdded=function(){return this.hasType(u.ADDED)},t.prototype.getDeleted=function(){return this.getOfType(u.DELETED)},t.prototype.gotDeleted=function(){return this.hasType(u.DELETED)},t.prototype.getUpdated=function(){return this.getOfType(u.UPDATED)},t.prototype.gotUpdated=function(){return this.hasType(u.UPDATED)},t.prototype.getOfType=function(e){return this._changes.filter(function(t){return t.type===e})},t.prototype.hasType=function(e){return this._changes.some(function(t){return t.type===e})},t}(i.Event);t.FileChangesEvent=l,t.isParent=function(e,t,i){return!(!e||!t||e===t)&&!(t.length>e.length)&&(t.charAt(t.length-1)!==n.nativeSep&&(t+=n.nativeSep),i?s.beginsWithIgnoreCase(e,t):0===e.indexOf(t))},t.indexOf=function(e,t,n){return t.length>e.length?-1:e===t?0:(n&&(e=e.toLowerCase(),t=t.toLowerCase()),e.indexOf(t))};var c=function(e){function t(t,n){var i=e.call(this,t)||this;return i.fileOperationResult=n,i}return f(t,e),t}(Error);t.FileOperationError=c;!function(e){e[e.FILE_IS_BINARY=0]="FILE_IS_BINARY",e[e.FILE_IS_DIRECTORY=1]="FILE_IS_DIRECTORY",e[e.FILE_NOT_FOUND=2]="FILE_NOT_FOUND",e[e.FILE_NOT_MODIFIED_SINCE=3]="FILE_NOT_MODIFIED_SINCE",e[e.FILE_MODIFIED_SINCE=4]="FILE_MODIFIED_SINCE",e[e.FILE_MOVE_CONFLICT=5]="FILE_MOVE_CONFLICT",e[e.FILE_READ_ONLY=6]="FILE_READ_ONLY",e[e.FILE_TOO_LARGE=7]="FILE_TOO_LARGE",e[e.FILE_INVALID_PATH=8]="FILE_INVALID_PATH"}(t.FileOperationResult||(t.FileOperationResult={}));t.MAX_FILE_SIZE="object"==typeof process?"ia32"===process.arch?314572800:17179869184:314572800,t.AutoSaveConfiguration={OFF:"off",AFTER_DELAY:"afterDelay",ON_FOCUS_CHANGE:"onFocusChange",ON_WINDOW_CHANGE:"onWindowChange"},t.HotExitConfiguration={OFF:"off",ON_EXIT:"onExit",ON_EXIT_AND_WINDOW_CLOSE:"onExitAndWindowClose"},t.CONTENT_CHANGE_EVENT_BUFFER_DELAY=1e3,t.SUPPORTED_ENCODINGS={utf8:{labelLong:"UTF-8",labelShort:"UTF-8",order:1,alias:"utf8bom"},utf8bom:{labelLong:"UTF-8 with BOM",labelShort:"UTF-8 with BOM",encodeOnly:!0,order:2,alias:"utf8"},utf16le:{labelLong:"UTF-16 LE",labelShort:"UTF-16 LE",order:3},utf16be:{labelLong:"UTF-16 BE",labelShort:"UTF-16 BE",order:4},windows1252:{labelLong:"Western (Windows 1252)",labelShort:"Windows 1252",order:5},iso88591:{labelLong:"Western (ISO 8859-1)",labelShort:"ISO 8859-1",order:6},iso88593:{labelLong:"Western (ISO 8859-3)",labelShort:"ISO 8859-3",order:7},iso885915:{labelLong:"Western (ISO 8859-15)",labelShort:"ISO 8859-15",order:8},macroman:{labelLong:"Western (Mac Roman)",labelShort:"Mac Roman",order:9},cp437:{labelLong:"DOS (CP 437)",labelShort:"CP437",order:10},windows1256:{labelLong:"Arabic (Windows 1256)",labelShort:"Windows 1256",order:11},iso88596:{labelLong:"Arabic (ISO 8859-6)",labelShort:"ISO 8859-6",order:12},windows1257:{labelLong:"Baltic (Windows 1257)",labelShort:"Windows 1257",order:13},iso88594:{labelLong:"Baltic (ISO 8859-4)",labelShort:"ISO 8859-4",order:14},iso885914:{labelLong:"Celtic (ISO 8859-14)",labelShort:"ISO 8859-14",order:15},windows1250:{labelLong:"Central European (Windows 1250)",labelShort:"Windows 1250",order:16},iso88592:{labelLong:"Central European (ISO 8859-2)",labelShort:"ISO 8859-2",order:17},cp852:{labelLong:"Central European (CP 852)",labelShort:"CP 852",order:18},windows1251:{labelLong:"Cyrillic (Windows 1251)",labelShort:"Windows 1251",order:19},cp866:{labelLong:"Cyrillic (CP 866)",labelShort:"CP 866",order:20},iso88595:{labelLong:"Cyrillic (ISO 8859-5)",labelShort:"ISO 8859-5",order:21},koi8r:{labelLong:"Cyrillic (KOI8-R)",labelShort:"KOI8-R",order:22},koi8u:{labelLong:"Cyrillic (KOI8-U)",labelShort:"KOI8-U",order:23},iso885913:{labelLong:"Estonian (ISO 8859-13)",labelShort:"ISO 8859-13",order:24},windows1253:{labelLong:"Greek (Windows 1253)",labelShort:"Windows 1253",order:25},iso88597:{labelLong:"Greek (ISO 8859-7)",labelShort:"ISO 8859-7",order:26},windows1255:{labelLong:"Hebrew (Windows 1255)",labelShort:"Windows 1255",order:27},iso88598:{labelLong:"Hebrew (ISO 8859-8)",labelShort:"ISO 8859-8",order:28},iso885910:{labelLong:"Nordic (ISO 8859-10)",labelShort:"ISO 8859-10",order:29},iso885916:{labelLong:"Romanian (ISO 8859-16)",labelShort:"ISO 8859-16",order:30},windows1254:{labelLong:"Turkish (Windows 1254)",labelShort:"Windows 1254",order:31},iso88599:{labelLong:"Turkish (ISO 8859-9)",labelShort:"ISO 8859-9",order:32},windows1258:{labelLong:"Vietnamese (Windows 1258)",labelShort:"Windows 1258",order:33},gbk:{labelLong:"Chinese (GBK)",labelShort:"GBK",order:34},gb18030:{labelLong:"Chinese (GB18030)",labelShort:"GB18030",order:35},cp950:{labelLong:"Traditional Chinese (Big5)",labelShort:"Big5",order:36},big5hkscs:{labelLong:"Traditional Chinese (Big5-HKSCS)",labelShort:"Big5-HKSCS",order:37},shiftjis:{labelLong:"Japanese (Shift JIS)",labelShort:"Shift JIS",order:38},eucjp:{labelLong:"Japanese (EUC-JP)",labelShort:"EUC-JP",order:39},euckr:{labelLong:"Korean (EUC-KR)",labelShort:"EUC-KR",order:40},windows874:{labelLong:"Thai (Windows 874)",labelShort:"Windows 874",order:41},iso885911:{labelLong:"Latin/Thai (ISO 8859-11)",labelShort:"ISO 8859-11",order:42},koi8ru:{labelLong:"Cyrillic (KOI8-RU)",labelShort:"KOI8-RU",order:43},koi8t:{labelLong:"Tajik (KOI8-T)",labelShort:"KOI8-T",order:44},gb2312:{labelLong:"Simplified Chinese (GB 2312)",labelShort:"GB 2312",order:45}};!function(e){e[e.FILE=0]="FILE",e[e.FOLDER=1]="FOLDER",e[e.ROOT_FOLDER=2]="ROOT_FOLDER"}(t.FileKind||(t.FileKind={}))}),define(d[84],h([1,0]),function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=function(){function e(){for(var e=[],t=0;t0?i[0].index:n.length;if(n.length!==d){console.warn("[createInstance] First service dependency of "+e.ctor.name+" at position "+(d+1)+" conflicts with "+n.length+" static arguments");var h=d-n.length;n=h>0?n.concat(new Array(h)):n.slice(0,d)}var p=[e.ctor];p.push.apply(p,n),p.push.apply(p,r);var f=o.create.apply(null,p);return e._validate(f),f},t.prototype._getOrCreateServiceInstance=function(e){var t=this._services.get(e);return t instanceof a.SyncDescriptor?this._createAndCacheServiceInstance(e,t):t},t.prototype._createAndCacheServiceInstance=function(e,t){function n(){var e=new Error("[createInstance] cyclic dependency between services");throw e.message=i.toString(),e}r.ok(this._services.get(e)instanceof a.SyncDescriptor);for(var i=new s.Graph(function(e){return e.id.toString()}),o=0,l=[{id:e,desc:t}];l.length;){var c=l.pop();i.lookupOrInsertNode(c),o++>100&&n();for(var d=0,h=u._util.getServiceDependencies(c.desc.ctor);d=0;c--)this._isTargetedForRemoval(e[c],a,u,s,l)&&e.splice(c,1);else n.push(r)}return e.concat(n)},e.prototype._addKeyPress=function(t,n){var i=this._map.get(t);if(void 0===i)return this._map.set(t,[n]),void this._addToLookupMap(n);for(var o=i.length-1;o>=0;o--){var r=i[o];if(r.command!==n.command){var s=null!==r.keypressChordPart,a=null!==n.keypressChordPart;s&&a&&r.keypressChordPart!==n.keypressChordPart||e.whenIsEntirelyIncluded(!0,r.when,n.when)&&this._removeFromLookupMap(r)}}i.push(n),this._addToLookupMap(n)},e.prototype._addToLookupMap=function(e){if(e.command){var t=this._lookupMap.get(e.command);void 0===t?(t=[e],this._lookupMap.set(e.command,t)):t.push(e)}},e.prototype._removeFromLookupMap=function(e){var t=this._lookupMap.get(e.command);if(void 0!==t)for(var n=0,i=t.length;n=0;o--)n[i++]=t[o];return n},e.prototype.lookupPrimaryKeybinding=function(e){var t=this._lookupMap.get(e);return void 0===t||0===t.length?null:t[t.length-1]},e.prototype.resolve=function(e,t,n){var i=null;if(null!==t){if(void 0===(a=this._map.get(t)))return null;i=[];for(var o=0,r=a.length;o=0;i--){var o=n[i];if(e.contextMatchesRules(t,o.when))return o}return null},e.contextMatchesRules=function(e,t){return!t||t.evaluate(e)},e.getAllUnboundCommands=function(e){var t=i.CommandsRegistry.getCommands(),o=[];for(var r in t)"_"!==r[0]&&0!==r.indexOf("vscode.")&&("object"!=typeof t[r].description||n.isFalsyOrEmpty(t[r].description.args))&&!0!==e.get(r)&&o.push(r);return o},e}();t.KeybindingResolver=o}),define(d[417],h([1,0,3,31,159,19,62,11]),function(e,t,n,i,o,r,s,a){"use strict";function u(e){for(;e;){if(e.hasAttribute(l))return parseInt(e.getAttribute(l),10);e=e.parentElement}return 0}Object.defineProperty(t,"__esModule",{value:!0});var l="data-keybinding-context",c=function(){function e(e,t){this._id=e,this._parent=t,this._value=Object.create(null),this._value._contextId=e}return e.prototype.setValue=function(e,t){return this._value[e]!==t&&(this._value[e]=t,!0)},e.prototype.removeValue=function(e){return delete this._value[e]},e.prototype.getValue=function(e){var t=this._value[e];return void 0===t&&this._parent?this._parent.getValue(e):t},e}();t.Context=c;var d=function(e){function t(t,n,i){var o=e.call(this,t,null)||this;return o._emitter=i,o._subscription=n.onDidUpdateConfiguration(function(e){return o._updateConfigurationContext(n.getConfiguration())}),o._updateConfigurationContext(n.getConfiguration()),o}return f(t,e),t.prototype.dispose=function(){this._subscription.dispose()},t.prototype._updateConfigurationContext=function(e){var t=this;for(var n in this._value)0===n.indexOf("config.")&&delete this._value[n];var i=function(e,n){for(var o in e)if(Object.prototype.hasOwnProperty.call(e,o)){n.push(o);var r=e[o];if("boolean"==typeof r){var s=n.join(".");t._value[s]=r,t._emitter.fire(s)}else"object"==typeof r&&i(r,n);n.pop()}};i(e,["config"])},t}(c),h=function(){function e(e,t,n){this._parent=e,this._key=t,this._defaultValue=n,this.reset()}return e.prototype.set=function(e){this._parent.setContext(this._key,e)},e.prototype.reset=function(){void 0===this._defaultValue?this._parent.removeContext(this._key):this._parent.setContext(this._key,this._defaultValue)},e.prototype.get=function(){return this._parent.getContextKeyValue(this._key)},e}(),p=function(){function e(e){this._myContextId=e,this._onDidChangeContextKey=new a.Emitter}return e.prototype.createKey=function(e,t){return new h(this,e,t)},Object.defineProperty(e.prototype,"onDidChangeContext",{get:function(){return this._onDidChangeContext||(this._onDidChangeContext=a.debounceEvent(this._onDidChangeContextKey.event,function(e,t){return e?e.indexOf(t)<0&&e.push(t):e=[t],e},25)),this._onDidChangeContext},enumerable:!0,configurable:!0}),e.prototype.createScoped=function(e){return new m(this,this._onDidChangeContextKey,e)},e.prototype.contextMatchesRules=function(e){var t=this.getContextValuesContainer(this._myContextId);return o.KeybindingResolver.contextMatchesRules(t,e)},e.prototype.getContextKeyValue=function(e){return this.getContextValuesContainer(this._myContextId).getValue(e)},e.prototype.setContext=function(e,t){this.getContextValuesContainer(this._myContextId).setValue(e,t)&&this._onDidChangeContextKey.fire(e)},e.prototype.removeContext=function(e){this.getContextValuesContainer(this._myContextId).removeValue(e)&&this._onDidChangeContextKey.fire(e)},e.prototype.getContext=function(e){return this.getContextValuesContainer(u(e))},e}();t.AbstractContextKeyService=p;var g=function(e){function t(t){var n=e.call(this,0)||this;n._toDispose=[],n._lastContextId=0,n._contexts=Object.create(null);var i=new d(n._myContextId,t,n._onDidChangeContextKey);return n._contexts[String(n._myContextId)]=i,n._toDispose.push(i),n}return f(t,e),t.prototype.dispose=function(){this._toDispose=n.dispose(this._toDispose)},t.prototype.getContextValuesContainer=function(e){return this._contexts[String(e)]},t.prototype.createChildContext=function(e){void 0===e&&(e=this._myContextId);var t=++this._lastContextId;return this._contexts[String(t)]=new c(t,this.getContextValuesContainer(e)),t},t.prototype.disposeContext=function(e){delete this._contexts[String(e)]},t=v([y(0,s.IConfigurationService)],t)}(p);t.ContextKeyService=g;var m=function(e){function t(t,n,i){var o=e.call(this,t.createChildContext())||this;return o._parent=t,o._onDidChangeContextKey=n,i&&(o._domNode=i,o._domNode.setAttribute(l,String(o._myContextId))),o}return f(t,e),t.prototype.dispose=function(){this._parent.disposeContext(this._myContextId),this._domNode&&this._domNode.removeAttribute(l)},Object.defineProperty(t.prototype,"onDidChangeContext",{get:function(){return this._parent.onDidChangeContext},enumerable:!0,configurable:!0}),t.prototype.getContextValuesContainer=function(e){return this._parent.getContextValuesContainer(e)},t.prototype.createChildContext=function(e){return void 0===e&&(e=this._myContextId),this._parent.createChildContext(e)},t.prototype.disposeContext=function(e){this._parent.disposeContext(e)},t}(p);i.CommandsRegistry.registerCommand(r.SET_CONTEXT_COMMAND_ID,function(e,t,n){e.get(r.IContextKeyService).createKey(String(t),n)})}),define(d[418],h([1,0]),function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=function(){return function(e,t,n,i,o){if(this.resolvedKeybinding=e,e){var r=e.getDispatchParts(),s=r[0],a=r[1];this.keypressFirstPart=s,this.keypressChordPart=a}else this.keypressFirstPart=null,this.keypressChordPart=null;this.bubble=!!t&&94===t.charCodeAt(0),this.command=this.bubble?t.substr(1):t,this.commandArgs=n,this.when=i,this.isDefault=o}}();t.ResolvedKeybindingItem=n}),define(d[419],h([1,0,40,155]),function(e,t,n,i){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var o=function(e){function t(t,n){var i=e.call(this)||this;return i._os=n,null===t?(i._firstPart=null,i._chordPart=null):2===t.type?(i._firstPart=t.firstPart,i._chordPart=t.chordPart):(i._firstPart=t,i._chordPart=null),i}return f(t,e),t.prototype._keyCodeToUILabel=function(e){if(2===this._os)switch(e){case 15:return"←";case 16:return"↑";case 17:return"→";case 18:return"↓"}return n.KeyCodeUtils.toString(e)},t.prototype._getUILabelForKeybinding=function(e){return e?e.isDuplicateModifierCase()?"":this._keyCodeToUILabel(e.keyCode):null},t.prototype.getLabel=function(){var e=this._getUILabelForKeybinding(this._firstPart),t=this._getUILabelForKeybinding(this._chordPart);return i.UILabelProvider.toLabel(this._firstPart,e,this._chordPart,t,this._os)},t.prototype._getAriaLabelForKeybinding=function(e){return e?e.isDuplicateModifierCase()?"":n.KeyCodeUtils.toString(e.keyCode):null},t.prototype.getAriaLabel=function(){var e=this._getAriaLabelForKeybinding(this._firstPart),t=this._getAriaLabelForKeybinding(this._chordPart);return i.AriaLabelProvider.toLabel(this._firstPart,e,this._chordPart,t,this._os)},t.prototype._keyCodeToElectronAccelerator=function(e){if(e>=93&&e<=108)return null;switch(e){case 16:return"Up";case 18:return"Down";case 15:return"Left";case 17:return"Right"}return n.KeyCodeUtils.toString(e)},t.prototype._getElectronAcceleratorLabelForKeybinding=function(e){return e?e.isDuplicateModifierCase()?null:this._keyCodeToElectronAccelerator(e.keyCode):null},t.prototype.getElectronAccelerator=function(){if(null!==this._chordPart)return null;var e=this._getElectronAcceleratorLabelForKeybinding(this._firstPart);return i.ElectronAcceleratorLabelProvider.toLabel(this._firstPart,e,null,null,this._os)},t.prototype._getUserSettingsLabelForKeybinding=function(e){return e?e.isDuplicateModifierCase()?"":n.KeyCodeUtils.toUserSettingsUS(e.keyCode):null},t.prototype.getUserSettingsLabel=function(){var e=this._getUserSettingsLabelForKeybinding(this._firstPart),t=this._getUserSettingsLabelForKeybinding(this._chordPart),n=i.UserSettingsLabelProvider.toLabel(this._firstPart,e,this._chordPart,t,this._os);return n?n.toLowerCase():n},t.prototype.isWYSIWYG=function(){return!0},t.prototype.isChord=function(){return!!this._chordPart},t.prototype.getParts=function(){return[this._toResolvedKeybindingPart(this._firstPart),this._toResolvedKeybindingPart(this._chordPart)]},t.prototype._toResolvedKeybindingPart=function(e){return e?new n.ResolvedKeybindingPart(e.ctrlKey,e.shiftKey,e.altKey,e.metaKey,this._getUILabelForKeybinding(e),this._getAriaLabelForKeybinding(e)):null},t.prototype.getDispatchParts=function(){return[this._firstPart?t.getDispatchStr(this._firstPart):null,this._chordPart?t.getDispatchStr(this._chordPart):null]},t.getDispatchStr=function(e){if(e.isModifierKey())return null;var t="";return e.ctrlKey&&(t+="ctrl+"),e.shiftKey&&(t+="shift+"),e.altKey&&(t+="alt+"),e.metaKey&&(t+="meta+"),t+=n.KeyCodeUtils.toString(e.keyCode)},t}(n.ResolvedKeybinding);t.USLayoutResolvedKeybinding=o}),define(d[420],h([1,0,7,11,16]),function(e,t,n,i,o){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ILifecycleService=o.createDecorator("lifecycleService");!function(e){e[e.CLOSE=1]="CLOSE",e[e.QUIT=2]="QUIT",e[e.RELOAD=3]="RELOAD",e[e.LOAD=4]="LOAD"}(t.ShutdownReason||(t.ShutdownReason={}));var r;!function(e){e[e.NewWindow=1]="NewWindow",e[e.ReloadedWindow=3]="ReloadedWindow",e[e.ReopenedWindow=4]="ReopenedWindow"}(r=t.StartupKind||(t.StartupKind={}));var s;!function(e){e[e.Starting=1]="Starting",e[e.Running=2]="Running",e[e.ShuttingDown=3]="ShuttingDown"}(s=t.LifecyclePhase||(t.LifecyclePhase={})),t.NullLifecycleService={_serviceBrand:null,phase:s.Running,startupKind:r.NewWindow,onDidChangePhase:i.default.None,onWillShutdown:i.default.None,onShutdown:i.default.None},t.handleVetos=function(e,t){if(0===e.length)return n.TPromise.as(!1);for(var i=[],o=!1,r=0,s=e;r0?a:1,u=u>0?u:1,l=l>=a?l:a,c=c>0?c:u,{resource:t,owner:e,code:i,severity:o,message:r,source:s,startLineNumber:a,startColumn:u,endLineNumber:l,endColumn:c}},e.prototype.changeAll=function(t,i){var o=[],r=this._byOwner[t];if(r){delete this._byOwner[t];for(var s in r){var u=a.get(this._byResource,s,t)[0];u&&o.push(u.resource),a.remove(this._byResource,s,t)}}if(!n.isFalsyOrEmpty(i)){for(var l=Object.create(null),c=0,d=i;c0&&this._onMarkerChanged.fire(o)},e.prototype.read=function(e){void 0===e&&(e=Object.create(null));var t=e.owner,n=e.resource,i=e.take;if((!i||i<0)&&(i=-1),t&&n)return(d=a.get(this._byResource,n.toString(),t))?d.slice(0,i>0?i:void 0):[];if(t||n){var o=t?this._byOwner[t]:this._byResource[n.toString()];if(!o)return[];d=[];for(var r in o)for(var s=0,u=o[r];s0&&c===i)return d}return d}var d=[];for(var h in this._byResource)for(var p in this._byResource[h])for(var f=0,g=this._byResource[h][p];f0&&c===i)return d}return d},e._debouncer=function(t,n){t||(e._dedupeMap=Object.create(null),t=[]);for(var i=0,o=n;i0)})(s)&&(Array.isArray(s)?n=n.concat(s.map(e)):n.push(e(s)))}}return n},e.prototype.onResult=function(e,t){this._result=this._result.concat(e)},e.prototype.getResult=function(){return this._result},e.prototype.getResultWithLoadingMessage=function(){return this.getResult()},e}(),d=function(e){function t(i,o,r){var a=e.call(this,t.ID,i)||this;return a.openerService=o,a.modeService=r,a.openerService=o||s.NullOpenerService,a._lastLineNumber=-1,a._computer=new c(a._editor),a._hoverOperation=new n.HoverOperation(a._computer,function(e){return a._withResult(e)},null,function(e){return a._withResult(e)}),a}return f(t,e),t.prototype.dispose=function(){this._hoverOperation.cancel(),e.prototype.dispose.call(this)},t.prototype.onModelDecorationsChanged=function(){this.isVisible&&(this._hoverOperation.cancel(),this._computer.clearResult(),this._hoverOperation.start())},t.prototype.startShowingAt=function(e){this._lastLineNumber!==e&&(this._hoverOperation.cancel(),this.hide(),this._lastLineNumber=e,this._computer.setLineNumber(e),this._hoverOperation.start())},t.prototype.hide=function(){this._lastLineNumber=-1,this._hoverOperation.cancel(),e.prototype.hide.call(this)},t.prototype._withResult=function(e){this._messages=e,this._messages.length>0?this._renderMessages(this._lastLineNumber,this._messages):this.hide()},t.prototype._renderMessages=function(e,t){var n=this,i=document.createDocumentFragment();t.forEach(function(e){var t=r.renderMarkedString(e.value,{actionCallback:function(e){return n.openerService.open(a.default.parse(e)).then(void 0,u.onUnexpectedError)},codeBlockRenderer:function(e,t){var i=n.modeService.getModeIdForLanguageName(e);return n.modeService.getOrCreateMode(i).then(function(e){return l.tokenizeToString(t,i)})}});i.appendChild(o.$("div.hover-row",null,t))}),this.updateContents(i),this.showAt(e)},t.ID="editor.contrib.modesGlyphHoverWidget",t}(i.GlyphHoverWidget);t.ModesGlyphHoverWidget=d}),define(d[163],h([1,0,16]),function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.IProgressService=n.createDecorator("progressService"),t.emptyProgress=Object.freeze({report:function(){}});var i=function(){function e(e){this._callback=e}return Object.defineProperty(e.prototype,"value",{get:function(){return this._value},enumerable:!0,configurable:!0}),e.prototype.report=function(e){this._value=e,this._callback()},e}();t.Progress=i;!function(e){e[e.Scm=1]="Scm",e[e.Window=10]="Window"}(t.ProgressLocation||(t.ProgressLocation={})),t.IProgressService2=n.createDecorator("progressService2")}),define(d[44],h([1,0,29,72]),function(e,t,n,i){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var o=function(){function e(){this.data={}}return e.prototype.add=function(e,t){i.ok(n.isString(e)),i.ok(n.isObject(t)),i.ok(!this.data.hasOwnProperty(e),"There is already an extension with this id"),this.data[e]=t},e.prototype.knows=function(e){return this.data.hasOwnProperty(e)},e.prototype.as=function(e){return this.data[e]||null},e}();t.Registry=new o;var r=function(){function e(){this.toBeInstantiated=[],this.instances=[]}return e.prototype.setInstantiationService=function(e){for(this.instantiationService=e;this.toBeInstantiated.length>0;){var t=this.toBeInstantiated.shift();this.instantiate(t)}},e.prototype.instantiate=function(e){var t=this.instantiationService.createInstance(e);this.instances.push(t)},e.prototype._register=function(e){this.instantiationService?this.instantiate(e):this.toBeInstantiated.push(e)},e.prototype._getInstances=function(){return this.instances.slice(0)},e.prototype._setInstances=function(e){this.instances=e},e}();t.BaseRegistry=r}),define(d[30],h([1,0,44]),function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.editorContribution=function(e){o.INSTANCE.registerEditorBrowserContribution(e)};!function(e){e.getEditorContributions=function(){return o.INSTANCE.getEditorBrowserContributions()}}(t.EditorBrowserRegistry||(t.EditorBrowserRegistry={}));var i={EditorContributions:"editor.contributions"},o=function(){function e(){this.editorContributions=[]}return e.prototype.registerEditorBrowserContribution=function(e){this.editorContributions.push(e)},e.prototype.getEditorBrowserContributions=function(){return this.editorContributions.slice(0)},e.INSTANCE=new e,e}();n.Registry.add(i.EditorContributions,o.INSTANCE)}),define(d[126],h([1,0,336,11,44,43,17]),function(e,t,n,i,o,r,s){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Extensions={ModesRegistry:"editor.modesRegistry"};var a=function(){function e(){this._onDidAddLanguages=new i.Emitter,this.onDidAddLanguages=this._onDidAddLanguages.event,this._languages=[]}return e.prototype.registerLanguage=function(e){this._languages.push(e),this._onDidAddLanguages.fire([e])},e.prototype.registerLanguages=function(e){this._languages=this._languages.concat(e),this._onDidAddLanguages.fire(e)},e.prototype.getLanguages=function(){return this._languages.slice(0)},e}();t.EditorModesRegistry=a,t.ModesRegistry=new a,o.Registry.add(t.Extensions.ModesRegistry,t.ModesRegistry),t.PLAINTEXT_MODE_ID="plaintext",t.PLAINTEXT_LANGUAGE_IDENTIFIER=new s.LanguageIdentifier(t.PLAINTEXT_MODE_ID,1),t.ModesRegistry.registerLanguage({id:t.PLAINTEXT_MODE_ID,extensions:[".txt",".gitignore"],aliases:[n.localize(0,null),"text"],mimetypes:["text/plain"]}),r.LanguageConfigurationRegistry.register(t.PLAINTEXT_LANGUAGE_IDENTIFIER,{brackets:[["(",")"],["[","]"],["{","}"]]})}),define(d[430],h([1,0,339,70,11,36,7,103,2,20,175,15,62,49,126,101,55,34]),function(e,t,n,i,o,r,s,a,u,l,c,d,h,p,f,g,m,_){"use strict";function C(e){return e.toString()}Object.defineProperty(t,"__esModule",{value:!0});var b=function(){function e(e,t){var n=this;this.model=e,this._markerDecorations=[],this._modelEventsListener=e.addBulkListener(function(e){return t(n,e)})}return e.prototype.dispose=function(){this._markerDecorations=this.model.deltaDecorations(this._markerDecorations,[]),this._modelEventsListener.dispose(),this._modelEventsListener=null,this.model=null},e.prototype.getModelId=function(){return C(this.model.uri)},e.prototype.acceptMarkerDecorations=function(e){this._markerDecorations=this.model.deltaDecorations(this._markerDecorations,e)},e}(),w=function(){function e(){}return e.setMarkers=function(e,t){var n=this,i=t.read({resource:e.model.uri,take:500}).map(function(t){return{range:n._createDecorationRange(e.model,t),options:n._createDecorationOption(t)}});e.acceptMarkerDecorations(i)},e._createDecorationRange=function(e,t){var n=e.validateRange(new u.Range(t.startLineNumber,t.startColumn,t.endLineNumber,t.endColumn)),i=new u.Range(n.startLineNumber,n.startColumn,n.endLineNumber,n.endColumn);if(i.isEmpty()){var o=e.getWordAtPosition(i.getStartPosition());if(o)i=new u.Range(i.startLineNumber,o.startColumn,i.endLineNumber,o.endColumn);else{var r=e.getLineLastNonWhitespaceColumn(n.startLineNumber)||e.getLineMaxColumn(n.startLineNumber);1===r||(i=i.endColumn>=r?new u.Range(i.startLineNumber,r-1,i.endLineNumber,r):new u.Range(i.startLineNumber,i.startColumn,i.endLineNumber,i.endColumn+1))}}else if(t.endColumn===Number.MAX_VALUE&&1===t.startColumn&&i.startLineNumber===i.endLineNumber){var s=e.getLineFirstNonWhitespaceColumn(t.startLineNumber);s0&&"#"===e.charAt(e.length-1)?e.substring(0,e.length-1):e}Object.defineProperty(t,"__esModule",{value:!0}),t.Extensions={JSONContribution:"base.contributions.json"};var r=new(function(){function e(){this.schemasById={},this.eventEmitter=new i.EventEmitter}return e.prototype.addRegistryChangedListener=function(e){return this.eventEmitter.addListener("registryChanged",e)},e.prototype.registerSchema=function(e,t){this.schemasById[o(e)]=t,this.eventEmitter.emit("registryChanged",{})},e.prototype.getSchemaContributions=function(){return{schemas:this.schemasById}},e}());n.Registry.add(t.Extensions.JSONContribution,r)}),define(d[127],h([1,0,382,11,44,29,9,433]),function(e,t,n,i,o,r,s,a){"use strict";function u(e){switch(Array.isArray(e)?e[0]:e){case"boolean":return!1;case"integer":case"number":return 0;case"string":return"";case"array":return[];case"object":return{};default:return null}}function l(e){return t.OVERRIDE_PROPERTY_PATTERN.test(e)?n.localize(3,null,e):void 0!==m.getConfigurationProperties()[e]?n.localize(4,null,e):null}Object.defineProperty(t,"__esModule",{value:!0}),t.Extensions={Configuration:"base.contributions.configuration"};var c;!function(e){e[e.WINDOW=1]="WINDOW",e[e.RESOURCE=2]="RESOURCE"}(c=t.ConfigurationScope||(t.ConfigurationScope={})),t.schemaId="vscode://schemas/settings",t.editorConfigurationSchemaId="vscode://schemas/settings/editor",t.resourceConfigurationSchemaId="vscode://schemas/settings/resource";var d=o.Registry.as(a.Extensions.JSONContribution),h=function(){function e(){this.overrideIdentifiers=[],this.configurationContributors=[],this.configurationSchema={properties:{},patternProperties:{},additionalProperties:!1,errorMessage:"Unknown configuration setting"},this.editorConfigurationSchema={properties:{},patternProperties:{},additionalProperties:!1,errorMessage:"Unknown editor configuration setting"},this.resourceConfigurationSchema={properties:{},patternProperties:{},additionalProperties:!1,errorMessage:"Not a resource configuration setting"},this._onDidRegisterConfiguration=new i.Emitter,this.configurationProperties={},this.computeOverridePropertyPattern(),d.registerSchema(t.schemaId,this.configurationSchema),d.registerSchema(t.editorConfigurationSchemaId,this.editorConfigurationSchema),d.registerSchema(t.resourceConfigurationSchemaId,this.resourceConfigurationSchema)}return Object.defineProperty(e.prototype,"onDidRegisterConfiguration",{get:function(){return this._onDidRegisterConfiguration.event},enumerable:!0,configurable:!0}),e.prototype.registerConfiguration=function(e,t){void 0===t&&(t=!0),this.registerConfigurations([e],t)},e.prototype.registerConfigurations=function(e,t){var n=this;void 0===t&&(t=!0),e.forEach(function(e){n.validateAndRegisterProperties(e,t),n.configurationContributors.push(e),n.registerJSONConfiguration(e),n.updateSchemaForOverrideSettingsConfiguration(e)}),this._onDidRegisterConfiguration.fire(this)},e.prototype.registerOverrideIdentifiers=function(e){(t=this.overrideIdentifiers).push.apply(t,e),this.updateOverridePropertyPatternKey();var t},e.prototype.registerDefaultConfigurations=function(e){for(var i={id:"defaultOverrides",title:n.localize(0,null),properties:{}},o=0,r=e;o0){var m=t.firstLine;"^"!==m.charAt(0)&&(m="^"+m);try{var v=new RegExp(m);o.regExpLeadsToEndlessLoop(v)||i.registerTextMime({id:r,mime:s,firstline:v})}catch(e){n.onUnexpectedError(e)}}e.aliases.push(r);var _=null;if(void 0!==t.aliases&&Array.isArray(t.aliases)&&(_=0===t.aliases.length?[null]:t.aliases),null!==_)for(var y=0;y<_.length;y++)_[y]&&0!==_[y].length&&e.aliases.push(_[y]);var C=null!==_&&_.length>0;if(C&&null===_[0]);else{var b=(C?_[0]:null)||r;!C&&e.name||(e.name=b)}"string"==typeof t.configuration&&e.configurationFiles.push(t.configuration)},e.prototype.isRegisteredMode=function(e){return!!c.call(this._mimeTypesMap,e)||c.call(this._languages,e)},e.prototype.getRegisteredModes=function(){return Object.keys(this._languages)},e.prototype.getRegisteredLanguageNames=function(){return Object.keys(this._nameMap)},e.prototype.getLanguageName=function(e){return c.call(this._languages,e)?this._languages[e].name:null},e.prototype.getModeIdForLanguageNameLowercase=function(e){return c.call(this._lowercaseNameMap,e)?this._lowercaseNameMap[e].language:null},e.prototype.getConfigurationFiles=function(e){return c.call(this._languages,e)?this._languages[e].configurationFiles||[]:[]},e.prototype.getMimeForMode=function(e){return c.call(this._languages,e)?this._languages[e].mimetypes[0]||null:null},e.prototype.extractModeIds=function(e){var t=this;return e?e.split(",").map(function(e){return e.trim()}).map(function(e){return c.call(t._mimeTypesMap,e)?t._mimeTypesMap[e].language:e}).filter(function(e){return c.call(t._languages,e)}):[]},e.prototype.getLanguageIdentifier=function(e){if(e===u.NULL_MODE_ID||0===e)return u.NULL_LANGUAGE_IDENTIFIER;var t;if("string"==typeof e)t=e;else if(!(t=this._languageIds[e]))return null;return c.call(this._languages,t)?this._languages[t].identifier:null},e.prototype.getModeIdsFromLanguageName=function(e){return e&&c.call(this._nameMap,e)?[this._nameMap[e].language]:[]},e.prototype.getModeIdsFromFilenameOrFirstLine=function(e,t){if(!e&&!t)return[];var n=i.guessMimeTypes(e,t);return this.extractModeIds(n.join(","))},e.prototype.getExtensions=function(e){if(!c.call(this._nameMap,e))return[];var t=this._nameMap[e];return this._languages[t.language].extensions},e.prototype.getFilenames=function(e){if(!c.call(this._nameMap,e))return[];var t=this._nameMap[e];return this._languages[t.language].filenames},e}();t.LanguagesRegistry=d}),define(d[437],h([1,0,10,11,7,511,436]),function(e,t,n,i,o,r,s){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var a=function(){function e(){this._onDidCreateMode=new i.Emitter,this.onDidCreateMode=this._onDidCreateMode.event,this._instantiatedModes={},this._registry=new s.LanguagesRegistry}return e.prototype._onReady=function(){return o.TPromise.as(!0)},e.prototype.isRegisteredMode=function(e){return this._registry.isRegisteredMode(e)},e.prototype.getRegisteredModes=function(){return this._registry.getRegisteredModes()},e.prototype.getRegisteredLanguageNames=function(){return this._registry.getRegisteredLanguageNames()},e.prototype.getExtensions=function(e){return this._registry.getExtensions(e)},e.prototype.getFilenames=function(e){return this._registry.getFilenames(e)},e.prototype.getMimeForMode=function(e){return this._registry.getMimeForMode(e)},e.prototype.getLanguageName=function(e){return this._registry.getLanguageName(e)},e.prototype.getModeIdForLanguageName=function(e){return this._registry.getModeIdForLanguageNameLowercase(e)},e.prototype.getModeIdByFilenameOrFirstLine=function(e,t){var n=this._registry.getModeIdsFromFilenameOrFirstLine(e,t);return n.length>0?n[0]:null},e.prototype.getModeId=function(e){var t=this._registry.extractModeIds(e);return t.length>0?t[0]:null},e.prototype.getLanguageIdentifier=function(e){return this._registry.getLanguageIdentifier(e)},e.prototype.getConfigurationFiles=function(e){return this._registry.getConfigurationFiles(e)},e.prototype.lookup=function(e){for(var t=[],n=this._registry.extractModeIds(e),i=0;i0?t[0]:null},e.prototype.getOrCreateModeByFilenameOrFirstLine=function(e,t){var n=this;return this._onReady().then(function(){var i=n.getModeIdByFilenameOrFirstLine(e,t);return n._getOrCreateMode(i||"plaintext")})},e.prototype._getOrCreateMode=function(e){if(!this._instantiatedModes.hasOwnProperty(e)){var t=this.getLanguageIdentifier(e);this._instantiatedModes[e]=new r.FrankensteinMode(t),this._onDidCreateMode.fire(this._instantiatedModes[e])}return this._instantiatedModes[e]},e}();t.ModeServiceImpl=a}),define(d[438],h([1,0,44,442,127,62]),function(e,t,n,i,o,r){"use strict";function s(){var e=Object.create(null),t=n.Registry.as(o.Extensions.Configuration).getConfigurationProperties();for(var i in t)u(e,i,t[i].default,function(e){return console.error("Conflict in default settings: "+e)});return e}function a(e,t){var n=Object.create(null);for(var i in e)u(n,i,e[i],t);return n}function u(e,t,n,i){for(var o=t.split("."),r=o.pop(),s=e,a=0;at.command?1:e.weight2-t.weight2}Object.defineProperty(t,"__esModule",{value:!0});var a=function(){function e(){this.WEIGHT={editorCore:function(e){return void 0===e&&(e=0),0+e},editorContrib:function(e){return void 0===e&&(e=0),100+e},workbenchContrib:function(e){return void 0===e&&(e=0),200+e},builtinExtension:function(e){return void 0===e&&(e=0),300+e},externalExtension:function(e){return void 0===e&&(e=0),400+e}},this._keybindings=[]}return e.bindToCurrentPlatform=function(e){if(1===i.OS){if(e&&e.win)return e.win}else if(2===i.OS){if(e&&e.mac)return e.mac}else if(e&&e.linux)return e.linux;return e},e.bindToCurrentPlatform2=function(e){if(1===i.OS){if(e&&e.win)return e.win}else if(2===i.OS){if(e&&e.mac)return e.mac}else if(e&&e.linux)return e.linux;return e},e.prototype.registerKeybindingRule=function(t){var o=this,r=e.bindToCurrentPlatform(t);r&&r.primary&&this.registerDefaultKeybinding(n.createKeybinding(r.primary,i.OS),t.id,t.weight,0,t.when),r&&Array.isArray(r.secondary)&&r.secondary.forEach(function(e,r){return o.registerDefaultKeybinding(n.createKeybinding(e,i.OS),t.id,t.weight,-r-1,t.when)})},e.prototype.registerKeybindingRule2=function(t){var n=e.bindToCurrentPlatform2(t);n&&n.primary&&this.registerDefaultKeybinding(n.primary,t.id,t.weight,0,t.when)},e.prototype.registerCommandAndKeybindingRule=function(e){this.registerKeybindingRule(e),o.CommandsRegistry.registerCommand(e.id,e)},e._mightProduceChar=function(e){return e>=21&&e<=30||(e>=31&&e<=56||(80===e||81===e||82===e||83===e||84===e||85===e||86===e||110===e||111===e||87===e||88===e||89===e||90===e||91===e||92===e))},e.prototype._assertNoCtrlAlt=function(t,n){t.ctrlKey&&t.altKey&&!t.metaKey&&e._mightProduceChar(t.keyCode)&&console.warn("Ctrl+Alt+ keybindings should not be used by default under Windows. Offender: ",t," for ",n)},e.prototype.registerDefaultKeybinding=function(e,t,n,o,r){1===i.OS&&(2===e.type?this._assertNoCtrlAlt(e.firstPart,t):this._assertNoCtrlAlt(e,t)),this._keybindings.push({keybinding:e,command:t,commandArgs:null,when:r,weight1:n,weight2:o})},e.prototype.getDefaultKeybindings=function(){var e=this._keybindings.slice(0);return e.sort(s),e},e}();t.KeybindingsRegistry=new a,t.Extensions={EditorModes:"platform.keybindingsRegistry"},r.Registry.add(t.Extensions.EditorModes,t.KeybindingsRegistry)}),define(d[129],h([1,0,70,36,24,7,62,31,414,419,159,46,20,11,438,3,4,65,105,407,40,418,15]),function(e,t,n,i,o,r,s,a,u,l,c,d,h,p,g,m,v,_,y,C,b,w,S){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var E=function(){function e(e){this._widget=e}return e.prototype.getId=function(){return"editor"},e.prototype.getControl=function(){return this._widget},e.prototype.getSelection=function(){return this._widget.getSelection()},e.prototype.focus=function(){this._widget.focus()},e.prototype.isVisible=function(){return!0},e.prototype.withTypedEditor=function(e,t){return h.isCommonCodeEditor(this._widget)?e(this._widget):t(this._widget)},e}();t.SimpleEditor=E;var L=function(){function e(e){this.model=e,this._onDispose=new p.Emitter}return Object.defineProperty(e.prototype,"onDispose",{get:function(){return this._onDispose.event},enumerable:!0,configurable:!0}),e.prototype.load=function(){return r.TPromise.as(this)},Object.defineProperty(e.prototype,"textEditorModel",{get:function(){return this.model},enumerable:!0,configurable:!0}),e.prototype.dispose=function(){this._onDispose.fire()},e}();t.SimpleModel=L;var x=function(){function e(){this.openEditorDelegate=null}return e.prototype.setEditor=function(e){this.editor=new E(e)},e.prototype.setOpenEditorDelegate=function(e){this.openEditorDelegate=e},e.prototype.openEditor=function(e,t){var n=this;return r.TPromise.as(this.editor.withTypedEditor(function(t){return n.doOpenEditor(t,e)},function(t){return n.doOpenEditor(t.getOriginalEditor(),e)||n.doOpenEditor(t.getModifiedEditor(),e)}))},e.prototype.doOpenEditor=function(e,t){if(!this.findModel(e,t)){if(t.resource){if(this.openEditorDelegate)return this.openEditorDelegate(t.resource.toString()),null;var i=t.resource.scheme;if(i===n.Schemas.http||i===n.Schemas.https)return v.windowOpenNoOpener(t.resource.toString()),this.editor}return null}var o=t.options.selection;if(o)if("number"==typeof o.endLineNumber&&"number"==typeof o.endColumn)e.setSelection(o),e.revealRangeInCenter(o);else{var r={lineNumber:o.startLineNumber,column:o.startColumn};e.setPosition(r),e.revealPositionInCenter(r)}return this.editor},e.prototype.findModel=function(e,t){var n=e.getModel();return n.uri.toString()!==t.resource.toString()?null:n},e}();t.SimpleEditorService=x;var N=function(){function e(){}return e.prototype.setEditor=function(e){this.editor=new E(e)},e.prototype.createModelReference=function(e){var t,n=this;return(t=this.editor.withTypedEditor(function(t){return n.findModel(t,e)},function(t){return n.findModel(t.getOriginalEditor(),e)||n.findModel(t.getModifiedEditor(),e)}))?r.TPromise.as(new m.ImmortalReference(new L(t))):r.TPromise.as(new m.ImmortalReference(null))},e.prototype.registerTextModelContentProvider=function(e,t){return{dispose:function(){}}},e.prototype.findModel=function(e,t){var n=e.getModel();return n.uri.toString()!==t.toString()?null:n},e}();t.SimpleEditorModelResolverService=N;var M=function(){function e(){}return e.prototype.show=function(){return e.NULL_PROGRESS_RUNNER},e.prototype.showWhile=function(e,t){return null},e.NULL_PROGRESS_RUNNER={done:function(){},total:function(){},worked:function(){}},e}();t.SimpleProgressService=M;var T=function(){function e(){}return e.prototype.show=function(t,n){switch(t){case i.default.Error:console.error(n);break;case i.default.Warning:console.warn(n);break;default:console.log(n)}return e.Empty},e.prototype.hideAll=function(){},e.prototype.confirm=function(e){var t=e.message;return e.detail&&(t=t+"\n\n"+e.detail),window.confirm(t)},e.Empty=function(){},e}();t.SimpleMessageService=T;var k=function(){function e(e){this._onWillExecuteCommand=new p.Emitter,this.onWillExecuteCommand=this._onWillExecuteCommand.event,this._instantiationService=e,this._dynamicCommands=Object.create(null)}return e.prototype.addCommand=function(e,t){var n=this;return this._dynamicCommands[e]=t,{dispose:function(){delete n._dynamicCommands[e]}}},e.prototype.executeCommand=function(e){for(var t=[],n=1;n.001){C=!1;break}}var L=r.getTimeSinceLastZoomLevelChanged()>2e3;return new a.FontInfo({zoomLevel:r.getZoomLevel(),fontFamily:e.fontFamily,fontWeight:e.fontWeight,fontSize:e.fontSize,lineHeight:e.lineHeight,letterSpacing:e.letterSpacing,isMonospace:C,typicalHalfwidthCharacterWidth:i.width,typicalFullwidthCharacterWidth:o.width,spaceWidth:s.width,maxDigitWidth:y},L)},t.INSTANCE=new t,t}(i.Disposable),p=function(e){function t(t,n){void 0===n&&(n=null);var i=e.call(this,t)||this;return i._elementSizeObserver=i._register(new u.ElementSizeObserver(n,function(){return i._onReferenceDomElementSizeChanged()})),i._register(h.INSTANCE.onDidChange(function(){return i._onCSSBasedConfigurationChanged()})),i._validatedOptions.automaticLayout&&i._elementSizeObserver.startObserving(),i._register(r.onDidChangeZoomLevel(function(e){return i._recomputeOptions()})),i._register(r.onDidChangeAccessibilitySupport(function(){return i._recomputeOptions()})),i._recomputeOptions(),i}return f(t,e),t.applyFontInfoSlow=function(e,t){e.style.fontFamily=t.fontFamily,e.style.fontWeight=t.fontWeight,e.style.fontSize=t.fontSize+"px",e.style.lineHeight=t.lineHeight+"px",e.style.letterSpacing=t.letterSpacing+"px"},t.applyFontInfo=function(e,t){e.setFontFamily(t.fontFamily),e.setFontWeight(t.fontWeight),e.setFontSize(t.fontSize),e.setLineHeight(t.lineHeight),e.setLetterSpacing(t.letterSpacing)},t.prototype._onReferenceDomElementSizeChanged=function(){this._recomputeOptions()},t.prototype._onCSSBasedConfigurationChanged=function(){this._recomputeOptions()},t.prototype.observeReferenceElement=function(e){this._elementSizeObserver.observe(e)},t.prototype.dispose=function(){e.prototype.dispose.call(this)},t.prototype._getExtraEditorClassName=function(){var e="";return r.isIE?e+="ie ":r.isFirefox?e+="ff ":r.isEdge&&(e+="edge "),o.isMacintosh&&(e+="mac "),e},t.prototype._getEnvConfiguration=function(){return{extraEditorClassName:this._getExtraEditorClassName(),outerWidth:this._elementSizeObserver.getWidth(),outerHeight:this._elementSizeObserver.getHeight(),emptySelectionClipboard:r.isWebKit,pixelRatio:r.getPixelRatio(),zoomLevel:r.getZoomLevel(),accessibilitySupport:r.getAccessibilitySupport()}},t.prototype.readConfiguration=function(e){return h.INSTANCE.readConfiguration(e)},t}(s.CommonEditorConfiguration);t.Configuration=p}),define(d[443],h([1,0,27,112,66,35]),function(e,t,n,i,o,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var s=function(e){function t(t){var n=e.call(this,t)||this;return n._visibleLines=new i.VisibleLinesCollection(n),n.domNode=n._visibleLines.domNode,n._dynamicOverlays=[],n._isFocused=!1,n.domNode.setClassName("view-overlays"),n}return f(t,e),t.prototype.shouldRender=function(){if(e.prototype.shouldRender.call(this))return!0;for(var t=0,n=this._dynamicOverlays.length;t'+i+"")},e.prototype.layoutLine=function(e,t){this._domNode&&(this._domNode.setTop(t),this._domNode.setHeight(this._lineHeight))},e}();t.ViewOverlayLine=a;var u=function(e){function t(t){var n=e.call(this,t)||this;return n._contentWidth=n._context.configuration.editor.layoutInfo.contentWidth,n.domNode.setHeight(0),n}return f(t,e),t.prototype.onConfigurationChanged=function(t){return t.layoutInfo&&(this._contentWidth=this._context.configuration.editor.layoutInfo.contentWidth),e.prototype.onConfigurationChanged.call(this,t)},t.prototype.onScrollChanged=function(t){return e.prototype.onScrollChanged.call(this,t)||t.scrollWidthChanged},t.prototype._viewOverlaysRender=function(t){e.prototype._viewOverlaysRender.call(this,t),this.domNode.setWidth(Math.max(t.scrollWidth,this._contentWidth))},t}(s);t.ContentViewOverlays=u;var l=function(e){function t(t){var n=e.call(this,t)||this;return n._contentLeft=n._context.configuration.editor.layoutInfo.contentLeft,n.domNode.setClassName("margin-view-overlays"),n.domNode.setWidth(1),o.Configuration.applyFontInfo(n.domNode,n._context.configuration.editor.fontInfo),n}return f(t,e),t.prototype.onConfigurationChanged=function(t){var n=!1;return t.fontInfo&&(o.Configuration.applyFontInfo(this.domNode,this._context.configuration.editor.fontInfo),n=!0),t.layoutInfo&&(this._contentLeft=this._context.configuration.editor.layoutInfo.contentLeft,n=!0),e.prototype.onConfigurationChanged.call(this,t)||n},t.prototype.onScrollChanged=function(t){return e.prototype.onScrollChanged.call(this,t)||t.scrollHeightChanged},t.prototype._viewOverlaysRender=function(t){e.prototype._viewOverlaysRender.call(this,t);var n=Math.min(t.scrollHeight,1e6);this.domNode.setHeight(n),this.domNode.setWidth(this._contentLeft)},t}(s);t.MarginViewOverlays=l}),define(d[444],h([1,0,27,12,2,49,66,4]),function(e,t,n,i,o,r,s,a){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var u=function(){return function(e,t,n,i){this.top=e,this.left=t,this.width=n,this.textContent=i}}(),l=function(){function e(e,t){this._context=e,this._isSecondary=t,this._cursorStyle=this._context.configuration.editor.viewInfo.cursorStyle,this._lineHeight=this._context.configuration.editor.lineHeight,this._typicalHalfwidthCharacterWidth=this._context.configuration.editor.fontInfo.typicalHalfwidthCharacterWidth,this._isVisible=!0,this._domNode=n.createFastDomNode(document.createElement("div")),this._isSecondary?this._domNode.setClassName("cursor secondary"):this._domNode.setClassName("cursor"),this._domNode.setHeight(this._lineHeight),this._domNode.setTop(0),this._domNode.setLeft(0),s.Configuration.applyFontInfo(this._domNode,this._context.configuration.editor.fontInfo),this._domNode.setDisplay("none"),this.updatePosition(new i.Position(1,1)),this._isInEditableRange=!0,this._lastRenderedContent="",this._renderData=null}return e.prototype.getDomNode=function(){return this._domNode},e.prototype.getIsInEditableRange=function(){return this._isInEditableRange},e.prototype.getPosition=function(){return this._position},e.prototype.show=function(){this._isVisible||(this._domNode.setVisibility("inherit"),this._isVisible=!0)},e.prototype.hide=function(){this._isVisible&&(this._domNode.setVisibility("hidden"),this._isVisible=!1)},e.prototype.onConfigurationChanged=function(e){return e.lineHeight&&(this._lineHeight=this._context.configuration.editor.lineHeight),e.viewInfo&&(this._cursorStyle=this._context.configuration.editor.viewInfo.cursorStyle),e.fontInfo&&(s.Configuration.applyFontInfo(this._domNode,this._context.configuration.editor.fontInfo),this._typicalHalfwidthCharacterWidth=this._context.configuration.editor.fontInfo.typicalHalfwidthCharacterWidth),!0},e.prototype.onCursorPositionChanged=function(e,t){return this.updatePosition(e),this._isInEditableRange=t,!0},e.prototype._prepareRender=function(e){if(this._cursorStyle===r.TextEditorCursorStyle.Line||this._cursorStyle===r.TextEditorCursorStyle.LineThin){var t=e.visibleRangeForPosition(this._position);if(!t)return null;var n;n=this._cursorStyle===r.TextEditorCursorStyle.Line?a.computeScreenAwareSize(2):a.computeScreenAwareSize(1);var i=e.getVerticalOffsetForLineNumber(this._position.lineNumber)-e.bigNumbersDelta;return new u(i,t.left,n,"")}var s=e.linesVisibleRangesForRange(new o.Range(this._position.lineNumber,this._position.column,this._position.lineNumber,this._position.column+1),!1);if(!s||0===s.length||0===s[0].ranges.length)return null;var l=s[0].ranges[0],c=l.width<1?this._typicalHalfwidthCharacterWidth:l.width,d="";this._cursorStyle===r.TextEditorCursorStyle.Block&&(d=this._context.model.getLineContent(this._position.lineNumber).charAt(this._position.column-1));var h=e.getVerticalOffsetForLineNumber(this._position.lineNumber)-e.bigNumbersDelta;return new u(h,l.left,c,d)},e.prototype.prepareRender=function(e){this._renderData=this._prepareRender(e)},e.prototype.render=function(e){return this._renderData?(this._lastRenderedContent!==this._renderData.textContent&&(this._lastRenderedContent=this._renderData.textContent,this._domNode.domNode.textContent=this._lastRenderedContent),this._domNode.setDisplay("block"),this._domNode.setTop(this._renderData.top),this._domNode.setLeft(this._renderData.left),this._domNode.setWidth(this._renderData.width),this._domNode.setLineHeight(this._lineHeight),this._domNode.setHeight(this._lineHeight),{domNode:this._domNode.domNode,position:this._position,contentLeft:this._renderData.left,height:this._lineHeight,width:2}):(this._domNode.setDisplay("none"),null)},e.prototype.updatePosition=function(e){this._position=e},e}();t.ViewCursor=l}),define(d[58],h([1,0,16]),function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ITelemetryService=n.createDecorator("telemetryService")}),define(d[13],h([1,0,10,24,31,105,44,58,12,56,85,64,19,42]),function(e,t,n,i,o,r,s,a,u,l,c,d,h,p){"use strict";function g(e){return e.get(p.ICodeEditorService).getFocusedCodeEditor()}function m(e){var t=e.get(d.IEditorService),n=t.getActiveEditor&&t.getActiveEditor();return p.getCodeEditor(n)}function v(e){return w.registerEditorCommand(e),e}Object.defineProperty(t,"__esModule",{value:!0});var y=function(){function e(e){this.id=e.id,this.precondition=e.precondition,this._kbOpts=e.kbOpts,this._description=e.description}return e.prototype.toCommandAndKeybindingRule=function(e){var t=this,n=this._kbOpts||{primary:0},i=n.kbExpr;this.precondition&&(i=i?h.ContextKeyExpr.and(i,this.precondition):this.precondition);var o="number"==typeof n.weight?n.weight:e;return{id:this.id,handler:function(e,n){return t.runCommand(e,n)},weight:o,when:i,primary:n.primary,secondary:n.secondary,win:n.win,linux:n.linux,mac:n.mac,description:this._description}},e}();t.Command=y;var C=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return f(t,e),t.bindToContribution=function(e){return function(t){function n(e){var n=t.call(this,e)||this;return n._callback=e.handler,n}return f(n,t),n.prototype.runEditorCommand=function(t,n,i){e(n)&&this._callback(e(n))},n}(t)},t.prototype.runCommand=function(e,t){var n=this,i=g(e);if(i||(i=m(e)),i)return i.invokeWithinContext(function(e){if(e.get(h.IContextKeyService).contextMatchesRules(n.precondition))return n.runEditorCommand(e,i,t)})},t}(y);t.EditorCommand=C;var b=function(e){function t(t){var n=e.call(this,t)||this;return n.label=t.label,n.alias=t.alias,n.menuOpts=t.menuOpts,n}return f(t,e),t.prototype.toMenuItem=function(){return this.menuOpts?{command:{id:this.id,title:this.label},when:this.precondition,group:this.menuOpts.group,order:this.menuOpts.order}:null},t.prototype.runEditorCommand=function(e,t,n){return this.reportTelemetry(e,t),this.run(e,t,n||{})},t.prototype.reportTelemetry=function(e,t){e.get(a.ITelemetryService).publicLog("editorActionInvoked",_({name:this.label,id:this.id},t.getTelemetryData()))},t}(C);t.EditorAction=b,t.editorAction=function(e){w.registerEditorAction(new e)},t.editorCommand=function(e){v(new e)},t.registerEditorCommand=v,t.commonEditorContribution=function(e){E.INSTANCE.registerEditorContribution(e)};var w;!function(e){function t(e,t){o.CommandsRegistry.registerCommand(e,function(e,n){return t(e,n||{})})}e.registerEditorAction=function(e){E.INSTANCE.registerEditorAction(e)},e.getEditorActions=function(){return E.INSTANCE.getEditorActions()},e.getEditorCommand=function(e){return E.INSTANCE.getEditorCommand(e)},e.getEditorContributions=function(){return E.INSTANCE.getEditorContributions()},e.commandWeight=function(e){return void 0===e&&(e=0),r.KeybindingsRegistry.WEIGHT.editorContrib(e)},e.registerEditorCommand=function(e){E.INSTANCE.registerEditorCommand(e)},e.registerLanguageCommand=t,e.registerDefaultLanguageCommand=function(e,o){t(e,function(e,t){var r=t.resource,s=t.position;if(!(r instanceof i.default))throw n.illegalArgument("resource");if(!u.Position.isIPosition(s))throw n.illegalArgument("position");var a=e.get(l.IModelService).getModel(r);if(!a)throw n.illegalArgument("Can not find open model for "+r);var c=u.Position.lift(s);return o(a,c,t)})}}(w=t.CommonEditorRegistry||(t.CommonEditorRegistry={}));var S={EditorCommonContributions:"editor.commonContributions"},E=function(){function e(){this.editorContributions=[],this.editorActions=[],this.editorCommands=Object.create(null)}return e.prototype.registerEditorContribution=function(e){this.editorContributions.push(e)},e.prototype.registerEditorAction=function(e){var t=e.toMenuItem();t&&c.MenuRegistry.appendMenuItem(c.MenuId.EditorContext,t),r.KeybindingsRegistry.registerCommandAndKeybindingRule(e.toCommandAndKeybindingRule(r.KeybindingsRegistry.WEIGHT.editorContrib())),this.editorActions.push(e)},e.prototype.getEditorContributions=function(){return this.editorContributions.slice(0)},e.prototype.getEditorActions=function(){return this.editorActions.slice(0)},e.prototype.registerEditorCommand=function(e){r.KeybindingsRegistry.registerCommandAndKeybindingRule(e.toCommandAndKeybindingRule(r.KeybindingsRegistry.WEIGHT.editorContrib())),this.editorCommands[e.id]=e},e.prototype.getEditorCommand=function(e){return this.editorCommands[e]||null},e.INSTANCE=new e,e}();s.Registry.add(S.EditorCommonContributions,E.INSTANCE)}),define(d[447],h([1,0,10,11,3,7,84,19,321,39,12,2,22,20,330,488,406,55,21,13]),function(e,t,n,i,o,r,s,a,u,l,c,d,h,p,g,m,v,_,y,C){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var b=0,w=function(e){function t(t,n,o,r){var u=e.call(this)||this;return u._onDidDispose=u._register(new i.Emitter),u.onDidDispose=u._onDidDispose.event,u._onDidChangeModelContent=u._register(new i.Emitter),u.onDidChangeModelContent=u._onDidChangeModelContent.event,u._onDidChangeModelLanguage=u._register(new i.Emitter),u.onDidChangeModelLanguage=u._onDidChangeModelLanguage.event,u._onDidChangeModelOptions=u._register(new i.Emitter),u.onDidChangeModelOptions=u._onDidChangeModelOptions.event,u._onDidChangeModelDecorations=u._register(new i.Emitter),u.onDidChangeModelDecorations=u._onDidChangeModelDecorations.event,u._onDidChangeConfiguration=u._register(new i.Emitter),u.onDidChangeConfiguration=u._onDidChangeConfiguration.event,u._onDidChangeModel=u._register(new i.Emitter),u.onDidChangeModel=u._onDidChangeModel.event,u._onDidChangeCursorPosition=u._register(new i.Emitter),u.onDidChangeCursorPosition=u._onDidChangeCursorPosition.event,u._onDidChangeCursorSelection=u._register(new i.Emitter),u.onDidChangeCursorSelection=u._onDidChangeCursorSelection.event,u._onDidLayoutChange=u._register(new i.Emitter),u.onDidLayoutChange=u._onDidLayoutChange.event,u._onDidFocusEditorText=u._register(new i.Emitter),u.onDidFocusEditorText=u._onDidFocusEditorText.event,u._onDidBlurEditorText=u._register(new i.Emitter),u.onDidBlurEditorText=u._onDidBlurEditorText.event,u._onDidFocusEditor=u._register(new i.Emitter),u.onDidFocusEditor=u._onDidFocusEditor.event,u._onDidBlurEditor=u._register(new i.Emitter),u.onDidBlurEditor=u._onDidBlurEditor.event,u._onWillType=u._register(new i.Emitter),u.onWillType=u._onWillType.event,u._onDidType=u._register(new i.Emitter),u.onDidType=u._onDidType.event,u._onDidPaste=u._register(new i.Emitter),u.onDidPaste=u._onDidPaste.event,u.domElement=t,u.id=++b,u._decorationTypeKeysToIds={},u._decorationTypeSubtypes={},n=n||{},u._configuration=u._register(u._createConfiguration(n)),u._register(u._configuration.onDidChange(function(e){u._onDidChangeConfiguration.fire(e),e.layoutInfo&&u._onDidLayoutChange.fire(u._configuration.editor.layoutInfo)})),u._contextKeyService=u._register(r.createScoped(u.domElement)),u._register(new S(u,u._contextKeyService)),u._register(new v.EditorModeContext(u,u._contextKeyService)),u._instantiationService=o.createChild(new s.ServiceCollection([a.IContextKeyService,u._contextKeyService])),u._attachModel(null),u._contributions={},u._actions={},u}return f(t,e),t.prototype.getId=function(){return this.getEditorType()+":"+this.id},t.prototype.getEditorType=function(){return p.EditorType.ICodeEditor},t.prototype.destroy=function(){this.dispose()},t.prototype.dispose=function(){for(var t=Object.keys(this._contributions),n=0,i=t.length;n1),this._hasNonEmptySelection.set(e.some(function(e){return!e.isEmpty()}))):(this._hasMultipleSelections.reset(),this._hasNonEmptySelection.reset())},t.prototype._updateFromFocus=function(){this._editorFocus.set(this._editor.hasWidgetFocus()),this._editorTextFocus.set(this._editor.isFocused())},t}(o.Disposable)}),define(d[134],h([1,0,12,2,20,39,54,173,13,311,21,105,42,19,29,64,119,170]),function(e,t,n,i,o,r,s,a,u,l,c,d,h,p,g,m,v,_){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var y=o.Handler,C=d.KeybindingsRegistry.WEIGHT.editorCore(),b=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return f(t,e),t.prototype.runEditorCommand=function(e,t,n){this.runCoreEditorCommand(t._getCursors(),n||{})},t}(u.EditorCommand);t.CoreEditorCommand=b;var w;!function(e){e.description={description:"Scroll editor in the given direction",args:[{name:"Editor scroll argument object",description:"Property-value pairs that can be passed through this argument:\n\t\t\t\t\t* 'to': A mandatory direction value.\n\t\t\t\t\t\t```\n\t\t\t\t\t\t'up', 'down'\n\t\t\t\t\t\t```\n\t\t\t\t\t* 'by': Unit to move. Default is computed based on 'to' value.\n\t\t\t\t\t\t```\n\t\t\t\t\t\t'line', 'wrappedLine', 'page', 'halfPage'\n\t\t\t\t\t\t```\n\t\t\t\t\t* 'value': Number of units to move. Default is '1'.\n\t\t\t\t\t* 'revealCursor': If 'true' reveals the cursor if it is outside view port.\n\t\t\t\t",constraint:function(e){if(!g.isObject(e))return!1;var t=e;return!(!g.isString(t.to)||!g.isUndefined(t.by)&&!g.isString(t.by)||!g.isUndefined(t.value)&&!g.isNumber(t.value)||!g.isUndefined(t.revealCursor)&&!g.isBoolean(t.revealCursor))}}]},e.RawDirection={Up:"up",Down:"down"},e.RawUnit={Line:"line",WrappedLine:"wrappedLine",Page:"page",HalfPage:"halfPage"},e.parse=function(t){var n;switch(t.to){case e.RawDirection.Up:n=1;break;case e.RawDirection.Down:n=2;break;default:return null}var i;switch(t.by){case e.RawUnit.Line:i=1;break;case e.RawUnit.WrappedLine:i=2;break;case e.RawUnit.Page:i=3;break;case e.RawUnit.HalfPage:i=4;break;default:i=2}return{direction:n,unit:i,value:Math.floor(t.value||1),revealCursor:!!t.revealCursor,select:!!t.select}};!function(e){e[e.Up=1]="Up",e[e.Down=2]="Down"}(e.Direction||(e.Direction={}));!function(e){e[e.Line=1]="Line",e[e.WrappedLine=2]="WrappedLine",e[e.Page=3]="Page",e[e.HalfPage=4]="HalfPage"}(e.Unit||(e.Unit={}))}(w=t.EditorScroll_||(t.EditorScroll_={}));var S;!function(e){e.description={description:"Reveal the given line at the given logical position",args:[{name:"Reveal line argument object",description:"Property-value pairs that can be passed through this argument:\n\t\t\t\t\t* 'lineNumber': A mandatory line number value.\n\t\t\t\t\t* 'at': Logical position at which line has to be revealed .\n\t\t\t\t\t\t```\n\t\t\t\t\t\t'top', 'center', 'bottom'\n\t\t\t\t\t\t```\n\t\t\t\t",constraint:function(e){if(!g.isObject(e))return!1;var t=e;return!(!g.isNumber(t.lineNumber)||!g.isUndefined(t.at)&&!g.isString(t.at))}}]},e.RawAtArgument={Top:"top",Center:"center",Bottom:"bottom"}}(S=t.RevealLine_||(t.RevealLine_={}));var E;!function(e){var t=function(e){function t(t){var n=e.call(this,t)||this;return n._inSelectionMode=t.inSelectionMode,n}return f(t,e),t.prototype.runCoreEditorCommand=function(e,t){e.context.model.pushStackElement(),e.setStates(t.source,s.CursorChangeReason.Explicit,[a.CursorMoveCommands.moveTo(e.context,e.getPrimaryCursor(),this._inSelectionMode,t.position,t.viewPosition)]),e.reveal(!0,0)},t}(b);e.MoveTo=u.registerEditorCommand(new t({id:"_moveTo",inSelectionMode:!1,precondition:null})),e.MoveToSelect=u.registerEditorCommand(new t({id:"_moveToSelect",inSelectionMode:!0,precondition:null}));var o=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return f(t,e),t.prototype.runCoreEditorCommand=function(e,t){e.context.model.pushStackElement();var n=this._getColumnSelectResult(e.context,e.getPrimaryCursor(),e.getColumnSelectData(),t);e.setStates(t.source,s.CursorChangeReason.Explicit,n.viewStates.map(function(e){return r.CursorState.fromViewState(e)})),e.setColumnSelectData({toViewLineNumber:n.toLineNumber,toViewVisualColumn:n.toVisualColumn}),e.reveal(!0,n.reversed?1:2)},t}(b);e.ColumnSelect=u.registerEditorCommand(new(function(e){function t(){return e.call(this,{id:"columnSelect",precondition:null})||this}return f(t,e),t.prototype._getColumnSelectResult=function(e,t,i,o){var r,s=e.model.validatePosition(o.position);return r=o.viewPosition?e.validateViewPosition(new n.Position(o.viewPosition.lineNumber,o.viewPosition.column),s):e.convertModelPositionToViewPosition(s),l.ColumnSelection.columnSelect(e.config,e.viewModel,t.viewState.selection,r.lineNumber,o.mouseColumn-1)},t}(o))),e.CursorColumnSelectLeft=u.registerEditorCommand(new(function(e){function t(){return e.call(this,{id:"cursorColumnSelectLeft",precondition:null,kbOpts:{weight:C,kbExpr:c.EditorContextKeys.textFocus,primary:3599,linux:{primary:0}}})||this}return f(t,e),t.prototype._getColumnSelectResult=function(e,t,n,i){return l.ColumnSelection.columnSelectLeft(e.config,e.viewModel,t.viewState,n.toViewLineNumber,n.toViewVisualColumn)},t}(o))),e.CursorColumnSelectRight=u.registerEditorCommand(new(function(e){function t(){return e.call(this,{id:"cursorColumnSelectRight",precondition:null,kbOpts:{weight:C,kbExpr:c.EditorContextKeys.textFocus,primary:3601,linux:{primary:0}}})||this}return f(t,e),t.prototype._getColumnSelectResult=function(e,t,n,i){return l.ColumnSelection.columnSelectRight(e.config,e.viewModel,t.viewState,n.toViewLineNumber,n.toViewVisualColumn)},t}(o)));var d=function(e){function t(t){var n=e.call(this,t)||this;return n._isPaged=t.isPaged,n}return f(t,e),t.prototype._getColumnSelectResult=function(e,t,n,i){return l.ColumnSelection.columnSelectUp(e.config,e.viewModel,t.viewState,this._isPaged,n.toViewLineNumber,n.toViewVisualColumn)},t}(o);e.CursorColumnSelectUp=u.registerEditorCommand(new d({isPaged:!1,id:"cursorColumnSelectUp",precondition:null,kbOpts:{weight:C,kbExpr:c.EditorContextKeys.textFocus,primary:3600,linux:{primary:0}}})),e.CursorColumnSelectPageUp=u.registerEditorCommand(new d({isPaged:!0,id:"cursorColumnSelectPageUp",precondition:null,kbOpts:{weight:C,kbExpr:c.EditorContextKeys.textFocus,primary:3595,linux:{primary:0}}}));var h=function(e){function t(t){var n=e.call(this,t)||this;return n._isPaged=t.isPaged,n}return f(t,e),t.prototype._getColumnSelectResult=function(e,t,n,i){return l.ColumnSelection.columnSelectDown(e.config,e.viewModel,t.viewState,this._isPaged,n.toViewLineNumber,n.toViewVisualColumn)},t}(o);e.CursorColumnSelectDown=u.registerEditorCommand(new h({isPaged:!1,id:"cursorColumnSelectDown",precondition:null,kbOpts:{weight:C,kbExpr:c.EditorContextKeys.textFocus,primary:3602,linux:{primary:0}}})),e.CursorColumnSelectPageDown=u.registerEditorCommand(new h({isPaged:!0,id:"cursorColumnSelectPageDown",precondition:null,kbOpts:{weight:C,kbExpr:c.EditorContextKeys.textFocus,primary:3596,linux:{primary:0}}}));var p=function(e){function t(){return e.call(this,{id:"cursorMove",precondition:null,description:a.CursorMove.description})||this}return f(t,e),t.prototype.runCoreEditorCommand=function(e,t){var n=a.CursorMove.parse(t);n&&this._runCursorMove(e,t.source,n)},t.prototype._runCursorMove=function(e,t,n){e.context.model.pushStackElement(),e.setStates(t,s.CursorChangeReason.Explicit,r.CursorState.ensureInEditableRange(e.context,a.CursorMoveCommands.move(e.context,e.getAll(),n))),e.reveal(!0,0)},t}(b);e.CursorMoveImpl=p,e.CursorMove=u.registerEditorCommand(new p);var g;!function(e){e[e.PAGE_SIZE_MARKER=-1]="PAGE_SIZE_MARKER"}(g||(g={}));var m=function(t){function n(e){var n=t.call(this,e)||this;return n._staticArgs=e.args,n}return f(n,t),n.prototype.runCoreEditorCommand=function(t,n){var i=this._staticArgs;-1===this._staticArgs.value&&(i={direction:this._staticArgs.direction,unit:this._staticArgs.unit,select:this._staticArgs.select,value:t.context.config.pageSize}),e.CursorMove._runCursorMove(t,n.source,i)},n}(b);e.CursorLeft=u.registerEditorCommand(new m({args:{direction:0,unit:0,select:!1,value:1},id:"cursorLeft",precondition:null,kbOpts:{weight:C,kbExpr:c.EditorContextKeys.textFocus,primary:15,mac:{primary:15,secondary:[288]}}})),e.CursorLeftSelect=u.registerEditorCommand(new m({args:{direction:0,unit:0,select:!0,value:1},id:"cursorLeftSelect",precondition:null,kbOpts:{weight:C,kbExpr:c.EditorContextKeys.textFocus,primary:1039}})),e.CursorRight=u.registerEditorCommand(new m({args:{direction:1,unit:0,select:!1,value:1},id:"cursorRight",precondition:null,kbOpts:{weight:C,kbExpr:c.EditorContextKeys.textFocus,primary:17,mac:{primary:17,secondary:[292]}}})),e.CursorRightSelect=u.registerEditorCommand(new m({args:{direction:1,unit:0,select:!0,value:1},id:"cursorRightSelect",precondition:null,kbOpts:{weight:C,kbExpr:c.EditorContextKeys.textFocus,primary:1041}})),e.CursorUp=u.registerEditorCommand(new m({args:{direction:2,unit:2,select:!1,value:1},id:"cursorUp",precondition:null,kbOpts:{weight:C,kbExpr:c.EditorContextKeys.textFocus,primary:16,mac:{primary:16,secondary:[302]}}})),e.CursorUpSelect=u.registerEditorCommand(new m({args:{direction:2,unit:2,select:!0,value:1},id:"cursorUpSelect",precondition:null,kbOpts:{weight:C,kbExpr:c.EditorContextKeys.textFocus,primary:1040,secondary:[3088],mac:{primary:1040},linux:{primary:1040}}})),e.CursorPageUp=u.registerEditorCommand(new m({args:{direction:2,unit:2,select:!1,value:-1},id:"cursorPageUp",precondition:null,kbOpts:{weight:C,kbExpr:c.EditorContextKeys.textFocus,primary:11}})),e.CursorPageUpSelect=u.registerEditorCommand(new m({args:{direction:2,unit:2,select:!0,value:-1},id:"cursorPageUpSelect",precondition:null,kbOpts:{weight:C,kbExpr:c.EditorContextKeys.textFocus,primary:1035}})),e.CursorDown=u.registerEditorCommand(new m({args:{direction:3,unit:2,select:!1,value:1},id:"cursorDown",precondition:null,kbOpts:{weight:C,kbExpr:c.EditorContextKeys.textFocus,primary:18,mac:{primary:18,secondary:[300]}}})),e.CursorDownSelect=u.registerEditorCommand(new m({args:{direction:3,unit:2,select:!0,value:1},id:"cursorDownSelect",precondition:null,kbOpts:{weight:C,kbExpr:c.EditorContextKeys.textFocus,primary:1042,secondary:[3090],mac:{primary:1042},linux:{primary:1042}}})),e.CursorPageDown=u.registerEditorCommand(new m({args:{direction:3,unit:2,select:!1,value:-1},id:"cursorPageDown",precondition:null,kbOpts:{weight:C,kbExpr:c.EditorContextKeys.textFocus,primary:12}})),e.CursorPageDownSelect=u.registerEditorCommand(new m({args:{direction:3,unit:2,select:!0,value:-1},id:"cursorPageDownSelect",precondition:null,kbOpts:{weight:C,kbExpr:c.EditorContextKeys.textFocus,primary:1036}})),e.CreateCursor=u.registerEditorCommand(new(function(e){function t(){return e.call(this,{id:"createCursor",precondition:null})||this}return f(t,e),t.prototype.runCoreEditorCommand=function(e,t){var n=e.context;if(!n.config.readOnly&&!n.model.hasEditableRange()){var i;i=t.wholeLine?a.CursorMoveCommands.line(n,e.getPrimaryCursor(),!1,t.position,t.viewPosition):a.CursorMoveCommands.moveTo(n,e.getPrimaryCursor(),!1,t.position,t.viewPosition);var o=e.getAll();if(o.length>1)for(var r=i.modelState?i.modelState.position:null,u=i.viewState?i.viewState.position:null,l=0,c=o.length;lr&&(o=r);var s=new i.Range(o,1,o,e.context.model.getLineMaxColumn(o)),a=0;if(n.at)switch(n.at){case S.RawAtArgument.Top:a=3;break;case S.RawAtArgument.Center:a=1;break;case S.RawAtArgument.Bottom:a=4}var u=e.context.convertModelRangeToViewRange(s);e.revealRange(!1,u,a)},t}(b))),e.SelectAll=u.registerEditorCommand(new(function(e){function t(){return e.call(this,{id:"selectAll",precondition:null})||this}return f(t,e),t.prototype.runCoreEditorCommand=function(e,t){e.context.model.pushStackElement(),e.setStates(t.source,s.CursorChangeReason.Explicit,[a.CursorMoveCommands.selectAll(e.context,e.getPrimaryCursor())])},t}(b)))}(E=t.CoreNavigationCommands||(t.CoreNavigationCommands={}));!function(e){e.LineBreakInsert=u.registerEditorCommand(new(function(e){function t(){return e.call(this,{id:"lineBreakInsert",precondition:c.EditorContextKeys.writable,kbOpts:{weight:C,kbExpr:c.EditorContextKeys.textFocus,primary:null,mac:{primary:301}}})||this}return f(t,e),t.prototype.runEditorCommand=function(e,t,n){t.pushUndoStop(),t.executeCommands(this.id,v.TypeOperations.lineBreakInsert(t._getCursorConfiguration(),t.getModel(),t.getSelections()))},t}(u.EditorCommand))),e.Outdent=u.registerEditorCommand(new(function(e){function t(){return e.call(this,{id:"outdent",precondition:c.EditorContextKeys.writable,kbOpts:{weight:C,kbExpr:p.ContextKeyExpr.and(c.EditorContextKeys.textFocus,c.EditorContextKeys.tabDoesNotMoveFocus),primary:1026}})||this}return f(t,e),t.prototype.runEditorCommand=function(e,t,n){t.pushUndoStop(),t.executeCommands(this.id,v.TypeOperations.outdent(t._getCursorConfiguration(),t.getModel(),t.getSelections())),t.pushUndoStop()},t}(u.EditorCommand))),e.Tab=u.registerEditorCommand(new(function(e){function t(){return e.call(this,{id:"tab",precondition:c.EditorContextKeys.writable,kbOpts:{weight:C,kbExpr:p.ContextKeyExpr.and(c.EditorContextKeys.textFocus,c.EditorContextKeys.tabDoesNotMoveFocus),primary:2}})||this}return f(t,e),t.prototype.runEditorCommand=function(e,t,n){t.pushUndoStop(),t.executeCommands(this.id,v.TypeOperations.tab(t._getCursorConfiguration(),t.getModel(),t.getSelections())),t.pushUndoStop()},t}(u.EditorCommand))),e.DeleteLeft=u.registerEditorCommand(new(function(e){function t(){return e.call(this,{id:"deleteLeft",precondition:c.EditorContextKeys.writable,kbOpts:{weight:C,kbExpr:c.EditorContextKeys.textFocus,primary:1,secondary:[1025],mac:{primary:1,secondary:[1025,294,257]}}})||this}return f(t,e),t.prototype.runEditorCommand=function(e,t,n){var i=_.DeleteOperations.deleteLeft(t._getCursorConfiguration(),t.getModel(),t.getSelections()),o=i[0],r=i[1];o&&t.pushUndoStop(),t.executeCommands(this.id,r)},t}(u.EditorCommand))),e.DeleteRight=u.registerEditorCommand(new(function(e){function t(){return e.call(this,{id:"deleteRight",precondition:c.EditorContextKeys.writable,kbOpts:{weight:C,kbExpr:c.EditorContextKeys.textFocus,primary:20,mac:{primary:20,secondary:[290,276]}}})||this}return f(t,e),t.prototype.runEditorCommand=function(e,t,n){var i=_.DeleteOperations.deleteRight(t._getCursorConfiguration(),t.getModel(),t.getSelections()),o=i[0],r=i[1];o&&t.pushUndoStop(),t.executeCommands(this.id,r)},t}(u.EditorCommand)))}(t.CoreEditingCommands||(t.CoreEditingCommands={}));var L;!function(e){function t(e){return e.get(h.ICodeEditorService).getFocusedCodeEditor()}function n(e){var t=e.get(m.IEditorService),n=t.getActiveEditor&&t.getActiveEditor();return h.getCodeEditor(n)}function i(e){d.KeybindingsRegistry.registerCommandAndKeybindingRule(e.toCommandAndKeybindingRule(C))}function o(e){i(new s("default:"+e,e)),i(new s(e,e))}var r=function(e){function i(t){var n=e.call(this,t)||this;return n._editorHandler=t.editorHandler,n._inputHandler=t.inputHandler,n}return f(i,e),i.prototype.runCommand=function(e,i){var o=t(e);if(o&&o.isFocused())return this._runEditorHandler(o,i);var r=document.activeElement;if(!(r&&["input","textarea"].indexOf(r.tagName.toLowerCase())>=0)){var s=n(e);return s?(s.focus(),this._runEditorHandler(s,i)):void 0}document.execCommand(this._inputHandler)},i.prototype._runEditorHandler=function(e,t){var n=this._editorHandler;"string"==typeof n?e.trigger("keyboard",n,t):((t=t||{}).source="keyboard",n.runEditorCommand(null,e,t))},i}(u.Command);i(new r({editorHandler:E.SelectAll,inputHandler:"selectAll",id:"editor.action.selectAll",precondition:null,kbOpts:{weight:C,kbExpr:null,primary:2079}})),i(new r({editorHandler:y.Undo,inputHandler:"undo",id:y.Undo,precondition:c.EditorContextKeys.writable,kbOpts:{weight:C,kbExpr:c.EditorContextKeys.textFocus,primary:2104}})),i(new r({editorHandler:y.Redo,inputHandler:"redo",id:y.Redo,precondition:c.EditorContextKeys.writable,kbOpts:{weight:C,kbExpr:c.EditorContextKeys.textFocus,primary:2103,secondary:[3128],mac:{primary:3128}}}));var s=function(e){function n(t,n){var i=e.call(this,{id:t,precondition:null})||this;return i._handlerId=n,i}return f(n,e),n.prototype.runCommand=function(e,n){var i=t(e);i&&i.trigger("keyboard",this._handlerId,n)},n}(u.Command);o(y.Type),o(y.ReplacePreviousChar),o(y.CompositionStart),o(y.CompositionEnd),o(y.Paste),o(y.Cut)}(L||(L={}))}),define(d[449],h([1,0,12,20,134]),function(e,t,n,i,o){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e,t,n,i,o){this.configuration=e,this.viewModel=t,this._execCoreEditorCommandFunc=n,this.outgoingEvents=i,this.commandService=o}return e.prototype._execMouseCommand=function(e,t){t.source="mouse",this._execCoreEditorCommandFunc(e,t)},e.prototype.paste=function(e,t,n){this.commandService.executeCommand(i.Handler.Paste,{text:t,pasteOnNewLine:n})},e.prototype.type=function(e,t){this.commandService.executeCommand(i.Handler.Type,{text:t})},e.prototype.replacePreviousChar=function(e,t,n){this.commandService.executeCommand(i.Handler.ReplacePreviousChar,{text:t,replaceCharCnt:n})},e.prototype.compositionStart=function(e){this.commandService.executeCommand(i.Handler.CompositionStart,{})},e.prototype.compositionEnd=function(e){this.commandService.executeCommand(i.Handler.CompositionEnd,{})},e.prototype.cut=function(e){this.commandService.executeCommand(i.Handler.Cut,{})},e.prototype._validateViewColumn=function(e){var t=this.viewModel.getLineMinColumn(e.lineNumber);return e.column=4?this.selectAll():3===e.mouseDownCount?this._hasMulticursorModifier(e)?e.inSelectionMode?this.lastCursorLineSelectDrag(e.position):this.lastCursorLineSelect(e.position):e.inSelectionMode?this.lineSelectDrag(e.position):this.lineSelect(e.position):2===e.mouseDownCount?this._hasMulticursorModifier(e)?this.lastCursorWordSelect(e.position):e.inSelectionMode?this.wordSelectDrag(e.position):this.wordSelect(e.position):this._hasMulticursorModifier(e)?this._hasNonMulticursorModifier(e)||(e.shiftKey?this.columnSelect(e.position,e.mouseColumn):e.inSelectionMode?this.lastCursorMoveToSelect(e.position):this.createCursor(e.position,!1)):e.inSelectionMode?this.moveToSelect(e.position):this.moveTo(e.position)},e.prototype._usualArgs=function(e){return e=this._validateViewColumn(e),{position:this.convertViewToModelPosition(e),viewPosition:e}},e.prototype.moveTo=function(e){this._execMouseCommand(o.CoreNavigationCommands.MoveTo,this._usualArgs(e))},e.prototype.moveToSelect=function(e){this._execMouseCommand(o.CoreNavigationCommands.MoveToSelect,this._usualArgs(e))},e.prototype.columnSelect=function(e,t){e=this._validateViewColumn(e),this._execMouseCommand(o.CoreNavigationCommands.ColumnSelect,{position:this.convertViewToModelPosition(e),viewPosition:e,mouseColumn:t})},e.prototype.createCursor=function(e,t){e=this._validateViewColumn(e),this._execMouseCommand(o.CoreNavigationCommands.CreateCursor,{position:this.convertViewToModelPosition(e),viewPosition:e,wholeLine:t})},e.prototype.lastCursorMoveToSelect=function(e){this._execMouseCommand(o.CoreNavigationCommands.LastCursorMoveToSelect,this._usualArgs(e))},e.prototype.wordSelect=function(e){this._execMouseCommand(o.CoreNavigationCommands.WordSelect,this._usualArgs(e))},e.prototype.wordSelectDrag=function(e){this._execMouseCommand(o.CoreNavigationCommands.WordSelectDrag,this._usualArgs(e))},e.prototype.lastCursorWordSelect=function(e){this._execMouseCommand(o.CoreNavigationCommands.LastCursorWordSelect,this._usualArgs(e))},e.prototype.lineSelect=function(e){this._execMouseCommand(o.CoreNavigationCommands.LineSelect,this._usualArgs(e))},e.prototype.lineSelectDrag=function(e){this._execMouseCommand(o.CoreNavigationCommands.LineSelectDrag,this._usualArgs(e))},e.prototype.lastCursorLineSelect=function(e){this._execMouseCommand(o.CoreNavigationCommands.LastCursorLineSelect,this._usualArgs(e))},e.prototype.lastCursorLineSelectDrag=function(e){this._execMouseCommand(o.CoreNavigationCommands.LastCursorLineSelectDrag,this._usualArgs(e))},e.prototype.selectAll=function(){this._execMouseCommand(o.CoreNavigationCommands.SelectAll,{})},e.prototype.convertViewToModelPosition=function(e){return this.viewModel.coordinatesConverter.convertViewPositionToModelPosition(e)},e.prototype.emitKeyDown=function(e){this.outgoingEvents.emitKeyDown(e)},e.prototype.emitKeyUp=function(e){this.outgoingEvents.emitKeyUp(e)},e.prototype.emitContextMenu=function(e){this.outgoingEvents.emitContextMenu(e)},e.prototype.emitMouseMove=function(e){this.outgoingEvents.emitMouseMove(e)},e.prototype.emitMouseLeave=function(e){this.outgoingEvents.emitMouseLeave(e)},e.prototype.emitMouseUp=function(e){this.outgoingEvents.emitMouseUp(e)},e.prototype.emitMouseDown=function(e){this.outgoingEvents.emitMouseDown(e)},e.prototype.emitMouseDrag=function(e){this.outgoingEvents.emitMouseDrag(e)},e.prototype.emitMouseDrop=function(e){this.outgoingEvents.emitMouseDrop(e)},e}();t.ViewController=r}),define(d[450],h([1,0,342,21,13,241]),function(e,t,n,i,o,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var s=function(e){function t(t,n){var i=e.call(this,n)||this;return i.left=t,i}return f(t,e),t.prototype.run=function(e,t){for(var n=[],i=t.getSelections(),o=0;o0&&(t.pushUndoStop(),t.executeCommands(this.id,o),t.pushUndoStop())},t=v([r.editorAction],t)}(r.EditorAction)}),define(d[452],h([1,0,344,28,15,42,13,154,21,314]),function(e,t,n,i,o,r,s,a,u){"use strict";function l(e){return e?s.editorAction:function(){}}Object.defineProperty(t,"__esModule",{value:!0});var c="9_cutcopypaste",d=o.isNative||document.queryCommandSupported("cut"),h=o.isNative||document.queryCommandSupported("copy"),p=h&&!i.isEdgeOrIE,g=o.isNative||!i.isChrome&&document.queryCommandSupported("paste"),m=function(e){function t(t,n){var i=e.call(this,n)||this;return i.browserCommand=t,i}return f(t,e),t.prototype.runCommand=function(e,t){var n=e.get(r.ICodeEditorService).getFocusedCodeEditor();n&&n.isFocused()?n.trigger("keyboard",this.id,t):document.execCommand(this.browserCommand)},t.prototype.run=function(e,t){t.focus(),document.execCommand(this.browserCommand)},t}(s.EditorAction);(function(e){function t(){var t={kbExpr:u.EditorContextKeys.textFocus,primary:2102,win:{primary:2102,secondary:[1044]}};return o.isNative||(t=null),e.call(this,"cut",{id:"editor.action.clipboardCutAction",label:n.localize(0,null),alias:"Cut",precondition:u.EditorContextKeys.writable,kbOpts:t,menuOpts:{group:c,order:1}})||this}f(t,e),t.prototype.run=function(t,n){!n.getConfiguration().emptySelectionClipboard&&n.getSelection().isEmpty()||e.prototype.run.call(this,t,n)},t=v([l(d)],t)})(m),function(e){function t(){var t={kbExpr:u.EditorContextKeys.textFocus,primary:2081,win:{primary:2081,secondary:[2067]}};return o.isNative||(t=null),e.call(this,"copy",{id:"editor.action.clipboardCopyAction",label:n.localize(1,null),alias:"Copy",precondition:null,kbOpts:t,menuOpts:{group:c,order:2}})||this}f(t,e),t.prototype.run=function(t,n){!n.getConfiguration().emptySelectionClipboard&&n.getSelection().isEmpty()||e.prototype.run.call(this,t,n)},t=v([l(h)],t)}(m),function(e){function t(){var t={kbExpr:u.EditorContextKeys.textFocus,primary:2100,win:{primary:2100,secondary:[1043]}};return o.isNative||(t=null),e.call(this,"paste",{id:"editor.action.clipboardPasteAction",label:n.localize(2,null),alias:"Paste",precondition:u.EditorContextKeys.writable,kbOpts:t,menuOpts:{group:c,order:3}})||this}f(t,e),t=v([l(g)],t)}(m),function(e){function t(){return e.call(this,"copy",{id:"editor.action.clipboardCopyWithSyntaxHighlightingAction",label:n.localize(3,null),alias:"Copy With Syntax Highlighting",precondition:null,kbOpts:{kbExpr:u.EditorContextKeys.textFocus,primary:null}})||this}f(t,e),t.prototype.run=function(t,n){!n.getConfiguration().emptySelectionClipboard&&n.getSelection().isEmpty()||(a.CopyOptions.forceCopyWithSyntaxHighlighting=!0,e.prototype.run.call(this,t,n),a.CopyOptions.forceCopyWithSyntaxHighlighting=!1)},t=v([l(p)],t)}(m)}),define(d[453],h([1,0,10,33,24,7,13,17,56,18]),function(e,t,n,i,o,r,s,a,u,l){"use strict";function c(e){var t=[],o=a.CodeLensProviderRegistry.ordered(e),s=o.map(function(i){return l.asWinJsPromise(function(t){return i.provideCodeLenses(e,t)}).then(function(e){if(Array.isArray(e))for(var n=0,o=e;nt.symbol.range.startLineNumber?1:o.indexOf(e.provider)o.indexOf(t.provider)?1:e.symbol.range.startColumnt.symbol.range.startColumn?1:0})})}Object.defineProperty(t,"__esModule",{value:!0}),t.getCodeLensData=c,s.CommonEditorRegistry.registerLanguageCommand("_executeCodeLensProvider",function(e,t){var i=t.resource;if(!(i instanceof o.default))throw n.illegalArgument();var r=e.get(u.IModelService).getModel(i);if(!r)throw n.illegalArgument();return c(r).then(function(e){return e.map(function(e){return e.symbol})})})}),define(d[454],h([1,0,345,40,21,13,189,250]),function(e,t,n,i,o,r,s,a){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var u=function(e){function t(t,n){var i=e.call(this,n)||this;return i._type=t,i}return f(t,e),t.prototype.run=function(e,t){var n=t.getModel();if(n){for(var i=[],o=t.getSelections(),r=n.getOptions(),s=0;s0&&s._contextViewService.hideContextView()})),this._toDispose.push(this._editor.onKeyDown(function(e){58===e.keyCode&&(e.preventDefault(),e.stopPropagation(),s.showContextMenu())}))}return t=e,e.get=function(e){return e.getContribution(t.ID)},e.prototype._onContextMenu=function(e){if(!this._editor.getConfiguration().contribInfo.contextmenu)return this._editor.focus(),void(e.target.position&&!this._editor.getSelection().containsPosition(e.target.position)&&this._editor.setPosition(e.target.position));if(e.target.type!==p.MouseTargetType.OVERLAY_WIDGET&&(e.event.preventDefault(),e.target.type===p.MouseTargetType.CONTENT_TEXT||e.target.type===p.MouseTargetType.CONTENT_EMPTY||e.target.type===p.MouseTargetType.TEXTAREA)){this._editor.focus(),e.target.position&&!this._editor.getSelection().containsPosition(e.target.position)&&this._editor.setPosition(e.target.position);var t;e.target.type!==p.MouseTargetType.TEXTAREA&&(t={x:e.event.posx,y:e.event.posy+1}),this.showContextMenu(t)}},e.prototype.showContextMenu=function(e){if(this._editor.getConfiguration().contribInfo.contextmenu)if(this._contextMenuService){var t=this._getMenuActions();t.length>0&&this._doShowContextMenu(t,e)}else this._editor.focus()},e.prototype._getMenuActions=function(){var e=[],t=this._menuService.createMenu(c.MenuId.EditorContext,this._contextKeyService),n=t.getActions({arg:this._editor.getModel().uri});t.dispose();for(var i=0,o=n;i0&&this._contextViewService.hideContextView(),this._toDispose=i.dispose(this._toDispose)},e.ID="editor.contrib.contextmenu",e=t=v([g.editorContribution,y(1,a.IContextMenuService),y(2,a.IContextViewService),y(3,l.IContextKeyService),y(4,u.IKeybindingService),y(5,c.IMenuService)],e);var t}();t.ContextMenuController=m;!function(e){function t(){return e.call(this,{id:"editor.action.showContextMenu",label:n.localize(0,null),alias:"Show Editor Context Menu",precondition:null,kbOpts:{kbExpr:d.EditorContextKeys.textFocus,primary:1092}})||this}f(t,e),t.prototype.run=function(e,t){m.get(t).showContextMenu()},t=v([h.editorAction],t)}(h.EditorAction)}),define(d[456],h([1,0,13,3,21,30]),function(e,t,n,i,o,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var s=function(){function e(e){this.selections=e}return e.prototype.equals=function(e){var t=this.selections.length;if(t!==e.selections.length)return!1;for(var n=0;n50&&(n._undoStack=n._undoStack.splice(0,n._undoStack.length-50))),n._prevState=n._readState()})),n}return f(t,e),n=t,t.get=function(e){return e.getContribution(n.ID)},t.prototype._readState=function(){return this._editor.getModel()?new s(this._editor.getSelections()):null},t.prototype.getId=function(){return n.ID},t.prototype.cursorUndo=function(){for(var e=new s(this._editor.getSelections());this._undoStack.length>0;){var t=this._undoStack.pop();if(!t.equals(e))return this._isCursorUndo=!0,this._editor.setSelections(t.selections),void(this._isCursorUndo=!1)}},t.ID="editor.contrib.cursorUndoController",t=n=v([r.editorContribution],t);var n}(i.Disposable);t.CursorUndoController=a;var u=function(e){function t(){return e.call(this,{id:"cursorUndo",precondition:null,kbOpts:{kbExpr:o.EditorContextKeys.textFocus,primary:2099}})||this}return f(t,e),t.prototype.runEditorCommand=function(e,t,n){a.get(t).cursorUndo()},t=v([n.editorCommand],t)}(n.EditorCommand);t.CursorUndo=u}),define(d[176],h([1,0,348,434,40,3,19,2,22,9,20,13,121,253,252,17,18,54,21,76,34]),function(e,t,n,i,o,r,s,a,u,l,c,d,h,p,g,m,_,C,b,w,S){"use strict";function E(e,t){var n=L.get(e);if(!n)return null;var i,o,r=n.getState(),s=r.wholeWord,a=r.matchCase;if(!e.isFocused()&&r.isRevealed&&r.searchString.length>0)i=r.searchString;else{var l=e.getSelection();if(l.startLineNumber!==l.endLineNumber&&!t.allowMultiline)return null;if(l.isEmpty()){var c=e.getModel().getWordAtPosition(l.getStartPosition());if(!c)return null;i=c.word,o=new u.Selection(l.startLineNumber,c.startColumn,l.startLineNumber,c.endColumn)}else i=e.getModel().getValueInRange(l).replace(/\r\n/g,"\n");t.changeFindSearchString&&n.setSearchString(i)}return t.highlightFindOptions&&n.highlightFindOptions(),{searchText:i,matchCase:a,wholeWord:s,currentMatch:o}}Object.defineProperty(t,"__esModule",{value:!0});!function(e){e[e.NoFocusChange=0]="NoFocusChange",e[e.FocusFindInput=1]="FocusFindInput",e[e.FocusReplaceInput=2]="FocusReplaceInput"}(t.FindStartFocusAction||(t.FindStartFocusAction={})),t.CONTEXT_FIND_WIDGET_VISIBLE=new s.RawContextKey("findWidgetVisible",!1),t.CONTEXT_FIND_WIDGET_NOT_VISIBLE=t.CONTEXT_FIND_WIDGET_VISIBLE.toNegated(),t.CONTEXT_FIND_INPUT_FOCUSSED=new s.RawContextKey("findInputFocussed",!1);var L=function(e){function n(n,o,r){var s=e.call(this)||this;return s._editor=n,s._findWidgetVisible=t.CONTEXT_FIND_WIDGET_VISIBLE.bindTo(o),s._storageService=r,s._updateHistoryDelayer=new _.Delayer(500),s._currentHistoryNavigator=new i.HistoryNavigator,s._state=s._register(new p.FindReplaceState),s.loadQueryState(),s._register(s._state.addChangeListener(function(e){return s._onStateChanged(e)})),s._model=null,s._register(s._editor.onDidChangeModel(function(){var e=s._editor.getModel()&&s._state.isRevealed;s.disposeModel(),s._state.change({searchScope:null,matchCase:s._storageService.getBoolean("editor.matchCase",w.StorageScope.WORKSPACE,!1),wholeWord:s._storageService.getBoolean("editor.wholeWord",w.StorageScope.WORKSPACE,!1),isRegex:s._storageService.getBoolean("editor.isRegex",w.StorageScope.WORKSPACE,!1)},!1),e&&s._start({forceRevealReplace:!1,seedSearchStringFromSelection:!1,shouldFocus:0,shouldAnimate:!1})})),s}return f(n,e),n.get=function(e){return e.getContribution(n.ID)},n.prototype.dispose=function(){this.disposeModel(),e.prototype.dispose.call(this)},n.prototype.disposeModel=function(){this._model&&(this._model.dispose(),this._model=null)},n.prototype.getId=function(){return n.ID},n.prototype._onStateChanged=function(e){this.saveQueryState(e),e.updateHistory&&e.searchString&&this._delayedUpdateHistory(),e.isRevealed&&(this._state.isRevealed?this._findWidgetVisible.set(!0):(this._findWidgetVisible.reset(),this.disposeModel()))},n.prototype.saveQueryState=function(e){e.isRegex&&void 0!==this._state.isRegex&&this._storageService.store("editor.isRegex",this._state.isRegex,w.StorageScope.WORKSPACE),e.wholeWord&&void 0!==this._state.wholeWord&&this._storageService.store("editor.wholeWord",this._state.wholeWord,w.StorageScope.WORKSPACE),e.matchCase&&void 0!==this._state.matchCase&&this._storageService.store("editor.matchCase",this._state.matchCase,w.StorageScope.WORKSPACE)},n.prototype.loadQueryState=function(){this._state.change({matchCase:this._storageService.getBoolean("editor.matchCase",w.StorageScope.WORKSPACE,this._state.matchCase),wholeWord:this._storageService.getBoolean("editor.wholeWord",w.StorageScope.WORKSPACE,this._state.wholeWord),isRegex:this._storageService.getBoolean("editor.isRegex",w.StorageScope.WORKSPACE,this._state.isRegex)},!1)},n.prototype._delayedUpdateHistory=function(){this._updateHistoryDelayer.trigger(this._updateHistory.bind(this))},n.prototype._updateHistory=function(){this._state.searchString&&this._currentHistoryNavigator.add(this._state.searchString)},n.prototype.getState=function(){return this._state},n.prototype.getHistory=function(){return this._currentHistoryNavigator},n.prototype.closeFindWidget=function(){this._state.change({isRevealed:!1,searchScope:null},!1),this._editor.focus()},n.prototype.toggleCaseSensitive=function(){this._state.change({matchCase:!this._state.matchCase},!1)},n.prototype.toggleWholeWords=function(){this._state.change({wholeWord:!this._state.wholeWord},!1)},n.prototype.toggleRegex=function(){this._state.change({isRegex:!this._state.isRegex},!1)},n.prototype.toggleSearchScope=function(){if(this._state.searchScope)this._state.change({searchScope:null},!0);else{var e=this._editor.getSelection();1===e.endColumn&&e.endLineNumber>e.startLineNumber&&(e=e.setEndPosition(e.endLineNumber-1,1)),e.isEmpty()||this._state.change({searchScope:e},!0)}},n.prototype.setSearchString=function(e){this._state.change({searchString:e},!1)},n.prototype.highlightFindOptions=function(){},n.prototype._start=function(e){if(this.disposeModel(),this._editor.getModel()){var t={isRevealed:!0};if(e.seedSearchStringFromSelection&&this._editor.getConfiguration().contribInfo.find.seedSearchStringFromSelection){var n=g.getSelectionSearchString(this._editor);n&&(this._state.isRegex?t.searchString=l.escapeRegExpCharacters(n):t.searchString=n)}e.forceRevealReplace?t.isReplaceRevealed=!0:this._findWidgetVisible.get()||(t.isReplaceRevealed=!1),this._state.change(t,!1),this._model||(this._model=new h.FindModelBoundToEditorModel(this._editor,this._state))}},n.prototype.start=function(e){this._start(e)},n.prototype.moveToNextMatch=function(){return!!this._model&&(this._model.moveToNextMatch(),!0)},n.prototype.moveToPrevMatch=function(){return!!this._model&&(this._model.moveToPrevMatch(),!0)},n.prototype.replace=function(){return!!this._model&&(this._model.replace(),!0)},n.prototype.replaceAll=function(){return!!this._model&&(this._model.replaceAll(),!0)},n.prototype.selectAllMatches=function(){return!!this._model&&(this._model.selectAllMatches(),this._editor.focus(),!0)},n.prototype.showPreviousFindTerm=function(){var e=this._currentHistoryNavigator.previous();return e&&this._state.change({searchString:e},!1,!1),!0},n.prototype.showNextFindTerm=function(){var e=this._currentHistoryNavigator.next();return e&&this._state.change({searchString:e},!1,!1),!0},n.ID="editor.contrib.findController",n=v([y(1,s.IContextKeyService),y(2,w.IStorageService)],n)}(r.Disposable);t.CommonFindController=L;var x=function(e){function t(){return e.call(this,{id:h.FIND_IDS.StartFindAction,label:n.localize(0,null),alias:"Find",precondition:null,kbOpts:{kbExpr:null,primary:2084,mac:{primary:2084,secondary:[2083]}}})||this}return f(t,e),t.prototype.run=function(e,t){var n=L.get(t);n&&n.start({forceRevealReplace:!1,seedSearchStringFromSelection:!0,shouldFocus:1,shouldAnimate:!0})},t=v([d.editorAction],t)}(d.EditorAction);t.StartFindAction=x;var N=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return f(t,e),t.prototype.run=function(e,t){var n=L.get(t);n&&!this._run(n)&&(n.start({forceRevealReplace:!1,seedSearchStringFromSelection:0===n.getState().searchString.length,shouldFocus:0,shouldAnimate:!0}),this._run(n))},t}(d.EditorAction);t.MatchFindAction=N;var M=function(e){function t(){return e.call(this,{id:h.FIND_IDS.NextMatchFindAction,label:n.localize(1,null),alias:"Find Next",precondition:null,kbOpts:{kbExpr:b.EditorContextKeys.focus,primary:61,mac:{primary:2085,secondary:[61]}}})||this}return f(t,e),t.prototype._run=function(e){return e.moveToNextMatch()},t=v([d.editorAction],t)}(N);t.NextMatchFindAction=M;var T=function(e){function t(){return e.call(this,{id:h.FIND_IDS.PreviousMatchFindAction,label:n.localize(2,null),alias:"Find Previous",precondition:null,kbOpts:{kbExpr:b.EditorContextKeys.focus,primary:1085,mac:{primary:3109,secondary:[1085]}}})||this}return f(t,e),t.prototype._run=function(e){return e.moveToPrevMatch()},t=v([d.editorAction],t)}(N);t.PreviousMatchFindAction=T;var k=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return f(t,e),t.prototype.run=function(e,t){var n=L.get(t);if(n){var i=g.getSelectionSearchString(t);i&&n.setSearchString(i),this._run(n)||(n.start({forceRevealReplace:!1,seedSearchStringFromSelection:!1,shouldFocus:0,shouldAnimate:!0}),this._run(n))}},t}(d.EditorAction);t.SelectionMatchFindAction=k;var I=function(e){function t(){return e.call(this,{id:h.FIND_IDS.NextSelectionMatchFindAction,label:n.localize(3,null),alias:"Find Next Selection",precondition:null,kbOpts:{kbExpr:b.EditorContextKeys.focus,primary:2109}})||this}return f(t,e),t.prototype._run=function(e){return e.moveToNextMatch()},t=v([d.editorAction],t)}(k);t.NextSelectionMatchFindAction=I;var D=function(e){function t(){return e.call(this,{id:h.FIND_IDS.PreviousSelectionMatchFindAction,label:n.localize(4,null),alias:"Find Previous Selection",precondition:null,kbOpts:{kbExpr:b.EditorContextKeys.focus,primary:3133}})||this}return f(t,e),t.prototype._run=function(e){return e.moveToPrevMatch()},t=v([d.editorAction],t)}(k);t.PreviousSelectionMatchFindAction=D;var O=function(e){function t(){return e.call(this,{id:h.FIND_IDS.StartFindReplaceAction,label:n.localize(5,null),alias:"Replace",precondition:null,kbOpts:{kbExpr:null,primary:2086,mac:{primary:2596}}})||this}return f(t,e),t.prototype.run=function(e,t){if(!t.getConfiguration().readOnly){var n=L.get(t),i=t.getSelection(),o=!i.isEmpty()&&i.startLineNumber===i.endLineNumber,r=n.getState().searchString||o?2:1;n&&n.start({forceRevealReplace:!0,seedSearchStringFromSelection:o,shouldFocus:r,shouldAnimate:!0})}},t=v([d.editorAction],t)}(d.EditorAction);t.StartFindReplaceAction=O;var R=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return f(t,e),t.prototype._getNextMatch=function(e){var t=E(e,{changeFindSearchString:!0,allowMultiline:!0,highlightFindOptions:!0});if(!t)return null;if(t.currentMatch)return t.currentMatch;var n=e.getSelections(),i=n[n.length-1],o=e.getModel().findNextMatch(t.searchText,i.getEndPosition(),!1,t.matchCase,t.wholeWord?e.getConfiguration().wordSeparators:null,!1);return o?new u.Selection(o.range.startLineNumber,o.range.startColumn,o.range.endLineNumber,o.range.endColumn):null},t}(d.EditorAction);t.SelectNextFindMatchAction=R;var P=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return f(t,e),t.prototype._getPreviousMatch=function(e){var t=E(e,{changeFindSearchString:!0,allowMultiline:!0,highlightFindOptions:!0});if(!t)return null;if(t.currentMatch)return t.currentMatch;var n=e.getSelections(),i=n[n.length-1],o=e.getModel().findPreviousMatch(t.searchText,i.getStartPosition(),!1,t.matchCase,t.wholeWord?e.getConfiguration().wordSeparators:null,!1);return o?new u.Selection(o.range.startLineNumber,o.range.startColumn,o.range.endLineNumber,o.range.endColumn):null},t}(d.EditorAction);t.SelectPreviousFindMatchAction=P;var A=function(e){function t(){return e.call(this,{id:h.FIND_IDS.AddSelectionToNextFindMatchAction,label:n.localize(6,null),alias:"Add Selection To Next Find Match",precondition:null,kbOpts:{kbExpr:b.EditorContextKeys.focus,primary:2082}})||this}return f(t,e),t.prototype.run=function(e,t){var n=t.getSelections();if(n.length>1){var i=t.getModel(),o=L.get(t);if(!o)return;var r=o.getState().matchCase,s=!0,a=i.getValueInRange(n[0]);r||(a=a.toLowerCase());for(var l=1,c=n.length;l0)i=t.getModel().findMatches(o.searchString,!0,o.isRegex,o.matchCase,o.wholeWord?t.getConfiguration().wordSeparators:null,!1).map(function(e){return e.range});else{var r=E(t,{changeFindSearchString:!0,allowMultiline:!0,highlightFindOptions:!0});if(!r)return;i=t.getModel().findMatches(r.searchText,!0,!1,r.matchCase,r.wholeWord?t.getConfiguration().wordSeparators:null,!1).map(function(e){return e.range})}if(i.length>0){for(var s=t.getSelection(),a=0,l=i.length;a200)return null;var a=L.get(t);if(!a)return null;var u=a.getState().matchCase,l=t.getSelections(),c=n.getValueInRange(l[0]);u||(c=c.toLowerCase());for(var d=1;d=d)s.push(h),u++;else{var p=a.Range.compareRangesUsingStarts(h,r[l]);p<0?(s.push(h),u++):p>0?l++:(u++,l++)}}var f=s.map(function(e){return{range:e,options:i?n._SELECTION_HIGHLIGHT:n._SELECTION_HIGHLIGHT_OVERVIEW}});this.decorations=this.editor.deltaDecorations(this.decorations,f)}else this.decorations.length>0&&(this.decorations=this.editor.deltaDecorations(this.decorations,[]))},t.prototype.dispose=function(){this._setState(null),e.prototype.dispose.call(this)},t.ID="editor.contrib.selectionHighlighter",t._SELECTION_HIGHLIGHT_OVERVIEW=S.ModelDecorationOptions.register({stickiness:c.TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges,className:"selectionHighlight",overviewRuler:{color:"#A0A0A0",darkColor:"#A0A0A0",position:c.OverviewRulerLane.Center}}),t._SELECTION_HIGHLIGHT=S.ModelDecorationOptions.register({stickiness:c.TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges,className:"selectionHighlight"}),t=n=v([d.commonEditorContribution],t);var n}(r.Disposable);t.SelectionHighlighter=U;var j=function(e){function i(){return e.call(this,{id:h.FIND_IDS.ShowNextFindTermAction,label:n.localize(12,null),alias:"Show Next Find Term",precondition:t.CONTEXT_FIND_WIDGET_VISIBLE,kbOpts:{weight:d.CommonEditorRegistry.commandWeight(5),kbExpr:s.ContextKeyExpr.and(t.CONTEXT_FIND_INPUT_FOCUSSED,b.EditorContextKeys.focus),primary:h.ShowNextFindTermKeybinding.primary,mac:h.ShowNextFindTermKeybinding.mac,win:h.ShowNextFindTermKeybinding.win,linux:h.ShowNextFindTermKeybinding.linux}})||this}return f(i,e),i.prototype._run=function(e){return e.showNextFindTerm()},i=v([d.editorAction],i)}(N);t.ShowNextFindTermAction=j;var q=function(e){function i(){return e.call(this,{id:h.FIND_IDS.ShowPreviousFindTermAction,label:n.localize(13,null),alias:"Find Show Previous Find Term",precondition:t.CONTEXT_FIND_WIDGET_VISIBLE,kbOpts:{weight:d.CommonEditorRegistry.commandWeight(5),kbExpr:s.ContextKeyExpr.and(t.CONTEXT_FIND_INPUT_FOCUSSED,b.EditorContextKeys.focus),primary:h.ShowPreviousFindTermKeybinding.primary,mac:h.ShowPreviousFindTermKeybinding.mac,win:h.ShowPreviousFindTermKeybinding.win,linux:h.ShowPreviousFindTermKeybinding.linux}})||this}return f(i,e),i.prototype._run=function(e){return e.showPreviousFindTerm()},i=v([d.editorAction],i)}(N);t.ShpwPreviousFindTermAction=q;var G=d.EditorCommand.bindToContribution(L.get);d.CommonEditorRegistry.registerEditorCommand(new G({id:h.FIND_IDS.CloseFindWidgetCommand,precondition:t.CONTEXT_FIND_WIDGET_VISIBLE,handler:function(e){return e.closeFindWidget()},kbOpts:{weight:d.CommonEditorRegistry.commandWeight(5),kbExpr:b.EditorContextKeys.focus,primary:9,secondary:[1033]}})),d.CommonEditorRegistry.registerEditorCommand(new G({id:h.FIND_IDS.ToggleCaseSensitiveCommand,precondition:null,handler:function(e){return e.toggleCaseSensitive()},kbOpts:{weight:d.CommonEditorRegistry.commandWeight(5),kbExpr:b.EditorContextKeys.focus,primary:h.ToggleCaseSensitiveKeybinding.primary,mac:h.ToggleCaseSensitiveKeybinding.mac,win:h.ToggleCaseSensitiveKeybinding.win,linux:h.ToggleCaseSensitiveKeybinding.linux}})),d.CommonEditorRegistry.registerEditorCommand(new G({id:h.FIND_IDS.ToggleWholeWordCommand,precondition:null,handler:function(e){return e.toggleWholeWords()},kbOpts:{weight:d.CommonEditorRegistry.commandWeight(5),kbExpr:b.EditorContextKeys.focus,primary:h.ToggleWholeWordKeybinding.primary,mac:h.ToggleWholeWordKeybinding.mac,win:h.ToggleWholeWordKeybinding.win,linux:h.ToggleWholeWordKeybinding.linux}})),d.CommonEditorRegistry.registerEditorCommand(new G({id:h.FIND_IDS.ToggleRegexCommand,precondition:null,handler:function(e){return e.toggleRegex()},kbOpts:{weight:d.CommonEditorRegistry.commandWeight(5),kbExpr:b.EditorContextKeys.focus,primary:h.ToggleRegexKeybinding.primary,mac:h.ToggleRegexKeybinding.mac,win:h.ToggleRegexKeybinding.win,linux:h.ToggleRegexKeybinding.linux}})),d.CommonEditorRegistry.registerEditorCommand(new G({id:h.FIND_IDS.ToggleSearchScopeCommand,precondition:null,handler:function(e){return e.toggleSearchScope()},kbOpts:{weight:d.CommonEditorRegistry.commandWeight(5),kbExpr:b.EditorContextKeys.focus,primary:h.ToggleSearchScopeKeybinding.primary,mac:h.ToggleSearchScopeKeybinding.mac,win:h.ToggleSearchScopeKeybinding.win,linux:h.ToggleSearchScopeKeybinding.linux}})),d.CommonEditorRegistry.registerEditorCommand(new G({id:h.FIND_IDS.ReplaceOneAction,precondition:t.CONTEXT_FIND_WIDGET_VISIBLE,handler:function(e){return e.replace()},kbOpts:{weight:d.CommonEditorRegistry.commandWeight(5),kbExpr:b.EditorContextKeys.focus,primary:3094}})),d.CommonEditorRegistry.registerEditorCommand(new G({id:h.FIND_IDS.ReplaceAllAction,precondition:t.CONTEXT_FIND_WIDGET_VISIBLE,handler:function(e){return e.replaceAll()},kbOpts:{weight:d.CommonEditorRegistry.commandWeight(5),kbExpr:b.EditorContextKeys.focus,primary:2563}})),d.CommonEditorRegistry.registerEditorCommand(new G({id:h.FIND_IDS.SelectAllMatchesAction,precondition:t.CONTEXT_FIND_WIDGET_VISIBLE,handler:function(e){return e.selectAllMatches()},kbOpts:{weight:d.CommonEditorRegistry.commandWeight(5),kbExpr:b.EditorContextKeys.focus,primary:515}}))}),define(d[458],h([1,0,349,29,4,18,40,3,2,13,25,30,333,257,256,21,328]),function(e,t,n,i,o,r,s,a,u,l,c,d,h,p,g,m){"use strict";function _(e){if(!i.isUndefined(e)){if(!i.isObject(e))return!1;var t=e;if(!i.isUndefined(t.levels)&&!i.isNumber(t.levels))return!1;if(!i.isUndefined(t.direction)&&!i.isString(t.direction))return!1}return!0}Object.defineProperty(t,"__esModule",{value:!0});var y=function(){function e(e){var t=this;this.editor=e,this._isEnabled=this.editor.getConfiguration().contribInfo.folding,this._showFoldingControls=this.editor.getConfiguration().contribInfo.showFoldingControls,this.globalToDispose=[],this.localToDispose=[],this.decorations=[],this.computeToken=0,this.globalToDispose.push(this.editor.onDidChangeModel(function(){return t.onModelChanged()})),this.globalToDispose.push(this.editor.onDidChangeConfiguration(function(e){var n=t._isEnabled;t._isEnabled=t.editor.getConfiguration().contribInfo.folding,n!==t._isEnabled&&t.onModelChanged();var i=t._showFoldingControls;t._showFoldingControls=t.editor.getConfiguration().contribInfo.showFoldingControls,i!==t._showFoldingControls&&t.updateHideFoldIconClass()})),this.onModelChanged()}return t=e,e.get=function(e){return e.getContribution(g.ID)},e.prototype.getId=function(){return g.ID},e.prototype.dispose=function(){this.cleanState(),this.globalToDispose=a.dispose(this.globalToDispose)},e.prototype.updateHideFoldIconClass=function(){var e=this.editor.getDomNode();e&&o.toggleClass(e,"alwaysShowFoldIcons","always"===this._showFoldingControls)},e.prototype.saveViewState=function(){var e=this.editor.getModel();if(!e)return{};var t=[];return this.decorations.forEach(function(n){if(n.isCollapsed){var i=n.getDecorationRange(e);i&&t.push({startLineNumber:i.startLineNumber,endLineNumber:i.endLineNumber,indent:n.indent,isCollapsed:!0})}}),{collapsedRegions:t,lineCount:e.getLineCount()}},e.prototype.restoreViewState=function(e){var t=this.editor.getModel();t&&this._isEnabled&&e&&Array.isArray(e.collapsedRegions)&&0!==e.collapsedRegions.length&&e.lineCount===t.getLineCount()&&(this.cleanState(),this.applyRegions(e.collapsedRegions),this.onModelChanged())},e.prototype.cleanState=function(){this.localToDispose=a.dispose(this.localToDispose)},e.prototype.applyRegions=function(e){var n=this,i=this.editor.getModel();if(i){var o=!1;e=p.limitByIndent(e,t.MAX_FOLDING_REGIONS).sort(function(e,t){return e.startLineNumber-t.startLineNumber}),this.editor.changeDecorations(function(t){for(var r=[],s=0,a=0;ae[s].startLineNumber;){d=e[s];o=o||d.isCollapsed,r.push(new h.CollapsibleRegion(d,i,t)),s++}if(s0&&(u.forEach(function(e,n){t.editor.changeDecorations(function(t){e.setCollapsed(!1,t),i=!0})}),!h.doesLineBelongsToCollapsibleRegion(u[0].foldingRange,s.startLineNumber))){var l=u[0].startLineNumber,c=n.getLineMaxColumn(u[0].startLineNumber);o[a]=s.setEndPosition(l,c).setStartPosition(l,c),r=!0}}),r&&this.editor.setSelections(o),i&&this.updateHiddenAreas(o[0].startLineNumber)},e.prototype.fold=function(e,t){var n=this,i=!1,o=this.editor.getSelections();o.forEach(function(o){var r=o.startLineNumber;h.getCollapsibleRegionsToFoldAtLine(n.decorations,n.editor.getModel(),r,e,t).forEach(function(e){return n.editor.changeDecorations(function(t){e.setCollapsed(!0,t),i=!0})})}),i&&this.updateHiddenAreas(o[0].startLineNumber)},e.prototype.foldUnfoldRecursively=function(e){var t=this,n=!1,i=this.editor.getModel(),o=this.editor.getSelections();o.forEach(function(o){for(var r,s=o.startLineNumber,a=[],u=0,l=t.decorations.length;u=s&&(d.endLineNumber<=r||void 0===r))){if(d.startLineNumber!==s&&void 0===r)return;r=r||d.endLineNumber,a.push(c)}}a.length>0&&a.forEach(function(i){t.editor.changeDecorations(function(t){i.setCollapsed(e,t),n=!0})})}),n&&this.updateHiddenAreas(o[0].startLineNumber)},e.prototype.foldAll=function(){this.changeAll(!0)},e.prototype.unfoldAll=function(){this.changeAll(!1)},e.prototype.changeAll=function(e){var t=this;if(this.decorations.length>0){var n=!0;this.editor.changeDecorations(function(i){t.decorations.forEach(function(t){e!==t.isCollapsed&&(t.setCollapsed(e,i),n=!0)})}),n&&this.updateHiddenAreas(this.editor.getPosition().lineNumber)}},e.prototype.foldLevel=function(e,t){var n=this,i=this.editor.getModel(),o=[i.getFullModelRange()],r=!1;this.editor.changeDecorations(function(s){n.decorations.forEach(function(n){var a=n.getDecorationRange(i);if(a){for(;!u.Range.containsRange(o[o.length-1],a);)o.pop();o.push(a),o.length!==e+1||n.isCollapsed||t.some(function(e){return a.startLineNumber1)){var n=this.editor.getModel(),o=this.editor.getPosition(),r=!1,s=this.editor.onDidChangeModelContent(function(e){if(e.isFlush)return r=!0,void s.dispose();for(var t=0,n=e.changes.length;t1)){var n=this.editor.getModel(),o=n.getOptions(),r=o.tabSize,s=o.insertSpaces,a=new b.EditorState(this.editor,5);c.getDocumentRangeFormattingEdits(n,e,{tabSize:r,insertSpaces:s}).then(function(e){return t.workerService.computeMoreMinimalEdits(n.uri,e,[])}).then(function(e){a.validate(t.editor)&&!i.isFalsyOrEmpty(e)&&(d.EditOperationsCommand.execute(t.editor,e),S(e))})}},e.prototype.getId=function(){return t.ID},e.prototype.dispose=function(){this.callOnDispose=r.dispose(this.callOnDispose),this.callOnModel=r.dispose(this.callOnModel)},e.ID="editor.contrib.formatOnPaste",e=t=v([u.commonEditorContribution,y(1,g.IEditorWorkerService)],e);var t}();var E=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return f(t,e),t.prototype.run=function(e,t){var n=e.get(g.IEditorWorkerService),o=this._getFormattingEdits(t);if(!o)return s.TPromise.as(void 0);var r=new b.EditorState(t,5);return o.then(function(e){return n.computeMoreMinimalEdits(t.getModel().uri,e,t.getSelections())}).then(function(e){r.validate(t)&&!i.isFalsyOrEmpty(e)&&(d.EditOperationsCommand.execute(t,e),S(e),t.focus())})},t}(u.EditorAction);t.AbstractFormatAction=E;var L=function(e){function t(){return e.call(this,{id:"editor.action.formatDocument",label:n.localize(4,null),alias:"Format Document",precondition:a.ContextKeyExpr.and(w.EditorContextKeys.writable,w.EditorContextKeys.hasDocumentFormattingProvider),kbOpts:{kbExpr:w.EditorContextKeys.textFocus,primary:1572,linux:{primary:3111}},menuOpts:{group:"1_modification",order:1.3}})||this}return f(t,e),t.prototype._getFormattingEdits=function(e){var t=e.getModel(),n=t.getOptions(),i=n.tabSize,o=n.insertSpaces;return c.getDocumentFormattingEdits(t,{tabSize:i,insertSpaces:o})},t=v([u.editorAction],t)}(E);t.FormatDocumentAction=L;var x=function(e){function t(){return e.call(this,{id:"editor.action.formatSelection",label:n.localize(5,null),alias:"Format Code",precondition:a.ContextKeyExpr.and(w.EditorContextKeys.writable,w.EditorContextKeys.hasDocumentSelectionFormattingProvider,w.EditorContextKeys.hasNonEmptySelection),kbOpts:{kbExpr:w.EditorContextKeys.textFocus,primary:o.KeyChord(2089,2084)},menuOpts:{group:"1_modification",order:1.31}})||this}return f(t,e),t.prototype._getFormattingEdits=function(e){var t=e.getModel(),n=t.getOptions(),i=n.tabSize,o=n.insertSpaces;return c.getDocumentRangeFormattingEdits(t,e.getSelection(),{tabSize:i,insertSpaces:o})},t=v([u.editorAction],t)}(E);t.FormatSelectionAction=x,h.CommandsRegistry.registerCommand("editor.action.format",function(e){var t=e.get(p.ICodeEditorService).getFocusedCodeEditor();if(t)return(new(function(e){function t(){return e.call(this,{})||this}return f(t,e),t.prototype._getFormattingEdits=function(e){var t=e.getModel(),n=e.getSelection(),i=t.getOptions(),o=i.tabSize,r=i.insertSpaces;return n.isEmpty()?c.getDocumentFormattingEdits(t,{tabSize:o,insertSpaces:r}):c.getDocumentRangeFormattingEdits(t,n,{tabSize:o,insertSpaces:r})},t}(E))).run(e,t)})}),define(d[177],h([1,0,10,7,13,17,18]),function(e,t,n,i,o,r,s){"use strict";function a(e){return i.TPromise.join(e).then(function(e){for(var t=[],n=0,i=e;n0;t&&n&&(r[o]=e)}},function(e){i.onUnexpectedExternalError(e)})});return o.TPromise.join(u).then(function(){return n.coalesce(r)})}Object.defineProperty(t,"__esModule",{value:!0}),t.getHover=u,r.CommonEditorRegistry.registerDefaultLanguageCommand("_executeHoverProvider",u)}),define(d[463],h([1,0,355,24,10,4,7,102,71,2,12,17,122,462,195,196,133,34,242,245,246,247,32,3]),function(e,t,n,i,o,r,s,a,u,l,c,d,h,p,g,m,v,_,y,C,b,w,S,E){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var L=r.$,x=function(){return function(e,t,n,i){this.range=e,this.color=t,this.format=n,this.availableFormats=i}}(),N=function(){function e(e){this._editor=e,this._range=null}return e.prototype.setRange=function(e){this._range=e,this._result=[]},e.prototype.clearResult=function(){this._result=[]},e.prototype.computeAsync=function(){var e=this._editor.getModel();return d.HoverProviderRegistry.has(e)?p.getHover(e,new c.Position(this._range.startLineNumber,this._range.startColumn)):s.TPromise.as(null)},e.prototype.computeSync=function(){var e=this,t=this._range.startLineNumber;if(t>this._editor.getModel().getLineCount())return[];var n=function(e){return e&&(!Array.isArray(e)||e.length>0)},i=this._editor.getModel().getLineMaxColumn(t);return this._editor.getLineDecorations(t).map(function(o){var r=o.range.startLineNumber===t?o.range.startColumn:1,s=o.range.endLineNumber===t?o.range.endColumn:i;if(r>e._range.startColumn||e._range.endColumn>s)return null;var a=new l.Range(e._range.startLineNumber,r,e._range.startLineNumber,s),u=o.options,c=u&&u.extraOptions;if(b.isColorDecorationOptions(c)){var d=c.color,h=c.format,p=c.availableFormats;return new x(a,d,h,p)}if(!n(o.options.hoverMessage))return null;var f=void 0;return o.options.hoverMessage&&(f=Array.isArray(o.options.hoverMessage)?o.options.hoverMessage.slice():[o.options.hoverMessage]),{contents:f,range:a}}).filter(function(e){return!!e})},e.prototype.onResult=function(e,t){this._result=t?e.concat(this._result.sort(function(e,t){return e instanceof x?-1:t instanceof x?1:0})):this._result.concat(e)},e.prototype.getResult=function(){return this._result.slice(0)},e.prototype.getResultWithLoadingMessage=function(){return this._result.slice(0).concat([this._getLoadingMessage()])},e.prototype._getLoadingMessage=function(){return{range:this._range,contents:[v.textToMarkedString(n.localize(0,null))]}},e}(),M=function(e){function t(n,i,o){var s=e.call(this,t.ID,n)||this;return s._computer=new N(s._editor),s._highlightDecorations=[],s._isChangingDecorations=!1,s._openerService=i||u.NullOpenerService,s._modeService=o,s._hoverOperation=new g.HoverOperation(s._computer,function(e){return s._withResult(e,!0)},null,function(e){return s._withResult(e,!1)}),s.toDispose=[],s.toDispose.push(r.addStandardDisposableListener(s.getDomNode(),r.EventType.FOCUS,function(){s._colorPicker&&r.addClass(s.getDomNode(),"colorpicker-hover")})),s.toDispose.push(r.addStandardDisposableListener(s.getDomNode(),r.EventType.BLUR,function(){r.removeClass(s.getDomNode(),"colorpicker-hover")})),s}return f(t,e),t.prototype.dispose=function(){this._hoverOperation.cancel(),this._colorPicker&&this._colorPicker.dispose(),this.toDispose=E.dispose(this.toDispose),e.prototype.dispose.call(this)},t.prototype.onModelDecorationsChanged=function(){this._isChangingDecorations||this.isVisible&&(this._hoverOperation.cancel(),this._computer.clearResult(),this._colorPicker||this._hoverOperation.start())},t.prototype.startShowingAt=function(e,t){if(!this._lastRange||!this._lastRange.equalsRange(e)){if(this._hoverOperation.cancel(),this.isVisible)if(this._showAtPosition.lineNumber!==e.startLineNumber)this.hide();else{for(var n=[],i=0,o=this._messages.length;i=e.endColumn&&n.push(r)}n.length>0?this._renderMessages(e,n):this.hide()}this._lastRange=e,this._computer.setRange(e),this._shouldFocus=t,this._hoverOperation.start()}},t.prototype.hide=function(){this._lastRange=null,this._hoverOperation.cancel(),e.prototype.hide.call(this),this._isChangingDecorations=!0,this._highlightDecorations=this._editor.deltaDecorations(this._highlightDecorations,[]),this._isChangingDecorations=!1,this._colorPicker=null,this._colorPicker&&this._colorPicker.dispose()},t.prototype.isColorPickerVisible=function(){return!!this._colorPicker},t.prototype._withResult=function(e,t){this._messages=e,this._lastRange&&this._messages.length>0?this._renderMessages(this._lastRange,this._messages):t&&this.hide()},t.prototype._renderMessages=function(e,n){var r=this,s=Number.MAX_VALUE,u=n[0].range,d=document.createDocumentFragment();n.forEach(function(e){if(e.range)if(s=Math.min(s,e.range.startColumn),u=l.Range.plusRange(u,e.range),e instanceof x){var t=void 0,n=void 0;"string"==typeof e.format?t=new w.ColorFormatter(e.format):(t=new w.ColorFormatter(e.format.opaque),n=new w.ColorFormatter(e.format.transparent));var c=[];e.availableFormats&&e.availableFormats.forEach(function(e){var t;t="string"==typeof e?new w.ColorFormatter(e):{opaqueFormatter:new w.ColorFormatter(e.opaque),transparentFormatter:new w.ColorFormatter(e.transparent)},c.push(t)});var p=e.color,f=p.red,g=p.green,m=p.blue,v=p.alpha,_=new S.RGBA(255*f,255*g,255*m,255*v),b=S.Color.fromRGBA(_),E=new y.ColorPickerModel(_.toString(),b,t,n,c,r._editor.getModel(),e.range),N=r._register(new C.ColorPickerWidget(E,r._editor));E.widget=N,r._colorPicker=N,d.appendChild(N.getDomNode())}else e.contents.filter(function(e){return!!e}).forEach(function(e){var t=a.renderMarkedString(e,{actionCallback:function(e){r._openerService.open(i.default.parse(e)).then(void 0,o.onUnexpectedError)},codeBlockRenderer:function(e,t){var n=e?r._modeService.getModeIdForLanguageName(e):r._editor.getModel().getLanguageIdentifier().language;return r._modeService.getOrCreateMode(n).then(function(e){return h.tokenizeToString(t,n)})}});d.appendChild(L("div.hover-row",null,t))})}),this.showAt(new c.Position(e.startLineNumber,s),this._shouldFocus),this.updateContents(d),this._colorPicker&&(this._colorPicker.layout(),this._colorPicker.layoutSaturationBox()),this._isChangingDecorations=!0,this._highlightDecorations=this._editor.deltaDecorations(this._highlightDecorations,[{range:u,options:t._DECORATION_OPTIONS}]),this._isChangingDecorations=!1},t.ID="editor.contrib.modesContentHoverWidget",t._DECORATION_OPTIONS=_.ModelDecorationOptions.register({className:"hoverHighlight"}),t}(m.ContentHoverWidget);t.ModesContentHoverWidget=M}),define(d[464],h([1,0,357,40,266,59,435,21,73,2,22,13,264,265,319,119,134]),function(e,t,n,i,o,r,s,a,u,l,c,d,h,p,g,m,_){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var y=function(e){function t(t,n){var i=e.call(this,n)||this;return i.down=t,i}return f(t,e),t.prototype.run=function(e,t){for(var n=[],i=t.getSelections(),o=0;oe.endLineNumber+1?(o.push(e),t):new c.Selection(e.startLineNumber,e.startColumn,t.endLineNumber,t.endColumn):t.startLineNumber>e.endLineNumber?(o.push(e),t):new c.Selection(e.startLineNumber,e.startColumn,t.endLineNumber,t.endColumn)});o.push(s);for(var a=t.getModel(),u=[],d=[],h=i,p=0,f=0,g=o.length;f=1){var N=!0;""===S&&(N=!1),!N||" "!==S.charAt(S.length-1)&&"\t"!==S.charAt(S.length-1)||(N=!1,S=S.replace(/[\s\uFEFF\xA0]+$/g," "));var M=L.substr(x-1);S+=(N?" ":"")+M,C=N?M.length+1:M.length}else C=0}var T=new l.Range(v,1,_,y);if(!T.isEmpty()){var k=void 0;m.isEmpty()?(u.push(r.EditOperation.replace(T,S)),k=new c.Selection(T.startLineNumber-p,S.length-C+1,v-p,S.length-C+1)):m.startLineNumber===m.endLineNumber?(u.push(r.EditOperation.replace(T,S)),k=new c.Selection(m.startLineNumber-p,m.startColumn,m.endLineNumber-p,m.endColumn)):(u.push(r.EditOperation.replace(T,S)),k=new c.Selection(m.startLineNumber-p,m.startColumn,m.startLineNumber-p,S.length-b)),null!==l.Range.intersectRanges(T,i)?h=k:d.push(k)}p+=T.endLineNumber-T.startLineNumber}d.unshift(h),t.executeEdits(this.id,u,d)},t=v([d.editorAction],t)}(d.EditorAction);t.JoinLinesAction=T;var k=function(e){function t(){return e.call(this,{id:"editor.action.transpose",label:n.localize(15,null),alias:"Transpose characters around the cursor",precondition:a.EditorContextKeys.writable})||this}return f(t,e),t.prototype.run=function(e,t){for(var n=t.getSelections(),i=t.getModel(),o=[],r=0,s=n.length;r=h){if(d.lineNumber===i.getLineCount())continue;var p=new l.Range(d.lineNumber,Math.max(1,d.column-1),d.lineNumber+1,1),f=i.getValueInRange(p).split("").reverse().join("");o.push(new u.ReplaceCommand(new c.Selection(d.lineNumber,Math.max(1,d.column-1),d.lineNumber+1,1),f))}else{var p=new l.Range(d.lineNumber,Math.max(1,d.column-1),d.lineNumber,d.column+1),f=i.getValueInRange(p).split("").reverse().join("");o.push(new u.ReplaceCommandThatPreservesSelection(p,f,new c.Selection(d.lineNumber,d.column+1,d.lineNumber,d.column+1)))}}}t.pushUndoStop(),t.executeCommands(this.id,o),t.pushUndoStop()},t=v([d.editorAction],t)}(d.EditorAction);t.TransposeAction=k;var I=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return f(t,e),t.prototype.run=function(e,t){for(var n=t.getSelections(),i=t.getModel(),o=[],r=0,s=n.length;r1&&i.push(new r.Selection(e.endLineNumber,e.endColumn,e.endLineNumber,e.endColumn)),i},t.prototype.run=function(e,t){var n=this,i=t.getSelections().map(function(e){return n.getCursorsForSelection(e,t)}).reduce(function(e,t){return e.concat(t)});i.length>0&&t.setSelections(i)},t=v([o.editorAction],t)}(o.EditorAction)}),define(d[178],h([1,0,10,13,17,18,19]),function(e,t,n,i,o,r,s){"use strict";function a(e,t){var i,s=o.SignatureHelpProviderRegistry.ordered(e);return r.sequence(s.map(function(o){return function(){if(!i)return r.asWinJsPromise(function(n){return o.provideSignatureHelp(e,t,n)}).then(function(e){i=e},n.onUnexpectedExternalError)}})).then(function(){return i})}Object.defineProperty(t,"__esModule",{value:!0}),t.Context={Visible:new s.RawContextKey("parameterHintsVisible",!1),MultipleSignatures:new s.RawContextKey("parameterHintsMultipleSignatures",!1)},t.provideSignatureHelp=a,i.CommonEditorRegistry.registerDefaultLanguageCommand("_executeSignatureHelpProvider",a)}),define(d[467],h([1,0,24,2,17,18,7,10,56,13]),function(e,t,n,i,o,r,s,a,u,l){"use strict";function c(e,t){var n=[],i=o.CodeActionProviderRegistry.all(e).map(function(i){return r.asWinJsPromise(function(n){return i.provideCodeActions(e,t,n)}).then(function(e){if(Array.isArray(e))for(var t=0,i=e;tthis.context.column&&this.completionModel.incomplete&&0!==e.leadingWord.word.length){var t=this.completionModel.resolveIncompleteInfo(),n=t.complete,i=t.incomplete;this.trigger(2===this._state,!0,i,n)}else{var o=this.completionModel.lineContext,r=!1;if(this.completionModel.lineContext={leadingLineContent:e.leadingLineContent,characterCountDelta:e.column-this.context.column},0===this.completionModel.items.length){if(p.shouldAutoTrigger(this.editor)&&this.context.leadingWord.endColumn0)&&0===e.leadingWord.word.length)return void this.cancel()}this._onDidSuggest.fire({completionModel:this.completionModel,auto:this.context.auto,isFrozen:r})}}else this.cancel()},e}();t.SuggestModel=f}),define(d[181],h([1,0,373,13,168]),function(e,t,n,i,o){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(e){function t(){return e.call(this,{id:r.ID,label:n.localize(0,null),alias:"Toggle Tab Key Moves Focus",precondition:null,kbOpts:{kbExpr:null,primary:2091,mac:{primary:1323}}})||this}return f(t,e),r=t,t.prototype.run=function(e,t){var n=o.TabFocus.getTabFocusMode();o.TabFocus.setTabFocusMode(!n)},t.ID="editor.action.toggleTabFocusMode",t=r=v([i.editorAction],t);var r}(i.EditorAction);t.ToggleTabFocusModeAction=r}),define(d[476],h([1,0,21,22,13,12,2,172,73,94,39,54]),function(e,t,n,i,o,r,s,a,u,l,c,d){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var h=function(e){function t(t){var n=e.call(this,t)||this;return n._inSelectionMode=t.inSelectionMode,n._wordNavigationType=t.wordNavigationType,n}return f(t,e),t.prototype.runEditorCommand=function(e,t,n){var i=this,o=t.getConfiguration(),s=l.getMapForWordSeparators(o.wordSeparators),a=t.getModel(),u=t.getSelections().map(function(e){var t=new r.Position(e.positionLineNumber,e.positionColumn),n=i._move(s,a,t,i._wordNavigationType);return i._moveTo(e,n,i._inSelectionMode)});if(t._getCursors().setStates("moveWordCommand",d.CursorChangeReason.NotSet,u.map(function(e){return c.CursorState.fromModelSelection(e)})),1===u.length){var h=new r.Position(u[0].positionLineNumber,u[0].positionColumn);t.revealPosition(h,!1,!0)}},t.prototype._moveTo=function(e,t,n){return n?new i.Selection(e.selectionStartLineNumber,e.selectionStartColumn,t.lineNumber,t.column):new i.Selection(t.lineNumber,t.column,t.lineNumber,t.column)},t}(o.EditorCommand);t.MoveWordCommand=h;var p=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return f(t,e),t.prototype._move=function(e,t,n,i){return a.WordOperations.moveWordLeft(e,t,n,i)},t}(h);t.WordLeftCommand=p;var g=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return f(t,e),t.prototype._move=function(e,t,n,i){return a.WordOperations.moveWordRight(e,t,n,i)},t}(h);t.WordRightCommand=g;var m=function(e){function t(){return e.call(this,{inSelectionMode:!1,wordNavigationType:0,id:"cursorWordStartLeft",precondition:null,kbOpts:{kbExpr:n.EditorContextKeys.textFocus,primary:2063,mac:{primary:527}}})||this}return f(t,e),t=v([o.editorCommand],t)}(p);t.CursorWordStartLeft=m;var _=function(e){function t(){return e.call(this,{inSelectionMode:!1,wordNavigationType:1,id:"cursorWordEndLeft",precondition:null})||this}return f(t,e),t=v([o.editorCommand],t)}(p);t.CursorWordEndLeft=_;var y=function(e){function t(){return e.call(this,{inSelectionMode:!1,wordNavigationType:0,id:"cursorWordLeft",precondition:null})||this}return f(t,e),t=v([o.editorCommand],t)}(p);t.CursorWordLeft=y;var C=function(e){function t(){return e.call(this,{inSelectionMode:!0,wordNavigationType:0,id:"cursorWordStartLeftSelect",precondition:null,kbOpts:{kbExpr:n.EditorContextKeys.textFocus,primary:3087,mac:{primary:1551}}})||this}return f(t,e),t=v([o.editorCommand],t)}(p);t.CursorWordStartLeftSelect=C;var b=function(e){function t(){return e.call(this,{inSelectionMode:!0,wordNavigationType:1,id:"cursorWordEndLeftSelect",precondition:null})||this}return f(t,e),t=v([o.editorCommand],t)}(p);t.CursorWordEndLeftSelect=b;var w=function(e){function t(){return e.call(this,{inSelectionMode:!0,wordNavigationType:0,id:"cursorWordLeftSelect",precondition:null})||this}return f(t,e),t=v([o.editorCommand],t)}(p);t.CursorWordLeftSelect=w;var S=function(e){function t(){return e.call(this,{inSelectionMode:!1,wordNavigationType:0,id:"cursorWordStartRight",precondition:null})||this}return f(t,e),t=v([o.editorCommand],t)}(g);t.CursorWordStartRight=S;var E=function(e){function t(){return e.call(this,{inSelectionMode:!1,wordNavigationType:1,id:"cursorWordEndRight",precondition:null,kbOpts:{kbExpr:n.EditorContextKeys.textFocus,primary:2065,mac:{primary:529}}})||this}return f(t,e),t=v([o.editorCommand],t)}(g);t.CursorWordEndRight=E;var L=function(e){function t(){return e.call(this,{inSelectionMode:!1,wordNavigationType:1,id:"cursorWordRight",precondition:null})||this}return f(t,e),t=v([o.editorCommand],t)}(g);t.CursorWordRight=L;var x=function(e){function t(){return e.call(this,{inSelectionMode:!0,wordNavigationType:0,id:"cursorWordStartRightSelect",precondition:null})||this}return f(t,e),t=v([o.editorCommand],t)}(g);t.CursorWordStartRightSelect=x;var N=function(e){function t(){return e.call(this,{inSelectionMode:!0,wordNavigationType:1,id:"cursorWordEndRightSelect",precondition:null,kbOpts:{kbExpr:n.EditorContextKeys.textFocus,primary:3089,mac:{primary:1553}}})||this}return f(t,e),t=v([o.editorCommand],t)}(g);t.CursorWordEndRightSelect=N;var M=function(e){function t(){return e.call(this,{inSelectionMode:!0,wordNavigationType:1,id:"cursorWordRightSelect",precondition:null})||this}return f(t,e),t=v([o.editorCommand],t)}(g);t.CursorWordRightSelect=M;var T=function(e){function t(t){var n=e.call(this,t)||this;return n._whitespaceHeuristics=t.whitespaceHeuristics,n._wordNavigationType=t.wordNavigationType,n}return f(t,e),t.prototype.runEditorCommand=function(e,t,n){var i=this,o=t.getConfiguration(),r=l.getMapForWordSeparators(o.wordSeparators),s=t.getModel(),a=t.getSelections().map(function(e){var t=i._delete(r,s,e,i._whitespaceHeuristics,i._wordNavigationType);return new u.ReplaceCommand(t,"")});t.pushUndoStop(),t.executeCommands(this.id,a),t.pushUndoStop()},t}(o.EditorCommand);t.DeleteWordCommand=T;var k=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return f(t,e),t.prototype._delete=function(e,t,n,i,o){var r=a.WordOperations.deleteWordLeft(e,t,n,i,o);return r||new s.Range(1,1,1,1)},t}(T);t.DeleteWordLeftCommand=k;var I=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return f(t,e),t.prototype._delete=function(e,t,n,i,o){var r=a.WordOperations.deleteWordRight(e,t,n,i,o);if(r)return r;var u=t.getLineCount(),l=t.getLineMaxColumn(u);return new s.Range(u,l,u,l)},t}(T);t.DeleteWordRightCommand=I;var D=function(e){function t(){return e.call(this,{whitespaceHeuristics:!1,wordNavigationType:0,id:"deleteWordStartLeft",precondition:n.EditorContextKeys.writable})||this}return f(t,e),t=v([o.editorCommand],t)}(k);t.DeleteWordStartLeft=D;var O=function(e){function t(){return e.call(this,{whitespaceHeuristics:!1,wordNavigationType:1,id:"deleteWordEndLeft",precondition:n.EditorContextKeys.writable})||this}return f(t,e),t=v([o.editorCommand],t)}(k);t.DeleteWordEndLeft=O;var R=function(e){function t(){return e.call(this,{whitespaceHeuristics:!0,wordNavigationType:0,id:"deleteWordLeft",precondition:n.EditorContextKeys.writable,kbOpts:{kbExpr:n.EditorContextKeys.textFocus,primary:2049,mac:{primary:513}}})||this}return f(t,e),t=v([o.editorCommand],t)}(k);t.DeleteWordLeft=R;var P=function(e){function t(){return e.call(this,{whitespaceHeuristics:!1,wordNavigationType:0,id:"deleteWordStartRight",precondition:n.EditorContextKeys.writable})||this}return f(t,e),t=v([o.editorCommand],t)}(I);t.DeleteWordStartRight=P;var A=function(e){function t(){return e.call(this,{whitespaceHeuristics:!1,wordNavigationType:1,id:"deleteWordEndRight",precondition:n.EditorContextKeys.writable})||this}return f(t,e),t=v([o.editorCommand],t)}(I);t.DeleteWordEndRight=A;var F=function(e){function t(){return e.call(this,{whitespaceHeuristics:!0,wordNavigationType:1,id:"deleteWordRight",precondition:n.EditorContextKeys.writable,kbOpts:{kbExpr:n.EditorContextKeys.textFocus,primary:2068,mac:{primary:532}}})||this}return f(t,e),t=v([o.editorCommand],t)}(I);t.DeleteWordRight=F}),define(d[477],h([1,0,381,13,77]),function(e,t,n,i,o){"use strict";Object.defineProperty(t,"__esModule",{value:!0});!function(e){function t(){var t=e.call(this,{id:"editor.action.toggleHighContrast",label:n.localize(0,null),alias:"Toggle High Contrast Theme",precondition:null})||this;return t._originalThemeName=null,t}f(t,e),t.prototype.run=function(e,t){var n=e.get(o.IStandaloneThemeService);this._originalThemeName?(n.setTheme(this._originalThemeName),this._originalThemeName=null):(this._originalThemeName=n.getTheme().themeName,n.setTheme("hc-black"))},t=v([i.editorAction],t)}(i.EditorAction)}),define(d[478],h([1,0,160,58,50]),function(e,t,n,i,o){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e,t,i){this.contextView=new n.ContextView(e)}return e.prototype.dispose=function(){this.contextView.dispose()},e.prototype.setContainer=function(e){this.contextView.setContainer(e)},e.prototype.showContextView=function(e){this.contextView.show(e)},e.prototype.layout=function(){this.contextView.layout()},e.prototype.hideContextView=function(e){this.contextView.hide(e)},e=v([y(1,i.ITelemetryService),y(2,o.IMessageService)],e)}();t.ContextViewService=r}),define(d[479],h([1,0,7,166,45,62,46,420]),function(e,t,n,i,o,r,s,a){"use strict";function u(e){if(!e)return e;for(var t="",n=0;n="0"&&i<="9"?t+="0":t+=i>="a"&&i<="z"?"a":i>="A"&&i<="Z"?"A":i}return t}function l(e){if(!e)return[];var t=[];return c(t,"",e),t}function c(e,t,n){n&&"object"==typeof n&&!Array.isArray(n)?Object.keys(n).forEach(function(i){return c(e,t?t+"."+i:i,n[i])}):e.push(t)}function d(e,t){return e?t.reduce(function(t,n){var i=n.split(".").reduce(function(e,t){return e&&"object"==typeof e?e[t]:void 0},e);return void 0!==i&&t.push((o={},o[n]=i,o)),t;var o},[]):[]}Object.defineProperty(t,"__esModule",{value:!0}),t.NullTelemetryService={_serviceBrand:void 0,publicLog:function(e,t){return n.TPromise.as(null)},isOptedIn:!0,getTelemetryInfo:function(){return n.TPromise.as({instanceId:"someValue.instanceId",sessionId:"someValue.sessionId",machineId:"someValue.machineId"})}},t.combinedAppender=function(){for(var e=[],t=0;t0&&(o.insertRule(this._unThemedSelector+" {"+e+"}",0),r=!0),t.length>0&&(o.insertRule(".vs"+this._unThemedSelector+" {"+t+"}",0),r=!0),n.length>0&&(o.insertRule(".vs-dark"+this._unThemedSelector+", .hc-black"+this._unThemedSelector+" {"+n+"}",0),r=!0),this._hasContent=r},e.prototype._removeCSS=function(){o.removeCSSRulesContainingSelector(this._unThemedSelector,this._providerArgs.styleSheet)},e.prototype.getCSSTextForModelDecorationClassName=function(e){if(!e)return"";var t=[];return this.collectCSSText(e,["backgroundColor"],t),this.collectCSSText(e,["outline","outlineColor","outlineStyle","outlineWidth"],t),this.collectBorderSettingsCSSText(e,t),t.join("")},e.prototype.getCSSTextForModelDecorationInlineClassName=function(e){if(!e)return"";var t=[];return this.collectCSSText(e,["textDecoration","cursor","color","letterSpacing"],t),t.join("")},e.prototype.getCSSTextForModelDecorationContentClassName=function(e){if(!e)return"";var t=[];if(void 0!==e){if(this.collectBorderSettingsCSSText(e,t),"string"==typeof e.contentIconPath?t.push(n.format(p.contentIconPath,i.default.file(e.contentIconPath).toString().replace(/'/g,"%27"))):e.contentIconPath instanceof i.default&&t.push(n.format(p.contentIconPath,e.contentIconPath.toString(!0).replace(/'/g,"%27"))),"string"==typeof e.contentText){var o=e.contentText.match(/^.*$/m)[0].replace(/['\\]/g,"\\$&");t.push(n.format(p.contentText,o))}this.collectCSSText(e,["textDecoration","color","backgroundColor","margin"],t),this.collectCSSText(e,["width","height"],t)&&t.push("display:inline-block;")}return t.join("")},e.prototype.getCSSTextForModelDecorationGlyphMarginClassName=function(e){if(!e)return"";var t=[];return void 0!==e.gutterIconPath&&("string"==typeof e.gutterIconPath?t.push(n.format(p.gutterIconPath,i.default.file(e.gutterIconPath).toString())):t.push(n.format(p.gutterIconPath,e.gutterIconPath.toString(!0).replace(/'/g,"%27"))),void 0!==e.gutterIconSize&&t.push(n.format(p.gutterIconSize,e.gutterIconSize))),t.join("")},e.prototype.collectBorderSettingsCSSText=function(e,t){return!!this.collectCSSText(e,["border","borderColor","borderRadius","borderSpacing","borderStyle","borderWidth"],t)&&(t.push(n.format("box-sizing: border-box;")),!0)},e.prototype.collectCSSText=function(e,t,i){for(var o=i.length,r=0,s=t;rt)){var v=m.startLineNumber===t?m.startColumn:r.minColumn,_=m.endLineNumber===t?m.endColumn:r.maxColumn;v<_&&l.push(new s.LineDecoration(v,_,"inline-selected-text",!1))}}var C=new a.RenderLineInput(u.useMonospaceOptimizations,r.content,r.mightContainRTL,r.minColumn-1,r.tokens,l,r.tabSize,u.spaceWidth,u.stopRenderingLineAfter,u.renderWhitespace,u.renderControlCharacters,u.fontLigatures);if(this._renderedViewLine&&this._renderedViewLine.input.equals(C))return null;var b=a.renderViewLine(C),S=null;if(p&&u.useMonospaceOptimizations&&!b.containsForeignElements){var E=!0;r.mightContainNonBasicASCII&&(E=o.isBasicASCII(r.content)),E&&r.content.length<1e3&&(S=new y(this._renderedViewLine?this._renderedViewLine.domNode:null,C,b.characterMapping))}return S||(S=w(this._renderedViewLine?this._renderedViewLine.domNode:null,C,b.characterMapping,b.containsRTL,b.containsForeignElements)),this._renderedViewLine=S,'
    '+b.html+"
    "},e.prototype.layoutLine=function(e,t){this._renderedViewLine&&this._renderedViewLine.domNode&&(this._renderedViewLine.domNode.setTop(t),this._renderedViewLine.domNode.setHeight(this._options.lineHeight))},e.prototype.getWidth=function(){return this._renderedViewLine?this._renderedViewLine.getWidth():0},e.prototype.getVisibleRangesForRange=function(e,t,n){return e=Math.min(this._renderedViewLine.input.lineContent.length+1,Math.max(1,e)),t=Math.min(this._renderedViewLine.input.lineContent.length+1,Math.max(1,t)),this._renderedViewLine.getVisibleRangesForRange(e,t,n)},e.prototype.getColumnOfNodeOffset=function(e,t,n){return this._renderedViewLine.getColumnOfNodeOffset(e,t,n)},e.CLASS_NAME="view-line",e}();t.ViewLine=_;var y=function(){function e(e,t,n){this.domNode=e,this.input=t,this._characterMapping=n,this._charWidth=t.spaceWidth,this._charOffset=null}return e._createCharOffset=function(e){for(var t=e.getPartLengths(),n=e.length,i=new Uint32Array(n),o=0,r=0,s=0;si&&t>i)return null;-1!==i&&e>i&&(e=i),-1!==i&&t>i&&(t=i);var o=this._getCharPosition(e),r=this._getCharPosition(t);return[new l.HorizontalRange(o,r-o)]},e.prototype._getCharPosition=function(e){var t=this._getOrCreateCharOffset();return 0===t.length?0:Math.round(this._charWidth*t[e-1])},e.prototype.getColumnOfNodeOffset=function(e,t,n){for(var i=t.textContent.length,o=-1;t;)t=t.previousSibling,o++;return this._characterMapping.partDataToCharOffset(o,i,n)+1},e}(),C=function(){function e(e,t,n,i,o){if(this.domNode=e,this.input=t,this._characterMapping=n,this._isWhitespaceOnly=/^\s*$/.test(t.lineContent),this._containsForeignElements=o,this._cachedWidth=-1,this._pixelOffsetCache=null,!i||0===this._characterMapping.length){this._pixelOffsetCache=new Int32Array(this._characterMapping.length+1);for(var r=0,s=this._characterMapping.length;r<=s;r++)this._pixelOffsetCache[r]=-1}}return e.prototype._getReadingTarget=function(){return this.domNode.domNode.firstChild},e.prototype.getWidth=function(){return-1===this._cachedWidth&&(this._cachedWidth=this._getReadingTarget().offsetWidth),this._cachedWidth},e.prototype.getVisibleRangesForRange=function(e,t,n){e|=0,t|=0;var i=0|this.input.stopRenderingLineAfter;if(-1!==i&&e>i&&t>i)return null;if(-1!==i&&e>i&&(e=i),-1!==i&&t>i&&(t=i),null!==this._pixelOffsetCache){var o=this._readPixelOffset(e,n);if(-1===o)return null;var r=this._readPixelOffset(t,n);return-1===r?null:[new l.HorizontalRange(o,r-o)]}return this._readVisibleRangesForRange(e,t,n)},e.prototype._readVisibleRangesForRange=function(e,t,n){if(e===t){var i=this._readPixelOffset(e,n);return-1===i?null:[new l.HorizontalRange(i,0)]}return this._readRawVisibleRangesForRange(e,t,n)},e.prototype._readPixelOffset=function(e,t){if(0===this._characterMapping.length&&!this._containsForeignElements)return 0;if(null!==this._pixelOffsetCache){var n=this._pixelOffsetCache[e];if(-1!==n)return n;var i=this._actualReadPixelOffset(e,t);return this._pixelOffsetCache[e]=i,i}return this._actualReadPixelOffset(e,t)},e.prototype._actualReadPixelOffset=function(e,t){if(0===this._characterMapping.length){var n=u.RangeUtil.readHorizontalRanges(this._getReadingTarget(),0,0,0,0,t.clientRectDeltaLeft,t.endNode);return n&&0!==n.length?n[0].left:-1}if(e===this._characterMapping.length&&this._isWhitespaceOnly&&!this._containsForeignElements)return this.getWidth();var i=this._characterMapping.charOffsetToPartData(e-1),o=a.CharacterMapping.getPartIndex(i),r=a.CharacterMapping.getCharIndex(i),s=u.RangeUtil.readHorizontalRanges(this._getReadingTarget(),o,r,o,r,t.clientRectDeltaLeft,t.endNode);return s&&0!==s.length?s[0].left:-1},e.prototype._readRawVisibleRangesForRange=function(e,t,n){if(1===e&&t===this._characterMapping.length)return[new l.HorizontalRange(0,this.getWidth())];var i=this._characterMapping.charOffsetToPartData(e-1),o=a.CharacterMapping.getPartIndex(i),r=a.CharacterMapping.getCharIndex(i),s=this._characterMapping.charOffsetToPartData(t-1),c=a.CharacterMapping.getPartIndex(s),d=a.CharacterMapping.getCharIndex(s);return u.RangeUtil.readHorizontalRanges(this._getReadingTarget(),o,r,c,d,n.clientRectDeltaLeft,n.endNode)},e.prototype.getColumnOfNodeOffset=function(e,t,n){for(var i=t.textContent.length,o=-1;t;)t=t.previousSibling,o++;return this._characterMapping.partDataToCharOffset(o,i,n)+1},e}(),b=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return f(t,e),t.prototype._readVisibleRangesForRange=function(t,n,i){var o=e.prototype._readVisibleRangesForRange.call(this,t,n,i);if(!o||0===o.length||t===n||1===t&&n===this._characterMapping.length)return o;var r=this._readPixelOffset(n-1,i),s=this._readPixelOffset(n,i);if(-1!==r&&-1!==s){var a=r<=s,u=o[o.length-1];a&&u.left=4&&3===e[0]&&7===e[3]},e.isChildOfScrollableElement=function(e){return e.length>=2&&3===e[0]&&5===e[1]},e.isChildOfMinimap=function(e){return e.length>=2&&3===e[0]&&8===e[1]},e.isChildOfContentWidgets=function(e){return e.length>=4&&3===e[0]&&1===e[3]},e.isChildOfOverflowingContentWidgets=function(e){return e.length>=1&&2===e[0]},e.isChildOfOverlayWidgets=function(e){return e.length>=2&&3===e[0]&&4===e[1]},e}(),d=function(){function e(e,t,n){this.model=e.model,this.layoutInfo=e.configuration.editor.layoutInfo,this.viewDomNode=t.viewDomNode,this.lineHeight=e.configuration.editor.lineHeight,this.typicalHalfwidthCharacterWidth=e.configuration.editor.fontInfo.typicalHalfwidthCharacterWidth,this.lastViewCursorsRenderData=n,this._context=e,this._viewHelper=t}return e.prototype.getZoneAtCoord=function(e){var t=this._context.viewLayout.getWhitespaceAtVerticalOffset(e);if(t){var i=t.verticalOffset+t.height/2,o=this._context.model.getLineCount(),r=null,s=void 0,a=null;return t.afterLineNumber!==o&&(a=new n.Position(t.afterLineNumber+1,1)),t.afterLineNumber>0&&(r=new n.Position(t.afterLineNumber,this._context.model.getLineMaxColumn(t.afterLineNumber))),s=null===a?r:null===r?a:er.contentLeft+r.width)){var l=e.getVerticalOffsetForLineNumber(r.position.lineNumber);if(l<=u&&u<=l+r.height)return t.fulfill(o.MouseTargetType.CONTENT_TEXT,r.position)}return null},e._hitTestViewZone=function(e,t){var n=e.getZoneAtCoord(t.mouseVerticalOffset);if(n){var i=t.isInContentArea?o.MouseTargetType.CONTENT_VIEW_ZONE:o.MouseTargetType.GUTTER_VIEW_ZONE;return t.fulfill(i,n.position,null,n)}return null},e._hitTestTextArea=function(e,t){return c.isTextArea(t.targetPath)?t.fulfill(o.MouseTargetType.TEXTAREA):null},e._hitTestMargin=function(e,t){if(t.isInMarginArea){var n=e.getFullLineRangeAtCoord(t.mouseVerticalOffset),i=n.range.getStartPosition(),r=Math.abs(t.pos.x-t.editorPos.x);return r<=e.layoutInfo.glyphMarginWidth?t.fulfill(o.MouseTargetType.GUTTER_GLYPH_MARGIN,i,n.range,n.isAfterLines):(r-=e.layoutInfo.glyphMarginWidth)<=e.layoutInfo.lineNumbersWidth?t.fulfill(o.MouseTargetType.GUTTER_LINE_NUMBERS,i,n.range,n.isAfterLines):(r-=e.layoutInfo.lineNumbersWidth,t.fulfill(o.MouseTargetType.GUTTER_LINE_DECORATIONS,i,n.range,n.isAfterLines))}return null},e._hitTestViewLines=function(t,i,r){if(!c.isChildOfViewLines(i.targetPath))return null;if(t.isAfterLines(i.mouseVerticalOffset)){var s=t.model.getLineCount(),a=t.model.getLineMaxColumn(s);return i.fulfill(o.MouseTargetType.CONTENT_EMPTY,new n.Position(s,a))}if(r)return i.fulfill(o.MouseTargetType.UNKNOWN);var u=e._doHitTest(t,i);return u.position?e.createMouseTargetFromHitTestPosition(t,i,u.position.lineNumber,u.position.column):this._createMouseTarget(t,i.withTarget(u.hitTarget),!0)},e._hitTestMinimap=function(e,t){if(c.isChildOfMinimap(t.targetPath)){var i=e.getLineNumberAtVerticalOffset(t.mouseVerticalOffset),r=e.model.getLineMaxColumn(i);return t.fulfill(o.MouseTargetType.SCROLLBAR,new n.Position(i,r))}return null},e._hitTestScrollbarSlider=function(e,t){if(c.isChildOfScrollableElement(t.targetPath)&&t.target&&1===t.target.nodeType){var i=t.target.className;if(i&&/\b(slider|scrollbar)\b/.test(i)){var r=e.getLineNumberAtVerticalOffset(t.mouseVerticalOffset),s=e.model.getLineMaxColumn(r);return t.fulfill(o.MouseTargetType.SCROLLBAR,new n.Position(r,s))}}return null},e._hitTestScrollbar=function(e,t){if(c.isChildOfScrollableElement(t.targetPath)){var i=e.getLineNumberAtVerticalOffset(t.mouseVerticalOffset),r=e.model.getLineMaxColumn(i);return t.fulfill(o.MouseTargetType.SCROLLBAR,new n.Position(i,r))}return null},e.prototype.getMouseColumn=function(t,n){var i=this._context.configuration.editor.layoutInfo,o=this._context.viewLayout.getScrollLeft()+n.x-t.x-i.contentLeft;return e._getMouseColumn(o,this._context.configuration.editor.fontInfo.typicalHalfwidthCharacterWidth)},e._getMouseColumn=function(e,t){return e<0?1:Math.round(e/t)+1},e.createMouseTargetFromHitTestPosition=function(e,t,r,a){var u=new n.Position(r,a),l=e.getLineWidth(r);if(t.mouseContentHorizontalOffset>l)return s.isEdge&&1===u.column?t.fulfill(o.MouseTargetType.CONTENT_EMPTY,new n.Position(r,e.model.getLineMaxColumn(r))):t.fulfill(o.MouseTargetType.CONTENT_EMPTY,u);var c=e.visibleRangeForPosition2(r,a);if(!c)return t.fulfill(o.MouseTargetType.UNKNOWN,u);var d=c.left;if(t.mouseContentHorizontalOffset===d)return t.fulfill(o.MouseTargetType.CONTENT_TEXT,u);var h;if(a>1){var p=c.left;if(h=!1,h=h||p=t.editorPos.y+e.layoutInfo.height&&(o=t.editorPos.y+e.layoutInfo.height-1);var s=new r.PageCoordinates(t.pos.x,o),a=this._actualDoHitTestWithCaretRangeFromPoint(e,s.toClientCoordinates());return a.position?a:this._actualDoHitTestWithCaretRangeFromPoint(e,t.pos.toClientCoordinates())},e._actualDoHitTestWithCaretRangeFromPoint=function(e,t){var n=document.caretRangeFromPoint(t.clientX,t.clientY);if(!n||!n.startContainer)return{position:null,hitTarget:null};var i,o=n.startContainer;if(o.nodeType===o.TEXT_NODE){var r=(a=(s=o.parentNode)?s.parentNode:null)?a.parentNode:null;if((r&&r.nodeType===r.ELEMENT_NODE?r.className:null)===u.ViewLine.CLASS_NAME)return{position:l=e.getPositionFromDOMInfo(s,n.startOffset),hitTarget:null};i=o.parentNode}else if(o.nodeType===o.ELEMENT_NODE){var s=o.parentNode,a=s?s.parentNode:null;if((a&&a.nodeType===a.ELEMENT_NODE?a.className:null)===u.ViewLine.CLASS_NAME){var l=e.getPositionFromDOMInfo(o,o.textContent.length);return{position:l,hitTarget:null}}i=o}return{position:null,hitTarget:i}},e._doHitTestWithCaretPositionFromPoint=function(e,t){var n=document.caretPositionFromPoint(t.clientX,t.clientY);if(n.offsetNode.nodeType===n.offsetNode.TEXT_NODE){var i=n.offsetNode.parentNode,o=i?i.parentNode:null,r=o?o.parentNode:null;return(r&&r.nodeType===r.ELEMENT_NODE?r.className:null)===u.ViewLine.CLASS_NAME?{position:e.getPositionFromDOMInfo(n.offsetNode.parentNode,n.offset),hitTarget:null}:{position:null,hitTarget:n.offsetNode.parentNode}}return{position:null,hitTarget:n.offsetNode}},e._doHitTestWithMoveToPoint=function(e,t){var n=null,i=null,o=document.body.createTextRange();try{o.moveToPoint(t.clientX,t.clientY)}catch(e){return{position:null,hitTarget:null}}o.collapse(!0);var r=o?o.parentElement():null,s=r?r.parentNode:null,a=s?s.parentNode:null;if((a&&a.nodeType===a.ELEMENT_NODE?a.className:"")===u.ViewLine.CLASS_NAME){var l=o.duplicate();l.moveToElementText(r),l.setEndPoint("EndToStart",o),n=e.getPositionFromDOMInfo(r,l.text.length),l.moveToElementText(e.viewDomNode)}else i=r;return o.moveToElementText(e.viewDomNode),{position:n,hitTarget:i}},e._doHitTest=function(e,t){return document.caretRangeFromPoint?this._doHitTestWithCaretRangeFromPoint(e,t):document.caretPositionFromPoint?this._doHitTestWithCaretPositionFromPoint(e,t.pos.toClientCoordinates()):document.body.createTextRange?this._doHitTestWithMoveToPoint(e,t.pos.toClientCoordinates()):{position:null,hitTarget:null}},e}();t.MouseTargetFactory=p}),define(d[489],h([1,0,3,15,28,4,12,22,82,186,25,18,114,47,135]),function(e,t,n,i,o,r,s,a,u,l,c,d,h,p,g){"use strict";function m(e){return function(t,n){var i=!1;return e&&(i=e.mouseTargetIsWidget(n)),i||n.preventDefault(),n}}Object.defineProperty(t,"__esModule",{value:!0});var v=function(e){function t(n,i,o){var s=e.call(this)||this;s._isFocused=!1,s._context=n,s.viewController=i,s.viewHelper=o,s.mouseTargetFactory=new l.MouseTargetFactory(s._context,o),s._mouseDownOperation=s._register(new _(s._context,s.viewController,s.viewHelper,function(e,t){return s._createMouseTarget(e,t)},function(e){return s._getMouseColumn(e)})),s._asyncFocus=s._register(new d.RunOnceScheduler(function(){return s.viewHelper.focusTextArea()},0)),s.lastMouseLeaveTime=-1;var a=new h.EditorMouseEventFactory(s.viewHelper.viewDomNode);s._register(a.onContextMenu(s.viewHelper.viewDomNode,function(e){return s._onContextMenu(e,!0)})),s._register(a.onMouseMoveThrottled(s.viewHelper.viewDomNode,function(e){return s._onMouseMove(e)},m(s.mouseTargetFactory),t.MOUSE_MOVE_MINIMUM_TIME)),s._register(a.onMouseUp(s.viewHelper.viewDomNode,function(e){return s._onMouseUp(e)})),s._register(a.onMouseLeave(s.viewHelper.viewDomNode,function(e){return s._onMouseLeave(e)})),s._register(a.onMouseDown(s.viewHelper.viewDomNode,function(e){return s._onMouseDown(e)}));var u=function(e){if(s._context.configuration.editor.viewInfo.mouseWheelZoom){var t=new p.StandardMouseWheelEvent(e);if(t.browserEvent.ctrlKey||t.browserEvent.metaKey){var n=g.EditorZoom.getZoomLevel(),i=t.deltaY>0?1:-1;g.EditorZoom.setZoomLevel(n+i),t.preventDefault(),t.stopPropagation()}}};return s._register(r.addDisposableListener(s.viewHelper.viewDomNode,"mousewheel",u,!0)),s._register(r.addDisposableListener(s.viewHelper.viewDomNode,"DOMMouseScroll",u,!0)),s._context.addEventHandler(s),s}return f(t,e),t.prototype.dispose=function(){this._context.removeEventHandler(this),e.prototype.dispose.call(this)},t.prototype.onCursorStateChanged=function(e){return this._mouseDownOperation.onCursorStateChanged(e),!1},t.prototype.onFocusChanged=function(e){return this._isFocused=e.isFocused,!1},t.prototype.onScrollChanged=function(e){return this._mouseDownOperation.onScrollChanged(),!1},t.prototype.getTargetAtClientPoint=function(e,t){var n=new h.ClientCoordinates(e,t).toPageCoordinates(),i=h.createEditorPagePosition(this.viewHelper.viewDomNode);if(n.yi.y+i.height||n.xi.x+i.width)return null;var o=this.viewHelper.getLastViewCursorsRenderData();return this.mouseTargetFactory.createMouseTarget(o,i,n,null)},t.prototype._createMouseTarget=function(e,t){var n=this.viewHelper.getLastViewCursorsRenderData();return this.mouseTargetFactory.createMouseTarget(n,e.editorPos,e.pos,t?e.target:null)},t.prototype._getMouseColumn=function(e){return this.mouseTargetFactory.getMouseColumn(e.editorPos,e.pos)},t.prototype._onContextMenu=function(e,t){this.viewController.emitContextMenu({event:e,target:this._createMouseTarget(e,t)})},t.prototype._onMouseMove=function(e){this._mouseDownOperation.isActive()||e.timestampt.y+t.height){var a=i.getLineNumberAtVerticalOffset(i.getScrollTop()+(e.posy-t.y));return new l.MouseTarget(null,c.MouseTargetType.OUTSIDE_EDITOR,o,new s.Position(a,n.getLineMaxColumn(a)))}var u=i.getLineNumberAtVerticalOffset(i.getScrollTop()+(e.posy-t.y));return e.posxt.x+t.width?new l.MouseTarget(null,c.MouseTargetType.OUTSIDE_EDITOR,o,new s.Position(u,n.getLineMaxColumn(u))):null},t.prototype._findMousePosition=function(e,t){var n=this._getPositionOutsideEditor(e);if(n)return n;var i=this._createMouseTarget(e,t);if(!i.position)return null;if(i.type===c.MouseTargetType.CONTENT_VIEW_ZONE||i.type===c.MouseTargetType.GUTTER_VIEW_ZONE){var o=new s.Position(this._currentSelection.selectionStartLineNumber,this._currentSelection.selectionStartColumn),r=i.detail,a=r.positionBefore,u=r.positionAfter;if(a&&u)return a.isBefore(o)?new l.MouseTarget(i.element,i.type,i.mouseColumn,a,null,i.detail):new l.MouseTarget(i.element,i.type,i.mouseColumn,u,null,i.detail)}return i},t.prototype._dispatchMouse=function(e,t){this._viewController.dispatchMouse({position:e.position,mouseColumn:e.mouseColumn,startedOnLineNumbers:this._mouseState.startedOnLineNumbers,inSelectionMode:t,mouseDownCount:this._mouseState.count,altKey:this._mouseState.altKey,ctrlKey:this._mouseState.ctrlKey,metaKey:this._mouseState.metaKey,shiftKey:this._mouseState.shiftKey})},t}(n.Disposable),y=function(){function e(){this._altKey=!1,this._ctrlKey=!1,this._metaKey=!1,this._shiftKey=!1,this._startedOnLineNumbers=!1,this._lastMouseDownPosition=null,this._lastMouseDownPositionEqualCount=0,this._lastMouseDownCount=0,this._lastSetMouseDownCountTime=0,this.isDragAndDrop=!1}return Object.defineProperty(e.prototype,"altKey",{get:function(){return this._altKey},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"ctrlKey",{get:function(){return this._ctrlKey},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"metaKey",{get:function(){return this._metaKey},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"shiftKey",{get:function(){return this._shiftKey},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"startedOnLineNumbers",{get:function(){return this._startedOnLineNumbers},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"count",{get:function(){return this._lastMouseDownCount},enumerable:!0,configurable:!0}),e.prototype.setModifiers=function(e){this._altKey=e.altKey,this._ctrlKey=e.ctrlKey,this._metaKey=e.metaKey,this._shiftKey=e.shiftKey},e.prototype.setStartedOnLineNumbers=function(e){this._startedOnLineNumbers=e},e.prototype.trySetCount=function(t,n){var i=(new Date).getTime();i-this._lastSetMouseDownCountTime>e.CLEAR_MOUSE_DOWN_COUNT_TIME&&(t=1),this._lastSetMouseDownCountTime=i,t>this._lastMouseDownCount+1&&(t=this._lastMouseDownCount+1),this._lastMouseDownPosition&&this._lastMouseDownPosition.equals(n)?this._lastMouseDownPositionEqualCount++:this._lastMouseDownPositionEqualCount=1,this._lastMouseDownPosition=n,this._lastMouseDownCount=Math.min(t,this._lastMouseDownPositionEqualCount)},e.CLEAR_MOUSE_DOWN_COUNT_TIME=400,e}()}),define(d[490],h([1,0,4,74,489,114]),function(e,t,n,i,o,r){"use strict";function s(e,t){var n={translationY:t.translationY,translationX:t.translationX};return e&&(n.translationY+=e.translationY,n.translationX+=e.translationX),n}Object.defineProperty(t,"__esModule",{value:!0});var a=function(e){function t(t,i,o){var r=e.call(this,t,i,o)||this;return r.viewHelper.linesContentDomNode.style.msTouchAction="none",r.viewHelper.linesContentDomNode.style.msContentZooming="none",r._installGestureHandlerTimeout=window.setTimeout(function(){if(r._installGestureHandlerTimeout=-1,window.MSGesture){var e=new MSGesture,t=new MSGesture;e.target=r.viewHelper.linesContentDomNode,t.target=r.viewHelper.linesContentDomNode,r.viewHelper.linesContentDomNode.addEventListener("MSPointerDown",function(n){var i=n.pointerType;i!==(n.MSPOINTER_TYPE_MOUSE||"mouse")?i===(n.MSPOINTER_TYPE_TOUCH||"touch")?(r._lastPointerType="touch",e.addPointer(n.pointerId)):(r._lastPointerType="pen",t.addPointer(n.pointerId)):r._lastPointerType="mouse"}),r._register(n.addDisposableThrottledListener(r.viewHelper.linesContentDomNode,"MSGestureChange",function(e){return r._onGestureChange(e)},s)),r._register(n.addDisposableListener(r.viewHelper.linesContentDomNode,"MSGestureTap",function(e){return r._onCaptureGestureTap(e)},!0))}},100),r._lastPointerType="mouse",r}return f(t,e),t.prototype._onMouseDown=function(t){"mouse"===this._lastPointerType&&e.prototype._onMouseDown.call(this,t)},t.prototype._onCaptureGestureTap=function(e){var t=this,n=new r.EditorMouseEvent(e,this.viewHelper.viewDomNode),i=this._createMouseTarget(n,!1);i.position&&this.viewController.moveTo(i.position),n.browserEvent.fromElement?(n.preventDefault(),this.viewHelper.focusTextArea()):setTimeout(function(){t.viewHelper.focusTextArea()})},t.prototype._onGestureChange=function(e){var t=this._context.viewLayout;t.setScrollPosition({scrollLeft:t.getScrollLeft()-e.translationX,scrollTop:t.getScrollTop()-e.translationY})},t.prototype.dispose=function(){window.clearTimeout(this._installGestureHandlerTimeout),e.prototype.dispose.call(this)},t}(o.MouseHandler),u=function(e){function t(t,i,o){var r=e.call(this,t,i,o)||this;return r.viewHelper.linesContentDomNode.style.touchAction="none",r._installGestureHandlerTimeout=window.setTimeout(function(){if(r._installGestureHandlerTimeout=-1,window.MSGesture){var e=new MSGesture,t=new MSGesture;e.target=r.viewHelper.linesContentDomNode,t.target=r.viewHelper.linesContentDomNode,r.viewHelper.linesContentDomNode.addEventListener("pointerdown",function(n){var i=n.pointerType;"mouse"!==i?"touch"===i?(r._lastPointerType="touch",e.addPointer(n.pointerId)):(r._lastPointerType="pen",t.addPointer(n.pointerId)):r._lastPointerType="mouse"}),r._register(n.addDisposableThrottledListener(r.viewHelper.linesContentDomNode,"MSGestureChange",function(e){return r._onGestureChange(e)},s)),r._register(n.addDisposableListener(r.viewHelper.linesContentDomNode,"MSGestureTap",function(e){return r._onCaptureGestureTap(e)},!0))}},100),r._lastPointerType="mouse",r}return f(t,e),t.prototype._onMouseDown=function(t){"mouse"===this._lastPointerType&&e.prototype._onMouseDown.call(this,t)},t.prototype._onCaptureGestureTap=function(e){var t=this,n=new r.EditorMouseEvent(e,this.viewHelper.viewDomNode),i=this._createMouseTarget(n,!1);i.position&&this.viewController.moveTo(i.position),n.browserEvent.fromElement?(n.preventDefault(),this.viewHelper.focusTextArea()):setTimeout(function(){t.viewHelper.focusTextArea()})},t.prototype._onGestureChange=function(e){var t=this._context.viewLayout;t.setScrollPosition({scrollLeft:t.getScrollLeft()-e.translationX,scrollTop:t.getScrollTop()-e.translationY})},t.prototype.dispose=function(){window.clearTimeout(this._installGestureHandlerTimeout),e.prototype.dispose.call(this)},t}(o.MouseHandler),l=function(e){function t(t,o,s){var a=e.call(this,t,o,s)||this;return a.gesture=new i.Gesture(a.viewHelper.linesContentDomNode),a._register(n.addDisposableListener(a.viewHelper.linesContentDomNode,i.EventType.Tap,function(e){return a.onTap(e)})),a._register(n.addDisposableListener(a.viewHelper.linesContentDomNode,i.EventType.Change,function(e){return a.onChange(e)})),a._register(n.addDisposableListener(a.viewHelper.linesContentDomNode,i.EventType.Contextmenu,function(e){return a._onContextMenu(new r.EditorMouseEvent(e,a.viewHelper.viewDomNode),!1)})),a}return f(t,e),t.prototype.dispose=function(){this.gesture.dispose(),e.prototype.dispose.call(this)},t.prototype.onTap=function(e){e.preventDefault(),this.viewHelper.focusTextArea();var t=this._createMouseTarget(new r.EditorMouseEvent(e,this.viewHelper.viewDomNode),!1);t.position&&this.viewController.moveTo(t.position)},t.prototype.onChange=function(e){var t=this._context.viewLayout;t.setScrollPosition({scrollLeft:t.getScrollLeft()-e.translationX,scrollTop:t.getScrollTop()-e.translationY})},t}(o.MouseHandler),c=function(){function e(e,t,n){window.navigator.msPointerEnabled?this.handler=new a(e,t,n):window.TouchEvent?this.handler=new l(e,t,n):window.navigator.pointerEnabled?this.handler=new u(e,t,n):this.handler=new o.MouseHandler(e,t,n)}return e.prototype.getTargetAtClientPoint=function(e,t){return this.handler.getTargetAtClientPoint(e,t)},e.prototype.dispose=function(){this.handler.dispose()},e}();t.PointerHandler=c}),define(d[491],h([1,0,3,186,11]),function(e,t,n,i,o){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(e){function t(t){var n=e.call(this)||this;return n._onDidScroll=n._register(new o.Emitter),n.onDidScroll=n._onDidScroll.event,n._onDidGainFocus=n._register(new o.Emitter),n.onDidGainFocus=n._onDidGainFocus.event,n._onDidLoseFocus=n._register(new o.Emitter),n.onDidLoseFocus=n._onDidLoseFocus.event,n._onKeyDown=n._register(new o.Emitter),n.onKeyDown=n._onKeyDown.event,n._onKeyUp=n._register(new o.Emitter),n.onKeyUp=n._onKeyUp.event,n._onContextMenu=n._register(new o.Emitter),n.onContextMenu=n._onContextMenu.event,n._onMouseMove=n._register(new o.Emitter),n.onMouseMove=n._onMouseMove.event,n._onMouseLeave=n._register(new o.Emitter),n.onMouseLeave=n._onMouseLeave.event,n._onMouseUp=n._register(new o.Emitter),n.onMouseUp=n._onMouseUp.event,n._onMouseDown=n._register(new o.Emitter),n.onMouseDown=n._onMouseDown.event,n._onMouseDrag=n._register(new o.Emitter),n.onMouseDrag=n._onMouseDrag.event,n._onMouseDrop=n._register(new o.Emitter),n.onMouseDrop=n._onMouseDrop.event,n._viewModel=t,n}return f(t,e),t.prototype.emitScrollChanged=function(e){this._onDidScroll.fire(e)},t.prototype.emitViewFocusGained=function(){this._onDidGainFocus.fire()},t.prototype.emitViewFocusLost=function(){this._onDidLoseFocus.fire()},t.prototype.emitKeyDown=function(e){this._onKeyDown.fire(e)},t.prototype.emitKeyUp=function(e){this._onKeyUp.fire(e)},t.prototype.emitContextMenu=function(e){this._onContextMenu.fire(this._convertViewToModelMouseEvent(e))},t.prototype.emitMouseMove=function(e){this._onMouseMove.fire(this._convertViewToModelMouseEvent(e))},t.prototype.emitMouseLeave=function(e){this._onMouseLeave.fire(this._convertViewToModelMouseEvent(e))},t.prototype.emitMouseUp=function(e){this._onMouseUp.fire(this._convertViewToModelMouseEvent(e))},t.prototype.emitMouseDown=function(e){this._onMouseDown.fire(this._convertViewToModelMouseEvent(e))},t.prototype.emitMouseDrag=function(e){this._onMouseDrag.fire(this._convertViewToModelMouseEvent(e))},t.prototype.emitMouseDrop=function(e){this._onMouseDrop.fire(this._convertViewToModelMouseEvent(e))},t.prototype._convertViewToModelMouseEvent=function(e){return e.target?{event:e.event,target:this._convertViewToModelMouseTarget(e.target)}:e},t.prototype._convertViewToModelMouseTarget=function(e){return new s(e.element,e.type,e.mouseColumn,e.position?this._convertViewToModelPosition(e.position):null,e.range?this._convertViewToModelRange(e.range):null,e.detail)},t.prototype._convertViewToModelPosition=function(e){return this._viewModel.coordinatesConverter.convertViewPositionToModelPosition(e)},t.prototype._convertViewToModelRange=function(e){return this._viewModel.coordinatesConverter.convertViewRangeToModelRange(e)},t}(n.Disposable);t.ViewOutgoingEvents=r;var s=function(){function e(e,t,n,i,o,r){this.element=e,this.type=t,this.mouseColumn=n,this.position=i,this.range=o,this.detail=r}return e.prototype.toString=function(){return i.MouseTarget.toString(this)},e}()}),define(d[492],h([1,0,18,2,12,112,185,66,78,35,57,286]),function(e,t,n,i,o,r,s,a,u,l,c){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var d=function(){function e(){this._currentVisibleRange=new i.Range(1,1,1,1)}return e.prototype.getCurrentVisibleRange=function(){return this._currentVisibleRange},e.prototype.setCurrentVisibleRange=function(e){this._currentVisibleRange=e},e}(),h=function(e){function t(t,i){var o=e.call(this,t)||this;o._linesContent=i,o._textRangeRestingSpot=document.createElement("div"),o._visibleLines=new r.VisibleLinesCollection(o),o.domNode=o._visibleLines.domNode;var u=o._context.configuration;return o._lineHeight=u.editor.lineHeight,o._typicalHalfwidthCharacterWidth=u.editor.fontInfo.typicalHalfwidthCharacterWidth,o._isViewportWrapping=u.editor.wrappingInfo.isViewportWrapping,o._revealHorizontalRightPadding=u.editor.viewInfo.revealHorizontalRightPadding,o._canUseLayerHinting=u.editor.canUseLayerHinting,o._viewLineOptions=new s.ViewLineOptions(u,o._context.theme.type),l.PartFingerprints.write(o.domNode,7),o.domNode.setClassName("view-lines"),a.Configuration.applyFontInfo(o.domNode,u.editor.fontInfo),o._maxLineWidth=0,o._asyncUpdateLineWidths=new n.RunOnceScheduler(function(){o._updateLineWidths()},200),o._lastRenderedData=new d,o._lastCursorRevealRangeHorizontallyEvent=null,o}return f(t,e),t.prototype.dispose=function(){this._asyncUpdateLineWidths.dispose(),e.prototype.dispose.call(this)},t.prototype.getDomNode=function(){return this.domNode},t.prototype.createVisibleLine=function(){return new s.ViewLine(this._viewLineOptions)},t.prototype.onConfigurationChanged=function(e){this._visibleLines.onConfigurationChanged(e),e.wrappingInfo&&(this._maxLineWidth=0);var t=this._context.configuration;return e.lineHeight&&(this._lineHeight=t.editor.lineHeight),e.fontInfo&&(this._typicalHalfwidthCharacterWidth=t.editor.fontInfo.typicalHalfwidthCharacterWidth),e.wrappingInfo&&(this._isViewportWrapping=t.editor.wrappingInfo.isViewportWrapping),e.viewInfo&&(this._revealHorizontalRightPadding=t.editor.viewInfo.revealHorizontalRightPadding),e.canUseLayerHinting&&(this._canUseLayerHinting=t.editor.canUseLayerHinting),e.fontInfo&&a.Configuration.applyFontInfo(this.domNode,t.editor.fontInfo),this._onOptionsMaybeChanged(),e.layoutInfo&&(this._maxLineWidth=0),!0},t.prototype._onOptionsMaybeChanged=function(){var e=this._context.configuration,t=new s.ViewLineOptions(e,this._context.theme.type);if(!this._viewLineOptions.equals(t)){this._viewLineOptions=t;for(var n=this._visibleLines.getStartLineNumber(),i=this._visibleLines.getEndLineNumber(),o=n;o<=i;o++)this._visibleLines.getVisibleLine(o).onOptionsChanged(this._viewLineOptions);return!0}return!1},t.prototype.onCursorStateChanged=function(e){for(var t=this._visibleLines.getStartLineNumber(),n=this._visibleLines.getEndLineNumber(),i=!1,o=t;o<=n;o++)i=this._visibleLines.getVisibleLine(o).onSelectionChanged()||i;return i},t.prototype.onDecorationsChanged=function(e){for(var t=this._visibleLines.getStartLineNumber(),n=this._visibleLines.getEndLineNumber(),i=t;i<=n;i++)this._visibleLines.getVisibleLine(i).onDecorationsChanged();return!0},t.prototype.onFlushed=function(e){var t=this._visibleLines.onFlushed(e);return this._maxLineWidth=0,t},t.prototype.onLinesChanged=function(e){return this._visibleLines.onLinesChanged(e)},t.prototype.onLinesDeleted=function(e){return this._visibleLines.onLinesDeleted(e)},t.prototype.onLinesInserted=function(e){return this._visibleLines.onLinesInserted(e)},t.prototype.onRevealRangeRequest=function(e){var t=this._computeScrollTopToRevealRange(this._context.viewLayout.getCurrentViewport(),e.range,e.verticalType);return e.revealHorizontal&&(this._lastCursorRevealRangeHorizontallyEvent=e),this._context.viewLayout.setScrollPosition({scrollTop:t}),!0},t.prototype.onScrollChanged=function(e){return this.domNode.setWidth(e.scrollWidth),this._visibleLines.onScrollChanged(e)||!0},t.prototype.onTokensChanged=function(e){return this._visibleLines.onTokensChanged(e)},t.prototype.onZonesChanged=function(e){return this._visibleLines.onZonesChanged(e)},t.prototype.onThemeChanged=function(e){return this._onOptionsMaybeChanged()},t.prototype.getPositionFromDOMInfo=function(e,t){var n=this._getViewLineDomNode(e);if(null===n)return null;var i=this._getLineNumberFor(n);if(-1===i)return null;if(i<1||i>this._context.model.getLineCount())return null;if(1===this._context.model.getLineMaxColumn(i))return new o.Position(i,1);var r=this._visibleLines.getStartLineNumber(),s=this._visibleLines.getEndLineNumber();if(is)return null;var a=this._visibleLines.getVisibleLine(i).getColumnOfNodeOffset(i,e,t),u=this._context.model.getLineMinColumn(i);return an?-1:this._visibleLines.getVisibleLine(e).getWidth()},t.prototype.linesVisibleRangesForRange=function(e,t){if(this.shouldRender())return null;var n=e.endLineNumber;if(!(e=i.Range.intersectRanges(e,this._lastRenderedData.getCurrentVisibleRange())))return null;var r,a=[],l=new s.DomReadingContext(this.domNode.domNode,this._textRangeRestingSpot);t&&(r=this._context.model.coordinatesConverter.convertViewPositionToModelPosition(new o.Position(e.startLineNumber,1)).lineNumber);for(var c=this._visibleLines.getStartLineNumber(),d=this._visibleLines.getEndLineNumber(),h=e.startLineNumber;h<=e.endLineNumber;h++)if(!(hd)){var p=h===e.startLineNumber?e.startColumn:1,f=h===e.endLineNumber?e.endColumn:this._context.model.getLineMaxColumn(h),g=this._visibleLines.getVisibleLine(h).getVisibleRangesForRange(p,f,l);g&&0!==g.length&&(t&&hr)){var u=a===e.startLineNumber?e.startColumn:1,l=a===e.endLineNumber?e.endColumn:this._context.model.getLineMaxColumn(a),c=this._visibleLines.getVisibleLine(a).getVisibleRangesForRange(u,l,n);c&&0!==c.length&&(t=t.concat(c))}return 0===t.length?null:t},t.prototype._updateLineWidths=function(){for(var e=this._visibleLines.getStartLineNumber(),t=this._visibleLines.getEndLineNumber(),n=1,i=e;i<=t;i++){var o=this._visibleLines.getVisibleLine(i).getWidth();n=Math.max(n,o)}1===e&&t===this._context.model.getLineCount()&&(this._maxLineWidth=0),this._ensureMaxLineWidth(n)},t.prototype.prepareRender=function(){throw new Error("Not supported")},t.prototype.render=function(){throw new Error("Not supported")},t.prototype.renderText=function(e){if(this._visibleLines.renderLines(e),this._lastRenderedData.setCurrentVisibleRange(e.visibleRange),this.domNode.setWidth(this._context.viewLayout.getScrollWidth()),this.domNode.setHeight(Math.min(this._context.viewLayout.getScrollHeight(),1e6)),this._lastCursorRevealRangeHorizontallyEvent){var t=this._lastCursorRevealRangeHorizontallyEvent.range;this._lastCursorRevealRangeHorizontallyEvent=null,this.onDidRender();var n=this._computeScrollLeftToRevealRange(t);this._isViewportWrapping||this._ensureMaxLineWidth(n.maxHorizontalOffset),this._context.viewLayout.setScrollPosition({scrollLeft:n.scrollLeft})}this._linesContent.setLayerHinting(this._canUseLayerHinting);var i=this._context.viewLayout.getScrollTop()-e.bigNumbersDelta;this._linesContent.setTop(-i),this._linesContent.setLeft(-this._context.viewLayout.getScrollLeft()),this._asyncUpdateLineWidths.schedule()},t.prototype._ensureMaxLineWidth=function(e){var t=Math.ceil(e);this._maxLineWidthu&&(u=c.left+c.width)}return n=u,a=Math.max(0,a-t.HORIZONTAL_EXTRA_PX),u+=this._revealHorizontalRightPadding,{scrollLeft:this._computeMinimumScrolling(o,r,a,u),maxHorizontalOffset:n}},t.prototype._computeMinimumScrolling=function(e,t,n,i,o,r){o=!!o,r=!!r;var s=(t|=0)-(e|=0);return(i|=0)-(n|=0)t?Math.max(0,i-s):e:n},t.HORIZONTAL_EXTRA_PX=30,t}(l.ViewPart);t.ViewLines=h}),define(d[493],h([1,0,35,215,4,111,27,112,2,57,83,15,14,23,294]),function(e,t,n,i,o,r,s,a,u,l,c,d,h,p){"use strict";function g(e){return 2===e?4:4===e?6:1===e?2:3}function m(e){return 2===e?2:4===e?2:1}Object.defineProperty(t,"__esModule",{value:!0});var v;!function(e){e[e.None=0]="None",e[e.Small=1]="Small",e[e.Large=2]="Large",e[e.SmallBlocks=3]="SmallBlocks",e[e.LargeBlocks=4]="LargeBlocks"}(v||(v={}));var _=140,y=function(){function e(e){var t=e.editor.pixelRatio,n=e.editor.layoutInfo,i=e.editor.viewInfo,o=e.editor.fontInfo;this.renderMinimap=0|n.renderMinimap,this.scrollBeyondLastLine=i.scrollBeyondLastLine,this.showSlider=i.minimap.showSlider,this.pixelRatio=t,this.typicalHalfwidthCharacterWidth=o.typicalHalfwidthCharacterWidth,this.lineHeight=e.editor.lineHeight,this.minimapWidth=n.minimapWidth,this.minimapHeight=n.height,this.canvasInnerWidth=Math.max(1,Math.floor(t*this.minimapWidth)),this.canvasInnerHeight=Math.max(1,Math.floor(t*this.minimapHeight)),this.canvasOuterWidth=this.canvasInnerWidth/t,this.canvasOuterHeight=this.canvasInnerHeight/t}return e.prototype.equals=function(e){return this.renderMinimap===e.renderMinimap&&this.scrollBeyondLastLine===e.scrollBeyondLastLine&&this.showSlider===e.showSlider&&this.pixelRatio===e.pixelRatio&&this.typicalHalfwidthCharacterWidth===e.typicalHalfwidthCharacterWidth&&this.lineHeight===e.lineHeight&&this.minimapWidth===e.minimapWidth&&this.minimapHeight===e.minimapHeight&&this.canvasInnerWidth===e.canvasInnerWidth&&this.canvasInnerHeight===e.canvasInnerHeight&&this.canvasOuterWidth===e.canvasOuterWidth&&this.canvasOuterHeight===e.canvasOuterHeight},e}(),C=function(){function e(e,t,n,i,o,r,s){this.scrollTop=e,this.scrollHeight=t,this._computedSliderRatio=n,this.sliderTop=i,this.sliderHeight=o,this.startLineNumber=r,this.endLineNumber=s}return e.prototype.getDesiredScrollTopFromDelta=function(e){var t=this.sliderTop+e;return Math.round(t/this._computedSliderRatio)},e.create=function(t,n,i,o,r,s,a,u,l){var c,d=t.pixelRatio,h=g(t.renderMinimap),p=Math.floor(t.canvasInnerHeight/h),f=t.lineHeight;if(r&&i!==s){var m=i-n+1;c=Math.floor(m*h/d)}else{var v=o/f;c=Math.floor(v*h/d)}var _;_=t.scrollBeyondLastLine?(s-1)*h/d:Math.max(0,s*h/d-c);var y=(_=Math.min(t.minimapHeight-c,_))/(u-o),C=a*y;if(p>=s)return new e(a,u,y,C,c,b=1,w=s);var b=Math.max(1,Math.floor(n-C*d/h));l&&l.scrollHeight===u&&(l.scrollTop>a&&(b=Math.min(b,l.startLineNumber)),l.scrollTop_)a._context.viewLayout.setScrollPosition({scrollTop:i.scrollTop});else{var r=e.posy-t;a._context.viewLayout.setScrollPosition({scrollTop:i.getDesiredScrollTopFromDelta(r)})}},function(){a._slider.toggleClassName("active",!1)})}}),a}return f(t,e),t.prototype.dispose=function(){this._mouseDownListener.dispose(),this._sliderMouseMoveMonitor.dispose(),this._sliderMouseDownListener.dispose(),e.prototype.dispose.call(this)},t.prototype._getMinimapDomNodeClassName=function(){return"always"===this._options.showSlider?"minimap slider-always":"minimap slider-mouseover"},t.prototype.getDomNode=function(){return this._domNode},t.prototype._applyLayout=function(){this._domNode.setWidth(this._options.minimapWidth),this._domNode.setHeight(this._options.minimapHeight),this._shadow.setHeight(this._options.minimapHeight),this._canvas.setWidth(this._options.canvasOuterWidth),this._canvas.setHeight(this._options.canvasOuterHeight),this._canvas.domNode.width=this._options.canvasInnerWidth,this._canvas.domNode.height=this._options.canvasInnerHeight,this._slider.setWidth(this._options.minimapWidth)},t.prototype._getBuffer=function(){return this._buffers||(this._buffers=new S(this._canvas.domNode.getContext("2d"),this._options.canvasInnerWidth,this._options.canvasInnerHeight,this._tokensColorTracker.getColor(2))),this._buffers.getBuffer()},t.prototype._onOptionsMaybeChanged=function(){var e=new y(this._context.configuration);return!this._options.equals(e)&&(this._options=e,this._lastRenderData=null,this._buffers=null,this._applyLayout(),this._domNode.setClassName(this._getMinimapDomNodeClassName()),!0)},t.prototype.onConfigurationChanged=function(e){return this._onOptionsMaybeChanged()},t.prototype.onFlushed=function(e){return this._lastRenderData=null,!0},t.prototype.onLinesChanged=function(e){return!!this._lastRenderData&&this._lastRenderData.onLinesChanged(e)},t.prototype.onLinesDeleted=function(e){return this._lastRenderData&&this._lastRenderData.onLinesDeleted(e),!0},t.prototype.onLinesInserted=function(e){return this._lastRenderData&&this._lastRenderData.onLinesInserted(e),!0},t.prototype.onScrollChanged=function(e){return!0},t.prototype.onTokensChanged=function(e){return!!this._lastRenderData&&this._lastRenderData.onTokensChanged(e)},t.prototype.onTokensColorsChanged=function(e){return this._lastRenderData=null,this._buffers=null,!0},t.prototype.onZonesChanged=function(e){return this._lastRenderData=null,!0},t.prototype.prepareRender=function(e){},t.prototype.render=function(e){if(0!==this._options.renderMinimap){e.scrollLeft+e.viewportWidth>=e.scrollWidth?this._shadow.setClassName("minimap-shadow-hidden"):this._shadow.setClassName("minimap-shadow-visible");var t=C.create(this._options,e.visibleRange.startLineNumber,e.visibleRange.endLineNumber,e.viewportHeight,e.viewportData.whitespaceViewportData.length>0,this._context.model.getLineCount(),e.scrollTop,e.scrollHeight,this._lastRenderData?this._lastRenderData.renderedLayout:null);this._slider.setTop(t.sliderTop),this._slider.setHeight(t.sliderHeight);var n=e.scrollLeft/this._options.typicalHalfwidthCharacterWidth,i=Math.min(this._options.minimapWidth,Math.round(n*m(this._options.renderMinimap)/this._options.pixelRatio));this._sliderHorizontal.setLeft(i),this._sliderHorizontal.setWidth(this._options.minimapWidth-i),this._sliderHorizontal.setTop(0),this._sliderHorizontal.setHeight(t.sliderHeight),this._lastRenderData=this.renderLines(t)}else this._shadow.setClassName("minimap-shadow-hidden")},t.prototype.renderLines=function(e){var n=this._options.renderMinimap,i=e.startLineNumber,o=e.endLineNumber,r=g(n);if(this._lastRenderData&&this._lastRenderData.linesEquals(e)){var s=this._lastRenderData._get();return new w(e,s.imageData,s.lines)}for(var a=this._getBuffer(),u=t._renderUntouchedLines(a,i,o,r,this._lastRenderData),l=this._context.model.getMinimapLinesRenderingData(i,o,u),c=l.tabSize,d=this._tokensColorTracker.getColor(2),h=this._tokensColorTracker.backgroundIsLight(),p=0,f=[],m=0,v=o-i+1;m=0&&wh)return;var S=l.charCodeAt(f);if(9===S){var E=a-(f+g)%a;g+=E-1,p+=E*d}else 32===S?p+=d:(2===i?r.x2RenderChar(e,p,s,S,w,t,n):1===i?r.x1RenderChar(e,p,s,S,w,t,n):4===i?r.x2BlockRenderChar(e,p,s,w,t,n):r.x1BlockRenderChar(e,p,s,w,t,n),p+=d)}},t}(n.ViewPart);t.Minimap=E,h.registerThemingParticipant(function(e,t){var n=e.getColor(p.scrollbarSliderBackground);if(n){var i=n.transparent(.5);t.addRule(".monaco-editor .minimap-slider, .monaco-editor .minimap-slider .minimap-slider-horizontal { background: "+i+"; }")}var o=e.getColor(p.scrollbarSliderHoverBackground);if(o){var r=o.transparent(.5);t.addRule(".monaco-editor .minimap-slider:hover, .monaco-editor .minimap-slider:hover .minimap-slider-horizontal { background: "+r+"; }")}var s=e.getColor(p.scrollbarSliderActiveBackground);if(s){var a=s.transparent(.5);t.addRule(".monaco-editor .minimap-slider.active, .monaco-editor .minimap-slider.active .minimap-slider-horizontal { background: "+a+"; }")}var u=e.getColor(p.scrollbarShadow);u&&t.addRule(".monaco-editor .minimap-shadow-visible { box-shadow: "+u+" -6px 0 6px -6px inset; }")})}),define(d[494],h([1,0,27,35,14,23,300]),function(e,t,n,i,o,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var s=function(e){function t(t){var i=e.call(this,t)||this;return i._scrollTop=0,i._width=0,i._updateWidth(),i._shouldShow=!1,i._useShadows=i._context.configuration.editor.viewInfo.scrollbar.useShadows,i._domNode=n.createFastDomNode(document.createElement("div")),i._domNode.setAttribute("role","presentation"),i._domNode.setAttribute("aria-hidden","true"),i}return f(t,e),t.prototype.dispose=function(){e.prototype.dispose.call(this)},t.prototype._updateShouldShow=function(){var e=this._useShadows&&this._scrollTop>0;return this._shouldShow!==e&&(this._shouldShow=e,!0)},t.prototype.getDomNode=function(){return this._domNode},t.prototype._updateWidth=function(){var e=this._context.configuration.editor.layoutInfo,t=e.width-e.minimapWidth;return this._width!==t&&(this._width=t,!0)},t.prototype.onConfigurationChanged=function(e){var t=!1;return e.viewInfo&&(this._useShadows=this._context.configuration.editor.viewInfo.scrollbar.useShadows),e.layoutInfo&&(t=this._updateWidth()),this._updateShouldShow()||t},t.prototype.onScrollChanged=function(e){return this._scrollTop=e.scrollTop,this._updateShouldShow()},t.prototype.prepareRender=function(e){},t.prototype.render=function(e){this._domNode.setWidth(this._width),this._domNode.setClassName(this._shouldShow?"scroll-decoration":"")},t}(i.ViewPart);t.ScrollDecorationViewPart=s,o.registerThemingParticipant(function(e,t){var n=e.getColor(r.scrollbarShadow);n&&t.addRule(".monaco-editor .scroll-decoration { box-shadow: "+n+" 0 6px 6px -6px inset; }")})}),define(d[495],h([1,0,14,23,67,28,306]),function(e,t,n,i,o,r){"use strict";function s(e){return new l(e)}function a(e){return new c(e.lineNumber,e.ranges.map(s))}Object.defineProperty(t,"__esModule",{value:!0});var u;!function(e){e[e.EXTERN=0]="EXTERN",e[e.INTERN=1]="INTERN",e[e.FLAT=2]="FLAT"}(u||(u={}));var l=function(){return function(e){this.left=e.left,this.width=e.width,this.startStyle=null,this.endStyle=null}}(),c=function(){return function(e,t){this.lineNumber=e,this.ranges=t}}(),d=r.isEdgeOrIE,h=function(e){function t(t){var n=e.call(this)||this;return n._previousFrameVisibleRangesWithStyle=[],n._context=t,n._lineHeight=n._context.configuration.editor.lineHeight,n._roundedSelection=n._context.configuration.editor.viewInfo.roundedSelection,n._selections=[],n._renderResult=null,n._context.addEventHandler(n),n}return f(t,e),t.prototype.dispose=function(){this._context.removeEventHandler(this),this._context=null,this._selections=null,this._renderResult=null,e.prototype.dispose.call(this)},t.prototype.onConfigurationChanged=function(e){return e.lineHeight&&(this._lineHeight=this._context.configuration.editor.lineHeight),e.viewInfo&&(this._roundedSelection=this._context.configuration.editor.viewInfo.roundedSelection),!0},t.prototype.onCursorStateChanged=function(e){return this._selections=e.selections.slice(0),!0},t.prototype.onDecorationsChanged=function(e){return!0},t.prototype.onFlushed=function(e){return!0},t.prototype.onLinesChanged=function(e){return!0},t.prototype.onLinesDeleted=function(e){return!0},t.prototype.onLinesInserted=function(e){return!0},t.prototype.onScrollChanged=function(e){return e.scrollTopChanged},t.prototype.onZonesChanged=function(e){return!0},t.prototype._visibleRangesHaveGaps=function(e){for(var t=0,n=e.length;t1)return!0;return!1},t.prototype._enrichVisibleRangesWithStyle=function(e,t){var n=null,i=null;if(t&&t.length>0&&e.length>0){for(var o=e[0].lineNumber,r=0;!n&&r=0;r--)t[r].lineNumber===s&&(i=t[r].ranges[0]);n&&!n.startStyle&&(n=null),i&&!i.startStyle&&(i=null)}for(var r=0,a=e.length;r0){var p=e[r-1].ranges[0].left,f=e[r-1].ranges[0].left+e[r-1].ranges[0].width;l===p?d.top=2:l>p&&(d.top=1),c===f?h.top=2:p'},t.prototype._actualRenderOneSelection=function(e,n,i,o){for(var r=o.length>0&&o[0].ranges[0].startStyle,s=this._lineHeight.toString(),a=(this._lineHeight-1).toString(),u=o.length>0?o[0].lineNumber:0,l=o.length>0?o[o.length-1].lineNumber:0,c=0,d=o.length;c1,l)}}this._previousFrameVisibleRangesWithStyle=r,this._renderResult=t},t.prototype.render=function(e,t){if(!this._renderResult)return"";var n=t-e;if(n<0||n>=this._renderResult.length)throw new Error("Unexpected render request");return this._renderResult[n]},t.SELECTION_CLASS_NAME="selected-text",t.SELECTION_TOP_LEFT="top-left-radius",t.SELECTION_BOTTOM_LEFT="bottom-left-radius",t.SELECTION_TOP_RIGHT="top-right-radius",t.SELECTION_BOTTOM_RIGHT="bottom-right-radius",t.EDITOR_BACKGROUND_CLASS_NAME="monaco-editor-background",t.ROUNDED_PIECE_WIDTH=10,t}(o.DynamicViewOverlay);t.SelectionsOverlay=h,n.registerThemingParticipant(function(e,t){var n=e.getColor(i.editorSelectionBackground);n&&t.addRule(".monaco-editor .focused .selected-text { background-color: "+n+"; }");var o=e.getColor(i.editorInactiveSelection);o&&t.addRule(".monaco-editor .selected-text { background-color: "+o+"; }");var r=e.getColor(i.editorSelectionForeground);r&&t.addRule(".monaco-editor .view-line span.inline-selected-text { color: "+r+"; }")})}),define(d[37],h([1,0,340,23,14,32]),function(e,t,n,i,o,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.editorLineHighlight=i.registerColor("editor.lineHighlightBackground",{dark:null,light:null,hc:null},n.localize(0,null)),t.editorLineHighlightBorder=i.registerColor("editor.lineHighlightBorder",{dark:"#282828",light:"#eeeeee",hc:"#f38518"},n.localize(1,null)),t.editorRangeHighlight=i.registerColor("editor.rangeHighlightBackground",{dark:"#ffffff0b",light:"#fdff0033",hc:null},n.localize(2,null)),t.editorCursorForeground=i.registerColor("editorCursor.foreground",{dark:"#AEAFAD",light:r.Color.black,hc:r.Color.white},n.localize(3,null)),t.editorCursorBackground=i.registerColor("editorCursor.background",null,n.localize(4,null)),t.editorWhitespaces=i.registerColor("editorWhitespace.foreground",{dark:"#e3e4e229",light:"#33333333",hc:"#e3e4e229"},n.localize(5,null)),t.editorIndentGuides=i.registerColor("editorIndentGuide.background",{dark:t.editorWhitespaces,light:t.editorWhitespaces,hc:t.editorWhitespaces},n.localize(6,null)),t.editorLineNumbers=i.registerColor("editorLineNumber.foreground",{dark:"#5A5A5A",light:"#2B91AF",hc:r.Color.white},n.localize(7,null)),t.editorRuler=i.registerColor("editorRuler.foreground",{dark:"#5A5A5A",light:r.Color.lightgrey,hc:r.Color.white},n.localize(8,null)),t.editorCodeLensForeground=i.registerColor("editorCodeLens.foreground",{dark:"#999999",light:"#999999",hc:"#999999"},n.localize(9,null)),t.editorBracketMatchBackground=i.registerColor("editorBracketMatch.background",{dark:"#0064001a",light:"#0064001a",hc:"#0064001a"},n.localize(10,null)),t.editorBracketMatchBorder=i.registerColor("editorBracketMatch.border",{dark:"#888",light:"#B9B9B9",hc:"#fff"},n.localize(11,null)),t.editorOverviewRulerBorder=i.registerColor("editorOverviewRuler.border",{dark:"#7f7f7f4d",light:"#7f7f7f4d",hc:"#7f7f7f4d"},n.localize(12,null)),t.editorGutter=i.registerColor("editorGutter.background",{dark:i.editorBackground,light:i.editorBackground,hc:i.editorBackground},n.localize(13,null)),t.editorErrorForeground=i.registerColor("editorError.foreground",{dark:"#FF0000",light:"#FF0000",hc:null},n.localize(14,null)),t.editorErrorBorder=i.registerColor("editorError.border",{dark:null,light:null,hc:r.Color.fromHex("#E47777").transparent(.8)},n.localize(15,null)),t.editorWarningForeground=i.registerColor("editorWarning.foreground",{dark:"#008000",light:"#008000",hc:null},n.localize(16,null)),t.editorWarningBorder=i.registerColor("editorWarning.border",{dark:null,light:null,hc:r.Color.fromHex("#71B771").transparent(.8)},n.localize(17,null)),o.registerThemingParticipant(function(e,n){var o=e.getColor(i.editorBackground);o&&n.addRule(".monaco-editor, .monaco-editor-background, .monaco-editor .inputarea.ime-input { background-color: "+o+"; }");var r=e.getColor(i.editorForeground);r&&n.addRule(".monaco-editor, .monaco-editor .inputarea.ime-input { color: "+r+"; }");var s=e.getColor(t.editorGutter);s&&n.addRule(".monaco-editor .margin { background-color: "+s+"; }");var a=e.getColor(t.editorRangeHighlight);a&&n.addRule(".monaco-editor .rangeHighlight { background-color: "+a+"; }");var u=e.getColor(i.activeContrastBorder);u&&n.addRule(".monaco-editor .rangeHighlight { border: 1px dotted "+u+"; }; }");var l=e.getColor(t.editorWhitespaces);l&&n.addRule(".vs-whitespace { color: "+l+" !important; }")})}),define(d[497],h([1,0,67,14,37,274]),function(e,t,n,i,o){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(e){function t(t){var n=e.call(this)||this;return n._context=t,n._lineHeight=n._context.configuration.editor.lineHeight,n._readOnly=n._context.configuration.editor.readOnly,n._renderLineHighlight=n._context.configuration.editor.viewInfo.renderLineHighlight,n._selectionIsEmpty=!0,n._primaryCursorIsInEditableRange=!0,n._primaryCursorLineNumber=1,n._scrollWidth=0,n._contentWidth=n._context.configuration.editor.layoutInfo.contentWidth,n._context.addEventHandler(n),n}return f(t,e),t.prototype.dispose=function(){this._context.removeEventHandler(this),this._context=null,e.prototype.dispose.call(this)},t.prototype.onConfigurationChanged=function(e){return e.lineHeight&&(this._lineHeight=this._context.configuration.editor.lineHeight),e.readOnly&&(this._readOnly=this._context.configuration.editor.readOnly),e.viewInfo&&(this._renderLineHighlight=this._context.configuration.editor.viewInfo.renderLineHighlight),e.layoutInfo&&(this._contentWidth=this._context.configuration.editor.layoutInfo.contentWidth),!0},t.prototype.onCursorStateChanged=function(e){var t=!1;this._primaryCursorIsInEditableRange!==e.isInEditableRange&&(this._primaryCursorIsInEditableRange=e.isInEditableRange,t=!0);var n=e.selections[0].positionLineNumber;this._primaryCursorLineNumber!==n&&(this._primaryCursorLineNumber=n,t=!0);var i=e.selections[0].isEmpty();return this._selectionIsEmpty!==i?(this._selectionIsEmpty=i,t=!0,!0):t},t.prototype.onFlushed=function(e){return!0},t.prototype.onLinesDeleted=function(e){return!0},t.prototype.onLinesInserted=function(e){return!0},t.prototype.onScrollChanged=function(e){return e.scrollWidthChanged},t.prototype.onZonesChanged=function(e){return!0},t.prototype.prepareRender=function(e){this._scrollWidth=e.scrollWidth},t.prototype.render=function(e,t){return t===this._primaryCursorLineNumber&&this._shouldShowCurrentLine()?'
    ':""},t.prototype._shouldShowCurrentLine=function(){return("line"===this._renderLineHighlight||"all"===this._renderLineHighlight)&&this._selectionIsEmpty&&this._primaryCursorIsInEditableRange},t}(n.DynamicViewOverlay);t.CurrentLineHighlightOverlay=r,i.registerThemingParticipant(function(e,t){var n=e.getColor(o.editorLineHighlight);if(n&&t.addRule(".monaco-editor .view-overlays .current-line { background-color: "+n+"; }"),!n||n.isTransparent()||e.defines(o.editorLineHighlightBorder)){var i=e.getColor(o.editorLineHighlightBorder);i&&(t.addRule(".monaco-editor .view-overlays .current-line { border: 2px solid "+i+"; }"),"hc"===e.type&&t.addRule(".monaco-editor .view-overlays .current-line { border-width: 1px; }"))}})}),define(d[498],h([1,0,67,14,37,277]),function(e,t,n,i,o){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(e){function t(t){var n=e.call(this)||this;return n._context=t,n._lineHeight=n._context.configuration.editor.lineHeight,n._renderLineHighlight=n._context.configuration.editor.viewInfo.renderLineHighlight,n._primaryCursorIsInEditableRange=!0,n._primaryCursorLineNumber=1,n._contentLeft=n._context.configuration.editor.layoutInfo.contentLeft,n._context.addEventHandler(n),n}return f(t,e),t.prototype.dispose=function(){this._context.removeEventHandler(this),this._context=null,e.prototype.dispose.call(this)},t.prototype.onConfigurationChanged=function(e){return e.lineHeight&&(this._lineHeight=this._context.configuration.editor.lineHeight),e.viewInfo&&(this._renderLineHighlight=this._context.configuration.editor.viewInfo.renderLineHighlight),e.layoutInfo&&(this._contentLeft=this._context.configuration.editor.layoutInfo.contentLeft),!0},t.prototype.onCursorStateChanged=function(e){var t=!1;this._primaryCursorIsInEditableRange!==e.isInEditableRange&&(this._primaryCursorIsInEditableRange=e.isInEditableRange,t=!0);var n=e.selections[0].positionLineNumber;return this._primaryCursorLineNumber!==n&&(this._primaryCursorLineNumber=n,t=!0),t},t.prototype.onFlushed=function(e){return!0},t.prototype.onLinesDeleted=function(e){return!0},t.prototype.onLinesInserted=function(e){return!0},t.prototype.onZonesChanged=function(e){return!0},t.prototype.prepareRender=function(e){},t.prototype.render=function(e,t){return t===this._primaryCursorLineNumber&&this._shouldShowCurrentLine()?'
    ':""},t.prototype._shouldShowCurrentLine=function(){return("gutter"===this._renderLineHighlight||"all"===this._renderLineHighlight)&&this._primaryCursorIsInEditableRange},t}(n.DynamicViewOverlay);t.CurrentLineMarginHighlightOverlay=r,i.registerThemingParticipant(function(e,t){var n=e.getColor(o.editorLineHighlight);if(n)t.addRule(".monaco-editor .margin-view-overlays .current-line-margin { background-color: "+n+"; border: none; }");else{var i=e.getColor(o.editorLineHighlightBorder);i&&t.addRule(".monaco-editor .margin-view-overlays .current-line-margin { border: 2px solid "+i+"; }"),"hc"===e.type&&t.addRule(".monaco-editor .margin-view-overlays .current-line-margin { border-width: 1px; }")}})}),define(d[499],h([1,0,67,14,37,4,12,280]),function(e,t,n,i,o,r,s){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var a=function(e){function t(t){var n=e.call(this)||this;return n._context=t,n._lineHeight=n._context.configuration.editor.lineHeight,n._spaceWidth=n._context.configuration.editor.fontInfo.spaceWidth,n._enabled=n._context.configuration.editor.viewInfo.renderIndentGuides,n._renderResult=null,n._context.addEventHandler(n),n}return f(t,e),t.prototype.dispose=function(){this._context.removeEventHandler(this),this._context=null,this._renderResult=null,e.prototype.dispose.call(this)},t.prototype.onConfigurationChanged=function(e){return e.lineHeight&&(this._lineHeight=this._context.configuration.editor.lineHeight),e.fontInfo&&(this._spaceWidth=this._context.configuration.editor.fontInfo.spaceWidth),e.viewInfo&&(this._enabled=this._context.configuration.editor.viewInfo.renderIndentGuides),!0},t.prototype.onDecorationsChanged=function(e){return!0},t.prototype.onFlushed=function(e){return!0},t.prototype.onLinesChanged=function(e){return!0},t.prototype.onLinesDeleted=function(e){return!0},t.prototype.onLinesInserted=function(e){return!0},t.prototype.onScrollChanged=function(e){return e.scrollTopChanged},t.prototype.onZonesChanged=function(e){return!0},t.prototype.prepareRender=function(e){if(this._enabled){for(var t=e.visibleRange.startLineNumber,n=e.visibleRange.endLineNumber,i=this._context.model.getTabSize()*this._spaceWidth,o=this._lineHeight,a=r.computeScreenAwareSize(1),u=[],l=t;l<=n;l++){for(var c=l-t,d=this._context.model.getLineIndentGuide(l),h="",p=e.visibleRangeForPosition(new s.Position(l,1)),f=p?p.left:0,g=0;g',f+=i;u[c]=h}this._renderResult=u}else this._renderResult=null},t.prototype.render=function(e,t){if(!this._renderResult)return"";var n=t-e;if(n<0||n>=this._renderResult.length)throw new Error("Unexpected render request");return this._renderResult[n]},t}(n.DynamicViewOverlay);t.IndentGuidesOverlay=a,i.registerThemingParticipant(function(e,t){var n=e.getColor(o.editorIndentGuides);n&&t.addRule(".monaco-editor .lines-content .cigr { background-color: "+n+"; }")})}),define(d[188],h([1,0,37,14,15,67,12,283]),function(e,t,n,i,o,r,s){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var a=function(e){function t(t){var n=e.call(this)||this;return n._context=t,n._readConfig(),n._lastCursorModelPosition=new s.Position(1,1),n._renderResult=null,n._context.addEventHandler(n),n}return f(t,e),t.prototype._readConfig=function(){var e=this._context.configuration.editor;this._lineHeight=e.lineHeight,this._renderLineNumbers=e.viewInfo.renderLineNumbers,this._renderCustomLineNumbers=e.viewInfo.renderCustomLineNumbers,this._renderRelativeLineNumbers=e.viewInfo.renderRelativeLineNumbers,this._lineNumbersLeft=e.layoutInfo.lineNumbersLeft,this._lineNumbersWidth=e.layoutInfo.lineNumbersWidth},t.prototype.dispose=function(){this._context.removeEventHandler(this),this._context=null,this._renderResult=null,e.prototype.dispose.call(this)},t.prototype.onConfigurationChanged=function(e){return this._readConfig(),!0},t.prototype.onCursorStateChanged=function(e){var t=e.selections[0].getPosition();return this._lastCursorModelPosition=this._context.model.coordinatesConverter.convertViewPositionToModelPosition(t),!!this._renderRelativeLineNumbers},t.prototype.onFlushed=function(e){return!0},t.prototype.onLinesChanged=function(e){return!0},t.prototype.onLinesDeleted=function(e){return!0},t.prototype.onLinesInserted=function(e){return!0},t.prototype.onScrollChanged=function(e){return e.scrollTopChanged},t.prototype.onZonesChanged=function(e){return!0},t.prototype._getLineRenderLineNumber=function(e){var t=this._context.model.coordinatesConverter.convertViewPositionToModelPosition(new s.Position(e,1));if(1!==t.column)return"";var n=t.lineNumber;if(this._renderCustomLineNumbers)return this._renderCustomLineNumbers(n);if(this._renderRelativeLineNumbers){var i=Math.abs(this._lastCursorModelPosition.lineNumber-n);return 0===i?''+n+"":String(i)}return String(n)},t.prototype.prepareRender=function(e){if(this._renderLineNumbers){for(var n=o.isLinux?this._lineHeight%2==0?" lh-even":" lh-odd":"",i=e.visibleRange.startLineNumber,r=e.visibleRange.endLineNumber,s='
    ',a=[],u=i;u<=r;u++){var l=u-i,c=this._getLineRenderLineNumber(u);a[l]=c?s+c+"
    ":""}this._renderResult=a}else this._renderResult=null},t.prototype.render=function(e,t){if(!this._renderResult)return"";var n=t-e;if(n<0||n>=this._renderResult.length)throw new Error("Unexpected render request");return this._renderResult[n]},t.CLASS_NAME="line-numbers",t}(r.DynamicViewOverlay);t.LineNumbersOverlay=a,i.registerThemingParticipant(function(e,t){var i=e.getColor(n.editorLineNumbers);i&&t.addRule(".monaco-editor .line-numbers { color: "+i+"; }")})}),define(d[501],h([1,0,15,28,154,151,2,22,12,66,57,27,35,182,188,270]),function(e,t,n,i,o,r,s,a,u,l,c,d,h,p,g){"use strict";function m(e,t){var n=document.createElement("canvas").getContext("2d");n.font=v(t);var o=n.measureText(e);return i.isFirefox?o.width+2:o.width}function v(e){return _("normal",e.fontWeight,e.fontSize,e.lineHeight,e.fontFamily)}function _(e,t,n,i,o){return e+" normal "+t+" "+n+"px / "+i+"px "+o}Object.defineProperty(t,"__esModule",{value:!0});var y=function(){function e(e,t,n){this.top=e,this.left=t,this.width=n}return e.prototype.setWidth=function(t){return new e(this.top,this.left,t)},e}(),C=i.isEdgeOrIE||i.isFirefox,b=function(e){function t(t,n,u){var l=e.call(this,t)||this;l._primaryCursorVisibleRange=null,l._viewController=n,l._viewHelper=u;var p=l._context.configuration.editor;l._pixelRatio=p.pixelRatio,l._accessibilitySupport=p.accessibilitySupport,l._contentLeft=p.layoutInfo.contentLeft,l._contentWidth=p.layoutInfo.contentWidth,l._contentHeight=p.layoutInfo.contentHeight,l._scrollLeft=0,l._scrollTop=0,l._fontInfo=p.fontInfo,l._lineHeight=p.lineHeight,l._emptySelectionClipboard=p.emptySelectionClipboard,l._visibleTextArea=null,l._selections=[new a.Selection(1,1,1,1)],l._lastCopiedValue=null,l._lastCopiedValueIsFromEmptySelection=!1,l.textArea=d.createFastDomNode(document.createElement("textarea")),h.PartFingerprints.write(l.textArea,6),l.textArea.setClassName("inputarea"),l.textArea.setAttribute("wrap","off"),l.textArea.setAttribute("autocorrect","off"),l.textArea.setAttribute("autocapitalize","off"),l.textArea.setAttribute("autocomplete","off"),l.textArea.setAttribute("spellcheck","false"),l.textArea.setAttribute("aria-label",p.viewInfo.ariaLabel),l.textArea.setAttribute("role","textbox"),l.textArea.setAttribute("aria-multiline","true"),l.textArea.setAttribute("aria-haspopup","false"),l.textArea.setAttribute("aria-autocomplete","both"),l.textAreaCover=d.createFastDomNode(document.createElement("div")),l.textAreaCover.setPosition("absolute");var f={getLineCount:function(){return l._context.model.getLineCount()},getLineMaxColumn:function(e){return l._context.model.getLineMaxColumn(e)},getValueInRange:function(e,t){return l._context.model.getValueInRange(e,t)}},g={getPlainTextToCopy:function(){var e=l._context.model.getPlainTextToCopy(l._selections,l._emptySelectionClipboard);if(l._emptySelectionClipboard){i.isFirefox?l._lastCopiedValue=e.replace(/\r\n/g,"\n"):l._lastCopiedValue=e;var t=l._selections;l._lastCopiedValueIsFromEmptySelection=1===t.length&&t[0].isEmpty()}return e},getHTMLToCopy:function(){return l._context.model.getHTMLToCopy(l._selections,l._emptySelectionClipboard)},getScreenReaderContent:function(e){return i.isIPad?r.TextAreaState.EMPTY:1===l._accessibilitySupport?r.TextAreaState.EMPTY:r.PagedScreenReaderStrategy.fromEditorSelection(e,f,l._selections[0])}};return l._textAreaInput=l._register(new o.TextAreaInput(g,l.textArea)),l._register(l._textAreaInput.onKeyDown(function(e){l._viewController.emitKeyDown(e)})),l._register(l._textAreaInput.onKeyUp(function(e){l._viewController.emitKeyUp(e)})),l._register(l._textAreaInput.onPaste(function(e){var t=!1;l._emptySelectionClipboard&&(t=e.text===l._lastCopiedValue&&l._lastCopiedValueIsFromEmptySelection),l._viewController.paste("keyboard",e.text,t)})),l._register(l._textAreaInput.onCut(function(){l._viewController.cut("keyboard")})),l._register(l._textAreaInput.onType(function(e){e.replaceCharCnt?l._viewController.replacePreviousChar("keyboard",e.text,e.replaceCharCnt):l._viewController.type("keyboard",e.text)})),l._register(l._textAreaInput.onCompositionStart(function(){var e=l._selections[0].startLineNumber,t=l._selections[0].startColumn;l._context.privateViewEventBus.emit(new c.ViewRevealRangeRequestEvent(new s.Range(e,t,e,t),0,!0));var n=l._viewHelper.visibleRangeForPositionRelativeToEditor(e,t);n&&(l._visibleTextArea=new y(l._context.viewLayout.getVerticalOffsetForLineNumber(e),n.left,C?0:1),l._render()),l.textArea.setClassName("inputarea ime-input"),l._viewController.compositionStart("keyboard")})),l._register(l._textAreaInput.onCompositionUpdate(function(e){i.isEdgeOrIE?l._visibleTextArea=l._visibleTextArea.setWidth(0):l._visibleTextArea=l._visibleTextArea.setWidth(m(e.data,l._fontInfo)),l._render()})),l._register(l._textAreaInput.onCompositionEnd(function(){l._visibleTextArea=null,l._render(),l.textArea.setClassName("inputarea"),l._viewController.compositionEnd("keyboard")})),l._register(l._textAreaInput.onFocus(function(){l._context.privateViewEventBus.emit(new c.ViewFocusChangedEvent(!0))})),l._register(l._textAreaInput.onBlur(function(){l._context.privateViewEventBus.emit(new c.ViewFocusChangedEvent(!1))})),l}return f(t,e),t.prototype.dispose=function(){e.prototype.dispose.call(this)},t.prototype.onConfigurationChanged=function(e){var t=this._context.configuration.editor;return e.fontInfo&&(this._fontInfo=t.fontInfo),e.viewInfo&&this.textArea.setAttribute("aria-label",t.viewInfo.ariaLabel),e.layoutInfo&&(this._contentLeft=t.layoutInfo.contentLeft,this._contentWidth=t.layoutInfo.contentWidth,this._contentHeight=t.layoutInfo.contentHeight),e.lineHeight&&(this._lineHeight=t.lineHeight),e.pixelRatio&&(this._pixelRatio=t.pixelRatio),e.accessibilitySupport&&(this._accessibilitySupport=t.accessibilitySupport,this._textAreaInput.writeScreenReaderContent("strategy changed")),e.emptySelectionClipboard&&(this._emptySelectionClipboard=t.emptySelectionClipboard),!0},t.prototype.onCursorStateChanged=function(e){return this._selections=e.selections.slice(0),this._textAreaInput.writeScreenReaderContent("selection changed"),!0},t.prototype.onDecorationsChanged=function(e){return!0},t.prototype.onFlushed=function(e){return!0},t.prototype.onLinesChanged=function(e){return!0},t.prototype.onLinesDeleted=function(e){return!0},t.prototype.onLinesInserted=function(e){return!0},t.prototype.onScrollChanged=function(e){return this._scrollLeft=e.scrollLeft,this._scrollTop=e.scrollTop,!0},t.prototype.onZonesChanged=function(e){return!0},t.prototype.isFocused=function(){return this._textAreaInput.isFocused()},t.prototype.focusTextArea=function(){this._textAreaInput.focusTextArea()},t.prototype.setAriaActiveDescendant=function(e){e?(this.textArea.setAttribute("role","combobox"),this.textArea.getAttribute("aria-activedescendant")!==e&&(this.textArea.setAttribute("aria-haspopup","true"),this.textArea.setAttribute("aria-activedescendant",e))):(this.textArea.setAttribute("role","textbox"),this.textArea.removeAttribute("aria-activedescendant"),this.textArea.removeAttribute("aria-haspopup"))},t.prototype.prepareRender=function(e){if(2===this._accessibilitySupport)this._primaryCursorVisibleRange=null;else{var t=new u.Position(this._selections[0].positionLineNumber,this._selections[0].positionColumn);this._primaryCursorVisibleRange=e.visibleRangeForPosition(t)}},t.prototype.render=function(e){this._textAreaInput.writeScreenReaderContent("render"),this._render()},t.prototype._render=function(){if(this._visibleTextArea)this._renderInsideEditor(this._visibleTextArea.top-this._scrollTop,this._contentLeft+this._visibleTextArea.left-this._scrollLeft,this._visibleTextArea.width,this._lineHeight,!0);else if(this._primaryCursorVisibleRange){var e=this._contentLeft+this._primaryCursorVisibleRange.left-this._scrollLeft;if(ethis._contentLeft+this._contentWidth)this._renderAtTopLeft();else{var t=this._context.viewLayout.getVerticalOffsetForLineNumber(this._selections[0].positionLineNumber)-this._scrollTop;t<0||t>this._contentHeight?this._renderAtTopLeft():this._renderInsideEditor(t,e,C?0:1,C?0:1,!1)}}else this._renderAtTopLeft()},t.prototype._renderInsideEditor=function(e,t,n,i,o){var r=this.textArea,s=this.textAreaCover;o?l.Configuration.applyFontInfo(r,this._fontInfo):(r.setFontSize(1),r.setLineHeight(this._fontInfo.lineHeight)),r.setTop(e),r.setLeft(t),r.setWidth(n),r.setHeight(i),s.setTop(0),s.setLeft(0),s.setWidth(0),s.setHeight(0)},t.prototype._renderAtTopLeft=function(){var e=this.textArea,t=this.textAreaCover;if(l.Configuration.applyFontInfo(e,this._fontInfo),e.setTop(0),e.setLeft(0),t.setTop(0),t.setLeft(0),C)return e.setWidth(0),e.setHeight(0),t.setWidth(0),void t.setHeight(0);e.setWidth(1),e.setHeight(1),t.setWidth(1),t.setHeight(1),this._context.configuration.editor.viewInfo.glyphMargin?t.setClassName("monaco-editor-background textAreaCover "+p.Margin.CLASS_NAME):this._context.configuration.editor.viewInfo.renderLineNumbers?t.setClassName("monaco-editor-background textAreaCover "+g.LineNumbersOverlay.CLASS_NAME):t.setClassName("monaco-editor-background textAreaCover")},t}(h.ViewPart);t.TextAreaHandler=b}),define(d[502],h([1,0,27,35,14,37,4,299]),function(e,t,n,i,o,r,s){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var a=function(e){function t(t){var i=e.call(this,t)||this;return i.domNode=n.createFastDomNode(document.createElement("div")),i.domNode.setAttribute("role","presentation"),i.domNode.setAttribute("aria-hidden","true"),i.domNode.setClassName("view-rulers"),i._renderedRulers=[],i._rulers=i._context.configuration.editor.viewInfo.rulers,i._height=i._context.configuration.editor.layoutInfo.contentHeight,i._typicalHalfwidthCharacterWidth=i._context.configuration.editor.fontInfo.typicalHalfwidthCharacterWidth,i}return f(t,e),t.prototype.dispose=function(){e.prototype.dispose.call(this)},t.prototype.onConfigurationChanged=function(e){return!!(e.viewInfo||e.layoutInfo||e.fontInfo)&&(this._rulers=this._context.configuration.editor.viewInfo.rulers,this._height=this._context.configuration.editor.layoutInfo.contentHeight,this._typicalHalfwidthCharacterWidth=this._context.configuration.editor.fontInfo.typicalHalfwidthCharacterWidth,!0)},t.prototype.onScrollChanged=function(e){return e.scrollHeightChanged},t.prototype.prepareRender=function(e){},t.prototype._ensureRulersCount=function(){var e=this._renderedRulers.length,t=this._rulers.length;if(e!==t)if(e0;)(a=n.createFastDomNode(document.createElement("div"))).setClassName("view-ruler"),a.setWidth(i),this.domNode.appendChild(a),this._renderedRulers.push(a),o--;else for(var r=e-t;r>0;){var a=this._renderedRulers.pop();this.domNode.removeChild(a),r--}},t.prototype.render=function(e){this._ensureRulersCount();for(var t=0,n=this._rulers.length;tt.length)for(var a=this._secondaryCursors.length-t.length,r=0;r0){var _=e[r-1];m=0===_.originalEndLineNumber?_.originalStartLineNumber+1:_.originalEndLineNumber+1,v=0===_.modifiedEndLineNumber?_.modifiedStartLineNumber+1:_.modifiedEndLineNumber+1}var y=f-3+1,C=g-3+1;yL&&(M+=k=L-M,T+=k),T>x){var k=x-T;M+=k,T+=k}h[p++]=new S(b,M,w,T),i[o++]=new E(h)}for(var I=i[0].entries,D=[],O=0,r=1,s=i.length;rg)&&(g=b),0!==w&&(0===m||wv)&&(v=S)}var E=document.createElement("div");E.className="diff-review-row";var L=document.createElement("div");L.className="diff-review-cell diff-review-summary",L.appendChild(document.createTextNode(d+1+"/"+this._diffs.length+": @@ -"+f+","+(g-f+1)+" +"+m+","+(v-m+1)+" @@")),E.setAttribute("data-line",String(m)),E.setAttribute("aria-label",n.localize(1,null,d+1,this._diffs.length,f,g-f+1,m,v-m+1)),E.appendChild(L),E.setAttribute("role","listitem"),p.appendChild(E);for(var x=m,_=0,y=h.length;_=i)s.push(a),o++;else{var u=t[n],l=u.compareTo(a);l<0?n++:l>0?(s.push(a),o++):(s.push(u),n++,o++)}}this._zones=s},e.prototype.setLineHeight=function(e){return this._lineHeight!==e&&(this._lineHeight=e,this._colorZonesInvalid=!0,!0)},e.prototype.setPixelRatio=function(e){this._pixelRatio=e,this._colorZonesInvalid=!0},e.prototype.getDOMWidth=function(){return this._domWidth},e.prototype.getCanvasWidth=function(){return this._domWidth*this._pixelRatio},e.prototype.setDOMWidth=function(e){return this._domWidth!==e&&(this._domWidth=e,this._colorZonesInvalid=!0,!0)},e.prototype.getDOMHeight=function(){return this._domHeight},e.prototype.getCanvasHeight=function(){return this._domHeight*this._pixelRatio},e.prototype.setDOMHeight=function(e){return this._domHeight!==e&&(this._domHeight=e,this._colorZonesInvalid=!0,!0)},e.prototype.getOuterHeight=function(){return this._outerHeight},e.prototype.setOuterHeight=function(e){return this._outerHeight!==e&&(this._outerHeight=e,this._colorZonesInvalid=!0,!0)},e.prototype.setMaximumHeight=function(e){return this._maximumHeight!==e&&(this._maximumHeight=e,this._colorZonesInvalid=!0,!0)},e.prototype.setMinimumHeight=function(e){return this._minimumHeight!==e&&(this._minimumHeight=e,this._colorZonesInvalid=!0,!0)},e.prototype.setThemeType=function(e){return this._themeType!==e&&(this._themeType=e,this._colorZonesInvalid=!0,!0)},e.prototype.resolveColorZones=function(){for(var e=this._colorZonesInvalid,t=Math.floor(this._lineHeight),n=Math.floor(this.getCanvasHeight()),i=Math.floor(this._maximumHeight*this._pixelRatio),o=Math.floor(this._minimumHeight*this._pixelRatio),r=this._themeType,s=n/Math.floor(this._outerHeight),a=[],u=0,l=this._zones.length;u_)for(var y=c.startLineNumber;y<=c.endLineNumber;y++)v=(m=Math.floor(this._getVerticalOffsetForLine(y)))+t,m=Math.floor(m*s),v=Math.floor(v*s),f.push(this.createZone(n,m,v,o,i,c.getColor(r),c.position));else f.push(this.createZone(n,m,v,o,_,c.getColor(r),c.position))}c.setColorZones(f);for(var h=0,p=f.length;hr/2&&(l=r/2),le&&(u=e-l);var c=this._color2Id[s];return c||(c=++this._lastAssignedId,this._color2Id[s]=c,this._id2Color[c]=s),new i(u-l,u+l,c,a)},e}();t.OverviewZoneManager=r}),define(d[190],h([1,0,27,20,140,14]),function(e,t,n,i,o,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var s=function(){function e(e,t,i,s,a,u,l,c){this._canvasLeftOffset=e,this._domNode=n.createFastDomNode(document.createElement("canvas")),this._domNode.setClassName(t),this._domNode.setPosition("absolute"),this._domNode.setLayerHinting(!0),this._lanesCount=3,this._background=null,this._zoneManager=new o.OverviewZoneManager(c),this._zoneManager.setMinimumHeight(u),this._zoneManager.setMaximumHeight(l),this._zoneManager.setThemeType(r.LIGHT),this._zoneManager.setDOMWidth(0),this._zoneManager.setDOMHeight(0),this._zoneManager.setOuterHeight(i),this._zoneManager.setLineHeight(s),this._zoneManager.setPixelRatio(a)}return e.prototype.dispose=function(){this._zoneManager=null},e.prototype.setLayout=function(e,t){this._domNode.setTop(e.top),this._domNode.setRight(e.right);var n=!1;n=this._zoneManager.setDOMWidth(e.width)||n,(n=this._zoneManager.setDOMHeight(e.height)||n)&&(this._domNode.setWidth(this._zoneManager.getDOMWidth()),this._domNode.setHeight(this._zoneManager.getDOMHeight()),this._domNode.domNode.width=this._zoneManager.getCanvasWidth(),this._domNode.domNode.height=this._zoneManager.getCanvasHeight(),t&&this.render(!0))},e.prototype.getLanesCount=function(){return this._lanesCount},e.prototype.setLanesCount=function(e,t){this._lanesCount=e,t&&this.render(!0)},e.prototype.setThemeType=function(e,t){this._zoneManager.setThemeType(e),t&&this.render(!0)},e.prototype.setUseBackground=function(e,t){this._background=e,t&&this.render(!0)},e.prototype.getDomNode=function(){return this._domNode.domNode},e.prototype.getPixelWidth=function(){return this._zoneManager.getCanvasWidth()},e.prototype.getPixelHeight=function(){return this._zoneManager.getCanvasHeight()},e.prototype.setScrollHeight=function(e,t){this._zoneManager.setOuterHeight(e),t&&this.render(!0)},e.prototype.setLineHeight=function(e,t){this._zoneManager.setLineHeight(e),t&&this.render(!0)},e.prototype.setPixelRatio=function(e,t){this._zoneManager.setPixelRatio(e),this._domNode.setWidth(this._zoneManager.getDOMWidth()),this._domNode.setHeight(this._zoneManager.getDOMHeight()),this._domNode.domNode.width=this._zoneManager.getCanvasWidth(),this._domNode.domNode.height=this._zoneManager.getCanvasHeight(),t&&this.render(!0)},e.prototype.setZones=function(e,t){this._zoneManager.setZones(e),t&&this.render(!1)},e.prototype.render=function(e){if(0===this._zoneManager.getOuterHeight())return!1;var t=this._zoneManager.getCanvasWidth(),n=this._zoneManager.getCanvasHeight(),i=this._zoneManager.resolveColorZones(),o=this._zoneManager.getId2Color(),r=this._domNode.domNode.getContext("2d");if(null===this._background?r.clearRect(0,0,t,n):(r.fillStyle=this._background.toRGBHex(),r.fillRect(0,0,t,n)),i.length>0){var s=t-this._canvasLeftOffset;this._lanesCount>=3?this._renderThreeLanes(r,i,o,s):2===this._lanesCount?this._renderTwoLanes(r,i,o,s):1===this._lanesCount&&this._renderOneLane(r,i,o,s)}return!0},e.prototype._renderOneLane=function(e,t,n,o){this._renderVerticalPatch(e,t,n,i.OverviewRulerLane.Left|i.OverviewRulerLane.Center|i.OverviewRulerLane.Right,this._canvasLeftOffset,o)},e.prototype._renderTwoLanes=function(e,t,n,o){var r=Math.floor(o/2),s=o-r,a=this._canvasLeftOffset,u=this._canvasLeftOffset+r;this._renderVerticalPatch(e,t,n,i.OverviewRulerLane.Left|i.OverviewRulerLane.Center,a,r),this._renderVerticalPatch(e,t,n,i.OverviewRulerLane.Right,u,s)},e.prototype._renderThreeLanes=function(e,t,n,o){var r=Math.floor(o/3),s=Math.floor(o/3),a=o-r-s,u=this._canvasLeftOffset,l=this._canvasLeftOffset+r,c=this._canvasLeftOffset+r+a;this._renderVerticalPatch(e,t,n,i.OverviewRulerLane.Left,u,r),this._renderVerticalPatch(e,t,n,i.OverviewRulerLane.Center,l,a),this._renderVerticalPatch(e,t,n,i.OverviewRulerLane.Right,c,s)},e.prototype._renderVerticalPatch=function(e,t,n,i,o,r){for(var s=0,a=0,u=0,l=0,c=t.length;l=p?u=Math.max(u,f):(e.fillRect(o,a,r,u-a),a=p,u=f)}}e.fillRect(o,a,r,u-a)},e}();t.OverviewRulerImpl=s}),define(d[507],h([1,0,20,35,190,17,140,37,32]),function(e,t,n,i,o,r,s,a,u){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var l=function(e){function t(n){var i=e.call(this,n)||this;return i._overviewRuler=new o.OverviewRulerImpl(1,"decorationsOverviewRuler",i._context.viewLayout.getScrollHeight(),i._context.configuration.editor.lineHeight,i._context.configuration.editor.pixelRatio,t.MIN_DECORATION_HEIGHT,t.MAX_DECORATION_HEIGHT,function(e){return i._context.viewLayout.getVerticalOffsetForLineNumber(e)}),i._overviewRuler.setLanesCount(i._context.configuration.editor.viewInfo.overviewRulerLanes,!1),i._overviewRuler.setLayout(i._context.configuration.editor.layoutInfo.overviewRuler,!1),i._renderBorder=i._context.configuration.editor.viewInfo.overviewRulerBorder,i._updateColors(),i._updateBackground(!1),i._tokensColorTrackerListener=r.TokenizationRegistry.onDidChange(function(e){e.changedColorMap&&i._updateBackground(!0)}),i._shouldUpdateDecorations=!0,i._zonesFromDecorations=[],i._shouldUpdateCursorPosition=!0,i._hideCursor=i._context.configuration.editor.viewInfo.hideCursorInOverviewRuler,i._zonesFromCursors=[],i._cursorPositions=[],i}return f(t,e),t.prototype.dispose=function(){e.prototype.dispose.call(this),this._overviewRuler.dispose(),this._tokensColorTrackerListener.dispose()},t.prototype._updateBackground=function(e){var t=this._context.configuration.editor.viewInfo.minimap.enabled;this._overviewRuler.setUseBackground(t?r.TokenizationRegistry.getDefaultBackground():null,e)},t.prototype.onConfigurationChanged=function(e){var t=this._overviewRuler.getLanesCount(),n=this._context.configuration.editor.viewInfo.overviewRulerLanes;return t!==n&&this._overviewRuler.setLanesCount(n,!1),e.lineHeight&&this._overviewRuler.setLineHeight(this._context.configuration.editor.lineHeight,!1),e.pixelRatio&&this._overviewRuler.setPixelRatio(this._context.configuration.editor.pixelRatio,!1),e.viewInfo&&(this._renderBorder=this._context.configuration.editor.viewInfo.overviewRulerBorder,this._hideCursor=this._context.configuration.editor.viewInfo.hideCursorInOverviewRuler,this._shouldUpdateCursorPosition=!0,this._updateBackground(!1)),e.layoutInfo&&this._overviewRuler.setLayout(this._context.configuration.editor.layoutInfo.overviewRuler,!1),!0},t.prototype.onCursorStateChanged=function(e){this._shouldUpdateCursorPosition=!0,this._cursorPositions=[];for(var t=0,n=e.selections.length;t0&&(this._zonesFromDecorations.length>0||this._zonesFromCursors.length>0)){var n=this._overviewRuler.getDomNode().getContext("2d");n.beginPath(),n.lineWidth=1,n.strokeStyle=this._borderColor,n.moveTo(0,0),n.lineTo(0,this._overviewRuler.getPixelHeight()),n.stroke(),n.moveTo(0,0),n.lineTo(this._overviewRuler.getPixelWidth(),0),n.stroke()}},t.MIN_DECORATION_HEIGHT=6,t.MAX_DECORATION_HEIGHT=60,t}(i.ViewPart);t.DecorationsOverviewRuler=l}),define(d[508],h([1,0,82,190]),function(e,t,n,i){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var o=function(e){function t(t,n,o,r){var s=e.call(this)||this;return s._context=t,s._overviewRuler=new i.OverviewRulerImpl(0,n,s._context.viewLayout.getScrollHeight(),s._context.configuration.editor.lineHeight,s._context.configuration.editor.pixelRatio,o,r,function(e){return s._context.viewLayout.getVerticalOffsetForLineNumber(e)}),s._context.addEventHandler(s),s}return f(t,e),t.prototype.dispose=function(){this._context.removeEventHandler(this),this._overviewRuler.dispose(),e.prototype.dispose.call(this)},t.prototype.onConfigurationChanged=function(e){return e.lineHeight&&this._overviewRuler.setLineHeight(this._context.configuration.editor.lineHeight,!0),e.pixelRatio&&this._overviewRuler.setPixelRatio(this._context.configuration.editor.pixelRatio,!0),!0},t.prototype.onFlushed=function(e){return!0},t.prototype.onScrollChanged=function(t){return this._overviewRuler.setScrollHeight(t.scrollHeight,!0),e.prototype.onScrollChanged.call(this,t)||t.scrollHeightChanged},t.prototype.onZonesChanged=function(e){return!0},t.prototype.getDomNode=function(){return this._overviewRuler.getDomNode()},t.prototype.setLayout=function(e){this._overviewRuler.setLayout(e,!0)},t.prototype.setZones=function(e){this._overviewRuler.setZones(e,!0)},t}(n.ViewEventHandler);t.OverviewRuler=o}),define(d[509],h([1,0,10,4,27,2,82,501,490,449,217,443,230,497,498,231,113,188,499,492,182,233,235,236,507,508,502,494,495,503,237,35,216,78,491,221,486,493,57,14]),function(e,t,n,i,o,r,s,a,u,l,c,d,h,p,g,m,v,_,y,C,b,w,S,E,L,x,N,M,T,k,I,D,O,R,P,A,F,W,B,V){"use strict";function H(e){try{return e()}catch(e){n.onUnexpectedError(e)}}function z(e,t){try{return e(t)}catch(e){n.onUnexpectedError(e)}}Object.defineProperty(t,"__esModule",{value:!0});var K=function(e){function t(t,n,i,o,r,s){var d=e.call(this)||this;d._isDisposed=!1,d._cursor=r,d._renderAnimationFrame=null,d.outgoingEvents=new P.ViewOutgoingEvents(o);var h=new l.ViewController(n,o,s,d.outgoingEvents,t);return d.eventDispatcher=new c.ViewEventDispatcher(function(e){return d._renderOnce(e)}),d.eventDispatcher.addEventHandler(d),d._context=new O.ViewContext(n,i.getTheme(),o,d.eventDispatcher),d._register(i.onThemeChange(function(e){d._context.theme=e,d.eventDispatcher.emit(new B.ViewThemeChangedEvent),d.render(!0,!1)})),d.viewParts=[],d._textAreaHandler=new a.TextAreaHandler(d._context,h,d.createTextAreaHandlerHelper()),d.viewParts.push(d._textAreaHandler),d.createViewParts(),d._setLayout(),d.pointerHandler=new u.PointerHandler(d._context,h,d.createPointerHandlerHelper()),d._register(o.addEventListener(function(e){d.eventDispatcher.emitMany(e)})),d._register(d._cursor.addEventListener(function(e){d.eventDispatcher.emitMany(e)})),d}return f(t,e),t.prototype.createViewParts=function(){this.linesContent=o.createFastDomNode(document.createElement("div")),this.linesContent.setClassName("lines-content monaco-editor-background"),this.linesContent.setPosition("absolute"),this.domNode=o.createFastDomNode(document.createElement("div")),this.domNode.setClassName(this.getEditorClassName()),this.overflowGuardContainer=o.createFastDomNode(document.createElement("div")),D.PartFingerprints.write(this.overflowGuardContainer,3),this.overflowGuardContainer.setClassName("overflow-guard"),this._scrollbar=new F.EditorScrollbar(this._context,this.linesContent,this.domNode,this.overflowGuardContainer),this.viewParts.push(this._scrollbar),this.viewLines=new C.ViewLines(this._context,this.linesContent),this.viewZones=new I.ViewZones(this._context),this.viewParts.push(this.viewZones);var e=new L.DecorationsOverviewRuler(this._context);this.viewParts.push(e);var t=new M.ScrollDecorationViewPart(this._context);this.viewParts.push(t);var n=new d.ContentViewOverlays(this._context);this.viewParts.push(n),n.addDynamicOverlay(new p.CurrentLineHighlightOverlay(this._context)),n.addDynamicOverlay(new T.SelectionsOverlay(this._context)),n.addDynamicOverlay(new m.DecorationsOverlay(this._context)),n.addDynamicOverlay(new y.IndentGuidesOverlay(this._context));var i=new d.MarginViewOverlays(this._context);this.viewParts.push(i),i.addDynamicOverlay(new g.CurrentLineMarginHighlightOverlay(this._context)),i.addDynamicOverlay(new v.GlyphMarginOverlay(this._context)),i.addDynamicOverlay(new S.MarginViewLineDecorationsOverlay(this._context)),i.addDynamicOverlay(new w.LinesDecorationsOverlay(this._context)),i.addDynamicOverlay(new _.LineNumbersOverlay(this._context));var r=new b.Margin(this._context);r.getDomNode().appendChild(this.viewZones.marginDomNode),r.getDomNode().appendChild(i.getDomNode()),this.viewParts.push(r),this.contentWidgets=new h.ViewContentWidgets(this._context,this.domNode),this.viewParts.push(this.contentWidgets),this.viewCursors=new k.ViewCursors(this._context),this.viewParts.push(this.viewCursors),this.overlayWidgets=new E.ViewOverlayWidgets(this._context),this.viewParts.push(this.overlayWidgets);var s=new N.Rulers(this._context);this.viewParts.push(s);var a=new W.Minimap(this._context);if(this.viewParts.push(a),e){var u=this._scrollbar.getOverviewRulerLayoutInfo();u.parent.insertBefore(e.getDomNode(),u.insertBefore)}this.linesContent.appendChild(n.getDomNode()),this.linesContent.appendChild(s.domNode),this.linesContent.appendChild(this.viewZones.domNode),this.linesContent.appendChild(this.viewLines.getDomNode()),this.linesContent.appendChild(this.contentWidgets.domNode),this.linesContent.appendChild(this.viewCursors.getDomNode()),this.overflowGuardContainer.appendChild(r.getDomNode()),this.overflowGuardContainer.appendChild(this._scrollbar.getDomNode()),this.overflowGuardContainer.appendChild(t.getDomNode()),this.overflowGuardContainer.appendChild(this._textAreaHandler.textArea),this.overflowGuardContainer.appendChild(this._textAreaHandler.textAreaCover),this.overflowGuardContainer.appendChild(this.overlayWidgets.getDomNode()),this.overflowGuardContainer.appendChild(a.getDomNode()),this.domNode.appendChild(this.overflowGuardContainer),this.domNode.appendChild(this.contentWidgets.overflowingContentWidgetsDomNode)},t.prototype._flushAccumulatedAndRenderNow=function(){this._renderNow()},t.prototype.createPointerHandlerHelper=function(){var e=this;return{viewDomNode:this.domNode.domNode,linesContentDomNode:this.linesContent.domNode,focusTextArea:function(){e.focus()},getLastViewCursorsRenderData:function(){return e.viewCursors.getLastRenderData()||[]},shouldSuppressMouseDownOnViewZone:function(t){return e.viewZones.shouldSuppressMouseDownOnViewZone(t)},shouldSuppressMouseDownOnWidget:function(t){return e.contentWidgets.shouldSuppressMouseDownOnWidget(t)},getPositionFromDOMInfo:function(t,n){return e._flushAccumulatedAndRenderNow(),e.viewLines.getPositionFromDOMInfo(t,n)},visibleRangeForPosition2:function(t,n){e._flushAccumulatedAndRenderNow();var i=e.viewLines.visibleRangesForRange2(new r.Range(t,n,t,n));return i?i[0]:null},getLineWidth:function(t){return e._flushAccumulatedAndRenderNow(),e.viewLines.getLineWidth(t)}}},t.prototype.createTextAreaHandlerHelper=function(){var e=this;return{visibleRangeForPositionRelativeToEditor:function(t,n){e._flushAccumulatedAndRenderNow();var i=e.viewLines.visibleRangesForRange2(new r.Range(t,n,t,n));return i?i[0]:null}}},t.prototype._setLayout=function(){var e=this._context.configuration.editor.layoutInfo;this.domNode.setWidth(e.width),this.domNode.setHeight(e.height),this.overflowGuardContainer.setWidth(e.width),this.overflowGuardContainer.setHeight(e.height),this.linesContent.setWidth(1e6),this.linesContent.setHeight(1e6)},t.prototype.getEditorClassName=function(){return this._context.configuration.editor.editorClassName+" "+V.getThemeTypeSelector(this._context.theme.type)},t.prototype.onConfigurationChanged=function(e){return e.editorClassName&&this.domNode.setClassName(this.getEditorClassName()),e.layoutInfo&&this._setLayout(),!1},t.prototype.onFocusChanged=function(e){return this.domNode.toggleClassName("focused",e.isFocused),e.isFocused?this.outgoingEvents.emitViewFocusGained():this.outgoingEvents.emitViewFocusLost(),!1},t.prototype.onScrollChanged=function(e){return this.outgoingEvents.emitScrollChanged(e),!1},t.prototype.onThemeChanged=function(e){return this.domNode.setClassName(this.getEditorClassName()),!1},t.prototype.dispose=function(){this._isDisposed=!0,null!==this._renderAnimationFrame&&(this._renderAnimationFrame.dispose(),this._renderAnimationFrame=null),this.eventDispatcher.removeEventHandler(this),this.outgoingEvents.dispose(),this.pointerHandler.dispose(),this.viewLines.dispose();for(var t=0,n=this.viewParts.length;t");m.registerThemingParticipant(function(e,t){var n=e.getColor(_.editorErrorBorder);n&&t.addRule(".monaco-editor .redsquiggly { border-bottom: 4px double "+n+"; }");var i=e.getColor(_.editorErrorForeground);i&&t.addRule('.monaco-editor .redsquiggly { background: url("data:image/svg+xml,'+C(i)+'") repeat-x bottom left; }');var o=e.getColor(_.editorWarningBorder);o&&t.addRule(".monaco-editor .greensquiggly { border-bottom: 4px double "+o+"; }");var r=e.getColor(_.editorWarningForeground);r&&t.addRule('.monaco-editor .greensquiggly { background: url("data:image/svg+xml;utf8,'+C(r)+'") repeat-x bottom left; }')})}),define(d[141],h([1,0,16,31,19,42,191,13,30,14]),function(e,t,n,i,o,r,s,a,u,l){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var c=function(e){function t(t,n,i,o,r,s,a){return e.call(this,t,n,i,o,r,s,a)||this}return f(t,e),t.prototype._getContributions=function(){return[].concat(u.EditorBrowserRegistry.getEditorContributions()).concat(a.CommonEditorRegistry.getEditorContributions())},t.prototype._getActions=function(){return a.CommonEditorRegistry.getEditorActions()},t=v([y(2,n.IInstantiationService),y(3,r.ICodeEditorService),y(4,i.ICommandService),y(5,o.IContextKeyService),y(6,l.IThemeService)],t)}(s.CodeEditorWidget);t.CodeEditor=c}),define(d[193],h([1,0,302,18,3,26,4,36,27,99,16,19,42,2,20,61,138,106,141,90,66,86,84,11,49,14,23,140,34,504,50,308]),function(e,t,n,i,o,r,s,a,u,l,c,d,h,p,g,m,_,C,b,w,S,E,L,x,N,M,T,k,I,D,O){"use strict";function R(e,t,n,i,o){return{range:new p.Range(e,t,n,i),options:o}}function P(e){return e.modifiedEndLineNumber>0}function A(e){return e.originalEndLineNumber>0}function F(){var e=document.createElement("div");return e.className="diagonal-fill",e}Object.defineProperty(t,"__esModule",{value:!0});var W=function(){function e(){this._zones=[],this._zonesMap={},this._decorations=[]}return e.prototype.getForeignViewZones=function(e){var t=this;return e.filter(function(e){return!t._zonesMap[String(e.id)]})},e.prototype.clean=function(e){var t=this;this._zones.length>0&&e.changeViewZones(function(e){for(var n=0,i=t._zones.length;n0&&e.changeDecorations(function(e){e.deltaDecorations(t._decorations,[])}),this._decorations=[]},e.prototype.apply=function(e,t,n){var i=this;e.changeViewZones(function(e){for(var t=0,o=i._zones.length;t0?o/n:0;return{height:Math.max(0,Math.floor(e.contentHeight*r)),top:Math.floor(t*r)}},t.prototype._createDataSource=function(){var e=this;return{getWidth:function(){return e._width},getHeight:function(){return e._height-e._reviewHeight},getContainerDomNode:function(){return e._containerDomElement},relayoutEditors:function(){e._doLayout()},getOriginalEditor:function(){return e.originalEditor},getModifiedEditor:function(){return e.modifiedEditor}}},t.prototype._setStrategy=function(e){this._strategy&&this._strategy.dispose(),this._strategy=e,e.applyColors(this._themeService.getTheme()),this._lineChanges&&this._updateDecorations(),this._measureDomElement(!0)},t.prototype._getLineChangeAtOrBeforeLineNumber=function(e,t){if(0===this._lineChanges.length||e=s?n=o+1:(n=o,i=o)}return this._lineChanges[n]},t.prototype._getEquivalentLineForOriginalLineNumber=function(e){var t=this._getLineChangeAtOrBeforeLineNumber(e,function(e){return e.originalStartLineNumber});if(!t)return e;var n=t.originalStartLineNumber+(t.originalEndLineNumber>0?-1:0),i=t.modifiedStartLineNumber+(t.modifiedEndLineNumber>0?-1:0),o=t.originalEndLineNumber>0?t.originalEndLineNumber-t.originalStartLineNumber+1:0,r=t.modifiedEndLineNumber>0?t.modifiedEndLineNumber-t.modifiedStartLineNumber+1:0,s=e-n;return s<=o?i+Math.min(s,r):i+r-o+s},t.prototype._getEquivalentLineForModifiedLineNumber=function(e){var t=this._getLineChangeAtOrBeforeLineNumber(e,function(e){return e.modifiedStartLineNumber});if(!t)return e;var n=t.originalStartLineNumber+(t.originalEndLineNumber>0?-1:0),i=t.modifiedStartLineNumber+(t.modifiedEndLineNumber>0?-1:0),o=t.originalEndLineNumber>0?t.originalEndLineNumber-t.originalStartLineNumber+1:0,r=t.modifiedEndLineNumber>0?t.modifiedEndLineNumber-t.modifiedStartLineNumber+1:0,s=e-i;return s<=r?n+Math.min(s,o):n+o-r+s},t.prototype.getDiffLineInformationForOriginal=function(e){return this._lineChanges?{equivalentLineNumber:this._getEquivalentLineForOriginalLineNumber(e)}:null},t.prototype.getDiffLineInformationForModified=function(e){return this._lineChanges?{equivalentLineNumber:this._getEquivalentLineForModifiedLineNumber(e)}:null},t.ONE_OVERVIEW_WIDTH=15,t.ENTIRE_DIFF_OVERVIEW_WIDTH=30,t.UPDATE_DIFF_DECORATIONS_DELAY=200,t=v([y(2,m.IEditorWorkerService),y(3,d.IContextKeyService),y(4,c.IInstantiationService),y(5,h.ICodeEditorService),y(6,M.IThemeService),y(7,O.IMessageService)],t)}(o.Disposable);t.DiffEditorWidget=V;var H=function(e){function t(t){var n=e.call(this)||this;return n._dataSource=t,n}return f(t,e),t.prototype.applyColors=function(e){var t=(e.getColor(T.diffInserted)||T.defaultInsertColor).transparent(2),n=(e.getColor(T.diffRemoved)||T.defaultRemoveColor).transparent(2),i=!t.equals(this._insertColor)||!n.equals(this._removeColor);return this._insertColor=t,this._removeColor=n,i},t.prototype.getEditorsDiffDecorations=function(e,t,n,i,o,r,s){o=o.sort(function(e,t){return e.afterLineNumber-t.afterLineNumber}),i=i.sort(function(e,t){return e.afterLineNumber-t.afterLineNumber});var a=this._getViewZones(e,i,o,r,s,n),u=this._getOriginalEditorDecorations(e,t,n,r,s),l=this._getModifiedEditorDecorations(e,t,n,r,s);return{original:{decorations:u.decorations,overviewZones:u.overviewZones,zones:a.original},modified:{decorations:l.decorations,overviewZones:l.overviewZones,zones:a.modified}}},t.prototype._getViewZones=function(e,t,n,i,o,r){return null},t.prototype._getOriginalEditorDecorations=function(e,t,n,i,o){return null},t.prototype._getModifiedEditorDecorations=function(e,t,n,i,o){return null},t}(o.Disposable),z=function(){function e(e){this._source=e,this._index=-1,this.advance()}return e.prototype.advance=function(){this._index++,this._index0){var n=e[e.length-1];if(n.afterLineNumber===t.afterLineNumber&&null===n.domNode)return void(n.heightInLines+=t.heightInLines)}e.push(t)},l=new z(this.modifiedForeignVZ),c=new z(this.originalForeignVZ),d=0,h=this.lineChanges.length;d<=h;d++){var p=d0?-1:0),o=p.modifiedStartLineNumber+(p.modifiedEndLineNumber>0?-1:0),n=p.originalEndLineNumber>0?p.originalEndLineNumber-p.originalStartLineNumber+1:0,t=p.modifiedEndLineNumber>0?p.modifiedEndLineNumber-p.modifiedStartLineNumber+1:0,r=Math.max(p.originalStartLineNumber,p.originalEndLineNumber),s=Math.max(p.modifiedStartLineNumber,p.modifiedEndLineNumber)):(r=i+=1e7+n,s=o+=1e7+t);for(var f=[],g=[];l.current&&l.current.afterLineNumber<=s;){m=void 0;m=l.current.afterLineNumber<=o?i-o+l.current.afterLineNumber:r,f.push({afterLineNumber:m,heightInLines:l.current.heightInLines,domNode:null}),l.advance()}for(;c.current&&c.current.afterLineNumber<=r;){var m=void 0;m=c.current.afterLineNumber<=i?o-i+c.current.afterLineNumber:s,g.push({afterLineNumber:m,heightInLines:c.current.heightInLines,domNode:null}),c.advance()}if(null!==p&&P(p)&&(v=this._produceOriginalFromDiff(p,n,t))&&f.push(v),null!==p&&A(p)){var v=this._produceModifiedFromDiff(p,n,t);v&&g.push(v)}var _=0,y=0;for(f=f.sort(a),g=g.sort(a);_=b.heightInLines?(C.heightInLines-=b.heightInLines,y++):(b.heightInLines-=C.heightInLines,_++)}for(;_2*t.MINIMUM_EDITOR_WIDTH?(in-t.MINIMUM_EDITOR_WIDTH&&(i=n-t.MINIMUM_EDITOR_WIDTH)):i=o,this._sashPosition!==i&&(this._sashPosition=i,this._sash.layout()),this._sashPosition},t.prototype.onSashDragStart=function(){this._startSashPosition=this._sashPosition},t.prototype.onSashDrag=function(e){var t=this._dataSource.getWidth()-V.ENTIRE_DIFF_OVERVIEW_WIDTH,n=this.layout((this._startSashPosition+(e.currentX-e.startX))/t);this._sashRatio=n/t,this._dataSource.relayoutEditors()},t.prototype.onSashDragEnd=function(){this._sash.layout()},t.prototype.onSashReset=function(){this._sashRatio=.5,this._dataSource.relayoutEditors(),this._sash.layout()},t.prototype.getVerticalSashTop=function(e){return 0},t.prototype.getVerticalSashLeft=function(e){return this._sashPosition},t.prototype.getVerticalSashHeight=function(e){return this._dataSource.getHeight()},t.prototype._getViewZones=function(e,t,n,i,o){return new q(e,t,n).getViewZones()},t.prototype._getOriginalEditorDecorations=function(e,t,n,i,o){for(var r={decorations:[],overviewZones:[]},s=i.getModel(),a=0,u=e.length;at?{afterLineNumber:Math.max(e.originalStartLineNumber,e.originalEndLineNumber),heightInLines:n-t,domNode:null}:null},t.prototype._produceModifiedFromDiff=function(e,t,n){return t>n?{afterLineNumber:Math.max(e.modifiedStartLineNumber,e.modifiedEndLineNumber),heightInLines:t-n,domNode:null}:null},t}(K),G=function(e){function t(t,n){var i=e.call(this,t)||this;return i.decorationsLeft=t.getOriginalEditor().getLayoutInfo().decorationsLeft,i._register(t.getOriginalEditor().onDidLayoutChange(function(e){i.decorationsLeft!==e.decorationsLeft&&(i.decorationsLeft=e.decorationsLeft,t.relayoutEditors())})),i}return f(t,e),t.prototype.dispose=function(){e.prototype.dispose.call(this)},t.prototype.setEnableSplitViewResizing=function(e){},t.prototype._getViewZones=function(e,t,n,i,o,r){return new Y(e,t,n,i,o,r).getViewZones()},t.prototype._getOriginalEditorDecorations=function(e,t,n,i,o){for(var r={decorations:[],overviewZones:[]},s=0,a=e.length;s'])}var f=document.createElement("div");f.className="view-lines line-delete",f.innerHTML=a.join(""),S.Configuration.applyFontInfoSlow(f,this.modifiedEditorConfiguration.fontInfo);var g=document.createElement("div");return g.className="inline-deleted-margin-view-zone",g.innerHTML=u.join(""),S.Configuration.applyFontInfoSlow(g,this.modifiedEditorConfiguration.fontInfo),{shouldNotShrink:!0,afterLineNumber:0===e.modifiedEndLineNumber?e.modifiedStartLineNumber:e.modifiedStartLineNumber-1,heightInLines:t,domNode:f,marginDomNode:g}},t.prototype.renderOriginalLine=function(e,t,n,i,o,r){var s=t.getLineContent(o),a=_.LineDecoration.filter(r,o,1,s.length+1),u=C.renderViewLine(new C.RenderLineInput(n.fontInfo.isMonospace&&!n.viewInfo.disableMonospaceOptimizations,s,t.mightContainRTL(),0,[new w.ViewLineToken(s.length,16793600)],a,i,n.fontInfo.spaceWidth,n.viewInfo.stopRenderingLineAfter,n.viewInfo.renderWhitespace,n.viewInfo.renderControlCharacters,n.viewInfo.fontLigatures)),l=[];return l.push('
    '),(l=l.concat(u.html)).push("
    "),l},t}(K);M.registerThemingParticipant(function(e,t){var n=e.getColor(T.diffInserted);n&&(t.addRule(".monaco-editor .line-insert, .monaco-editor .char-insert { background-color: "+n+"; }"),t.addRule(".monaco-diff-editor .line-insert, .monaco-diff-editor .char-insert { background-color: "+n+"; }"),t.addRule(".monaco-editor .inline-added-margin-view-zone { background-color: "+n+"; }"));var i=e.getColor(T.diffRemoved);i&&(t.addRule(".monaco-editor .line-delete, .monaco-editor .char-delete { background-color: "+i+"; }"),t.addRule(".monaco-diff-editor .line-delete, .monaco-diff-editor .char-delete { background-color: "+i+"; }"),t.addRule(".monaco-editor .inline-deleted-margin-view-zone { background-color: "+i+"; }"));var o=e.getColor(T.diffInsertedOutline);o&&t.addRule(".monaco-editor .line-insert, .monaco-editor .char-insert { border: 1px dashed "+o+"; }");var r=e.getColor(T.diffRemovedOutline);r&&t.addRule(".monaco-editor .line-delete, .monaco-editor .char-delete { border: 1px dashed "+r+"; }");var s=e.getColor(T.scrollbarShadow);s&&t.addRule(".monaco-diff-editor.side-by-side .editor.modified { box-shadow: -6px 0 5px -5px "+s+"; }")})}),define(d[194],h([1,0,26,16,31,19,42,141,14]),function(e,t,n,i,o,r,s,a,u){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var l=function(e){function t(t,n,i,o,r,s,a,u){var l=e.call(this,t,i.getRawConfiguration(),o,r,s,a,u)||this;return l._parentEditor=i,l._overwriteOptions=n,e.prototype.updateOptions.call(l,l._overwriteOptions),l._register(i.onDidChangeConfiguration(function(e){return l._onParentConfigurationChanged(e)})),l}return f(t,e),t.prototype.getParentEditor=function(){return this._parentEditor},t.prototype._onParentConfigurationChanged=function(t){e.prototype.updateOptions.call(this,this._parentEditor.getRawConfiguration()),e.prototype.updateOptions.call(this,this._overwriteOptions)},t.prototype.updateOptions=function(t){n.mixin(this._overwriteOptions,t,!0),e.prototype.updateOptions.call(this,this._overwriteOptions)},t=v([y(3,i.IInstantiationService),y(4,s.ICodeEditorService),y(5,o.ICommandService),y(6,r.IContextKeyService),y(7,u.IThemeService)],t)}(a.CodeEditor);t.EmbeddedCodeEditorWidget=l}),define(d[514],h([1,0,341,3,12,18,20,13,21,14,37,34]),function(e,t,n,i,o,r,s,a,u,l,c,d){"use strict";Object.defineProperty(t,"__esModule",{value:!0});!function(e){function t(){return e.call(this,{id:"editor.action.jumpToBracket",label:n.localize(0,null),alias:"Go to Bracket",precondition:null,kbOpts:{kbExpr:u.EditorContextKeys.textFocus,primary:3160}})||this}f(t,e),t.prototype.run=function(e,t){var n=p.get(t);n&&n.jumpToBracket()},t=v([a.editorAction],t)}(a.EditorAction);var h=function(){return function(e,t){this.position=e,this.brackets=t}}(),p=function(e){function t(t){var n=e.call(this)||this;return n._editor=t,n._lastBracketsData=[],n._lastVersionId=0,n._decorations=[],n._updateBracketsSoon=n._register(new r.RunOnceScheduler(function(){return n._updateBrackets()},50)),n._matchBrackets=n._editor.getConfiguration().contribInfo.matchBrackets,n._updateBracketsSoon.schedule(),n._register(t.onDidChangeCursorPosition(function(e){n._matchBrackets&&n._updateBracketsSoon.schedule()})),n._register(t.onDidChangeModel(function(e){n._decorations=[],n._updateBracketsSoon.schedule()})),n._register(t.onDidChangeConfiguration(function(e){n._matchBrackets=n._editor.getConfiguration().contribInfo.matchBrackets,!n._matchBrackets&&n._decorations.length>0&&(n._decorations=n._editor.deltaDecorations(n._decorations,[])),n._updateBracketsSoon.schedule()})),n}return f(t,e),n=t,t.get=function(e){return e.getContribution(n.ID)},t.prototype.getId=function(){return n.ID},t.prototype.jumpToBracket=function(){var e=this._editor.getModel();if(e){var t=this._editor.getSelection();if(t.isEmpty()){var n=t.getStartPosition(),i=e.matchBracket(n);if(i){var o=null;i[0].containsPosition(n)?o=i[1].getStartPosition():i[1].containsPosition(n)&&(o=i[0].getStartPosition()),o&&(this._editor.setPosition(o),this._editor.revealPosition(o))}}}},t.prototype._updateBrackets=function(){if(this._matchBrackets){this._recomputeBrackets();for(var e=[],t=0,i=0,o=this._lastBracketsData.length;i1&&r.sort(o.Position.compare);for(var c=[],d=0,p=0,f=n.length,a=0,u=r.length;a{1}",n,r),this._commands[n]=i):s=o.format("{0}",r),t.push(s)}this._domNode.innerHTML=t.join(" | "),this._editor.layoutContentWidget(this)}else this._domNode.innerHTML="no commands"},e.prototype.getId=function(){return this._id},e.prototype.getDomNode=function(){return this._domNode},e.prototype.setSymbolRange=function(e){this._symbolRange=e;var t=e.startLineNumber,n=this._editor.getModel().getLineFirstNonWhitespaceColumn(t);this._widgetPosition={position:{lineNumber:t,column:n},preference:[a.ContentWidgetPositionPreference.ABOVE]}},e.prototype.getPosition=function(){return this._widgetPosition},e.prototype.isVisible=function(){return this._domNode.hasAttribute("monaco-visible-content-widget")},e._idPool=0,e}(),f=function(){function e(){this._removeDecorations=[],this._addDecorations=[],this._addDecorationsCallbacks=[]}return e.prototype.addDecoration=function(e,t){this._addDecorations.push(e),this._addDecorationsCallbacks.push(t)},e.prototype.removeDecoration=function(e){this._removeDecorations.push(e)},e.prototype.commit=function(e){for(var t=e.deltaDecorations(this._removeDecorations,this._addDecorations),n=0,i=t.length;n a:hover { color: "+i+" !important; }")})}),define(d[516],h([1,0,18,10,3,7,31,50,17,30,453,515]),function(e,t,n,i,o,r,s,a,u,l,c,d){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var h=function(){function e(e,t,n){var i=this;this._editor=e,this._commandService=t,this._messageService=n,this._isEnabled=this._editor.getConfiguration().contribInfo.codeLens,this._globalToDispose=[],this._localToDispose=[],this._lenses=[],this._currentFindCodeLensSymbolsPromise=null,this._modelChangeCounter=0,this._globalToDispose.push(this._editor.onDidChangeModel(function(){return i._onModelChange()})),this._globalToDispose.push(this._editor.onDidChangeModelLanguage(function(){return i._onModelChange()})),this._globalToDispose.push(this._editor.onDidChangeConfiguration(function(e){var t=i._isEnabled;i._isEnabled=i._editor.getConfiguration().contribInfo.codeLens,t!==i._isEnabled&&i._onModelChange()})),this._globalToDispose.push(u.CodeLensProviderRegistry.onDidChange(this._onModelChange,this)),this._onModelChange()}return t=e,e.prototype.dispose=function(){this._localDispose(),this._globalToDispose=o.dispose(this._globalToDispose)},e.prototype._localDispose=function(){this._currentFindCodeLensSymbolsPromise&&(this._currentFindCodeLensSymbolsPromise.cancel(),this._currentFindCodeLensSymbolsPromise=null,this._modelChangeCounter++),this._currentFindOccPromise&&(this._currentFindOccPromise.cancel(),this._currentFindOccPromise=null),this._localToDispose=o.dispose(this._localToDispose)},e.prototype.getId=function(){return t.ID},e.prototype._onModelChange=function(){var e=this;this._localDispose();var t=this._editor.getModel();if(t&&this._isEnabled&&u.CodeLensProviderRegistry.has(t)){for(var o=0,r=u.CodeLensProviderRegistry.all(t);oi||(n&&n[n.length-1].symbol.range.startLineNumber===u?n.push(a):(n=[a],o.push(n)))}var l=this._editor.getCenteredRangeInViewport(),c=l&&o.length!==this._lenses.length&&0!==this._editor.getScrollTop();this._editor.changeDecorations(function(e){t._editor.changeViewZones(function(n){for(var i=0,r=0,s=new d.CodeLensHelper;rD)return l._domNode.style.maxWidth=e-28-t-15+"px",void(l._replaceInputBox.inputElement.style.width=s.getTotalWidth(l._findInput.inputBox.inputElement)+"px");D+28+t>=e&&(i=!0),D+28+t-O>=e&&(o=!0),D+28+t-O>=e+50&&(n=!0),s.toggleClass(l._domNode,"collapsed-find-widget",n),s.toggleClass(l._domNode,"narrow-find-widget",o),s.toggleClass(l._domNode,"reduced-find-widget",i),o||n||(l._domNode.style.maxWidth=e-28-t-15+"px");var r=s.getTotalWidth(l._findInput.inputBox.inputElement);r>0&&(l._replaceInputBox.inputElement.style.width=r+"px")};return c(),l._register(l._codeEditor.onDidChangeConfiguration(function(e){e.readOnly&&(l._codeEditor.getConfiguration().readOnly&&l._state.change({isReplaceRevealed:!1},!1),l._updateButtons()),e.layoutInfo&&c()})),l._register(l._codeEditor.onDidChangeCursorSelection(function(){l._isVisible&&l._updateToggleSelectionFindButton()})),l._findInputFocussed=g.CONTEXT_FIND_INPUT_FOCUSSED.bindTo(a),l._focusTracker=l._register(s.trackFocus(l._findInput.inputBox.inputElement)),l._focusTracker.addFocusListener(function(){if(l._findInputFocussed.set(!0),l._toggleSelectionFind.checked){var e=l._codeEditor.getSelection();1===e.endColumn&&e.endLineNumber>e.startLineNumber&&(e=e.setEndPosition(e.endLineNumber-1,1));var t=l._state.currentMatch;e.startLineNumber!==e.endLineNumber&&(p.Range.equalsRange(e,t)||l._state.change({searchScope:e},!0))}}),l._focusTracker.addBlurListener(function(){l._findInputFocussed.set(!1)}),l._codeEditor.addOverlayWidget(l),l._viewZone=new A(0),l._applyTheme(u.getTheme()),l._register(u.onThemeChange(l._applyTheme.bind(l))),l._register(l._codeEditor.onDidChangeModel(function(e){l._isVisible&&void 0!==l._viewZoneId&&l._codeEditor.changeViewZones(function(e){e.removeZone(l._viewZoneId),l._viewZoneId=void 0})})),l._register(l._codeEditor.onDidScrollChange(function(e){e.scrollTopChanged?l._layoutViewZone():setTimeout(function(){l._layoutViewZone()},0)})),l}return f(t,e),t.prototype.getId=function(){return t.ID},t.prototype.getDomNode=function(){return this._domNode},t.prototype.getPosition=function(){return this._isVisible?{preference:d.OverlayWidgetPositionPreference.TOP_RIGHT_CORNER}:null},t.prototype._onStateChanged=function(e){if(e.searchString&&(this._findInput.setValue(this._state.searchString),this._updateButtons()),e.replaceString&&(this._replaceInputBox.value=this._state.replaceString),e.isRevealed&&(this._state.isRevealed?this._reveal(!0):this._hide(!0)),e.isReplaceRevealed&&(this._state.isReplaceRevealed?this._codeEditor.getConfiguration().readOnly||this._isReplaceVisible||(this._isReplaceVisible=!0,this._updateButtons()):this._isReplaceVisible&&(this._isReplaceVisible=!1,this._updateButtons())),e.isRegex&&this._findInput.setRegex(this._state.isRegex),e.wholeWord&&this._findInput.setWholeWords(this._state.wholeWord),e.matchCase&&this._findInput.setCaseSensitive(this._state.matchCase),e.searchScope&&(this._state.searchScope?this._toggleSelectionFind.checked=!0:this._toggleSelectionFind.checked=!1,this._updateToggleSelectionFindButton()),e.searchString||e.matchesCount||e.matchesPosition){var t=this._state.searchString.length>0&&0===this._state.matchesCount;s.toggleClass(this._domNode,"no-results",t),this._updateMatchesCount()}(e.searchString||e.currentMatch)&&this._layoutViewZone()},t.prototype._updateMatchesCount=function(){this._matchesCount.style.minWidth=O+"px",this._state.matchesCount>=h.MATCHES_LIMIT?this._matchesCount.title=T:this._matchesCount.title="",this._matchesCount.firstChild&&this._matchesCount.removeChild(this._matchesCount.firstChild);var e;if(this._state.matchesCount>0){var t=String(this._state.matchesCount);this._state.matchesCount>=h.MATCHES_LIMIT&&(t+="+");var n=String(this._state.matchesPosition);"0"===n&&(n="?"),e=r.format(k,n,t)}else e=I;this._matchesCount.appendChild(document.createTextNode(e)),O=Math.max(O,this._matchesCount.clientWidth)},t.prototype._updateToggleSelectionFindButton=function(){var e=this._codeEditor.getSelection(),t=!!e&&(e.startLineNumber!==e.endLineNumber||e.startColumn!==e.endColumn),n=this._toggleSelectionFind.checked;this._toggleSelectionFind.setEnabled(this._isVisible&&(n||t))},t.prototype._updateButtons=function(){this._findInput.setEnabled(this._isVisible),this._replaceInputBox.setEnabled(this._isVisible&&this._isReplaceVisible),this._updateToggleSelectionFindButton(),this._closeBtn.setEnabled(this._isVisible);var e=this._state.searchString.length>0;this._prevBtn.setEnabled(this._isVisible&&e),this._nextBtn.setEnabled(this._isVisible&&e),this._replaceBtn.setEnabled(this._isVisible&&this._isReplaceVisible&&e),this._replaceAllBtn.setEnabled(this._isVisible&&this._isReplaceVisible&&e),s.toggleClass(this._domNode,"replaceToggled",this._isReplaceVisible),this._toggleReplaceBtn.toggleClass("collapse",!this._isReplaceVisible),this._toggleReplaceBtn.toggleClass("expand",this._isReplaceVisible),this._toggleReplaceBtn.setExpanded(this._isReplaceVisible);var t=!this._codeEditor.getConfiguration().readOnly;this._toggleReplaceBtn.setEnabled(this._isVisible&&t)},t.prototype._reveal=function(e){var t=this;if(!this._isVisible){this._isVisible=!0;var n=this._codeEditor.getSelection();!!n&&(n.startLineNumber!==n.endLineNumber||n.startColumn!==n.endColumn)&&this._codeEditor.getConfiguration().contribInfo.find.autoFindInSelection?this._toggleSelectionFind.checked=!0:this._toggleSelectionFind.checked=!1,this._updateButtons(),setTimeout(function(){s.addClass(t._domNode,"visible"),t._domNode.setAttribute("aria-hidden","false"),e||(s.addClass(t._domNode,"noanimation"),setTimeout(function(){s.removeClass(t._domNode,"noanimation")},200))},0),this._codeEditor.layoutOverlayWidget(this);var i=!0;if(this._codeEditor.getConfiguration().contribInfo.find.seedSearchStringFromSelection&&n){var o=s.getDomNodePagePosition(this._codeEditor.getDomNode()),r=this._codeEditor.getScrolledVisiblePosition(n.getStartPosition()),a=o.left+r.left;if(r.topn.startLineNumber&&(i=!1);var u=s.getTopLeftOffset(this._domNode).left;a>u&&(i=!1);var l=this._codeEditor.getScrolledVisiblePosition(n.getEndPosition());o.left+l.left>u&&(i=!1)}}this._showViewZone(i)}},t.prototype._hide=function(e){var t=this;this._isVisible&&(this._isVisible=!1,this._updateButtons(),s.removeClass(this._domNode,"visible"),this._domNode.setAttribute("aria-hidden","true"),e&&this._codeEditor.focus(),this._codeEditor.layoutOverlayWidget(this),this._codeEditor.changeViewZones(function(e){void 0!==t._viewZoneId&&(e.removeZone(t._viewZoneId),t._viewZoneId=void 0,t._codeEditor.setScrollTop(t._codeEditor.getScrollTop()-t._viewZone.heightInPx))}))},t.prototype._layoutViewZone=function(){var e=this;this._isVisible&&void 0===this._viewZoneId&&this._codeEditor.changeViewZones(function(t){e._state.isReplaceRevealed?e._viewZone.heightInPx=64:e._viewZone.heightInPx=P,e._viewZoneId=t.addZone(e._viewZone),e._codeEditor.setScrollTop(e._codeEditor.getScrollTop()+e._viewZone.heightInPx)})},t.prototype._showViewZone=function(e){var t=this;void 0===e&&(e=!0),this._isVisible&&this._codeEditor.changeViewZones(function(n){var i=P;void 0!==t._viewZoneId?(t._state.isReplaceRevealed?(t._viewZone.heightInPx=64,i=64-P):(t._viewZone.heightInPx=P,i=P-64),n.removeZone(t._viewZoneId)):t._viewZone.heightInPx=P,t._viewZoneId=n.addZone(t._viewZone),e&&t._codeEditor.setScrollTop(t._codeEditor.getScrollTop()+i)})},t.prototype._applyTheme=function(e){var t={inputActiveOptionBorder:e.getColor(v.inputActiveOptionBorder),inputBackground:e.getColor(v.inputBackground),inputForeground:e.getColor(v.inputForeground),inputBorder:e.getColor(v.inputBorder),inputValidationInfoBackground:e.getColor(v.inputValidationInfoBackground),inputValidationInfoBorder:e.getColor(v.inputValidationInfoBorder),inputValidationWarningBackground:e.getColor(v.inputValidationWarningBackground),inputValidationWarningBorder:e.getColor(v.inputValidationWarningBorder),inputValidationErrorBackground:e.getColor(v.inputValidationErrorBackground),inputValidationErrorBorder:e.getColor(v.inputValidationErrorBorder)};this._findInput.style(t),this._replaceInputBox.style(t)},t.prototype.focusFindInput=function(){this._findInput.select(),this._findInput.focus()},t.prototype.focusReplaceInput=function(){this._replaceInputBox.select(),this._replaceInputBox.focus()},t.prototype.highlightFindOptions=function(){this._findInput.highlightFindOptions()},t.prototype._onFindInputMouseDown=function(e){e.middleButton&&e.stopPropagation()},t.prototype._onFindInputKeyDown=function(e){return e.equals(3)?(this._codeEditor.getAction(h.FIND_IDS.NextMatchFindAction).run().done(null,i.onUnexpectedError),void e.preventDefault()):e.equals(1027)?(this._codeEditor.getAction(h.FIND_IDS.PreviousMatchFindAction).run().done(null,i.onUnexpectedError),void e.preventDefault()):e.equals(2)?(this._isReplaceVisible?this._replaceInputBox.focus():this._findInput.focusOnCaseSensitive(),void e.preventDefault()):e.equals(2066)?(this._codeEditor.focus(),void e.preventDefault()):void 0},t.prototype._onReplaceInputKeyDown=function(e){return e.equals(3)?(this._controller.replace(),void e.preventDefault()):e.equals(2051)?(this._controller.replaceAll(),void e.preventDefault()):e.equals(2)?(this._findInput.focusOnCaseSensitive(),void e.preventDefault()):e.equals(1026)?(this._findInput.focus(),void e.preventDefault()):e.equals(2066)?(this._codeEditor.focus(),void e.preventDefault()):void 0},t.prototype.getHorizontalSashTop=function(e){return 0},t.prototype.getHorizontalSashLeft=function(e){return 0},t.prototype.getHorizontalSashWidth=function(e){return 500},t.prototype._keybindingLabelFor=function(e){var t=this._keybindingService.lookupKeybinding(e);return t?" ("+t.getLabel()+")":""},t.prototype._buildFindPart=function(){var e=this;this._findInput=this._register(new a.FindInput(null,this._contextViewProvider,{width:221,label:_,placeholder:y,appendCaseSensitiveLabel:this._keybindingLabelFor(h.FIND_IDS.ToggleCaseSensitiveCommand),appendWholeWordsLabel:this._keybindingLabelFor(h.FIND_IDS.ToggleWholeWordCommand),appendRegexLabel:this._keybindingLabelFor(h.FIND_IDS.ToggleRegexCommand),validation:function(t){if(0===t.length)return null;if(!e._findInput.getRegex())return null;try{return new RegExp(t),null}catch(e){return{content:e.message}}}})),this._findInput.setRegex(!!this._state.isRegex),this._findInput.setCaseSensitive(!!this._state.matchCase),this._findInput.setWholeWords(!!this._state.wholeWord),this._register(this._findInput.onKeyDown(function(t){return e._onFindInputKeyDown(t)})),this._register(this._findInput.onInput(function(){e._state.change({searchString:e._findInput.getValue()},!0)})),this._register(this._findInput.onDidOptionChange(function(){e._state.change({isRegex:e._findInput.getRegex(),wholeWord:e._findInput.getWholeWords(),matchCase:e._findInput.getCaseSensitive()},!0)})),this._register(this._findInput.onCaseSensitiveKeyDown(function(t){t.equals(1026)&&e._isReplaceVisible&&(e._replaceInputBox.focus(),t.preventDefault())})),o.isLinux&&this._register(this._findInput.onMouseDown(function(t){return e._onFindInputMouseDown(t)})),this._matchesCount=document.createElement("div"),this._matchesCount.className="matchesCount",this._updateMatchesCount(),this._prevBtn=this._register(new B({label:C+this._keybindingLabelFor(h.FIND_IDS.PreviousMatchFindAction),className:"previous",onTrigger:function(){e._codeEditor.getAction(h.FIND_IDS.PreviousMatchFindAction).run().done(null,i.onUnexpectedError)},onKeyDown:function(e){}})),this._nextBtn=this._register(new B({label:b+this._keybindingLabelFor(h.FIND_IDS.NextMatchFindAction),className:"next",onTrigger:function(){e._codeEditor.getAction(h.FIND_IDS.NextMatchFindAction).run().done(null,i.onUnexpectedError)},onKeyDown:function(e){}}));var t=document.createElement("div");return t.className="find-part",t.appendChild(this._findInput.domNode),t.appendChild(this._matchesCount),t.appendChild(this._prevBtn.domNode),t.appendChild(this._nextBtn.domNode),this._toggleSelectionFind=this._register(new W({parent:t,title:w+this._keybindingLabelFor(h.FIND_IDS.ToggleSearchScopeCommand),onChange:function(){if(e._toggleSelectionFind.checked){var t=e._codeEditor.getSelection();1===t.endColumn&&t.endLineNumber>t.startLineNumber&&(t=t.setEndPosition(t.endLineNumber-1,1)),t.isEmpty()||e._state.change({searchScope:t},!0)}else e._state.change({searchScope:null},!0)}})),this._closeBtn=this._register(new B({label:S+this._keybindingLabelFor(h.FIND_IDS.CloseFindWidgetCommand),className:"close-fw",onTrigger:function(){e._state.change({isRevealed:!1,searchScope:null},!1)},onKeyDown:function(t){t.equals(2)&&e._isReplaceVisible&&(e._replaceBtn.isEnabled()?e._replaceBtn.focus():e._codeEditor.focus(),t.preventDefault())}})),t.appendChild(this._closeBtn.domNode),t},t.prototype._buildReplacePart=function(){var e=this,t=document.createElement("div");t.className="replace-input",t.style.width="221px",this._replaceInputBox=this._register(new u.InputBox(t,null,{ariaLabel:E,placeholder:L})),this._register(s.addStandardDisposableListener(this._replaceInputBox.inputElement,"keydown",function(t){return e._onReplaceInputKeyDown(t)})),this._register(s.addStandardDisposableListener(this._replaceInputBox.inputElement,"input",function(t){e._state.change({replaceString:e._replaceInputBox.value},!1)})),this._replaceBtn=this._register(new B({label:x+this._keybindingLabelFor(h.FIND_IDS.ReplaceOneAction),className:"replace",onTrigger:function(){e._controller.replace()},onKeyDown:function(t){t.equals(1026)&&(e._closeBtn.focus(),t.preventDefault())}})),this._replaceAllBtn=this._register(new B({label:N+this._keybindingLabelFor(h.FIND_IDS.ReplaceAllAction),className:"replace-all",onTrigger:function(){e._controller.replaceAll()},onKeyDown:function(e){}}));var n=document.createElement("div");return n.className="replace-part",n.appendChild(t),n.appendChild(this._replaceBtn.domNode),n.appendChild(this._replaceAllBtn.domNode),n},t.prototype._buildDomNode=function(){var e=this,t=this._buildFindPart(),n=this._buildReplacePart();this._toggleReplaceBtn=this._register(new B({label:M,className:"toggle left",onTrigger:function(){e._state.change({isReplaceRevealed:!e._isReplaceVisible},!1),e._isReplaceVisible&&(e._replaceInputBox.width=e._findInput.inputBox.width),e._showViewZone()},onKeyDown:function(e){}})),this._toggleReplaceBtn.toggleClass("expand",this._isReplaceVisible),this._toggleReplaceBtn.toggleClass("collapse",!this._isReplaceVisible),this._toggleReplaceBtn.setExpanded(this._isReplaceVisible),this._domNode=document.createElement("div"),this._domNode.className="editor-widget find-widget",this._domNode.setAttribute("aria-hidden","true"),this._domNode.style.width=D+"px",this._domNode.appendChild(this._toggleReplaceBtn.domNode),this._domNode.appendChild(t),this._domNode.appendChild(n),this._buildSash()},t.prototype._buildSash=function(){var e=this;this._resizeSash=new c.Sash(this._domNode,this,{orientation:c.Orientation.VERTICAL});var t=D;this._register(this._resizeSash.addListener("start",function(n){t=s.getTotalWidth(e._domNode)})),this._register(this._resizeSash.addListener("change",function(n){var i=t+n.startX-n.currentX;if(!(i(parseFloat(s.getComputedStyle(e._domNode).maxWidth)||0)||(e._domNode.style.width=i+"px",e._isReplaceVisible&&(e._replaceInputBox.width=o))}}))},t.ID="editor.contrib.findWidget",t}(l.Widget);t.FindWidget=F;var W=function(e){function t(n){var i=e.call(this)||this;return i._opts=n,i._domNode=document.createElement("div"),i._domNode.className="monaco-checkbox",i._domNode.title=i._opts.title,i._domNode.tabIndex=0,i._checkbox=document.createElement("input"),i._checkbox.type="checkbox",i._checkbox.className="checkbox",i._checkbox.id="checkbox-"+t._COUNTER++,i._checkbox.tabIndex=-1,i._label=document.createElement("label"),i._label.className="label",i._label.htmlFor=i._checkbox.id,i._label.tabIndex=-1,i._domNode.appendChild(i._checkbox),i._domNode.appendChild(i._label),i._opts.parent.appendChild(i._domNode),i.onchange(i._checkbox,function(e){i._opts.onChange()}),i}return f(t,e),Object.defineProperty(t.prototype,"domNode",{get:function(){return this._domNode},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"checked",{get:function(){return this._checkbox.checked},set:function(e){this._checkbox.checked=e},enumerable:!0,configurable:!0}),t.prototype.focus=function(){this._checkbox.focus()},t.prototype.enable=function(){this._checkbox.removeAttribute("disabled")},t.prototype.disable=function(){this._checkbox.disabled=!0},t.prototype.setEnabled=function(e){e?(this.enable(),this.domNode.tabIndex=0):(this.disable(),this.domNode.tabIndex=-1)},t._COUNTER=0,t}(l.Widget),B=function(e){function t(t){var n=e.call(this)||this;return n._opts=t,n._domNode=document.createElement("div"),n._domNode.title=n._opts.label,n._domNode.tabIndex=0,n._domNode.className="button "+n._opts.className,n._domNode.setAttribute("role","button"),n._domNode.setAttribute("aria-label",n._opts.label),n.onclick(n._domNode,function(e){n._opts.onTrigger(),e.preventDefault()}),n.onkeydown(n._domNode,function(e){if(e.equals(10)||e.equals(3))return n._opts.onTrigger(),void e.preventDefault();n._opts.onKeyDown(e)}),n}return f(t,e),Object.defineProperty(t.prototype,"domNode",{get:function(){return this._domNode},enumerable:!0,configurable:!0}),t.prototype.isEnabled=function(){return this._domNode.tabIndex>=0},t.prototype.focus=function(){this._domNode.focus()},t.prototype.setEnabled=function(e){s.toggleClass(this._domNode,"disabled",!e),this._domNode.setAttribute("aria-disabled",String(!e)),this._domNode.tabIndex=e?0:-1},t.prototype.setExpanded=function(e){this._domNode.setAttribute("aria-expanded",String(!!e))},t.prototype.toggleClass=function(e,t){s.toggleClass(this._domNode,e,t)},t}(l.Widget);t.SimpleButton=B,m.registerThemingParticipant(function(e,t){function n(e,n){n&&t.addRule(".monaco-editor "+e+" { background-color: "+n+"; }")}n(".findMatch",e.getColor(v.editorFindMatchHighlight)),n(".currentFindMatch",e.getColor(v.editorFindMatch)),n(".findScope",e.getColor(v.editorFindRangeHighlight)),n(".find-widget",e.getColor(v.editorWidgetBackground));var i=e.getColor(v.widgetShadow);i&&t.addRule(".monaco-editor .find-widget { box-shadow: 0 2px 8px "+i+"; }");var o=e.getColor(v.activeContrastBorder);o&&(t.addRule(".monaco-editor .findScope { border: 1px dashed "+o.transparent(.4)+"; }"),t.addRule(".monaco-editor .currentFindMatch { border: 2px solid "+o+"; padding: 1px; -moz-box-sizing: border-box; box-sizing: border-box; }"),t.addRule(".monaco-editor .findMatch { border: 1px dotted "+o+"; -moz-box-sizing: border-box; box-sizing: border-box; }"));var r=e.getColor(v.contrastBorder);r&&t.addRule(".monaco-editor .find-widget { border: 2px solid "+r+"; }");var s=e.getColor(v.errorForeground);s&&t.addRule(".monaco-editor .find-widget.no-results .matchesCount { color: "+s+"; }");var a=e.getColor("panel.border");a&&t.addRule(".monaco-editor .find-widget .monaco-sash { background-color: "+a+"; width: 3px !important; margin-left: -4px;}")})}),define(d[520],h([1,0,69,46,19,30,519,518,176,14,76]),function(e,t,n,i,o,r,s,a,u,l,c){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var d=function(e){function t(t,n,i,o,r,u){var l=e.call(this,t,i,u)||this;return l._widget=l._register(new s.FindWidget(t,l,l._state,n,o,i,r)),l._findOptionsWidget=l._register(new a.FindOptionsWidget(t,l._state,o,r)),l}return f(t,e),t.prototype._start=function(t){e.prototype._start.call(this,t),2===t.shouldFocus?this._widget.focusReplaceInput():1===t.shouldFocus&&this._widget.focusFindInput()},t.prototype.highlightFindOptions=function(){this._state.isRevealed?this._widget.highlightFindOptions():this._findOptionsWidget.highlightFindOptions()},t=v([r.editorContribution,y(1,n.IContextViewService),y(2,o.IContextKeyService),y(3,i.IKeybindingService),y(4,l.IThemeService),y(5,c.IStorageService)],t)}(u.CommonFindController);t.FindController=d}),define(d[521],h([1,0,18,3,51,2,13,25,19,14,23,335]),function(e,t,n,i,o,r,s,a,u,l,c){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var d=function(){function e(e,n){this._messageListeners=[],this._editor=e,this._visible=t.CONTEXT_SNIPPET_MODE.bindTo(n)}return t=e,e.get=function(e){return e.getContribution(t._id)},e.prototype.getId=function(){return t._id},e.prototype.dispose=function(){this._visible.reset()},e.prototype.showMessage=function(e,t){var s=this;o.alert(e),this._visible.set(!0),i.dispose(this._messageWidget),this._messageListeners=i.dispose(this._messageListeners),this._messageWidget=new p(this._editor,t,e),this._messageListeners.push(this._editor.onDidBlurEditorText(function(){return s.closeMessage()})),this._messageListeners.push(this._editor.onDidChangeCursorPosition(function(){return s.closeMessage()})),this._messageListeners.push(this._editor.onDidDispose(function(){return s.closeMessage()})),this._messageListeners.push(this._editor.onDidChangeModel(function(){return s.closeMessage()})),this._messageListeners.push(n.setDisposableTimeout(function(){return s.closeMessage()},3e3));var a;this._messageListeners.push(this._editor.onMouseMove(function(e){e.target.position&&(a?a.containsPosition(e.target.position)||s.closeMessage():a=new r.Range(t.lineNumber-3,1,e.target.position.lineNumber+3,1))}))},e.prototype.closeMessage=function(){this._visible.reset(),this._messageListeners=i.dispose(this._messageListeners),this._messageListeners.push(p.fadeOut(this._messageWidget))},e._id="editor.contrib.messageController",e.CONTEXT_SNIPPET_MODE=new u.RawContextKey("messageVisible",!1),e=t=v([s.commonEditorContribution,y(1,u.IContextKeyService)],e);var t}();t.MessageController=d;var h=s.EditorCommand.bindToContribution(d.get);s.CommonEditorRegistry.registerEditorCommand(new h({id:"leaveEditorMessage",precondition:d.CONTEXT_SNIPPET_MODE,handler:function(e){return e.closeMessage()},kbOpts:{weight:s.CommonEditorRegistry.commandWeight(30),primary:9}}));var p=function(){function e(e,t,n){var i=t.lineNumber,o=t.column;this.allowEditorOverflow=!0,this.suppressMouseDown=!1,this._editor=e,this._editor.revealLinesInCenterIfOutsideViewport(i,i),this._position={lineNumber:i,column:1},this._domNode=document.createElement("div"),this._domNode.style.paddingLeft=e.getOffsetForColumn(i,o)-6+"px",this._domNode.classList.add("monaco-editor-overlaymessage");var r=document.createElement("div");r.classList.add("message"),r.textContent=n,this._domNode.appendChild(r);var s=document.createElement("div");s.classList.add("anchor"),this._domNode.appendChild(s),this._editor.addContentWidget(this),this._domNode.classList.add("fadeIn")}return e.fadeOut=function(e){var t,n=function(){e.dispose(),clearTimeout(t),e.getDomNode().removeEventListener("animationend",n)};return t=setTimeout(n,110),e.getDomNode().addEventListener("animationend",n),e.getDomNode().classList.add("fadeOut"),{dispose:n}},e.prototype.dispose=function(){this._editor.removeContentWidget(this)},e.prototype.getId=function(){return"messageoverlay"},e.prototype.getDomNode=function(){return this._domNode},e.prototype.getPosition=function(){return{position:this._position,preference:[a.ContentWidgetPositionPreference.ABOVE]}},e}();l.registerThemingParticipant(function(e,t){var n=e.getColor(c.inputValidationInfoBorder);if(n){var i=e.type===l.HIGH_CONTRAST?2:1;t.addRule(".monaco-editor .monaco-editor-overlaymessage .anchor { border-top-color: "+n+"; }"),t.addRule(".monaco-editor .monaco-editor-overlaymessage .message { border: "+i+"px solid "+n+"; }")}var o=e.getColor(c.inputValidationInfoBackground);o&&t.addRule(".monaco-editor .monaco-editor-overlaymessage .message { background-color: "+o+"; }")})}),define(d[522],h([1,0,353,11,3,36,4,19,103,58,12,2,13,30,183,23,14,32,21,37,366]),function(e,t,n,i,o,r,s,a,u,l,c,d,h,p,g,m,C,b,w,S){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var E=function(){function e(e,t){var n=this;this._editor=e,this._markers=null,this._nextIdx=-1,this._toUnbind=[],this._ignoreSelectionChange=!1,this._onCurrentMarkerChanged=new i.Emitter,this._onMarkerSetChanged=new i.Emitter,this.setMarkers(t),this._toUnbind.push(this._editor.onDidDispose(function(){return n.dispose()})),this._toUnbind.push(this._editor.onDidChangeCursorPosition(function(){n._ignoreSelectionChange||(n._nextIdx=-1)}))}return Object.defineProperty(e.prototype,"onCurrentMarkerChanged",{get:function(){return this._onCurrentMarkerChanged.event},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"onMarkerSetChanged",{get:function(){return this._onMarkerSetChanged.event},enumerable:!0,configurable:!0}),e.prototype.setMarkers=function(e){this._markers=e||[],this._markers.sort(function(e,t){return r.default.compare(e.severity,t.severity)||d.Range.compareRangesUsingStarts(e,t)}),this._nextIdx=-1,this._onMarkerSetChanged.fire(this)},e.prototype.withoutWatchingEditorPosition=function(e){this._ignoreSelectionChange=!0;try{e()}finally{this._ignoreSelectionChange=!1}},e.prototype._initIdx=function(e){for(var t=!1,n=this._editor.getPosition(),i=0;i=this._markers.length&&(this._nextIdx=0)):(this._nextIdx-=1,this._nextIdx<0&&(this._nextIdx=this._markers.length-1));var t=this._markers[this._nextIdx];this._onCurrentMarkerChanged.fire(t)}else this._onCurrentMarkerChanged.fire(void 0)},e.prototype.canNavigate=function(){return this._markers.length>0},e.prototype.next=function(){this.move(!0)},e.prototype.previous=function(){this.move(!1)},e.prototype.findMarkerAtPosition=function(e){for(var t=0,n=this._markers;t1&&(a=new r.Selection(a.startLineNumber,a.startColumn,a.endLineNumber,a.endColumn+h-1));var p=new l.InPlaceReplaceCommand(u,a,n.value);s.editor.pushUndoStop(),s.editor.executeCommand(e,p),s.editor.pushUndoStop(),s.decorationIds=s.editor.deltaDecorations(s.decorationIds,[{range:c,options:t.DECORATION}]),s.decorationRemover.cancel(),s.decorationRemover=i.TPromise.timeout(350),s.decorationRemover.then(function(){s.editor.changeDecorations(function(e){s.decorationIds=e.deltaDecorations(s.decorationIds,[])})})}})},e.ID="editor.contrib.inPlaceReplaceController",e.DECORATION=p.ModelDecorationOptions.register({className:"valueSetReplacement"}),e=t=v([a.commonEditorContribution,y(1,u.IEditorWorkerService)],e);var t}();(function(e){function t(){return e.call(this,{id:"editor.action.inPlaceReplace.up",label:n.localize(0,null),alias:"Replace with Previous Value",precondition:s.EditorContextKeys.writable,kbOpts:{kbExpr:s.EditorContextKeys.textFocus,primary:3154}})||this}f(t,e),t.prototype.run=function(e,t){var n=g.get(t);if(n)return n.run(this.id,!0)},t=v([a.editorAction],t)})(a.EditorAction),function(e){function t(){return e.call(this,{id:"editor.action.inPlaceReplace.down",label:n.localize(1,null),alias:"Replace with Next Value",precondition:s.EditorContextKeys.writable,kbOpts:{kbExpr:s.EditorContextKeys.textFocus,primary:3156}})||this}f(t,e),t.prototype.run=function(e,t){var n=g.get(t);if(n)return n.run(this.id,!1)},t=v([a.editorAction],t)}(a.EditorAction);d.registerThemingParticipant(function(e,t){var n=e.getColor(h.editorBracketMatchBorder);n&&t.addRule(".monaco-editor.vs .valueSetReplacement { outline: solid 2px "+n+"; }")})}),define(d[525],h([1,0,358,10,15,36,7,50,71,20,13,17,61,25,401,3,30,14,23,34,192,389]),function(e,t,n,i,o,r,s,a,u,l,c,d,h,p,g,m,_,C,b,w,S){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var E=o.isMacintosh?n.localize(0,null):n.localize(1,null),L=o.isMacintosh?n.localize(2,null):n.localize(3,null),x=n.localize(4,null),N=n.localize(5,null),M={meta:w.ModelDecorationOptions.register({stickiness:l.TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges,inlineClassName:"detected-link",hoverMessage:E}),metaActive:w.ModelDecorationOptions.register({stickiness:l.TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges,inlineClassName:"detected-link-active",hoverMessage:E}),alt:w.ModelDecorationOptions.register({stickiness:l.TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges,inlineClassName:"detected-link",hoverMessage:x}),altActive:w.ModelDecorationOptions.register({stickiness:l.TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges,inlineClassName:"detected-link-active",hoverMessage:x}),altCommand:w.ModelDecorationOptions.register({stickiness:l.TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges,inlineClassName:"detected-link",hoverMessage:N}),altCommandActive:w.ModelDecorationOptions.register({stickiness:l.TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges,inlineClassName:"detected-link-active",hoverMessage:N}),metaCommand:w.ModelDecorationOptions.register({stickiness:l.TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges,inlineClassName:"detected-link",hoverMessage:L}),metaCommandActive:w.ModelDecorationOptions.register({stickiness:l.TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges,inlineClassName:"detected-link-active",hoverMessage:L})},T=function(){function e(e,t){this.link=e,this.decorationId=t}return e.decoration=function(t,n){return{range:t.range,options:e._getOptions(t,n,!1)}},e._getOptions=function(e,t,n){return/^command:/i.test(e.url)?t?n?M.metaCommandActive:M.metaCommand:n?M.altCommandActive:M.altCommand:t?n?M.metaActive:M.meta:n?M.altActive:M.alt},e.prototype.activate=function(t,n){t.changeDecorationOptions(this.decorationId,e._getOptions(this.link,n,!0))},e.prototype.deactivate=function(t,n){t.changeDecorationOptions(this.decorationId,e._getOptions(this.link,n,!1))},e}(),k=function(){function e(e,t,n,i){var o=this;this.editor=e,this.openerService=t,this.messageService=n,this.editorWorkerService=i,this.listenersToRemove=[];var r=new S.ClickLinkGesture(e);this.listenersToRemove.push(r),this.listenersToRemove.push(r.onMouseMoveOrRelevantKeyDown(function(e){var t=e[0],n=e[1];o._onEditorMouseMove(t,n)})),this.listenersToRemove.push(r.onExecute(function(e){o.onEditorMouseUp(e)})),this.listenersToRemove.push(r.onCancel(function(e){o.cleanUpActiveLinkDecoration()})),this.enabled=e.getConfiguration().contribInfo.links,this.listenersToRemove.push(e.onDidChangeConfiguration(function(t){var n=e.getConfiguration().contribInfo.links;o.enabled!==n&&(o.enabled=n,o.updateDecorations([]),o.stop(),o.beginCompute())})),this.listenersToRemove.push(e.onDidChangeModelContent(function(e){return o.onChange()})),this.listenersToRemove.push(e.onDidChangeModel(function(e){return o.onModelChanged()})),this.listenersToRemove.push(e.onDidChangeModelLanguage(function(e){return o.onModelModeChanged()})),this.listenersToRemove.push(d.LinkProviderRegistry.onDidChange(function(e){return o.onModelModeChanged()})),this.timeoutPromise=null,this.computePromise=null,this.currentOccurrences={},this.activeLinkDecorationId=null,this.beginCompute()}return t=e,e.get=function(e){return e.getContribution(t.ID)},e.prototype.getId=function(){return t.ID},e.prototype.isComputing=function(){return s.TPromise.is(this.computePromise)},e.prototype.onModelChanged=function(){this.currentOccurrences={},this.activeLinkDecorationId=null,this.stop(),this.beginCompute()},e.prototype.onModelModeChanged=function(){this.stop(),this.beginCompute()},e.prototype.onChange=function(){var e=this;this.timeoutPromise||(this.timeoutPromise=s.TPromise.timeout(t.RECOMPUTE_TIME),this.timeoutPromise.then(function(){e.timeoutPromise=null,e.beginCompute()}))},e.prototype.beginCompute=function(){var e=this;this.editor.getModel()&&this.enabled&&d.LinkProviderRegistry.has(this.editor.getModel())&&(this.computePromise=g.getLinks(this.editor.getModel()).then(function(t){e.updateDecorations(t),e.computePromise=null}))},e.prototype.updateDecorations=function(e){var t=this,n="altKey"===this.editor.getConfiguration().multiCursorModifier;this.editor.changeDecorations(function(i){for(var o=[],r=Object.keys(t.currentOccurrences),s=0,a=r.length;s1;r.toggleClass(this.element,"multiple",e),this.keyMultipleSignatures.set(e),this.signature.innerHTML="",this.docs.innerHTML="";var t=this.hints.signatures[this.currentSignature];if(t){var i=r.append(this.signature,w(".code")),o=t.parameters.length>0,a=this.editor.getConfiguration().fontInfo;i.style.fontSize=a.fontSize+"px",i.style.fontFamily=a.fontFamily,o?this.renderParameters(i,t,this.hints.activeParameter):r.append(i,w("span")).textContent=t.label;var u=t.parameters[this.hints.activeParameter];if(u&&u.documentation){var l=w("span.documentation");l.textContent=u.documentation,r.append(this.docs,w("p",null,l))}r.toggleClass(this.signature,"has-docs",!!t.documentation),t.documentation&&r.append(this.docs,w("p",null,t.documentation));var c=String(this.currentSignature+1);if(this.hints.signatures.length<10&&(c+="/"+this.hints.signatures.length),this.overloads.textContent=c,u){var d=u.label;this.announcedLabel!==d&&(s.alert(n.localize(0,null,d)),this.announcedLabel=d)}this.editor.layoutContentWidget(this),this.scrollbar.scanDomNode()}},e.prototype.renderParameters=function(e,t,n){for(var i,o=t.label.length,s=0,a=t.parameters.length-1;a>=0;a--){var u=t.parameters[a],l=0,c=0;(s=t.label.lastIndexOf(u.label,o-1))>=0&&(l=s,c=s+u.label.length),(i=document.createElement("span")).textContent=t.label.substring(c,o),r.prepend(e,i),(i=document.createElement("span")).className="parameter "+(a===n?"active":""),i.textContent=t.label.substring(l,c),r.prepend(e,i),o=l}(i=document.createElement("span")).textContent=t.label.substring(0,o),r.prepend(e,i)},e.prototype.next=function(){var e=this.hints.signatures.length;return e<2?(this.cancel(),!1):(this.currentSignature=(this.currentSignature+1)%e,this.render(),!0)},e.prototype.previous=function(){var e=this.hints.signatures.length;return e<2?(this.cancel(),!1):(this.currentSignature=(this.currentSignature-1+e)%e,this.render(),!0)},e.prototype.cancel=function(){this.model.cancel()},e.prototype.getDomNode=function(){return this.element},e.prototype.getId=function(){return e.ID},e.prototype.trigger=function(){this.model.trigger(0)},e.prototype.updateMaxHeight=function(){var e=Math.max(this.editor.getLayoutInfo().height/4,250);this.element.style.maxHeight=e+"px"},e.prototype.dispose=function(){this.disposables=i.dispose(this.disposables),this.model=null},e.ID="editor.widget.parameterHintsWidget",e=v([y(1,p.IContextKeyService)],e)}();t.ParameterHintsWidget=E,C.registerThemingParticipant(function(e,t){var n=e.getColor(b.editorHoverBorder);if(n){var i=e.type===C.HIGH_CONTRAST?2:1;t.addRule(".monaco-editor .parameter-hints-widget { border: "+i+"px solid "+n+"; }"),t.addRule(".monaco-editor .parameter-hints-widget.multiple .body { border-left: 1px solid "+n.transparent(.5)+"; }"),t.addRule(".monaco-editor .parameter-hints-widget .signature.has-docs { border-bottom: 1px solid "+n.transparent(.5)+"; }")}var o=e.getColor(b.editorHoverBackground);o&&t.addRule(".monaco-editor .parameter-hints-widget { background-color: "+o+"; }")})}),define(d[527],h([1,0,360,3,16,21,19,13,30,526,178]),function(e,t,n,i,o,r,s,a,u,l,c){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var d=function(){function e(e,t){this.editor=e,this.widget=t.createInstance(l.ParameterHintsWidget,this.editor)}return t=e,e.get=function(e){return e.getContribution(t.ID)},e.prototype.getId=function(){return t.ID},e.prototype.cancel=function(){this.widget.cancel()},e.prototype.previous=function(){this.widget.previous()},e.prototype.next=function(){this.widget.next()},e.prototype.trigger=function(){this.widget.trigger()},e.prototype.dispose=function(){this.widget=i.dispose(this.widget)},e.ID="editor.controller.parameterHints",e=t=v([u.editorContribution,y(1,o.IInstantiationService)],e);var t}(),h=function(e){function t(){return e.call(this,{id:"editor.action.triggerParameterHints",label:n.localize(0,null),alias:"Trigger Parameter Hints",precondition:r.EditorContextKeys.hasSignatureHelpProvider,kbOpts:{kbExpr:r.EditorContextKeys.textFocus,primary:3082}})||this}return f(t,e),t.prototype.run=function(e,t){var n=d.get(t);n&&n.trigger()},t=v([a.editorAction],t)}(a.EditorAction);t.TriggerParameterHintsAction=h;var p=a.CommonEditorRegistry.commandWeight(75),g=a.EditorCommand.bindToContribution(d.get);a.CommonEditorRegistry.registerEditorCommand(new g({id:"closeParameterHints",precondition:c.Context.Visible,handler:function(e){return e.cancel()},kbOpts:{weight:p,kbExpr:r.EditorContextKeys.textFocus,primary:9,secondary:[1033]}})),a.CommonEditorRegistry.registerEditorCommand(new g({id:"showPrevParameterHint",precondition:s.ContextKeyExpr.and(c.Context.Visible,c.Context.MultipleSignatures),handler:function(e){return e.previous()},kbOpts:{weight:p,kbExpr:r.EditorContextKeys.textFocus,primary:16,secondary:[528],mac:{primary:16,secondary:[528,302]}}})),a.CommonEditorRegistry.registerEditorCommand(new g({id:"showNextParameterHint",precondition:s.ContextKeyExpr.and(c.Context.Visible,c.Context.MultipleSignatures),handler:function(e){return e.next()},kbOpts:{weight:p,kbExpr:r.EditorContextKeys.textFocus,primary:18,secondary:[530],mac:{primary:18,secondary:[530,300]}}}))}),define(d[528],h([1,0,369,10,3,7,2,25,14,23,12,393]),function(e,t,n,i,o,r,s,a,u,l,c){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var d=function(){function e(e,t){var n=this;this.themeService=t,this._disposables=[],this.allowEditorOverflow=!0,this._currentAcceptInput=null,this._currentCancelInput=null,this._editor=e,this._editor.addContentWidget(this),this._disposables.push(e.onDidChangeConfiguration(function(e){e.fontInfo&&n.updateFont()})),this._disposables.push(t.onThemeChange(function(e){return n.onThemeChange(e)}))}return e.prototype.onThemeChange=function(e){this.updateStyles(e)},e.prototype.dispose=function(){this._disposables=o.dispose(this._disposables),this._editor.removeContentWidget(this)},e.prototype.getId=function(){return"__renameInputWidget"},e.prototype.getDomNode=function(){return this._domNode||(this._inputField=document.createElement("input"),this._inputField.className="rename-input",this._inputField.type="text",this._inputField.setAttribute("aria-label",n.localize(0,null)),this._domNode=document.createElement("div"),this._domNode.style.height=this._editor.getConfiguration().lineHeight+"px",this._domNode.className="monaco-editor rename-box",this._domNode.appendChild(this._inputField),this.updateFont(),this.updateStyles(this.themeService.getTheme())),this._domNode},e.prototype.updateStyles=function(e){if(this._inputField){var t=e.getColor(l.inputBackground),n=e.getColor(l.inputForeground),i=e.getColor(l.widgetShadow),o=e.getColor(l.inputBorder);this._inputField.style.backgroundColor=t?t.toString():null,this._inputField.style.color=n?n.toString():null,this._inputField.style.borderWidth=o?"1px":"0px",this._inputField.style.borderStyle=o?"solid":"none",this._inputField.style.borderColor=o?o.toString():"none",this._domNode.style.boxShadow=i?" 0 2px 8px "+i:null}},e.prototype.updateFont=function(){if(this._inputField){var e=this._editor.getConfiguration().fontInfo;this._inputField.style.fontFamily=e.fontFamily,this._inputField.style.fontWeight=e.fontWeight,this._inputField.style.fontSize=e.fontSize+"px"}},e.prototype.getPosition=function(){return this._visible?{position:this._position,preference:[a.ContentWidgetPositionPreference.BELOW,a.ContentWidgetPositionPreference.ABOVE]}:null},e.prototype.acceptInput=function(){this._currentAcceptInput&&this._currentAcceptInput()},e.prototype.cancelInput=function(){this._currentCancelInput&&this._currentCancelInput()},e.prototype.getInput=function(e,t,n,a){var u=this;this._position=new c.Position(e.startLineNumber,e.startColumn),this._inputField.value=t,this._inputField.setAttribute("selectionStart",n.toString()),this._inputField.setAttribute("selectionEnd",a.toString()),this._inputField.size=Math.max(1.1*(e.endColumn-e.startColumn),20);var l,d=[];return l=function(){o.dispose(d),u._hide()},new r.TPromise(function(n,o){u._currentCancelInput=function(){return u._currentAcceptInput=null,u._currentCancelInput=null,o(i.canceled()),!0},u._currentAcceptInput=function(){0!==u._inputField.value.trim().length&&u._inputField.value!==t?(u._currentAcceptInput=null,u._currentCancelInput=null,n(u._inputField.value)):u.cancelInput()};d.push(u._editor.onDidChangeCursorSelection(function(){s.Range.containsPosition(e,u._editor.getPosition())||u.cancelInput()})),d.push(u._editor.onDidBlurEditor(function(){return u.cancelInput()})),u._show()},this._currentCancelInput).then(function(e){return l(),e},function(e){return l(),r.TPromise.wrapError(e)})},e.prototype._show=function(){var e=this;this._editor.revealLineInCenterIfOutsideViewport(this._position.lineNumber),this._visible=!0,this._editor.layoutContentWidget(this),setTimeout(function(){e._inputField.focus(),e._inputField.setSelectionRange(parseInt(e._inputField.getAttribute("selectionStart")),parseInt(e._inputField.getAttribute("selectionEnd")))},25)},e.prototype._hide=function(){this._visible=!1,this._editor.layoutContentWidget(this)},e=v([y(1,u.IThemeService)],e)}();t.default=d}),define(d[529],h([1,0,368,10,36,7,411,19,50,163,13,30,21,338,528,87,16,14,18,17,51,2]),function(e,t,n,i,o,r,s,a,u,l,c,d,h,p,g,m,_,C,b,w,S,E){"use strict";function L(e,t,o){var s=[],a=!1,u=w.RenameProviderRegistry.ordered(e).map(function(n){return function(){if(!a)return b.asWinJsPromise(function(i){return n.provideRenameEdits(e,t,o,i)}).then(function(e){if(e){if(!e.rejectReason)return a=!0,e;s.push(e.rejectReason)}else;},function(e){return i.onUnexpectedExternalError(e),r.TPromise.wrapError(new Error("provider failed"))})}});return b.sequence(u).then(function(e){var t=e[0];return s.length>0?{edits:void 0,rejectReason:s.join("\n")}:t||{edits:void 0,rejectReason:n.localize(0,null)}})}Object.defineProperty(t,"__esModule",{value:!0}),t.rename=L;var x=new a.RawContextKey("renameInputVisible",!1),N=function(){function e(e,t,n,i,o,r,s){this.editor=e,this._messageService=t,this._textModelResolverService=n,this._progressService=i,this._fileService=s,this._renameInputField=new g.default(e,r),this._renameInputVisible=x.bindTo(o)}return t=e,e.get=function(e){return e.getContribution(t.ID)},e.prototype.dispose=function(){this._renameInputField.dispose()},e.prototype.getId=function(){return t.ID},e.prototype.run=function(){var e=this,t=this.editor.getSelection(),s=this.editor.getModel().getWordAtPosition(t.getStartPosition());if(s){var a,u=t.startLineNumber,l=0,c=s.word.length;return a=new E.Range(u,s.startColumn,u,s.endColumn),t.isEmpty()||t.startLineNumber!==t.endLineNumber||(l=Math.max(0,t.startColumn-s.startColumn),c=Math.min(s.endColumn,t.endColumn)-s.startColumn),this._renameInputVisible.set(!0),this._renameInputField.getInput(a,s.word,l,c).then(function(t){e._renameInputVisible.reset(),e.editor.focus();var i=e._prepareRename(t).then(function(i){return i.finish().then(function(o){o&&e.editor.setSelection(o),S.alert(n.localize(1,null,s.word,t,i.ariaMessage()))})},function(t){return"string"==typeof t?void e._messageService.show(o.default.Info,t):(e._messageService.show(o.default.Error,n.localize(2,null)),r.TPromise.wrapError(t))});return e._progressService.showWhile(i,250),i},function(t){if(e._renameInputVisible.reset(),e.editor.focus(),!i.isPromiseCanceledError(t))return r.TPromise.wrapError(t)})}},e.prototype.acceptRenameInput=function(){this._renameInputField.acceptInput()},e.prototype.cancelRenameInput=function(){this._renameInputField.cancelInput()},e.prototype._prepareRename=function(e){var t=p.createBulkEdit(this._textModelResolverService,this.editor,this._fileService);return L(this.editor.getModel(),this.editor.getPosition(),e).then(function(e){return e.rejectReason?r.TPromise.wrapError(new Error(e.rejectReason)):(t.add(e.edits),t)})},e.ID="editor.contrib.renameController",e=t=v([d.editorContribution,y(1,u.IMessageService),y(2,m.ITextModelService),y(3,l.IProgressService),y(4,a.IContextKeyService),y(5,C.IThemeService),y(6,_.optional(s.IFileService))],e);var t}(),M=function(e){function t(){return e.call(this,{id:"editor.action.rename",label:n.localize(3,null),alias:"Rename Symbol",precondition:a.ContextKeyExpr.and(h.EditorContextKeys.writable,h.EditorContextKeys.hasRenameProvider),kbOpts:{kbExpr:h.EditorContextKeys.textFocus,primary:60},menuOpts:{group:"1_modification",order:1.1}})||this}return f(t,e),t.prototype.run=function(e,t){var n=N.get(t);if(n)return n.run()},t=v([c.editorAction],t)}(c.EditorAction);t.RenameAction=M;var T=c.EditorCommand.bindToContribution(N.get);c.CommonEditorRegistry.registerEditorCommand(new T({id:"acceptRenameInput",precondition:x,handler:function(e){return e.acceptRenameInput()},kbOpts:{weight:c.CommonEditorRegistry.commandWeight(99),kbExpr:h.EditorContextKeys.focus,primary:3}})),c.CommonEditorRegistry.registerEditorCommand(new T({id:"cancelRenameInput",precondition:x,handler:function(e){return e.cancelRenameInput()},kbOpts:{weight:c.CommonEditorRegistry.commandWeight(99),kbExpr:h.EditorContextKeys.focus,primary:9,secondary:[1033]}})),c.CommonEditorRegistry.registerDefaultLanguageCommand("_executeDocumentRenameProvider",function(e,t,n){var o=n.newName;if("string"!=typeof o)throw i.illegalArgument("newName");return L(e,t,o)})}),define(d[530],h([1,0,372,81,9,11,7,10,3,4,110,234,63,46,19,25,109,51,58,137,14,23,76,395]),function(e,t,n,i,o,r,s,a,u,l,c,d,h,p,f,g,m,C,b,w,S,E,L){"use strict";function x(e){return e&&e.match(k)?e:null}function N(e){if(!e)return!1;var t=e.suggestion;return!!t.documentation||t.detail&&t.detail!==t.label}Object.defineProperty(t,"__esModule",{value:!0});var M=!1;t.editorSuggestWidgetBackground=E.registerColor("editorSuggestWidget.background",{dark:E.editorWidgetBackground,light:E.editorWidgetBackground,hc:E.editorWidgetBackground},n.localize(0,null)),t.editorSuggestWidgetBorder=E.registerColor("editorSuggestWidget.border",{dark:E.editorWidgetBorder,light:E.editorWidgetBorder,hc:E.editorWidgetBorder},n.localize(1,null)),t.editorSuggestWidgetForeground=E.registerColor("editorSuggestWidget.foreground",{dark:E.editorForeground,light:E.editorForeground,hc:E.editorForeground},n.localize(2,null)),t.editorSuggestWidgetSelectedBackground=E.registerColor("editorSuggestWidget.selectedBackground",{dark:E.listFocusBackground,light:E.listFocusBackground,hc:E.listFocusBackground},n.localize(3,null)),t.editorSuggestWidgetHighlightForeground=E.registerColor("editorSuggestWidget.highlightForeground",{dark:E.listHighlightForeground,light:E.listHighlightForeground,hc:E.listHighlightForeground},n.localize(4,null));var T,k=/^(#([\da-f]{3}){1,2}|(rgb|hsl)a\(\s*(\d{1,3}%?\s*,\s*){3}(1|0?\.\d+)\)|(rgb|hsl)\(\s*\d{1,3}%?(\s*,\s*\d{1,3}%?){2}\s*\))$/i,I=function(){function e(e,t,n){this.widget=e,this.editor=t,this.triggerKeybindingLabel=n}return Object.defineProperty(e.prototype,"templateId",{get:function(){return"suggestion"},enumerable:!0,configurable:!0}),e.prototype.renderTemplate=function(e){var t=this,i=Object.create(null);i.disposables=[],i.root=e,i.icon=l.append(e,l.$(".icon")),i.colorspan=l.append(i.icon,l.$("span.colorspan"));var o=l.append(e,l.$(".contents")),s=l.append(o,l.$(".main"));i.highlightedLabel=new c.HighlightedLabel(s),i.disposables.push(i.highlightedLabel),i.typeLabel=l.append(s,l.$("span.type-label")),i.readMore=l.append(s,l.$("span.readMore")),i.readMore.title=n.localize(5,null,this.triggerKeybindingLabel);var a=function(){var e=t.editor.getConfiguration(),n=e.fontInfo.fontFamily,o=(e.contribInfo.suggestFontSize||e.fontInfo.fontSize)+"px",r=(e.contribInfo.suggestLineHeight||e.fontInfo.lineHeight)+"px";i.root.style.fontSize=o,s.style.fontFamily=n,s.style.lineHeight=r,i.icon.style.height=r,i.icon.style.width=r,i.readMore.style.height=r,i.readMore.style.width=r};return a(),r.chain(this.editor.onDidChangeConfiguration.bind(this.editor)).filter(function(e){return e.fontInfo||e.contribInfo}).on(a,null,i.disposables),i},e.prototype.renderElement=function(e,t,o){var r=this,s=o,a=e.suggestion;if(N(e)?s.root.setAttribute("aria-label",n.localize(6,null,a.label)):s.root.setAttribute("aria-label",n.localize(7,null,a.label)),s.icon.className="icon "+a.type,s.colorspan.style.backgroundColor="","color"===a.type){var u=x(a.label)||x(a.documentation);u&&(s.icon.className="icon customcolor",s.colorspan.style.backgroundColor=u)}s.highlightedLabel.set(a.label,i.createMatches(e.matches)),s.typeLabel.textContent=(a.detail||"").replace(/\n.*$/m,""),N(e)?(l.show(s.readMore),s.readMore.onmousedown=function(e){e.stopPropagation(),e.preventDefault()},s.readMore.onclick=function(e){e.stopPropagation(),e.preventDefault(),r.widget.toggleDetails()}):(l.hide(s.readMore),s.readMore.onmousedown=null,s.readMore.onclick=null)},e.prototype.disposeTemplate=function(e){e.highlightedLabel.dispose(),e.disposables=u.dispose(e.disposables)},e}();!function(e){e[e.Hidden=0]="Hidden",e[e.Loading=1]="Loading",e[e.Empty=2]="Empty",e[e.Open=3]="Open",e[e.Frozen=4]="Frozen",e[e.Details=5]="Details"}(T||(T={}));var D=function(){function e(e,t,i,o){var s=this;this.widget=t,this.editor=i,this.triggerKeybindingLabel=o,this.borderWidth=1,this.disposables=[],this.el=l.append(e,l.$(".details")),this.disposables.push(u.toDisposable(function(){return e.removeChild(s.el)})),this.body=l.$(".body"),this.scrollbar=new h.DomScrollableElement(this.body,{}),l.append(this.el,this.scrollbar.getDomNode()),this.disposables.push(this.scrollbar),this.header=l.append(this.body,l.$(".header")),this.close=l.append(this.header,l.$("span.close")),this.close.title=n.localize(8,null,o),this.type=l.append(this.header,l.$("p.type")),this.docs=l.append(this.body,l.$("p.docs")),this.ariaLabel=null,this.configureFont(),r.chain(this.editor.onDidChangeConfiguration.bind(this.editor)).filter(function(e){return e.fontInfo}).on(this.configureFont,this,this.disposables)}return Object.defineProperty(e.prototype,"element",{get:function(){return this.el},enumerable:!0,configurable:!0}),e.prototype.render=function(e){var t=this;if(!e||!N(e))return this.type.textContent="",this.docs.textContent="",l.addClass(this.el,"no-docs"),void(this.ariaLabel=null);l.removeClass(this.el,"no-docs"),this.docs.textContent=e.suggestion.documentation,e.suggestion.detail?(this.type.innerText=e.suggestion.detail,l.show(this.type)):(this.type.innerText="",l.hide(this.type)),this.el.style.height=this.header.offsetHeight+this.docs.offsetHeight+2*this.borderWidth+"px",this.close.onmousedown=function(e){e.preventDefault(),e.stopPropagation()},this.close.onclick=function(e){e.preventDefault(),e.stopPropagation(),t.widget.toggleDetails()},this.body.scrollTop=0,this.scrollbar.scanDomNode(),this.ariaLabel=o.format("{0}\n{1}\n{2}",e.suggestion.label||"",e.suggestion.detail||"",e.suggestion.documentation||"")},e.prototype.getAriaLabel=function(){return this.ariaLabel},e.prototype.scrollDown=function(e){void 0===e&&(e=8),this.body.scrollTop+=e},e.prototype.scrollUp=function(e){void 0===e&&(e=8),this.body.scrollTop-=e},e.prototype.scrollTop=function(){this.body.scrollTop=0},e.prototype.scrollBottom=function(){this.body.scrollTop=this.body.scrollHeight},e.prototype.pageDown=function(){this.scrollDown(80)},e.prototype.pageUp=function(){this.scrollUp(80)},e.prototype.setBorderWidth=function(e){this.borderWidth=e},e.prototype.configureFont=function(){var e=this.editor.getConfiguration(),t=e.fontInfo.fontFamily,n=(e.contribInfo.suggestFontSize||e.fontInfo.fontSize)+"px",i=(e.contribInfo.suggestLineHeight||e.fontInfo.lineHeight)+"px";this.el.style.fontSize=n,this.type.style.fontFamily=t,this.close.style.height=i,this.close.style.width=i},e.prototype.dispose=function(){this.disposables=u.dispose(this.disposables)},e}(),O=function(){function e(e,n,i,o,s,a){var u=this;this.editor=e,this.telemetryService=n,this.allowEditorOverflow=!0,this.ignoreFocusEvents=!1,this.onDidSelectEmitter=new r.Emitter,this.onDidFocusEmitter=new r.Emitter,this.onDidHideEmitter=new r.Emitter,this.onDidShowEmitter=new r.Emitter,this.onDidSelect=this.onDidSelectEmitter.event,this.onDidFocus=this.onDidFocusEmitter.event,this.onDidHide=this.onDidHideEmitter.event,this.onDidShow=this.onDidShowEmitter.event,this.maxWidgetWidth=660,this.listWidth=330,this.storageServiceAvailable=!0,this.expandSuggestionDocs=!1;var c=a.lookupKeybinding("editor.action.triggerSuggest"),h=c?" ("+c.getLabel()+")":"";this.isAuto=!1,this.focusedItem=null,this.storageService=s,void 0===this.expandDocsSettingFromStorage()&&(this.storageService.store("expandSuggestionDocs",M,L.StorageScope.GLOBAL),void 0===this.expandDocsSettingFromStorage()&&(this.storageServiceAvailable=!1)),this.element=l.$(".editor-widget.suggest-widget"),this.editor.getConfiguration().contribInfo.iconsInSuggestions||l.addClass(this.element,"no-icons"),this.messageElement=l.append(this.element,l.$(".message")),this.listElement=l.append(this.element,l.$(".tree")),this.details=new D(this.element,this,this.editor,h);var p=new I(this,this.editor,h);this.list=new d.List(this.listElement,this,[p],{useShadows:!1,selectOnMouseDown:!0}),this.toDispose=[w.attachListStyler(this.list,o,{listInactiveFocusBackground:t.editorSuggestWidgetSelectedBackground,listInactiveFocusOutline:E.activeContrastBorder}),o.onThemeChange(function(e){return u.onThemeChange(e)}),e.onDidBlurEditorText(function(){return u.onEditorBlur()}),e.onDidLayoutChange(function(){return u.onEditorLayoutChange()}),this.list.onSelectionChange(function(e){return u.onListSelection(e)}),this.list.onFocusChange(function(e){return u.onListFocus(e)}),this.editor.onDidChangeCursorSelection(function(){return u.onCursorSelectionChanged()})],this.suggestWidgetVisible=m.Context.Visible.bindTo(i),this.suggestWidgetMultipleSuggestions=m.Context.MultipleSuggestions.bindTo(i),this.suggestionSupportsAutoAccept=m.Context.AcceptOnKey.bindTo(i),this.editor.addContentWidget(this),this.setState(0),this.onThemeChange(o.getTheme())}return e.prototype.onCursorSelectionChanged=function(){0!==this.state&&this.editor.layoutContentWidget(this)},e.prototype.onEditorBlur=function(){var e=this;this.editorBlurTimeout=s.TPromise.timeout(150).then(function(){e.editor.isFocused()||e.setState(0)})},e.prototype.onEditorLayoutChange=function(){3!==this.state&&5!==this.state||!this.expandDocsSettingFromStorage()||this.expandSideOrBelow()},e.prototype.onListSelection=function(e){if(e.elements.length){var t=e.elements[0];this.onDidSelectEmitter.fire(t),C.alert(n.localize(11,null,t.suggestion.label)),this.editor.focus()}},e.prototype._getSuggestionAriaAlertLabel=function(e){return N(e)?n.localize(12,null,e.suggestion.label):n.localize(13,null,e.suggestion.label)},e.prototype._ariaAlert=function(e){this._lastAriaAlertLabel!==e&&(this._lastAriaAlertLabel=e,this._lastAriaAlertLabel&&C.alert(this._lastAriaAlertLabel))},e.prototype.onThemeChange=function(e){var n=e.getColor(t.editorSuggestWidgetBackground);n&&(this.listElement.style.backgroundColor=n.toString(),this.details.element.style.backgroundColor=n.toString(),this.messageElement.style.backgroundColor=n.toString());var i=e.getColor(t.editorSuggestWidgetBorder);i&&(this.listElement.style.borderColor=i.toString(),this.details.element.style.borderColor=i.toString(),this.messageElement.style.borderColor=i.toString(),this.detailsBorderColor=i.toString());var o=e.getColor(E.focusBorder);o&&(this.detailsFocusBorderColor=o.toString()),this.details.setBorderWidth("hc"===e.type?2:1)},e.prototype.onListFocus=function(e){var t=this;if(!this.ignoreFocusEvents){if(!e.elements.length)return this.currentSuggestionDetails&&(this.currentSuggestionDetails.cancel(),this.currentSuggestionDetails=null,this.focusedItem=null),void this._ariaAlert(null);var n=e.elements[0];if(this._ariaAlert(this._getSuggestionAriaAlertLabel(n)),n!==this.focusedItem){this.currentSuggestionDetails&&(this.currentSuggestionDetails.cancel(),this.currentSuggestionDetails=null);var i=e.indexes[0];this.suggestionSupportsAutoAccept.set(!n.suggestion.noAutoAccept);var o=this.focusedItem,r=this.focusedItemIndex;this.focusedItemIndex=i,this.focusedItem=n,o&&(this.ignoreFocusEvents=!0,this.list.splice(r,1,[o]),this.ignoreFocusEvents=!1),this.updateListHeight(),this.list.reveal(i),this.currentSuggestionDetails=n.resolve().then(function(){t.ignoreFocusEvents=!0,t.list.splice(i,1,[n]),t.ignoreFocusEvents=!1,t.list.setFocus([i]),t.list.reveal(i),t.expandDocsSettingFromStorage()?t.showDetails():l.removeClass(t.element,"docs-side")}).then(null,function(e){return!a.isPromiseCanceledError(e)&&a.onUnexpectedError(e)}).then(function(){return t.currentSuggestionDetails=null}),this.onDidFocusEmitter.fire(n)}}},e.prototype.setState=function(t){if(this.element){var n=this.state!==t;switch(this.state=t,l.toggleClass(this.element,"frozen",4===t),t){case 0:l.hide(this.messageElement,this.details.element),l.show(this.listElement),this.hide(),n&&this.list.splice(0,this.list.length);break;case 1:this.messageElement.textContent=e.LOADING_MESSAGE,l.hide(this.listElement,this.details.element),l.show(this.messageElement),l.removeClass(this.element,"docs-side"),this.show();break;case 2:this.messageElement.textContent=e.NO_SUGGESTIONS_MESSAGE,l.hide(this.listElement,this.details.element),l.show(this.messageElement),l.removeClass(this.element,"docs-side"),this.show();break;case 3:l.hide(this.messageElement),l.show(this.listElement),this.expandDocsSettingFromStorage()&&N(this.list.getFocusedElements()[0])?(l.show(this.details.element),this.expandSideOrBelow()):l.hide(this.details.element),this.show();break;case 4:l.hide(this.messageElement,this.details.element),l.show(this.listElement),this.show();break;case 5:l.hide(this.messageElement),l.show(this.details.element,this.listElement),this.show(),this._ariaAlert(this.details.getAriaLabel())}n&&this.editor.layoutContentWidget(this)}},e.prototype.showTriggered=function(e){var t=this;0===this.state&&(this.isAuto=!!e,this.isAuto||(this.loadingTimeout=setTimeout(function(){t.loadingTimeout=null,t.setState(1)},50)))},e.prototype.showSuggestions=function(e,t,n){if(this.loadingTimeout&&(clearTimeout(this.loadingTimeout),this.loadingTimeout=null),this.completionModel=e,t&&2!==this.state&&0!==this.state)this.setState(4);else{var i=this.completionModel.items.length,o=0===i;if(this.suggestWidgetMultipleSuggestions.set(i>1),o)n?this.setState(0):this.setState(2),this.completionModel=null;else{var r=this.completionModel.stats;r.wasAutomaticallyTriggered=!!n,this.telemetryService.publicLog("suggestWidget",_({},r,this.editor.getTelemetryData())),this.focusedItem=null,this.focusedItemIndex=null,this.list.splice(0,this.list.length,this.completionModel.items),this.list.setFocus([0]),this.list.reveal(0,0),t?this.setState(4):this.setState(3),this.detailsBorderColor&&(this.details.element.style.borderColor=this.detailsBorderColor)}}},e.prototype.selectNextPage=function(){switch(this.state){case 0:return!1;case 5:return this.details.pageDown(),!0;case 1:return!this.isAuto;default:return this.list.focusNextPage(),!0}},e.prototype.selectNext=function(){switch(this.state){case 0:return!1;case 1:return!this.isAuto;default:return this.list.focusNext(1,!0),!0}},e.prototype.selectLast=function(){switch(this.state){case 0:return!1;case 5:return this.details.scrollBottom(),!0;case 1:return!this.isAuto;default:return this.list.focusLast(),!0}},e.prototype.selectPreviousPage=function(){switch(this.state){case 0:return!1;case 5:return this.details.pageUp(),!0;case 1:return!this.isAuto;default:return this.list.focusPreviousPage(),!0}},e.prototype.selectPrevious=function(){switch(this.state){case 0:return!1;case 1:return!this.isAuto;default:return this.list.focusPrevious(1,!0),!1}},e.prototype.selectFirst=function(){switch(this.state){case 0:return!1;case 5:return this.details.scrollTop(),!0;case 1:return!this.isAuto;default:return this.list.focusFirst(),!0}},e.prototype.getFocusedItem=function(){if(0!==this.state&&2!==this.state&&1!==this.state)return this.list.getFocusedElements()[0]},e.prototype.toggleDetailsFocus=function(){5===this.state?(this.setState(3),this.detailsBorderColor&&(this.details.element.style.borderColor=this.detailsBorderColor)):3===this.state&&this.expandDocsSettingFromStorage()&&(this.setState(5),this.detailsFocusBorderColor&&(this.details.element.style.borderColor=this.detailsFocusBorderColor)),this.telemetryService.publicLog("suggestWidget:toggleDetailsFocus",this.editor.getTelemetryData())},e.prototype.toggleDetails=function(){if(N(this.list.getFocusedElements()[0]))if(this.expandDocsSettingFromStorage())this.updateExpandDocsSetting(!1),l.hide(this.details.element),l.removeClass(this.element,"docs-side"),l.removeClass(this.element,"docs-below"),this.editor.layoutContentWidget(this),this.telemetryService.publicLog("suggestWidget:collapseDetails",this.editor.getTelemetryData());else{if(3!==this.state&&5!==this.state)return;this.updateExpandDocsSetting(!0),this.showDetails(),this.telemetryService.publicLog("suggestWidget:expandDetails",this.editor.getTelemetryData())}},e.prototype.showDetails=function(){this.expandSideOrBelow(),l.show(this.details.element),this.details.render(this.list.getFocusedElements()[0]),this.details.element.style.maxHeight=this.maxWidgetHeight+"px",this.listElement.style.marginTop="0px",this.editor.layoutContentWidget(this),this.adjustDocsPosition(),this.editor.focus(),this._ariaAlert(this.details.getAriaLabel())},e.prototype.show=function(){var e=this;this.updateListHeight(),this.suggestWidgetVisible.set(!0),this.showTimeout=s.TPromise.timeout(100).then(function(){l.addClass(e.element,"visible"),e.onDidShowEmitter.fire(e)})},e.prototype.hide=function(){this.suggestWidgetVisible.reset(),this.suggestWidgetMultipleSuggestions.reset(),l.removeClass(this.element,"visible")},e.prototype.hideWidget=function(){clearTimeout(this.loadingTimeout),this.setState(0),this.onDidHideEmitter.fire(this)},e.prototype.getPosition=function(){return 0===this.state?null:{position:this.editor.getPosition(),preference:[g.ContentWidgetPositionPreference.BELOW,g.ContentWidgetPositionPreference.ABOVE]}},e.prototype.getDomNode=function(){return this.element},e.prototype.getId=function(){return e.ID},e.prototype.updateListHeight=function(){var e=0;if(2===this.state||1===this.state)e=this.unfocusedHeight;else{var t=this.list.contentHeight/this.unfocusedHeight;e=Math.min(t,12)*this.unfocusedHeight}return this.element.style.lineHeight=this.unfocusedHeight+"px",this.listElement.style.height=e+"px",this.list.layout(e),this.editor.layoutContentWidget(this),e},e.prototype.adjustDocsPosition=function(){var e=this.editor.getConfiguration().fontInfo.lineHeight,t=this.editor.getScrolledVisiblePosition(this.editor.getPosition()),n=l.getDomNodePagePosition(this.editor.getDomNode()),i=n.left+t.left,o=n.top+t.top+t.height,r=l.getDomNodePagePosition(this.element),s=r.left,a=r.top;sa&&this.details.element.offsetHeight>this.listElement.offsetHeight&&(this.listElement.style.marginTop=this.details.element.offsetHeight-this.listElement.offsetHeight+"px")},e.prototype.expandSideOrBelow=function(){var e=this.element.style.maxWidth.match(/(\d+)px/);!e||Number(e[1])0&&this._activeAcceptCharacters.add(i[0])}}else this.reset()},e.prototype.reset=function(){this._activeItem=void 0},e.prototype.dispose=function(){r.dispose(this._disposables)},e}(),x=function(){function e(e,t,n,i,o){var r=this;this._editor=e,this._commandService=t,this._telemetryService=n,this._toDispose=[],this._model=new S.SuggestModel(this._editor),this._toDispose.push(this._model.onDidTrigger(function(e){return r._widget.showTriggered(e.auto)})),this._toDispose.push(this._model.onDidSuggest(function(e){return r._widget.showSuggestions(e.completionModel,e.isFrozen,e.auto)})),this._toDispose.push(this._model.onDidCancel(function(e){return!e.retrigger&&r._widget.hideWidget()}));var s=w.Context.AcceptSuggestionsOnEnter.bindTo(i),a=function(){var e=r._editor.getConfiguration().contribInfo.acceptSuggestionOnEnter;s.set("on"===e||"smart"===e||!0===e)};this._toDispose.push(this._editor.onDidChangeConfiguration(function(e){return a()})),a(),this._widget=o.createInstance(E.SuggestWidget,this._editor),this._toDispose.push(this._widget.onDidSelect(this._onDidSelectItem,this));var u=new L(e,this._widget,function(e){return r._onDidSelectItem(e)});this._toDispose.push(u,this._model.onDidSuggest(function(e){0===e.completionModel.items.length&&u.reset()}));var l=w.Context.MakesTextEdit.bindTo(i);this._toDispose.push(this._widget.onDidFocus(function(e){var t=r._editor.getPosition(),n=e.position.column-e.suggestion.overwriteBefore,i=t.column,o=!0;"smart"!==r._editor.getConfiguration().contribInfo.acceptSuggestionOnEnter||2!==r._model.state||e.suggestion.command||e.suggestion.additionalTextEdits||"textmate"===e.suggestion.snippetType||i-n!==e.suggestion.insertText.length||(o=r._editor.getModel().getValueInRange({startLineNumber:t.lineNumber,startColumn:n,endLineNumber:t.lineNumber,endColumn:i})!==e.suggestion.insertText),l.set(o)})),this._toDispose.push({dispose:function(){l.reset()}})}return t=e,e.get=function(e){return e.getContribution(t.ID)},e.prototype.getId=function(){return t.ID},e.prototype.dispose=function(){this._toDispose=r.dispose(this._toDispose),this._widget&&(this._widget.dispose(),this._widget=null),this._model&&(this._model.dispose(),this._model=null)},e.prototype._onDidSelectItem=function(e){if(e){var t=e.suggestion,n=e.position,o=this._editor.getPosition().column-n.column;Array.isArray(t.additionalTextEdits)&&(this._editor.pushUndoStop(),this._editor.executeEdits("suggestController.additionalTextEdits",t.additionalTextEdits.map(function(e){return g.EditOperation.replace(m.Range.lift(e.range),e.text)})),this._editor.pushUndoStop());var r=t.insertText;"textmate"!==t.snippetType&&(r=C.SnippetParser.escape(r)),b.SnippetController2.get(this._editor).insert(r,t.overwriteBefore+o,t.overwriteAfter),t.command&&(s=this._commandService).executeCommand.apply(s,[t.command.id].concat(t.command.arguments)).done(void 0,i.onUnexpectedError),this._alertCompletionItem(e),this._telemetryService.publicLog("suggestSnippetInsert",_({},this._editor.getTelemetryData(),{suggestionType:t.type}))}this._model.cancel();var s},e.prototype._alertCompletionItem=function(e){var t=e.suggestion,i=n.localize(0,null,t.label,t.insertText);h.alert(i)},e.prototype.triggerSuggest=function(e){this._model.trigger(!1,!1,e),this._editor.revealLine(this._editor.getPosition().lineNumber),this._editor.focus()},e.prototype.acceptSelectedSuggestion=function(){if(this._widget){var e=this._widget.getFocusedItem();this._onDidSelectItem(e)}},e.prototype.cancelSuggestWidget=function(){this._widget&&(this._model.cancel(),this._widget.hideWidget())},e.prototype.selectNextSuggestion=function(){this._widget&&this._widget.selectNext()},e.prototype.selectNextPageSuggestion=function(){this._widget&&this._widget.selectNextPage()},e.prototype.selectLastSuggestion=function(){this._widget&&this._widget.selectLast()},e.prototype.selectPrevSuggestion=function(){this._widget&&this._widget.selectPrevious()},e.prototype.selectPrevPageSuggestion=function(){this._widget&&this._widget.selectPreviousPage()},e.prototype.selectFirstSuggestion=function(){this._widget&&this._widget.selectFirst()},e.prototype.toggleSuggestionDetails=function(){this._widget&&this._widget.toggleDetails()},e.prototype.toggleSuggestionFocus=function(){this._widget&&this._widget.toggleDetailsFocus()},e.ID="editor.contrib.suggestController",e=t=v([p.editorContribution,y(1,l.ICommandService),y(2,a.ITelemetryService),y(3,u.IContextKeyService),y(4,s.IInstantiationService)],e);var t}();t.SuggestController=x;var N=function(e){function t(){return e.call(this,{id:"editor.action.triggerSuggest",label:n.localize(1,null),alias:"Trigger Suggest",precondition:u.ContextKeyExpr.and(c.EditorContextKeys.writable,c.EditorContextKeys.hasCompletionItemProvider),kbOpts:{kbExpr:c.EditorContextKeys.textFocus,primary:2058,mac:{primary:266}}})||this}return f(t,e),t.prototype.run=function(e,t){var n=x.get(t);n&&n.triggerSuggest()},t=v([d.editorAction],t)}(d.EditorAction);t.TriggerSuggestAction=N;var M=d.CommonEditorRegistry.commandWeight(90),T=d.EditorCommand.bindToContribution(x.get);d.CommonEditorRegistry.registerEditorCommand(new T({id:"acceptSelectedSuggestion",precondition:w.Context.Visible,handler:function(e){return e.acceptSelectedSuggestion()},kbOpts:{weight:M,kbExpr:c.EditorContextKeys.textFocus,primary:2}})),d.CommonEditorRegistry.registerEditorCommand(new T({id:"acceptSelectedSuggestionOnEnter",precondition:w.Context.Visible,handler:function(e){return e.acceptSelectedSuggestion()},kbOpts:{weight:M,kbExpr:u.ContextKeyExpr.and(c.EditorContextKeys.textFocus,w.Context.AcceptSuggestionsOnEnter,w.Context.MakesTextEdit),primary:3}})),d.CommonEditorRegistry.registerEditorCommand(new T({id:"hideSuggestWidget",precondition:w.Context.Visible,handler:function(e){return e.cancelSuggestWidget()},kbOpts:{weight:M,kbExpr:c.EditorContextKeys.textFocus,primary:9,secondary:[1033]}})),d.CommonEditorRegistry.registerEditorCommand(new T({id:"selectNextSuggestion",precondition:u.ContextKeyExpr.and(w.Context.Visible,w.Context.MultipleSuggestions),handler:function(e){return e.selectNextSuggestion()},kbOpts:{weight:M,kbExpr:c.EditorContextKeys.textFocus,primary:18,secondary:[2066],mac:{primary:18,secondary:[2066,300]}}})),d.CommonEditorRegistry.registerEditorCommand(new T({id:"selectNextPageSuggestion",precondition:u.ContextKeyExpr.and(w.Context.Visible,w.Context.MultipleSuggestions),handler:function(e){return e.selectNextPageSuggestion()},kbOpts:{weight:M,kbExpr:c.EditorContextKeys.textFocus,primary:12,secondary:[2060]}})),d.CommonEditorRegistry.registerEditorCommand(new T({id:"selectLastSuggestion",precondition:u.ContextKeyExpr.and(w.Context.Visible,w.Context.MultipleSuggestions),handler:function(e){return e.selectLastSuggestion()}})),d.CommonEditorRegistry.registerEditorCommand(new T({id:"selectPrevSuggestion",precondition:u.ContextKeyExpr.and(w.Context.Visible,w.Context.MultipleSuggestions),handler:function(e){return e.selectPrevSuggestion()},kbOpts:{weight:M,kbExpr:c.EditorContextKeys.textFocus,primary:16,secondary:[2064],mac:{primary:16,secondary:[2064,302]}}})),d.CommonEditorRegistry.registerEditorCommand(new T({id:"selectPrevPageSuggestion",precondition:u.ContextKeyExpr.and(w.Context.Visible,w.Context.MultipleSuggestions),handler:function(e){return e.selectPrevPageSuggestion()},kbOpts:{weight:M,kbExpr:c.EditorContextKeys.textFocus,primary:11,secondary:[2059]}})),d.CommonEditorRegistry.registerEditorCommand(new T({id:"selectFirstSuggestion",precondition:u.ContextKeyExpr.and(w.Context.Visible,w.Context.MultipleSuggestions),handler:function(e){return e.selectFirstSuggestion()}})),d.CommonEditorRegistry.registerEditorCommand(new T({id:"toggleSuggestionDetails",precondition:w.Context.Visible,handler:function(e){return e.toggleSuggestionDetails()},kbOpts:{weight:M,kbExpr:c.EditorContextKeys.textFocus,primary:2058,mac:{primary:266}}})),d.CommonEditorRegistry.registerEditorCommand(new T({id:"toggleSuggestionFocus",precondition:w.Context.Visible,handler:function(e){return e.toggleSuggestionFocus()},kbOpts:{weight:M,kbExpr:c.EditorContextKeys.textFocus,primary:2570,mac:{primary:778}}}))}),define(d[532],h([1,0,374,18,10,2,20,13,17,3,23,14,54,34]),function(e,t,n,i,o,r,s,a,u,l,c,d,h,p){"use strict";function f(e,t){var n=u.DocumentHighlightProviderRegistry.ordered(e),r=!1;return i.sequence(n.map(function(n){return function(){if(!r)return i.asWinJsPromise(function(i){return n.provideDocumentHighlights(e,t,i)}).then(function(e){if(Array.isArray(e)&&e.length>0)return r=!0,e},function(e){o.onUnexpectedExternalError(e)})}})).then(function(e){return e[0]})}Object.defineProperty(t,"__esModule",{value:!0}),t.editorWordHighlight=c.registerColor("editor.wordHighlightBackground",{dark:"#575757B8",light:"#57575740",hc:null},n.localize(0,null)),t.editorWordHighlightStrong=c.registerColor("editor.wordHighlightStrongBackground",{dark:"#004972B8",light:"#0e639c40",hc:null},n.localize(1,null)),t.getOccurrencesAtPosition=f,a.CommonEditorRegistry.registerDefaultLanguageCommand("_executeDocumentHighlights",f);var g=function(){function e(e){var t=this;this.workerRequestTokenId=0,this.workerRequest=null,this.workerRequestCompleted=!1,this.workerRequestValue=[],this.lastCursorPositionChangeTime=0,this.renderDecorationsTimer=-1,this.editor=e,this.occurrencesHighlight=this.editor.getConfiguration().contribInfo.occurrencesHighlight,this.model=this.editor.getModel(),this.toUnhook=[],this.toUnhook.push(e.onDidChangeCursorPosition(function(e){t.occurrencesHighlight&&t._onPositionChanged(e)})),this.toUnhook.push(e.onDidChangeModel(function(e){t._stopAll(),t.model=t.editor.getModel()})),this.toUnhook.push(e.onDidChangeModelContent(function(e){t._stopAll()})),this.toUnhook.push(e.onDidChangeConfiguration(function(e){var n=t.editor.getConfiguration().contribInfo.occurrencesHighlight;t.occurrencesHighlight!==n&&(t.occurrencesHighlight=n,t._stopAll())})),this._lastWordRange=null,this._decorationIds=[],this.workerRequestTokenId=0,this.workerRequest=null,this.workerRequestCompleted=!1,this.lastCursorPositionChangeTime=0,this.renderDecorationsTimer=-1}return e.prototype._removeDecorations=function(){this._decorationIds.length>0&&(this._decorationIds=this.editor.deltaDecorations(this._decorationIds,[]))},e.prototype._stopAll=function(){this._lastWordRange=null,this._removeDecorations(),-1!==this.renderDecorationsTimer&&(clearTimeout(this.renderDecorationsTimer),this.renderDecorationsTimer=-1),null!==this.workerRequest&&(this.workerRequest.cancel(),this.workerRequest=null),this.workerRequestCompleted||(this.workerRequestTokenId++,this.workerRequestCompleted=!0)},e.prototype._onPositionChanged=function(e){var t=this;if(this.occurrencesHighlight)if(e.reason===h.CursorChangeReason.Explicit)if(u.DocumentHighlightProviderRegistry.has(this.model)){var n=this.editor.getSelection();if(n.startLineNumber===n.endLineNumber){var i=n.startLineNumber,o=n.startColumn,s=n.endColumn,a=this.model.getWordAtPosition({lineNumber:i,column:o});if(!a||a.startColumn>o||a.endColumn=s&&(c=!0)}if(this.lastCursorPositionChangeTime=(new Date).getTime(),c)this.workerRequestCompleted&&-1!==this.renderDecorationsTimer&&(clearTimeout(this.renderDecorationsTimer),this.renderDecorationsTimer=-1,this._beginRenderDecorations());else{this._stopAll();var m=++this.workerRequestTokenId;this.workerRequestCompleted=!1,this.workerRequest=f(this.model,this.editor.getPosition()),this.workerRequest.then(function(e){m===t.workerRequestTokenId&&(t.workerRequestCompleted=!0,t.workerRequestValue=e||[],t._beginRenderDecorations())}).done()}this._lastWordRange=l}}else this._stopAll()}else this._stopAll();else this._stopAll();else this._stopAll()},e.prototype._beginRenderDecorations=function(){var e=this,t=(new Date).getTime(),n=this.lastCursorPositionChangeTime+250;t>=n?(this.renderDecorationsTimer=-1,this.renderDecorations()):this.renderDecorationsTimer=setTimeout(function(){e.renderDecorations()},n-t)},e.prototype.renderDecorations=function(){this.renderDecorationsTimer=-1;for(var t=[],n=0,i=this.workerRequestValue.length;n0?o.format(O,e.length):null:T}Object.defineProperty(t,"__esModule",{value:!0});var N=new d.RawContextKey("accessibilityHelpWidgetVisible",!1),M=function(e){function t(t,n){var i=e.call(this)||this;return i._editor=t,i._widget=i._register(n.createInstance(R,i._editor)),i}return f(t,e),n=t,t.get=function(e){return e.getContribution(n.ID)},t.prototype.getId=function(){return n.ID},t.prototype.show=function(){this._widget.show()},t.prototype.hide=function(){this._widget.hide()},t.ID="editor.contrib.accessibilityHelpController",t=n=v([g.editorContribution,y(1,l.IInstantiationService)],t);var n}(i.Disposable),T=n.localize("noSelection","No selection"),k=n.localize("singleSelectionRange","Line {0}, Column {1} ({2} selected)"),I=n.localize("singleSelection","Line {0}, Column {1}"),D=n.localize("multiSelectionRange","{0} selections ({1} characters selected)"),O=n.localize("multiSelection","{0} selections"),R=function(e){function t(t,i,o,s){var u=e.call(this)||this;return u._contextKeyService=i,u._keybindingService=o,u._openerService=s,u._editor=t,u._isVisibleKey=N.bindTo(u._contextKeyService),u._domNode=a.createFastDomNode(document.createElement("div")),u._domNode.setClassName("accessibilityHelpWidget"),u._domNode.setDisplay("none"),u._domNode.setAttribute("role","dialog"),u._domNode.setAttribute("aria-hidden","true"),u._contentDomNode=a.createFastDomNode(document.createElement("div")),u._contentDomNode.setAttribute("role","document"),u._domNode.appendChild(u._contentDomNode),u._isVisible=!1,u._register(u._editor.onDidLayoutChange(function(){u._isVisible&&u._layout()})),u._register(r.addStandardDisposableListener(u._contentDomNode.domNode,"keydown",function(e){if(u._isVisible&&(e.equals(2083)&&(w.alert(n.localize("emergencyConfOn","Now changing the setting `accessibilitySupport` to 'on'.")),u._editor.updateOptions({accessibilitySupport:"on"}),r.clearNode(u._contentDomNode.domNode),u._buildContent(),u._contentDomNode.domNode.focus(),e.preventDefault(),e.stopPropagation()),e.equals(2086))){w.alert(n.localize("openingDocs","Now opening the Editor Accessibility documentation page."));var t=u._editor.getRawConfiguration().accessibilityHelpUrl;void 0===t&&(t="https://go.microsoft.com/fwlink/?linkid=852450"),u._openerService.open(E.default.parse(t)),e.preventDefault(),e.stopPropagation()}})),u.onblur(u._contentDomNode.domNode,function(){u.hide()}),u._editor.addOverlayWidget(u),u}return f(t,e),t.prototype.dispose=function(){this._editor.removeOverlayWidget(this),e.prototype.dispose.call(this)},t.prototype.getId=function(){return t.ID},t.prototype.getDomNode=function(){return this._domNode.domNode},t.prototype.getPosition=function(){return{preference:null}},t.prototype.show=function(){this._isVisible||(this._isVisible=!0,this._isVisibleKey.set(!0),this._layout(),this._domNode.setDisplay("block"),this._domNode.setAttribute("aria-hidden","false"),this._contentDomNode.domNode.tabIndex=0,this._buildContent(),this._contentDomNode.domNode.focus())},t.prototype._descriptionForCommand=function(e,t,n){var i=this._keybindingService.lookupKeybinding(e);return i?o.format(t,i.getAriaLabel()):o.format(n,e)},t.prototype._buildContent=function(){var e=this._editor.getConfiguration(),t=this._editor.getSelections(),i=0;if(t){var o=this._editor.getModel();o&&t.forEach(function(e){i+=o.getValueLengthInRange(e)})}var r=x(t,i);switch(e.wrappingInfo.inDiffEditor?e.readOnly?r+=n.localize("readonlyDiffEditor"," in a read-only pane of a diff editor."):r+=n.localize("editableDiffEditor"," in a pane of a diff editor."):e.readOnly?r+=n.localize("readonlyEditor"," in a read-only code editor"):r+=n.localize("editableEditor"," in a code editor"),e.accessibilitySupport){case 0:var a=b.isMacintosh?n.localize("changeConfigToOnMac","To configure the editor to be optimized for usage with a Screen Reader press Command+E now."):n.localize("changeConfigToOnWinLinux","To configure the editor to be optimized for usage with a Screen Reader press Control+E now.");r+="\n\n - "+a;break;case 2:r+="\n\n - "+n.localize("auto_on","The editor is configured to be optimized for usage with a Screen Reader.");break;case 1:r+="\n\n - "+n.localize("auto_off","The editor is configured to never be optimized for usage with a Screen Reader, which is not the case at this time."),r+=" "+a}var u=n.localize("tabFocusModeOnMsg","Pressing Tab in the current editor will move focus to the next focusable element. Toggle this behavior by pressing {0}."),l=n.localize("tabFocusModeOnMsgNoKb","Pressing Tab in the current editor will move focus to the next focusable element. The command {0} is currently not triggerable by a keybinding."),c=n.localize("tabFocusModeOffMsg","Pressing Tab in the current editor will insert the tab character. Toggle this behavior by pressing {0}."),d=n.localize("tabFocusModeOffMsgNoKb","Pressing Tab in the current editor will insert the tab character. The command {0} is currently not triggerable by a keybinding.");e.tabFocusMode?r+="\n\n - "+this._descriptionForCommand(m.ToggleTabFocusModeAction.ID,u,l):r+="\n\n - "+this._descriptionForCommand(m.ToggleTabFocusModeAction.ID,c,d),r+="\n\n - "+(b.isMacintosh?n.localize("openDocMac","Press Command+H now to open a browser window with more information related to editor accessibility."):n.localize("openDocWinLinux","Press Control+H now to open a browser window with more information related to editor accessibility.")),r+="\n\n"+n.localize("outroMsg","You can dismiss this tooltip and return to the editor by pressing Escape or Shift+Escape."),this._contentDomNode.domNode.appendChild(s.renderFormattedText(r)),this._contentDomNode.domNode.setAttribute("aria-label",r)},t.prototype.hide=function(){this._isVisible&&(this._isVisible=!1,this._isVisibleKey.reset(),this._domNode.setDisplay("none"),this._domNode.setAttribute("aria-hidden","true"),this._contentDomNode.domNode.tabIndex=-1,r.clearNode(this._contentDomNode.domNode),this._editor.focus())},t.prototype._layout=function(){var e=this._editor.getLayoutInfo(),n=Math.max(5,Math.min(t.WIDTH,e.width-40)),i=Math.max(5,Math.min(t.HEIGHT,e.height-40));this._domNode.setWidth(n),this._domNode.setHeight(i);var o=Math.round((e.height-i)/2);this._domNode.setTop(o);var r=Math.round((e.width-n)/2);this._domNode.setLeft(r)},t.ID="editor.contrib.accessibilityHelpWidget",t.WIDTH=500,t.HEIGHT=300,t=v([y(1,d.IContextKeyService),y(2,c.IKeybindingService),y(3,S.IOpenerService)],t)}(u.Widget),P=(function(e){function t(){return e.call(this,{id:"editor.action.showAccessibilityHelp",label:n.localize("ShowAccessibilityHelpAction","Show Accessibility Help"),alias:"Show Accessibility Help",precondition:null,kbOpts:{kbExpr:h.EditorContextKeys.focus,primary:L.isIE?2107:571}})||this}f(t,e),t.prototype.run=function(e,t){var n=M.get(t);n&&n.show()},t=v([p.editorAction],t)}(p.EditorAction),p.EditorCommand.bindToContribution(M.get));p.CommonEditorRegistry.registerEditorCommand(new P({id:"closeAccessibilityHelp",precondition:N,handler:function(e){return e.hide()},kbOpts:{weight:p.CommonEditorRegistry.commandWeight(100),kbExpr:h.EditorContextKeys.focus,primary:9,secondary:[1033]}})),_.registerThemingParticipant(function(e,t){var n=e.getColor(C.editorWidgetBackground);n&&t.addRule(".monaco-editor .accessibilityHelpWidget { background-color: "+n+"; }");var i=e.getColor(C.widgetShadow);i&&t.addRule(".monaco-editor .accessibilityHelpWidget { box-shadow: 0 2px 8px "+i+"; }");var o=e.getColor(C.contrastBorder);o&&t.addRule(".monaco-editor .accessibilityHelpWidget { border: 2px solid "+o+"; }")})}),define(d[535],h([1,0,376,3,9,13,25,30,88,116,17,77,68,14,23,403]),function(e,t,n,i,o,r,s,a,u,l,c,d,h,p,g){"use strict";function m(e){for(var t="",n=0,i=e.length;n=0;i--){var r=t.tokens1[i];if(e.column-1>=r.offset){n=i;break}}for(var s=0,i=t.tokens2.length>>>1;i>=0;i--)if(e.column-1>=t.tokens2[i<<1]){s=i;break}var a="",u=this._model.getLineContent(e.lineNumber),l="";if(n'+m(l)+'('+l.length+" "+(1===l.length?"char":"chars")+")",a+='
    ';var h=this._decodeMetadata(t.tokens2[1+(s<<1)]);a+='',a+='",a+='",a+='",a+='",a+='",a+="",a+='
    ',n'+o.escape(t.tokens1[n].type)+""),this._domNode.innerHTML=a,this._editor.layoutContentWidget(this)},t.prototype._decodeMetadata=function(e){var t=c.TokenizationRegistry.getColorMap(),n=l.TokenMetadata.getLanguageId(e),i=l.TokenMetadata.getTokenType(e),o=l.TokenMetadata.getFontStyle(e),r=l.TokenMetadata.getForeground(e),s=l.TokenMetadata.getBackground(e);return{languageIdentifier:this._modeService.getLanguageIdentifier(n),tokenType:i,fontStyle:o,foreground:t[r],background:t[s]}},t.prototype._tokenTypeToString=function(e){switch(e){case 0:return"Other";case 1:return"Comment";case 2:return"String";case 4:return"RegEx"}return"??"},t.prototype._fontStyleToString=function(e){var t="";return 1&e&&(t+="italic "),2&e&&(t+="bold "),4&e&&(t+="underline "),0===t.length&&(t="---"),t},t.prototype._getTokensAtLine=function(e){var t=this._getStateBeforeLine(e),n=this._tokenizationSupport.tokenize(this._model.getLineContent(e),t,0),i=this._tokenizationSupport.tokenize2(this._model.getLineContent(e),t,0);return{startState:t,tokens1:n.tokens,tokens2:i.tokens,endState:n.endState}},t.prototype._getStateBeforeLine=function(e){for(var t=this._tokenizationSupport.getInitialState(),n=1;n1?n.localize(0,null,t.lineNumber,t.column):n.localize(1,null,t.lineNumber,t.column):t.lineNumber<1||t.lineNumber>o.getLineCount()?n.localize(2,null,o.getLineCount()):n.localize(3,null,o.getLineMaxColumn(t.lineNumber)),{position:t,isValid:a,label:s}},t.prototype.getLabel=function(){return this._parseResult.label},t.prototype.getAriaLabel=function(){return n.localize(4,null,this._parseResult.label)},t.prototype.run=function(e,t){return e===o.Mode.OPEN?this.runOpen():this.runPreview()},t.prototype.runOpen=function(){if(!this._parseResult.isValid)return!1;var e=this.toSelection();return this.editor.setSelection(e),this.editor.revealRangeInCenter(e),this.editor.focus(),!0},t.prototype.runPreview=function(){if(!this._parseResult.isValid)return this.decorator.clearDecorations(),!1;var e=this.toSelection();return this.editor.revealRangeInCenter(e),this.decorator.decorateLine(e,this.editor),!1},t.prototype.toSelection=function(){return new c.Range(this._parseResult.position.lineNumber,this._parseResult.position.column,this._parseResult.position.lineNumber,this._parseResult.position.column)},t}(i.QuickOpenEntry);t.GotoLineEntry=d;var h=function(e){function t(){return e.call(this,n.localize(5,null),{id:"editor.action.gotoLine",label:n.localize(6,null),alias:"Go to Line...",precondition:null,kbOpts:{kbExpr:s.EditorContextKeys.focus,primary:2085,mac:{primary:293}}})||this}return f(t,e),t.prototype.run=function(e,t){var n=this;this._show(this.getController(t),{getModel:function(e){return new i.QuickOpenModel([new d(e,t,n.getController(t))])},getAutoFocus:function(e){return{autoFocusFirstEntry:e.length>0}}})},t=v([u.editorAction],t)}(a.BaseEditorQuickOpenAction);t.GotoLineAction=h}),define(d[538],h([1,0,378,10,81,7,120,100,46,21,143,13,28]),function(e,t,n,i,o,r,s,a,u,l,c,d,h){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var p=function(e){function t(t,n,i,o){var r=e.call(this)||this;return r.key=t,r.setHighlights(n),r.action=i,r.editor=o,r}return f(t,e),t.prototype.getLabel=function(){return this.action.label},t.prototype.getAriaLabel=function(){return n.localize(0,null,this.getLabel())},t.prototype.getGroupLabel=function(){return this.key},t.prototype.run=function(e,t){var n=this;return e===a.Mode.OPEN&&(r.TPromise.timeout(50).done(function(){n.editor.focus();try{(n.action.run()||r.TPromise.as(null)).done(null,i.onUnexpectedError)}catch(e){i.onUnexpectedError(e)}},i.onUnexpectedError),!0)},t}(s.QuickOpenEntryGroup);t.EditorActionCommandEntry=p;var g=function(e){function t(){return e.call(this,n.localize(1,null),{id:"editor.action.quickCommand",label:n.localize(2,null),alias:"Command Palette",precondition:null,kbOpts:{kbExpr:l.EditorContextKeys.focus,primary:h.isIE?571:59},menuOpts:{}})||this}return f(t,e),t.prototype.run=function(e,t){var n=this,i=e.get(u.IKeybindingService);this._show(this.getController(t),{getModel:function(e){return new s.QuickOpenModel(n._editorActionsToEntries(i,t,e))},getAutoFocus:function(e){return{autoFocusFirstEntry:!0,autoFocusPrefixMatch:e}}})},t.prototype._sort=function(e,t){var n=e.getLabel().toLowerCase(),i=t.getLabel().toLowerCase();return n.localeCompare(i)},t.prototype._editorActionsToEntries=function(e,t,n){for(var i=t.getSupportedActions(),r=[],s=0;s0&&0===r.indexOf(":")){for(var m=null,v=null,_=0,y=0;y0)):_++}v&&v.setGroupLabel(this.typeToLabel(m,_))}else a.length>0&&a[0].setGroupLabel(n.localize(3,null,a.length));return a},t.prototype.typeToLabel=function(e,t){switch(e){case"module":return n.localize(4,null,t);case"class":return n.localize(5,null,t);case"interface":return n.localize(6,null,t);case"method":return n.localize(7,null,t);case"function":return n.localize(8,null,t);case"property":return n.localize(9,null,t);case"variable":return n.localize(10,null,t);case"var":return n.localize(11,null,t);case"constructor":return n.localize(12,null,t);case"call":return n.localize(13,null,t)}return e},t.prototype.sortNormal=function(e,t,n){var i=t.getLabel().toLowerCase(),o=n.getLabel().toLowerCase(),r=i.localeCompare(o);if(0!==r)return r;var s=t.getRange(),a=n.getRange();return s.startLineNumber-a.startLineNumber},t.prototype.sortScoped=function(e,t,n){e=e.substr(":".length);var i=t.getType(),o=n.getType(),r=i.localeCompare(o);if(0!==r)return r;if(e){var s=t.getLabel().toLowerCase(),a=n.getLabel().toLowerCase(),u=s.localeCompare(a);if(0!==u)return u}var l=t.getRange(),c=n.getRange();return l.startLineNumber-c.startLineNumber},t=v([d.editorAction],t)}(l.BaseEditorQuickOpenAction);t.QuickOutlineAction=g}),define(d[540],h([1,0,3,7,69,16,31,46,19,42,61,129,141,193,77,149,85,14,51,50,380,28]),function(e,t,n,i,o,r,s,a,u,l,c,d,h,p,g,m,_,C,b,w,S,E){"use strict";function L(){N||(N=!0,b.setARIAContainer(document.body))}Object.defineProperty(t,"__esModule",{value:!0});var x=0,N=!1,M=function(e){function t(t,n,i,o,r,s,a,u){var l=this;return n=n||{},n.ariaLabel=n.ariaLabel||S.localize(0,null),n.ariaLabel=n.ariaLabel+";"+(E.isIE?S.localize(1,null):S.localize(2,null)),l=e.call(this,t,n,i,o,r,s,u)||this,a instanceof d.StandaloneKeybindingService&&(l._standaloneKeybindingService=a),L(),l}return f(t,e),t.prototype.addCommand=function(e,t,n){if(!this._standaloneKeybindingService)return console.warn("Cannot add command because the editor is configured with an unrecognized KeybindingService"),null;var i="DYNAMIC_"+ ++x,o=u.ContextKeyExpr.deserialize(n);return this._standaloneKeybindingService.addDynamicKeybinding(i,e,t,o),i},t.prototype.createContextKey=function(e,t){return this._contextKeyService.createKey(e,t)},t.prototype.addAction=function(e){var t=this;if("string"!=typeof e.id||"string"!=typeof e.label||"function"!=typeof e.run)throw new Error("Invalid action descriptor, `id`, `label` and `run` are required properties!");if(!this._standaloneKeybindingService)return console.warn("Cannot add keybinding because the editor is configured with an unrecognized KeybindingService"),n.empty;var o=e.id,r=e.label,a=u.ContextKeyExpr.and(u.ContextKeyExpr.equals("editorId",this.getId()),u.ContextKeyExpr.deserialize(e.precondition)),l=e.keybindings,c=u.ContextKeyExpr.and(a,u.ContextKeyExpr.deserialize(e.keybindingContext)),d=e.contextMenuGroupId||null,h=e.contextMenuOrder||0,p=function(){var n=e.run(t);return n||i.TPromise.as(void 0)},f=[],g=this.getId()+":"+o;if(f.push(s.CommandsRegistry.registerCommand(g,p)),d){var v={command:{id:g,title:r},when:a,group:d,order:h};f.push(_.MenuRegistry.appendMenuItem(_.MenuId.EditorContext,v))}Array.isArray(l)&&(f=f.concat(l.map(function(e){return t._standaloneKeybindingService.addDynamicKeybinding(g,e,p,c)})));var y=new m.InternalEditorAction(g,r,r,a,p,this._contextKeyService);return this._actions[o]=y,f.push({dispose:function(){delete t._actions[o]}}),n.combinedDisposable(f)},t=v([y(2,r.IInstantiationService),y(3,l.ICodeEditorService),y(4,s.ICommandService),y(5,u.IContextKeyService),y(6,a.IKeybindingService),y(7,C.IThemeService)],t)}(h.CodeEditor);t.StandaloneCodeEditor=M;var T=function(e){function t(t,n,i,o,r,s,a,u,l,c){var d=this;"string"==typeof(n=n||{}).theme&&c.setTheme(n.theme);var h=n.model;if(delete n.model,d=e.call(this,t,n,o,r,s,a,u,c)||this,d._contextViewService=l,d._register(i),void 0===h?(h=self.monaco.editor.createModel(n.value||"",n.language||"text/plain"),d._ownsModel=!0):d._ownsModel=!1,d._attachModel(h),h){var p={oldModelUrl:null,newModelUrl:h.uri};d._onDidChangeModel.fire(p)}return d}return f(t,e),t.prototype.dispose=function(){e.prototype.dispose.call(this)},t.prototype.destroy=function(){this.dispose()},t.prototype._attachModel=function(t){e.prototype._attachModel.call(this,t),this._view&&this._contextViewService.setContainer(this._view.domNode.domNode)},t.prototype._postDetachModelCleanup=function(t){e.prototype._postDetachModelCleanup.call(this,t),t&&this._ownsModel&&(t.dispose(),this._ownsModel=!1)},t=v([y(3,r.IInstantiationService),y(4,l.ICodeEditorService),y(5,s.ICommandService),y(6,u.IContextKeyService),y(7,a.IKeybindingService),y(8,o.IContextViewService),y(9,g.IStandaloneThemeService)],t)}(M);t.StandaloneEditor=T;var k=function(e){function t(t,n,i,o,r,s,a,u,l,c,h){var p=this;return"string"==typeof(n=n||{}).theme&&(n.theme=c.setTheme(n.theme)),p=e.call(this,t,n,u,r,o,l,c,h)||this,s instanceof d.StandaloneKeybindingService&&(p._standaloneKeybindingService=s),p._contextViewService=a,p._register(i),p._contextViewService.setContainer(p._containerDomElement),p}return f(t,e),t.prototype.dispose=function(){e.prototype.dispose.call(this)},t.prototype.destroy=function(){this.dispose()},t.prototype._createInnerEditor=function(e,t,n){return e.createInstance(M,t,n)},t.prototype.getOriginalEditor=function(){return e.prototype.getOriginalEditor.call(this)},t.prototype.getModifiedEditor=function(){return e.prototype.getModifiedEditor.call(this)},t.prototype.addCommand=function(e,t,n){return this.getModifiedEditor().addCommand(e,t,n)},t.prototype.createContextKey=function(e,t){return this.getModifiedEditor().createContextKey(e,t)},t.prototype.addAction=function(e){return this.getModifiedEditor().addAction(e)},t=v([y(3,r.IInstantiationService),y(4,u.IContextKeyService),y(5,a.IKeybindingService),y(6,o.IContextViewService),y(7,c.IEditorWorkerService),y(8,l.ICodeEditorService),y(9,g.IStandaloneThemeService),y(10,w.IMessageService)],t)}(p.DiffEditorWidget);t.StandaloneDiffEditor=k}),define(d[541],h([1,0,23,37]),function(e,t,n,i){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.vs={base:"vs",inherit:!1,rules:[{token:"",foreground:"000000",background:"fffffe"},{token:"invalid",foreground:"cd3131"},{token:"emphasis",fontStyle:"italic"},{token:"strong",fontStyle:"bold"},{token:"variable",foreground:"001188"},{token:"variable.predefined",foreground:"4864AA"},{token:"constant",foreground:"dd0000"},{token:"comment",foreground:"008000"},{token:"number",foreground:"09885A"},{token:"number.hex",foreground:"3030c0"},{token:"regexp",foreground:"800000"},{token:"annotation",foreground:"808080"},{token:"type",foreground:"008080"},{token:"delimiter",foreground:"000000"},{token:"delimiter.html",foreground:"383838"},{token:"delimiter.xml",foreground:"0000FF"},{token:"tag",foreground:"800000"},{token:"tag.id.jade",foreground:"4F76AC"},{token:"tag.class.jade",foreground:"4F76AC"},{token:"meta.scss",foreground:"800000"},{token:"metatag",foreground:"e00000"},{token:"metatag.content.html",foreground:"FF0000"},{token:"metatag.html",foreground:"808080"},{token:"metatag.xml",foreground:"808080"},{token:"metatag.php",fontStyle:"bold"},{token:"key",foreground:"863B00"},{token:"string.key.json",foreground:"A31515"},{token:"string.value.json",foreground:"0451A5"},{token:"attribute.name",foreground:"FF0000"},{token:"attribute.value",foreground:"0451A5"},{token:"attribute.value.number",foreground:"09885A"},{token:"attribute.value.unit",foreground:"09885A"},{token:"attribute.value.html",foreground:"0000FF"},{token:"attribute.value.xml",foreground:"0000FF"},{token:"string",foreground:"A31515"},{token:"string.html",foreground:"0000FF"},{token:"string.sql",foreground:"FF0000"},{token:"string.yaml",foreground:"0451A5"},{token:"keyword",foreground:"0000FF"},{token:"keyword.json",foreground:"0451A5"},{token:"keyword.flow",foreground:"AF00DB"},{token:"keyword.flow.scss",foreground:"0000FF"},{token:"operator.scss",foreground:"666666"},{token:"operator.sql",foreground:"778899"},{token:"operator.swift",foreground:"666666"},{token:"predefined.sql",foreground:"FF00FF"}],colors:(o={},o[n.editorBackground]="#FFFFFE",o[n.editorForeground]="#000000",o[n.editorInactiveSelection]="#E5EBF1",o[i.editorIndentGuides]="#D3D3D3",o[n.editorSelectionHighlight]="#ADD6FF4D",o)},t.vs_dark={base:"vs-dark",inherit:!1,rules:[{token:"",foreground:"D4D4D4",background:"1E1E1E"},{token:"invalid",foreground:"f44747"},{token:"emphasis",fontStyle:"italic"},{token:"strong",fontStyle:"bold"},{token:"variable",foreground:"74B0DF"},{token:"variable.predefined",foreground:"4864AA"},{token:"variable.parameter",foreground:"9CDCFE"},{token:"constant",foreground:"569CD6"},{token:"comment",foreground:"608B4E"},{token:"number",foreground:"B5CEA8"},{token:"number.hex",foreground:"5BB498"},{token:"regexp",foreground:"B46695"},{token:"annotation",foreground:"cc6666"},{token:"type",foreground:"3DC9B0"},{token:"delimiter",foreground:"DCDCDC"},{token:"delimiter.html",foreground:"808080"},{token:"delimiter.xml",foreground:"808080"},{token:"tag",foreground:"569CD6"},{token:"tag.id.jade",foreground:"4F76AC"},{token:"tag.class.jade",foreground:"4F76AC"},{token:"meta.scss",foreground:"A79873"},{token:"meta.tag",foreground:"CE9178"},{token:"metatag",foreground:"DD6A6F"},{token:"metatag.content.html",foreground:"9CDCFE"},{token:"metatag.html",foreground:"569CD6"},{token:"metatag.xml",foreground:"569CD6"},{token:"metatag.php",fontStyle:"bold"},{token:"key",foreground:"9CDCFE"},{token:"string.key.json",foreground:"9CDCFE"},{token:"string.value.json",foreground:"CE9178"},{token:"attribute.name",foreground:"9CDCFE"},{token:"attribute.value",foreground:"CE9178"},{token:"attribute.value.number.css",foreground:"B5CEA8"},{token:"attribute.value.unit.css",foreground:"B5CEA8"},{token:"attribute.value.hex.css",foreground:"D4D4D4"},{token:"string",foreground:"CE9178"},{token:"string.sql",foreground:"FF0000"},{token:"keyword",foreground:"569CD6"},{token:"keyword.flow",foreground:"C586C0"},{token:"keyword.json",foreground:"CE9178"},{token:"keyword.flow.scss",foreground:"569CD6"},{token:"operator.scss",foreground:"909090"},{token:"operator.sql",foreground:"778899"},{token:"operator.swift",foreground:"909090"},{token:"predefined.sql",foreground:"FF00FF"}],colors:(r={},r[n.editorBackground]="#1E1E1E",r[n.editorForeground]="#D4D4D4",r[n.editorInactiveSelection]="#3A3D41",r[i.editorIndentGuides]="#404040",r[n.editorSelectionHighlight]="#ADD6FF26",r)},t.hc_black={base:"hc-black",inherit:!1,rules:[{token:"",foreground:"FFFFFF",background:"000000"},{token:"invalid",foreground:"f44747"},{token:"emphasis",fontStyle:"italic"},{token:"strong",fontStyle:"bold"},{token:"variable",foreground:"1AEBFF"},{token:"variable.parameter",foreground:"9CDCFE"},{token:"constant",foreground:"569CD6"},{token:"comment",foreground:"608B4E"},{token:"number",foreground:"FFFFFF"},{token:"regexp",foreground:"C0C0C0"},{token:"annotation",foreground:"569CD6"},{token:"type",foreground:"3DC9B0"},{token:"delimiter",foreground:"FFFF00"},{token:"delimiter.html",foreground:"FFFF00"},{token:"tag",foreground:"569CD6"},{token:"tag.id.jade",foreground:"4F76AC"},{token:"tag.class.jade",foreground:"4F76AC"},{token:"meta",foreground:"D4D4D4"},{token:"meta.tag",foreground:"CE9178"},{token:"metatag",foreground:"569CD6"},{token:"metatag.content.html",foreground:"1AEBFF"},{token:"metatag.html",foreground:"569CD6"},{token:"metatag.xml",foreground:"569CD6"},{token:"metatag.php",fontStyle:"bold"},{token:"key",foreground:"9CDCFE"},{token:"string.key",foreground:"9CDCFE"},{token:"string.value",foreground:"CE9178"},{token:"attribute.name",foreground:"569CD6"},{token:"attribute.value",foreground:"3FF23F"},{token:"string",foreground:"CE9178"},{token:"string.sql",foreground:"FF0000"},{token:"keyword",foreground:"569CD6"},{token:"keyword.flow",foreground:"C586C0"},{token:"operator.sql",foreground:"778899"},{token:"operator.swift",foreground:"909090"},{token:"predefined.sql",foreground:"FF00FF"}],colors:(s={},s[n.editorBackground]="#000000",s[n.editorForeground]="#FFFFFF",s[i.editorIndentGuides]="#FFFFFF",s)};var o,r,s}),define(d[542],h([1,0,202,541,4,17,32,23,14,44,11]),function(e,t,n,i,o,r,s,a,u,l,c){"use strict";function d(e){return e===f||e===g||e===m}function h(e){switch(e){case f:return i.vs;case g:return i.vs_dark;case m:return i.hc_black}}function p(e){var t=h(e);return new y(e,"",t.colors,t.rules)}Object.defineProperty(t,"__esModule",{value:!0});var f="vs",g="vs-dark",m="hc-black",v=l.Registry.as(a.Extensions.ColorContribution),_=l.Registry.as(u.Extensions.ThemingContribution),y=function(){function e(e,t,n,i){t.length>0?(this.id=e+" "+t,this.themeName=t):(this.id=e,this.themeName=e),this.base=e,this.rules=i,this.colors={};for(var o in n)this.colors[o]=s.Color.fromHex(n[o]);this.defaultColors={}}return e.prototype.getColor=function(e,t){return this.colors.hasOwnProperty(e)?this.colors[e]:!1!==t?this.getDefault(e):null},e.prototype.getDefault=function(e){if(this.defaultColors.hasOwnProperty(e))return this.defaultColors[e];var t=v.resolveDefaultColor(e,this);return this.defaultColors[e]=t,t},e.prototype.defines=function(e){return this.colors.hasOwnProperty(e)},Object.defineProperty(e.prototype,"type",{get:function(){switch(this.base){case f:return"light";case m:return"hc";default:return"dark"}},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"tokenTheme",{get:function(){return this._tokenTheme||(this._tokenTheme=n.TokenTheme.createFromRawTokenTheme(this.rules)),this._tokenTheme},enumerable:!0,configurable:!0}),e}(),C=function(){function e(){this._onThemeChange=new c.Emitter,this._knownThemes=new Map,this._knownThemes.set(f,p(f)),this._knownThemes.set(g,p(g)),this._knownThemes.set(m,p(m)),this._styleElement=o.createStyleSheet(),this._styleElement.className="monaco-colors",this.setTheme(f)}return Object.defineProperty(e.prototype,"onThemeChange",{get:function(){return this._onThemeChange.event},enumerable:!0,configurable:!0}),e.prototype.defineTheme=function(e,t){if(!/^[a-z0-9\-]+$/i.test(e)||d(e))throw new Error("Illegal theme name!");if(!d(t.base))throw new Error("Illegal theme base!");var n=[],i={};if(t.inherit){var o=h(t.base);n=n.concat(o.rules);for(var r in o.colors)i[r]=o.colors[r]}n=n.concat(t.rules);for(var r in t.colors)i[r]=t.colors[r];this._knownThemes.set(e,new y(t.base,e,i,n))},e.prototype.getTheme=function(){return this._theme},e.prototype.setTheme=function(e){var t;t=this._knownThemes.has(e)?this._knownThemes.get(e):this._knownThemes.get(f),this._theme=t;var i=[],o={},s={addRule:function(e){o[e]||(i.push(e),o[e]=!0)}};_.getThemingParticipants().forEach(function(e){return e(t,s)});var a=t.tokenTheme.getColorMap();return s.addRule(n.generateTokensCSSForColorMap(a)),this._styleElement.innerHTML=i.join("\n"),r.TokenizationRegistry.setColorMap(a),this._onThemeChange.fire(t),t.id},e}();t.StandaloneThemeServiceImpl=C}),define(d[144],h([1,0,24,16,45,80]),function(e,t,n,i,o,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.IWorkspaceContextService=i.createDecorator("contextService");var s=function(){function e(e,t){this._resource=e,this._ctime=t,this._name=o.basename(this._resource.fsPath)||this._resource.fsPath}return Object.defineProperty(e.prototype,"resource",{get:function(){return this._resource},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"name",{get:function(){return this._name},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"ctime",{get:function(){return this._ctime},enumerable:!0,configurable:!0}),e.prototype.toResource=function(e,t){return"string"==typeof e?n.default.file(o.join(t?t.fsPath:this._resource.fsPath,e)):null},e}();t.LegacyWorkspace=s;var a=function(){function e(e,t,n,i){void 0===i&&(i=null),this.id=e,this._name=t,this._roots=n,this._configuration=i,this._rootsMap=new r.TrieMap(r.TrieMap.PathSplitter),this.updateRootsMap()}return Object.defineProperty(e.prototype,"roots",{get:function(){return this._roots},set:function(e){this._roots=e,this.updateRootsMap()},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"name",{get:function(){return this._name},set:function(e){this._name=e},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"configuration",{get:function(){return this._configuration},set:function(e){this._configuration=e},enumerable:!0,configurable:!0}),e.prototype.getRoot=function(e){return e?this._rootsMap.findSubstr(e.fsPath):null},e.prototype.updateRootsMap=function(){this._rootsMap=new r.TrieMap(r.TrieMap.PathSplitter);for(var e=0,t=this.roots;e1?this.badge.setTitleFormat(n.localize(1,null,t)):this.badge.setTitleFormat(n.localize(2,null,t))},e=v([y(1,S.IWorkspaceContextService),y(2,b.optional(R.IEnvironmentService)),y(3,D.IThemeService)],e)}(),H=function(){function e(e){var t=document.createElement("div");this.before=document.createElement("span"),this.inside=document.createElement("span"),this.after=document.createElement("span"),h.addClass(this.inside,"referenceMatch"),h.addClass(t,"reference"),t.appendChild(this.before),t.appendChild(this.inside),t.appendChild(this.after),e.appendChild(t)}return e.prototype.set=function(e){var t=e.parent.preview.preview(e.range),n=t.before,i=t.inside,o=t.after;this.before.innerHTML=u.escape(n),this.inside.innerHTML=u.escape(i),this.after.innerHTML=u.escape(o)},e}(),z=function(){function e(e,t,n){this._contextService=e,this._themeService=t,this._environmentService=n}return e.prototype.getHeight=function(e,t){return 22},e.prototype.getTemplateId=function(t,n){if(n instanceof T.FileReferences)return e._ids.FileReferences;if(n instanceof T.OneReference)return e._ids.OneReference;throw n},e.prototype.renderTemplate=function(t,n,i){if(n===e._ids.FileReferences)return new V(i,this._contextService,this._environmentService,this._themeService);if(n===e._ids.OneReference)return new H(i);throw n},e.prototype.renderElement=function(e,t,n,i){if(t instanceof T.FileReferences)i.set(t);else{if(!(t instanceof T.OneReference))throw n;i.set(t)}},e.prototype.disposeTemplate=function(e,t,n){n instanceof V&&n.dispose()},e._ids={FileReferences:"FileReferences",OneReference:"OneReference"},e=v([y(0,S.IWorkspaceContextService),y(1,D.IThemeService),y(2,b.optional(R.IEnvironmentService))],e)}(),K=function(){function e(){}return e.prototype.getAriaLabel=function(e,t){return t instanceof T.FileReferences?t.getAriaMessage():t instanceof T.OneReference?t.getAriaMessage():void 0},e}(),U=function(){function e(e,t){var n=this;this._disposables=[],this._onDidChangePercentages=new r.Emitter,this._ratio=t,this._sash=new p.Sash(e,{getVerticalSashLeft:function(){return n._width*n._ratio},getVerticalSashHeight:function(){return n._height}});var i;this._disposables.push(this._sash.addListener("start",function(e){i=e.startX-n._width*n.ratio})),this._disposables.push(this._sash.addListener("change",function(e){var t=e.currentX-i;t>20&&t+200?e.children[0]:void 0},u.prototype._revealReference=function(e){var t=this;e.uri.scheme!==a.Schemas.inMemory?this.setTitle(e.name,o.getPathLabel(e.directory,this._contextService,this._environmentService)):this.setTitle(n.localize(6,null));var r=this._textModelResolverService.createModelReference(e.uri);return l.TPromise.join([r,this._tree.reveal(e)]).then(function(n){var i=n[0];if(t._model){s.dispose(t._previewModelReference);var o=i.object;if(o){t._previewModelReference=i,t._preview.setModel(o.textEditorModel);var r=E.Range.lift(e.range).collapseToStart();t._preview.setSelection(r),t._preview.revealRangeInCenter(r)}else t._preview.setModel(t._previewNotAvailableMessage),i.dispose();t._tree.setSelection([e]),t._tree.setFocus(e)}else i.dispose()},i.onUnexpectedError)},u}(M.PeekViewWidget);t.ReferenceWidget=j,t.peekViewTitleBackground=I.registerColor("peekViewTitle.background",{dark:"#1E1E1E",light:"#FFFFFF",hc:"#0C141F"},n.localize(7,null)),t.peekViewTitleForeground=I.registerColor("peekViewTitleLabel.foreground",{dark:"#FFFFFF",light:"#333333",hc:"#FFFFFF"},n.localize(8,null)),t.peekViewTitleInfoForeground=I.registerColor("peekViewTitleDescription.foreground",{dark:"#ccccccb3",light:"#6c6c6cb3",hc:"#FFFFFF99"},n.localize(9,null)),t.peekViewBorder=I.registerColor("peekView.border",{dark:"#007acc",light:"#007acc",hc:I.contrastBorder},n.localize(10,null)),t.peekViewResultsBackground=I.registerColor("peekViewResult.background",{dark:"#252526",light:"#F3F3F3",hc:c.Color.black},n.localize(11,null)),t.peekViewResultsMatchForeground=I.registerColor("peekViewResult.lineForeground",{dark:"#bbbbbb",light:"#646465",hc:c.Color.white},n.localize(12,null)),t.peekViewResultsFileForeground=I.registerColor("peekViewResult.fileForeground",{dark:c.Color.white,light:"#1E1E1E",hc:c.Color.white},n.localize(13,null)),t.peekViewResultsSelectionBackground=I.registerColor("peekViewResult.selectionBackground",{dark:"#3399ff33",light:"#3399ff33",hc:null},n.localize(14,null)),t.peekViewResultsSelectionForeground=I.registerColor("peekViewResult.selectionForeground",{dark:c.Color.white,light:"#6C6C6C",hc:c.Color.white},n.localize(15,null)),t.peekViewEditorBackground=I.registerColor("peekViewEditor.background",{dark:"#001F33",light:"#F2F8FC",hc:c.Color.black},n.localize(16,null)),t.peekViewEditorGutterBackground=I.registerColor("peekViewEditorGutter.background",{dark:t.peekViewEditorBackground,light:t.peekViewEditorBackground,hc:t.peekViewEditorBackground},n.localize(17,null)),t.peekViewResultsMatchHighlight=I.registerColor("peekViewResult.matchHighlightBackground",{dark:"#ea5c004d",light:"#ea5c004d",hc:null},n.localize(18,null)),t.peekViewEditorMatchHighlight=I.registerColor("peekViewEditor.matchHighlightBackground",{dark:"#ff8f0099",light:"#f5d802de",hc:null},n.localize(19,null)),D.registerThemingParticipant(function(e,n){var i=e.getColor(t.peekViewResultsMatchHighlight);i&&n.addRule(".monaco-editor .reference-zone-widget .ref-tree .referenceMatch { background-color: "+i+"; }");var o=e.getColor(t.peekViewEditorMatchHighlight);o&&n.addRule(".monaco-editor .reference-zone-widget .preview .reference-decoration { background-color: "+o+"; }");var r=e.getColor(I.activeContrastBorder);r&&(n.addRule(".monaco-editor .reference-zone-widget .ref-tree .referenceMatch { border: 1px dotted "+r+"; box-sizing: border-box; }"),n.addRule(".monaco-editor .reference-zone-widget .preview .reference-decoration { border: 2px solid "+r+"; box-sizing: border-box; }"));var s=e.getColor(t.peekViewResultsBackground);s&&n.addRule(".monaco-editor .reference-zone-widget .ref-tree { background-color: "+s+"; }");var a=e.getColor(t.peekViewResultsMatchForeground);a&&n.addRule(".monaco-editor .reference-zone-widget .ref-tree { color: "+a+"; }");var u=e.getColor(t.peekViewResultsFileForeground);u&&n.addRule(".monaco-editor .reference-zone-widget .ref-tree .reference-file { color: "+u+"; }");var l=e.getColor(t.peekViewResultsSelectionBackground);l&&n.addRule(".monaco-editor .reference-zone-widget .ref-tree .monaco-tree.focused .monaco-tree-rows > .monaco-tree-row.selected:not(.highlighted) { background-color: "+l+"; }");var c=e.getColor(t.peekViewResultsSelectionForeground);c&&n.addRule(".monaco-editor .reference-zone-widget .ref-tree .monaco-tree.focused .monaco-tree-rows > .monaco-tree-row.selected:not(.highlighted) { color: "+c+" !important; }");var d=e.getColor(t.peekViewEditorBackground);d&&n.addRule(".monaco-editor .reference-zone-widget .preview .monaco-editor .monaco-editor-background,.monaco-editor .reference-zone-widget .preview .monaco-editor .inputarea.ime-input {\tbackground-color: "+d+";}");var h=e.getColor(t.peekViewEditorGutterBackground);h&&n.addRule(".monaco-editor .reference-zone-widget .preview .monaco-editor .margin {\tbackground-color: "+h+";}")})}),define(d[198],h([1,0,364,10,3,36,64,11,16,19,50,58,62,144,76,30,92,544,87,14,12,156]),function(e,t,n,i,o,r,s,a,u,l,c,d,h,p,f,g,m,_,C,b,w,S){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ctxReferenceSearchVisible=new l.RawContextKey("referenceSearchVisible",!1);var E=function(){function e(e,n,i,o,r,s,a,u,l,c,d,h,p){this._editorService=i,this._textModelResolverService=o,this._telemetryService=r,this._messageService=s,this._instantiationService=a,this._contextService=u,this._storageService=l,this._themeService=c,this._configurationService=d,this._peekViewService=h,this._environmentService=p,this._requestIdPool=0,this._disposables=[],this._ignoreModelChangeEvent=!1,this._editor=e,this._referenceSearchVisible=t.ctxReferenceSearchVisible.bindTo(n)}return E=e,e.get=function(e){return e.getContribution(E.ID)},e.prototype.getId=function(){return E.ID},e.prototype.dispose=function(){this._widget&&(this._widget.dispose(),this._widget=null),this._editor=null},e.prototype.toggleWidget=function(e,t,i){var o,s=this;if(this._widget&&(o=this._widget.position),this.closeWidget(),o&&e.containsPosition(o))return null;this._referenceSearchVisible.set(!0),this._disposables.push(this._editor.onDidChangeModelLanguage(function(){s.closeWidget()})),this._disposables.push(this._editor.onDidChangeModel(function(){s._ignoreModelChangeEvent||s.closeWidget()}));var u=JSON.parse(this._storageService.get("peekViewLayout",void 0,"{}"));this._widget=new _.ReferenceWidget(this._editor,u,this._textModelResolverService,this._contextService,this._themeService,this._instantiationService,this._environmentService),this._widget.setTitle(n.localize(0,null)),this._widget.show(e),this._disposables.push(this._widget.onDidClose(function(){t.cancel(),s._storageService.store("peekViewLayout",JSON.stringify(s._widget.layoutData)),s._widget=null,s.closeWidget()})),this._disposables.push(this._widget.onDidSelectReference(function(e){var t=e.element,n=e.kind;switch(n){case"open":if("editor"===e.source&&s._configurationService.lookup("editor.stablePeek").value)break;case"side":s._openReference(t,"side"===n);break;case"goto":i.onGoto?i.onGoto(t):s._gotoReference(t)}}));var l=++this._requestIdPool,c=t.then(function(t){if(l===s._requestIdPool&&s._widget){s._model&&s._model.dispose(),s._model=t;var n=Date.now();return s._disposables.push({dispose:function(){s._telemetryService.publicLog("zoneWidgetShown",{mode:"reference search",elapsedTime:Date.now()-n})}}),s._widget.setModel(s._model).then(function(){s._widget.setMetaTitle(i.getMetaTitle(s._model));var t=s._editor.getModel().uri,n=new w.Position(e.startLineNumber,e.startColumn),o=s._model.nearestReference(t,n);if(o)return s._widget.setSelection(o)})}},function(e){s._messageService.show(r.default.Error,e)}),d=a.stopwatch(a.fromPromise(c)),h=this._editor.getModel().getLanguageIdentifier().language;d(function(e){return s._telemetryService.publicLog("findReferences",{duration:e,mode:h})})},e.prototype.closeWidget=function(){this._widget&&(this._widget.dispose(),this._widget=null),this._referenceSearchVisible.reset(),this._disposables=o.dispose(this._disposables),this._model&&(this._model.dispose(),this._model=null),this._editor.focus(),this._requestIdPool+=1},e.prototype._gotoReference=function(e){var t=this;this._widget.hide(),this._ignoreModelChangeEvent=!0;var n=e.uri,o=e.range;this._editorService.openEditor({resource:n,options:{selection:o}}).done(function(e){t._ignoreModelChangeEvent=!1,e&&e.getControl()===t._editor?(t._widget.show(o),t._widget.focus()):t.closeWidget()},function(e){t._ignoreModelChangeEvent=!1,i.onUnexpectedError(e)})},e.prototype._openReference=function(e,t){var n=e.uri,i=e.range;this._editorService.openEditor({resource:n,options:{selection:i}},t),t||this.closeWidget()},e.ID="editor.contrib.referencesController",e=E=v([g.editorContribution,y(1,l.IContextKeyService),y(2,s.IEditorService),y(3,C.ITextModelService),y(4,d.ITelemetryService),y(5,c.IMessageService),y(6,u.IInstantiationService),y(7,p.IWorkspaceContextService),y(8,f.IStorageService),y(9,b.IThemeService),y(10,h.IConfigurationService),y(11,u.optional(m.IPeekViewService)),y(12,u.optional(S.IEnvironmentService))],e);var E}();t.ReferencesController=E}),define(d[199],h([1,0,351,51,40,15,36,7,64,50,2,13,177,198,125,92,19,521,21]),function(e,t,n,i,o,r,s,a,u,l,c,d,h,p,g,m,_,y,C){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var b=function(){return function(e,t,n,i){void 0===e&&(e=!1),void 0===t&&(t=!1),void 0===n&&(n=!0),void 0===i&&(i=!0),this.openToSide=e,this.openInPeek=t,this.filterCurrent=n,this.showMessage=i}}();t.DefinitionActionConfig=b;var w=function(e){function t(t,n){var i=e.call(this,n)||this;return i._configuration=t,i}return f(t,e),t.prototype.run=function(e,t){var n=this,i=e.get(l.IMessageService),o=e.get(u.IEditorService),r=t.getModel(),a=t.getPosition();return this._getDeclarationsAtPosition(r,a).then(function(e){if(!r.isDisposed()&&t.getModel()===r){for(var i=-1,s=[],u=0;u1&&n.localize(2,null,e.references.length)},t.prototype._onResult=function(e,t,n){var o=this,r=n.getAriaMessage();if(i.alert(r),this._configuration.openInPeek)this._openInPeek(e,t,n);else{var s=n.nearestReference(t.getModel().uri,t.getPosition());this._openReference(e,s,this._configuration.openToSide).then(function(t){t&&n.references.length>1?o._openInPeek(e,t,n):n.dispose()})}},t.prototype._openReference=function(e,t,n){var i=t.uri,o=t.range;return e.openEditor({resource:i,options:{selection:c.Range.collapseToStart(o),revealIfVisible:!n}},n).then(function(e){return e&&e.getControl()})},t.prototype._openInPeek=function(e,t,n){var i=this,o=p.ReferencesController.get(t);o?o.toggleWidget(t.getSelection(),a.TPromise.as(n),{getMetaTitle:function(e){return i._getMetaTitle(e)},onGoto:function(t){return o.closeWidget(),i._openReference(e,t,!1)}}):n.dispose()},t}(d.EditorAction);t.DefinitionAction=w;var S=r.isWeb?2118:70,E=function(e){function t(){return e.call(this,new b,{id:i.ID,label:n.localize(3,null),alias:"Go to Definition",precondition:_.ContextKeyExpr.and(C.EditorContextKeys.hasDefinitionProvider,C.EditorContextKeys.isInEmbeddedEditor.toNegated()),kbOpts:{kbExpr:C.EditorContextKeys.textFocus,primary:S},menuOpts:{group:"navigation",order:1.1}})||this}return f(t,e),i=t,t.ID="editor.action.goToDeclaration",t=i=v([d.editorAction],t);var i}(w);t.GoToDefinitionAction=E;var L=function(e){function t(){return e.call(this,new b(!0),{id:i.ID,label:n.localize(4,null),alias:"Open Definition to the Side",precondition:_.ContextKeyExpr.and(C.EditorContextKeys.hasDefinitionProvider,C.EditorContextKeys.isInEmbeddedEditor.toNegated()),kbOpts:{kbExpr:C.EditorContextKeys.textFocus,primary:o.KeyChord(2089,S)}})||this}return f(t,e),i=t,t.ID="editor.action.openDeclarationToTheSide",t=i=v([d.editorAction],t);var i}(w);t.OpenDefinitionToSideAction=L;var x=function(e){function t(){return e.call(this,new b(void 0,!0,!1),{id:"editor.action.previewDeclaration",label:n.localize(5,null),alias:"Peek Definition",precondition:_.ContextKeyExpr.and(C.EditorContextKeys.hasDefinitionProvider,m.PeekContext.notInPeekEditor,C.EditorContextKeys.isInEmbeddedEditor.toNegated()),kbOpts:{kbExpr:C.EditorContextKeys.textFocus,primary:582,linux:{primary:3140}},menuOpts:{group:"navigation",order:1.2}})||this}return f(t,e),t=v([d.editorAction],t)}(w);t.PeekDefinitionAction=x;var N=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return f(t,e),t.prototype._getDeclarationsAtPosition=function(e,t){return h.getImplementationsAtPosition(e,t)},t.prototype._getNoResultFoundMessage=function(e){return e&&e.word?n.localize(6,null,e.word):n.localize(7,null)},t.prototype._getMetaTitle=function(e){return e.references.length>1&&n.localize(8,null,e.references.length)},t}(w);t.ImplementationAction=N;var M=function(e){function t(){return e.call(this,new b,{id:i.ID,label:n.localize(9,null),alias:"Go to Implementation",precondition:_.ContextKeyExpr.and(C.EditorContextKeys.hasImplementationProvider,C.EditorContextKeys.isInEmbeddedEditor.toNegated()),kbOpts:{kbExpr:C.EditorContextKeys.textFocus,primary:2118}})||this}return f(t,e),i=t,t.ID="editor.action.goToImplementation",t=i=v([d.editorAction],t);var i}(N);t.GoToImplementationAction=M;var T=function(e){function t(){return e.call(this,new b(!1,!0,!1),{id:i.ID,label:n.localize(10,null),alias:"Peek Implementation",precondition:_.ContextKeyExpr.and(C.EditorContextKeys.hasImplementationProvider,C.EditorContextKeys.isInEmbeddedEditor.toNegated()),kbOpts:{kbExpr:C.EditorContextKeys.textFocus,primary:3142}})||this}return f(t,e),i=t,t.ID="editor.action.peekImplementation",t=i=v([d.editorAction],t);var i}(N);t.PeekImplementationAction=T;var k=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return f(t,e),t.prototype._getDeclarationsAtPosition=function(e,t){return h.getTypeDefinitionsAtPosition(e,t)},t.prototype._getNoResultFoundMessage=function(e){return e&&e.word?n.localize(11,null,e.word):n.localize(12,null)},t.prototype._getMetaTitle=function(e){return e.references.length>1&&n.localize(13,null,e.references.length)},t}(w);t.TypeDefinitionAction=k;var I=function(e){function t(){return e.call(this,new b,{id:i.ID,label:n.localize(14,null),alias:"Go to Type Definition",precondition:_.ContextKeyExpr.and(C.EditorContextKeys.hasTypeDefinitionProvider,C.EditorContextKeys.isInEmbeddedEditor.toNegated()),kbOpts:{kbExpr:C.EditorContextKeys.textFocus,primary:0},menuOpts:{group:"navigation",order:1.4}})||this}return f(t,e),i=t,t.ID="editor.action.goToTypeDefinition",t=i=v([d.editorAction],t);var i}(k);t.GoToTypeDefintionAction=I;var D=function(e){function t(){return e.call(this,new b(!1,!0,!1),{id:i.ID,label:n.localize(15,null),alias:"Peek Type Definition",precondition:_.ContextKeyExpr.and(C.EditorContextKeys.hasTypeDefinitionProvider,C.EditorContextKeys.isInEmbeddedEditor.toNegated()),kbOpts:{kbExpr:C.EditorContextKeys.textFocus,primary:0}})||this}return f(t,e),i=t,t.ID="editor.action.peekTypeDefinition",t=i=v([d.editorAction],t);var i}(k);t.PeekTypeDefinitionAction=D}),define(d[547],h([1,0,352,18,10,7,88,2,17,25,30,177,3,87,14,23,131,199,192,171]),function(e,t,n,i,o,r,s,a,u,l,c,d,h,p,f,g,m,_,C){"use strict";Object.defineProperty(t,"__esModule",{value:!0});!function(){function e(e,t,n){var r=this;this.textModelResolverService=t,this.modeService=n,this.toUnhook=[],this.decorations=[],this.editor=e,this.throttler=new i.Throttler;var s=new C.ClickLinkGesture(e);this.toUnhook.push(s),this.toUnhook.push(s.onMouseMoveOrRelevantKeyDown(function(e){var t=e[0],n=e[1];r.startFindDefinition(t,n)})),this.toUnhook.push(s.onExecute(function(e){r.isEnabled(e)&&r.gotoDefinition(e.target,e.hasSideBySideModifier).done(function(){r.removeDecorations()},function(e){r.removeDecorations(),o.onUnexpectedError(e)})})),this.toUnhook.push(s.onCancel(function(){r.removeDecorations(),r.currentWordUnderMouse=null}))}return t=e,e.prototype.startFindDefinition=function(e,i){var s=this;if(!this.isEnabled(e,i))return this.currentWordUnderMouse=null,void this.removeDecorations();var u=e.target.position,l=u?this.editor.getModel().getWordAtPosition(u):null;if(!l)return this.currentWordUnderMouse=null,void this.removeDecorations();if(!this.currentWordUnderMouse||this.currentWordUnderMouse.startColumn!==l.startColumn||this.currentWordUnderMouse.endColumn!==l.endColumn||this.currentWordUnderMouse.word!==l.word){this.currentWordUnderMouse=l;var c=new m.EditorState(this.editor,15);this.throttler.queue(function(){return c.validate(s.editor)?s.findDefinition(e.target):r.TPromise.as(null)}).then(function(e){if(e&&e.length&&c.validate(s.editor))if(e.length>1)s.addDecoration(new a.Range(u.lineNumber,l.startColumn,u.lineNumber,l.endColumn),n.localize(0,null,e.length));else{var i=e[0];if(!i.uri)return;s.textModelResolverService.createModelReference(i.uri).then(function(e){if(e.object&&e.object.textEditorModel){var n=e.object.textEditorModel,o=i.range.startLineNumber;if(0!==n.getLineMaxColumn(o)){for(var r=n.getLineFirstNonWhitespaceColumn(o),c=Math.min(n.getLineCount(),o+t.MAX_SOURCE_PREVIEW_LINES),d=o+1,h=r;d0&&(this.decorations=this.editor.deltaDecorations(this.decorations,[]))},e.prototype.isEnabled=function(e,t){return this.editor.getModel()&&e.isNoneOrSingleMouseDown&&e.target.type===l.MouseTargetType.CONTENT_TEXT&&(e.hasTriggerModifier||t&&t.keyCodeIsTriggerKey)&&u.DefinitionProviderRegistry.has(this.editor.getModel())},e.prototype.findDefinition=function(e){return this.editor.getModel()?d.getDefinitionsAtPosition(this.editor.getModel(),e.position):r.TPromise.as(null)},e.prototype.gotoDefinition=function(e,t){var n=this;this.editor.setPosition(e.position);var i=new _.DefinitionAction(new _.DefinitionActionConfig(t,!1,!0,!1),{alias:void 0,label:void 0,id:void 0,precondition:void 0});return this.editor.invokeWithinContext(function(e){return i.run(e,n.editor)})},e.prototype.getId=function(){return t.ID},e.prototype.dispose=function(){this.toUnhook=h.dispose(this.toUnhook)},e.ID="editor.contrib.gotodefinitionwithmouse",e.MAX_SOURCE_PREVIEW_LINES=8,e=t=v([c.editorContribution,y(1,p.ITextModelService),y(2,s.IModeService)],e);var t}();f.registerThemingParticipant(function(e,t){var n=e.getColor(g.editorActiveLinkForeground);n&&t.addRule(".monaco-editor .goto-definition-link { color: "+n+" !important; }")})}),define(d[548],h([1,0,363,24,7,64,16,31,19,105,12,2,20,13,17,92,198,125,18,10,21]),function(e,t,n,i,o,r,s,a,u,l,c,d,h,p,g,m,_,C,b,w,S){"use strict";function E(e,t){var n=m.getOuterEditor(e);if(n){var i=_.ReferencesController.get(n);i&&i.closeWidget()}}function L(e,t){var n=g.ReferenceProviderRegistry.ordered(e).map(function(n){return b.asWinJsPromise(function(i){return n.provideReferences(e,t,{includeDeclaration:!0},i)}).then(function(e){if(Array.isArray(e))return e},function(e){w.onUnexpectedExternalError(e)})});return o.TPromise.join(n).then(function(e){for(var t=[],n=0,i=e;n1&&n.localize(0,null,e.references.length)}},N=function(){function e(e,t,n){n&&m.PeekContext.inPeekEditor.bindTo(t)}return t=e,e.prototype.dispose=function(){},e.prototype.getId=function(){return t.ID},e.ID="editor.contrib.referenceController",e=t=v([p.commonEditorContribution,y(1,u.IContextKeyService),y(2,s.optional(m.IPeekViewService))],e);var t}();t.ReferenceController=N;var M=function(e){function t(){return e.call(this,{id:"editor.action.referenceSearch.trigger",label:n.localize(1,null),alias:"Find All References",precondition:u.ContextKeyExpr.and(S.EditorContextKeys.hasReferenceProvider,m.PeekContext.notInPeekEditor,S.EditorContextKeys.isInEmbeddedEditor.toNegated()),kbOpts:{kbExpr:S.EditorContextKeys.textFocus,primary:1094},menuOpts:{group:"navigation",order:1.5}})||this}return f(t,e),t.prototype.run=function(e,t){var n=_.ReferencesController.get(t);if(n){var i=t.getSelection(),o=L(t.getModel(),i.getStartPosition()).then(function(e){return new C.ReferencesModel(e)});n.toggleWidget(i,o,x)}},t=v([p.editorAction],t)}(p.EditorAction);t.ReferenceAction=M;a.CommandsRegistry.registerCommand("editor.action.findReferences",function(e,t,n){if(!(t instanceof i.default))throw new Error("illegal argument, uri");if(!n)throw new Error("illegal argument, position");return e.get(r.IEditorService).openEditor({resource:t}).then(function(e){var t=e.getControl();if(h.isCommonCodeEditor(t)){var i=_.ReferencesController.get(t);if(i){var r=L(t.getModel(),c.Position.lift(n)).then(function(e){return new C.ReferencesModel(e)}),s=new d.Range(n.lineNumber,n.column,n.lineNumber,n.column);return o.TPromise.as(i.toggleWidget(s,r,x))}}})}),a.CommandsRegistry.registerCommand("editor.action.showReferences",{handler:function(e,t,n,s){if(!(t instanceof i.default))throw new Error("illegal argument, uri expected");return e.get(r.IEditorService).openEditor({resource:t}).then(function(e){var t=e.getControl();if(h.isCommonCodeEditor(t)){var i=_.ReferencesController.get(t);if(i)return o.TPromise.as(i.toggleWidget(new d.Range(n.lineNumber,n.column,n.lineNumber,n.column),o.TPromise.as(new C.ReferencesModel(s)),x)).then(function(){return!0})}})},description:{description:"Show references at a position in a file",args:[{name:"uri",description:"The text document in which to show references",constraint:i.default},{name:"position",description:"The position at which to show",constraint:c.Position.isIPosition},{name:"locations",description:"An array of locations.",constraint:Array}]}}),l.KeybindingsRegistry.registerCommandAndKeybindingRule({id:"closeReferenceSearch",weight:p.CommonEditorRegistry.commandWeight(50),primary:9,secondary:[1033],when:u.ContextKeyExpr.and(_.ctxReferenceSearchVisible,u.ContextKeyExpr.not("config.editor.stablePeek")),handler:E}),l.KeybindingsRegistry.registerCommandAndKeybindingRule({id:"closeReferenceSearchEditor",weight:p.CommonEditorRegistry.commandWeight(-101),primary:9,secondary:[1033],when:u.ContextKeyExpr.and(m.PeekContext.inPeekEditor,u.ContextKeyExpr.not("config.editor.stablePeek")),handler:E}),t.provideReferences=L,p.CommonEditorRegistry.registerDefaultLanguageCommand("_executeReferenceProvider",L)}),define(d[549],h([1,0,134,191,193,164,514,313,450,451,452,516,454,455,456,431,520,458,460,199,547,522,523,524,464,525,465,527,469,548,529,471,180,531,181,532,476,517]),function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0})}),define(d[200],h([1,0,3,62,387,69,478,16,413,84,31,46,19,421,103,50,163,76,58,144,42,61,147,146,88,437,56,430,485,129,417,85,77,542]),function(e,t,n,i,o,r,s,a,u,l,c,d,h,p,g,m,v,_,y,C,b,w,S,E,L,x,N,M,T,k,I,D,O,R){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var P;!function(e){function t(e,t){var n=new o(e,t);return r.push(n),n}var n=new l.ServiceCollection,o=function(){function e(e,t){this._serviceId=e,this._factory=t,this._value=null}return Object.defineProperty(e.prototype,"id",{get:function(){return this._serviceId},enumerable:!0,configurable:!0}),e.prototype.get=function(e){if(!this._value){if(e&&(this._value=e[this._serviceId.toString()]),this._value||(this._value=this._factory(e)),!this._value)throw new Error("Service "+this._serviceId+" is missing!");n.set(this._serviceId,this._value)}return this._value},e}();e.LazyStaticService=o;var r=[];e.init=function(e){var t=new l.ServiceCollection;for(var n in e)e.hasOwnProperty(n)&&t.set(a.createDecorator(n),e[n]);r.forEach(function(n){return t.set(n.id,n.get(e))});var i=new u.InstantiationService(t,!0);return t.set(a.IInstantiationService,i),[t,i]},e.instantiationService=t(a.IInstantiationService,function(){return new u.InstantiationService(n,!0)});var s=new k.SimpleConfigurationService;e.configurationService=t(i.IConfigurationService,function(){return s}),e.resourceConfigurationService=t(E.ITextResourceConfigurationService,function(){return new k.SimpleResourceConfigurationService(s)}),e.contextService=t(C.IWorkspaceContextService,function(){return new k.SimpleWorkspaceContextService}),e.telemetryService=t(y.ITelemetryService,function(){return new k.StandaloneTelemetryService}),e.messageService=t(m.IMessageService,function(){return new k.SimpleMessageService}),e.markerService=t(g.IMarkerService,function(){return new p.MarkerService}),e.modeService=t(L.IModeService,function(e){return new x.ModeServiceImpl}),e.modelService=t(N.IModelService,function(t){return new M.ModelServiceImpl(e.markerService.get(t),e.configurationService.get(t))}),e.editorWorkerService=t(w.IEditorWorkerService,function(t){return new S.EditorWorkerServiceImpl(e.modelService.get(t),e.resourceConfigurationService.get(t),e.modeService.get(t))}),e.standaloneThemeService=t(O.IStandaloneThemeService,function(){return new R.StandaloneThemeServiceImpl}),e.codeEditorService=t(b.ICodeEditorService,function(t){return new T.CodeEditorServiceImpl(e.standaloneThemeService.get(t))}),e.progressService=t(v.IProgressService,function(){return new k.SimpleProgressService}),e.storageService=t(_.IStorageService,function(){return _.NullStorageService})}(P=t.StaticServices||(t.StaticServices={}));var A=function(e){function t(t,n){var a=e.call(this)||this,u=P.init(n),l=u[0],p=u[1];a._serviceCollection=l,a._instantiationService=p;var f=a.get(i.IConfigurationService),g=a.get(m.IMessageService),v=a.get(y.ITelemetryService),_=function(e,t){var i=null;return n&&(i=n[e.toString()]),i||(i=t()),a._serviceCollection.set(e,i),i},C=_(h.IContextKeyService,function(){return a._register(new I.ContextKeyService(f))}),b=_(c.ICommandService,function(){return new k.StandaloneCommandService(a._instantiationService)});_(d.IKeybindingService,function(){return a._register(new k.StandaloneKeybindingService(C,b,g,t))});var w=_(r.IContextViewService,function(){return a._register(new s.ContextViewService(t,v,g))});return _(r.IContextMenuService,function(){return a._register(new o.ContextMenuService(t,v,g,w))}),_(D.IMenuService,function(){return new k.SimpleMenuService(b)}),a}return f(t,e),t.prototype.get=function(e){var t=this._serviceCollection.get(e);if(!t)throw new Error("Missing service "+e);return t},t.prototype.set=function(e,t){this._serviceCollection.set(e,t)},t.prototype.has=function(e){return this._serviceCollection.has(e)},t}(n.Disposable);t.DynamicStandaloneServices=A}),define(d[422],h([1,0,20,25,540,48,200,480,71,273,129,17,397,164,64,31,69,16,46,19,42,61,87,68,77,132,49,54,50,408]),function(e,t,n,i,o,r,s,a,u,l,c,d,h,p,f,g,m,v,_,y,C,b,w,S,E,L,x,N,M){"use strict";function T(e,t,n){var i=new s.DynamicStandaloneServices(e,t),o=null;i.has(f.IEditorService)||(o=new c.SimpleEditorService,i.set(f.IEditorService,o));var r=null;i.has(w.ITextModelService)||(r=new c.SimpleEditorModelResolverService,i.set(w.ITextModelService,r)),i.has(u.IOpenerService)||i.set(u.IOpenerService,new a.OpenerService(i.get(f.IEditorService),i.get(g.ICommandService)));var l=n(i);return o&&o.setEditor(l),r&&r.setEditor(l),l}function k(e,t,n){return T(e,n,function(n){return new o.StandaloneEditor(e,t,n,n.get(v.IInstantiationService),n.get(C.ICodeEditorService),n.get(g.ICommandService),n.get(y.IContextKeyService),n.get(_.IKeybindingService),n.get(m.IContextViewService),n.get(E.IStandaloneThemeService))})}function I(e){return s.StaticServices.codeEditorService.get().onCodeEditorAdd(function(t){e(t)})}function D(e,t,n){return T(e,n,function(n){return new o.StandaloneDiffEditor(e,t,n,n.get(v.IInstantiationService),n.get(y.IContextKeyService),n.get(_.IKeybindingService),n.get(m.IContextViewService),n.get(b.IEditorWorkerService),n.get(C.ICodeEditorService),n.get(E.IStandaloneThemeService),n.get(M.IMessageService))})}function O(e,t){return new p.DiffNavigator(e,t)}function R(e,t,n){return s.StaticServices.modelService.get().createModel(e,t,n)}function P(e,t,n){if(e=e||"",!t){var i=n?n.path:null,o=e.indexOf("\n"),r=e;return-1!==o&&(r=e.substring(0,o)),R(e,s.StaticServices.modeService.get().getOrCreateModeByFilenameOrFirstLine(i,r),n)}return R(e,s.StaticServices.modeService.get().getOrCreateMode(t),n)}function A(e,t){s.StaticServices.modelService.get().setMode(e,s.StaticServices.modeService.get().getOrCreateMode(t))}function F(e,t,n){e&&s.StaticServices.markerService.get().changeOne(t,e.uri,n)}function W(e){return s.StaticServices.markerService.get().read(e)}function B(e){return s.StaticServices.modelService.get().getModel(e)}function V(){return s.StaticServices.modelService.get().getModels()}function H(e){return s.StaticServices.modelService.get().onModelAdded(e)}function z(e){return s.StaticServices.modelService.get().onModelRemoved(e)}function K(e){return s.StaticServices.modelService.get().onModelModeChanged(function(t){e({model:t.model,oldLanguage:t.oldModeId})})}function U(e){return h.createWebWorker(s.StaticServices.modelService.get(),e)}function j(e,t){return l.Colorizer.colorizeElement(s.StaticServices.standaloneThemeService.get(),s.StaticServices.modeService.get(),e,t)}function q(e,t,n){return l.Colorizer.colorize(s.StaticServices.modeService.get(),e,t,n)}function G(e,t,n){return void 0===n&&(n=4),l.Colorizer.colorizeModelLine(e,t,n)}function Y(e){var t=d.TokenizationRegistry.get(e);return t||{getInitialState:function(){return S.NULL_STATE},tokenize:function(t,n,i){return S.nullTokenize(e,t,n,i)},tokenize2:void 0}}function Z(e,t){s.StaticServices.modeService.get().getOrCreateMode(t);for(var n=Y(t),i=e.split(/\r\n|\r|\n/),o=[],r=n.getInitialState(),a=0,u=i.length;a0&&o[r-1]===c)){var d=l.startIndex;0===a?d=0:d